From 90d321033bebcb0632c570abe581a57f41c1fa69 Mon Sep 17 00:00:00 2001 From: Brendon Duncan Date: Thu, 31 May 2018 17:53:58 +1200 Subject: [PATCH] Working pretty roughly on iOS with cordova-plugin-secure-storage. --- app-template/config-template.xml | 1 + src/js/services/secureStorageService.js | 93 +++++++++++++++++++++++++ src/js/services/storageService.js | 14 ++-- 3 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 src/js/services/secureStorageService.js diff --git a/app-template/config-template.xml b/app-template/config-template.xml index 8031c8110..e348cbe52 100644 --- a/app-template/config-template.xml +++ b/app-template/config-template.xml @@ -72,6 +72,7 @@ + diff --git a/src/js/services/secureStorageService.js b/src/js/services/secureStorageService.js new file mode 100644 index 000000000..2c3a94703 --- /dev/null +++ b/src/js/services/secureStorageService.js @@ -0,0 +1,93 @@ +'use strict'; + +angular.module('copayApp.services').factory('secureStorageService', function($log, appConfigService, platformInfo) { + var root = {}; + + var ssIsReady = false; + var ssInitialisationFailed = false; + var pending = []; + + var ss = new cordova.plugins.SecureStorage( + function () { + console.log('ss Success'); + ssIsReady = true; + for (var i = 0; i < pending.length; i++) { + pending[i](); + } + pending = []; + }, + function (error) { + console.log('ss Error ' + error); + ssInitialisationFailed = true; + }, + appConfigService.packageNameId); + + + + root.get = function(key, cb) { + $log.debug('secureStorageService.get()'); + if (!ssIsReady) { + $log.debug("ss not ready."); + if (ssInitialisationFailed) { + $log.debug("returning error because initialisation failed."); + cb(new Error("Secure storage initialisation failed.")); + } else { + $log.debug("adding get to pending."); + pending.push(function(){ root.get(key, cb); }); + } + return + } + $log.debug("ss is ready."); + + ss.get( + function (value) { + console.log('ss Success, got ' + value); + cb(null, value); + }, + function (error) { + console.log('ss Error "' + error.message + '" ' + JSON.stringify(error)); + + if (error.message === 'Failure in SecureStorage.get() - The specified item could not be found in the keychain') { + $log.debug("Sending back null error."); + // The callback expects no error, but also no value, if it cannot be found. + cb(null); + } else { + cb(new Error(error)); + } + }, + key); + + }; + + root.set = function(key, value, cb) { + $log.debug('secureStorageService.set()'); + if (!ssIsReady) { + $log.debug("ss not ready."); + if (ssInitialisationFailed) { + $log.debug("returning error because initialisation failed."); + cb(new Error("Secure storage initialisation failed.")); + } else { + $log.debug("adding set to pending."); + pending.push(function(){ root.set(key, value, cb); }); + } + return + } + $log.debug("ss is ready."); + + ss.set( + function (value) { + console.log('ss Success, got ' + value); + cb(); + }, + function (error) { + console.log('ss Error ' + error); + cb(new Error(error)); + }, + key, value); + + }; + + + return root; +}); + diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index 3d1ecfeef..05bf51a7a 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -1,6 +1,6 @@ 'use strict'; angular.module('copayApp.services') - .factory('storageService', function(logHeader, fileStorageService, localStorageService, sjcl, $log, lodash, platformInfo, $timeout) { + .factory('storageService', function(logHeader, fileStorageService, localStorageService, sjcl, $log, lodash, platformInfo, secureStorageService, $timeout) { var root = {}; var storage; @@ -116,15 +116,21 @@ angular.module('copayApp.services') }; root.storeNewProfile = function(profile, cb) { - storage.create('profile', profile.toObj(), cb); + //storage.create('profile', profile.toObj(), cb); + secureStorageService.set('profile', profile.toObj(), cb); }; root.storeProfile = function(profile, cb) { - storage.set('profile', profile.toObj(), cb); + //storage.set('profile', profile.toObj(), cb); + secureStorageService.set('profile', profile.toObj(), cb); }; root.getProfile = function(cb) { - storage.get('profile', function(err, str) { + $log.debug("getProfile() 31 7"); + + //storage.get('profile', function(err, str) { + secureStorageService.get('profile', function(err, str) { + if (err || !str) return cb(err);