Этот репозиторий содержит Flutter плагины для платформы ОС Аврора.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

140 lines
4.3 KiB

/*
* Copyright (C) 2023 Open Mobile Platform LLC.
* Contact: https://community.omprussia.ru/open-source
*
* This file is part of the Aurora OS Application Template project.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the distribution.
* * Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
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);
final _secureStorage = const FlutterSecureStorage();
/// Error
String? _error;
/// Public error
String? get error => _error;
/// 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();
}
}