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. 92
      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",
"@_FLUTTER_SECURE_STORAGE": {},
"flutterSecureStorageTitle": "Title",
"flutterSecureStorageDesc": "Desc",
"flutterSecureStorageSuccess": "Data saved successfully",
"flutterSecureStorageTitleSave": "Save value",
"flutterSecureStorageTitleGet": "Get value",
"flutterSecureStorageFieldPass": "Password",
"flutterSecureStorageFieldKey": "Key",
"flutterSecureStorageFieldValue": "Value",
"flutterSecureStorageBtnSave": "Save value",
"flutterSecureStorageBtnGet": "Get value",
"@_PACKAGE_INFO_PLUS": {},
"packageInfoPlusTitlePackageName": "Package",

10
example/lib/l10n/app_ru.arb

@ -61,8 +61,14 @@
"flutterLocalNotificationsBtn": "Отправить",
"@_FLUTTER_SECURE_STORAGE": {},
"flutterSecureStorageTitle": "Заголовок",
"flutterSecureStorageDesc": "Описание",
"flutterSecureStorageSuccess": "Данные успешно сохранены",
"flutterSecureStorageTitleSave": "Сохранить значение",
"flutterSecureStorageTitleGet": "Получить значение",
"flutterSecureStorageFieldPass": "Пароль",
"flutterSecureStorageFieldKey": "Ключ",
"flutterSecureStorageFieldValue": "Значение",
"flutterSecureStorageBtnSave": "Сохранить значение",
"flutterSecureStorageBtnGet": "Получить значение",
"@_PACKAGE_INFO_PLUS": {},
"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,
),
),
const SizedBox(height: 18),
const SizedBox(height: 16),
TextField(
controller: _bodyController,
decoration: InputDecoration(

92
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_secure_storage/flutter_secure_storage.dart';
import 'package:flutter_secure_storage_aurora/flutter_secure_storage_aurora.dart';
import 'package:scoped_model/scoped_model.dart';
/// Model for [FlutterSecureStoragePage]
class FlutterSecureStorageModel extends Model {
/// 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
String? _error;
@ -14,4 +22,84 @@ class FlutterSecureStorageModel extends Model {
/// Public is error
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/blocks/block_alert.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/texts/export.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class FlutterSecureStoragePage extends AppStatefulWidget {
@ -23,6 +23,31 @@ class FlutterSecureStoragePage extends AppStatefulWidget {
class _FlutterSecureStoragePageState
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
Widget buildWide(
BuildContext context,
@ -32,6 +57,9 @@ class _FlutterSecureStoragePageState
return BlockLayout<FlutterSecureStorageModel>(
title: widget.package.key,
builder: (context, child, model) {
// update read only value
_valueGetController.text = model.readValue;
// return widget
return SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(20),
@ -44,10 +72,102 @@ class _FlutterSecureStoragePageState
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
BlockItem(
title: l10n.flutterSecureStorageTitle,
desc: l10n.flutterSecureStorageDesc,
value: null,
TextTitleLarge(l10n.flutterSecureStorageTitleSave),
const SizedBox(height: 14),
if (model.isSuccess)
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/xdga_directories/package.dart';
import 'crypto/package.dart';
/// List app packages
final packages = <Package>[
packageBatteryPlus,
packageCachedNetworkImage,
packageCrypto,
packageCupertinoIcons,
packageDeviceInfoPlus,
packageFlutterCacheManager,

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

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

72
example/pubspec.lock

@ -22,6 +22,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.4.1"
asn1lib:
dependency: transitive
description:
name: asn1lib
url: "https://pub.dartlang.org"
source: hosted
version: "1.4.1"
async:
dependency: transitive
description:
@ -156,7 +163,7 @@ packages:
source: hosted
version: "3.1.1"
crypto:
dependency: transitive
dependency: "direct main"
description:
name: crypto
url: "https://pub.dartlang.org"
@ -204,6 +211,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "7.0.0"
encrypt:
dependency: transitive
description:
name: encrypt
url: "https://pub.dartlang.org"
source: hosted
version: "5.0.1"
fake_async:
dependency: transitive
description:
@ -277,6 +291,55 @@ packages:
description: flutter
source: sdk
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:
dependency: "direct dev"
description: flutter
@ -518,6 +581,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.4"
pointycastle:
dependency: transitive
description:
name: pointycastle
url: "https://pub.dartlang.org"
source: hosted
version: "3.7.3"
pool:
dependency: transitive
description:

12
example/pubspec.yaml

@ -25,6 +25,8 @@ dependencies:
intl: ^0.17.0
## https://pub.dev/packages/universal_io
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
xdga_directories:
@ -48,11 +50,11 @@ dependencies:
flutter_local_notifications_aurora:
path: ../packages/flutter_local_notifications/flutter_local_notifications_aurora
# ## https://pub.dev/packages/flutter_secure_storage
# 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
# flutter_secure_storage_aurora:
# path: ../packages/flutter_secure_storage/flutter_secure_storage_aurora
## https://pub.dev/packages/flutter_secure_storage
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
flutter_secure_storage_aurora:
path: ../packages/flutter_secure_storage/flutter_secure_storage_aurora
## https://pub.dev/packages/package_info_plus
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 {
PathProviderAurora.registerWith();
static void registerWith() {
FlutterSecureStoragePlatform.instance = FlutterSecureStorageAurora();
}

Loading…
Cancel
Save