From 6d85de45e458c0340488362efde54d05679ae267 Mon Sep 17 00:00:00 2001 From: George Grigalashvili Date: Thu, 15 Jun 2023 19:16:41 +0200 Subject: [PATCH 1/4] feat: initial migration of secure-storage plugin --- README.md | 8 +- apps/demo-angular/package.json | 3 +- apps/demo-angular/src/app-routing.module.ts | 1 + apps/demo-angular/src/home.component.ts | 3 + .../secure-storage.component.html | 8 + .../plugin-demos/secure-storage.component.ts | 17 ++ .../src/plugin-demos/secure-storage.module.ts | 10 + apps/demo/package.json | 3 +- apps/demo/src/main-page.xml | 1 + apps/demo/src/plugin-demos/secure-storage.ts | 10 + apps/demo/src/plugin-demos/secure-storage.xml | 14 ++ packages/secure-storage/.eslintrc.json | 18 ++ packages/secure-storage/README.md | 90 +++++++++ packages/secure-storage/common.ts | 83 ++++++++ packages/secure-storage/index.android.ts | 53 +++++ packages/secure-storage/index.d.ts | 8 + packages/secure-storage/index.ios.ts | 191 ++++++++++++++++++ packages/secure-storage/package.json | 41 ++++ .../platforms/android/include.gradle | 7 + packages/secure-storage/platforms/ios/Podfile | 1 + packages/secure-storage/project.json | 64 ++++++ packages/secure-storage/references.d.ts | 1 + packages/secure-storage/tsconfig.json | 9 + tools/demo/index.ts | 1 + tools/demo/secure-storage/index.ts | 8 + tools/workspace-scripts.js | 11 + tsconfig.base.json | 3 +- 27 files changed, 657 insertions(+), 10 deletions(-) create mode 100644 apps/demo-angular/src/plugin-demos/secure-storage.component.html create mode 100644 apps/demo-angular/src/plugin-demos/secure-storage.component.ts create mode 100644 apps/demo-angular/src/plugin-demos/secure-storage.module.ts create mode 100644 apps/demo/src/plugin-demos/secure-storage.ts create mode 100644 apps/demo/src/plugin-demos/secure-storage.xml create mode 100644 packages/secure-storage/.eslintrc.json create mode 100644 packages/secure-storage/README.md create mode 100644 packages/secure-storage/common.ts create mode 100644 packages/secure-storage/index.android.ts create mode 100644 packages/secure-storage/index.d.ts create mode 100644 packages/secure-storage/index.ios.ts create mode 100644 packages/secure-storage/package.json create mode 100644 packages/secure-storage/platforms/android/include.gradle create mode 100644 packages/secure-storage/platforms/ios/Podfile create mode 100644 packages/secure-storage/project.json create mode 100644 packages/secure-storage/references.d.ts create mode 100644 packages/secure-storage/tsconfig.json create mode 100644 tools/demo/secure-storage/index.ts diff --git a/README.md b/README.md index d6128517..fd9c1281 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,3 @@ -# @nativescript/\* plugins - -``` -npm run setup -npm start -``` - - [@nativescript/animated-circle](packages/animated-circle/README.md) - [@nativescript/appavailability](packages/appavailability/README.md) - [@nativescript/apple-sign-in](packages/apple-sign-in/README.md) @@ -35,6 +28,7 @@ npm start - [@nativescript/localize](packages/localize/README.md) - [@nativescript/pdf](packages/pdf/README.md) - [@nativescript/picker](packages/picker/README.md) +- [@nativescript/secure-storage](packages/secure-storage/README.md) - [@nativescript/shared-notification-delegate](packages/shared-notification-delegate/README.md) - [@nativescript/social-share](packages/social-share/README.md) - [@nativescript/swift-ui](packages/swift-ui/README.md) diff --git a/apps/demo-angular/package.json b/apps/demo-angular/package.json index d48f8d29..90b82134 100644 --- a/apps/demo-angular/package.json +++ b/apps/demo-angular/package.json @@ -37,7 +37,8 @@ "@nativescript/swift-ui": "file:../../dist/packages/swift-ui", "@nativescript/theme-switcher": "file:../../dist/packages/theme-switcher", "@nativescript/twitter": "file:../../dist/packages/twitter", - "@nativescript/zip": "file:../../dist/packages/zip" + "@nativescript/zip": "file:../../dist/packages/zip", + "@nativescript/secure-storage": "file:../../dist/packages/secure-storage" }, "devDependencies": { "@nativescript/android": "~8.5.0", diff --git a/apps/demo-angular/src/app-routing.module.ts b/apps/demo-angular/src/app-routing.module.ts index cefc7451..a33e9734 100644 --- a/apps/demo-angular/src/app-routing.module.ts +++ b/apps/demo-angular/src/app-routing.module.ts @@ -37,6 +37,7 @@ const routes: Routes = [ { path: 'localize', loadChildren: () => import('./plugin-demos/localize.module').then((m) => m.LocalizeModule) }, { path: 'pdf', loadChildren: () => import('./plugin-demos/pdf.module').then((m) => m.PdfModule) }, { path: 'picker', loadChildren: () => import('./plugin-demos/picker.module').then((m) => m.PickerModule) }, + { path: 'secure-storage', loadChildren: () => import('./plugin-demos/secure-storage.module').then((m) => m.SecureStorageModule) }, { path: 'shared-notification-delegate', loadChildren: () => import('./plugin-demos/shared-notification-delegate.module').then((m) => m.SharedNotificationDelegateModule) }, { path: 'social-share', loadChildren: () => import('./plugin-demos/social-share.module').then((m) => m.SocialShareModule) }, { path: 'swift-ui', loadChildren: () => import('./plugin-demos/swift-ui.module').then((m) => m.SwiftUiModule) }, diff --git a/apps/demo-angular/src/home.component.ts b/apps/demo-angular/src/home.component.ts index 863f9cb6..13e83501 100644 --- a/apps/demo-angular/src/home.component.ts +++ b/apps/demo-angular/src/home.component.ts @@ -96,6 +96,9 @@ export class HomeComponent { { name: 'picker', }, + { + name: 'secure-storage', + }, { name: 'shared-notification-delegate', }, diff --git a/apps/demo-angular/src/plugin-demos/secure-storage.component.html b/apps/demo-angular/src/plugin-demos/secure-storage.component.html new file mode 100644 index 00000000..c1a3a39e --- /dev/null +++ b/apps/demo-angular/src/plugin-demos/secure-storage.component.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/apps/demo-angular/src/plugin-demos/secure-storage.component.ts b/apps/demo-angular/src/plugin-demos/secure-storage.component.ts new file mode 100644 index 00000000..5975e3d4 --- /dev/null +++ b/apps/demo-angular/src/plugin-demos/secure-storage.component.ts @@ -0,0 +1,17 @@ +import { Component, NgZone } from '@angular/core'; +import { DemoSharedSecureStorage } from '@demo/shared'; +import {} from '@nativescript/secure-storage'; + +@Component({ + selector: 'demo-secure-storage', + templateUrl: 'secure-storage.component.html', +}) +export class SecureStorageComponent { + demoShared: DemoSharedSecureStorage; + + constructor(private _ngZone: NgZone) {} + + ngOnInit() { + this.demoShared = new DemoSharedSecureStorage(); + } +} diff --git a/apps/demo-angular/src/plugin-demos/secure-storage.module.ts b/apps/demo-angular/src/plugin-demos/secure-storage.module.ts new file mode 100644 index 00000000..1628214a --- /dev/null +++ b/apps/demo-angular/src/plugin-demos/secure-storage.module.ts @@ -0,0 +1,10 @@ +import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core'; +import { NativeScriptCommonModule, NativeScriptRouterModule } from '@nativescript/angular'; +import { SecureStorageComponent } from './secure-storage.component'; + +@NgModule({ + imports: [NativeScriptCommonModule, NativeScriptRouterModule.forChild([{ path: '', component: SecureStorageComponent }])], + declarations: [SecureStorageComponent], + schemas: [NO_ERRORS_SCHEMA], +}) +export class SecureStorageModule {} diff --git a/apps/demo/package.json b/apps/demo/package.json index c2110ae2..c7d5a7f3 100644 --- a/apps/demo/package.json +++ b/apps/demo/package.json @@ -40,7 +40,8 @@ "@nativescript/swift-ui": "file:../../packages/swift-ui", "@nativescript/theme-switcher": "file:../../packages/theme-switcher", "@nativescript/twitter": "file:../../packages/twitter", - "@nativescript/zip": "file:../../packages/zip" + "@nativescript/zip": "file:../../packages/zip", + "@nativescript/secure-storage": "file:../../packages/secure-storage" }, "devDependencies": { "@nativescript/android": "~8.5.0", diff --git a/apps/demo/src/main-page.xml b/apps/demo/src/main-page.xml index f68418ec..9ca01d76 100644 --- a/apps/demo/src/main-page.xml +++ b/apps/demo/src/main-page.xml @@ -41,6 +41,7 @@ - - + + + + + + + + + + + + + + + + + + + diff --git a/apps/demo-angular/src/plugin-demos/secure-storage.component.scss b/apps/demo-angular/src/plugin-demos/secure-storage.component.scss new file mode 100644 index 00000000..e0e47d56 --- /dev/null +++ b/apps/demo-angular/src/plugin-demos/secure-storage.component.scss @@ -0,0 +1,34 @@ +.message { + color: #666; + font-size: 16; + padding: 20; +} + +button { + color: #ffffff; + background-color: #6494aa; + padding: 6; + margin: 8 24; + font-size: 14; + border-radius: 4; +} + +.button-group-first { + margin-top: 24; +} + +.button-a { + background-color: cornflowerblue; +} + +.button-b { + background-color: forestgreen; +} + +.button-c { + background-color: orange; +} + +.button-d { + background-color: red; +} diff --git a/apps/demo-angular/src/plugin-demos/secure-storage.component.ts b/apps/demo-angular/src/plugin-demos/secure-storage.component.ts index 5975e3d4..1d66c4eb 100644 --- a/apps/demo-angular/src/plugin-demos/secure-storage.component.ts +++ b/apps/demo-angular/src/plugin-demos/secure-storage.component.ts @@ -1,10 +1,10 @@ import { Component, NgZone } from '@angular/core'; import { DemoSharedSecureStorage } from '@demo/shared'; -import {} from '@nativescript/secure-storage'; @Component({ selector: 'demo-secure-storage', templateUrl: 'secure-storage.component.html', + styleUrls: ['secure-storage.component.scss'], }) export class SecureStorageComponent { demoShared: DemoSharedSecureStorage; diff --git a/tools/demo/secure-storage/index.ts b/tools/demo/secure-storage/index.ts index 989d625a..b03aba3d 100644 --- a/tools/demo/secure-storage/index.ts +++ b/tools/demo/secure-storage/index.ts @@ -1,8 +1,102 @@ import { DemoSharedBase } from '../utils'; -import {} from '@nativescript/secure-storage'; +import { SecureStorage } from '@nativescript/secure-storage'; export class DemoSharedSecureStorage extends DemoSharedBase { + lastRetrievedValue = ''; + secureStorage = new SecureStorage(); + + constructor() { + super(); + } + testIt() { console.log('test secure-storage!'); } + + doSetSync() { + const success = this.secureStorage.setSync({ + key: 'foo', + value: 'I was set at ' + new Date(), + }); + console.log('Successfully set a value? ' + success); + } + + doSet() { + this.secureStorage + .set({ + key: 'foo', + value: 'I was set at ' + new Date(), + }) + .then( + (success) => { + console.log('Successfully set a value? ' + success); + }, + (err) => { + console.log(err); + } + ); + } + + doGet() { + this.secureStorage + .get({ + key: 'foo', + }) + .then( + (value) => { + console.log('Value: ' + value); + this.lastRetrievedValue = value === null ? '(no value set)' : value; + }, + (err) => { + console.log(err); + } + ); + } + + doGetSync() { + const value = this.secureStorage.getSync({ + key: 'foo', + }); + this.lastRetrievedValue = value === null ? '(no value set)' : value; + } + + doRemove() { + this.secureStorage + .remove({ + key: 'foo', + }) + .then( + (success) => { + console.log('Successfully removed a value? ' + success); + this.lastRetrievedValue = ''; + }, + (err) => { + console.log(err); + } + ); + } + + doRemoveSync() { + this.secureStorage.removeSync({ + key: 'foo', + }); + this.lastRetrievedValue = ''; + } + + doRemoveAll() { + this.secureStorage.removeAll().then( + (success) => { + console.log('Successfully removed all values? ' + success); + this.lastRetrievedValue = ''; + }, + (err) => { + console.log(err); + } + ); + } + + doRemoveAllSync() { + this.secureStorage.removeAllSync(); + this.lastRetrievedValue = ''; + } } From fc7f288d91c4344013d51cfe0c003c32204f2006 Mon Sep 17 00:00:00 2001 From: Markus Schlichting Date: Thu, 15 Jun 2023 21:48:05 +0200 Subject: [PATCH 3/4] add plain demo for secure-storage --- apps/demo/src/plugin-demos/secure-storage.ts | 132 +++++++++++++++++- apps/demo/src/plugin-demos/secure-storage.xml | 43 ++++-- 2 files changed, 160 insertions(+), 15 deletions(-) diff --git a/apps/demo/src/plugin-demos/secure-storage.ts b/apps/demo/src/plugin-demos/secure-storage.ts index 96257e72..a9248e43 100644 --- a/apps/demo/src/plugin-demos/secure-storage.ts +++ b/apps/demo/src/plugin-demos/secure-storage.ts @@ -1,10 +1,136 @@ -import { Observable, EventData, Page } from '@nativescript/core'; +import { EventData, Observable, Page } from '@nativescript/core'; import { DemoSharedSecureStorage } from '@demo/shared'; -import {} from '@nativescript/secure-storage'; +import { SecureStorage } from '@nativescript/secure-storage'; export function navigatingTo(args: EventData) { const page = args.object; page.bindingContext = new DemoModel(); } -export class DemoModel extends DemoSharedSecureStorage {} +export class DemoModel extends DemoSharedSecureStorage { + private secureStorage: SecureStorage; + + constructor() { + super(); + this.secureStorage = new SecureStorage(); + } + + public doGet() { + this.secureStorage + .get({ + key: 'foo', + }) + .then( + (value) => { + console.log('Value: ' + value); + this.set('lastRetrievedValue', value === null ? '(no value set)' : value); + }, + (err) => { + console.log(err); + } + ); + } + + public doGetSync() { + console.log('go'); + const value = this.secureStorage.getSync({ + key: 'foo', + }); + this.set('lastRetrievedValue', value === null ? '(no value set)' : value); + } + + public doSet() { + this.secureStorage + .set({ + key: 'foo', + value: 'I was set at ' + new Date(), + }) + .then( + (success) => { + console.log('Successfully set a value? ' + success); + }, + (err) => { + console.log(err); + } + ); + } + + public doSetSync() { + const success = this.secureStorage.setSync({ + key: 'foo', + value: 'I was set at ' + new Date(), + }); + console.log('Successfully set a value? ' + success); + } + + public doRemove() { + this.secureStorage + .remove({ + key: 'foo', + }) + .then( + (success) => { + console.log('Successfully removed a value? ' + success); + this.set('lastRetrievedValue', ''); + }, + (err) => { + console.log(err); + } + ); + } + + public doRemoveSync() { + this.secureStorage.removeSync({ + key: 'foo', + }); + this.set('lastRetrievedValue', ''); + } + + public doRemoveAll() { + this.secureStorage.removeAll().then( + (success) => { + console.log('Successfully removed all values? ' + success); + this.set('lastRetrievedValue', ''); + }, + (err) => { + console.log(err); + } + ); + } + + public doRemoveAllSync() { + this.secureStorage.removeAllSync(); + this.set('lastRetrievedValue', ''); + } + + public doClearAllOnFirstRunSync() { + const res: boolean = this.secureStorage.clearAllOnFirstRunSync(); + if (res) { + console.log('Cleared'); + this.set('lastRetrievedValue', ''); + } else { + alert('Is not the first run ! \n use `removeAllSync` or `removeAll` ;-)'); + } + } + + public doClearAllOnFirstRun() { + this.secureStorage.clearAllOnFirstRun().then((res) => { + if (res) { + console.log('Cleared'); + this.set('lastRetrievedValue', ''); + } else { + alert('Is not the first run ! \n use `removeAllSync` or `removeAll` ;-)'); + } + }); + } + + public doIsFirstRun() { + this.secureStorage.isFirstRun().then((isFirst) => { + this.set('isFirstRun', isFirst); + }); + } + + public doIsFirstRunSync() { + this.set('isFirstRun', this.secureStorage.isFirstRunSync()); + } +} diff --git a/apps/demo/src/plugin-demos/secure-storage.xml b/apps/demo/src/plugin-demos/secure-storage.xml index 347efac8..e49d4c73 100644 --- a/apps/demo/src/plugin-demos/secure-storage.xml +++ b/apps/demo/src/plugin-demos/secure-storage.xml @@ -1,14 +1,33 @@ - - - - - - - -