ente/lib/onboarding/view/setup_enter_secret_key_page.dart

169 lines
5.8 KiB
Dart
Raw Normal View History

2022-11-01 06:13:06 +00:00
import "package:ente_auth/l10n/l10n.dart";
import 'package:ente_auth/models/code.dart';
import 'package:ente_auth/utils/dialog_util.dart';
import 'package:ente_auth/utils/totp_util.dart';
import "package:flutter/material.dart";
class SetupEnterSecretKeyPage extends StatefulWidget {
2022-11-22 07:19:39 +00:00
final Code? code;
SetupEnterSecretKeyPage({this.code, Key? key}) : super(key: key);
2022-11-01 06:13:06 +00:00
@override
State<SetupEnterSecretKeyPage> createState() =>
_SetupEnterSecretKeyPageState();
}
class _SetupEnterSecretKeyPageState extends State<SetupEnterSecretKeyPage> {
late TextEditingController _issuerController;
2022-11-22 07:19:39 +00:00
late TextEditingController _accountController;
late TextEditingController _secretController;
@override
void initState() {
_issuerController = TextEditingController(
text: widget.code != null
? Uri.decodeFull(widget.code!.issuer).trim()
: null,
);
2022-11-22 07:19:39 +00:00
_accountController = TextEditingController(
text: widget.code != null
? Uri.decodeFull(widget.code!.account).trim()
2022-11-22 07:19:39 +00:00
: null,
);
_secretController = TextEditingController(
text: widget.code != null ? widget.code!.secret : null,
);
super.initState();
}
2022-11-01 06:13:06 +00:00
@override
Widget build(BuildContext context) {
final l10n = context.l10n;
return Scaffold(
appBar: AppBar(
title: Text(l10n.importAccountPageTitle),
),
body: SafeArea(
child: Center(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 40.0, horizontal: 40),
child: Column(
children: [
TextFormField(
// The validator receives the text that the user has entered.
validator: (value) {
if (value == null || value.isEmpty) {
return "Please enter some text";
}
return null;
},
decoration: InputDecoration(
hintText: l10n.codeIssuerHint,
2022-11-01 06:13:06 +00:00
),
controller: _issuerController,
2022-11-01 06:13:06 +00:00
autofocus: true,
),
const SizedBox(
height: 20,
),
TextFormField(
// The validator receives the text that the user has entered.
validator: (value) {
if (value == null || value.isEmpty) {
return "Please enter some text";
}
return null;
},
decoration: InputDecoration(
hintText: l10n.codeSecretKeyHint,
2022-11-01 06:13:06 +00:00
),
controller: _secretController,
),
const SizedBox(
height: 20,
),
TextFormField(
// The validator receives the text that the user has entered.
validator: (value) {
if (value == null || value.isEmpty) {
return "Please enter some text";
}
return null;
},
decoration: InputDecoration(
hintText: l10n.codeAccountHint,
),
controller: _accountController,
),
2022-11-01 06:13:06 +00:00
const SizedBox(
height: 40,
),
SizedBox(
width: 400,
child: OutlinedButton(
onPressed: () {
2023-02-06 06:38:55 +00:00
if ((_accountController.text.trim().isEmpty &&
_issuerController.text.trim().isEmpty) ||
2022-11-01 06:13:06 +00:00
_secretController.text.trim().isEmpty) {
2023-02-06 06:38:55 +00:00
String message;
if (_secretController.text.trim().isEmpty) {
2023-07-13 15:29:28 +00:00
message = context.l10n.secretCanNotBeEmpty;
2023-02-06 06:38:55 +00:00
} else {
2023-07-13 15:29:28 +00:00
message = context.l10n.bothIssuerAndAccountCanNotBeEmpty;
2023-02-06 06:38:55 +00:00
}
_showIncorrectDetailsDialog(context, message: message);
2022-11-01 06:13:06 +00:00
return;
}
try {
2023-04-30 03:58:25 +00:00
final account = _accountController.text.trim();
final issuer = _issuerController.text.trim();
final secret =
_secretController.text.trim().replaceAll(' ', '');
final Code newCode = widget.code == null
? Code.fromAccountAndSecret(
account,
issuer,
secret,
)
: widget.code!.copyWith(
account: account,
issuer: issuer,
secret: secret,
);
2022-11-01 06:13:06 +00:00
// Verify the validity of the code
2023-04-30 03:58:25 +00:00
getTotp(newCode);
Navigator.of(context).pop(newCode);
2022-11-01 06:13:06 +00:00
} catch (e) {
_showIncorrectDetailsDialog(context);
}
},
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16.0,
vertical: 4,
),
child: Text(l10n.saveAction),
2022-11-01 06:13:06 +00:00
),
),
)
],
),
),
),
),
);
}
2023-02-06 06:38:55 +00:00
void _showIncorrectDetailsDialog(
BuildContext context, {
2023-07-13 15:29:28 +00:00
String? message,
2023-02-06 06:38:55 +00:00
}) {
2022-11-01 06:13:06 +00:00
showErrorDialog(
context,
2023-07-13 15:29:28 +00:00
context.l10n.incorrectDetails,
message ?? context.l10n.pleaseVerifyDetails,
2022-11-01 06:13:06 +00:00
);
}
}