Browse Source

[flutter_example_packages] Add crypto, flutter_secure_storage

merge-requests/21/head
Vitaliy Zarubin 2 years ago
parent
commit
fc6c82838f
  1. 10
      example/lib/l10n/app_en.arb
  2. 10
      example/lib/l10n/app_ru.arb
  3. 22
      example/lib/packages/crypto/package.dart
  4. 2
      example/lib/packages/flutter_local_notifications/page.dart
  5. 90
      example/lib/packages/flutter_secure_storage/model.dart
  6. 130
      example/lib/packages/flutter_secure_storage/page.dart
  7. 3
      example/lib/packages/packages.dart
  8. 2
      example/lib/pages/home/widgets/package_list_item.dart
  9. 72
      example/pubspec.lock
  10. 12
      example/pubspec.yaml
  11. 3
      packages/flutter_secure_storage/flutter_secure_storage_aurora/lib/flutter_secure_storage_aurora.dart

10
example/lib/l10n/app_en.arb

@ -61,8 +61,14 @@
"flutterLocalNotificationsBtn": "Send", "flutterLocalNotificationsBtn": "Send",
"@_FLUTTER_SECURE_STORAGE": {}, "@_FLUTTER_SECURE_STORAGE": {},
"flutterSecureStorageTitle": "Title", "flutterSecureStorageSuccess": "Data saved successfully",
"flutterSecureStorageDesc": "Desc", "flutterSecureStorageTitleSave": "Save value",
"flutterSecureStorageTitleGet": "Get value",
"flutterSecureStorageFieldPass": "Password",
"flutterSecureStorageFieldKey": "Key",
"flutterSecureStorageFieldValue": "Value",
"flutterSecureStorageBtnSave": "Save value",
"flutterSecureStorageBtnGet": "Get value",
"@_PACKAGE_INFO_PLUS": {}, "@_PACKAGE_INFO_PLUS": {},
"packageInfoPlusTitlePackageName": "Package", "packageInfoPlusTitlePackageName": "Package",

10
example/lib/l10n/app_ru.arb

@ -61,8 +61,14 @@
"flutterLocalNotificationsBtn": "Отправить", "flutterLocalNotificationsBtn": "Отправить",
"@_FLUTTER_SECURE_STORAGE": {}, "@_FLUTTER_SECURE_STORAGE": {},
"flutterSecureStorageTitle": "Заголовок", "flutterSecureStorageSuccess": "Данные успешно сохранены",
"flutterSecureStorageDesc": "Описание", "flutterSecureStorageTitleSave": "Сохранить значение",
"flutterSecureStorageTitleGet": "Получить значение",
"flutterSecureStorageFieldPass": "Пароль",
"flutterSecureStorageFieldKey": "Ключ",
"flutterSecureStorageFieldValue": "Значение",
"flutterSecureStorageBtnSave": "Сохранить значение",
"flutterSecureStorageBtnGet": "Получить значение",
"@_PACKAGE_INFO_PLUS": {}, "@_PACKAGE_INFO_PLUS": {},
"packageInfoPlusTitlePackageName": "Пакет", "packageInfoPlusTitlePackageName": "Пакет",

22
example/lib/packages/crypto/package.dart

@ -0,0 +1,22 @@
import 'package:flutter_example_packages/base/package/package_dialog.dart';
/// Package values
final packageCrypto = PackageDialog(
key: 'crypto',
descEN: '''
A set of cryptographic hashing functions for Dart.
''',
descRU: '''
Набор криптографических функций хеширования для Dart.
''',
messageEN: '''
This is a platform independent plugin used in this app, should work
for you too.
''',
messageRU: '''
Это плагин независимый от платформы, используется в этом приложении,
должен работать и у вас.
''',
version: '3.0.2',
isPlatformDependent: false,
);

2
example/lib/packages/flutter_local_notifications/page.dart

@ -53,7 +53,7 @@ class _FlutterLocalNotificationsPageState
hintText: l10n.flutterLocalNotificationsHintTitle, hintText: l10n.flutterLocalNotificationsHintTitle,
), ),
), ),
const SizedBox(height: 18), const SizedBox(height: 16),
TextField( TextField(
controller: _bodyController, controller: _bodyController,
decoration: InputDecoration( decoration: InputDecoration(

90
example/lib/packages/flutter_secure_storage/model.dart

@ -1,10 +1,18 @@
import 'dart:convert';
import 'package:crypto/crypto.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:flutter_secure_storage_aurora/flutter_secure_storage_aurora.dart';
import 'package:scoped_model/scoped_model.dart'; import 'package:scoped_model/scoped_model.dart';
/// Model for [FlutterSecureStoragePage] /// Model for [FlutterSecureStoragePage]
class FlutterSecureStorageModel extends Model { class FlutterSecureStorageModel extends Model {
/// Get [ScopedModel] /// Get [ScopedModel]
static FlutterSecureStorageModel of(BuildContext context) => ScopedModel.of<FlutterSecureStorageModel>(context); static FlutterSecureStorageModel of(BuildContext context) =>
ScopedModel.of<FlutterSecureStorageModel>(context);
final _secureStorage = const FlutterSecureStorage();
/// Error /// Error
String? _error; String? _error;
@ -14,4 +22,84 @@ class FlutterSecureStorageModel extends Model {
/// Public is error /// Public is error
bool get isError => _error != null; bool get isError => _error != null;
/// Save success
bool _isSuccess = false;
/// Public success
bool get isSuccess => _isSuccess;
/// Value for read form secure storage
String _readValue = "";
/// Public read value
String get readValue => _readValue;
// Get data from secure storage
Future<void> read({
required String key,
required String password,
}) async {
try {
// Update secret key
_updateByPassword(password);
// Read data
_readValue = await _secureStorage.read(key: key) ?? "Not found";
} catch (e) {
_readValue = "Error password";
}
notifyListeners();
}
// Write new data in secure storage
Future<void> write({
required String key,
required String value,
required String password,
}) async {
try {
// Update secret key
_updateByPassword(password);
// Clear old data
await _secureStorage.deleteAll();
// Save new data
await _secureStorage.write(key: key, value: value);
// Show success
_isSuccess = true;
// Close success
Future.delayed(const Duration(milliseconds: 1500), () {
_isSuccess = false;
notifyListeners();
});
} catch (e) {
_error = e.toString();
}
notifyListeners();
}
/// Update password
void _updateByPassword(
String password,
) {
// https://pub.dev/packages/encrypt
// Encrypter(AES(key))
// secure-random --length 16 --base 16
// You can generate a secret key based on user data, as an example of a hash pin-code
FlutterSecureStorageAurora.setSecret(
_getPasswordFromString(password),
);
}
/// Generate secure key 32 length from string password
String _getPasswordFromString(
String password,
) {
return md5.convert(utf8.encode(password)).toString();
}
/// Clear value if change values
void clearReadValue() {
_readValue = "";
notifyListeners();
}
} }

130
example/lib/packages/flutter_secure_storage/page.dart

@ -5,8 +5,8 @@ import 'package:flutter_example_packages/packages/flutter_secure_storage/package
import 'package:flutter_example_packages/widgets/base/export.dart'; import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_example_packages/widgets/blocks/block_alert.dart'; import 'package:flutter_example_packages/widgets/blocks/block_alert.dart';
import 'package:flutter_example_packages/widgets/blocks/block_info_package.dart'; import 'package:flutter_example_packages/widgets/blocks/block_info_package.dart';
import 'package:flutter_example_packages/widgets/blocks/block_item.dart';
import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; import 'package:flutter_example_packages/widgets/layouts/block_layout.dart';
import 'package:flutter_example_packages/widgets/texts/export.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class FlutterSecureStoragePage extends AppStatefulWidget { class FlutterSecureStoragePage extends AppStatefulWidget {
@ -23,6 +23,31 @@ class FlutterSecureStoragePage extends AppStatefulWidget {
class _FlutterSecureStoragePageState class _FlutterSecureStoragePageState
extends AppState<FlutterSecureStoragePage> { extends AppState<FlutterSecureStoragePage> {
bool _isValidSave = false;
final TextEditingController _passSaveController = TextEditingController();
final TextEditingController _keySaveController = TextEditingController();
final TextEditingController _valueSaveController = TextEditingController();
bool _isValidGet = false;
final TextEditingController _passGetController = TextEditingController();
final TextEditingController _keyGetController = TextEditingController();
final TextEditingController _valueGetController = TextEditingController();
void _validateSave() {
setState(() {
_isValidSave = _passSaveController.text.isNotEmpty &&
_keySaveController.text.isNotEmpty &&
_valueSaveController.text.isNotEmpty;
});
}
void _validateGet() {
setState(() {
_isValidGet = _passGetController.text.isNotEmpty &&
_keyGetController.text.isNotEmpty;
});
}
@override @override
Widget buildWide( Widget buildWide(
BuildContext context, BuildContext context,
@ -32,6 +57,9 @@ class _FlutterSecureStoragePageState
return BlockLayout<FlutterSecureStorageModel>( return BlockLayout<FlutterSecureStorageModel>(
title: widget.package.key, title: widget.package.key,
builder: (context, child, model) { builder: (context, child, model) {
// update read only value
_valueGetController.text = model.readValue;
// return widget
return SingleChildScrollView( return SingleChildScrollView(
child: Padding( child: Padding(
padding: const EdgeInsets.all(20), padding: const EdgeInsets.all(20),
@ -44,10 +72,102 @@ class _FlutterSecureStoragePageState
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
BlockItem( TextTitleLarge(l10n.flutterSecureStorageTitleSave),
title: l10n.flutterSecureStorageTitle, const SizedBox(height: 14),
desc: l10n.flutterSecureStorageDesc, if (model.isSuccess)
value: null, BlockAlert(
l10n.flutterSecureStorageSuccess,
color: Colors.lightGreen,
),
const SizedBox(height: 6),
TextField(
controller: _passSaveController,
decoration: InputDecoration(
labelText: l10n.flutterSecureStorageFieldPass,
),
onChanged: (_) => _validateSave(),
),
const SizedBox(height: 16),
TextField(
controller: _keySaveController,
decoration: InputDecoration(
labelText: l10n.flutterSecureStorageFieldKey,
),
onChanged: (_) => _validateSave(),
),
const SizedBox(height: 16),
TextField(
controller: _valueSaveController,
decoration: InputDecoration(
labelText: l10n.flutterSecureStorageFieldValue,
),
onChanged: (_) => _validateSave(),
),
const SizedBox(height: 20),
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: _isValidSave
? () => model.write(
key: _keySaveController.text,
value: _valueSaveController.text,
password: _passSaveController.text,
)
: null,
child: TextBodyLarge(
l10n.flutterSecureStorageBtnSave,
color: Colors.white,
),
),
),
const SizedBox(height: 30),
TextTitleLarge(l10n.flutterSecureStorageTitleGet),
const SizedBox(height: 16),
TextField(
controller: _passGetController,
decoration: InputDecoration(
labelText: l10n.flutterSecureStorageFieldPass,
),
onChanged: (_) {
_validateGet();
model.clearReadValue();
},
),
const SizedBox(height: 16),
TextField(
controller: _keyGetController,
decoration: InputDecoration(
labelText: l10n.flutterSecureStorageFieldKey,
),
onChanged: (_) {
_validateGet();
model.clearReadValue();
}
),
const SizedBox(height: 16),
TextField(
enabled: false,
readOnly: true,
controller: _valueGetController,
decoration: InputDecoration(
labelText: l10n.flutterSecureStorageFieldValue,
),
),
const SizedBox(height: 20),
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: _isValidGet
? () => model.read(
key: _keyGetController.text,
password: _passGetController.text,
)
: null,
child: TextBodyLarge(
l10n.flutterSecureStorageBtnGet,
color: Colors.white,
),
),
), ),
], ],
), ),

3
example/lib/packages/packages.dart

@ -18,10 +18,13 @@ import 'package:flutter_example_packages/packages/universal_io/package.dart';
import 'package:flutter_example_packages/packages/wakelock/package.dart'; import 'package:flutter_example_packages/packages/wakelock/package.dart';
import 'package:flutter_example_packages/packages/xdga_directories/package.dart'; import 'package:flutter_example_packages/packages/xdga_directories/package.dart';
import 'crypto/package.dart';
/// List app packages /// List app packages
final packages = <Package>[ final packages = <Package>[
packageBatteryPlus, packageBatteryPlus,
packageCachedNetworkImage, packageCachedNetworkImage,
packageCrypto,
packageCupertinoIcons, packageCupertinoIcons,
packageDeviceInfoPlus, packageDeviceInfoPlus,
packageFlutterCacheManager, packageFlutterCacheManager,

2
example/lib/pages/home/widgets/package_list_item.dart

@ -129,7 +129,7 @@ class PackageListItemWidget extends AppStatelessWidget {
child: Padding( child: Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
left: 6, left: 6,
top: 3, top: 6,
right: 6, right: 6,
bottom: 6, bottom: 6,
), ),

72
example/pubspec.lock

@ -22,6 +22,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.4.1" version: "2.4.1"
asn1lib:
dependency: transitive
description:
name: asn1lib
url: "https://pub.dartlang.org"
source: hosted
version: "1.4.1"
async: async:
dependency: transitive dependency: transitive
description: description:
@ -156,7 +163,7 @@ packages:
source: hosted source: hosted
version: "3.1.1" version: "3.1.1"
crypto: crypto:
dependency: transitive dependency: "direct main"
description: description:
name: crypto name: crypto
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
@ -204,6 +211,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "7.0.0" version: "7.0.0"
encrypt:
dependency: transitive
description:
name: encrypt
url: "https://pub.dartlang.org"
source: hosted
version: "5.0.1"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
@ -277,6 +291,55 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_secure_storage:
dependency: "direct main"
description:
name: flutter_secure_storage
url: "https://pub.dartlang.org"
source: hosted
version: "8.0.0"
flutter_secure_storage_aurora:
dependency: "direct main"
description:
path: "../packages/flutter_secure_storage/flutter_secure_storage_aurora"
relative: true
source: path
version: "0.0.1"
flutter_secure_storage_linux:
dependency: transitive
description:
name: flutter_secure_storage_linux
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.3"
flutter_secure_storage_macos:
dependency: transitive
description:
name: flutter_secure_storage_macos
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.0"
flutter_secure_storage_platform_interface:
dependency: transitive
description:
name: flutter_secure_storage_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
flutter_secure_storage_web:
dependency: transitive
description:
name: flutter_secure_storage_web
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.1"
flutter_secure_storage_windows:
dependency: transitive
description:
name: flutter_secure_storage_windows
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -518,6 +581,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.4" version: "2.1.4"
pointycastle:
dependency: transitive
description:
name: pointycastle
url: "https://pub.dartlang.org"
source: hosted
version: "3.7.3"
pool: pool:
dependency: transitive dependency: transitive
description: description:

12
example/pubspec.yaml

@ -25,6 +25,8 @@ dependencies:
intl: ^0.17.0 intl: ^0.17.0
## https://pub.dev/packages/universal_io ## https://pub.dev/packages/universal_io
universal_io: ^2.2.0 universal_io: ^2.2.0
## https://pub.dev/packages/crypto
crypto: ^3.0.2
## https://os-git.omprussia.ru/non-oss/flutter/flutter-plugins/-/tree/master/packages/xdga_directories ## https://os-git.omprussia.ru/non-oss/flutter/flutter-plugins/-/tree/master/packages/xdga_directories
xdga_directories: xdga_directories:
@ -48,11 +50,11 @@ dependencies:
flutter_local_notifications_aurora: flutter_local_notifications_aurora:
path: ../packages/flutter_local_notifications/flutter_local_notifications_aurora path: ../packages/flutter_local_notifications/flutter_local_notifications_aurora
# ## https://pub.dev/packages/flutter_secure_storage ## https://pub.dev/packages/flutter_secure_storage
# flutter_secure_storage: ^8.0.0 flutter_secure_storage: ^8.0.0
# ## https://os-git.omprussia.ru/non-oss/flutter/flutter-plugins/-/tree/master/packages/flutter_secure_storage/flutter_secure_storage_aurora ## https://os-git.omprussia.ru/non-oss/flutter/flutter-plugins/-/tree/master/packages/flutter_secure_storage/flutter_secure_storage_aurora
# flutter_secure_storage_aurora: flutter_secure_storage_aurora:
# path: ../packages/flutter_secure_storage/flutter_secure_storage_aurora path: ../packages/flutter_secure_storage/flutter_secure_storage_aurora
## https://pub.dev/packages/package_info_plus ## https://pub.dev/packages/package_info_plus
package_info_plus: 4.0.2 package_info_plus: 4.0.2

3
packages/flutter_secure_storage/flutter_secure_storage_aurora/lib/flutter_secure_storage_aurora.dart

@ -22,8 +22,7 @@ class FlutterSecureStorageAurora extends FlutterSecureStoragePlatform {
); );
} }
static void registerWith() async { static void registerWith() {
PathProviderAurora.registerWith();
FlutterSecureStoragePlatform.instance = FlutterSecureStorageAurora(); FlutterSecureStoragePlatform.instance = FlutterSecureStorageAurora();
} }

Loading…
Cancel
Save