Merge pull request #209 from poanetwork/enhance-rpc-validation

(Fix) Enhance custom RPC validation
This commit is contained in:
Victor Baranov 2018-12-11 22:39:53 +03:00 committed by GitHub
commit 600c54054a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 699 additions and 364 deletions

View File

@ -2,6 +2,10 @@
## Current Master
## 4.9.1 Tue Nov 27 2018
- [#209](https://github.com/poanetwork/nifty-wallet/pull/209): (Fix) Enhance custom RPC validation
## 4.9.0 Mon Nov 26 2018
- [#183](https://github.com/poanetwork/nifty-wallet/pull/183), [#205](https://github.com/poanetwork/nifty-wallet/pull/205): HD wallets support

View File

@ -1,7 +1,7 @@
{
"name": "__MSG_appName__",
"short_name": "__MSG_appName__",
"version": "4.9.0",
"version": "4.9.1",
"manifest_version": 2,
"author": "POA Network",
"description": "__MSG_appDescription__",

View File

@ -3,9 +3,8 @@ const Component = require('react').Component
const h = require('react-hyperscript')
const connect = require('react-redux').connect
const actions = require('../../ui/app/actions')
const url = require('url')
const http = require('http')
const https = require('https')
const LoadingIndicator = require('./components/loading')
const Web3 = require('web3')
const infuraCurrencies = require('./infura-conversion.json').objects.sort((a, b) => {
return a.quote.name.toLocaleLowerCase().localeCompare(b.quote.name.toLocaleLowerCase())
})
@ -25,13 +24,16 @@ function mapStateToProps (state) {
inherits(ConfigScreen, Component)
function ConfigScreen () {
this.state = {
loading: false,
}
Component.call(this)
}
ConfigScreen.prototype.render = function () {
var state = this.props
var metamaskState = state.metamask
var warning = state.warning
const state = this.props
const metamaskState = state.metamask
const warning = state.warning
return (
h('.flex-column.flex-grow', {
@ -41,6 +43,10 @@ ConfigScreen.prototype.render = function () {
},
}, [
h(LoadingIndicator, {
isLoading: this.state.loading,
}),
h(Modal, {}, []),
// subtitle and nav
@ -92,11 +98,11 @@ ConfigScreen.prototype.render = function () {
border: '1px solid #e2e2e2',
padding: '10px',
},
onKeyPress (event) {
onKeyPress: (event) => {
if (event.key === 'Enter') {
var element = event.target
var newRpc = element.value
rpcValidation(newRpc, state)
const element = event.target
const newRpc = element.value
this.rpcValidation(newRpc, state)
}
},
}),
@ -105,11 +111,11 @@ ConfigScreen.prototype.render = function () {
alignSelf: 'center',
marginTop: '20px',
},
onClick (event) {
onClick: (event) => {
event.preventDefault()
var element = document.querySelector('input#new_rpc')
var newRpc = element.value
rpcValidation(newRpc, state)
const element = document.querySelector('input#new_rpc')
const newRpc = element.value
this.rpcValidation(newRpc, state)
},
}, 'Save'),
]),
@ -234,23 +240,24 @@ ConfigScreen.prototype.componentWillUnmount = function () {
this.props.dispatch(actions.displayWarning(''))
}
function rpcValidation (newRpc, state) {
ConfigScreen.prototype.rpcValidation = function (newRpc, state) {
if (validUrl.isWebUri(newRpc)) {
const rpc = url.parse(newRpc)
const protocolName = rpc.protocol.replace(/:/g, '')
const protocol = protocolName === 'https' ? https : http
const options = {method: 'GET', host: rpc.hostname, port: rpc.port, path: rpc.pathname}
const req = protocol.request(options)
.on('response', () => {
state.dispatch(actions.setRpcTarget(newRpc))
this.setState({
loading: true,
})
.on('error', () => {
const web3 = new Web3(new Web3.providers.HttpProvider(newRpc))
web3.eth.getBlockNumber((err, res) => {
if (err) {
state.dispatch(actions.displayWarning('Invalid RPC endpoint'))
})
req.end()
} else {
var appendedRpc = `http://${newRpc}`
if (validUrl.isWebUri(appendedRpc)) {
state.dispatch(actions.setRpcTarget(newRpc))
}
this.setState({
loading: false,
})
})
} else {
if (!newRpc.startsWith('http')) {
state.dispatch(actions.displayWarning('URIs require the appropriate HTTP/HTTPS prefix.'))
} else {
state.dispatch(actions.displayWarning('Invalid RPC URI'))
@ -259,16 +266,16 @@ function rpcValidation (newRpc, state) {
}
function currentConversionInformation (metamaskState, state) {
var currentCurrency = metamaskState.currentCurrency
var conversionDate = metamaskState.conversionDate
const currentCurrency = metamaskState.currentCurrency
const conversionDate = metamaskState.conversionDate
return h('div', [
h('span', {style: { fontWeight: 'bold', paddingRight: '10px'}}, 'Current Conversion'),
h('span', {style: { fontWeight: 'bold', paddingRight: '10px', fontSize: '13px'}}, `Updated ${Date(conversionDate)}`),
h('select#currentCurrency', {
onChange (event) {
event.preventDefault()
var element = document.getElementById('currentCurrency')
var newCurrency = element.value
const element = document.getElementById('currentCurrency')
const newCurrency = element.value
state.dispatch(actions.setCurrentCurrency(newCurrency))
},
defaultValue: currentCurrency,
@ -280,8 +287,8 @@ function currentConversionInformation (metamaskState, state) {
}
function currentProviderDisplay (metamaskState, state) {
var provider = metamaskState.provider
var title, value
const provider = metamaskState.provider
let title, value
switch (provider.type) {

481
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -38,7 +38,7 @@
"test:mascara:build:locales": "mkdirp dist/chrome && cp -R app/_locales dist/chrome/_locales",
"test:mascara:build:background": "browserify mascara/src/background.js -o dist/mascara/background.js",
"test:mascara:build:tests": "browserify test/integration/lib/first-time.js -o dist/mascara/tests.js",
"ganache:start": "ganache-cli --noVMErrorsOnRPCResponse -m 'juice teach unaware view expand beef divorce spatial evolve rack scheme foster'",
"ganache:start": "ganache-cli --noVMErrorsOnRPCResponse -m 'horn among position unable audit puzzle cannon apology gun autumn plug parrot'",
"sentry:publish": "node ./development/sentry-publish.js",
"lint": "eslint .",
"lint:fix": "eslint . --fix",

70
test/e2e/EIP20.sol Normal file
View File

@ -0,0 +1,70 @@
// Abstract contract for the full ERC 20 Token standard
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
pragma solidity ^0.4.21;
contract EIP20 {
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
uint256 public totalSupply;
uint256 constant private MAX_UINT256 = 2**256 - 1;
mapping (address => uint256) public balances;
mapping (address => mapping (address => uint256)) public allowed;
/*
NOTE:
The following variables are OPTIONAL vanities. One does not have to include them.
They allow one to customise the token contract & in no way influences the core functionality.
Some wallets/interfaces might not even bother to look at this information.
*/
string public name; //fancy name: eg Simon Bucks
uint8 public decimals; //How many decimals to show.
string public symbol; //An identifier: eg SBX
constructor (
uint256 _initialAmount,
string _tokenName,
uint8 _decimalUnits,
string _tokenSymbol
) public {
balances[msg.sender] = _initialAmount; // Give the creator all initial tokens
totalSupply = _initialAmount; // Update total supply
name = _tokenName; // Set the name for display purposes
decimals = _decimalUnits; // Amount of decimals for display purposes
symbol = _tokenSymbol; // Set the symbol for display purposes
}
function transfer(address _to, uint256 _value) public returns (bool success) {
require(balances[msg.sender] >= _value);
balances[msg.sender] -= _value;
balances[_to] += _value;
emit Transfer(msg.sender, _to, _value); //solhint-disable-line indent, no-unused-vars
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
uint256 allowance = allowed[_from][msg.sender];
require(balances[_from] >= _value && allowance >= _value);
balances[_to] += _value;
balances[_from] -= _value;
if (allowance < MAX_UINT256) {
allowed[_from][msg.sender] -= _value;
}
emit Transfer(_from, _to, _value); //solhint-disable-line indent, no-unused-vars
return true;
}
function balanceOf(address _owner) public view returns (uint256 balance) {
return balances[_owner];
}
function approve(address _spender, uint256 _value) public returns (bool success) {
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value); //solhint-disable-line indent, no-unused-vars
return true;
}
function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
return allowed[_owner][_spender];
}
}

View File

@ -267,7 +267,7 @@ module.exports = {
title: By.className('page-subtitle'),
titleText: 'Remove Token',
label: By.className('confirm-label'),
labelText: 'Are you sure you want to remove token "TST"?',
labelText: 'Are you sure you want to remove token "',
buttons: {
back: By.className('fa fa-arrow-left fa-lg cursor-pointer'),
no: By.className('btn-violet'),

File diff suppressed because one or more lines are too long