diff options
| author | selsta <selsta@sent.at> | 2019-07-01 11:44:33 +0200 |
|---|---|---|
| committer | selsta <selsta@sent.at> | 2019-07-15 00:05:10 +0200 |
| commit | 35a0f25b5702a13696aec4bc679d0c25b576ca17 (patch) | |
| tree | e96eb040cbba6b8177e86a6d92d458116b6eaf30 /components/PasswordDialog.qml | |
| parent | c7956f76ead2c82a320c830a63ffa97d55a10bb6 (diff) | |
| download | monzero-gui-35a0f25b5702a13696aec4bc679d0c25b576ca17.tar.gz monzero-gui-35a0f25b5702a13696aec4bc679d0c25b576ca17.tar.xz monzero-gui-35a0f25b5702a13696aec4bc679d0c25b576ca17.zip | |
PasswordDialog: merge components and bug fixes
This commit merges PasswordDialog, PassphraseDialog and
NewPasswordDialog. Also the following bugs were fixed:
- Wizard pages still being active when opening a wallet
from wizard.
- Capslock detection was buggy when copy pasting password, I
replaced it with native implementations for each platform.
- isAlpha could throw errors when using special characters.
Diffstat (limited to 'components/PasswordDialog.qml')
| -rw-r--r-- | components/PasswordDialog.qml | 254 |
1 files changed, 212 insertions, 42 deletions
diff --git a/components/PasswordDialog.qml b/components/PasswordDialog.qml index 4d1c8467..67ffce96 100644 --- a/components/PasswordDialog.qml +++ b/components/PasswordDialog.qml @@ -44,34 +44,63 @@ Item { z: parent.z + 2 property bool isHidden: true - property alias password: passwordInput.text + property alias password: passwordInput1.text property string walletName property string errorText - property bool shiftIsPressed: false - property bool isCapsLocksActive: false - property bool backspaceIsPressed: false + property bool passwordDialogMode + property bool passphraseDialogMode + property bool newPasswordDialogMode // same signals as Dialog has signal accepted() + signal acceptedNewPassword() + signal acceptedPassphrase() signal rejected() + signal rejectedNewPassword() + signal rejectedPassphrase() signal closeCallback() - function open(walletName, errorText) { + function _openInit(walletName, errorText) { isHidden = true - passwordInput.echoMode = TextInput.Password - passwordInput.text = "" - passwordInput.forceActiveFocus(); + capsLockTextLabel.visible = oshelper.isCapsLock(); + passwordInput1.echoMode = TextInput.Password + passwordInput2.echoMode = TextInput.Password + passwordInput1.text = "" + passwordInput2.text = "" + passwordInput1.forceActiveFocus(); inactiveOverlay.visible = true // draw appwindow inactive root.walletName = walletName ? walletName : "" errorTextLabel.text = errorText ? errorText : ""; leftPanel.enabled = false middlePanel.enabled = false + wizard.enabled = false titleBar.state = "essentials" root.visible = true; appWindow.hideBalanceForced = true; appWindow.updateBalance(); } + function open(walletName, errorText) { + passwordDialogMode = true; + passphraseDialogMode = false; + newPasswordDialogMode = false; + _openInit(walletName, errorText); + } + + function openPassphraseDialog() { + passwordDialogMode = false; + passphraseDialogMode = true; + newPasswordDialogMode = false; + _openInit("", ""); + } + + function openNewPasswordDialog() { + passwordDialogMode = false; + passphraseDialogMode = false; + newPasswordDialogMode = true; + _openInit("", ""); + } + function showError(errorText) { open(root.walletName, errorText); } @@ -80,6 +109,7 @@ Item { inactiveOverlay.visible = false leftPanel.enabled = true middlePanel.enabled = true + wizard.enabled = true titleBar.state = "default" root.visible = false; @@ -88,6 +118,12 @@ Item { closeCallback(); } + function toggleIsHidden() { + passwordInput1.echoMode = isHidden ? TextInput.Normal : TextInput.Password; + passwordInput2.echoMode = isHidden ? TextInput.Normal : TextInput.Password; + isHidden = !isHidden; + } + ColumnLayout { z: inactiveOverlay.z + 1 id: mainLayout @@ -102,7 +138,11 @@ Item { Layout.maximumWidth: 400 Label { - text: (root.walletName.length > 0 ? qsTr("Please enter wallet password for: ") + root.walletName : qsTr("Please enter wallet password")) + translationManager.emptyString + text: { + var device = passwordDialogMode ? qsTr("wallet password") : qsTr("wallet device passphrase"); + (root.walletName.length > 0 ? qsTr("Please enter %1 for: ").arg(device) + root.walletName : qsTr("Please enter %1").arg(device)) + translationManager.emptyString; + } + visible: !newPasswordDialogMode Layout.fillWidth: true font.pixelSize: 16 @@ -112,18 +152,40 @@ Item { } Label { + text: qsTr("Warning: passphrase entry on host is a security risk as it can be captured by malware. It is advised to prefer device-based passphrase entry.") + translationManager.emptyString + visible: passphraseDialogMode + Layout.fillWidth: true + wrapMode: Text.Wrap + + font.pixelSize: 14 + font.family: MoneroComponents.Style.fontLight.name + + color: MoneroComponents.Style.warningColor + } + + Label { id: errorTextLabel visible: root.errorText || text !== "" + color: MoneroComponents.Style.errorColor + font.pixelSize: 16 + font.family: MoneroComponents.Style.fontLight.name + Layout.fillWidth: true + wrapMode: Text.Wrap + } + Label { + id: capsLockTextLabel + visible: false color: MoneroComponents.Style.errorColor font.pixelSize: 16 - font.family: MoneroComponents.Style.fontLight.name + font.family: MoneroComponents.Style.fontLight.name Layout.fillWidth: true wrapMode: Text.Wrap + text: qsTr("CAPSLOCKS IS ON.") + translationManager.emptyString; } TextField { - id : passwordInput + id: passwordInput1 Layout.topMargin: 6 Layout.fillWidth: true horizontalAlignment: TextInput.AlignLeft @@ -131,24 +193,20 @@ Item { font.family: MoneroComponents.Style.fontLight.name font.pixelSize: 24 echoMode: TextInput.Password - KeyNavigation.tab: okButton + KeyNavigation.tab: { + if (passwordDialogMode) { + return okButton + } else { + return passwordInput2 + } + } bottomPadding: 10 leftPadding: 10 topPadding: 10 color: MoneroComponents.Style.defaultFontColor selectionColor: MoneroComponents.Style.textSelectionColor selectedTextColor: MoneroComponents.Style.textSelectedColor - - onTextChanged: { - var letter = text[passwordInput.text.length - 1]; - isCapsLocksActive = Utils.isUpperLock(shiftIsPressed, letter); - if(isCapsLocksActive && !backspaceIsPressed){ - errorTextLabel.text = qsTr("CAPSLOCKS IS ON.") + translationManager.emptyString; - } - else{ - errorTextLabel.text = ""; - } - } + onTextChanged: capsLockTextLabel.visible = oshelper.isCapsLock(); background: Rectangle { radius: 2 @@ -177,8 +235,7 @@ Item { cursorShape: Qt.PointingHandCursor hoverEnabled: true onClicked: { - passwordInput.echoMode = isHidden ? TextInput.Normal : TextInput.Password; - isHidden = !isHidden; + toggleIsHidden(); } onEntered: { parent.opacity = 0.9 @@ -195,30 +252,131 @@ Item { Keys.enabled: root.visible Keys.onReturnPressed: { root.close() - root.accepted() + if (passwordDialogMode) { + root.accepted() + } else if (newPasswordDialogMode) { + root.acceptedNewPassword() + } else if (passphraseDialogMode) { + root.acceptedPassphrase() + } } Keys.onEscapePressed: { root.close() - root.rejected() - } - Keys.onPressed: { - if(event.key === Qt.Key_Shift){ - shiftIsPressed = true; + if (passwordDialogMode) { + root.rejected() + } else if (newPasswordDialogMode) { + root.rejectedNewPassword() + } else if (passphraseDialogMode) { + root.rejectedPassphrase() } - if(event.key === Qt.Key_Backspace){ - backspaceIsPressed = true; + } + } + + // padding + Rectangle { + visible: !passwordDialogMode + Layout.fillWidth: true + Layout.alignment: Qt.AlignHCenter + height: 10 + opacity: 0 + color: "black" + } + + Label { + visible: !passwordDialogMode + text: qsTr("Please confirm new password") + translationManager.emptyString + Layout.fillWidth: true + + font.pixelSize: 16 + font.family: MoneroComponents.Style.fontLight.name + + color: MoneroComponents.Style.defaultFontColor + } + + TextField { + id: passwordInput2 + visible: !passwordDialogMode + Layout.topMargin: 6 + Layout.fillWidth: true + horizontalAlignment: TextInput.AlignLeft + verticalAlignment: TextInput.AlignVCenter + font.family: MoneroComponents.Style.fontLight.name + font.pixelSize: 24 + echoMode: TextInput.Password + KeyNavigation.tab: okButton + bottomPadding: 10 + leftPadding: 10 + topPadding: 10 + color: MoneroComponents.Style.defaultFontColor + selectionColor: MoneroComponents.Style.textSelectionColor + selectedTextColor: MoneroComponents.Style.textSelectedColor + onTextChanged: capsLockTextLabel.visible = oshelper.isCapsLock(); + + background: Rectangle { + radius: 2 + border.color: MoneroComponents.Style.inputBorderColorInActive + border.width: 1 + color: MoneroComponents.Style.blackTheme ? "black" : "#A9FFFFFF" + + MoneroComponents.Label { + fontSize: 20 + text: isHidden ? FontAwesome.eye : FontAwesome.eyeSlash + opacity: 0.7 + fontFamily: FontAwesome.fontFamily + anchors.right: parent.right + anchors.rightMargin: 15 + anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: 1 + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + hoverEnabled: true + onClicked: { + toggleIsHidden() + } + onEntered: { + parent.opacity = 0.9 + parent.fontSize = 24 + } + onExited: { + parent.opacity = 0.7 + parent.fontSize = 20 + } + } } } - Keys.onReleased: { - if(event.key === Qt.Key_Shift){ - shiftIsPressed = false; + + Keys.onReturnPressed: { + if (passwordInput1.text === passwordInput2.text) { + root.close() + if (newPasswordDialogMode) { + root.acceptedNewPassword() + } else if (passphraseDialogMode) { + root.acceptedPassphrase() + } } - if(event.key === Qt.Key_Backspace){ - backspaceIsPressed =false; + } + Keys.onEscapePressed: { + root.close() + if (newPasswordDialogMode) { + root.rejectedNewPassword() + } else if (passphraseDialogMode) { + root.rejectedPassphrase() } } } + // padding + Rectangle { + visible: !passwordDialogMode + Layout.fillWidth: true + Layout.alignment: Qt.AlignHCenter + height: 10 + opacity: 0 + color: "black" + } + // Ok/Cancel buttons RowLayout { id: buttons @@ -230,10 +388,16 @@ Item { id: cancelButton small: true text: root.walletName.length > 0 ? qsTr("Change wallet") + translationManager.emptyString : qsTr("Cancel") + translationManager.emptyString - KeyNavigation.tab: passwordInput + KeyNavigation.tab: passwordInput1 onClicked: { root.close() - root.rejected() + if (passwordDialogMode) { + root.rejected() + } else if (newPasswordDialogMode) { + root.rejectedNewPassword() + } else if (passphraseDialogMode) { + root.rejectedPassphrase() + } } } @@ -242,13 +406,19 @@ Item { small: true text: qsTr("Continue") + translationManager.emptyString KeyNavigation.tab: cancelButton + enabled: (passwordDialogMode == true) ? true : passwordInput1.text === passwordInput2.text onClicked: { root.close() - root.accepted() + if (passwordDialogMode) { + root.accepted() + } else if (newPasswordDialogMode) { + root.acceptedNewPassword() + } else if (passphraseDialogMode) { + root.acceptedPassphrase() + } } } } - } } } |
