From 50585763aa87d5f50c520902b1b03f41d64d8325 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Fri, 25 Nov 2016 18:43:28 +0100 Subject: [PATCH] Manually add \r to Windows phrases pre 1.4.5 (#3615) * Manually add \r to Windows phrases pre 1.4.4 * < 1.4.5 * Only support 1.4.x dictionary --- .../RecoveryPhrase/recoveryPhrase.js | 29 +++++++++++++++---- js/src/modals/CreateAccount/createAccount.css | 5 ++++ js/src/modals/CreateAccount/createAccount.js | 16 ++++++++-- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/js/src/modals/CreateAccount/RecoveryPhrase/recoveryPhrase.js b/js/src/modals/CreateAccount/RecoveryPhrase/recoveryPhrase.js index ffa90ef27..b766e247f 100644 --- a/js/src/modals/CreateAccount/RecoveryPhrase/recoveryPhrase.js +++ b/js/src/modals/CreateAccount/RecoveryPhrase/recoveryPhrase.js @@ -15,6 +15,7 @@ // along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; +import { Checkbox } from 'material-ui'; import { Form, Input } from '../../../ui'; @@ -37,6 +38,7 @@ export default class RecoveryPhrase extends Component { password1Error: ERRORS.invalidPassword, password2: '', password2Error: ERRORS.noMatchPassword, + windowsPhrase: false, isValidPass: false, isValidName: false, isValidPhrase: false @@ -47,7 +49,7 @@ export default class RecoveryPhrase extends Component { } render () { - const { accountName, accountNameError, passwordHint, password1, password1Error, password2, password2Error, recoveryPhrase } = this.state; + const { accountName, accountNameError, passwordHint, password1, password1Error, password2, password2Error, recoveryPhrase, windowsPhrase } = this.state; return (
@@ -86,20 +88,26 @@ export default class RecoveryPhrase extends Component { value={ password2 } onChange={ this.onEditPassword2 } /> + ); } updateParent = () => { - const { isValidName, isValidPass, isValidPhrase, accountName, passwordHint, password1, recoveryPhrase } = this.state; + const { isValidName, isValidPass, isValidPhrase, accountName, passwordHint, password1, recoveryPhrase, windowsPhrase } = this.state; const isValid = isValidName && isValidPass && isValidPhrase; this.props.onChange(isValid, { name: accountName, passwordHint, password: password1, - phrase: recoveryPhrase + phrase: recoveryPhrase, + windowsPhrase }); } @@ -109,6 +117,12 @@ export default class RecoveryPhrase extends Component { }); } + onToggleWindowsPhrase = (event) => { + this.setState({ + windowsPhrase: !this.state.windowsPhrase + }, this.updateParent); + } + onEditPhrase = (event) => { const recoveryPhrase = event.target.value .toLowerCase() // wordlists are lowercase @@ -116,15 +130,18 @@ export default class RecoveryPhrase extends Component { .replace(/\s/g, ' ') // replace any whitespace with single space .replace(/ +/g, ' '); // replace multiple spaces with a single space - const parts = recoveryPhrase.split(' '); + const phraseParts = recoveryPhrase + .split(' ') + .map((part) => part.trim()) + .filter((part) => part.length); let recoveryPhraseError = null; - if (!recoveryPhrase || recoveryPhrase.length < 25 || parts.length < 8) { + if (!recoveryPhrase || recoveryPhrase.length < 25 || phraseParts.length < 8) { recoveryPhraseError = ERRORS.noPhrase; } this.setState({ - recoveryPhrase, + recoveryPhrase: phraseParts.join(' '), recoveryPhraseError, isValidPhrase: !recoveryPhraseError }, this.updateParent); diff --git a/js/src/modals/CreateAccount/createAccount.css b/js/src/modals/CreateAccount/createAccount.css index 169cb618a..b87029a36 100644 --- a/js/src/modals/CreateAccount/createAccount.css +++ b/js/src/modals/CreateAccount/createAccount.css @@ -14,6 +14,7 @@ /* You should have received a copy of the GNU General Public License /* along with Parity. If not, see . */ + .spaced { line-height: 1.618em; } @@ -67,3 +68,7 @@ .upload>div { margin-right: 0.5em; } + +.checkbox { + margin-top: 2em; +} diff --git a/js/src/modals/CreateAccount/createAccount.js b/js/src/modals/CreateAccount/createAccount.js index 283e91531..e95dab2a7 100644 --- a/js/src/modals/CreateAccount/createAccount.js +++ b/js/src/modals/CreateAccount/createAccount.js @@ -59,6 +59,7 @@ export default class CreateAccount extends Component { passwordHint: null, password: null, phrase: null, + windowsPhrase: false, rawKey: null, json: null, canCreate: false, @@ -200,7 +201,7 @@ export default class CreateAccount extends Component { } onCreate = () => { - const { createType } = this.state; + const { createType, windowsPhrase } = this.state; const { api } = this.context; this.setState({ @@ -208,8 +209,16 @@ export default class CreateAccount extends Component { }); if (createType === 'fromNew' || createType === 'fromPhrase') { + let phrase = this.state.phrase; + if (createType === 'fromPhrase' && windowsPhrase) { + phrase = phrase + .split(' ') // get the words + .map((word) => word === 'misjudged' ? word : `${word}\r`) // add \r after each (except last in dict) + .join(' '); // re-create string + } + return api.parity - .newAccountFromPhrase(this.state.phrase, this.state.password) + .newAccountFromPhrase(phrase, this.state.password) .then((address) => { this.setState({ address }); return api.parity @@ -326,7 +335,7 @@ export default class CreateAccount extends Component { }); } - onChangeDetails = (canCreate, { name, passwordHint, address, password, phrase, rawKey }) => { + onChangeDetails = (canCreate, { name, passwordHint, address, password, phrase, rawKey, windowsPhrase }) => { this.setState({ canCreate, name, @@ -334,6 +343,7 @@ export default class CreateAccount extends Component { address, password, phrase, + windowsPhrase: windowsPhrase || false, rawKey }); }