Wallet/src/js/services/backupService.js

87 lines
2.6 KiB
JavaScript
Raw Normal View History

2015-03-06 12:00:10 -03:00
'use strict';
angular.module('copayApp.services')
2016-08-19 13:09:27 -03:00
.factory('backupService', function backupServiceFactory($log, $timeout, $stateParams, profileService, sjcl) {
2015-03-06 12:00:10 -03:00
var root = {};
var _download = function(ew, filename, cb) {
var NewBlob = function(data, datatype) {
var out;
try {
out = new Blob([data], {
type: datatype
});
$log.debug("case 1");
} catch (e) {
window.BlobBuilder = window.BlobBuilder ||
window.WebKitBlobBuilder ||
window.MozBlobBuilder ||
window.MSBlobBuilder;
if (e.name == 'TypeError' && window.BlobBuilder) {
var bb = new BlobBuilder();
bb.append(data);
out = bb.getBlob(datatype);
$log.debug("case 2");
} else if (e.name == "InvalidStateError") {
// InvalidStateError (tested on FF13 WinXP)
out = new Blob([data], {
type: datatype
});
$log.debug("case 3");
} else {
2016-05-20 11:10:53 -03:00
// We're screwed, blob constructor unsupported entirely
2016-01-16 17:04:01 -06:00
$log.debug("Error");
2015-03-06 12:00:10 -03:00
}
}
return out;
};
2016-05-20 11:10:53 -03:00
var a = angular.element('<a></a>');
2015-03-06 12:00:10 -03:00
var blob = new NewBlob(ew, 'text/plain;charset=utf-8');
2016-06-17 11:46:40 -03:00
a.attr('href', window.URL.createObjectURL(blob));
2016-05-20 11:10:53 -03:00
a.attr('download', filename);
a[0].click();
2015-03-06 12:00:10 -03:00
return cb();
};
2015-11-06 17:45:23 -03:00
root.addMetadata = function(b, opts) {
b = JSON.parse(b);
if (opts.addressBook) b.addressBook = opts.addressBook;
return JSON.stringify(b);
}
root.walletExport = function(password, opts) {
2015-03-06 12:00:10 -03:00
if (!password) {
return null;
}
2016-08-19 13:09:27 -03:00
var wallet = profileService.getWallet($stateParams.walletId);
2015-03-06 12:00:10 -03:00
try {
opts = opts || {};
2016-08-19 13:09:27 -03:00
var b = wallet.export(opts);
2016-06-17 11:46:40 -03:00
if (opts.addressBook) b = root.addMetadata(b, opts);
2015-11-06 17:45:23 -03:00
2015-03-06 12:00:10 -03:00
var e = sjcl.encrypt(password, b, {
iter: 10000
});
return e;
} catch (err) {
$log.debug('Error exporting wallet: ', err);
return null;
};
};
root.walletDownload = function(password, opts, cb) {
2016-08-19 13:09:27 -03:00
var wallet = profileService.getWallet($stateParams.walletId);
var ew = root.walletExport(password, opts);
2015-03-06 12:00:10 -03:00
if (!ew) return cb('Could not create backup');
2016-08-19 13:09:27 -03:00
var walletName = (wallet.alias || '') + (wallet.alias ? '-' : '') + wallet.credentials.walletName;
if (opts.noSign) walletName = walletName + '-noSign'
2015-03-06 12:00:10 -03:00
var filename = walletName + '-Copaybackup.aes.json';
_download(ew, filename, cb)
};
return root;
2016-05-20 11:10:53 -03:00
});