From 9c70d0a83db2d6890dc63fa6dec43c49295979b5 Mon Sep 17 00:00:00 2001
From: GitLab Build Bot
Date: Tue, 14 Mar 2017 12:20:40 +0000
Subject: [PATCH 1/7] [ci skip] js-precompiled 20170314-121823
---
Cargo.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Cargo.lock b/Cargo.lock
index 1f86f3ade6e..9a13ff6b541 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1706,7 +1706,7 @@ dependencies = [
[[package]]
name = "parity-ui-precompiled"
version = "1.4.0"
-source = "git+https://github.com/ethcore/js-precompiled.git?branch=beta#2a7fc4e6c5f958e8716b028b6ded010a9e238f9b"
+source = "git+https://github.com/ethcore/js-precompiled.git?branch=beta#612d335a91f572cba86c1e1eed3fd2c7eb5e2b15"
dependencies = [
"parity-dapps-glue 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
From 9054eb167c18255c8d98288b520ece5ad5683c48 Mon Sep 17 00:00:00 2001
From: Jaco Greeff
Date: Mon, 20 Mar 2017 19:14:39 +0100
Subject: [PATCH 2/7] Attach hardware wallets already in addressbook (#4912)
* Attach hardware wallets already in addressbook
* Only set values changed
---
js/src/mobx/hardwareStore.js | 10 +-
js/src/mobx/hardwareStore.spec.js | 63 ++++++++++---
js/src/views/Accounts/accounts.js | 8 +-
js/src/views/Accounts/accounts.spec.js | 122 +++++++++++++++++++++++++
4 files changed, 182 insertions(+), 21 deletions(-)
create mode 100644 js/src/views/Accounts/accounts.spec.js
diff --git a/js/src/mobx/hardwareStore.js b/js/src/mobx/hardwareStore.js
index 65213ad4e1a..46bf3fa5810 100644
--- a/js/src/mobx/hardwareStore.js
+++ b/js/src/mobx/hardwareStore.js
@@ -120,20 +120,22 @@ export default class HardwareStore {
});
}
- createAccountInfo (entry) {
+ createAccountInfo (entry, original = {}) {
const { address, manufacturer, name } = entry;
return Promise
.all([
- this._api.parity.setAccountName(address, name),
- this._api.parity.setAccountMeta(address, {
+ original.name
+ ? Promise.resolve(true)
+ : this._api.parity.setAccountName(address, name),
+ this._api.parity.setAccountMeta(address, Object.assign({
description: `${manufacturer} ${name}`,
hardware: {
manufacturer
},
tags: ['hardware'],
timestamp: Date.now()
- })
+ }, original.meta || {}))
])
.catch((error) => {
console.warn('HardwareStore::createEntry', error);
diff --git a/js/src/mobx/hardwareStore.spec.js b/js/src/mobx/hardwareStore.spec.js
index 14feb57401a..784fc3f1047 100644
--- a/js/src/mobx/hardwareStore.spec.js
+++ b/js/src/mobx/hardwareStore.spec.js
@@ -130,25 +130,58 @@ describe('mobx/HardwareStore', () => {
describe('operations', () => {
describe('createAccountInfo', () => {
- beforeEach(() => {
- return store.createAccountInfo({
- address: 'testAddr',
- manufacturer: 'testMfg',
- name: 'testName'
+ describe('when not existing', () => {
+ beforeEach(() => {
+ return store.createAccountInfo({
+ address: 'testAddr',
+ manufacturer: 'testMfg',
+ name: 'testName'
+ });
});
- });
- it('calls into parity_setAccountName', () => {
- expect(api.parity.setAccountName).to.have.been.calledWith('testAddr', 'testName');
+ it('calls into parity_setAccountName', () => {
+ expect(api.parity.setAccountName).to.have.been.calledWith('testAddr', 'testName');
+ });
+
+ it('calls into parity_setAccountMeta', () => {
+ expect(api.parity.setAccountMeta).to.have.been.calledWith('testAddr', sinon.match({
+ description: 'testMfg testName',
+ hardware: {
+ manufacturer: 'testMfg'
+ },
+ tags: ['hardware']
+ }));
+ });
});
- it('calls into parity_setAccountMeta', () => {
- expect(api.parity.setAccountMeta).to.have.been.calledWith('testAddr', sinon.match({
- description: 'testMfg testName',
- hardware: {
- manufacturer: 'testMfg'
- }
- }));
+ describe('when already exists', () => {
+ beforeEach(() => {
+ return store.createAccountInfo({
+ address: 'testAddr',
+ manufacturer: 'testMfg',
+ name: 'testName'
+ }, {
+ name: 'originalName',
+ meta: {
+ description: 'originalDescription',
+ tags: ['tagA', 'tagB']
+ }
+ });
+ });
+
+ it('does not call into parity_setAccountName', () => {
+ expect(api.parity.setAccountName).not.to.have.been.called;
+ });
+
+ it('calls into parity_setAccountMeta', () => {
+ expect(api.parity.setAccountMeta).to.have.been.calledWith('testAddr', sinon.match({
+ description: 'originalDescription',
+ hardware: {
+ manufacturer: 'testMfg'
+ },
+ tags: ['tagA', 'tagB']
+ }));
+ });
});
});
diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js
index 7067e8cb185..107fcc2485e 100644
--- a/js/src/views/Accounts/accounts.js
+++ b/js/src/views/Accounts/accounts.js
@@ -394,8 +394,12 @@ class Accounts extends Component {
Object
.keys(wallets)
- .filter((address) => !accountsInfo[address])
- .forEach((address) => this.hwstore.createAccountInfo(wallets[address]));
+ .filter((address) => {
+ const account = accountsInfo[address];
+
+ return !account || !account.meta || !account.meta.hardware;
+ })
+ .forEach((address) => this.hwstore.createAccountInfo(wallets[address], accountsInfo[address]));
this.setVisibleAccounts();
}
diff --git a/js/src/views/Accounts/accounts.spec.js b/js/src/views/Accounts/accounts.spec.js
new file mode 100644
index 00000000000..7bd79810540
--- /dev/null
+++ b/js/src/views/Accounts/accounts.spec.js
@@ -0,0 +1,122 @@
+// Copyright 2015-2017 Parity Technologies (UK) Ltd.
+// This file is part of Parity.
+
+// Parity is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Parity is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Parity. If not, see .
+
+import { shallow } from 'enzyme';
+import React from 'react';
+import sinon from 'sinon';
+
+import Accounts from './';
+
+let api;
+let component;
+let hwstore;
+let instance;
+let redux;
+
+function createApi () {
+ api = {};
+
+ return api;
+}
+
+function createHwStore (walletAddress = '0x456') {
+ hwstore = {
+ wallets: {
+ [walletAddress]: {
+ address: walletAddress
+ }
+ },
+ createAccountInfo: sinon.stub()
+ };
+
+ return hwstore;
+}
+
+function createRedux () {
+ redux = {
+ dispatch: sinon.stub(),
+ subscribe: sinon.stub(),
+ getState: () => {
+ return {
+ personal: {
+ accounts: {},
+ accountsInfo: {
+ '0x123': { meta: '1' },
+ '0x999': { meta: { hardware: {} } }
+ }
+ },
+ balances: {
+ balances: {}
+ }
+ };
+ }
+ };
+
+ return redux;
+}
+
+function render (props = {}) {
+ component = shallow(
+ ,
+ {
+ context: {
+ store: createRedux()
+ }
+ }
+ ).find('Accounts').shallow({
+ context: {
+ api: createApi()
+ }
+ });
+ instance = component.instance();
+
+ return component;
+}
+
+describe('views/Accounts', () => {
+ beforeEach(() => {
+ render();
+ });
+
+ it('renders defaults', () => {
+ expect(component).to.be.ok;
+ });
+
+ describe('instance event methods', () => {
+ describe('onHardwareChange', () => {
+ it('detects completely new entries', () => {
+ instance.hwstore = createHwStore();
+ instance.onHardwareChange();
+
+ expect(hwstore.createAccountInfo).to.have.been.calledWith({ address: '0x456' });
+ });
+
+ it('detects addressbook entries', () => {
+ instance.hwstore = createHwStore('0x123');
+ instance.onHardwareChange();
+
+ expect(hwstore.createAccountInfo).to.have.been.calledWith({ address: '0x123' }, { meta: '1' });
+ });
+
+ it('ignores existing hardware entries', () => {
+ instance.hwstore = createHwStore('0x999');
+ instance.onHardwareChange();
+
+ expect(hwstore.createAccountInfo).not.to.have.been.called;
+ });
+ });
+ });
+});
From e76c496dffb151eff770e3267fd189b260e743c7 Mon Sep 17 00:00:00 2001
From: Nicolas Gotchac
Date: Wed, 15 Mar 2017 13:40:18 +0100
Subject: [PATCH 3/7] Add Vaults logic to First Run (#4894) (#4914)
---
js/src/modals/FirstRun/Welcome/welcome.js | 4 +-
js/src/ui/Portal/portal.js | 7 +++-
js/src/views/Application/store.js | 45 ++++++++++++++++++++---
3 files changed, 47 insertions(+), 9 deletions(-)
diff --git a/js/src/modals/FirstRun/Welcome/welcome.js b/js/src/modals/FirstRun/Welcome/welcome.js
index 629ec47bc81..df438d11236 100644
--- a/js/src/modals/FirstRun/Welcome/welcome.js
+++ b/js/src/modals/FirstRun/Welcome/welcome.js
@@ -49,7 +49,7 @@ export default class FirstRun extends Component {
defaultMessage='As part of a new installation, the next few steps will guide you through the process of setting up you Parity instance and your associated accounts. Our aim is to make it as simple as possible and to get you up and running in record-time, so please bear with us. Once completed you will have -'
/>
-
+
{
this.firstrunVisible = visible;
- store.set('showFirstRun', !!visible);
+
+ // There's no need to write to storage that the
+ // First Run should be visible
+ if (!visible) {
+ store.set(LS_FIRST_RUN_KEY, !!visible);
+ }
+ }
+
+ /**
+ * Migrate the old LocalStorage ket format
+ * to the new one
+ */
+ _migrateStore () {
+ const oldValue = store.get(OLD_LS_FIRST_RUN_KEY);
+ const newValue = store.get(LS_FIRST_RUN_KEY);
+
+ if (newValue === undefined && oldValue !== undefined) {
+ store.set(LS_FIRST_RUN_KEY, oldValue);
+ store.remove(OLD_LS_FIRST_RUN_KEY);
+ }
}
_checkAccounts () {
- this._api.parity
- .allAccountsInfo()
- .then((info) => {
+ return Promise
+ .all([
+ this._api.parity.listVaults(),
+ this._api.parity.allAccountsInfo()
+ ])
+ .then(([ vaults, info ]) => {
const accounts = Object.keys(info).filter((address) => info[address].uuid);
+ // Has accounts if any vaults or accounts
+ const hasAccounts = (accounts && accounts.length > 0) || (vaults && vaults.length > 0);
- this.toggleFirstrun(this.firstrunVisible || !accounts || !accounts.length);
+ // Show First Run if no accounts and no vaults
+ this.toggleFirstrun(this.firstrunVisible || !hasAccounts);
})
.catch((error) => {
console.error('checkAccounts', error);
From cf394314f30b6113794069825154ddc92ac04287 Mon Sep 17 00:00:00 2001
From: Nicolas Gotchac
Date: Wed, 15 Mar 2017 19:15:05 +0100
Subject: [PATCH 4/7] Add ability to configure Secure API (for #4885) (#4922)
---
js/src/secureApi.js | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/js/src/secureApi.js b/js/src/secureApi.js
index b36f6efdbeb..0c233719e3e 100644
--- a/js/src/secureApi.js
+++ b/js/src/secureApi.js
@@ -92,6 +92,26 @@ export default class SecureApi extends Api {
return this._transport.token;
}
+ /**
+ * Configure the current API with the given values
+ * (`signerPort`, `dappsInterface`, `dappsPort`, ...)
+ */
+ configure (configuration) {
+ const { dappsInterface, dappsPort, signerPort } = configuration;
+
+ if (dappsInterface) {
+ this._dappsInterface = dappsInterface;
+ }
+
+ if (dappsPort) {
+ this._dappsPort = dappsPort;
+ }
+
+ if (signerPort) {
+ this._signerPort = signerPort;
+ }
+ }
+
connect () {
if (this._isConnecting) {
return;
From 2e4dcb53a144e82d09a0437d404fcd16c6cc301e Mon Sep 17 00:00:00 2001
From: Jaco Greeff
Date: Sat, 18 Mar 2017 10:30:18 +0100
Subject: [PATCH 5/7] Add z-index to small modals as well (#4923)
---
js/src/ui/Portal/portal.css | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/js/src/ui/Portal/portal.css b/js/src/ui/Portal/portal.css
index 2e6ff83703b..85e8be4f171 100644
--- a/js/src/ui/Portal/portal.css
+++ b/js/src/ui/Portal/portal.css
@@ -68,12 +68,13 @@ $popoverZ: 3600;
}
&.modal {
+ z-index: $modalZ;
+
&:not(.small) {
bottom: $modalBottom;
left: $modalLeft;
right: $modalRight;
top: $modalTop;
- z-index: $modalZ;
}
/* TODO: Small Portals don't adjust their overall height like we have with the
From 7db48e4bd696aaeb7bce339632880bf8a09b86e6 Mon Sep 17 00:00:00 2001
From: Jaco Greeff
Date: Tue, 21 Mar 2017 16:58:52 +0100
Subject: [PATCH 6/7] eth_sign where account === undefined (#4964)
* Update for case where account === undefined
* Update tests to not mask account === undefined
* default account = {} where undefined (thanks @tomusdrw)
---
.../transactionPendingFormConfirm.js | 13 ++++++++-----
.../transactionPendingFormConfirm.spec.js | 6 +++++-
2 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/transactionPendingFormConfirm.js b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/transactionPendingFormConfirm.js
index 13bf27876b8..8a20b33325b 100644
--- a/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/transactionPendingFormConfirm.js
+++ b/js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/transactionPendingFormConfirm.js
@@ -27,7 +27,7 @@ import styles from './transactionPendingFormConfirm.css';
export default class TransactionPendingFormConfirm extends Component {
static propTypes = {
- account: PropTypes.object.isRequired,
+ account: PropTypes.object,
address: PropTypes.string.isRequired,
disabled: PropTypes.bool,
isSending: PropTypes.bool.isRequired,
@@ -36,6 +36,7 @@ export default class TransactionPendingFormConfirm extends Component {
};
static defaultProps = {
+ account: {},
focus: false
};
@@ -80,7 +81,7 @@ export default class TransactionPendingFormConfirm extends Component {
getPasswordHint () {
const { account } = this.props;
- const accountHint = account && account.meta && account.meta.passwordHint;
+ const accountHint = account.meta && account.meta.passwordHint;
if (accountHint) {
return accountHint;
@@ -149,14 +150,16 @@ export default class TransactionPendingFormConfirm extends Component {
const { account } = this.props;
const { password } = this.state;
- if (account && account.hardware) {
+ if (account.hardware) {
return null;
}
+ const isAccount = account.uuid;
+
return (
{
it('renders the password', () => {
expect(instance.renderPassword()).not.to.be.null;
});
+
+ it('renders the hint', () => {
+ expect(instance.renderHint()).to.be.null;
+ });
});
});
From 0ce089e1c591e2a81441f7b451aac1729133e567 Mon Sep 17 00:00:00 2001
From: Nicolas Gotchac
Date: Tue, 21 Mar 2017 13:56:32 +0100
Subject: [PATCH 7/7] Fix Password Dialog forms style issue (#4968)
---
js/src/modals/PasswordManager/passwordManager.css | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/js/src/modals/PasswordManager/passwordManager.css b/js/src/modals/PasswordManager/passwordManager.css
index f0dfdd93f44..f16f4f369ee 100644
--- a/js/src/modals/PasswordManager/passwordManager.css
+++ b/js/src/modals/PasswordManager/passwordManager.css
@@ -77,7 +77,8 @@
}
.form {
+ box-sizing: border-box;
margin-top: 0;
- padding: 0.75rem 1.5rem 1.5rem 1.5rem;
+ padding: 0.75rem 1.5rem 1.5rem;
background-color: rgba(255, 255, 255, 0.05);
}