Compare commits

...

5 Commits

Author SHA1 Message Date
a28151068a refactor
All checks were successful
BlockStorage/repertory/pipeline/head This commit looks good
2025-03-20 18:39:42 -05:00
674a5a6fe1 prompt for password once 2025-03-20 18:37:03 -05:00
d9b8a60055 prompt for password once 2025-03-20 18:36:10 -05:00
6570438872 fix 2025-03-20 18:19:59 -05:00
12ef6910ed fix 2025-03-20 18:15:31 -05:00
2 changed files with 57 additions and 22 deletions

View File

@ -12,6 +12,10 @@ class NullPasswordException implements Exception {
String error() => 'password cannot be null'; String error() => 'password cannot be null';
} }
class AuthenticationFailedException implements Exception {
String error() => 'failed to authenticate user';
}
// ignore: prefer_function_declarations_over_variables // ignore: prefer_function_declarations_over_variables
final Validator noRestrictedChars = (value) { final Validator noRestrictedChars = (value) {
return [ return [
@ -233,29 +237,43 @@ bool validateSettings(
Future<Map<String, dynamic>> convertAllToString( Future<Map<String, dynamic>> convertAllToString(
Map<String, dynamic> settings, Map<String, dynamic> settings,
) async { ) async {
final password = await promptPassword(); String? password;
if (password == null) { Future<Map<String, dynamic>> convert(Map<String, dynamic> settings) async {
throw NullPasswordException(); for (var entry in settings.entries) {
if (entry.value is Map<String, dynamic>) {
await convert(entry.value);
continue;
}
if (entry.key == 'ApiPassword' ||
entry.key == 'EncryptionToken' ||
entry.key == 'SecretKey') {
if (entry.value.isEmpty) {
continue;
}
if (password == null) {
password = await promptPassword();
if (password == null) {
throw NullPasswordException();
}
}
settings[entry.key] = encryptValue(entry.value, password!);
continue;
}
if (entry.value is String) {
continue;
}
settings[entry.key] = entry.value.toString();
}
return settings;
} }
settings.forEach((key, value) { return convert(settings);
if (value is Map<String, dynamic>) {
convertAllToString(value);
return;
}
if (key == 'ApiPassword' ||
key == 'EncryptionToken' ||
key == 'SecretKey') {
value = encryptValue(value, password);
} else if (value is String) {
return;
}
settings[key] = value.toString();
});
return settings;
} }
String encryptValue(String value, String password) { String encryptValue(String value, String password) {

View File

@ -3,9 +3,12 @@ import 'dart:convert' show jsonEncode;
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:repertory/constants.dart' as constants;
import 'package:repertory/helpers.dart' import 'package:repertory/helpers.dart'
show show
AuthenticationFailedException,
convertAllToString, convertAllToString,
displayErrorMessage,
getBaseUri, getBaseUri,
getSettingDescription, getSettingDescription,
getSettingValidators, getSettingValidators,
@ -104,22 +107,36 @@ class _UISettingsWidgetState extends State<UISettingsWidget> {
widget.settings, widget.settings,
widget.origSettings, widget.origSettings,
)) { )) {
displayAuthError() {
if (constants.navigatorKey.currentContext != null) {
displayErrorMessage(
constants.navigatorKey.currentContext!,
"Authentication failed",
);
}
}
convertAllToString(widget.settings) convertAllToString(widget.settings)
.then((map) async { .then((map) async {
try { try {
await http.put( final response = await http.put(
Uri.parse( Uri.parse(
Uri.encodeFull( Uri.encodeFull(
'${getBaseUri()}/api/v1/settings?data=${jsonEncode(map)}', '${getBaseUri()}/api/v1/settings?data=${jsonEncode(map)}',
), ),
), ),
); );
if (response.statusCode == 500) {
displayAuthError();
}
} catch (e) { } catch (e) {
debugPrint('$e'); debugPrint('$e');
displayAuthError();
} }
}) })
.catchError((e) { .catchError((e) {
debugPrint('$e'); debugPrint('$e');
displayAuthError();
}); });
} }