base58 walletId in secret
This commit is contained in:
parent
22e71f3ad0
commit
6bf2a10fd2
|
@ -307,7 +307,11 @@ API.prototype.joinWallet = function(secret, copayerName, cb) {
|
||||||
if (data)
|
if (data)
|
||||||
return cb('Storage already contains a wallet');
|
return cb('Storage already contains a wallet');
|
||||||
|
|
||||||
|
try {
|
||||||
var secretData = WalletUtils.fromSecret(secret);
|
var secretData = WalletUtils.fromSecret(secret);
|
||||||
|
} catch (ex) {
|
||||||
|
return cb(ex);
|
||||||
|
}
|
||||||
var data = self._initData(secretData.network, secretData.walletPrivKey);
|
var data = self._initData(secretData.network, secretData.walletPrivKey);
|
||||||
self._doJoinWallet(secretData.walletId, secretData.walletPrivKey, data.publicKeyRing[0], copayerName,
|
self._doJoinWallet(secretData.walletId, secretData.walletPrivKey, data.publicKeyRing[0], copayerName,
|
||||||
function(err, wallet) {
|
function(err, wallet) {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
var _ = require('lodash');
|
||||||
var Uuid = require('uuid');
|
var Uuid = require('uuid');
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -33,7 +34,7 @@ Notification.create = function(opts) {
|
||||||
|
|
||||||
var now = Date.now();
|
var now = Date.now();
|
||||||
x.createdOn = Math.floor(now / 1000);
|
x.createdOn = Math.floor(now / 1000);
|
||||||
x.id = ('00000000000000' + now).slice(-14) + ('0000' + opts.ticker || 0).slice(-4);
|
x.id = _.padLeft(now, 14, '0') + _.padLeft(opts.ticker || 0, 4, '0');
|
||||||
x.type = opts.type || 'general';
|
x.type = opts.type || 'general';
|
||||||
x.data = opts.data;
|
x.data = opts.data;
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ TxProposal.create = function(opts) {
|
||||||
|
|
||||||
var now = Date.now();
|
var now = Date.now();
|
||||||
x.createdOn = Math.floor(now / 1000);
|
x.createdOn = Math.floor(now / 1000);
|
||||||
x.id = ('00000000000000' + now).slice(-14) + Uuid.v4();
|
x.id = _.padLeft(now, 14, '0') + Uuid.v4();
|
||||||
x.creatorId = opts.creatorId;
|
x.creatorId = opts.creatorId;
|
||||||
x.toAddress = opts.toAddress;
|
x.toAddress = opts.toAddress;
|
||||||
x.amount = opts.amount;
|
x.amount = opts.amount;
|
||||||
|
|
|
@ -7,6 +7,7 @@ var Address = Bitcore.Address;
|
||||||
var PrivateKey = Bitcore.PrivateKey;
|
var PrivateKey = Bitcore.PrivateKey;
|
||||||
var PublicKey = Bitcore.PublicKey;
|
var PublicKey = Bitcore.PublicKey;
|
||||||
var crypto = Bitcore.crypto;
|
var crypto = Bitcore.crypto;
|
||||||
|
var encoding = Bitcore.encoding;
|
||||||
var HDPath = require('./hdpath');
|
var HDPath = require('./hdpath');
|
||||||
var Utils = require('./utils');
|
var Utils = require('./utils');
|
||||||
|
|
||||||
|
@ -84,22 +85,42 @@ WalletUtils.xPubToCopayerId = function(xpub) {
|
||||||
};
|
};
|
||||||
|
|
||||||
WalletUtils.toSecret = function(walletId, walletPrivKey, network) {
|
WalletUtils.toSecret = function(walletId, walletPrivKey, network) {
|
||||||
return walletId + ':' + walletPrivKey.toWIF() + ':' + (network == 'testnet' ? 'T' : 'L');
|
var widHex = new Buffer(walletId.replace(/-/g, ''), 'hex');
|
||||||
|
widBase58 = new encoding.Base58(widHex).toString();
|
||||||
|
return widBase58 + walletPrivKey.toWIF() + (network == 'testnet' ? 'T' : 'L');
|
||||||
};
|
};
|
||||||
|
|
||||||
WalletUtils.fromSecret = function(secret) {
|
WalletUtils.fromSecret = function(secret) {
|
||||||
$.checkArgument(secret);
|
$.checkArgument(secret);
|
||||||
var secretSplit = secret.split(':');
|
|
||||||
var walletId = secretSplit[0];
|
function split(str, indexes) {
|
||||||
|
var parts = [];
|
||||||
|
indexes.push(str.length);
|
||||||
|
var i = 0;
|
||||||
|
while (i < indexes.length) {
|
||||||
|
parts.push(str.substring(i == 0 ? 0 : indexes[i - 1], indexes[i]));
|
||||||
|
i++;
|
||||||
|
};
|
||||||
|
return parts;
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
var secretSplit = split(secret, [22, 74]);
|
||||||
|
var widBase58 = secretSplit[0];
|
||||||
|
var widHex = encoding.Base58.decode(widBase58).toString('hex');
|
||||||
|
var walletId = split(widHex, [8, 12, 16, 20]).join('-');
|
||||||
|
|
||||||
var walletPrivKey = Bitcore.PrivateKey.fromString(secretSplit[1]);
|
var walletPrivKey = Bitcore.PrivateKey.fromString(secretSplit[1]);
|
||||||
var networkChar = secretSplit[2];
|
var networkChar = secretSplit[2];
|
||||||
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
walletId: walletId,
|
walletId: walletId,
|
||||||
walletPrivKey: walletPrivKey,
|
walletPrivKey: walletPrivKey,
|
||||||
network: networkChar == 'T' ? 'testnet' : 'livenet',
|
network: networkChar == 'T' ? 'testnet' : 'livenet',
|
||||||
};
|
};
|
||||||
|
} catch (ex) {
|
||||||
|
throw new Error('Invalid secret');
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -193,8 +193,20 @@ describe('client API ', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it('should fail with a unknown secret', function(done) {
|
it('should fail with an invalid secret', function(done) {
|
||||||
var oldSecret = '3f8e5acb-ceeb-4aae-134f-692d934e3b1c:L2gohj8s2fLKqVU5cQutAVGciutUxczFxLxxXHFsjzLh71ZjkFQQ:T';
|
// Invalid length
|
||||||
|
clients[0].joinWallet('dummy', 'copayer', function(err, result) {
|
||||||
|
err.message.should.contain('Invalid secret');
|
||||||
|
// Right length, invalid char for base 58
|
||||||
|
clients[0].joinWallet('lPU9zqUiQFRnt3sWBQ1pnPKx9xC3KD83jxhYVJbLABxn1qhdBfQ7dYtzQqNKpSrDWDqF261S1zT', 'copayer', function(err, result) {
|
||||||
|
err.message.should.contain('Invalid secret');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('should fail with an unknown secret', function(done) {
|
||||||
|
// Unknown walletId
|
||||||
|
var oldSecret = 'VPU9zqUiQFRnt3sWBQ1pnPKx9xC3KD83jxhYVJbLABxn1qhdBfQ7dYtzQqNKpSrDWDqF261S1zT';
|
||||||
clients[0].joinWallet(oldSecret, 'copayer', function(err, result) {
|
clients[0].joinWallet(oldSecret, 'copayer', function(err, result) {
|
||||||
err.code.should.contain('BADREQUEST');
|
err.code.should.contain('BADREQUEST');
|
||||||
done();
|
done();
|
||||||
|
|
Loading…
Reference in New Issue