'use strict'; angular.module('copayApp.services') .factory('backupService', function backupServiceFactory($log, $timeout, profileService, sjcl) { 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 { // We're screwed, blob constructor unsupported entirely $log.debug("Error"); } } return out; }; var a = document.createElement("a"); document.body.appendChild(a); a.style.display = "none"; var blob = new NewBlob(ew, 'text/plain;charset=utf-8'); var url = window.URL.createObjectURL(blob); a.href = url; a.download = filename; a.click(); $timeout(function() { window.URL.revokeObjectURL(url); }, 250); return cb(); }; root.addMetadata = function(b, opts) { b = JSON.parse(b); if (opts.historyCache) b.historyCache = opts.historyCache; if (opts.addressBook) b.addressBook = opts.addressBook; return JSON.stringify(b); } root.walletExport = function(password, opts) { if (!password) { return null; } var fc = profileService.focusedClient; try { opts = opts || {}; var b = fc.export(opts); if (opts.historyCache || opts.addressBook) b = root.addMetadata(b, opts); 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) { var fc = profileService.focusedClient; var ew = root.walletExport(password, opts); if (!ew) return cb('Could not create backup'); var walletName = (fc.alias || '') + (fc.alias ? '-' : '') + fc.credentials.walletName; if (opts.noSign) walletName = walletName + '-noSign' var filename = walletName + '-Copaybackup.aes.json'; _download(ew, filename, cb) }; return root; });