diff --git a/repertory/repertory/src/ui/handlers.cpp b/repertory/repertory/src/ui/handlers.cpp index fb325fe2..a937a080 100644 --- a/repertory/repertory/src/ui/handlers.cpp +++ b/repertory/repertory/src/ui/handlers.cpp @@ -68,9 +68,10 @@ namespace { {"decryption failed"}); } - return std::string( + return { buffer.begin(), - std::next(buffer.begin(), static_cast(size))); + std::next(buffer.begin(), static_cast(size)), + }; } [[nodiscard]] auto decrypt_value(const repertory::ui::mgmt_app_config *config, diff --git a/web/repertory/lib/constants.dart b/web/repertory/lib/constants.dart index f8d0b7ea..2f95ad86 100644 --- a/web/repertory/lib/constants.dart +++ b/web/repertory/lib/constants.dart @@ -15,9 +15,8 @@ const ringBufferSizeList = ['128', '256', '512', '1024', '2048']; final GlobalKey navigatorKey = GlobalKey(); Sodium? _sodium; - void setSodium(Sodium sodium) { _sodium = sodium; } -Sodium? get sodium => _sodium; +Sodium get sodium => _sodium!; diff --git a/web/repertory/lib/helpers.dart b/web/repertory/lib/helpers.dart index 1271dfb1..06b64fd0 100644 --- a/web/repertory/lib/helpers.dart +++ b/web/repertory/lib/helpers.dart @@ -285,10 +285,6 @@ String encryptValue(String value, SecureKey key) { } final sodium = constants.sodium; - if (sodium == null) { - return value; - } - final crypto = sodium.crypto.aeadXChaCha20Poly1305IETF; final nonce = sodium.secureRandom(crypto.nonceBytes).extractBytes(); @@ -302,45 +298,6 @@ String encryptValue(String value, SecureKey key) { return hex.encode(nonce + data); } -Future promptPassword() async { - if (constants.navigatorKey.currentContext == null) { - return null; - } - - String password = ''; - return await showDialog( - context: constants.navigatorKey.currentContext!, - builder: (context) { - return AlertDialog( - actions: [ - TextButton( - child: const Text('Cancel'), - onPressed: () => Navigator.of(context).pop(null), - ), - TextButton( - child: const Text('OK'), - onPressed: () { - if (password.isEmpty) { - return displayErrorMessage(context, "Password is not valid"); - } - - Navigator.of(context).pop(password); - }, - ), - ], - content: TextField( - autofocus: true, - controller: TextEditingController(text: password), - obscureText: true, - obscuringCharacter: '*', - onChanged: (value) => password = value, - ), - title: const Text('Enter Repertory Portal Password'), - ); - }, - ); -} - Map getChanged( Map original, Map updated, diff --git a/web/repertory/lib/models/auth.dart b/web/repertory/lib/models/auth.dart index a92b2a34..614fd2eb 100644 --- a/web/repertory/lib/models/auth.dart +++ b/web/repertory/lib/models/auth.dart @@ -9,17 +9,14 @@ import 'package:sodium_libs/sodium_libs.dart'; class Auth with ChangeNotifier { bool _authenticated = false; - SecureKey? _key; + SecureKey _key = SecureKey.random(constants.sodium, 128); String _user = ""; bool get authenticated => _authenticated; - SecureKey get key => _key!; + SecureKey get key => _key; Future authenticate(String user, String password) async { final sodium = constants.sodium; - if (sodium == null) { - return; - } final keyHash = sodium.crypto.genericHash( outLen: sodium.crypto.aeadXChaCha20Poly1305IETF.keyBytes, @@ -40,11 +37,11 @@ class Auth with ChangeNotifier { ); if (response.statusCode != 200) { + logoff(); return ""; } final nonce = jsonDecode(response.body)["nonce"]; - debugPrint('nonce: $nonce'); return encryptValue('${_user}_$nonce', key); } catch (e) { debugPrint('$e'); @@ -52,4 +49,10 @@ class Auth with ChangeNotifier { return ""; } + + void logoff() { + _authenticated = false; + _user = ""; + notifyListeners(); + } } diff --git a/web/repertory/lib/models/mount.dart b/web/repertory/lib/models/mount.dart index 5e9a1e8a..0bceb2a0 100644 --- a/web/repertory/lib/models/mount.dart +++ b/web/repertory/lib/models/mount.dart @@ -40,6 +40,11 @@ class Mount with ChangeNotifier { ), ); + if (response.statusCode == 401) { + _auth.logoff(); + return; + } + if (response.statusCode == 404) { _mountList?.reset(); return; @@ -71,6 +76,11 @@ class Mount with ChangeNotifier { ), ); + if (response.statusCode == 401) { + _auth.logoff(); + return; + } + if (response.statusCode == 404) { _mountList?.reset(); return; @@ -102,6 +112,11 @@ class Mount with ChangeNotifier { ), ); + if (response.statusCode == 401) { + _auth.logoff(); + return null; + } + if (response.statusCode != 200) { return null; } @@ -136,6 +151,12 @@ class Mount with ChangeNotifier { ), ); + if (response.statusCode == 401) { + displayAuthError(); + _auth.logoff(); + return false; + } + if (response.statusCode == 404) { _isMounting = false; _mountList?.reset(); @@ -184,13 +205,13 @@ class Mount with ChangeNotifier { ), ); - if (response.statusCode == 404) { - _mountList?.reset(); + if (response.statusCode == 401) { + _auth.logoff(); return; } - if (response.statusCode == 500) { - displayAuthError(); + if (response.statusCode == 404) { + _mountList?.reset(); return; } diff --git a/web/repertory/lib/models/mount_list.dart b/web/repertory/lib/models/mount_list.dart index b7e2921e..508104ee 100644 --- a/web/repertory/lib/models/mount_list.dart +++ b/web/repertory/lib/models/mount_list.dart @@ -56,6 +56,11 @@ class MountList with ChangeNotifier { Uri.parse('${getBaseUri()}/api/v1/mount_list?auth=$auth'), ); + if (response.statusCode == 401) { + _auth.logoff(); + return; + } + if (response.statusCode == 404) { reset(); return; @@ -133,12 +138,13 @@ class MountList with ChangeNotifier { case 200: ret = true; break; + case 401: + displayAuthError(); + _auth.logoff(); + break; case 404: reset(); break; - case 500: - displayAuthError(); - break; default: displayError(); break; diff --git a/web/repertory/lib/screens/edit_settings_screen.dart b/web/repertory/lib/screens/edit_settings_screen.dart index 13f3f632..b38ba2ab 100644 --- a/web/repertory/lib/screens/edit_settings_screen.dart +++ b/web/repertory/lib/screens/edit_settings_screen.dart @@ -43,11 +43,17 @@ class _EditSettingsScreenState extends State { Future> _grabSettings() async { try { - final auth = await Provider.of(context, listen: false).createAuth(); + final authProvider = Provider.of(context, listen: false); + final auth = await authProvider.createAuth(); final response = await http.get( Uri.parse('${getBaseUri()}/api/v1/settings?auth=$auth'), ); + if (response.statusCode == 401) { + authProvider.logoff(); + return {}; + } + if (response.statusCode != 200) { return {}; } diff --git a/web/repertory/lib/widgets/ui_settings.dart b/web/repertory/lib/widgets/ui_settings.dart index 47704c29..2e1edb78 100644 --- a/web/repertory/lib/widgets/ui_settings.dart +++ b/web/repertory/lib/widgets/ui_settings.dart @@ -117,17 +117,18 @@ class _UISettingsWidgetState extends State { ), ), ); - if (response.statusCode == 500) { + + if (response.statusCode == 401) { displayAuthError(); + authProvider.logoff(); + return; } } catch (e) { debugPrint('$e'); - displayAuthError(); } }) .catchError((e) { debugPrint('$e'); - displayAuthError(); }); }