diff --git a/app-template/config-template.xml b/app-template/config-template.xml
index e348cbe52..39b67d212 100644
--- a/app-template/config-template.xml
+++ b/app-template/config-template.xml
@@ -72,7 +72,8 @@
-
+
+
diff --git a/src/js/services/mobileSecureStorageService.js b/src/js/services/mobileSecureStorageService.js
new file mode 100644
index 000000000..93a2ec591
--- /dev/null
+++ b/src/js/services/mobileSecureStorageService.js
@@ -0,0 +1,93 @@
+'use strict';
+
+angular.module('copayApp.services').factory('mobileSecureStorageService', function($log, appConfigService, platformInfo) {
+ var root = {};
+
+ var isReady = false;
+ var initialisationFailed = false;
+ var pending = [];
+
+ var storage = null;
+
+ this.get = function(key, cb) {
+ if (!isReady) {
+ if (initialisationFailed) {
+ cb(new Error("mobileSecureStorageService initialisation failed."));
+ } else {
+ pending.push(function(){ root.get(key, cb); });
+ }
+ return
+ }
+
+ storage.get(
+ function (value) {
+ cb(null, value);
+ },
+ function (error) {
+ if (error.message === 'Failure in SecureStorage.get() - The specified item could not be found in the keychain' || // iOS
+ error.message === 'Key [_SS_profile] not found.') { // Android
+ // The callback expects no error, but also no value, if it cannot be found.
+ cb(null, null);
+ } else {
+ cb(new Error(error));
+ }
+ },
+ key);
+ }
+
+ this.set = function(key, value, cb) {
+ if (!isReady) {
+ if (initialisationFailed) {
+ cb(new Error("mobileSecureStorageService initialisation failed."));
+ } else {
+ pending.push(function(){ root.set(key, value, cb); });
+ }
+ return
+ }
+
+ storage.set(
+ function (value) {
+ cb();
+ },
+ function (error) {
+ cb(new Error(error));
+ },
+ key, value);
+ }
+
+ if (platformInfo.isCordova) {
+ storage = new cordova.plugins.SecureStorage(
+ function () {
+ $log.debug('mobileSecureStorageService initialised.');
+ isReady = true;
+ for (var i = 0; i < pending.length; i++) {
+ pending[i]();
+ }
+ pending = [];
+ },
+ function (error) {
+ c$log.debug('mobileSecureStorageService initialisation failed. ' + error);
+ initialisationFailed = true;
+ },
+ appConfigService.packageNameId);
+ }
+
+ root.get = function(key, cb) {
+ if (platformInfo.isMobile) {
+ storage.get(key, cb);
+ } else {
+ cb(new Error('mobileSecureStorageService is only available on mobile.'));
+ }
+ };
+
+ root.set = function(key, value, cb) {
+ if (platformInfo.isMobile) {
+ storage.set(key, v, cb);
+ } else {
+ cb(new Error('mobileSecureStorageService is only available on mobile.'));
+ }
+ };
+
+ return root;
+});
+
diff --git a/src/js/services/secureStorageService.js b/src/js/services/secureStorageService.js
index 989c1642a..c066109c2 100644
--- a/src/js/services/secureStorageService.js
+++ b/src/js/services/secureStorageService.js
@@ -1,92 +1,32 @@
'use strict';
-angular.module('copayApp.services').factory('secureStorageService', function($log, appConfigService, platformInfo) {
+angular.module('copayApp.services').factory('secureStorageService', function(desktopSecureStorageService, localStorageService, $log, mobileSecureStorageService, platformInfo) {
var root = {};
- function CordovaSs() {
- var isReady = false;
- var initialisationFailed = false;
- var pending = [];
-
- var storage = null;
-
-
- this.get = function(key, cb) {
- if (!isReady) {
- if (initialisationFailed) {
- cb(new Error("Secure storage initialisation failed."));
- } else {
- pending.push(function(){ root.get(key, cb); });
- }
- return
- }
-
- storage.get(
- function (value) {
- cb(null, value);
- },
- function (error) {
- if (error.message === 'Failure in SecureStorage.get() - The specified item could not be found in the keychain' || // iOS
- error.message === 'Key [_SS_profile] not found.') { // Android
- // The callback expects no error, but also no value, if it cannot be found.
- cb(null);
- } else {
- cb(new Error(error));
- }
- },
- key);
- }
-
- this.set = function(key, value, cb) {
- if (!isReady) {
- if (initialisationFailed) {
- cb(new Error("Secure storage initialisation failed."));
- } else {
- pending.push(function(){ root.set(key, value, cb); });
- }
- return
- }
-
- storage.set(
- function (value) {
- cb();
- },
- function (error) {
- cb(new Error(error));
- },
- key, value);
- }
-
- if (platformInfo.isCordova) {
- storage = new cordova.plugins.SecureStorage(
- function () {
- console.log('ss Success');
- isReady = true;
- for (var i = 0; i < pending.length; i++) {
- pending[i]();
- }
- spending = [];
- },
- function (error) {
- console.log('ss Error ' + error);
- initialisationFailed = true;
- },
- appConfigService.packageNameId);
- }
-
+ // To make wrong code look wrong
+ function alteredKeyIndicatingDesireForSecureStorage(key) {
+ return key + ":desiredSecure";
}
- var cordovaSs = new CordovaSs();
-
- root.get = function(key, cb) {
- cordovaSs.get(key, cb);
- };
-
- root.set = function(key, value, cb) {
- cordovaSs.set(key, value, cb);
- };
-
+ root.get = function(k, cb) {
+ if (platformInfo.isMobile) {
+ mobileSecureStorageService.get(k, cb);
+ } else if (platformInfo.isNW) {
+ desktopSecureStorageService.get(k, cb);
+ } else { // Browser
+ localStorageService.get(alteredKeyIndicatingDesireForSecureStorage(k), cb);
+ }
+ }
+ root.set = function(k, v, cb) {
+ if (platformInfo.isMobile) {
+ mobileSecureStorageService.set(k, v, cb);
+ } else if (platformInfo.isNW) {
+ desktopSecureStorageService.set(k, v, cb);
+ } else { // Browser
+ localStorageService.set(alteredKeyIndicatingDesireForSecureStorage(k), v, cb);
+ }
+ }
+
return root;
-});
-
+});
\ No newline at end of file
diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js
index 05bf51a7a..2cc6da730 100644
--- a/src/js/services/storageService.js
+++ b/src/js/services/storageService.js
@@ -126,7 +126,7 @@ angular.module('copayApp.services')
};
root.getProfile = function(cb) {
- $log.debug("getProfile() 31 7");
+ $log.debug("getProfile() 1 8");
//storage.get('profile', function(err, str) {
secureStorageService.get('profile', function(err, str) {