2019-06-29 22:56:11 +00:00
|
|
|
import 'package:flutter/cupertino.dart';
|
2019-07-04 21:45:05 +00:00
|
|
|
import 'package:provider/provider.dart';
|
|
|
|
|
|
|
|
import '../types/abstracts.dart';
|
|
|
|
|
2019-07-05 09:15:57 +00:00
|
|
|
import '../widgets/text_field.dart';
|
2019-06-29 22:56:11 +00:00
|
|
|
|
|
|
|
class Authentication extends StatefulWidget {
|
|
|
|
@override
|
|
|
|
_AuthenticationState createState() => _AuthenticationState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _AuthenticationState extends State<Authentication> {
|
2019-07-18 02:20:04 +00:00
|
|
|
final TextEditingController passwordController = TextEditingController();
|
|
|
|
final TextEditingController confirmController = TextEditingController();
|
|
|
|
bool invalid = false;
|
|
|
|
bool passesDontMatch = false;
|
|
|
|
ConfigRepo config;
|
|
|
|
Future<bool> passwordIsSet;
|
2019-07-04 21:45:05 +00:00
|
|
|
|
|
|
|
@override
|
|
|
|
didChangeDependencies() {
|
|
|
|
super.didChangeDependencies();
|
2019-07-18 02:20:04 +00:00
|
|
|
config = Provider.of<ConfigRepo>(context);
|
|
|
|
passwordIsSet = config.passwordIsSet;
|
2019-07-04 21:45:05 +00:00
|
|
|
}
|
2019-06-29 22:56:11 +00:00
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
return CupertinoPageScaffold(
|
|
|
|
child: Container(
|
|
|
|
margin: const EdgeInsets.symmetric(horizontal: 50.0),
|
2019-07-04 21:45:05 +00:00
|
|
|
child: FutureBuilder<bool>(
|
2019-07-18 02:20:04 +00:00
|
|
|
future: passwordIsSet,
|
2019-07-04 21:45:05 +00:00
|
|
|
builder: (BuildContext context, AsyncSnapshot<bool> snapshot) =>
|
|
|
|
snapshot.connectionState == ConnectionState.done
|
2019-07-05 09:15:57 +00:00
|
|
|
? Column(
|
2019-07-18 02:20:04 +00:00
|
|
|
children: buildColumnChildren(context, snapshot.data))
|
2019-07-05 09:15:57 +00:00
|
|
|
: Center(child: CupertinoActivityIndicator()),
|
2019-06-29 22:56:11 +00:00
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2019-07-18 02:20:04 +00:00
|
|
|
List<Widget> buildColumnChildren(BuildContext context, bool passwordIsSet) {
|
2019-07-04 21:45:05 +00:00
|
|
|
List<Widget> children = [
|
2019-06-29 22:56:11 +00:00
|
|
|
const Spacer(flex: 4),
|
|
|
|
const Flexible(child: Text('Master password:')),
|
|
|
|
Flexible(
|
2019-07-05 09:15:57 +00:00
|
|
|
child: TextField(
|
2019-07-07 04:14:09 +00:00
|
|
|
maxLines: 1,
|
2019-07-05 09:15:57 +00:00
|
|
|
obscure: true,
|
|
|
|
autofocus: true,
|
2019-07-18 02:20:04 +00:00
|
|
|
controller: passwordController,
|
2019-07-05 09:15:57 +00:00
|
|
|
),
|
2019-06-29 22:56:11 +00:00
|
|
|
),
|
|
|
|
];
|
|
|
|
|
2019-07-04 21:45:05 +00:00
|
|
|
if (!passwordIsSet) {
|
|
|
|
children.add(const Flexible(child: Text('Re-enter password:')));
|
|
|
|
children.add(Flexible(
|
2019-07-05 09:15:57 +00:00
|
|
|
child: TextField(
|
2019-07-07 04:14:09 +00:00
|
|
|
maxLines: 1,
|
2019-07-05 09:15:57 +00:00
|
|
|
obscure: true,
|
2019-07-18 02:20:04 +00:00
|
|
|
controller: confirmController,
|
2019-07-05 09:15:57 +00:00
|
|
|
),
|
2019-07-04 21:45:05 +00:00
|
|
|
));
|
|
|
|
}
|
|
|
|
|
2019-07-18 02:20:04 +00:00
|
|
|
if (invalid) {
|
2019-06-29 22:56:11 +00:00
|
|
|
children.add(const Flexible(
|
|
|
|
child: Text(
|
|
|
|
'invalid masterpass',
|
|
|
|
style: TextStyle(color: CupertinoColors.destructiveRed),
|
|
|
|
),
|
|
|
|
));
|
2019-07-04 21:45:05 +00:00
|
|
|
}
|
|
|
|
|
2019-07-18 02:20:04 +00:00
|
|
|
if (passesDontMatch) {
|
2019-07-04 21:45:05 +00:00
|
|
|
children.add(const Flexible(
|
|
|
|
child: Text(
|
|
|
|
'passwords don\'t match',
|
|
|
|
style: TextStyle(color: CupertinoColors.destructiveRed),
|
|
|
|
),
|
|
|
|
));
|
|
|
|
}
|
|
|
|
|
2019-07-18 02:20:04 +00:00
|
|
|
children.add(Container(
|
|
|
|
padding: EdgeInsets.only(top: 20),
|
|
|
|
child: CupertinoButton.filled(
|
|
|
|
child: Text('Enter'),
|
|
|
|
onPressed: buildEnterPressedBuilder(context),
|
|
|
|
),
|
2019-07-05 09:15:57 +00:00
|
|
|
));
|
|
|
|
|
2019-07-18 02:20:04 +00:00
|
|
|
if (passesDontMatch) {
|
2019-07-04 21:45:05 +00:00
|
|
|
children.add(const Spacer(flex: 1));
|
2019-07-18 02:20:04 +00:00
|
|
|
} else if (invalid || !passwordIsSet) {
|
2019-06-29 22:56:11 +00:00
|
|
|
children.add(const Spacer(flex: 2));
|
|
|
|
} else {
|
|
|
|
children.add(const Spacer(flex: 3));
|
|
|
|
}
|
|
|
|
|
|
|
|
return children;
|
|
|
|
}
|
|
|
|
|
2019-07-18 02:20:04 +00:00
|
|
|
VoidCallback buildEnterPressedBuilder(BuildContext context) {
|
2019-07-05 09:15:57 +00:00
|
|
|
return () async {
|
2019-07-18 02:20:04 +00:00
|
|
|
if (await passwordIsSet) {
|
|
|
|
if (await config.matchesPasswordHash(passwordController.text)) {
|
2019-07-09 02:03:44 +00:00
|
|
|
Navigator.of(context).pushReplacementNamed('/home',
|
2019-07-18 02:20:04 +00:00
|
|
|
arguments: await config.connectionConfig);
|
2019-07-04 21:45:05 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-07-18 02:20:04 +00:00
|
|
|
this.setState(() => invalid = true);
|
2019-07-05 09:15:57 +00:00
|
|
|
return;
|
|
|
|
}
|
2019-07-04 21:45:05 +00:00
|
|
|
|
2019-07-18 02:20:04 +00:00
|
|
|
if (passwordController.text != confirmController.text) {
|
2019-07-05 09:15:57 +00:00
|
|
|
this.setState(() {
|
2019-07-18 02:20:04 +00:00
|
|
|
passesDontMatch = true;
|
2019-07-05 09:15:57 +00:00
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
2019-06-29 22:56:11 +00:00
|
|
|
|
2019-07-18 02:20:04 +00:00
|
|
|
config.setPassword(passwordController.text);
|
|
|
|
passwordIsSet = Future<bool>.value(true);
|
2019-07-05 09:15:57 +00:00
|
|
|
Navigator.of(context).pushReplacementNamed('/config');
|
2019-06-29 22:56:11 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|