From 6d2023ba1be281ee881f6c5ce99fe331d5e9d091 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Thu, 20 Mar 2025 21:52:18 -0500 Subject: [PATCH] fix --- repertory/repertory/src/ui/handlers.cpp | 7 ++- web/repertory/lib/helpers.dart | 45 ++++++++++++++++--- web/repertory/lib/widgets/mount_settings.dart | 37 +++++---------- web/repertory/pubspec.yaml | 1 + 4 files changed, 57 insertions(+), 33 deletions(-) diff --git a/repertory/repertory/src/ui/handlers.cpp b/repertory/repertory/src/ui/handlers.cpp index e66dc4f2..d8806833 100644 --- a/repertory/repertory/src/ui/handlers.cpp +++ b/repertory/repertory/src/ui/handlers.cpp @@ -26,6 +26,7 @@ #include "rpc/common.hpp" #include "types/repertory.hpp" #include "ui/mgmt_app_config.hpp" +#include "utils/collection.hpp" #include "utils/common.hpp" #include "utils/config.hpp" #include "utils/error_utils.hpp" @@ -42,7 +43,11 @@ namespace { return std::string{data}; } - auto decoded = macaron::Base64::Decode(data); + repertory::data_buffer decoded; + if (not repertory::utils::collection::from_hex_string(data, decoded)) { + throw repertory::utils::error::create_exception(function_name, + {"decryption failed"}); + } repertory::data_buffer buffer(decoded.size()); auto key = repertory::utils::encryption::create_hash_blake2b_256(password); diff --git a/web/repertory/lib/helpers.dart b/web/repertory/lib/helpers.dart index c02d9070..b618bbe8 100644 --- a/web/repertory/lib/helpers.dart +++ b/web/repertory/lib/helpers.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:convert/convert.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -270,6 +271,7 @@ Future> convertAllToString( } } + debugPrint('password|$password'); settings[entry.key] = encryptValue(entry.value, password!); continue; } @@ -312,7 +314,7 @@ String encryptValue(String value, String password) { nonce: nonce, ); - return base64Encode(Uint8List.fromList([...nonce, ...data])); + return hex.encode(nonce + data); } Future promptPassword() async { @@ -320,7 +322,7 @@ Future promptPassword() async { return null; } - String updatedValue1 = ''; + String password = ''; return await showDialog( context: constants.navigatorKey.currentContext!, builder: (context) { @@ -333,23 +335,54 @@ Future promptPassword() async { TextButton( child: const Text('OK'), onPressed: () { - if (updatedValue1.isEmpty) { + if (password.isEmpty) { return displayErrorMessage(context, "Password is not valid"); } - Navigator.of(context).pop(updatedValue1); + Navigator.of(context).pop(password); }, ), ], content: TextField( autofocus: true, - controller: TextEditingController(text: updatedValue1), + controller: TextEditingController(text: password), obscureText: true, obscuringCharacter: '*', - onChanged: (value) => updatedValue1 = value, + onChanged: (value) => password = value, ), title: const Text('Enter Authentication Password'), ); }, ); } + +Map getChanged( + Map original, + Map updated, +) { + if (DeepCollectionEquality().equals(original, updated)) { + return {}; + } + + Map changedSettings = {}; + original.forEach((key, value) { + if (DeepCollectionEquality().equals(value, updated[key])) { + return; + } + + if (value is Map) { + changedSettings[key] = {}; + value.forEach((subKey, subValue) { + if (DeepCollectionEquality().equals(subValue, updated[key][subKey])) { + return; + } + + changedSettings[key][subKey] = updated[key][subKey]; + }); + } else { + changedSettings[key] = updated[key]; + } + }); + + return changedSettings; +} diff --git a/web/repertory/lib/widgets/mount_settings.dart b/web/repertory/lib/widgets/mount_settings.dart index 80cdd391..87252891 100644 --- a/web/repertory/lib/widgets/mount_settings.dart +++ b/web/repertory/lib/widgets/mount_settings.dart @@ -1,9 +1,12 @@ -import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:repertory/constants.dart' as constants; import 'package:repertory/helpers.dart' - show convertAllToString, getSettingDescription, getSettingValidators; + show + convertAllToString, + getChanged, + getSettingDescription, + getSettingValidators; import 'package:repertory/models/mount.dart'; import 'package:repertory/models/mount_list.dart'; import 'package:repertory/settings.dart'; @@ -614,30 +617,12 @@ class _MountSettingsWidgetState extends State { @override void dispose() { if (!widget.isAdd) { - var settings = widget.mount.mountConfig.settings; - Map changedSettings = {}; - if (!DeepCollectionEquality().equals(widget.settings, settings)) { - widget.settings.forEach((key, value) { - if (!DeepCollectionEquality().equals(settings[key], value)) { - if (value is Map) { - changedSettings[key] = {}; - value.forEach((subKey, subValue) { - if (!DeepCollectionEquality().equals( - settings[key][subKey], - subValue, - )) { - changedSettings[key][subKey] = subValue; - } - }); - } else { - changedSettings[key] = value; - } - } - }); - } - - if (changedSettings.isNotEmpty) { - convertAllToString(changedSettings).then((map) { + final settings = getChanged( + widget.mount.mountConfig.settings, + widget.settings, + ); + if (settings.isNotEmpty) { + convertAllToString(settings).then((map) { map.forEach((key, value) { if (value is Map) { value.forEach((subKey, subValue) { diff --git a/web/repertory/pubspec.yaml b/web/repertory/pubspec.yaml index ef663aee..53c64ef4 100644 --- a/web/repertory/pubspec.yaml +++ b/web/repertory/pubspec.yaml @@ -39,6 +39,7 @@ dependencies: provider: ^6.1.2 settings_ui: ^2.0.2 sodium_libs: ^3.4.4+1 + convert: ^3.1.2 dev_dependencies: flutter_test: