Create a recovery if absent

This commit is contained in:
Vishnu Mohandas 2021-06-29 20:33:54 +05:30
parent 89f2c7a3e1
commit 73106fc0af
2 changed files with 32 additions and 33 deletions

View file

@ -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<bool> 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<Uint8List> 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<void> _saveConfiguration(Response response) async {
await Configuration.instance.setUserID(response.data["id"]);
if (response.data["encryptedToken"] != null) {

View file

@ -277,23 +277,7 @@ class _SecuritySectionWidgetState extends State<SecuritySectionWidget> {
}
Future<String> _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() {