Ion safe storage. Ask the user to set the screen lock.

I am trying to initialize a secure storage plugin. When this fails, it means the user does not have a secure lock set. Using the github page, I am trying to recreate the provided sample:

var ss; var _init = function () { ss = new cordova.plugins.SecureStorage( function () { console.log('OK'); }, function () { navigator.notification.alert( 'Please enable the screen lock on your device. This app cannot operate securely without it.', function () { ss.secureDevice( function () { _init(); }, function () { _init(); } ); }, 'Screen lock is disabled' ); }, 'my_app'); }; _init(); 

This is my attempt:

 private createSecureStorage() { this.secureStorageAPI.create(this.storeName).then( (storage: SecureStorageObject) => { this.secureStorage = storage; }).catch( (error) => { this.dialogs.alert( 'Please enable the screen lock on your device. This app cannot operate securely without it.').then( () => { // Alert Dismissed, should open the secure lockscreen settings here this.secureStorage.secureDevice().then( () => { // Try again this.createSecureStorage(); } ).catch( () => { // Try again this.createSecureStorage(); }) } ) } ); } 

The problem is that if the call to secureStorageApi.create secureStorage fails, it will be undefined, so I cannot use it to call call secureDevice ().

Any help would be greatly appreciated.

+5
source share
2 answers

For everyone who needs it now, you need to change:

node_modules \ @ ion-native \ secure storage- \ index.js

Working code

It should look like this:

  var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; import { Injectable } from '@angular/core'; import { CordovaInstance, Plugin, CordovaCheck, IonicNativePlugin } from '@ionic-native/core'; /** * @hidden */ var SecureStorageObject = (function () { function SecureStorageObject(_objectInstance) { this._objectInstance = _objectInstance; } /** * Gets a stored item * @param key {string} * @returns {Promise<string>} */ SecureStorageObject.prototype.get = function (key) { return; }; /** * Stores a value * @param key {string} * @param value {string} * @returns {Promise<any>} */ SecureStorageObject.prototype.set = function (key, value) { return; }; /** * Removes a single stored item * @param key {string} * @returns {Promise<string>} returns a promise that resolves with the key that was removed */ SecureStorageObject.prototype.remove = function (key) { return; }; /** * Get all references from the storage. * @returns {Promise<string[]>} returns a promise that resolves with array of keys storage */ SecureStorageObject.prototype.keys = function () { return; }; /** * Clear all references from the storage. * @returns {Promise<any>} */ SecureStorageObject.prototype.clear = function () { return; }; return SecureStorageObject; }()); /** * @hidden */ var SecureDeviceObject = (function () { function SecureDeviceObject(_objectInstance) { this._objectInstance = _objectInstance; } /** * Brings up the screen-lock settings * @returns {Promise<any>} */ SecureStorageObject.prototype.secureDevice = function () { return; }; return SecureDeviceObject; }()); export { SecureStorageObject, SecureDeviceObject }; __decorate([ CordovaInstance({ callbackOrder: 'reverse' }), __metadata("design:type", Function), __metadata("design:paramtypes", [String]), __metadata("design:returntype", Promise) ], SecureStorageObject.prototype, "get", null); __decorate([ CordovaInstance({ callbackOrder: 'reverse' }), __metadata("design:type", Function), __metadata("design:paramtypes", [String, String]), __metadata("design:returntype", Promise) ], SecureStorageObject.prototype, "set", null); __decorate([ CordovaInstance({ callbackOrder: 'reverse' }), __metadata("design:type", Function), __metadata("design:paramtypes", [String]), __metadata("design:returntype", Promise) ], SecureStorageObject.prototype, "remove", null); __decorate([ CordovaInstance({ callbackOrder: 'reverse' }), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", Promise) ], SecureStorageObject.prototype, "keys", null); __decorate([ CordovaInstance({ callbackOrder: 'reverse' }), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", Promise) ], SecureStorageObject.prototype, "clear", null); __decorate([ CordovaInstance(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", Promise) ], SecureDeviceObject.prototype, "secureDevice", null); /** * @name Secure Storage * @description * This plugin gets, sets and removes key,value pairs from a device secure storage. * * Requires Cordova plugin: `cordova-plugin-secure-storage`. For more info, please see the [Cordova Secure Storage docs](https://github.com/Crypho/cordova-plugin-secure-storage). * * The browser platform is supported as a mock only. Key/values are stored unencrypted in localStorage. * * @usage * * ```typescript * import { SecureStorage, SecureStorageObject } from '@ionic-native/secure-storage'; * * constructor(private secureStorage: SecureStorage) { } * * ... * * this.secureStorage.create('my_store_name') * .then((storage: SecureStorageObject) => { * * storage.get('key') * .then( * data => console.log(data), * error => console.log(error) * ); * * storage.set('key', 'value') * .then( * data => console.log(data), * error => console.log(error) * ); * * storage.remove('key') * .then( * data => console.log(data), * error => console.log(error) * ); * * }); * * * ``` * @classes * SecureStorageObject */ var SecureStorage = SecureStorage_1 = (function (_super) { __extends(SecureStorage, _super); function SecureStorage() { return _super !== null && _super.apply(this, arguments) || this; } /** * Creates a namespaced storage. * @param store {string} * @returns {Promise<SecureStorageObject>} */ SecureStorage.prototype.create = function (store) { return new Promise(function (res, rej) { var instance = new (SecureStorage_1.getPlugin())( function () { res(new SecureStorageObject(instance)); }, function () { rej(new SecureDeviceObject(instance)); }, store); }); }; return SecureStorage; }(IonicNativePlugin)); SecureStorage.decorators = [ { type: Injectable }, ]; /** @nocollapse */ SecureStorage.ctorParameters = function () { return []; }; __decorate([ CordovaCheck(), __metadata("design:type", Function), __metadata("design:paramtypes", [String]), __metadata("design:returntype", Promise) ], SecureStorage.prototype, "create", null); SecureStorage = SecureStorage_1 = __decorate([ Plugin({ pluginName: 'SecureStorage', plugin: 'cordova-plugin-secure-storage', pluginRef: 'cordova.plugins.SecureStorage', repo: 'https://github.com/Crypho/cordova-plugin-secure-storage', platforms: ['Android', 'Browser', 'iOS', 'Windows'] }) ], SecureStorage); export { SecureStorage }; var SecureStorage_1; //# sourceMappingURL=index.js.map 

Then you can use:

  private createSecureStorage() { this.secureStorageAPI.create(this.storeName).then( (storage: SecureStorageObject) => { console.log("secure"); this.secureStorage = storage; }).catch( (secureDeviceObject) => { this.dialogs.alert( 'Please enable the screen lock on your device. This app cannot operate securely without it.').then( () => { // Alert Dismissed, should open the secure lockscreen settings here secureDeviceObject.secureDevice().then( () => { // Try again console.log("Success"); this.createSecureStorage(); } ).catch( () => { // Try again console.log(" Error ") this.createSecureStorage(); }) } ); } ); } 

What changed?

What I did was move the secureDevice function to a new SecureDeviceObject and change the decorators. By doing this, you cannot use this object to try to call the get and set functions, etc.

This is a new object:

 var SecureDeviceObject = (function () { function SecureDeviceObject(_objectInstance) { this._objectInstance = _objectInstance; } /** * Brings up the screen-lock settings * @returns {Promise<any>} */ SecureStorageObject.prototype.secureDevice = function () { return; }; return SecureDeviceObject; }()); 

Then I changed the decorator:

 __decorate([ CordovaInstance(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", Promise) ], SecureDeviceObject.prototype, "secureDevice", null); 

The last change means that the promise of rejection returns a secureDeviceObject file:

 SecureStorage.prototype.create = function (store) { return new Promise(function (res, rej) { var instance = new (SecureStorage_1.getPlugin())( function () { res(new SecureStorageObject(instance)); }, function () { rej(new SecureDeviceObject(instance)); }, store); }); }; 

I suppose this is not the best fix possible, but it was the best I can do: D Tested on android 4 to 8. Work on it all!

Hope this helps someone :)

Thanks @JudgeFudge for pointing me in the right direction

+6
source

This issue is already being tracked as a problem, see https://github.com/ionic-team/ionic-native/issues/1944 .

If you need a quick fix for this, you can try one of the following steps:

1) Lower the Ionic SecureStorage plugin, perhaps this problem does not occur in the previous version.

2) Try to solve the problem yourself. You can find the sources in your node_modules folder right here (if you need help with this, I can try to look at this later):

node_modules \ Cordova-safe-storage-plugin \ SRC \ Android \ SecureStorage.java node_modules \ Cordova-safe-storage-plugin \ SRC \ IOS \ SecureStorage.m

.

+2
source

Source: https://habr.com/ru/post/1272272/


All Articles