diff --git a/lib/core/configuration.dart b/lib/core/configuration.dart index cc16e7b6a..a972ee6fd 100644 --- a/lib/core/configuration.dart +++ b/lib/core/configuration.dart @@ -7,6 +7,8 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_sodium/flutter_sodium.dart'; import 'package:path_provider/path_provider.dart'; import 'package:photos/models/key_attributes.dart'; +import 'package:photos/models/key_gen_result.dart'; +import 'package:photos/models/private_key_attributes.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:photos/utils/crypto_util.dart'; @@ -45,7 +47,7 @@ class Configuration { _secretKey = await _secureStorage.read(key: secretKeyKey); } - Future generateAndSaveKey(String passphrase) async { + Future generateKey(String passphrase) async { // Create a master key final key = CryptoUtil.generateKey(); @@ -73,10 +75,9 @@ class Configuration { Sodium.bin2base64(encryptedSecretKeyData.encryptedData), Sodium.bin2base64(encryptedSecretKeyData.nonce), ); - await setKey(Sodium.bin2base64(key)); - await setSecretKey(Sodium.bin2base64(keyPair.sk)); - await setKeyAttributes(attributes); - return attributes; + final privateAttributes = PrivateKeyAttributes( + Sodium.bin2base64(key), Sodium.bin2base64(keyPair.sk)); + return KeyGenResult(attributes, privateAttributes); } Future decryptAndSaveKey( diff --git a/lib/models/key_gen_result.dart b/lib/models/key_gen_result.dart new file mode 100644 index 000000000..1f8b9851e --- /dev/null +++ b/lib/models/key_gen_result.dart @@ -0,0 +1,9 @@ +import 'package:photos/models/key_attributes.dart'; +import 'package:photos/models/private_key_attributes.dart'; + +class KeyGenResult { + final KeyAttributes keyAttributes; + final PrivateKeyAttributes privateKeyAttributes; + + KeyGenResult(this.keyAttributes, this.privateKeyAttributes); +} diff --git a/lib/models/private_key_attributes.dart b/lib/models/private_key_attributes.dart new file mode 100644 index 000000000..ab25b3d15 --- /dev/null +++ b/lib/models/private_key_attributes.dart @@ -0,0 +1,6 @@ +class PrivateKeyAttributes { + final String key; + final String secretKey; + + PrivateKeyAttributes(this.key, this.secretKey); +} diff --git a/lib/services/user_service.dart b/lib/services/user_service.dart index 90c9fb803..042d072b0 100644 --- a/lib/services/user_service.dart +++ b/lib/services/user_service.dart @@ -1,6 +1,7 @@ import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import 'package:flutter_sodium/flutter_sodium.dart'; import 'package:logging/logging.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/core/event_bus.dart'; @@ -18,6 +19,7 @@ import 'package:photos/utils/toast_util.dart'; class UserService { final _dio = Dio(); final _logger = Logger("UserAuthenticator"); + final _config = Configuration.instance; UserService._privateConstructor(); @@ -27,7 +29,7 @@ class UserService { final dialog = createProgressDialog(context, "Please wait..."); await dialog.show(); await _dio.get( - Configuration.instance.getHttpEndpoint() + "/users/ott", + _config.getHttpEndpoint() + "/users/ott", queryParameters: { "email": email, }, @@ -52,11 +54,11 @@ class UserService { Future getPublicKey(String email) async { try { final response = await _dio.get( - Configuration.instance.getHttpEndpoint() + "/users/public-key", + _config.getHttpEndpoint() + "/users/public-key", queryParameters: {"email": email}, options: Options( headers: { - "X-Auth-Token": Configuration.instance.getToken(), + "X-Auth-Token": _config.getToken(), }, ), ); @@ -73,9 +75,9 @@ class UserService { final dialog = createProgressDialog(context, "Please wait..."); await dialog.show(); await _dio.get( - Configuration.instance.getHttpEndpoint() + "/users/credentials", + _config.getHttpEndpoint() + "/users/credentials", queryParameters: { - "email": Configuration.instance.getEmail(), + "email": _config.getEmail(), "ott": ott, }, ).catchError((e) async { @@ -109,32 +111,30 @@ class UserService { Future setupKey(BuildContext context, String passphrase) async { final dialog = createProgressDialog(context, "Please wait..."); await dialog.show(); - final keyAttributes = - await Configuration.instance.generateAndSaveKey(passphrase); + final result = await _config.generateKey(passphrase); await _dio .put( - Configuration.instance.getHttpEndpoint() + "/users/key-attributes", - data: keyAttributes.toMap(), + _config.getHttpEndpoint() + "/users/key-attributes", + data: result.keyAttributes.toMap(), options: Options( headers: { - "X-Auth-Token": Configuration.instance.getToken(), + "X-Auth-Token": _config.getToken(), }, ), ) .catchError((e) async { await dialog.hide(); - await Configuration.instance.setKey(null); - await Configuration.instance.setKeyAttributes(null); _logger.severe(e); showGenericErrorDialog(context); }).then((response) async { await dialog.hide(); if (response != null && response.statusCode == 200) { + await _config.setKey(result.privateKeyAttributes.key); + await _config.setSecretKey(result.privateKeyAttributes.secretKey); + await _config.setKeyAttributes(result.keyAttributes); Bus.instance.fire(UserAuthenticatedEvent()); Navigator.of(context).popUntil((route) => route.isFirst); } else { - await Configuration.instance.setKey(null); - await Configuration.instance.setKeyAttributes(null); showGenericErrorDialog(context); } });