From 965e8ae74ea15b8b6dee2bdecb28a1fde3c4b334 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Thu, 21 Sep 2017 14:52:44 +0200 Subject: [PATCH 01/24] Use host as ws/dapps url if present. --- parity/configuration.rs | 2 +- parity/dapps.rs | 2 +- parity/rpc.rs | 102 ++++++++++++++++++------------ parity/rpc_apis.rs | 10 +-- parity/run.rs | 4 +- rpc/src/v1/helpers/mod.rs | 4 +- rpc/src/v1/impls/light/parity.rs | 9 +-- rpc/src/v1/impls/parity.rs | 9 +-- rpc/src/v1/tests/mocked/parity.rs | 9 +-- 9 files changed, 89 insertions(+), 62 deletions(-) diff --git a/parity/configuration.rs b/parity/configuration.rs index 856810d3c..08df1d6a6 100644 --- a/parity/configuration.rs +++ b/parity/configuration.rs @@ -1322,7 +1322,7 @@ mod tests { origins: Some(vec!["chrome-extension://*".into(), "moz-extension://*".into()]), hosts: Some(vec![]), signer_path: expected.into(), - ui_address: Some(("127.0.0.1".to_owned(), 8180)), + ui_address: Some("127.0.0.1:8180".into()), support_token_api: true }, UiConfiguration { enabled: true, diff --git a/parity/dapps.rs b/parity/dapps.rs index b23b759d5..24db4730d 100644 --- a/parity/dapps.rs +++ b/parity/dapps.rs @@ -57,7 +57,7 @@ impl Default for Configuration { } impl Configuration { - pub fn address(&self, address: Option<(String, u16)>) -> Option<(String, u16)> { + pub fn address(&self, address: Option<::parity_rpc::Host>) -> Option<::parity_rpc::Host> { match self.enabled { true => address, false => None, diff --git a/parity/rpc.rs b/parity/rpc.rs index f11d4c3ae..004e12a28 100644 --- a/parity/rpc.rs +++ b/parity/rpc.rs @@ -47,11 +47,8 @@ pub struct HttpConfiguration { } impl HttpConfiguration { - pub fn address(&self) -> Option<(String, u16)> { - match self.enabled { - true => Some((self.interface.clone(), self.port)), - false => None, - } + pub fn address(&self) -> Option { + address(self.enabled, &self.interface, self.port, &self.hosts) } } @@ -79,11 +76,18 @@ pub struct UiConfiguration { } impl UiConfiguration { - pub fn address(&self) -> Option<(String, u16)> { - match self.enabled { - true => Some((self.interface.clone(), self.port)), - false => None, - } + pub fn address(&self) -> Option { + address(self.enabled, &self.interface, self.port, &self.hosts) + } + + pub fn redirection_address(&self) -> Option<(String, u16)> { + self.address().map(|host| { + let mut it = host.split(':'); + let hostname: Option = it.next().map(|s| s.to_owned()); + let port: Option = it.next().and_then(|s| s.parse().ok()); + + (hostname.unwrap_or_else(|| "localhost".into()), port.unwrap_or(8180)) + }) } } @@ -145,7 +149,7 @@ pub struct WsConfiguration { pub hosts: Option>, pub signer_path: PathBuf, pub support_token_api: bool, - pub ui_address: Option<(String, u16)>, + pub ui_address: Option, } impl Default for WsConfiguration { @@ -160,17 +164,25 @@ impl Default for WsConfiguration { hosts: Some(Vec::new()), signer_path: replace_home(&data_dir, "$BASE/signer").into(), support_token_api: true, - ui_address: Some(("127.0.0.1".to_owned(), 8180)), + ui_address: Some("127.0.0.1:8180".into()), } } } impl WsConfiguration { - pub fn address(&self) -> Option<(String, u16)> { - match self.enabled { - true => Some((self.interface.clone(), self.port)), - false => None, - } + pub fn address(&self) -> Option { + address(self.enabled, &self.interface, self.port, &self.hosts) + } +} + +fn address(enabled: bool, bind_iface: &str, bind_port: u16, hosts: &Option>) -> Option { + if !enabled { + return None; + } + + match *hosts { + Some(ref hosts) if !hosts.is_empty() => Some(hosts[0].clone().into()), + _ => Some(format!("{}:{}", bind_iface, bind_port).into()), } } @@ -190,17 +202,15 @@ pub fn new_ws( } let domain = DAPPS_DOMAIN; - let ws_address = (conf.interface, conf.port); - let url = format!("{}:{}", ws_address.0, ws_address.1); + let url = format!("{}:{}", conf.interface, conf.port); let addr = url.parse().map_err(|_| format!("Invalid WebSockets listen host/port given: {}", url))?; - let pool = deps.pool.clone(); - let full_handler = setup_apis(rpc_apis::ApiSet::SafeContext, deps, pool.clone()); + let full_handler = setup_apis(rpc_apis::ApiSet::SafeContext, deps); let handler = { let mut handler = MetaIoHandler::with_middleware(( rpc::WsDispatcher::new(full_handler), - Middleware::new(deps.stats.clone(), deps.apis.activity_notifier(), pool) + Middleware::new(deps.stats.clone(), deps.apis.activity_notifier(), deps.pool.clone()) )); let apis = conf.apis.list_apis(); deps.apis.extend_with_set(&mut handler, &apis); @@ -210,8 +220,8 @@ pub fn new_ws( let remote = deps.remote.clone(); let ui_address = conf.ui_address.clone(); - let allowed_origins = into_domains(with_domain(conf.origins, domain, &[ui_address])); - let allowed_hosts = into_domains(with_domain(conf.hosts, domain, &[Some(ws_address)])); + let allowed_origins = into_domains(with_domain(conf.origins, domain, &ui_address)); + let allowed_hosts = into_domains(with_domain(conf.hosts, domain, &Some(url.clone().into()))); let signer_path; let path = match conf.support_token_api && conf.ui_address.is_some() { @@ -253,15 +263,13 @@ pub fn new_http( } let domain = DAPPS_DOMAIN; - let http_address = (conf.interface, conf.port); - let url = format!("{}:{}", http_address.0, http_address.1); + let url = format!("{}:{}", conf.interface, conf.port); let addr = url.parse().map_err(|_| format!("Invalid {} listen host/port given: {}", id, url))?; - let pool = deps.pool.clone(); - let handler = setup_apis(conf.apis, deps, pool); + let handler = setup_apis(conf.apis, deps); let remote = deps.remote.clone(); let cors_domains = into_domains(conf.cors); - let allowed_hosts = into_domains(with_domain(conf.hosts, domain, &[Some(http_address)])); + let allowed_hosts = into_domains(with_domain(conf.hosts, domain, &Some(url.clone().into()))); let start_result = rpc::start_http( &addr, @@ -296,8 +304,7 @@ pub fn new_ipc( return Ok(None); } - let pool = dependencies.pool.clone(); - let handler = setup_apis(conf.apis, dependencies, pool); + let handler = setup_apis(conf.apis, dependencies); let remote = dependencies.remote.clone(); match rpc::start_ipc(&conf.socket_addr, handler, remote, rpc::RpcExtractor) { Ok(server) => Ok(Some(server)), @@ -309,29 +316,46 @@ fn into_domains>(items: Option>) -> DomainsValidatio items.map(|vals| vals.into_iter().map(T::from).collect()).into() } -fn with_domain(items: Option>, domain: &str, addresses: &[Option<(String, u16)>]) -> Option> { +fn with_domain(items: Option>, domain: &str, address: &Option) -> Option> { + fn extract_port(s: &str) -> Option { + s.split(':').nth(1).and_then(|s| s.parse().ok()) + } + items.map(move |items| { let mut items = items.into_iter().collect::>(); - for address in addresses { - if let Some((host, port)) = address.clone() { - items.insert(format!("{}:{}", host, port)); - items.insert(format!("{}:{}", host.replace("127.0.0.1", "localhost"), port)); + if let Some(host) = address.clone() { + items.insert(host.to_string()); + items.insert(host.replace("127.0.0.1", "localhost")); + items.insert(format!("http://*.{}", domain)); //proxypac + if let Some(port) = extract_port(&*host) { items.insert(format!("http://*.{}:{}", domain, port)); - items.insert(format!("http://*.{}", domain)); //proxypac } } items.into_iter().collect() }) } -fn setup_apis(apis: ApiSet, deps: &Dependencies, pool: Option) -> MetaIoHandler> +fn setup_apis(apis: ApiSet, deps: &Dependencies) -> MetaIoHandler> where D: rpc_apis::Dependencies { let mut handler = MetaIoHandler::with_middleware( - Middleware::new(deps.stats.clone(), deps.apis.activity_notifier(), pool) + Middleware::new(deps.stats.clone(), deps.apis.activity_notifier(), deps.pool.clone()) ); let apis = apis.list_apis(); deps.apis.extend_with_set(&mut handler, &apis); handler } + +#[cfg(test)] +mod tests { + use super::address; + + #[test] + fn should_return_proper_address() { + assert_eq!(address(false, "localhost", 8180, &None), None); + assert_eq!(address(true, "localhost", 8180, &None), Some("localhost:8180".into())); + assert_eq!(address(true, "localhost", 8180, &Some(vec!["host:443".into()])), Some("host:443".into())); + assert_eq!(address(true, "localhost", 8180, &Some(vec!["host".into()])), Some("host".into())); + } +} diff --git a/parity/rpc_apis.rs b/parity/rpc_apis.rs index 0a2fd87f1..d348202a9 100644 --- a/parity/rpc_apis.rs +++ b/parity/rpc_apis.rs @@ -37,7 +37,7 @@ use node_health::NodeHealth; use parity_reactor; use parity_rpc::dispatch::{FullDispatcher, LightDispatcher}; use parity_rpc::informant::{ActivityNotifier, ClientNotifier}; -use parity_rpc::{Metadata, NetworkSettings}; +use parity_rpc::{Metadata, NetworkSettings, Host}; use updater::Updater; use parking_lot::{Mutex, RwLock}; @@ -222,8 +222,8 @@ pub struct FullDependencies { pub health: NodeHealth, pub geth_compatibility: bool, pub dapps_service: Option>, - pub dapps_address: Option<(String, u16)>, - pub ws_address: Option<(String, u16)>, + pub dapps_address: Option, + pub ws_address: Option, pub fetch: FetchClient, pub remote: parity_reactor::Remote, pub whisper_rpc: Option<::whisper::RpcFactory>, @@ -412,8 +412,8 @@ pub struct LightDependencies { pub cache: Arc>, pub transaction_queue: Arc>, pub dapps_service: Option>, - pub dapps_address: Option<(String, u16)>, - pub ws_address: Option<(String, u16)>, + pub dapps_address: Option, + pub ws_address: Option, pub fetch: FetchClient, pub geth_compatibility: bool, pub remote: parity_reactor::Remote, diff --git a/parity/run.rs b/parity/run.rs index d0f967410..1ec29e942 100644 --- a/parity/run.rs +++ b/parity/run.rs @@ -329,7 +329,7 @@ fn execute_light(cmd: RunCmd, can_restart: bool, logger: Arc) -> remote: event_loop.raw_remote(), fetch: fetch.clone(), signer: signer_service.clone(), - ui_address: cmd.ui_conf.address(), + ui_address: cmd.ui_conf.redirection_address(), }) }; @@ -723,7 +723,7 @@ pub fn execute(cmd: RunCmd, can_restart: bool, logger: Arc) -> R remote: event_loop.raw_remote(), fetch: fetch.clone(), signer: signer_service.clone(), - ui_address: cmd.ui_conf.address(), + ui_address: cmd.ui_conf.redirection_address(), }) }; let dapps_middleware = dapps::new(cmd.dapps_conf.clone(), dapps_deps.clone())?; diff --git a/rpc/src/v1/helpers/mod.rs b/rpc/src/v1/helpers/mod.rs index fcb452039..f330c75eb 100644 --- a/rpc/src/v1/helpers/mod.rs +++ b/rpc/src/v1/helpers/mod.rs @@ -51,6 +51,6 @@ pub use self::signer::SignerService; pub use self::subscribers::Subscribers; pub use self::subscription_manager::GenericPollManager; -pub fn to_url(address: &Option<(String, u16)>) -> Option { - address.as_ref().map(|&(ref iface, ref port)| format!("{}:{}", iface, port)) +pub fn to_url(address: &Option<::Host>) -> Option { + address.as_ref().map(|host| (**host).to_owned()) } diff --git a/rpc/src/v1/impls/light/parity.rs b/rpc/src/v1/impls/light/parity.rs index 2f79f66b6..821937edc 100644 --- a/rpc/src/v1/impls/light/parity.rs +++ b/rpc/src/v1/impls/light/parity.rs @@ -46,6 +46,7 @@ use v1::types::{ OperationsInfo, DappId, ChainStatus, AccountInfo, HwAccountInfo, Header, RichHeader, }; +use Host; /// Parity implementation for light client. pub struct ParityClient { @@ -55,8 +56,8 @@ pub struct ParityClient { settings: Arc, health: NodeHealth, signer: Option>, - dapps_address: Option<(String, u16)>, - ws_address: Option<(String, u16)>, + dapps_address: Option, + ws_address: Option, eip86_transition: u64, } @@ -70,8 +71,8 @@ impl ParityClient { settings: Arc, health: NodeHealth, signer: Option>, - dapps_address: Option<(String, u16)>, - ws_address: Option<(String, u16)>, + dapps_address: Option, + ws_address: Option, ) -> Self { ParityClient { light_dispatch, diff --git a/rpc/src/v1/impls/parity.rs b/rpc/src/v1/impls/parity.rs index 434227fcd..b12ed873b 100644 --- a/rpc/src/v1/impls/parity.rs +++ b/rpc/src/v1/impls/parity.rs @@ -51,6 +51,7 @@ use v1::types::{ OperationsInfo, DappId, ChainStatus, AccountInfo, HwAccountInfo, RichHeader }; +use Host; /// Parity implementation. pub struct ParityClient { @@ -64,8 +65,8 @@ pub struct ParityClient { logger: Arc, settings: Arc, signer: Option>, - dapps_address: Option<(String, u16)>, - ws_address: Option<(String, u16)>, + dapps_address: Option, + ws_address: Option, eip86_transition: u64, } @@ -84,8 +85,8 @@ impl ParityClient where logger: Arc, settings: Arc, signer: Option>, - dapps_address: Option<(String, u16)>, - ws_address: Option<(String, u16)>, + dapps_address: Option, + ws_address: Option, ) -> Self { let eip86_transition = client.eip86_transition(); ParityClient { diff --git a/rpc/src/v1/tests/mocked/parity.rs b/rpc/src/v1/tests/mocked/parity.rs index 32280804f..ee714c54b 100644 --- a/rpc/src/v1/tests/mocked/parity.rs +++ b/rpc/src/v1/tests/mocked/parity.rs @@ -31,6 +31,7 @@ use v1::metadata::Metadata; use v1::helpers::{SignerService, NetworkSettings}; use v1::tests::helpers::{TestSyncProvider, Config, TestMinerService, TestUpdater}; use super::manage_network::TestManageNetwork; +use Host; pub type TestParityClient = ParityClient; @@ -44,8 +45,8 @@ pub struct Dependencies { pub settings: Arc, pub network: Arc, pub accounts: Arc, - pub dapps_address: Option<(String, u16)>, - pub ws_address: Option<(String, u16)>, + pub dapps_address: Option, + pub ws_address: Option, } impl Dependencies { @@ -74,8 +75,8 @@ impl Dependencies { }), network: Arc::new(TestManageNetwork), accounts: Arc::new(AccountProvider::transient_provider()), - dapps_address: Some(("127.0.0.1".into(), 18080)), - ws_address: Some(("127.0.0.1".into(), 18546)), + dapps_address: Some("127.0.0.1:18080".into()), + ws_address: Some("127.0.0.1:18546".into()), } } From 1b7c90e9e135b142727347ca42c588447a9aa50f Mon Sep 17 00:00:00 2001 From: maciejhirsz Date: Thu, 21 Sep 2017 16:52:00 +0200 Subject: [PATCH 02/24] Remove public node hacks --- js/src/api/local/localAccountsMiddleware.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/js/src/api/local/localAccountsMiddleware.js b/js/src/api/local/localAccountsMiddleware.js index c452f541a..c32ac0ddd 100644 --- a/js/src/api/local/localAccountsMiddleware.js +++ b/js/src/api/local/localAccountsMiddleware.js @@ -188,16 +188,6 @@ export default class LocalAccountsMiddleware extends Middleware { return []; }); - register('parity_wsUrl', () => { - // This is a hack, will be replaced by a `hostname` setting on the node itself - return `${window.location.hostname}:8546`; - }); - - register('parity_dappsUrl', () => { - // This is a hack, will be replaced by a `hostname` setting on the node itself - return `${window.location.hostname}:8545`; - }); - register('parity_hashContent', () => { throw new Error('Functionality unavailable on a public wallet.'); }); From 339f63a61a5ce80738a09d5cb518365faf1e476a Mon Sep 17 00:00:00 2001 From: maciejhirsz Date: Fri, 22 Sep 2017 13:48:09 +0200 Subject: [PATCH 03/24] Fix :NaN port returned by dappsUrl --- js/src/secureApi.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/js/src/secureApi.js b/js/src/secureApi.js index 76b7eadf8..1d40cb9f7 100644 --- a/js/src/secureApi.js +++ b/js/src/secureApi.js @@ -82,7 +82,7 @@ export default class SecureApi extends Api { return { host, - port: parseInt(port, 10) + port: port ? parseInt(port, 10) : null }; } @@ -93,7 +93,9 @@ export default class SecureApi extends Api { get dappsUrl () { const { port } = this._dappsAddress; - return `${this.protocol()}//${this.hostname}:${port}`; + return port + ? `${this.protocol()}//${this.hostname}:${port}` + : `${this.protocol()}//${this.hostname}`; } get hostname () { From 5f025cc1b839940356722a9d7aa4dc8aeac2ec09 Mon Sep 17 00:00:00 2001 From: Lorenzo Manacorda Date: Sun, 24 Sep 2017 19:18:17 +0200 Subject: [PATCH 04/24] Rename Requests to Batch --- ethcore/light/src/net/mod.rs | 4 +- ethcore/light/src/net/request_set.rs | 6 +-- ethcore/light/src/net/tests/mod.rs | 8 ++-- ethcore/light/src/on_demand/mod.rs | 8 ++-- ethcore/light/src/types/request/builder.rs | 46 +++++++++++----------- ethcore/light/src/types/request/mod.rs | 4 +- sync/src/light_sync/mod.rs | 2 +- 7 files changed, 39 insertions(+), 39 deletions(-) diff --git a/ethcore/light/src/net/mod.rs b/ethcore/light/src/net/mod.rs index 968b98281..bd9e3e1fd 100644 --- a/ethcore/light/src/net/mod.rs +++ b/ethcore/light/src/net/mod.rs @@ -899,7 +899,7 @@ impl LightProtocol { // the maximum amount of requests we'll fill in a single packet. const MAX_REQUESTS: usize = 256; - use ::request::RequestBuilder; + use ::request::Builder; use ::request::CompleteRequest; let peers = self.peers.read(); @@ -914,7 +914,7 @@ impl LightProtocol { let peer: &mut Peer = &mut *peer; let req_id: u64 = raw.val_at(0)?; - let mut request_builder = RequestBuilder::default(); + let mut request_builder = Builder::default(); trace!(target: "pip", "Received requests (id: {}) from peer {}", req_id, peer_id); diff --git a/ethcore/light/src/net/request_set.rs b/ethcore/light/src/net/request_set.rs index 7ec668884..e535d3b5d 100644 --- a/ethcore/light/src/net/request_set.rs +++ b/ethcore/light/src/net/request_set.rs @@ -147,7 +147,7 @@ fn compute_timeout(reqs: &Requests) -> Duration { #[cfg(test)] mod tests { use net::ReqId; - use request::RequestBuilder; + use request::Builder; use time::{SteadyTime, Duration}; use super::{RequestSet, compute_timeout}; @@ -156,7 +156,7 @@ mod tests { let test_begin = SteadyTime::now(); let mut req_set = RequestSet::default(); - let the_req = RequestBuilder::default().build(); + let the_req = Builder::default().build(); let req_time = compute_timeout(&the_req); req_set.insert(ReqId(0), the_req.clone(), 0.into(), test_begin); req_set.insert(ReqId(1), the_req, 0.into(), test_begin + Duration::seconds(1)); @@ -173,7 +173,7 @@ mod tests { #[test] fn cumulative_cost() { - let the_req = RequestBuilder::default().build(); + let the_req = Builder::default().build(); let test_begin = SteadyTime::now(); let test_end = test_begin + Duration::seconds(1); let mut req_set = RequestSet::default(); diff --git a/ethcore/light/src/net/tests/mod.rs b/ethcore/light/src/net/tests/mod.rs index 539a60ffb..af0a02c3e 100644 --- a/ethcore/light/src/net/tests/mod.rs +++ b/ethcore/light/src/net/tests/mod.rs @@ -41,7 +41,7 @@ use std::sync::Arc; // helper for encoding a single request into a packet. // panics on bad backreference. fn encode_single(request: Request) -> NetworkRequests { - let mut builder = RequestBuilder::default(); + let mut builder = Builder::default(); builder.push(request).unwrap(); builder.build() } @@ -344,7 +344,7 @@ fn get_block_bodies() { proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &my_status); } - let mut builder = RequestBuilder::default(); + let mut builder = Builder::default(); let mut bodies = Vec::new(); for i in 0..10 { @@ -400,7 +400,7 @@ fn get_block_receipts() { .take(10) .collect(); - let mut builder = RequestBuilder::default(); + let mut builder = Builder::default(); let mut receipts = Vec::new(); for hash in block_hashes.iter().cloned() { builder.push(Request::Receipts(IncompleteReceiptsRequest { hash: hash.into() })).unwrap(); @@ -448,7 +448,7 @@ fn get_state_proofs() { let key1: H256 = U256::from(11223344).into(); let key2: H256 = U256::from(99988887).into(); - let mut builder = RequestBuilder::default(); + let mut builder = Builder::default(); builder.push(Request::Account(IncompleteAccountRequest { block_hash: H256::default().into(), address_hash: key1.into(), diff --git a/ethcore/light/src/on_demand/mod.rs b/ethcore/light/src/on_demand/mod.rs index 6a9ecb4d1..40da12348 100644 --- a/ethcore/light/src/on_demand/mod.rs +++ b/ethcore/light/src/on_demand/mod.rs @@ -74,8 +74,8 @@ impl Peer { // Attempted request info and sender to put received value. struct Pending { - requests: basic_request::Requests, - net_requests: basic_request::Requests, + requests: basic_request::Batch, + net_requests: basic_request::Batch, required_capabilities: Capabilities, responses: Vec, sender: oneshot::Sender>, @@ -151,7 +151,7 @@ impl Pending { fn update_net_requests(&mut self) { use request::IncompleteRequest; - let mut builder = basic_request::RequestBuilder::default(); + let mut builder = basic_request::Builder::default(); let num_answered = self.requests.num_answered(); let mut mapping = move |idx| idx - num_answered; @@ -281,7 +281,7 @@ impl OnDemand { return Ok(receiver); } - let mut builder = basic_request::RequestBuilder::default(); + let mut builder = basic_request::Builder::default(); let responses = Vec::with_capacity(requests.len()); diff --git a/ethcore/light/src/types/request/builder.rs b/ethcore/light/src/types/request/builder.rs index 74503f54f..df9dad1ad 100644 --- a/ethcore/light/src/types/request/builder.rs +++ b/ethcore/light/src/types/request/builder.rs @@ -25,23 +25,23 @@ use request::{ }; /// Build chained requests. Push them onto the series with `push`, -/// and produce a `Requests` object with `build`. Outputs are checked for consistency. +/// and produce a `Batch` object with `build`. Outputs are checked for consistency. #[derive(Debug, Clone, PartialEq, Eq)] -pub struct RequestBuilder { +pub struct Builder { output_kinds: HashMap<(usize, usize), OutputKind>, requests: Vec, } -impl Default for RequestBuilder { +impl Default for Builder { fn default() -> Self { - RequestBuilder { + Builder { output_kinds: HashMap::new(), requests: Vec::new(), } } } -impl RequestBuilder { +impl Builder { /// Attempt to push a request onto the request chain. Fails if the request /// references a non-existent output of a prior request. pub fn push(&mut self, request: T) -> Result<(), NoSuchOutput> { @@ -62,9 +62,9 @@ impl RequestBuilder { &self.output_kinds } - /// Convert this into a "requests" object. - pub fn build(self) -> Requests { - Requests { + /// Convert this into a "batch" object. + pub fn build(self) -> Batch { + Batch { outputs: HashMap::new(), requests: self.requests, answered: 0, @@ -74,13 +74,13 @@ impl RequestBuilder { /// Requests pending responses. #[derive(Debug, Clone, PartialEq, Eq)] -pub struct Requests { +pub struct Batch { outputs: HashMap<(usize, usize), Output>, requests: Vec, answered: usize, } -impl Requests { +impl Batch { /// Get access to the underlying slice of requests. // TODO: unimplemented -> Vec, // do we _have to_ allocate? pub fn requests(&self) -> &[T] { &self.requests } @@ -94,10 +94,10 @@ impl Requests { } /// Map requests from one type into another. - pub fn map_requests(self, f: F) -> Requests + pub fn map_requests(self, f: F) -> Batch where F: FnMut(T) -> U, U: IncompleteRequest { - Requests { + Batch { outputs: self.outputs, requests: self.requests.into_iter().map(f).collect(), answered: self.answered, @@ -105,7 +105,7 @@ impl Requests { } } -impl Requests { +impl Batch { /// Get the next request as a filled request. Returns `None` when all requests answered. pub fn next_complete(&self) -> Option { if self.is_complete() { @@ -113,7 +113,7 @@ impl Requests { } else { Some(self.requests[self.answered].clone() .complete() - .expect("All outputs checked as invariant of `Requests` object; qed")) + .expect("All outputs checked as invariant of `Batch` object; qed")) } } @@ -149,7 +149,7 @@ impl Requests { } } -impl Requests { +impl Batch { /// Supply a response for the next request. /// Fails on: wrong request kind, all requests answered already. pub fn supply_response(&mut self, env: &T::Environment, response: &T::Response) @@ -170,7 +170,7 @@ impl Requests { } } -impl Requests { +impl Batch { /// For each request, produce a response. /// The responses vector produced goes up to the point where the responder /// first returns `None`, an invalid response, or until all requests have been responded to. @@ -193,7 +193,7 @@ impl Requests { } } -impl Deref for Requests { +impl Deref for Batch { type Target = [T]; fn deref(&self) -> &[T] { @@ -201,7 +201,7 @@ impl Deref for Requests { } } -impl DerefMut for Requests { +impl DerefMut for Batch { fn deref_mut(&mut self) -> &mut [T] { &mut self.requests[..] } @@ -210,12 +210,12 @@ impl DerefMut for Requests { #[cfg(test)] mod tests { use request::*; - use super::RequestBuilder; + use super::Builder; use bigint::hash::H256; #[test] fn all_scalar() { - let mut builder = RequestBuilder::default(); + let mut builder = Builder::default(); builder.push(Request::HeaderProof(IncompleteHeaderProofRequest { num: 100.into(), })).unwrap(); @@ -227,7 +227,7 @@ mod tests { #[test] #[should_panic] fn missing_backref() { - let mut builder = RequestBuilder::default(); + let mut builder = Builder::default(); builder.push(Request::HeaderProof(IncompleteHeaderProofRequest { num: Field::BackReference(100, 3), })).unwrap(); @@ -236,7 +236,7 @@ mod tests { #[test] #[should_panic] fn wrong_kind() { - let mut builder = RequestBuilder::default(); + let mut builder = Builder::default(); assert!(builder.push(Request::HeaderProof(IncompleteHeaderProofRequest { num: 100.into(), })).is_ok()); @@ -247,7 +247,7 @@ mod tests { #[test] fn good_backreference() { - let mut builder = RequestBuilder::default(); + let mut builder = Builder::default(); builder.push(Request::HeaderProof(IncompleteHeaderProofRequest { num: 100.into(), // header proof puts hash at output 0. })).unwrap(); diff --git a/ethcore/light/src/types/request/mod.rs b/ethcore/light/src/types/request/mod.rs index c762f5d04..03f8b92be 100644 --- a/ethcore/light/src/types/request/mod.rs +++ b/ethcore/light/src/types/request/mod.rs @@ -73,7 +73,7 @@ pub use self::epoch_signal::{ Response as SignalResponse, }; -pub use self::builder::{RequestBuilder, Requests}; +pub use self::builder::{Builder, Requests}; /// Error indicating a reference to a non-existent or wrongly-typed output. #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -241,7 +241,7 @@ impl Encodable for HashOrNumber { } /// Type alias for "network requests". -pub type NetworkRequests = Requests; +pub type NetworkRequests = Batch; /// All request types, as they're sent over the network. /// They may be incomplete, with back-references to outputs diff --git a/sync/src/light_sync/mod.rs b/sync/src/light_sync/mod.rs index 54f8a26c0..05a104607 100644 --- a/sync/src/light_sync/mod.rs +++ b/sync/src/light_sync/mod.rs @@ -522,7 +522,7 @@ impl LightSync { rng.shuffle(&mut peer_ids); let request = { - let mut builder = request::RequestBuilder::default(); + let mut builder = request::Builder::default(); builder.push(request::Request::Headers(request::IncompleteHeadersRequest { start: req.start.into(), skip: req.skip, From aab1cf020cf3a7058ebad44816eb226d1592c800 Mon Sep 17 00:00:00 2001 From: Lorenzo Manacorda Date: Sun, 24 Sep 2017 19:55:01 +0200 Subject: [PATCH 05/24] Rename builder module to batch --- ethcore/light/src/types/request/{builder.rs => batch.rs} | 0 ethcore/light/src/types/request/mod.rs | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename ethcore/light/src/types/request/{builder.rs => batch.rs} (100%) diff --git a/ethcore/light/src/types/request/builder.rs b/ethcore/light/src/types/request/batch.rs similarity index 100% rename from ethcore/light/src/types/request/builder.rs rename to ethcore/light/src/types/request/batch.rs diff --git a/ethcore/light/src/types/request/mod.rs b/ethcore/light/src/types/request/mod.rs index 03f8b92be..050c79be8 100644 --- a/ethcore/light/src/types/request/mod.rs +++ b/ethcore/light/src/types/request/mod.rs @@ -19,7 +19,7 @@ use rlp::{Encodable, Decodable, DecoderError, RlpStream, UntrustedRlp}; use bigint::hash::H256; -mod builder; +mod batch; // re-exports of request types. pub use self::header::{ @@ -73,7 +73,7 @@ pub use self::epoch_signal::{ Response as SignalResponse, }; -pub use self::builder::{Builder, Requests}; +pub use self::batch::{Batch, Builder}; /// Error indicating a reference to a non-existent or wrongly-typed output. #[derive(Debug, Clone, Copy, PartialEq, Eq)] From f576926fa2d7070bb16312cb31c6d5c9e3013154 Mon Sep 17 00:00:00 2001 From: GitLab Build Bot Date: Mon, 25 Sep 2017 10:15:30 +0000 Subject: [PATCH 06/24] [ci skip] js-precompiled 20170925-101032 --- Cargo.lock | 2 +- js/package-lock.json | 2 +- js/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7d5195030..7b5d8f5e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2271,7 +2271,7 @@ dependencies = [ [[package]] name = "parity-ui-precompiled" version = "1.4.0" -source = "git+https://github.com/paritytech/js-precompiled.git#324f106aa40d6c37f8c70f9ada9ad744cd64006e" +source = "git+https://github.com/paritytech/js-precompiled.git#f86d1a2c442a441e79f695da844addb70cf10bd6" dependencies = [ "parity-dapps-glue 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/js/package-lock.json b/js/package-lock.json index e07a95263..b23225276 100644 --- a/js/package-lock.json +++ b/js/package-lock.json @@ -1,6 +1,6 @@ { "name": "parity.js", - "version": "1.8.21", + "version": "1.8.22", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/js/package.json b/js/package.json index 69ffad8bb..d70116df2 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "parity.js", - "version": "1.8.21", + "version": "1.8.22", "main": "release/index.js", "jsnext:main": "src/index.js", "author": "Parity Team ", From 0e43ce6e07ebf1a4ed21f346f4e5f980b5e3a23b Mon Sep 17 00:00:00 2001 From: maciejhirsz Date: Mon, 25 Sep 2017 17:08:09 +0200 Subject: [PATCH 07/24] Disable time conditions in Tx UI #6445 --- js/src/api/local/localAccountsMiddleware.js | 4 ++ .../modals/DeployContract/deployContract.js | 6 ++- .../AdvancedStep/advancedStep.js | 8 +++- .../modals/ExecuteContract/executeContract.js | 13 ++++-- js/src/modals/Transfer/Extras/extras.js | 4 +- js/src/modals/Transfer/transfer.js | 7 ++- js/src/ui/GasPriceEditor/gasPriceEditor.js | 45 ++++++++++++------- .../TransactionPending/transactionPending.js | 8 +++- 8 files changed, 68 insertions(+), 27 deletions(-) diff --git a/js/src/api/local/localAccountsMiddleware.js b/js/src/api/local/localAccountsMiddleware.js index c32ac0ddd..adfe8f50d 100644 --- a/js/src/api/local/localAccountsMiddleware.js +++ b/js/src/api/local/localAccountsMiddleware.js @@ -188,6 +188,10 @@ export default class LocalAccountsMiddleware extends Middleware { return []; }); + register('parity_lockedHardwareAccountsInfo', () => { + return []; + }); + register('parity_hashContent', () => { throw new Error('Functionality unavailable on a public wallet.'); }); diff --git a/js/src/modals/DeployContract/deployContract.js b/js/src/modals/DeployContract/deployContract.js index a5d6c6b34..345aeafa9 100644 --- a/js/src/modals/DeployContract/deployContract.js +++ b/js/src/modals/DeployContract/deployContract.js @@ -66,6 +66,7 @@ class DeployContract extends Component { }; static propTypes = { + availability: PropTypes.string.isRequired, accounts: PropTypes.object.isRequired, abi: PropTypes.string, code: PropTypes.string, @@ -331,6 +332,7 @@ class DeployContract extends Component { return ( - + ); } diff --git a/js/src/modals/ExecuteContract/executeContract.js b/js/src/modals/ExecuteContract/executeContract.js index 0f648dece..0dfa7c92e 100644 --- a/js/src/modals/ExecuteContract/executeContract.js +++ b/js/src/modals/ExecuteContract/executeContract.js @@ -57,6 +57,7 @@ class ExecuteContract extends Component { }; static propTypes = { + availability: PropTypes.string.isRequired, accounts: PropTypes.object, contract: PropTypes.object.isRequired, fromAddress: PropTypes.string, @@ -198,7 +199,7 @@ class ExecuteContract extends Component { } renderStep () { - const { accounts, contract, fromAddress, onFromAddressChange } = this.props; + const { availability, accounts, contract, fromAddress, onFromAddressChange } = this.props; const { step } = this.state; if (step === STEP_DETAILS) { @@ -218,7 +219,10 @@ class ExecuteContract extends Component { } return ( - + ); } @@ -337,9 +341,10 @@ class ExecuteContract extends Component { } function mapStateToProps (state) { - const { gasLimit } = state.nodeStatus; + const { gasLimit, nodeKind = {} } = state.nodeStatus; + const { availability = 'unknown' } = nodeKind; - return { gasLimit }; + return { availability, gasLimit }; } export default connect( diff --git a/js/src/modals/Transfer/Extras/extras.js b/js/src/modals/Transfer/Extras/extras.js index c3e2d1a8e..5cbccc369 100644 --- a/js/src/modals/Transfer/Extras/extras.js +++ b/js/src/modals/Transfer/Extras/extras.js @@ -23,6 +23,7 @@ import styles from '../transfer.css'; export default class Extras extends Component { static propTypes = { + availability: PropTypes.string.isRequired, data: PropTypes.string, dataError: PropTypes.string, hideData: PropTypes.bool, @@ -38,13 +39,14 @@ export default class Extras extends Component { }; render () { - const { gasStore, onChange } = this.props; + const { availability, gasStore, onChange } = this.props; return (
{ this.renderData() }
diff --git a/js/src/modals/Transfer/transfer.js b/js/src/modals/Transfer/transfer.js index fd2625ee7..25e5d4f8f 100644 --- a/js/src/modals/Transfer/transfer.js +++ b/js/src/modals/Transfer/transfer.js @@ -42,6 +42,7 @@ class Transfer extends Component { } static propTypes = { + availability: PropTypes.string.isRequired, newError: PropTypes.func.isRequired, gasLimit: PropTypes.object.isRequired, @@ -186,6 +187,7 @@ class Transfer extends Component { onChange={ this.store.onUpdateDetails } total={ total } totalError={ totalError } + availability={ this.props.availability } /> ); } @@ -291,13 +293,14 @@ function mapStateToProps (initState, initProps) { : null; return (state) => { - const { gasLimit } = state.nodeStatus; + const { gasLimit, nodeKind = {} } = state.nodeStatus; const { balances } = state; + const { availability = 'unknown' } = nodeKind; const balance = balances[address]; const sendersBalances = senders ? pick(balances, Object.keys(senders)) : null; - return { balance, gasLimit, senders, sendersBalances, tokens, wallet }; + return { availability, balance, gasLimit, senders, sendersBalances, tokens, wallet }; }; } diff --git a/js/src/ui/GasPriceEditor/gasPriceEditor.js b/js/src/ui/GasPriceEditor/gasPriceEditor.js index db9e02396..7d70d3521 100644 --- a/js/src/ui/GasPriceEditor/gasPriceEditor.js +++ b/js/src/ui/GasPriceEditor/gasPriceEditor.js @@ -64,7 +64,8 @@ export default class GasPriceEditor extends Component { static propTypes = { children: PropTypes.node, onChange: PropTypes.func, - store: PropTypes.object.isRequired + store: PropTypes.object.isRequired, + availability: PropTypes.string.isRequired } static Store = Store; @@ -72,7 +73,7 @@ export default class GasPriceEditor extends Component { render () { const { api } = this.context; const { children, store } = this.props; - const { conditionType, errorGas, errorPrice, errorTotal, estimated, gas, histogram, price, priceDefault, totalValue } = store; + const { errorGas, errorPrice, errorTotal, estimated, gas, histogram, price, priceDefault, totalValue } = store; const eth = api.util.fromWei(totalValue).toFormat(); const gasLabel = `gas (estimated: ${new BigNumber(estimated).toFormat()})`; @@ -80,18 +81,7 @@ export default class GasPriceEditor extends Component { return (
- - } - onChange={ this.onChangeConditionType } - value={ conditionType } - values={ CONDITION_VALUES } - /> + { this.renderConditionRadioButtons() } { this.renderConditions() }
@@ -148,10 +138,35 @@ export default class GasPriceEditor extends Component { ); } + renderConditionRadioButtons () { + const { availability } = this.props; + const { conditionType } = this.props.store; + + if (availability !== 'personal') { + return null; + } + + return ( + + } + onChange={ this.onChangeConditionType } + value={ conditionType } + values={ CONDITION_VALUES } + /> + ); + } + renderConditions () { + const { availability } = this.props; const { conditionType, condition, conditionBlockError } = this.props.store; - if (conditionType === CONDITIONS.NONE) { + if (conditionType === CONDITIONS.NONE || availability !== 'personal') { return null; } diff --git a/js/src/views/Signer/components/TransactionPending/transactionPending.js b/js/src/views/Signer/components/TransactionPending/transactionPending.js index b9cc8f684..2d6797b69 100644 --- a/js/src/views/Signer/components/TransactionPending/transactionPending.js +++ b/js/src/views/Signer/components/TransactionPending/transactionPending.js @@ -36,6 +36,7 @@ class TransactionPending extends Component { }; static propTypes = { + availability: PropTypes.string.isRequired, accounts: PropTypes.object.isRequired, className: PropTypes.string, date: PropTypes.instanceOf(Date).isRequired, @@ -140,11 +141,11 @@ class TransactionPending extends Component { } renderTxEditor () { - const { className } = this.props; + const { availability, className } = this.props; return (
- +