diff --git a/lib/fido/keys.dart b/lib/fido/keys.dart index 028bf562..9f2bdf10 100644 --- a/lib/fido/keys.dart +++ b/lib/fido/keys.dart @@ -24,7 +24,6 @@ const _fingerprintAction = '$_prefix.fingerprint.actions'; // Key actions const managePinAction = Key('$_keyAction.manage_pin'); const addFingerprintAction = Key('$_keyAction.add_fingerprint'); -const resetAction = Key('$_keyAction.reset'); // Credential actions const editCredentialAction = Key('$_credentialAction.edit'); diff --git a/lib/fido/views/key_actions.dart b/lib/fido/views/key_actions.dart index bb58edee..b7baef83 100755 --- a/lib/fido/views/key_actions.dart +++ b/lib/fido/views/key_actions.dart @@ -25,7 +25,6 @@ import '../keys.dart' as keys; import '../models.dart'; import 'add_fingerprint_dialog.dart'; import 'pin_dialog.dart'; -import 'reset_dialog.dart'; bool fidoShowActionsNotifier(FidoState state) { return (state.alwaysUv && !state.hasPin) || @@ -94,21 +93,6 @@ Widget fidoBuildActions( builder: (context) => FidoPinDialog(node.path, state), ); }), - ActionListItem( - key: keys.resetAction, - feature: features.actionsReset, - actionStyle: ActionStyle.error, - icon: const Icon(Icons.delete_outline), - title: l10n.s_reset_fido, - subtitle: l10n.l_factory_reset_this_app, - onTap: (context) { - Navigator.of(context).popUntil((route) => route.isFirst); - showBlurDialog( - context: context, - builder: (context) => ResetDialog(node), - ); - }, - ), ], ) ], diff --git a/lib/fido/views/reset_dialog.dart b/lib/fido/views/reset_dialog.dart deleted file mode 100755 index 704487ff..00000000 --- a/lib/fido/views/reset_dialog.dart +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (C) 2022 Yubico. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:logging/logging.dart'; - -import '../../app/logging.dart'; -import '../../app/message.dart'; -import '../../app/models.dart'; -import '../../core/models.dart'; -import '../../desktop/models.dart'; -import '../../fido/models.dart'; -import '../../widgets/responsive_dialog.dart'; -import '../state.dart'; - -final _log = Logger('fido.views.reset_dialog'); - -class ResetDialog extends ConsumerStatefulWidget { - final DeviceNode node; - const ResetDialog(this.node, {super.key}); - - @override - ConsumerState createState() => _ResetDialogState(); -} - -class _ResetDialogState extends ConsumerState { - StreamSubscription? _subscription; - InteractionEvent? _interaction; - int _currentStep = -1; - final _totalSteps = 3; - - String _getMessage() { - final l10n = AppLocalizations.of(context)!; - final nfc = widget.node.transport == Transport.nfc; - if (_currentStep == 3) { - return l10n.l_fido_app_reset; - } - return switch (_interaction) { - InteractionEvent.remove => - nfc ? l10n.l_remove_yk_from_reader : l10n.l_unplug_yk, - InteractionEvent.insert => - nfc ? l10n.l_replace_yk_on_reader : l10n.l_reinsert_yk, - InteractionEvent.touch => l10n.l_touch_button_now, - null => '' - }; - } - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - double progress = _currentStep == -1 ? 0.0 : _currentStep / (_totalSteps); - return ResponsiveDialog( - title: Text(l10n.s_factory_reset), - onCancel: _currentStep < 3 - ? () { - _subscription?.cancel(); - } - : null, - actions: _currentStep < 3 - ? [ - TextButton( - onPressed: _subscription == null - ? () async { - _subscription = ref - .read(fidoStateProvider(widget.node.path).notifier) - .reset() - .listen((event) { - setState(() { - _currentStep++; - _interaction = event; - }); - }, onDone: () { - setState(() { - _currentStep++; - }); - _subscription = null; - }, onError: (e) { - _log.error('Error performing FIDO reset', e); - Navigator.of(context).pop(); - final String errorMessage; - // TODO: Make this cleaner than importing desktop specific RpcError. - if (e is RpcError) { - if (e.status == 'connection-error') { - errorMessage = l10n.l_failed_connecting_to_fido; - } else if (e.status == 'key-mismatch') { - errorMessage = l10n.l_wrong_inserted_yk_error; - } else if (e.status == 'user-action-timeout') { - errorMessage = l10n.l_user_action_timeout_error; - } else { - errorMessage = e.message; - } - } else { - errorMessage = e.toString(); - } - showMessage( - context, - l10n.l_reset_failed(errorMessage), - duration: const Duration(seconds: 4), - ); - }); - } - : null, - child: Text(l10n.s_reset), - ), - ] - : [], - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 18.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - l10n.p_warning_deletes_accounts, - style: Theme.of(context) - .textTheme - .bodyMedium - ?.copyWith(fontWeight: FontWeight.w700), - ), - Text( - l10n.p_warning_disable_accounts, - ), - if (_currentStep > -1) ...[ - Text('${l10n.s_status}: ${_getMessage()}'), - LinearProgressIndicator(value: progress) - ], - ] - .map((e) => Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: e, - )) - .toList(), - ), - ), - ); - } -} diff --git a/lib/oath/keys.dart b/lib/oath/keys.dart index 73aab8aa..546de5b6 100755 --- a/lib/oath/keys.dart +++ b/lib/oath/keys.dart @@ -28,7 +28,6 @@ const setOrManagePasswordAction = Key('$_keyAction.action.set_or_manage_password'); const addAccountAction = Key('$_keyAction.add_account'); const migrateAccountAction = Key('$_keyAction.migrate_account'); -const resetAction = Key('$_keyAction.reset'); const resetButton = Key('$_keyAction.reset_button'); const customIconsAction = Key('$_keyAction.custom_icons'); const addAccountManuallyButton = Key('$_keyAction.add_account_manually'); diff --git a/lib/oath/views/key_actions.dart b/lib/oath/views/key_actions.dart index 7ad008fe..d1f3ccb6 100755 --- a/lib/oath/views/key_actions.dart +++ b/lib/oath/views/key_actions.dart @@ -30,7 +30,6 @@ import '../keys.dart' as keys; import '../models.dart'; import 'add_account_dialog.dart'; import 'manage_password_dialog.dart'; -import 'reset_dialog.dart'; Widget oathBuildActions( BuildContext context, @@ -112,20 +111,6 @@ Widget oathBuildActions( ManagePasswordDialog(devicePath, oathState), ); }), - ActionListItem( - key: keys.resetAction, - feature: features.actionsReset, - icon: const Icon(Icons.delete_outline), - actionStyle: ActionStyle.error, - title: l10n.s_reset_oath, - subtitle: l10n.l_factory_reset_this_app, - onTap: (context) { - Navigator.of(context).popUntil((route) => route.isFirst); - showBlurDialog( - context: context, - builder: (context) => ResetDialog(devicePath), - ); - }), ]), ], ); diff --git a/lib/oath/views/reset_dialog.dart b/lib/oath/views/reset_dialog.dart deleted file mode 100755 index 54e18fc9..00000000 --- a/lib/oath/views/reset_dialog.dart +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2022 Yubico. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; - -import '../../app/message.dart'; -import '../../app/models.dart'; -import '../../app/state.dart'; -import '../../widgets/responsive_dialog.dart'; -import '../state.dart'; - -class ResetDialog extends ConsumerWidget { - final DevicePath devicePath; - const ResetDialog(this.devicePath, {super.key}); - @override - Widget build(BuildContext context, WidgetRef ref) { - final l10n = AppLocalizations.of(context)!; - return ResponsiveDialog( - title: Text(l10n.s_factory_reset), - actions: [ - TextButton( - onPressed: () async { - await ref.read(oathStateProvider(devicePath).notifier).reset(); - await ref.read(withContextProvider)((context) async { - Navigator.of(context).pop(); - showMessage(context, l10n.l_oath_application_reset); - }); - }, - child: Text(l10n.s_reset), - ), - ], - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 18.0), - child: Column( - children: [ - Text(l10n.p_warning_factory_reset, - style: Theme.of(context) - .textTheme - .bodyMedium - ?.copyWith(fontWeight: FontWeight.w700)), - Text(l10n.p_warning_disable_credentials), - ] - .map((e) => Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: e, - )) - .toList(), - ), - ), - ); - } -} diff --git a/lib/piv/keys.dart b/lib/piv/keys.dart index 4d590d8a..3ec496fc 100644 --- a/lib/piv/keys.dart +++ b/lib/piv/keys.dart @@ -25,7 +25,6 @@ const managePinAction = Key('$_keyAction.manage_pin'); const managePukAction = Key('$_keyAction.manage_puk'); const manageManagementKeyAction = Key('$_keyAction.manage_management_key'); const pinLockManagementKeyChip = Key('$_keyAction.pinlock_managementkey'); -const resetAction = Key('$_keyAction.reset'); const setupMacOsAction = Key('$_keyAction.setup_macos'); // Slot actions diff --git a/lib/piv/views/key_actions.dart b/lib/piv/views/key_actions.dart index 496aebe6..cdf57d1e 100644 --- a/lib/piv/views/key_actions.dart +++ b/lib/piv/views/key_actions.dart @@ -26,7 +26,6 @@ import '../keys.dart' as keys; import '../models.dart'; import 'manage_key_dialog.dart'; import 'manage_pin_puk_dialog.dart'; -import 'reset_dialog.dart'; Widget pivBuildActions(BuildContext context, DevicePath devicePath, PivState pivState, WidgetRef ref) { @@ -110,20 +109,6 @@ Widget pivBuildActions(BuildContext context, DevicePath devicePath, builder: (context) => ManageKeyDialog(devicePath, pivState), ); }), - ActionListItem( - key: keys.resetAction, - feature: features.actionsReset, - icon: const Icon(Icons.delete_outline), - actionStyle: ActionStyle.error, - title: l10n.s_reset_piv, - subtitle: l10n.l_factory_reset_this_app, - onTap: (context) { - Navigator.of(context).popUntil((route) => route.isFirst); - showBlurDialog( - context: context, - builder: (context) => ResetDialog(devicePath), - ); - }) ], ), // TODO diff --git a/lib/piv/views/reset_dialog.dart b/lib/piv/views/reset_dialog.dart deleted file mode 100644 index ab8dcfc5..00000000 --- a/lib/piv/views/reset_dialog.dart +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2023 Yubico. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; - -import '../../app/message.dart'; -import '../../app/models.dart'; -import '../../app/state.dart'; -import '../../widgets/responsive_dialog.dart'; -import '../keys.dart'; -import '../state.dart'; - -class ResetDialog extends ConsumerWidget { - final DevicePath devicePath; - const ResetDialog(this.devicePath, {super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final l10n = AppLocalizations.of(context)!; - return ResponsiveDialog( - title: Text(l10n.s_factory_reset), - actions: [ - TextButton( - key: resetButton, - onPressed: () async { - await ref.read(pivStateProvider(devicePath).notifier).reset(); - await ref.read(withContextProvider)((context) async { - Navigator.of(context).pop(); - showMessage(context, l10n.l_piv_app_reset); - }); - }, - child: Text(l10n.s_reset), - ), - ], - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 18.0), - child: Column( - children: [ - Text(l10n.p_warning_piv_reset, - style: Theme.of(context) - .textTheme - .bodyMedium - ?.copyWith(fontWeight: FontWeight.w700)), - Text(l10n.p_warning_piv_reset_desc), - ] - .map((e) => Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: e, - )) - .toList(), - ), - ), - ); - } -}