Warning, /utilities/keysmith/src/contents/ui/TOTPDetailsForm.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 Johan Ouwerkerk <jm.ouwerkerk@gmail.com> 0004 */ 0005 0006 import QtQuick 2.15 0007 import QtQuick.Layouts 1.15 0008 import QtQuick.Controls 2.15 as QQC2 0009 import org.kde.kirigami 2.20 as Kirigami 0010 import org.kde.kirigamiaddons.formcard 1.0 as FormCard 0011 0012 import Keysmith.Models 1.0 as Models 0013 import Keysmith.Validators 1.0 as Validators 0014 0015 FormCard.FormCard { 0016 id: root 0017 property Models.ValidatedAccountInput validatedInput 0018 0019 property bool timeStepAcceptable: timeStepField.acceptableInput 0020 property bool algorithmAcceptable: sha1Radio.checked || sha256Radio.checked || sha512Radio.checked 0021 property bool epochAcceptable: epochField.acceptableInput 0022 property bool acceptable: timeStepAcceptable && algorithmAcceptable && epochAcceptable 0023 0024 FormCard.FormTextFieldDelegate { 0025 id: timeStepField 0026 0027 label: i18nc("@label:textbox", "Timer:") 0028 text: validatedInput ? "" + validatedInput.timeStep : "" 0029 validator: IntValidator { 0030 bottom: 1 0031 } 0032 inputMethodHints: Qt.ImhDigitsOnly 0033 onTextChanged: { 0034 if (acceptableInput) { 0035 validatedInput.timeStep = parseInt(text); 0036 } 0037 } 0038 } 0039 0040 FormCard.FormDelegateSeparator {} 0041 0042 FormCard.FormTextFieldDelegate { 0043 id: epochField 0044 0045 label: i18nc("@label:textbox", "Starting at:") 0046 text: validatedInput ? validatedInput.epoch : "" 0047 validator: Validators.TOTPEpochValidator {} 0048 onTextChanged: { 0049 if (acceptableInput) { 0050 validatedInput.epoch = text; 0051 } 0052 } 0053 } 0054 0055 FormCard.FormDelegateSeparator {} 0056 0057 /* 0058 * OATH tokens are derived from a 32bit value, base-10 encoded. 0059 * Meaning tokens should not be longer than 10 digits max. 0060 * In addition tokens must be 6 digits long at minimum. 0061 * 0062 * Make a virtue of it by offering a spinner for better UX 0063 */ 0064 FormCard.FormSpinBoxDelegate { 0065 id: tokenLengthField 0066 0067 label: i18nc("@label:spinbox", "Token length:") 0068 from: 6 0069 to: 10 0070 value: validatedInput ? validatedInput.tokenLength : 6 0071 onValueChanged: { 0072 validatedInput.tokenLength = value; 0073 } 0074 } 0075 0076 FormCard.FormDelegateSeparator {} 0077 0078 FormCard.FormTextDelegate { 0079 text: i18nc("@label:chooser", "Hash algorithm:") 0080 } 0081 0082 FormCard.FormRadioDelegate { 0083 id: sha1Radio 0084 0085 checked: validatedInput.algorithm === Models.ValidatedAccountInput.Sha1 0086 text: i18nc("@option:radio", "SHA-1") 0087 onCheckedChanged: { 0088 if (checked) { 0089 validatedInput.algorithm = Models.ValidatedAccountInput.Sha1; 0090 } 0091 } 0092 } 0093 0094 FormCard.FormRadioDelegate { 0095 id: sha256Radio 0096 0097 checked: validatedInput.algorithm === Models.ValidatedAccountInput.Sha256 0098 text: i18nc("@option:radio", "SHA-256") 0099 onCheckedChanged: { 0100 if (checked) { 0101 validatedInput.algorithm = Models.ValidatedAccountInput.Sha256; 0102 } 0103 } 0104 } 0105 0106 FormCard.FormRadioDelegate { 0107 id: sha512Radio 0108 0109 checked: validatedInput.algorithm === Models.ValidatedAccountInput.Sha512 0110 text: i18nc("@option:radio", "SHA-512") 0111 onCheckedChanged: { 0112 if (checked) { 0113 validatedInput.algorithm = Models.ValidatedAccountInput.Sha512; 0114 } 0115 } 0116 } 0117 }