mirror of https://github.com/BTCPrivate/copay.git
add encrypted Storage component
This commit is contained in:
parent
f84180e76c
commit
241fb3aeb7
1
copay.js
1
copay.js
|
@ -8,6 +8,7 @@ module.exports.PrivateKey = require('./js/models/core/PrivateKey');
|
||||||
var WebRTC = module.exports.WebRTC = require('./js/models/network/WebRTC');
|
var WebRTC = module.exports.WebRTC = require('./js/models/network/WebRTC');
|
||||||
var Insight = module.exports.Insight = require('./js/models/blockchain/Insight');
|
var Insight = module.exports.Insight = require('./js/models/blockchain/Insight');
|
||||||
var StoragePlain = module.exports.StoragePlain = require('./js/models/storage/Plain');
|
var StoragePlain = module.exports.StoragePlain = require('./js/models/storage/Plain');
|
||||||
|
var StorageEncrypted = module.exports.StorageEncrypted = require('./js/models/storage/Encrypted');
|
||||||
|
|
||||||
module.exports.Wallet = require('soop').load('./js/models/core/Wallet',{
|
module.exports.Wallet = require('soop').load('./js/models/core/Wallet',{
|
||||||
Network: WebRTC,
|
Network: WebRTC,
|
||||||
|
|
|
@ -271,7 +271,7 @@
|
||||||
<script src="lib/angular-foundation/mm-foundation-tpls.min.js"></script>
|
<script src="lib/angular-foundation/mm-foundation-tpls.min.js"></script>
|
||||||
<script src="lib/peerjs/peer.js"></script>
|
<script src="lib/peerjs/peer.js"></script>
|
||||||
<script src="lib/bitcore.js"></script>
|
<script src="lib/bitcore.js"></script>
|
||||||
<script src="lib/cyrpto-js/rollups/aes.js"></script>
|
<script src="lib/crypto-js/rollups/aes.js"></script>
|
||||||
<script src="js/copayBundle.js"></script>
|
<script src="js/copayBundle.js"></script>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,70 +1,49 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var imports = require('soop').imports();
|
var imports = require('soop').imports();
|
||||||
|
//var buffertools = imports.buffertools || require('buffertools');
|
||||||
|
var parent = imports.parent || require('./Plain');
|
||||||
|
|
||||||
function Storage() {
|
function Storage() {
|
||||||
}
|
}
|
||||||
|
Storage.parent = parent;
|
||||||
|
|
||||||
Storage.prototype._getPwd = function() {
|
|
||||||
var pwd = prompt('Please enter your password');
|
var passphrase = null;
|
||||||
return pwd;
|
Storage.prototype._getPassphrase = function() {
|
||||||
|
return passphrase;
|
||||||
|
}
|
||||||
|
|
||||||
|
Storage.prototype._setPassphrase = function(password) {
|
||||||
|
passphrase = password;
|
||||||
}
|
}
|
||||||
|
|
||||||
Storage.prototype._encrypt = function(data) {
|
Storage.prototype._encrypt = function(data) {
|
||||||
return CryptoJS.AES.encrypt("Message", "Secret Passphrase");
|
return CryptoJS.AES.encrypt(data, this._getPassphrase());
|
||||||
};
|
};
|
||||||
|
|
||||||
Storage.prototype._decrypt = function(encrypted) {
|
Storage.prototype._decrypt = function(encrypted) {
|
||||||
return CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");
|
return CryptoJS.AES.decrypt(encrypted, this._getPassphrase());
|
||||||
};
|
};
|
||||||
|
|
||||||
Storage.prototype._read = function(k) {
|
Storage.prototype._read = function(k) {
|
||||||
var ret;
|
var ret;
|
||||||
try {
|
try {
|
||||||
ret = JSON.parse(localStorage.getItem(k));
|
ret = localStorage.getItem(k);
|
||||||
} catch (e) {};
|
ret = this._decrypt(ret);
|
||||||
|
ret = ret.toString(CryptoJS.enc.Utf8);
|
||||||
|
ret = JSON.parse(ret);
|
||||||
|
} catch (e) {
|
||||||
|
console.log('Error while decrypting: '+e);
|
||||||
|
throw e;
|
||||||
|
};
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Storage.prototype._write = function(k,v) {
|
||||||
// get value by key
|
v = JSON.stringify(v);
|
||||||
Storage.prototype.getGlobal = function(k) {
|
v = this._encrypt(v);
|
||||||
return this._read(k);
|
localStorage.setItem(k, v);
|
||||||
};
|
};
|
||||||
|
|
||||||
// set value for key
|
|
||||||
Storage.prototype.setGlobal = function(k,v) {
|
|
||||||
localStorage.setItem(k, JSON.stringify(v));
|
|
||||||
};
|
|
||||||
|
|
||||||
// remove value for key
|
|
||||||
Storage.prototype.removeGlobal = function(k) {
|
|
||||||
localStorage.removeItem(k);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Storage.prototype._key = function(walletId, k) {
|
|
||||||
return walletId + '::' + k;
|
|
||||||
};
|
|
||||||
// get value by key
|
|
||||||
Storage.prototype.get = function(walletId, k) {
|
|
||||||
return this._read(localStorage.getItem(this._key(walletId,k)));
|
|
||||||
};
|
|
||||||
|
|
||||||
// set value for key
|
|
||||||
Storage.prototype.set = function(walletId, k,v) {
|
|
||||||
this.setGlobal(this._key(walletId,k), v);
|
|
||||||
};
|
|
||||||
|
|
||||||
// remove value for key
|
|
||||||
Storage.prototype.remove = function(walletId, k) {
|
|
||||||
localStorage.removeItem(this._key(walletId,k));
|
|
||||||
};
|
|
||||||
|
|
||||||
// remove all values
|
|
||||||
Storage.prototype.clearAll = function() {
|
|
||||||
localStorage.clear();
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = require('soop')(Storage);
|
module.exports = require('soop')(Storage);
|
||||||
|
|
|
@ -13,6 +13,9 @@ Storage.prototype._read = function(k) {
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Storage.prototype._write = function(k,v) {
|
||||||
|
localStorage.setItem(k, JSON.stringify(v));
|
||||||
|
};
|
||||||
|
|
||||||
// get value by key
|
// get value by key
|
||||||
Storage.prototype.getGlobal = function(k) {
|
Storage.prototype.getGlobal = function(k) {
|
||||||
|
@ -21,7 +24,7 @@ Storage.prototype.getGlobal = function(k) {
|
||||||
|
|
||||||
// set value for key
|
// set value for key
|
||||||
Storage.prototype.setGlobal = function(k,v) {
|
Storage.prototype.setGlobal = function(k,v) {
|
||||||
localStorage.setItem(k, JSON.stringify(v));
|
this._write(k,v);
|
||||||
};
|
};
|
||||||
|
|
||||||
// remove value for key
|
// remove value for key
|
||||||
|
@ -36,7 +39,7 @@ Storage.prototype._key = function(walletId, k) {
|
||||||
};
|
};
|
||||||
// get value by key
|
// get value by key
|
||||||
Storage.prototype.get = function(walletId, k) {
|
Storage.prototype.get = function(walletId, k) {
|
||||||
return this._read(this._key(walletId,k));
|
return this.getGlobal(this._key(walletId,k));
|
||||||
};
|
};
|
||||||
|
|
||||||
// set value for key
|
// set value for key
|
||||||
|
|
|
@ -10,14 +10,15 @@
|
||||||
<div id="mocha"></div>
|
<div id="mocha"></div>
|
||||||
<script src="../node_modules/mocha/mocha.js"></script>
|
<script src="../node_modules/mocha/mocha.js"></script>
|
||||||
<script src="../node_modules/chai/chai.js"></script>
|
<script src="../node_modules/chai/chai.js"></script>
|
||||||
|
<script src="../lib/crypto-js/rollups/aes.js"></script>
|
||||||
<script>mocha.setup('bdd')</script>
|
<script>mocha.setup('bdd')</script>
|
||||||
<script src="../lib/bitcore.js"></script>
|
<script src="../lib/bitcore.js"></script>
|
||||||
<script src="../js/copayBundle.js"></script>
|
<script src="../js/copayBundle.js"></script>
|
||||||
<script>
|
<script>
|
||||||
|
var copay = require('copay');
|
||||||
var copay = require('copay');
|
|
||||||
</script>
|
</script>
|
||||||
<script src="test.storage-plain.js"></script>
|
<script src="test.storage-plain.js"></script>
|
||||||
|
<script src="test.storage-encrypted.js"></script>
|
||||||
<script src="test.Wallet.js"></script>
|
<script src="test.Wallet.js"></script>
|
||||||
<script src="test.PublicKeyRing.js"></script>
|
<script src="test.PublicKeyRing.js"></script>
|
||||||
<!--
|
<!--
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
if (typeof process === 'undefined' || !process.version) {
|
||||||
|
// browser
|
||||||
|
var chai = chai || require('chai');
|
||||||
|
var should = chai.should();
|
||||||
|
var copay = copay || require('../copay');
|
||||||
|
var Encrypted = copay.StorageEncrypted;
|
||||||
|
|
||||||
|
describe('Storage/Encrypted model', function() {
|
||||||
|
var wid = 'fake-wallet-id';
|
||||||
|
var s = new Encrypted();
|
||||||
|
s._setPassphrase('mysupercoolpassword');
|
||||||
|
|
||||||
|
it('should create an instance', function() {
|
||||||
|
var s = new Encrypted();
|
||||||
|
should.exist(s);
|
||||||
|
});
|
||||||
|
it.skip('should fail when encrypting without a password', function() {
|
||||||
|
var s = new Encrypted();
|
||||||
|
(function(){s.set(wid, 'x', 1);}).should.throw();
|
||||||
|
});
|
||||||
|
it('should be able to encrypt and decrypt', function() {
|
||||||
|
s._write('key', 'value');
|
||||||
|
s._read('key').should.equal('value');
|
||||||
|
});
|
||||||
|
it('should be able to set a value', function() {
|
||||||
|
s.set(wid, 'x', 1);
|
||||||
|
});
|
||||||
|
var getSetData = [
|
||||||
|
1,1000,-15, -1000,
|
||||||
|
0.1, -0.5, -0.5e-10, Math.PI,
|
||||||
|
'hi', 'auydoaiusyodaisudyoa', '0b5b8556a0c2ce828c9ccfa58b3dd0a1ae879b9b',
|
||||||
|
'1CjPR7Z5ZSyWk6WtXvSFgkptmpoi4UM9BC', 'OP_DUP OP_HASH160 80ad90d4035',
|
||||||
|
[1,2,3,4,5,6],
|
||||||
|
{ x: 1, y: 2},
|
||||||
|
{ x: 'hi', y: null},
|
||||||
|
{ a: {}, b: [], c: [1,2,'hi']},
|
||||||
|
null
|
||||||
|
];
|
||||||
|
getSetData.forEach(function(obj) {
|
||||||
|
it('should be able to set a value and get it for '+JSON.stringify(obj), function() {
|
||||||
|
s.set(wid, 'x', obj);
|
||||||
|
var obj2 = s.get(wid, 'x');
|
||||||
|
JSON.stringify(obj2).should.equal(JSON.stringify(obj));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
Loading…
Reference in New Issue