You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by jo...@apache.org on 2018/08/23 08:16:59 UTC

[12/14] tinkerpop git commit: Tidying-up of authenticator and integeration tests.

Tidying-up of authenticator and integeration tests.


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/18598baf
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/18598baf
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/18598baf

Branch: refs/heads/TINKERPOP-1977
Commit: 18598baff6039dd281bb18d42524c3f317d97218
Parents: 8453b61
Author: Matthew Allen <ma...@runbox.com>
Authored: Wed Aug 1 20:30:13 2018 +0100
Committer: Matthew Allen <ma...@runbox.com>
Committed: Thu Aug 23 06:39:29 2018 +0100

----------------------------------------------------------------------
 .../main/javascript/gremlin-javascript/index.js |  6 +-
 .../lib/driver/auth/authenticator.js            | 19 +++++
 .../auth/mechanisms/sasl-mechanism-base.js      | 18 ++++-
 .../auth/mechanisms/sasl-mechanism-plain.js     | 81 +++++++++++++++++---
 .../lib/driver/auth/sasl-authenticator.js       | 30 ++++++++
 .../lib/driver/authenticator.js                 | 14 ----
 .../lib/driver/sasl-authenticator.js            | 30 --------
 .../gremlin-javascript/test/helper.js           |  4 +-
 .../integration/sasl-authentication-tests.js    |  8 +-
 9 files changed, 143 insertions(+), 67 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/18598baf/gremlin-javascript/src/main/javascript/gremlin-javascript/index.js
----------------------------------------------------------------------
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/index.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/index.js
index 5ada391..d4c6d88 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/index.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/index.js
@@ -31,17 +31,13 @@ const rc = require('./lib/driver/remote-connection');
 const Bytecode = require('./lib/process/bytecode');
 const utils = require('./lib/utils');
 const DriverRemoteConnection = require('./lib/driver/driver-remote-connection');
-const Auth = require('./lib/driver/authenticator');
-const SaslAuth = require('./lib/driver/sasl-authenticator');
 
 module.exports = {
   driver: {
     RemoteConnection: rc.RemoteConnection,
     RemoteStrategy: rc.RemoteStrategy,
     RemoteTraversal: rc.RemoteTraversal,
-    DriverRemoteConnection: DriverRemoteConnection,
-    Authenticator: Auth,
-    SaslAuthenticator: SaslAuth
+    DriverRemoteConnection: DriverRemoteConnection
   },
   process: {
     Bytecode: Bytecode,

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/18598baf/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/authenticator.js
----------------------------------------------------------------------
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/authenticator.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/authenticator.js
new file mode 100644
index 0000000..b57e385
--- /dev/null
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/authenticator.js
@@ -0,0 +1,19 @@
+'use strict';
+
+/** @abstract */
+class Authenticator {
+  constructor(options) {
+    this._options = options;
+  }
+  
+  /**
+   * @abstract
+   * Evaluates the challenge from the server and returns appropriate response.
+   * @param {String} challenge Challenge string presented by the server.
+   */
+  evaluateChallenge(challenge) {
+    throw new Error("evaluateChallenge should be implemented");
+  }
+}
+
+module.exports = Authenticator;

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/18598baf/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/mechanisms/sasl-mechanism-base.js
----------------------------------------------------------------------
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/mechanisms/sasl-mechanism-base.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/mechanisms/sasl-mechanism-base.js
index 4b75778..b909cc8 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/mechanisms/sasl-mechanism-base.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/mechanisms/sasl-mechanism-base.js
@@ -20,17 +20,33 @@
 
 /** @abstract */
 class SaslMechanismBase {
+  constructor(options) {
+    this.setopts(options);
+  }
+
+  /**
+   * Returns the name of the mechanism
+   */
   get name() {
     return null;
   }
 
+  /**
+   * Set the options for the mechanism
+   * @param {object} options Options specific to the mechanism
+   */
   setopts(options) {
     this._options = options;
   }
 
+  /**
+   * @abstract
+   * Evaluates the challenge from the server and returns appropriate response
+   * @param {String} challenge Challenge string presented by the server
+   */
   evaluateChallenge(challenge) {
     throw new Error("evaluateChallenge should be implemented");
   }
 }
 
-module.exports = SaslMechanismBase;
\ No newline at end of file
+module.exports = SaslMechanismBase;

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/18598baf/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/mechanisms/sasl-mechanism-plain.js
----------------------------------------------------------------------
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/mechanisms/sasl-mechanism-plain.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/mechanisms/sasl-mechanism-plain.js
index be418be..597a929 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/mechanisms/sasl-mechanism-plain.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/mechanisms/sasl-mechanism-plain.js
@@ -1,31 +1,90 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 'use strict';
 
 const SaslMechanismBase = require('./sasl-mechanism-base');
 
 class SaslMechanismPlain extends SaslMechanismBase {
+  /**
+   * Creates a new instance of SaslMechanismPlain.
+   * @param {Object} [options] The mechanism options.
+   * @param {String} [options.authzid] The identity of the client.
+   * @param {String} [options.username] The identity of user with access to server.
+   * @param {String} [options.password] The password of user with access to server.
+   * @constructor
+   */
+  constructor(options) {
+    super(options);
+
+    if (this._options.username === undefined
+      || this._options.username === null
+      || this._options.username.length == 0
+      || this._options.password === undefined
+      || this._options.password === null
+      || this._options.password.length == 0
+    ) {
+      throw new Error('Missing credentials for SASL PLAIN mechanism');
+    }
+  }
+
+  /**
+   * Returns the name of the mechanism
+   */
   get name() {
     return 'PLAIN';
   }
   
+  /**
+   * Evaluates the challenge from the server and returns appropriate response.
+   * @param {String} challenge Challenge string presented by the server.
+   * @return {Object} A Promise that resolves to a valid sasl response object.
+   */
   evaluateChallenge(challenge) {
     if (this._hasInitialResponse(challenge)) {
-      return Promise.resolve({ 'saslMechanism': this.name, 'sasl': this._saslArgument() });
+      return Promise.resolve({
+        'saslMechanism': this.name,
+        'sasl': this._saslArgument(this._options.authzid, this._options.username, this._options.password)
+      });
     }
     
-    return Promise.resolve({ 'sasl': this._saslArgument() });
+    return Promise.resolve({ 'sasl': this._saslArgument(this._options.authzid, this._options.username, this._options.password) });
   }
 
-  _saslArgument() {
-    if (this._options.username === undefined || this._options.username.length === 0 
-      || this._options.password === undefined || this._options.password.length === 0 ) {
-        throw new Error('No Credentials Supplied');
-    }
+  /**
+   * Generates a base64 encoded sasl argument based on the given parameters.
+   * @param {String} authzid Identitiy of the client.
+   * @param {String} username The identity of user with access to server.
+   * @param {String} password The password of user with access to server.
+   */
+  _saslArgument(authzid, username, password) {
+    if (authzid === undefined || authzid === null) authzid = '';
+    if (username === undefined || username === null) username = '';
+    if (password === undefined || password.length === null) password = '';
 
-    const authstr = ((this._options.authId !== undefined && this._options.authId.length) ? this._options.authId : '')
-      + `\0${this._options.username}\0${this._options.password}`;
-    return new Buffer(authstr).toString('base64');
+    return new Buffer(`${authzid}\0${username}\0${password}`).toString('base64');
   }
 
+  /**
+   * Checks challenge to see if we have the initial sasl response from the server.
+   * @param {String} challenge The challenge string from the server.
+   * @return {Boolean}
+   */
   _hasInitialResponse(challenge) {
     if (challenge === undefined || challenge === null) {
       return false;
@@ -34,4 +93,4 @@ class SaslMechanismPlain extends SaslMechanismBase {
   }
 }
 
-module.exports = SaslMechanismPlain;
\ No newline at end of file
+module.exports = SaslMechanismPlain;

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/18598baf/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/sasl-authenticator.js
----------------------------------------------------------------------
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/sasl-authenticator.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/sasl-authenticator.js
new file mode 100644
index 0000000..eb1fbe8
--- /dev/null
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/auth/sasl-authenticator.js
@@ -0,0 +1,30 @@
+'use strict';
+
+const Authenticator = require('./authenticator');
+
+class SaslAuthenticator extends Authenticator {
+  /**
+   * Creates a new instance of SaslAuthenticator.
+   * @param {Object} [options] The authentication options.
+   * @param {Object} [options.mechanism] The mechanism to be used for authentication.
+   * @constructor
+   */
+  constructor(options) {
+    super(options);
+
+    if (options.mechanism === null || options.mechanism === undefined) {
+      throw new Error('No Sasl Mechanism Specified');
+    }
+  }
+  
+  /**
+   * Evaluates the challenge from the server and returns appropriate response.
+   * @param {String} challenge Challenge string presented by the server.
+   * @return {Object} A Promise that resolves to a valid sasl response object.
+   */
+  evaluateChallenge(challenge) {
+    return Promise.resolve(this._options.mechanism.evaluateChallenge(challenge));
+  }
+}
+
+module.exports = SaslAuthenticator;

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/18598baf/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/authenticator.js
----------------------------------------------------------------------
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/authenticator.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/authenticator.js
deleted file mode 100644
index c57cec5..0000000
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/authenticator.js
+++ /dev/null
@@ -1,14 +0,0 @@
-'use strict';
-
-/** @abstract */
-class Authenticator {
-  constructor(credentials) {
-    this._credentials = credentials;
-  }
-  
-  evaluateChallenge(challenge) {
-    throw new Error("evaluateChallenge should be implemented");
-  }
-}
-
-module.exports = Authenticator;

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/18598baf/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/sasl-authenticator.js
----------------------------------------------------------------------
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/sasl-authenticator.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/sasl-authenticator.js
deleted file mode 100644
index 4b63ab5..0000000
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/sasl-authenticator.js
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict';
-
-const Authenticator = require('./authenticator');
-
-class SaslAuthenticator extends Authenticator {
-  /**
-   * Creates a new instance of SaslAuthenticator.
-   * @param {Object} [options] The authentication options.
-   * @param {Object} [options.mechanism] The mechanism to be used for authentication.
-   * @param {String} [options.hostname] The hostname of the client.
-   * @param {*} [options] Other mechanism specific options.
-   * @constructor
-   */
-  constructor(options) {
-    super(options);
-
-    if (options.mechanism === null || options.mechanism === undefined) {
-      throw new Error('No Sasl Mechanism Specified');
-    }
-
-    this._options = options;
-    this._options.mechanism.setopts(this._options);
-  }
-  
-  evaluateChallenge(challenge) {
-    return Promise.resolve(this._options.mechanism.evaluateChallenge(challenge));
-  }
-}
-
-module.exports = SaslAuthenticator;

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/18598baf/gremlin-javascript/src/main/javascript/gremlin-javascript/test/helper.js
----------------------------------------------------------------------
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/helper.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/helper.js
index e1c24a3..82c47be 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/helper.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/helper.js
@@ -24,7 +24,7 @@
 const os = require('os');
 
 const DriverRemoteConnection = require('../lib/driver/driver-remote-connection');
-const SaslAuthenticator = require('../lib/driver/sasl-authenticator');
+const SaslAuthenticator = require('../lib/driver/auth/sasl-authenticator');
 const SaslMechanismPlain = require('../lib/driver/auth/mechanisms/sasl-mechanism-plain');
 
 exports.getConnection = function getConnection(traversalSource) {
@@ -32,7 +32,7 @@ exports.getConnection = function getConnection(traversalSource) {
 };
 
 exports.getSecureConnectionWithAuthenticator = function getConnection(traversalSource) {
-  const authenticator = new SaslAuthenticator({ mechanism: new SaslMechanismPlain(), username: 'stephen', password: 'password', authId: os.hostname() });
+  const authenticator = new SaslAuthenticator({ mechanism: new SaslMechanismPlain({ username: 'stephen', password: 'password', authzid: os.hostname() }) });
   return new DriverRemoteConnection('ws://localhost:45941/gremlin', { 
     traversalSource: traversalSource, 
     authenticator: authenticator, 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/18598baf/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/sasl-authentication-tests.js
----------------------------------------------------------------------
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/sasl-authentication-tests.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/sasl-authentication-tests.js
index f38d087..c9450f8 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/sasl-authentication-tests.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/sasl-authentication-tests.js
@@ -49,16 +49,16 @@ describe('DriverRemoteConnectionWithSaslAuthenticator', function () {
         });
     });
     it('should send the request with invalid credentials and parse the response error', function () {
-      connection._authenticator.username = 'Bob';
+      connection._authenticator._options.mechanism._options.username = 'Bob';
       return connection.submit(new Bytecode().addStep('V', []).addStep('tail', []))
         .catch(function (err) {
           assert.ok(err);
           assert.ok(err.message.indexOf('401') > 0);
         });
     });
-    it('should send incorrect conifugration to the authenticator and parse the response error', function () {
-      delete connection._authenticator.username;
-      delete connection._authenticator.password;
+    it('should send incorrect configuration to the authenticator and parse the response error', function () {
+      delete connection._authenticator._options.mechanism._options.username;
+      delete connection._authenticator._options.mechanism._options.password;
       return connection.submit(new Bytecode().addStep('V', []).addStep('tail', []))
         .catch(function (err) {
           assert.ok(err);