add other needed data to be completed

This commit is contained in:
Matias Alejo Garcia 2015-02-23 02:19:23 -03:00
parent 9a70047852
commit 6c123f5c2d
3 changed files with 47 additions and 25 deletions

View File

@ -24,9 +24,9 @@ function end(err, txps, rawtxps) {
utils.renderTxProposals(txps); utils.renderTxProposals(txps);
if (program.output) { if (program.output) {
client.getEncryptedPublicKeyRing(function (err, pkr) { client.getEncryptedWalletData(function (err, toComplete) {
var txData = { var txData = {
pkr: pkr, toComplete: toComplete,
txps: txps, txps: txps,
}; };
fs.writeFileSync(program.output, JSON.stringify(txData)); fs.writeFileSync(program.output, JSON.stringify(txData));

View File

@ -18,6 +18,8 @@ var BASE_URL = 'http://localhost:3001/copay/api';
var WALLET_CRITICAL_DATA = ['xPrivKey', 'm', 'publicKeyRing', 'sharedEncryptingKey']; var WALLET_CRITICAL_DATA = ['xPrivKey', 'm', 'publicKeyRing', 'sharedEncryptingKey'];
var WALLET_EXTRA_DATA = ['copayerId', 'roPrivKey', 'rwPrivKey']; var WALLET_EXTRA_DATA = ['copayerId', 'roPrivKey', 'rwPrivKey'];
var WALLET_AIRGAPPED_TOCOMPLETE = ['publicKeyRing', 'm', 'n', 'sharedEncryptingKey'];
function _encryptMessage(message, encryptingKey) { function _encryptMessage(message, encryptingKey) {
if (!message) return null; if (!message) return null;
return WalletUtils.encryptMessage(message, encryptingKey); return WalletUtils.encryptMessage(message, encryptingKey);
@ -110,18 +112,28 @@ API.prototype._tryToCompleteFromServer = function(data, cb) {
}; };
API.prototype._tryToCompleteFromData = function(data, toComplete, cb) {
API.prototype._tryToComplete = function(opts, data, cb) { var inData = _decryptMessage(toComplete,
if (opts.pkr) { WalletUtils.privateKeyToAESKey(data.roPrivKey));
var pkr = _decryptMessage(opts.pkr,WalletUtils.privateKeyToAESKey(data.roPrivKey)); if (!inData)
if (!pkr)
return cb('Could not complete wallet'); return cb('Could not complete wallet');
data.publicKeyRing = JSON.parse(pkr); try {
inData = JSON.parse(inData);
_.extend(data, _.pick(inData, WALLET_AIRGAPPED_TOCOMPLETE));
} catch (ex) {
return cb(ex);
}
this.storage.save(data, function(err) { this.storage.save(data, function(err) {
return cb(err, data); return cb(err, data);
}); });
};
API.prototype._tryToComplete = function(opts, data, cb) {
if (opts.toComplete) {
this._tryToCompleteFromData(data, opts.toComplete, cb);
} else { } else {
this._tryToCompleteFromServer(data, cb); this._tryToCompleteFromServer(data, cb);
} }
@ -151,13 +163,10 @@ API.prototype._loadAndCheck = function(opts, cb) {
this._load(function(err, data) { this._load(function(err, data) {
if (err) return cb(err); if (err) return cb(err);
if (data.n > 1) {
var pkrComplete = data.publicKeyRing && data.m && data.publicKeyRing.length === data.n;
if (!pkrComplete) { if (!data.n || (data.n > 1 && data.publicKeyRing.length != data.n))
return self._tryToComplete(opts, data, cb); return self._tryToComplete(opts, data, cb);
}
}
return cb(null, data); return cb(null, data);
}); });
}; };
@ -542,7 +551,10 @@ API.prototype.import = function(str, cb) {
API.prototype.parseTxProposals = function(txData, cb) { API.prototype.parseTxProposals = function(txData, cb) {
var self = this; var self = this;
this._loadAndCheck({pkr: txData.pkr},function(err, data) { this._loadAndCheck({
toComplete: txData.toComplete
}, function(err, data) {
if (err) return cb(err);
var txps = txData.txps; var txps = txData.txps;
_processTxps(txps, data.sharedEncryptingKey); _processTxps(txps, data.sharedEncryptingKey);
@ -645,13 +657,13 @@ API.prototype.getSignatures = function(txp, cb) {
}); });
}; };
API.prototype.getEncryptedPublicKeyRing = function(cb) { API.prototype.getEncryptedWalletData = function(cb) {
var self = this; var self = this;
this._loadAndCheck({}, function(err, data) { this._loadAndCheck({}, function(err, data) {
if (err) return cb(err); if (err) return cb(err);
var pkr = JSON.stringify(data.publicKeyRing); var toComplete = JSON.stringify(_.pick(data, WALLET_AIRGAPPED_TOCOMPLETE));
return cb(null, _encryptMessage(pkr, WalletUtils.privateKeyToAESKey(data.roPrivKey))); return cb(null, _encryptMessage(toComplete, WalletUtils.privateKeyToAESKey(data.roPrivKey)));
}); });
}; };

View File

@ -533,16 +533,26 @@ describe('client API ', function() {
}, function(err, txs, rawTxps) { }, function(err, txs, rawTxps) {
should.not.exist(err); should.not.exist(err);
clients[2].getEncryptedPublicKeyRing(function(err, pkr) {
clients[2].getEncryptedWalletData(function(err, toComplete) {
should.not.exist(err); should.not.exist(err);
// Disable networking
clients[0].request = sinon.stub().yields('no network');
// Make client incomplete
var data = JSON.parse(fsmock._get('client0'));
delete data.n;
fsmock._set('client0', JSON.stringify(data));
// Back to the air gapped // Back to the air gapped
// //
// Will trigger _tryToComplete and use pkr // Will trigger _tryToComplete and use pkr
// then, needs pkr to verify the txps // then, needs pkr to verify the txps
clients[0].parseTxProposals({ clients[0].parseTxProposals({
txps: rawTxps, txps: rawTxps,
pkr: pkr, toComplete: toComplete,
}, function(err, txs2) { }, function(err, txs2) {
should.not.exist(err); should.not.exist(err);
done(); done();