aboutsummaryrefslogtreecommitdiff
path: root/components/PasswordDialog.qml
diff options
context:
space:
mode:
authorselsta <selsta@sent.at>2019-07-01 11:44:33 +0200
committerselsta <selsta@sent.at>2019-07-15 00:05:10 +0200
commit35a0f25b5702a13696aec4bc679d0c25b576ca17 (patch)
treee96eb040cbba6b8177e86a6d92d458116b6eaf30 /components/PasswordDialog.qml
parentc7956f76ead2c82a320c830a63ffa97d55a10bb6 (diff)
downloadmonzero-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.qml254
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()
+ }
}
}
}
-
}
}
}