Skip to content

Commit e304803

Browse files
committed
Implement new registration API
1 parent 4e6c8f7 commit e304803

File tree

4 files changed

+93
-207
lines changed

4 files changed

+93
-207
lines changed

src/client.js

Lines changed: 26 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ Client.prototype.register = function (userId, activationToken, pinCallback, call
279279

280280
keypair = self.crypto.generateKeypair("BN254CX");
281281

282-
self._createMPinID(userId, activationToken, function (err, identityData) {
282+
self._createMPinID(userId, activationToken, keypair, function (err, identityData) {
283283
if (err) {
284284
if (identityData && identityData.error === "INVALID_ACTIVATION_TOKEN") {
285285
return callback(new Error("Invalid activation token", { cause: err }), null);
@@ -292,12 +292,12 @@ Client.prototype.register = function (userId, activationToken, pinCallback, call
292292
return callback(new Error("Project mismatch"), null);
293293
}
294294

295-
self._getSecret1(identityData, keypair, function (err, sec1Data) {
295+
self._getSecret(identityData.secretUrls[0], function (err, sec1Data) {
296296
if (err) {
297297
return callback(new Error("Registration fail", { cause: err }), null);
298298
}
299299

300-
self._getSecret2(sec1Data, function (err, sec2Data) {
300+
self._getSecret(identityData.secretUrls[1], function (err, sec2Data) {
301301
if (err) {
302302
return callback(new Error("Registration fail", { cause: err }), null);
303303
}
@@ -322,24 +322,25 @@ Client.prototype.register = function (userId, activationToken, pinCallback, call
322322
});
323323
};
324324

325-
Client.prototype._createMPinID = function (userId, activationToken, callback) {
325+
Client.prototype._createMPinID = function (userId, activationToken, keypair, callback) {
326326
var self = this,
327327
regData = {};
328328

329-
regData.url = self.options.server + "/rps/v2/user";
330-
regData.type = "PUT";
329+
regData.url = self.options.server + "/registration";
330+
regData.type = "POST";
331331
regData.data = {
332332
userId: userId,
333-
mobile: 0,
334333
deviceName: self._getDeviceName(),
335-
activateCode: activationToken
334+
activationToken: activationToken,
335+
publicKey: keypair.publicKey
336336
};
337337

338338
self.http.request(regData, function (err, result) {
339339
if (err) {
340340
return callback(err, result);
341341
}
342342

343+
// TODO: remove this?
343344
self.users.write(userId, { state: self.users.states.start });
344345

345346
callback(null, result);
@@ -356,28 +357,10 @@ Client.prototype._getDeviceName = function () {
356357
return "Browser";
357358
};
358359

359-
Client.prototype._getSecret1 = function (identityData, keypair, callback) {
360-
var self = this,
361-
cs1Url;
362-
363-
cs1Url = self.options.server + "/rps/v2/signature/";
364-
cs1Url += identityData.mpinId;
365-
cs1Url += "?regOTT=" + identityData.regOTT;
366-
cs1Url += "&publicKey=" + keypair.publicKey;
367-
368-
self.http.request({ url: cs1Url }, function (err, sec1Data) {
369-
if (err) {
370-
return callback(err, null);
371-
}
372-
373-
callback(null, sec1Data);
374-
});
375-
};
376-
377-
Client.prototype._getSecret2 = function (sec1Data, callback) {
360+
Client.prototype._getSecret = function (secretUrl, callback) {
378361
var self = this;
379362

380-
self.http.request({ url: sec1Data.cs2url }, callback);
363+
self.http.request({ url: secretUrl }, callback);
381364
};
382365

383366
Client.prototype._createIdentity = function (userId, userPin, identityData, sec1Data, sec2Data, keypair, callback) {
@@ -387,17 +370,17 @@ Client.prototype._createIdentity = function (userId, userPin, identityData, sec1
387370
token;
388371

389372
try {
390-
csHex = self.crypto.addShares(keypair.privateKey, sec1Data.dvsClientSecretShare, sec2Data.dvsClientSecret, sec1Data.curve);
391-
token = self.crypto.extractPin(identityData.mpinId, keypair.publicKey, userPin, csHex, sec1Data.curve);
373+
csHex = self.crypto.addShares(keypair.privateKey, sec1Data.dvsClientSecret, sec2Data.dvsClientSecret, identityData.curve);
374+
token = self.crypto.extractPin(identityData.mpinId, keypair.publicKey, userPin, csHex, identityData.curve);
392375
} catch (err) {
393376
return callback(err, null);
394377
}
395378

396379
userData = {
397380
mpinId: identityData.mpinId,
398381
token: token,
399-
curve: sec1Data.curve,
400-
dtas: sec1Data.dtas,
382+
curve: identityData.curve,
383+
dtas: identityData.dtas,
401384
publicKey: keypair.publicKey,
402385
pinLength: identityData.pinLength,
403386
projectId: identityData.projectId,
@@ -663,42 +646,31 @@ Client.prototype._finishAuthentication = function (userId, userPin, scope, authO
663646

664647
Client.prototype._renewSecret = function (userId, userPin, activationData, callback) {
665648
var self = this,
666-
identityData,
667649
keypair;
668650

669-
identityData = self.users.get(userId);
670651
keypair = self.crypto.generateKeypair(activationData.curve);
671652

672-
self._getWaMSecret1(keypair, activationData.token, function (err, sec1Data) {
653+
self._createMPinID(userId, activationData.token, keypair, function (err, identityData) {
673654
if (err) {
674655
return callback(err, null);
675656
}
676657

677-
self._getSecret2(sec1Data, function (err, sec2Data) {
658+
self._getSecret(identityData.secretUrls[0], function (err, sec1Data) {
678659
if (err) {
679660
return callback(err, null);
680661
}
681662

682-
self._createIdentity(userId, userPin, identityData, sec1Data, sec2Data, keypair, callback);
663+
self._getSecret(identityData.secretUrls[1], function (err, sec2Data) {
664+
if (err) {
665+
return callback(err, null);
666+
}
667+
668+
self._createIdentity(userId, userPin, identityData, sec1Data, sec2Data, keypair, callback);
669+
});
683670
});
684671
});
685672
};
686673

687-
Client.prototype._getWaMSecret1 = function (keypair, registerToken, callback) {
688-
var self = this,
689-
cs1Url,
690-
reqData;
691-
692-
reqData = {
693-
publicKey: keypair.publicKey,
694-
dvsRegisterToken: registerToken
695-
};
696-
697-
cs1Url = self.options.server + "/rps/v2/dvsregister";
698-
699-
self.http.request({ url: cs1Url, type: "POST", data: reqData }, callback);
700-
};
701-
702674
/**
703675
* Create a cryptographic signature of a given message
704676
*
@@ -757,7 +729,8 @@ Client.prototype.sign = function (userId, userPin, message, timestamp, callback)
757729
v: res.V,
758730
mpinId: identityData.mpinId,
759731
publicKey: identityData.publicKey,
760-
dtas: identityData.dtas
732+
dtas: identityData.dtas,
733+
timestamp: timestamp,
761734
};
762735

763736
callback(null, signatureData);

test/test-authentication.js

Lines changed: 36 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,20 @@ describe("Client _finishAuthentication", function () {
145145
});
146146
});
147147

148+
it("should return error when _renewSecret fails", function(done) {
149+
sinon.stub(client.http, "request").yields(null, { success: true, dvsRegister: { test: 1 } });
150+
var renewSecretStub = sinon.stub(client, "_renewSecret").yields(new Error("Renew secret error"));
151+
152+
client._finishAuthentication("[email protected]", 1234, ["dvs-auth"], "authOTT", function (err) {
153+
expect(err).to.exist;
154+
expect(err.message).to.equal("Renew secret error");
155+
done();
156+
});
157+
});
158+
148159
afterEach(function () {
149160
client.http.request.restore && client.http.request.restore();
161+
client._renewSecret.restore && client._renewSecret.restore();
150162
client._authentication.restore && client._authentication.restore();
151163
});
152164
});
@@ -159,21 +171,21 @@ describe("Client _renewSecret", function () {
159171
});
160172

161173
it("should renew the identity secret", function (done) {
162-
var getWaMSecret1Stub = sinon.stub(client, "_getWaMSecret1").yields(null, true);
163-
var getSecret2Stub = sinon.stub(client, "_getSecret2").yields(null, true);
174+
var createMPinIDStub = sinon.stub(client, "_createMPinID").yields(null, { pinLength: 4, projectId: "projectID", secretUrls: ["http://example.com/secret1", "http://example.com/secret2"] });
175+
var getSecretStub = sinon.stub(client, "_getSecret").yields(null, true);
164176
var createIdentityStub = sinon.stub(client, "_createIdentity").yields(null, true);
165177

166178
client._renewSecret("[email protected]", "1234", { token: "token", curve: "BN254CX" }, function (err) {
167179
expect(err).to.be.null;
168-
expect(getWaMSecret1Stub.calledOnce).to.be.true;
169-
expect(getSecret2Stub.calledOnce).to.be.true;
180+
expect(createMPinIDStub.calledOnce).to.be.true;
181+
expect(getSecretStub.calledTwice).to.be.true;
170182
expect(createIdentityStub.calledOnce).to.be.true;
171183
done();
172184
});
173185
});
174186

175-
it("should call error callback on _getWaMSecret1 failure", function (done) {
176-
sinon.stub(client, "_getWaMSecret1").yields(new Error("Request error"));
187+
it("should call error callback on _createMPinID failure", function (done) {
188+
sinon.stub(client, "_createMPinID").yields(new Error("Request error"));
177189

178190
client._renewSecret("[email protected]", "1234", { token: "token", curve: "BN254CX" }, function (err) {
179191
expect(err).to.exist;
@@ -182,9 +194,9 @@ describe("Client _renewSecret", function () {
182194
});
183195
});
184196

185-
it("should call error callback on _getSecret2 failure", function (done) {
186-
sinon.stub(client, "_getWaMSecret1").yields(null, true);
187-
sinon.stub(client, "_getSecret2").yields(new Error("Request error"), null);
197+
it("should call error callback on first _getSecret failure", function (done) {
198+
sinon.stub(client, "_createMPinID").yields(null, { pinLength: 4, projectId: "projectID", secretUrls: ["http://example.com/secret1", "http://example.com/secret2"] });
199+
sinon.stub(client, "_getSecret").yields(new Error("Request error"));
188200

189201
client._renewSecret("[email protected]", "1234", { token: "token", curve: "BN254CX" }, function (err) {
190202
expect(err).to.exist;
@@ -193,10 +205,11 @@ describe("Client _renewSecret", function () {
193205
});
194206
});
195207

196-
it("should call error callback on createIdentity error", function (done) {
197-
sinon.stub(client, "_getWaMSecret1").yields(null, true);
198-
sinon.stub(client, "_getSecret2").yields(null, true);
199-
sinon.stub(client, "_createIdentity").yields(new Error("Request error"));
208+
it("should call error callback on second _getSecret failure", function (done) {
209+
sinon.stub(client, "_createMPinID").yields(null, { pinLength: 4, projectId: "projectID", secretUrls: ["http://example.com/secret1", "http://example.com/secret2"] });
210+
var getSecretStub = sinon.stub(client, "_getSecret");
211+
getSecretStub.onFirstCall().yields(null);
212+
getSecretStub.onSecondCall().yields(new Error("Request error"));
200213

201214
client._renewSecret("[email protected]", "1234", { token: "token", curve: "BN254CX" }, function (err) {
202215
expect(err).to.exist;
@@ -205,67 +218,23 @@ describe("Client _renewSecret", function () {
205218
});
206219
});
207220

208-
afterEach(function () {
209-
client._getWaMSecret1.restore && client._getWaMSecret1.restore();
210-
client._getSecret2.restore && client._getSecret2.restore();
211-
client._createIdentity.restore && client._createIdentity.restore();
212-
})
213-
});
214-
215-
describe("Client _getWaMSecret1", function () {
216-
var client;
217-
218-
before(function () {
219-
client = new Client(testData.init());
220-
});
221-
222-
it("should call error callback when request fails", function (done) {
223-
sinon.stub(client.http, "request").yields({}, null);
221+
it("should call error callback on createIdentity error", function (done) {
222+
sinon.stub(client, "_createMPinID").yields(null, { pinLength: 4, projectId: "projectID", secretUrls: ["http://example.com/secret1", "http://example.com/secret2"] });
223+
sinon.stub(client, "_getSecret").yields(null, true);
224+
sinon.stub(client, "_createIdentity").yields(new Error("Request error"));
224225

225-
client._getWaMSecret1({ publicKey: "public" }, "dvsRegisterToken", function (err, data) {
226+
client._renewSecret("[email protected]", "1234", { token: "token", curve: "BN254CX" }, function (err) {
226227
expect(err).to.exist;
227-
done();
228-
});
229-
});
230-
231-
it("should call success callback with data", function (done) {
232-
sinon.stub(client.http, "request").yields(null, { success: true });
233-
234-
client._getWaMSecret1({ publicKey: "public" }, "dvsRegisterToken", function (err, cs1Data) {
235-
expect(err).to.be.null;
236-
expect(cs1Data).to.exist;
237-
expect(cs1Data).to.have.property("success");
238-
expect(cs1Data.success).to.be.true;
239-
done();
240-
});
241-
});
242-
243-
it("should make request to dvs register endpoint", function (done) {
244-
var requestStub = sinon.stub(client.http, "request").yields(null, { success: true });
245-
246-
client._getWaMSecret1({ publicKey: "public" }, "dvsRegisterToken", function (err) {
247-
expect(err).to.be.null;
248-
expect(requestStub.calledOnce).to.be.true;
249-
expect(requestStub.firstCall.args[0].url).to.equal("http://server.com/rps/v2/dvsregister");
250-
done();
251-
});
252-
});
253-
254-
it("should make request with public key", function (done) {
255-
var requestStub = sinon.stub(client.http, "request").yields(null, { success: true });
256-
sinon.stub(client, "_getDeviceName").returns("device");
257-
258-
client._getWaMSecret1({ publicKey: "public" }, "dvsRegisterToken", function (err) {
259-
expect(err).to.be.null;
260-
expect(requestStub.calledOnce).to.be.true;
261-
expect(requestStub.firstCall.args[0].data).to.deep.equal({ publicKey: "public", dvsRegisterToken: "dvsRegisterToken" });
228+
expect(err.message).to.equal("Request error");
262229
done();
263230
});
264231
});
265232

266233
afterEach(function () {
267-
client.http.request.restore && client.http.request.restore();
268-
});
234+
client._createMPinID.restore && client._createMPinID.restore();
235+
client._getSecret.restore && client._getSecret.restore();
236+
client._createIdentity.restore && client._createIdentity.restore();
237+
})
269238
});
270239

271240
describe("Client _authentication", function () {

test/test-promise.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,16 +100,14 @@ describe("Promises", function() {
100100
});
101101

102102
it("should call register", async function () {
103-
sinon.stub(client, "_createMPinID").yields(null, { pinLength: 4, projectId: "projectID" });
104-
sinon.stub(client, "_getSecret1").yields(null);
105-
sinon.stub(client, "_getSecret2").yields(null);
103+
sinon.stub(client, "_createMPinID").yields(null, { pinLength: 4, projectId: "projectID", secretUrls: ["http://example.com/secret1", "http://example.com/secret2"] });
104+
sinon.stub(client, "_getSecret").yields(null);
106105
sinon.stub(client, "_createIdentity").yields(null, { state: "REGISTERED" });
107106

108107
expect(await client.register("[email protected]", "activationToken", function (passPin) { passPin("1234"); })).to.deep.equal({ state: "REGISTERED" });
109108

110109
client._createMPinID.restore();
111-
client._getSecret1.restore();
112-
client._getSecret2.restore();
110+
client._getSecret.restore();
113111
client._createIdentity.restore();
114112
});
115113

0 commit comments

Comments
 (0)