Warning, /utilities/keysmith/src/contents/ui/AccountEntryViewBase.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
0007 import QtQuick.Layouts
0008 import QtQuick.Controls as Controls
0009 import org.kde.kirigami as Kirigami
0010 import org.kde.kirigamiaddons.formcard as FormCard
0011
0012 import Keysmith.Application 1.0
0013 import Keysmith.Models 1.0 as Models
0014
0015 Kirigami.SwipeListItem {
0016 /*
0017 * WARNING: AccountEntryViewBase is a derivative of SwipeListItem and SwipeListem instances *must* be
0018 * called `listItem`. This took *way* too long to figure out. If you change it, things will break for example the
0019 * flood fill effect when pressing a list entry on Android.
0020 */
0021 id: listItem
0022
0023 signal actionTriggered
0024 property Models.Account account: null
0025 property bool alive: account !== null
0026 property bool tokenAvailable: alive && account.token && account.token.length > 0
0027 property bool highlightActive: listItem.pressed || listItem.checked
0028 property color labelColor: highlightActive ? listItem.activeTextColor : listItem.textColor
0029
0030 visible: alive
0031 enabled: alive
0032
0033 readonly property Component details: FormCard.FormCardPage {
0034 title: i18nc("Details dialog title: %1 is the name of the account", "Details of account: %1", account.name)
0035
0036 topPadding: Kirigami.Units.gridUnit
0037 bottomPadding: Kirigami.Units.gridUnit
0038
0039 FormCard.FormCard {
0040 FormCard.FormTextDelegate {
0041 text: i18n("Name:")
0042 description: account.name
0043 }
0044
0045 FormCard.FormDelegateSeparator {}
0046
0047 FormCard.FormTextDelegate {
0048 text: i18n("Issuer:")
0049 description: account.issuer
0050 }
0051
0052 FormCard.FormDelegateSeparator {}
0053
0054 FormCard.FormTextDelegate {
0055 text: i18n("Mode:")
0056 description: account.isHotp ? i18nc("Mode of 2fa", "HOTP") : i18nc("Mode of 2fa", "TOTP")
0057 }
0058
0059 FormCard.FormDelegateSeparator {}
0060
0061 FormCard.FormTextDelegate {
0062 text: i18n("Epoch:")
0063 description: account.epoch
0064 }
0065
0066 FormCard.FormDelegateSeparator {}
0067
0068 FormCard.FormTextDelegate {
0069 text: i18n("Time Step:")
0070 description: account.timeStep
0071 }
0072
0073 FormCard.FormDelegateSeparator {}
0074
0075 FormCard.FormTextDelegate {
0076 text: i18n("Offset:")
0077 description: account.offset
0078 }
0079
0080 FormCard.FormDelegateSeparator {}
0081
0082 FormCard.FormTextDelegate {
0083 text: i18n("Token Length:")
0084 description: account.tokenLength
0085 }
0086
0087 FormCard.FormDelegateSeparator {}
0088
0089 FormCard.FormTextDelegate {
0090 text: i18n("Hash:")
0091 description: account.hash
0092 }
0093 }
0094 }
0095
0096 readonly property Kirigami.OverlaySheet sheet: Kirigami.OverlaySheet {
0097 visible: false
0098 header: Kirigami.Heading {
0099 text: i18nc("Confirm dialog title: %1 is the name of the account to remove", "Removing account: %1", account.name)
0100 }
0101 ColumnLayout {
0102 spacing: Kirigami.Units.largeSpacing * 5
0103 Controls.Label {
0104 Layout.fillWidth: true
0105 wrapMode: Text.WordWrap
0106 text: i18n("<p><ul><li>Account name: %1</li><li>Account issuer: %2</li></ul></p><p>Removing this account from Keysmith will not disable two-factor authentication (2FA). Make sure you can still access your account without using Keysmith before proceeding:</p><ul><li>Make sure you have another 2FA app set up for your account, or:</li><li>Make sure you have recovery codes for your account, or:</li><li>Disable two-factor authentication on your account</li></ul>", account.name, account.issuer)
0107 }
0108 }
0109 footer: RowLayout {
0110 Controls.Button {
0111 icon.name: "edit-undo"
0112 text: i18nc("Button cancelling account removal", "Cancel")
0113 onClicked: sheet.close();
0114 }
0115 Rectangle {
0116 color: "transparent"
0117 Layout.fillWidth: true
0118 }
0119 Controls.Button {
0120 icon.name: "edit-delete"
0121 text: i18nc("Button confirming account removal", "Delete Account")
0122 enabled: alive
0123 onClicked: {
0124 alive = false;
0125 account.remove();
0126 sheet.close();
0127 }
0128 }
0129 }
0130 }
0131
0132 onClicked: {
0133 // TODO convert to C++ helper, have proper logging?
0134 actionTriggered();
0135 if (tokenAvailable) {
0136 Keysmith.copyToClipboard(account.token);
0137 applicationWindow().showPassiveNotification(i18nc("Notification shown in a passive notification", "Token copied to clipboard!"))
0138 }
0139 // TODO warn if not
0140 }
0141 }