base58 walletId in secret

This commit is contained in:
Ivan Socolsky 2015-02-22 01:35:25 -03:00
parent 22e71f3ad0
commit 6bf2a10fd2
5 changed files with 56 additions and 18 deletions

View File

@ -307,7 +307,11 @@ API.prototype.joinWallet = function(secret, copayerName, cb) {
if (data)
return cb('Storage already contains a wallet');
var secretData = WalletUtils.fromSecret(secret);
try {
var secretData = WalletUtils.fromSecret(secret);
} catch (ex) {
return cb(ex);
}
var data = self._initData(secretData.network, secretData.walletPrivKey);
self._doJoinWallet(secretData.walletId, secretData.walletPrivKey, data.publicKeyRing[0], copayerName,
function(err, wallet) {

View File

@ -1,3 +1,4 @@
var _ = require('lodash');
var Uuid = require('uuid');
/*
@ -33,7 +34,7 @@ Notification.create = function(opts) {
var now = Date.now();
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.data = opts.data;

View File

@ -18,7 +18,7 @@ TxProposal.create = function(opts) {
var now = Date.now();
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.toAddress = opts.toAddress;
x.amount = opts.amount;

View File

@ -7,6 +7,7 @@ var Address = Bitcore.Address;
var PrivateKey = Bitcore.PrivateKey;
var PublicKey = Bitcore.PublicKey;
var crypto = Bitcore.crypto;
var encoding = Bitcore.encoding;
var HDPath = require('./hdpath');
var Utils = require('./utils');
@ -32,10 +33,10 @@ WalletUtils.signMessage = function(text, privKey) {
WalletUtils.accessFromData = function(data) {
if (data.xPrivKey)
if (data.xPrivKey)
return 'full';
if (data.rwPrivKey)
if (data.rwPrivKey)
return 'readwrite';
return 'readonly';
@ -84,22 +85,42 @@ WalletUtils.xPubToCopayerId = function(xpub) {
};
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) {
$.checkArgument(secret);
var secretSplit = secret.split(':');
var walletId = secretSplit[0];
var walletPrivKey = Bitcore.PrivateKey.fromString(secretSplit[1]);
var networkChar = secretSplit[2];
return {
walletId: walletId,
walletPrivKey: walletPrivKey,
network: networkChar == 'T' ? 'testnet' : 'livenet',
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 networkChar = secretSplit[2];
return {
walletId: walletId,
walletPrivKey: walletPrivKey,
network: networkChar == 'T' ? 'testnet' : 'livenet',
};
} catch (ex) {
throw new Error('Invalid secret');
}
};

View File

@ -193,8 +193,20 @@ describe('client API ', function() {
});
});
});
it('should fail with a unknown secret', function(done) {
var oldSecret = '3f8e5acb-ceeb-4aae-134f-692d934e3b1c:L2gohj8s2fLKqVU5cQutAVGciutUxczFxLxxXHFsjzLh71ZjkFQQ:T';
it('should fail with an invalid secret', function(done) {
// 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) {
err.code.should.contain('BADREQUEST');
done();