LoginV2 changes
This commit is contained in:
parent
37ce8a55db
commit
a88cd75a5c
|
@ -1,12 +1,15 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:ente_auth/core/configuration.dart';
|
import 'package:ente_auth/core/configuration.dart';
|
||||||
import 'package:ente_auth/core/errors.dart';
|
import 'package:ente_auth/core/errors.dart';
|
||||||
import 'package:ente_auth/l10n/l10n.dart';
|
import 'package:ente_auth/l10n/l10n.dart';
|
||||||
|
import 'package:ente_auth/services/user_service.dart';
|
||||||
import 'package:ente_auth/ui/account/recovery_page.dart';
|
import 'package:ente_auth/ui/account/recovery_page.dart';
|
||||||
import 'package:ente_auth/ui/common/dynamic_fab.dart';
|
import 'package:ente_auth/ui/common/dynamic_fab.dart';
|
||||||
import 'package:ente_auth/ui/components/buttons/button_widget.dart';
|
import 'package:ente_auth/ui/components/buttons/button_widget.dart';
|
||||||
import 'package:ente_auth/ui/home_page.dart';
|
import 'package:ente_auth/ui/home_page.dart';
|
||||||
|
import 'package:ente_auth/utils/crypto_util.dart';
|
||||||
import 'package:ente_auth/utils/dialog_util.dart';
|
import 'package:ente_auth/utils/dialog_util.dart';
|
||||||
import 'package:ente_auth/utils/email_util.dart';
|
import 'package:ente_auth/utils/email_util.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
@ -26,11 +29,20 @@ class _PasswordReentryPageState extends State<PasswordReentryPage> {
|
||||||
String? email;
|
String? email;
|
||||||
bool _passwordInFocus = false;
|
bool _passwordInFocus = false;
|
||||||
bool _passwordVisible = false;
|
bool _passwordVisible = false;
|
||||||
|
String? _volatilePassword;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
email = Configuration.instance.getEmail();
|
email = Configuration.instance.getEmail();
|
||||||
|
_volatilePassword = Configuration.instance.getVolatilePassword();
|
||||||
|
if (_volatilePassword != null) {
|
||||||
|
_passwordController.text = _volatilePassword!;
|
||||||
|
Future.delayed(
|
||||||
|
Duration.zero,
|
||||||
|
() => verifyPassword(_volatilePassword!),
|
||||||
|
);
|
||||||
|
}
|
||||||
_passwordFocusNode.addListener(() {
|
_passwordFocusNode.addListener(() {
|
||||||
setState(() {
|
setState(() {
|
||||||
_passwordInFocus = _passwordFocusNode.hasFocus;
|
_passwordInFocus = _passwordFocusNode.hasFocus;
|
||||||
|
@ -64,18 +76,31 @@ class _PasswordReentryPageState extends State<PasswordReentryPage> {
|
||||||
),
|
),
|
||||||
body: _getBody(),
|
body: _getBody(),
|
||||||
floatingActionButton: DynamicFAB(
|
floatingActionButton: DynamicFAB(
|
||||||
|
key: const ValueKey("verifyPasswordButton"),
|
||||||
isKeypadOpen: isKeypadOpen,
|
isKeypadOpen: isKeypadOpen,
|
||||||
isFormValid: _passwordController.text.isNotEmpty,
|
isFormValid: _passwordController.text.isNotEmpty,
|
||||||
buttonText: context.l10n.verifyPassword,
|
buttonText: context.l10n.verifyPassword,
|
||||||
onPressedFunction: () async {
|
onPressedFunction: () async {
|
||||||
FocusScope.of(context).unfocus();
|
FocusScope.of(context).unfocus();
|
||||||
final dialog = createProgressDialog(context, context.l10n.pleaseWait);
|
await verifyPassword(_passwordController.text);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
floatingActionButtonLocation: fabLocation(),
|
||||||
|
floatingActionButtonAnimator: NoScalingAnimation(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> verifyPassword(String password) async {
|
||||||
|
FocusScope.of(context).unfocus();
|
||||||
|
final dialog =
|
||||||
|
createProgressDialog(context, context.l10n.pleaseWait);
|
||||||
await dialog.show();
|
await dialog.show();
|
||||||
try {
|
try {
|
||||||
await Configuration.instance.decryptSecretsAndGetKeyEncKey(
|
final kek = await Configuration.instance.decryptSecretsAndGetKeyEncKey(
|
||||||
_passwordController.text,
|
password,
|
||||||
Configuration.instance.getKeyAttributes()!,
|
Configuration.instance.getKeyAttributes()!,
|
||||||
);
|
);
|
||||||
|
_registerSRPForExistingUsers(kek).ignore();
|
||||||
} on KeyDerivationError catch (e, s) {
|
} on KeyDerivationError catch (e, s) {
|
||||||
_logger.severe("Password verification failed", e, s);
|
_logger.severe("Password verification failed", e, s);
|
||||||
await dialog.hide();
|
await dialog.hide();
|
||||||
|
@ -116,6 +141,7 @@ class _PasswordReentryPageState extends State<PasswordReentryPage> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await dialog.hide();
|
await dialog.hide();
|
||||||
|
Configuration.instance.setVolatilePassword(null);
|
||||||
unawaited(
|
unawaited(
|
||||||
Navigator.of(context).pushAndRemoveUntil(
|
Navigator.of(context).pushAndRemoveUntil(
|
||||||
MaterialPageRoute(
|
MaterialPageRoute(
|
||||||
|
@ -126,11 +152,26 @@ class _PasswordReentryPageState extends State<PasswordReentryPage> {
|
||||||
(route) => false,
|
(route) => false,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
}
|
||||||
),
|
|
||||||
floatingActionButtonLocation: fabLocation(),
|
Future<void> _registerSRPForExistingUsers(Uint8List key) async {
|
||||||
floatingActionButtonAnimator: NoScalingAnimation(),
|
bool shouldSetupSRP = false;
|
||||||
);
|
try {
|
||||||
|
// ignore: unused_local_variable
|
||||||
|
final attr = await UserService.instance.getSrpAttributes(email!);
|
||||||
|
} on SrpSetupNotCompleteError {
|
||||||
|
shouldSetupSRP = true;
|
||||||
|
} catch (e, s) {
|
||||||
|
_logger.severe("error while fetching attr", e, s);
|
||||||
|
}
|
||||||
|
if (shouldSetupSRP) {
|
||||||
|
try {
|
||||||
|
final Uint8List loginKey = await CryptoUtil.deriveLoginKey(key);
|
||||||
|
await UserService.instance.registerOrUpdateSrp(loginKey);
|
||||||
|
} catch (e, s) {
|
||||||
|
_logger.severe("error while setting up srp for existing users", e, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _getBody() {
|
Widget _getBody() {
|
||||||
|
@ -145,7 +186,7 @@ class _PasswordReentryPageState extends State<PasswordReentryPage> {
|
||||||
const EdgeInsets.symmetric(vertical: 30, horizontal: 20),
|
const EdgeInsets.symmetric(vertical: 30, horizontal: 20),
|
||||||
child: Text(
|
child: Text(
|
||||||
context.l10n.welcomeBack,
|
context.l10n.welcomeBack,
|
||||||
style: Theme.of(context).textTheme.headline4,
|
style: Theme.of(context).textTheme.headlineMedium,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Visibility(
|
Visibility(
|
||||||
|
@ -165,6 +206,7 @@ class _PasswordReentryPageState extends State<PasswordReentryPage> {
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.fromLTRB(20, 24, 20, 0),
|
padding: const EdgeInsets.fromLTRB(20, 24, 20, 0),
|
||||||
child: TextFormField(
|
child: TextFormField(
|
||||||
|
key: const ValueKey("passwordInputField"),
|
||||||
autofillHints: const [AutofillHints.password],
|
autofillHints: const [AutofillHints.password],
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
hintText: context.l10n.enterYourPasswordHint,
|
hintText: context.l10n.enterYourPasswordHint,
|
||||||
|
@ -230,8 +272,10 @@ class _PasswordReentryPageState extends State<PasswordReentryPage> {
|
||||||
child: Center(
|
child: Center(
|
||||||
child: Text(
|
child: Text(
|
||||||
context.l10n.forgotPassword,
|
context.l10n.forgotPassword,
|
||||||
style:
|
style: Theme.of(context)
|
||||||
Theme.of(context).textTheme.subtitle1!.copyWith(
|
.textTheme
|
||||||
|
.titleMedium!
|
||||||
|
.copyWith(
|
||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
decoration: TextDecoration.underline,
|
decoration: TextDecoration.underline,
|
||||||
),
|
),
|
||||||
|
@ -254,8 +298,10 @@ class _PasswordReentryPageState extends State<PasswordReentryPage> {
|
||||||
child: Center(
|
child: Center(
|
||||||
child: Text(
|
child: Text(
|
||||||
context.l10n.changeEmail,
|
context.l10n.changeEmail,
|
||||||
style:
|
style: Theme.of(context)
|
||||||
Theme.of(context).textTheme.subtitle1!.copyWith(
|
.textTheme
|
||||||
|
.titleMedium!
|
||||||
|
.copyWith(
|
||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
decoration: TextDecoration.underline,
|
decoration: TextDecoration.underline,
|
||||||
),
|
),
|
||||||
|
|
Loading…
Reference in a new issue