android and approve mode

Signed-off-by: 21pages <pages21@163.com>
This commit is contained in:
21pages 2023-06-28 20:22:57 +08:00
parent bb679bf25a
commit f38ebb7b3c
2 changed files with 79 additions and 53 deletions

View File

@ -25,6 +25,18 @@ class ServerPage extends StatefulWidget implements PageShape {
PopupMenuButton<String>( PopupMenuButton<String>(
icon: const Icon(Icons.more_vert), icon: const Icon(Icons.more_vert),
itemBuilder: (context) { itemBuilder: (context) {
listTile(String text, bool checked) {
return ListTile(
title: Text(translate(text)),
trailing: Icon(
Icons.check,
color: checked ? null : Colors.transparent,
));
}
final approveMode = gFFI.serverModel.approveMode;
final verificationMethod = gFFI.serverModel.verificationMethod;
final showPasswordOption = approveMode != 'click';
return [ return [
PopupMenuItem( PopupMenuItem(
enabled: gFFI.serverModel.connectStatus > 0, enabled: gFFI.serverModel.connectStatus > 0,
@ -32,61 +44,63 @@ class ServerPage extends StatefulWidget implements PageShape {
value: "changeID", value: "changeID",
child: Text(translate("Change ID")), child: Text(translate("Change ID")),
), ),
PopupMenuItem(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
value: "setPermanentPassword",
enabled:
gFFI.serverModel.verificationMethod != kUseTemporaryPassword,
child: Text(translate("Set permanent password")),
),
PopupMenuItem(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
value: "setTemporaryPasswordLength",
enabled:
gFFI.serverModel.verificationMethod != kUsePermanentPassword,
child: Text(translate("One-time password length")),
),
const PopupMenuDivider(), const PopupMenuDivider(),
PopupMenuItem( PopupMenuItem(
padding: const EdgeInsets.symmetric(horizontal: 0.0), padding: const EdgeInsets.symmetric(horizontal: 0.0),
value: kUseTemporaryPassword, value: 'AcceptSessionsViaPassword',
child: ListTile( child: listTile(
title: Text(translate("Use one-time password")), 'Accept sessions via password', approveMode == 'password'),
trailing: Icon(
Icons.check,
color: gFFI.serverModel.verificationMethod ==
kUseTemporaryPassword
? null
: Colors.transparent,
)),
), ),
PopupMenuItem(
padding: const EdgeInsets.symmetric(horizontal: 0.0),
value: 'AcceptSessionsViaClick',
child:
listTile('Accept sessions via click', approveMode == 'click'),
),
PopupMenuItem(
padding: const EdgeInsets.symmetric(horizontal: 0.0),
value: "AcceptSessionsViaBoth",
child: listTile("Accept sessions via both",
approveMode != 'password' && approveMode != 'click'),
),
if (showPasswordOption) const PopupMenuDivider(),
if (showPasswordOption &&
verificationMethod != kUseTemporaryPassword)
PopupMenuItem(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
value: "setPermanentPassword",
child: Text(translate("Set permanent password")),
),
if (showPasswordOption &&
verificationMethod != kUsePermanentPassword)
PopupMenuItem(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
value: "setTemporaryPasswordLength",
child: Text(translate("One-time password length")),
),
if (showPasswordOption) const PopupMenuDivider(),
if (showPasswordOption)
PopupMenuItem(
padding: const EdgeInsets.symmetric(horizontal: 0.0),
value: kUseTemporaryPassword,
child: listTile('Use one-time password',
verificationMethod == kUseTemporaryPassword),
),
if (showPasswordOption)
PopupMenuItem( PopupMenuItem(
padding: const EdgeInsets.symmetric(horizontal: 0.0), padding: const EdgeInsets.symmetric(horizontal: 0.0),
value: kUsePermanentPassword, value: kUsePermanentPassword,
child: ListTile( child: listTile('Use permanent password',
title: Text(translate("Use permanent password")), verificationMethod == kUsePermanentPassword),
trailing: Icon(
Icons.check,
color: gFFI.serverModel.verificationMethod ==
kUsePermanentPassword
? null
: Colors.transparent,
)),
), ),
if (showPasswordOption)
PopupMenuItem( PopupMenuItem(
padding: const EdgeInsets.symmetric(horizontal: 0.0), padding: const EdgeInsets.symmetric(horizontal: 0.0),
value: kUseBothPasswords, value: kUseBothPasswords,
child: ListTile( child: listTile(
title: Text(translate("Use both passwords")), 'Use both passwords',
trailing: Icon( verificationMethod != kUseTemporaryPassword &&
Icons.check, verificationMethod != kUsePermanentPassword),
color: gFFI.serverModel.verificationMethod !=
kUseTemporaryPassword &&
gFFI.serverModel.verificationMethod !=
kUsePermanentPassword
? null
: Colors.transparent,
)),
), ),
]; ];
}, },
@ -102,6 +116,15 @@ class ServerPage extends StatefulWidget implements PageShape {
value == kUseBothPasswords) { value == kUseBothPasswords) {
bind.mainSetOption(key: "verification-method", value: value); bind.mainSetOption(key: "verification-method", value: value);
gFFI.serverModel.updatePasswordModel(); gFFI.serverModel.updatePasswordModel();
} else if (value.startsWith("AcceptSessionsVia")) {
value = value.substring("AcceptSessionsVia".length);
if (value == "Password") {
gFFI.serverModel.setApproveMode('password');
} else if (value == "Click") {
gFFI.serverModel.setApproveMode('click');
} else {
gFFI.serverModel.setApproveMode('');
}
} }
}) })
]; ];
@ -434,11 +457,13 @@ class ConnectionManager extends StatelessWidget {
serverModel.sendLoginResponse( serverModel.sendLoginResponse(
client, false); client, false);
}).marginOnly(right: 15), }).marginOnly(right: 15),
if (serverModel.approveMode != 'password')
ElevatedButton.icon( ElevatedButton.icon(
icon: const Icon(Icons.check), icon: const Icon(Icons.check),
label: Text(translate("Accept")), label: Text(translate("Accept")),
onPressed: () { onPressed: () {
serverModel.sendLoginResponse(client, true); serverModel.sendLoginResponse(
client, true);
}), }),
]), ]),
]))) ])))

View File

@ -520,6 +520,7 @@ class ServerModel with ChangeNotifier {
), ),
actions: [ actions: [
dialogButton("Dismiss", onPressed: cancel, isOutline: true), dialogButton("Dismiss", onPressed: cancel, isOutline: true),
if (approveMode != 'password')
dialogButton("Accept", onPressed: submit), dialogButton("Accept", onPressed: submit),
], ],
onSubmit: submit, onSubmit: submit,