diff --git a/ethcore/native_contracts/Cargo.toml b/ethcore/native_contracts/Cargo.toml index c3ef59d31..6b225220f 100644 --- a/ethcore/native_contracts/Cargo.toml +++ b/ethcore/native_contracts/Cargo.toml @@ -16,4 +16,4 @@ native-contract-generator = { path = "generator" } [features] default = [] -test_contracts = [] \ No newline at end of file +test_contracts = [] diff --git a/parity/cli/mod.rs b/parity/cli/mod.rs index 45285fa4a..b5afb8d0a 100644 --- a/parity/cli/mod.rs +++ b/parity/cli/mod.rs @@ -172,7 +172,7 @@ usage! { or |c: &Config| otry!(c.rpc).interface.clone(), flag_jsonrpc_cors: Option = None, or |c: &Config| otry!(c.rpc).cors.clone().map(Some), - flag_jsonrpc_apis: String = "web3,eth,pubsub,net,parity,traces,rpc,secretstore", + flag_jsonrpc_apis: String = "web3,eth,pubsub,net,parity,parity_pubsub,traces,rpc,secretstore", or |c: &Config| otry!(c.rpc).apis.as_ref().map(|vec| vec.join(",")), flag_jsonrpc_hosts: String = "none", or |c: &Config| otry!(c.rpc).hosts.as_ref().map(|vec| vec.join(",")), @@ -186,7 +186,7 @@ usage! { or |c: &Config| otry!(c.websockets).port.clone(), flag_ws_interface: String = "local", or |c: &Config| otry!(c.websockets).interface.clone(), - flag_ws_apis: String = "web3,eth,pubsub,net,parity,traces,rpc,secretstore", + flag_ws_apis: String = "web3,eth,pubsub,net,parity,parity_pubsub,traces,rpc,secretstore", or |c: &Config| otry!(c.websockets).apis.as_ref().map(|vec| vec.join(",")), flag_ws_origins: String = "none", or |c: &Config| otry!(c.websockets).origins.as_ref().map(|vec| vec.join(",")), @@ -198,7 +198,7 @@ usage! { or |c: &Config| otry!(c.ipc).disable.clone(), flag_ipc_path: String = if cfg!(windows) { r"\\.\pipe\jsonrpc.ipc" } else { "$BASE/jsonrpc.ipc" }, or |c: &Config| otry!(c.ipc).path.clone(), - flag_ipc_apis: String = "web3,eth,pubsub,net,parity,parity_accounts,traces,rpc,secretstore", + flag_ipc_apis: String = "web3,eth,pubsub,net,parity,parity_pubsub,parity_accounts,traces,rpc,secretstore", or |c: &Config| otry!(c.ipc).apis.as_ref().map(|vec| vec.join(",")), // DAPPS diff --git a/parity/dapps.rs b/parity/dapps.rs index ff0dd2139..324e40403 100644 --- a/parity/dapps.rs +++ b/parity/dapps.rs @@ -104,11 +104,11 @@ impl ContractClient for LightRegistrar { value: 0.into(), data: data, }.fake_sign(Address::default()), - header: on_demand::request::HeaderRef::Stored(header), + header: header.into(), env_info: env_info, engine: self.client.engine().clone(), }) - .expect("todo: handle error") + .expect("No back-references; therefore all back-refs valid; qed") .then(|res| match res { Ok(Ok(executed)) => Ok(executed.output), Ok(Err(e)) => Err(format!("Failed to execute transaction: {}", e)), diff --git a/parity/rpc_apis.rs b/parity/rpc_apis.rs index d738d1eee..d456a0fff 100644 --- a/parity/rpc_apis.rs +++ b/parity/rpc_apis.rs @@ -54,6 +54,8 @@ pub enum Api { Signer, /// Parity - Custom extensions (Safe) Parity, + /// Parity PubSub - Generic Publish-Subscriber (Safety depends on other APIs exposed). + ParityPubSub, /// Parity Accounts extensions (UNSAFE: Passwords, Side Effects (new account)) ParityAccounts, /// Parity - Set methods (UNSAFE: Side Effects affecting node operation) @@ -80,6 +82,7 @@ impl FromStr for Api { "personal" => Ok(Personal), "signer" => Ok(Signer), "parity" => Ok(Parity), + "parity_pubsub" => Ok(ParityPubSub), "parity_accounts" => Ok(ParityAccounts), "parity_set" => Ok(ParitySet), "traces" => Ok(Traces), @@ -161,6 +164,7 @@ fn to_modules(apis: &[Api]) -> BTreeMap { Api::Signer => ("signer", "1.0"), Api::Parity => ("parity", "1.0"), Api::ParityAccounts => ("parity_accounts", "1.0"), + Api::ParityPubSub => ("parity_pubsub", "1.0"), Api::ParitySet => ("parity_set", "1.0"), Api::Traces => ("traces", "1.0"), Api::Rpc => ("rpc", "1.0"), @@ -288,13 +292,15 @@ impl FullDependencies { self.dapps_port, ).to_delegate()); + if !for_generic_pubsub { + add_signing_methods!(ParitySigning, handler, self); + } + }, + Api::ParityPubSub => { if !for_generic_pubsub { let mut rpc = MetaIoHandler::default(); self.extend_api(&mut rpc, apis, true); handler.extend_with(PubSubClient::new(rpc, self.remote.clone()).to_delegate()); - - add_signing_methods!(EthSigning, handler, self); - add_signing_methods!(ParitySigning, handler, self); } }, Api::ParityAccounts => { @@ -364,11 +370,13 @@ pub struct LightDependencies { pub remote: parity_reactor::Remote, } -impl Dependencies for LightDependencies { - type Notifier = LightClientNotifier; - - fn activity_notifier(&self) -> Self::Notifier { LightClientNotifier } - fn extend_with_set(&self, handler: &mut MetaIoHandler>, apis: &[Api]) { +impl LightDependencies { + fn extend_api>( + &self, + handler: &mut MetaIoHandler, + apis: &[Api], + for_generic_pubsub: bool, + ) { use parity_rpc::v1::*; let dispatcher = LightDispatcher::new( @@ -416,8 +424,11 @@ impl Dependencies for LightDependencies { self.cache.clone(), ); handler.extend_with(Eth::to_delegate(client.clone())); - handler.extend_with(EthFilter::to_delegate(client)); - add_signing_methods!(EthSigning, handler, self); + + if !for_generic_pubsub { + handler.extend_with(EthFilter::to_delegate(client)); + add_signing_methods!(EthSigning, handler, self); + } }, Api::EthPubSub => { let client = EthPubSubClient::new(self.client.clone(), self.remote.clone()); @@ -450,8 +461,16 @@ impl Dependencies for LightDependencies { self.dapps_port, ).to_delegate()); - add_signing_methods!(EthSigning, handler, self); - add_signing_methods!(ParitySigning, handler, self); + if !for_generic_pubsub { + add_signing_methods!(ParitySigning, handler, self); + } + }, + Api::ParityPubSub => { + if !for_generic_pubsub { + let mut rpc = MetaIoHandler::default(); + self.extend_api(&mut rpc, apis, true); + handler.extend_with(PubSubClient::new(rpc, self.remote.clone()).to_delegate()); + } }, Api::ParityAccounts => { let secret_store = Some(self.secret_store.clone()); @@ -479,6 +498,15 @@ impl Dependencies for LightDependencies { } } +impl Dependencies for LightDependencies { + type Notifier = LightClientNotifier; + + fn activity_notifier(&self) -> Self::Notifier { LightClientNotifier } + fn extend_with_set(&self, handler: &mut MetaIoHandler>, apis: &[Api]) { + self.extend_api(handler, apis, false) + } +} + impl ApiSet { /// Retains only APIs in given set. pub fn retain(self, set: Self) -> Self { @@ -494,15 +522,18 @@ impl ApiSet { ApiSet::PublicContext => public_list, ApiSet::UnsafeContext => { public_list.insert(Api::Traces); + public_list.insert(Api::ParityPubSub); public_list }, ApiSet::IpcContext => { public_list.insert(Api::Traces); + public_list.insert(Api::ParityPubSub); public_list.insert(Api::ParityAccounts); public_list }, ApiSet::SafeContext => { public_list.insert(Api::Traces); + public_list.insert(Api::ParityPubSub); public_list.insert(Api::ParityAccounts); public_list.insert(Api::ParitySet); public_list.insert(Api::Signer); @@ -510,6 +541,7 @@ impl ApiSet { }, ApiSet::All => { public_list.insert(Api::Traces); + public_list.insert(Api::ParityPubSub); public_list.insert(Api::ParityAccounts); public_list.insert(Api::ParitySet); public_list.insert(Api::Signer); @@ -564,7 +596,7 @@ mod test { fn test_api_set_unsafe_context() { let expected = vec![ // make sure this list contains only SAFE methods - Api::Web3, Api::Net, Api::Eth, Api::EthPubSub, Api::Parity, Api::Traces, Api::Rpc, Api::SecretStore + Api::Web3, Api::Net, Api::Eth, Api::EthPubSub, Api::Parity, Api::ParityPubSub, Api::Traces, Api::Rpc, Api::SecretStore ].into_iter().collect(); assert_eq!(ApiSet::UnsafeContext.list_apis(), expected); } @@ -573,7 +605,7 @@ mod test { fn test_api_set_ipc_context() { let expected = vec![ // safe - Api::Web3, Api::Net, Api::Eth, Api::EthPubSub, Api::Parity, Api::Traces, Api::Rpc, Api::SecretStore, + Api::Web3, Api::Net, Api::Eth, Api::EthPubSub, Api::Parity, Api::ParityPubSub, Api::Traces, Api::Rpc, Api::SecretStore, // semi-safe Api::ParityAccounts ].into_iter().collect(); @@ -584,7 +616,7 @@ mod test { fn test_api_set_safe_context() { let expected = vec![ // safe - Api::Web3, Api::Net, Api::Eth, Api::EthPubSub, Api::Parity, Api::Traces, Api::Rpc, Api::SecretStore, + Api::Web3, Api::Net, Api::Eth, Api::EthPubSub, Api::Parity, Api::ParityPubSub, Api::Traces, Api::Rpc, Api::SecretStore, // semi-safe Api::ParityAccounts, // Unsafe @@ -596,7 +628,7 @@ mod test { #[test] fn test_all_apis() { assert_eq!("all".parse::().unwrap(), ApiSet::List(vec![ - Api::Web3, Api::Net, Api::Eth, Api::EthPubSub, Api::Parity, Api::Traces, Api::Rpc, Api::SecretStore, + Api::Web3, Api::Net, Api::Eth, Api::EthPubSub, Api::Parity, Api::ParityPubSub, Api::Traces, Api::Rpc, Api::SecretStore, Api::ParityAccounts, Api::ParitySet, Api::Signer, Api::Personal @@ -606,7 +638,7 @@ mod test { #[test] fn test_all_without_personal_apis() { assert_eq!("personal,all,-personal".parse::().unwrap(), ApiSet::List(vec![ - Api::Web3, Api::Net, Api::Eth, Api::EthPubSub, Api::Parity, Api::Traces, Api::Rpc, Api::SecretStore, + Api::Web3, Api::Net, Api::Eth, Api::EthPubSub, Api::Parity, Api::ParityPubSub, Api::Traces, Api::Rpc, Api::SecretStore, Api::ParityAccounts, Api::ParitySet, Api::Signer, ].into_iter().collect())); @@ -615,7 +647,7 @@ mod test { #[test] fn test_safe_parsing() { assert_eq!("safe".parse::().unwrap(), ApiSet::List(vec![ - Api::Web3, Api::Net, Api::Eth, Api::EthPubSub, Api::EthPubSub, Api::Parity, Api::Traces, Api::Rpc, Api::SecretStore, + Api::Web3, Api::Net, Api::Eth, Api::EthPubSub, Api::Parity, Api::ParityPubSub, Api::Traces, Api::Rpc, Api::SecretStore, ].into_iter().collect())); } }