mirror of
https://github.com/twonlyapp/twonly-app.git
synced 2026-07-18 02:24:07 +00:00
require authentication for backup password change
Some checks are pending
Flutter analyze & test / flutter_analyze_and_test (push) Waiting to run
Some checks are pending
Flutter analyze & test / flutter_analyze_and_test (push) Waiting to run
This commit is contained in:
parent
e7dab1102d
commit
e000b7c41d
5 changed files with 47 additions and 7 deletions
|
|
@ -1604,6 +1604,18 @@ abstract class AppLocalizations {
|
||||||
/// **'Change password'**
|
/// **'Change password'**
|
||||||
String get backupChangePassword;
|
String get backupChangePassword;
|
||||||
|
|
||||||
|
/// No description provided for @backupChangePasswordAuthReason.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Changing backup password'**
|
||||||
|
String get backupChangePasswordAuthReason;
|
||||||
|
|
||||||
|
/// No description provided for @backupChangePasswordAuthFailed.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'You can only change your password after you have authenticated!'**
|
||||||
|
String get backupChangePasswordAuthFailed;
|
||||||
|
|
||||||
/// No description provided for @twonlySafeRecoverTitle.
|
/// No description provided for @twonlySafeRecoverTitle.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
|
||||||
|
|
@ -841,7 +841,14 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
String get backupTwonlySaveNow => 'Jetzt speichern';
|
String get backupTwonlySaveNow => 'Jetzt speichern';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get backupChangePassword => 'Password ändern';
|
String get backupChangePassword => 'Passwort ändern';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get backupChangePasswordAuthReason => 'Backup-Passwort ändern';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get backupChangePasswordAuthFailed =>
|
||||||
|
'Du kannst dein Passwort nur ändern, wenn du dich authentifiziert hast!';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get twonlySafeRecoverTitle => 'Backup wiederherstellen';
|
String get twonlySafeRecoverTitle => 'Backup wiederherstellen';
|
||||||
|
|
|
||||||
|
|
@ -838,6 +838,13 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get backupChangePassword => 'Change password';
|
String get backupChangePassword => 'Change password';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get backupChangePasswordAuthReason => 'Changing backup password';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get backupChangePasswordAuthFailed =>
|
||||||
|
'You can only change your password after you have authenticated!';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get twonlySafeRecoverTitle => 'Restore backup';
|
String get twonlySafeRecoverTitle => 'Restore backup';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit 80b21d7e566a12d105f573cb7224b6cdfe37048b
|
Subproject commit aa2ac144d3663f476f19ba28ced318b1a64c7a73
|
||||||
|
|
@ -6,6 +6,7 @@ import 'package:twonly/src/services/backup.service.dart';
|
||||||
import 'package:twonly/src/services/user.service.dart';
|
import 'package:twonly/src/services/user.service.dart';
|
||||||
import 'package:twonly/src/utils/misc.dart';
|
import 'package:twonly/src/utils/misc.dart';
|
||||||
import 'package:twonly/src/visual/components/alert.dialog.dart';
|
import 'package:twonly/src/visual/components/alert.dialog.dart';
|
||||||
|
import 'package:twonly/src/visual/components/snackbar.dart';
|
||||||
import 'package:twonly/src/visual/elements/my_button.element.dart';
|
import 'package:twonly/src/visual/elements/my_button.element.dart';
|
||||||
import 'package:twonly/src/visual/views/settings/backup/components/backup_setup.comp.dart';
|
import 'package:twonly/src/visual/views/settings/backup/components/backup_setup.comp.dart';
|
||||||
|
|
||||||
|
|
@ -26,7 +27,7 @@ class SetupBackupView extends StatefulWidget {
|
||||||
class _SetupBackupViewState extends State<SetupBackupView> {
|
class _SetupBackupViewState extends State<SetupBackupView> {
|
||||||
bool _isLoading = false;
|
bool _isLoading = false;
|
||||||
final TextEditingController _passwordController = TextEditingController();
|
final TextEditingController _passwordController = TextEditingController();
|
||||||
final TextEditingController _repeadedController = TextEditingController();
|
final TextEditingController _repeatedController = TextEditingController();
|
||||||
|
|
||||||
Future<void> _updateBackupPassword() async {
|
Future<void> _updateBackupPassword() async {
|
||||||
setState(() {
|
setState(() {
|
||||||
|
|
@ -52,6 +53,19 @@ class _SetupBackupViewState extends State<SetupBackupView> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!mounted) return;
|
||||||
|
final verified = await authenticateUser(
|
||||||
|
context.lang.backupChangePasswordAuthReason,
|
||||||
|
);
|
||||||
|
if (!mounted) return;
|
||||||
|
if (!verified) {
|
||||||
|
showSnackbar(
|
||||||
|
context,
|
||||||
|
context.lang.backupChangePasswordAuthFailed,
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
await Future.delayed(const Duration(milliseconds: 100));
|
await Future.delayed(const Duration(milliseconds: 100));
|
||||||
await BackupService.updateBackupPassword(_passwordController.text);
|
await BackupService.updateBackupPassword(_passwordController.text);
|
||||||
await UserService.update((u) => u.isBackupEnabled = true);
|
await UserService.update((u) => u.isBackupEnabled = true);
|
||||||
|
|
@ -108,15 +122,15 @@ class _SetupBackupViewState extends State<SetupBackupView> {
|
||||||
),
|
),
|
||||||
const SizedBox(height: 5),
|
const SizedBox(height: 5),
|
||||||
BackupPasswordTextField(
|
BackupPasswordTextField(
|
||||||
controller: _repeadedController,
|
controller: _repeatedController,
|
||||||
labelText: context.lang.passwordRepeated,
|
labelText: context.lang.passwordRepeated,
|
||||||
onChanged: (value) => setState(() {}),
|
onChanged: (value) => setState(() {}),
|
||||||
),
|
),
|
||||||
PasswordRequirementText(
|
PasswordRequirementText(
|
||||||
text: context.lang.passwordRepeatedNotEqual,
|
text: context.lang.passwordRepeatedNotEqual,
|
||||||
showError:
|
showError:
|
||||||
_passwordController.text != _repeadedController.text &&
|
_passwordController.text != _repeatedController.text &&
|
||||||
_repeadedController.text.isNotEmpty,
|
_repeatedController.text.isNotEmpty,
|
||||||
),
|
),
|
||||||
const SizedBox(height: 10),
|
const SizedBox(height: 10),
|
||||||
Text(
|
Text(
|
||||||
|
|
@ -131,7 +145,7 @@ class _SetupBackupViewState extends State<SetupBackupView> {
|
||||||
onPressed:
|
onPressed:
|
||||||
(!_isLoading &&
|
(!_isLoading &&
|
||||||
(_passwordController.text ==
|
(_passwordController.text ==
|
||||||
_repeadedController.text &&
|
_repeatedController.text &&
|
||||||
_passwordController.text.length >= 8 ||
|
_passwordController.text.length >= 8 ||
|
||||||
!kReleaseMode))
|
!kReleaseMode))
|
||||||
? _updateBackupPassword
|
? _updateBackupPassword
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue