From 73106fc0afcfb0db75f830fd8485051d9f4b5485 Mon Sep 17 00:00:00 2001 From: Vishnu Mohandas Date: Tue, 29 Jun 2021 20:33:54 +0530 Subject: [PATCH] Create a recovery if absent --- lib/services/user_service.dart | 47 +++++++++++++------- lib/ui/settings/security_section_widget.dart | 18 +------- 2 files changed, 32 insertions(+), 33 deletions(-) diff --git a/lib/services/user_service.dart b/lib/services/user_service.dart index cfc8cb7a7..ade538eef 100644 --- a/lib/services/user_service.dart +++ b/lib/services/user_service.dart @@ -1,3 +1,5 @@ +import 'dart:typed_data'; + import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; @@ -396,24 +398,17 @@ class UserService { Future enableTwoFactor( BuildContext context, String secret, String code) async { + var recoveryKey; + try { + recoveryKey = await getOrCreateRecoveryKey(context); + } catch (e) { + showGenericErrorDialog(context); + return false; + } final dialog = createProgressDialog(context, "verifying..."); await dialog.show(); - var encryptionResult; - try { - final keyAttributes = _config.getKeyAttributes(); - final key = _config.getKey(); - final recoveryKey = CryptoUtil.decryptSync( - Sodium.base642bin(keyAttributes.recoveryKeyEncryptedWithMasterKey), - key, - Sodium.base642bin(keyAttributes.recoveryKeyDecryptionNonce)); - encryptionResult = - CryptoUtil.encryptSync(Sodium.base642bin(secret), recoveryKey); - } catch (e, s) { - _logger.severe(e, s); - await dialog.hide(); - showErrorDialog(context, "something went wrong", - "please make sure that you've created a recovery key"); - } + final encryptionResult = + CryptoUtil.encryptSync(Sodium.base642bin(secret), recoveryKey); try { await _dio.post( _config.getHttpEndpoint() + "/users/two-factor/enable", @@ -491,6 +486,26 @@ class UserService { } } + Future getOrCreateRecoveryKey(BuildContext context) async { + final encryptedRecoveryKey = + _config.getKeyAttributes().recoveryKeyEncryptedWithMasterKey; + if (encryptedRecoveryKey == null || encryptedRecoveryKey.isEmpty) { + final dialog = createProgressDialog(context, "please wait..."); + await dialog.show(); + try { + final keyAttributes = await _config.createNewRecoveryKey(); + await setRecoveryKey(keyAttributes); + await dialog.hide(); + } catch (e, s) { + await dialog.hide(); + _logger.severe(e, s); + throw e; + } + } + final recoveryKey = _config.getRecoveryKey(); + return recoveryKey; + } + Future _saveConfiguration(Response response) async { await Configuration.instance.setUserID(response.data["id"]); if (response.data["encryptedToken"] != null) { diff --git a/lib/ui/settings/security_section_widget.dart b/lib/ui/settings/security_section_widget.dart index 340fc2e2f..c3a7772b0 100644 --- a/lib/ui/settings/security_section_widget.dart +++ b/lib/ui/settings/security_section_widget.dart @@ -277,23 +277,7 @@ class _SecuritySectionWidgetState extends State { } Future _getOrCreateRecoveryKey() async { - final encryptedRecoveryKey = - _config.getKeyAttributes().recoveryKeyEncryptedWithMasterKey; - if (encryptedRecoveryKey == null || encryptedRecoveryKey.isEmpty) { - final dialog = createProgressDialog(context, "please wait..."); - await dialog.show(); - try { - final keyAttributes = await _config.createNewRecoveryKey(); - await UserService.instance.setRecoveryKey(keyAttributes); - await dialog.hide(); - } catch (e, s) { - await dialog.hide(); - Logger("SecuritySection").severe(e, s); - throw e; - } - } - final recoveryKey = _config.getRecoveryKey(); - return Sodium.bin2hex(recoveryKey); + return Sodium.bin2hex(await UserService.instance.getOrCreateRecoveryKey(context)); } void _disableTwoFactor() {