From cb0392b78d8e84cf9bfeb39b444936adb692deb6 Mon Sep 17 00:00:00 2001
From: Michael Telatynski <7t3chguy@gmail.com>
Date: Wed, 29 Jan 2020 13:24:45 +0000
Subject: [PATCH] use forms to wrap password fields so Chrome doesn't go wild
and prefill all the things
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---
.../CreateSecretStorageDialog.js | 75 +++++++++----------
src/components/structures/SearchBox.js | 1 +
.../AccessSecretStorageDialog.js | 45 +++++------
3 files changed, 57 insertions(+), 64 deletions(-)
diff --git a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js
index 4068f72217..35cd5aa819 100644
--- a/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js
+++ b/src/async-components/views/dialogs/secretstorage/CreateSecretStorageDialog.js
@@ -295,31 +295,27 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
});
}
- _onPassPhraseNextClick = () => {
- this.setState({phase: PHASE_PASSPHRASE_CONFIRM});
- }
-
- _onPassPhraseKeyPress = async (e) => {
- if (e.key === 'Enter') {
- // If we're waiting for the timeout before updating the result at this point,
- // skip ahead and do it now, otherwise we'll deny the attempt to proceed
- // even if the user entered a valid passphrase
- if (this._setZxcvbnResultTimeout !== null) {
- clearTimeout(this._setZxcvbnResultTimeout);
- this._setZxcvbnResultTimeout = null;
- await new Promise((resolve) => {
- this.setState({
- zxcvbnResult: scorePassword(this.state.passPhrase),
- }, resolve);
- });
- }
- if (this._passPhraseIsValid()) {
- this._onPassPhraseNextClick();
- }
+ _onPassPhraseNextClick = async () => {
+ // If we're waiting for the timeout before updating the result at this point,
+ // skip ahead and do it now, otherwise we'll deny the attempt to proceed
+ // even if the user entered a valid passphrase
+ if (this._setZxcvbnResultTimeout !== null) {
+ clearTimeout(this._setZxcvbnResultTimeout);
+ this._setZxcvbnResultTimeout = null;
+ await new Promise((resolve) => {
+ this.setState({
+ zxcvbnResult: scorePassword(this.state.passPhrase),
+ }, resolve);
+ });
}
- }
+ if (this._passPhraseIsValid()) {
+ this.setState({phase: PHASE_PASSPHRASE_CONFIRM});
+ }
+ };
_onPassPhraseConfirmNextClick = async () => {
+ if (this.state.passPhrase !== this.state.passPhraseConfirm) return;
+
const [keyInfo, encodedRecoveryKey] =
await MatrixClientPeg.get().createRecoveryKeyFromPassphrase(this.state.passPhrase);
this._keyInfo = keyInfo;
@@ -332,12 +328,6 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
});
}
- _onPassPhraseConfirmKeyPress = (e) => {
- if (e.key === 'Enter' && this.state.passPhrase === this.state.passPhraseConfirm) {
- this._onPassPhraseConfirmNextClick();
- }
- }
-
_onSetAgainClick = () => {
this.setState({
passPhrase: '',
@@ -407,7 +397,8 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
} else if (this.state.canUploadKeysWithPasswordOnly) {
authPrompt =
{_t("Enter your account password to confirm the upgrade:")}
-
;
}
- return
+ return
;
}
_renderPhaseShowKey() {
diff --git a/src/components/structures/SearchBox.js b/src/components/structures/SearchBox.js
index 873efb64c2..e169e09752 100644
--- a/src/components/structures/SearchBox.js
+++ b/src/components/structures/SearchBox.js
@@ -160,6 +160,7 @@ export default createReactClass({
onKeyDown={ this._onKeyDown }
onBlur={this._onBlur}
placeholder={ placeholder }
+ autoComplete="off"
/>
{ clearButton }
diff --git a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js
index c976eb81d0..ed65c9d2a6 100644
--- a/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js
+++ b/src/components/views/dialogs/secretstorage/AccessSecretStorageDialog.js
@@ -1,6 +1,6 @@
/*
Copyright 2018, 2019 New Vector Ltd
-Copyright 2019 The Matrix.org Foundation C.I.C.
+Copyright 2019, 2020 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -21,7 +21,6 @@ import * as sdk from '../../../../index';
import {MatrixClientPeg} from '../../../../MatrixClientPeg';
import { _t } from '../../../../languageHandler';
-import { Key } from "../../../../Keyboard";
/*
* Access Secure Secret Storage by requesting the user's passphrase.
@@ -69,6 +68,8 @@ export default class AccessSecretStorageDialog extends React.PureComponent {
}
_onPassPhraseNext = async () => {
+ if (this.state.passPhrase.length <= 0) return;
+
this.setState({ keyMatches: null });
const input = { passphrase: this.state.passPhrase };
const keyMatches = await this.props.checkPrivateKey(input);
@@ -80,6 +81,8 @@ export default class AccessSecretStorageDialog extends React.PureComponent {
}
_onRecoveryKeyNext = async () => {
+ if (!this.state.recoveryKeyValid) return;
+
this.setState({ keyMatches: null });
const input = { recoveryKey: this.state.recoveryKey };
const keyMatches = await this.props.checkPrivateKey(input);
@@ -97,18 +100,6 @@ export default class AccessSecretStorageDialog extends React.PureComponent {
});
}
- _onPassPhraseKeyPress = (e) => {
- if (e.key === Key.ENTER && this.state.passPhrase.length > 0) {
- this._onPassPhraseNext();
- }
- }
-
- _onRecoveryKeyKeyPress = (e) => {
- if (e.key === Key.ENTER && this.state.recoveryKeyValid) {
- this._onRecoveryKeyNext();
- }
- }
-
render() {
const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
@@ -135,7 +126,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent {
)}
;
} else {
- keyStatus =
;
+ keyStatus =
;
}
content =
@@ -149,23 +140,26 @@ export default class AccessSecretStorageDialog extends React.PureComponent {
"identity for verifying other devices by entering your passphrase.",
)}
-
-
+
{keyStatus}
-
-
+
{_t(
"If you've forgotten your passphrase you can "+
"
use your recovery key or " +
@@ -192,7 +186,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent {
let keyStatus;
if (this.state.recoveryKey.length === 0) {
- keyStatus =
;
+ keyStatus =
;
} else if (this.state.recoveryKeyValid) {
keyStatus =
{"\uD83D\uDC4D "}{_t("This looks like a valid recovery key!")}
@@ -221,22 +215,23 @@ export default class AccessSecretStorageDialog extends React.PureComponent {
"identity for verifying other devices by entering your recovery key.",
)}
-
+
{keyStatus}
-
-
+
{_t(
"If you've forgotten your recovery key you can "+
"
set up new recovery options ."