Abstracted transport out of the authenticator class. Added authenticator and sasl implmentation to global export. Added more testing of the sasl authenticator implementation.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/6f65b92e Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/6f65b92e Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/6f65b92e Branch: refs/heads/tp32 Commit: 6f65b92e7ac92cf4da105d9fef71ac51c6121013 Parents: c8ae3c8 Author: Matthew Allen <matt.al...@runbox.com> Authored: Mon Jul 9 22:49:41 2018 +0100 Committer: Matthew Allen <matt.al...@runbox.com> Committed: Thu Aug 23 06:36:58 2018 +0100 ---------------------------------------------------------------------- .../main/javascript/gremlin-javascript/index.js | 6 ++++- .../lib/driver/authenticator.js | 4 +-- .../lib/driver/driver-remote-connection.js | 17 +++++++----- .../lib/driver/remote-connection.js | 4 ++- .../lib/driver/sasl-authenticator.js | 27 +++++--------------- .../integration/sasl-authentication-tests.js | 10 +++++++- 6 files changed, 36 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f65b92e/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 d4c6d88..5ada391 100644 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/index.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/index.js @@ -31,13 +31,17 @@ 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 + DriverRemoteConnection: DriverRemoteConnection, + Authenticator: Auth, + SaslAuthenticator: SaslAuth }, process: { Bytecode: Bytecode, http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f65b92e/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 index 053aecd..fe83077 100644 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/authenticator.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/authenticator.js @@ -6,9 +6,9 @@ class Authenticator { this._credentials = credentials; } - evaluateChallenge(ws, header) { + async evaluateChallenge(challenge) { throw new Error("evaluateChallenge should be implemented"); } } -module.exports = Authenticator; \ No newline at end of file +module.exports = Authenticator; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f65b92e/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/driver-remote-connection.js ---------------------------------------------------------------------- diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/driver-remote-connection.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/driver-remote-connection.js index 0f46745..facc0b8 100644 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/driver-remote-connection.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/driver-remote-connection.js @@ -105,24 +105,24 @@ class DriverRemoteConnection extends RemoteConnection { } /** @override */ - submit(bytecode) { + submit(bytecode, op, args) { return this.open().then(() => new Promise((resolve, reject) => { const requestId = utils.getUuid(); this._responseHandlers[requestId] = { callback: (err, result) => err ? reject(err) : resolve(result), result: null }; - const message = bufferFromString(this._header + JSON.stringify(this._getRequest(requestId, bytecode))); + const message = bufferFromString(this._header + JSON.stringify(this._getRequest(requestId, bytecode, op, args))); this._ws.send(message); })); } - _getRequest(id, bytecode) { + _getRequest(id, bytecode, op, args) { return ({ 'requestId': { '@type': 'g:UUID', '@value': id }, - 'op': 'bytecode', + 'op': op || 'bytecode', 'processor': 'traversal', - 'args': { + 'args': args || { 'gremlin': this._writer.adaptObject(bytecode), 'aliases': { 'g': this.traversalSource } } @@ -157,7 +157,12 @@ class DriverRemoteConnection extends RemoteConnection { } if (response.status.code === responseStatusCode.authenticationChallenge && this._authenticator) { - this._authenticator.evaluateChallenge(this._ws, this._header); + this._authenticator.evaluateChallenge(response).then(res => { + this.submit('', 'authentication', res); + }, err => { + return handler.callback(err); + }); + return; } else if (response.status.code >= 400) { http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f65b92e/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/remote-connection.js ---------------------------------------------------------------------- diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/remote-connection.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/remote-connection.js index 2672ff4..46918df 100644 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/remote-connection.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/remote-connection.js @@ -33,9 +33,11 @@ class RemoteConnection { /** * @abstract * @param {Bytecode} bytecode + * @param {String} op Operation to perform, defaults to bytecode. + * @param {Object} args The arguments for the operation. Defaults to * @returns {Promise} */ - submit(bytecode) { + submit(bytecode, op, args) { throw new Error('submit() was not implemented'); }; } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f65b92e/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 index 1f08b7d..d7db3de 100644 --- 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 @@ -1,7 +1,6 @@ 'use strict'; const Authenticator = require('./authenticator'); -const utils = require('../utils'); class SaslAuthenticator extends Authenticator { /** @@ -15,31 +14,17 @@ class SaslAuthenticator extends Authenticator { super(credentials); } - evaluateChallenge(ws, header) { - const message = bufferFromString(header + JSON.stringify({ - 'requestId': { '@type': 'g:UUID', '@value': utils.getUuid() }, - 'op': 'authentication', - 'processor': 'traversal', - 'args': { - 'sasl': this.saslArgument() - } - })); - - return ws.send(message); + async evaluateChallenge(challenge) { + return Promise.resolve({ 'sasl': this.saslArgument() }); } saslArgument() { - if (this._credentials.username === null || this._credentials.username.length === 0 - || this._credentials.password === null || this._credentials.password.length === 0 ) { - return ''; + if (typeof this._credentials.username === "undefined" || this._credentials.username.length === 0 + || typeof this._credentials.password === "undefined" || this._credentials.password.length === 0 ) { + throw new Error('No Credentials Supplied'); } return new Buffer(`\0${this._credentials.username}\0${this._credentials.password}`).toString('base64'); } } - -const bufferFromString = (Int8Array.from !== Buffer.from && Buffer.from) || function newBuffer(text) { - return new Buffer(text, 'utf8'); -}; - -module.exports = SaslAuthenticator; \ No newline at end of file +module.exports = SaslAuthenticator; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f65b92e/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 c5dc48f..d517d22 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 @@ -55,5 +55,13 @@ describe('DriverRemoteConnectionWithSaslAuthenticator', function () { 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; + return connection.submit(new Bytecode().addStep('V', []).addStep('tail', [])) + .catch(function (err) { + assert.ok(err); + }); + }); }); -}); \ No newline at end of file +});