Warning, /utilities/keysmith/src/contents/ui/AddAccount.qml is written in an unsupported language. File is not indexed.

0001 /*
0002  * SPDX-License-Identifier: GPL-3.0-or-later
0003  * SPDX-FileCopyrightText: 2020-2021 Johan Ouwerkerk <jm.ouwerkerk@gmail.com>
0004  * SPDX-FileCopyrightText: 2020 Carl Schwan <carl@carlschwan.eu>
0005  */
0006 
0007 import QtQuick
0008 import QtQuick.Layouts
0009 import QtQuick.Controls as QQC2
0010 import org.kde.kirigami as Kirigami
0011 import org.kde.kirigamiaddons.formcard 1 as FormCard
0012 
0013 import Keysmith.Application as Application
0014 import Keysmith.Models as Models
0015 import Keysmith.Validators as Validators
0016 
0017 FormCard.FormCardPage {
0018     id: root
0019 
0020     required property Application.AddAccountViewModel vm
0021 
0022     title: i18nc("@title:window", "Add new account")
0023 
0024     property bool detailsEnabled: false
0025 
0026     property bool secretAcceptable: accountSecret.acceptableInput
0027     property bool tokenTypeAcceptable: hotpRadio.checked || totpRadio.checked
0028     property bool hotpDetailsAcceptable: hotpDetails.acceptable || vm.input.type === Models.ValidatedAccountInput.Totp
0029     property bool totpDetailsAcceptable: totpDetails.acceptable || vm.input.type === Models.ValidatedAccountInput.Hotp
0030     property bool tokenDetailsAcceptable: hotpDetailsAcceptable && totpDetailsAcceptable
0031     property bool acceptable: accountName.acceptable && secretAcceptable && tokenTypeAcceptable && tokenDetailsAcceptable
0032 
0033     topPadding: Kirigami.Units.gridUnit
0034     bottomPadding: Kirigami.Units.gridUnit
0035 
0036     data: Connections {
0037         target: vm.input
0038         function onTypeChanged() {
0039             root.detailsEnabled = false;
0040         }
0041     }
0042 
0043     actions: [
0044         Kirigami.Action {
0045             text: i18nc("@action:button cancel and dismiss the add account form", "Cancel")
0046             icon.name: "edit-undo"
0047             onTriggered: {
0048                 vm.cancelled();
0049             }
0050         },
0051         Kirigami.Action {
0052             text: i18nc("@action:button Dismiss the error page and quit Keysmith", "Quit")
0053             icon.name: "application-exit"
0054             enabled: vm.quitEnabled
0055             visible: vm.quitEnabled
0056             onTriggered: {
0057                 Qt.quit();
0058             }
0059         },
0060         Kirigami.Action {
0061             text: i18nc("@action:button", "Add")
0062             icon.name: "answer-correct"
0063             enabled: acceptable
0064             onTriggered: {
0065                 vm.accepted();
0066             }
0067         }
0068     ]
0069 
0070     Component.onCompleted: accountName.forceActiveFocus()
0071 
0072     AccountNameForm {
0073         id: accountName
0074         Layout.fillWidth: true
0075         accounts: vm.accounts
0076         validateAccountAvailability: vm.validateAvailability
0077         validatedInput: vm.input
0078     }
0079 
0080     FormCard.FormHeader {
0081         title: i18nc("@label:chooser", "Account type:")
0082     }
0083 
0084     FormCard.FormCard {
0085         id: requiredDetails
0086 
0087         FormCard.FormRadioDelegate {
0088             id: totpRadio
0089             checked: vm.input.type === Models.ValidatedAccountInput.Totp
0090             text: i18nc("@option:radio", "Time-based OTP")
0091             onCheckedChanged: {
0092                 if (checked) {
0093                     vm.input.type = Models.ValidatedAccountInput.Totp;
0094                 }
0095             }
0096         }
0097 
0098         FormCard.FormRadioDelegate {
0099             id: hotpRadio
0100             checked: vm.input.type === Models.ValidatedAccountInput.Hotp
0101             text: i18nc("@option:radio", "Hash-based OTP")
0102             onCheckedChanged: {
0103                 if (checked) {
0104                     vm.input.type = Models.ValidatedAccountInput.Hotp;
0105                 }
0106             }
0107         }
0108 
0109         FormCard.FormDelegateSeparator { below: hotpRadio }
0110 
0111         FormCard.FormTextFieldDelegate {
0112             id: accountSecret
0113             placeholderText: i18n("Token secret")
0114             text: vm.input.secret
0115             echoMode: TextInput.Password
0116             label: i18nc("@label:textbox", "Secret key:")
0117             validator: Validators.Base32SecretValidator {
0118                 id: secretValidator
0119             }
0120             inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText | Qt.ImhSensitiveData | Qt.ImhHiddenText
0121             onTextChanged: {
0122                 if (acceptableInput) {
0123                     vm.input.secret = text;
0124                 }
0125             }
0126         }
0127 
0128         FormCard.FormDelegateSeparator { above: toggleDetails }
0129 
0130         FormCard.FormButtonDelegate {
0131             id: toggleDetails
0132             text: i18nc("Button to reveal form for configuring additional token details", "Details")
0133             enabled: !root.detailsEnabled && (hotpRadio.checked || totpRadio.checked)
0134             visible: enabled
0135             onClicked: root.detailsEnabled = true;
0136         }
0137     }
0138 
0139     FormCard.FormHeader {
0140         title: i18nc("@title:group", "HOTP Details:")
0141         visible: hotpDetails.visible
0142     }
0143 
0144     HOTPDetailsForm {
0145         id: hotpDetails
0146 
0147         visible: enabled
0148         validatedInput: root.vm.input
0149         enabled: root.detailsEnabled && vm.input.type === Models.ValidatedAccountInput.Hotp
0150     }
0151 
0152     FormCard.FormHeader {
0153         title: i18nc("@label", "TOTP Details:")
0154         visible: totpDetails.visible
0155     }
0156 
0157     TOTPDetailsForm {
0158         id: totpDetails
0159 
0160         visible: enabled
0161         validatedInput: root.vm.input
0162         enabled: root.detailsEnabled && vm.input.type === Models.ValidatedAccountInput.Totp
0163     }
0164 }