// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC // SPDX-License-Identifier: BSD-3-Clause 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(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 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) { debugPrint(e.toString()); _readValue = "Error password"; } notifyListeners(); } // Write new data in secure storage Future 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, ) { 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(); } }