Adding CLI options: port shift and unsafe expose. (#5677)
* Adding CLI option for port shift and unsafe expose. * Fixing IPC path. * Fix hosts when attempting to expose on all interfaces. * Fixing test. * Fix typo.
This commit is contained in:
		
							parent
							
								
									532801f9d6
								
							
						
					
					
						commit
						f47cbe0be6
					
				@ -40,7 +40,7 @@ const TRANSITION_BLOCK_1: usize = 2; // block at which the contract becomes acti
 | 
				
			|||||||
const TRANSITION_BLOCK_2: usize = 6; // block at which the second contract activates.
 | 
					const TRANSITION_BLOCK_2: usize = 6; // block at which the second contract activates.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
macro_rules! secret {
 | 
					macro_rules! secret {
 | 
				
			||||||
	($e: expr) => { Secret::from_slice(&$e.sha3()).expect(format!("sha3({}) not valid secret.", $e).as_str()) }
 | 
						($e: expr) => { Secret::from_slice(&$e.sha3()) }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
lazy_static! {
 | 
					lazy_static! {
 | 
				
			||||||
 | 
				
			|||||||
@ -81,3 +81,5 @@ jit = false
 | 
				
			|||||||
logging = "own_tx=trace"
 | 
					logging = "own_tx=trace"
 | 
				
			||||||
log_file = "/var/log/parity.log"
 | 
					log_file = "/var/log/parity.log"
 | 
				
			||||||
color = true
 | 
					color = true
 | 
				
			||||||
 | 
					ports_shift = 0
 | 
				
			||||||
 | 
					unsafe_expose = false
 | 
				
			||||||
 | 
				
			|||||||
@ -98,6 +98,13 @@ usage! {
 | 
				
			|||||||
		flag_no_persistent_txqueue: bool = false,
 | 
							flag_no_persistent_txqueue: bool = false,
 | 
				
			||||||
			or |c: &Config| otry!(c.parity).no_persistent_txqueue,
 | 
								or |c: &Config| otry!(c.parity).no_persistent_txqueue,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// -- Convenience Options
 | 
				
			||||||
 | 
							flag_config: String = "$BASE/config.toml", or |_| None,
 | 
				
			||||||
 | 
							flag_ports_shift: u16 = 0u16,
 | 
				
			||||||
 | 
								or |c: &Config| otry!(c.misc).ports_shift,
 | 
				
			||||||
 | 
							flag_unsafe_expose: bool = false,
 | 
				
			||||||
 | 
								or |c: &Config| otry!(c.misc).unsafe_expose,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// -- Account Options
 | 
							// -- Account Options
 | 
				
			||||||
		flag_unlock: Option<String> = None,
 | 
							flag_unlock: Option<String> = None,
 | 
				
			||||||
			or |c: &Config| otry!(c.account).unlock.as_ref().map(|vec| Some(vec.join(","))),
 | 
								or |c: &Config| otry!(c.account).unlock.as_ref().map(|vec| Some(vec.join(","))),
 | 
				
			||||||
@ -189,7 +196,7 @@ usage! {
 | 
				
			|||||||
		// IPC
 | 
							// IPC
 | 
				
			||||||
		flag_no_ipc: bool = false,
 | 
							flag_no_ipc: bool = false,
 | 
				
			||||||
			or |c: &Config| otry!(c.ipc).disable.clone(),
 | 
								or |c: &Config| otry!(c.ipc).disable.clone(),
 | 
				
			||||||
		flag_ipc_path: String = "$BASE/jsonrpc.ipc",
 | 
							flag_ipc_path: String = if cfg!(windows) { r"\\.\pipe\jsonrpc.ipc" } else { "$BASE/jsonrpc.ipc" },
 | 
				
			||||||
			or |c: &Config| otry!(c.ipc).path.clone(),
 | 
								or |c: &Config| otry!(c.ipc).path.clone(),
 | 
				
			||||||
		flag_ipc_apis: String = "web3,eth,net,parity,parity_accounts,traces,rpc,secretstore",
 | 
							flag_ipc_apis: String = "web3,eth,net,parity,parity_accounts,traces,rpc,secretstore",
 | 
				
			||||||
			or |c: &Config| otry!(c.ipc).apis.as_ref().map(|vec| vec.join(",")),
 | 
								or |c: &Config| otry!(c.ipc).apis.as_ref().map(|vec| vec.join(",")),
 | 
				
			||||||
@ -339,7 +346,6 @@ usage! {
 | 
				
			|||||||
			or |c: &Config| otry!(c.vm).jit.clone(),
 | 
								or |c: &Config| otry!(c.vm).jit.clone(),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// -- Miscellaneous Options
 | 
							// -- Miscellaneous Options
 | 
				
			||||||
		flag_config: String = "$BASE/config.toml", or |_| None,
 | 
					 | 
				
			||||||
		flag_logging: Option<String> = None,
 | 
							flag_logging: Option<String> = None,
 | 
				
			||||||
			or |c: &Config| otry!(c.misc).logging.clone().map(Some),
 | 
								or |c: &Config| otry!(c.misc).logging.clone().map(Some),
 | 
				
			||||||
		flag_log_file: Option<String> = None,
 | 
							flag_log_file: Option<String> = None,
 | 
				
			||||||
@ -575,6 +581,8 @@ struct Misc {
 | 
				
			|||||||
	logging: Option<String>,
 | 
						logging: Option<String>,
 | 
				
			||||||
	log_file: Option<String>,
 | 
						log_file: Option<String>,
 | 
				
			||||||
	color: Option<bool>,
 | 
						color: Option<bool>,
 | 
				
			||||||
 | 
						ports_shift: Option<u16>,
 | 
				
			||||||
 | 
						unsafe_expose: Option<bool>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[cfg(test)]
 | 
					#[cfg(test)]
 | 
				
			||||||
@ -686,6 +694,11 @@ mod tests {
 | 
				
			|||||||
			flag_light: false,
 | 
								flag_light: false,
 | 
				
			||||||
			flag_no_persistent_txqueue: false,
 | 
								flag_no_persistent_txqueue: false,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// -- Convenience Options
 | 
				
			||||||
 | 
								flag_config: "$BASE/config.toml".into(),
 | 
				
			||||||
 | 
								flag_ports_shift: 0,
 | 
				
			||||||
 | 
								flag_unsafe_expose: false,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// -- Account Options
 | 
								// -- Account Options
 | 
				
			||||||
			flag_unlock: Some("0xdeadbeefcafe0000000000000000000000000000".into()),
 | 
								flag_unlock: Some("0xdeadbeefcafe0000000000000000000000000000".into()),
 | 
				
			||||||
			flag_password: vec!["~/.safe/password.file".into()],
 | 
								flag_password: vec!["~/.safe/password.file".into()],
 | 
				
			||||||
@ -862,7 +875,6 @@ mod tests {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			// -- Miscellaneous Options
 | 
								// -- Miscellaneous Options
 | 
				
			||||||
			flag_version: false,
 | 
								flag_version: false,
 | 
				
			||||||
			flag_config: "$BASE/config.toml".into(),
 | 
					 | 
				
			||||||
			flag_logging: Some("own_tx=trace".into()),
 | 
								flag_logging: Some("own_tx=trace".into()),
 | 
				
			||||||
			flag_log_file: Some("/var/log/parity.log".into()),
 | 
								flag_log_file: Some("/var/log/parity.log".into()),
 | 
				
			||||||
			flag_no_color: false,
 | 
								flag_no_color: false,
 | 
				
			||||||
@ -1037,6 +1049,8 @@ mod tests {
 | 
				
			|||||||
				logging: Some("own_tx=trace".into()),
 | 
									logging: Some("own_tx=trace".into()),
 | 
				
			||||||
				log_file: Some("/var/log/parity.log".into()),
 | 
									log_file: Some("/var/log/parity.log".into()),
 | 
				
			||||||
				color: Some(true),
 | 
									color: Some(true),
 | 
				
			||||||
 | 
									ports_shift: Some(0),
 | 
				
			||||||
 | 
									unsafe_expose: Some(false),
 | 
				
			||||||
			}),
 | 
								}),
 | 
				
			||||||
			stratum: None,
 | 
								stratum: None,
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
 | 
				
			|||||||
@ -76,6 +76,18 @@ Operating Options:
 | 
				
			|||||||
                                   potentially higher in bandwidth. Has no effect with
 | 
					                                   potentially higher in bandwidth. Has no effect with
 | 
				
			||||||
                                   subcommands (default: {flag_light}).
 | 
					                                   subcommands (default: {flag_light}).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Convenience Options:
 | 
				
			||||||
 | 
					  -c --config CONFIG               Specify a filename containing a configuration file.
 | 
				
			||||||
 | 
					                                   (default: {flag_config})
 | 
				
			||||||
 | 
					  --ports-shift SHIFT              Add SHIFT to all port numbers Parity is listening on.
 | 
				
			||||||
 | 
					                                   Includes network port and all servers (RPC, WebSockets, UI, IPFS, SecretStore).
 | 
				
			||||||
 | 
					                                   (default: {flag_ports_shift})
 | 
				
			||||||
 | 
					  --unsafe-expose                  All servers will listen on external interfaces and will
 | 
				
			||||||
 | 
					                                   be remotely accessible. It's equivalent with setting
 | 
				
			||||||
 | 
					                                   the following: --{{ws,jsonrpc,ui,ipfs,secret_store,stratum}}-interface=all --*-hosts=all
 | 
				
			||||||
 | 
					                                   This option is UNSAFE and should be used with great care!
 | 
				
			||||||
 | 
					                                   (default: {flag_unsafe_expose})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Account Options:
 | 
					Account Options:
 | 
				
			||||||
  --unlock ACCOUNTS                Unlock ACCOUNTS for the duration of the execution.
 | 
					  --unlock ACCOUNTS                Unlock ACCOUNTS for the duration of the execution.
 | 
				
			||||||
                                   ACCOUNTS is a comma-delimited list of addresses.
 | 
					                                   ACCOUNTS is a comma-delimited list of addresses.
 | 
				
			||||||
@ -441,8 +453,6 @@ Internal Options:
 | 
				
			|||||||
  --can-restart                    Executable will auto-restart if exiting with 69.
 | 
					  --can-restart                    Executable will auto-restart if exiting with 69.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Miscellaneous Options:
 | 
					Miscellaneous Options:
 | 
				
			||||||
  -c --config CONFIG               Specify a filename containing a configuration file.
 | 
					 | 
				
			||||||
                                   (default: {flag_config})
 | 
					 | 
				
			||||||
  -l --logging LOGGING             Specify the logging level. Must conform to the same
 | 
					  -l --logging LOGGING             Specify the logging level. Must conform to the same
 | 
				
			||||||
                                   format as RUST_LOG. (default: {flag_logging:?})
 | 
					                                   format as RUST_LOG. (default: {flag_logging:?})
 | 
				
			||||||
  --log-file FILENAME              Specify a filename into which logging should be
 | 
					  --log-file FILENAME              Specify a filename into which logging should be
 | 
				
			||||||
 | 
				
			|||||||
@ -373,7 +373,7 @@ impl Configuration {
 | 
				
			|||||||
				public_node: public_node,
 | 
									public_node: public_node,
 | 
				
			||||||
				geth_compatibility: geth_compatibility,
 | 
									geth_compatibility: geth_compatibility,
 | 
				
			||||||
				ui_address: ui_address,
 | 
									ui_address: ui_address,
 | 
				
			||||||
				net_settings: self.network_settings(),
 | 
									net_settings: self.network_settings()?,
 | 
				
			||||||
				dapps_conf: dapps_conf,
 | 
									dapps_conf: dapps_conf,
 | 
				
			||||||
				ipfs_conf: ipfs_conf,
 | 
									ipfs_conf: ipfs_conf,
 | 
				
			||||||
				signer_conf: signer_conf,
 | 
									signer_conf: signer_conf,
 | 
				
			||||||
@ -513,7 +513,7 @@ impl Configuration {
 | 
				
			|||||||
			Ok(Some(StratumOptions {
 | 
								Ok(Some(StratumOptions {
 | 
				
			||||||
				io_path: self.directories().db,
 | 
									io_path: self.directories().db,
 | 
				
			||||||
				listen_addr: self.stratum_interface(),
 | 
									listen_addr: self.stratum_interface(),
 | 
				
			||||||
				port: self.args.flag_stratum_port,
 | 
									port: self.args.flag_ports_shift + self.args.flag_stratum_port,
 | 
				
			||||||
				secret: self.args.flag_stratum_secret.as_ref().map(|s| s.parse::<H256>().unwrap_or_else(|_| s.sha3())),
 | 
									secret: self.args.flag_stratum_secret.as_ref().map(|s| s.parse::<H256>().unwrap_or_else(|_| s.sha3())),
 | 
				
			||||||
			}))
 | 
								}))
 | 
				
			||||||
		} else { Ok(None) }
 | 
							} else { Ok(None) }
 | 
				
			||||||
@ -556,10 +556,10 @@ impl Configuration {
 | 
				
			|||||||
	fn signer_config(&self) -> SignerConfiguration {
 | 
						fn signer_config(&self) -> SignerConfiguration {
 | 
				
			||||||
		SignerConfiguration {
 | 
							SignerConfiguration {
 | 
				
			||||||
			enabled: self.ui_enabled(),
 | 
								enabled: self.ui_enabled(),
 | 
				
			||||||
			port: self.args.flag_ui_port,
 | 
								port: self.args.flag_ports_shift + self.args.flag_ui_port,
 | 
				
			||||||
			interface: self.ui_interface(),
 | 
								interface: self.ui_interface(),
 | 
				
			||||||
			signer_path: self.directories().signer,
 | 
								signer_path: self.directories().signer,
 | 
				
			||||||
			skip_origin_validation: self.args.flag_ui_no_validation,
 | 
								skip_origin_validation: self.args.flag_unsafe_expose || self.args.flag_ui_no_validation,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -581,9 +581,9 @@ impl Configuration {
 | 
				
			|||||||
			self_secret: self.secretstore_self_secret()?,
 | 
								self_secret: self.secretstore_self_secret()?,
 | 
				
			||||||
			nodes: self.secretstore_nodes()?,
 | 
								nodes: self.secretstore_nodes()?,
 | 
				
			||||||
			interface: self.secretstore_interface(),
 | 
								interface: self.secretstore_interface(),
 | 
				
			||||||
			port: self.args.flag_secretstore_port,
 | 
								port: self.args.flag_ports_shift + self.args.flag_secretstore_port,
 | 
				
			||||||
			http_interface: self.secretstore_http_interface(),
 | 
								http_interface: self.secretstore_http_interface(),
 | 
				
			||||||
			http_port: self.args.flag_secretstore_http_port,
 | 
								http_port: self.args.flag_ports_shift + self.args.flag_secretstore_http_port,
 | 
				
			||||||
			data_path: self.directories().secretstore,
 | 
								data_path: self.directories().secretstore,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -591,7 +591,7 @@ impl Configuration {
 | 
				
			|||||||
	fn ipfs_config(&self) -> IpfsConfiguration {
 | 
						fn ipfs_config(&self) -> IpfsConfiguration {
 | 
				
			||||||
		IpfsConfiguration {
 | 
							IpfsConfiguration {
 | 
				
			||||||
			enabled: self.args.flag_ipfs_api,
 | 
								enabled: self.args.flag_ipfs_api,
 | 
				
			||||||
			port: self.args.flag_ipfs_api_port,
 | 
								port: self.args.flag_ports_shift + self.args.flag_ipfs_api_port,
 | 
				
			||||||
			interface: self.ipfs_interface(),
 | 
								interface: self.ipfs_interface(),
 | 
				
			||||||
			cors: self.ipfs_cors(),
 | 
								cors: self.ipfs_cors(),
 | 
				
			||||||
			hosts: self.ipfs_hosts(),
 | 
								hosts: self.ipfs_hosts(),
 | 
				
			||||||
@ -674,9 +674,9 @@ impl Configuration {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn net_addresses(&self) -> Result<(Option<SocketAddr>, Option<SocketAddr>), String> {
 | 
						fn net_addresses(&self) -> Result<(SocketAddr, Option<SocketAddr>), String> {
 | 
				
			||||||
		let port = self.args.flag_port;
 | 
							let port = self.args.flag_ports_shift + self.args.flag_port;
 | 
				
			||||||
		let listen_address = Some(SocketAddr::new("0.0.0.0".parse().unwrap(), port));
 | 
							let listen_address = SocketAddr::new("0.0.0.0".parse().unwrap(), port);
 | 
				
			||||||
		let public_address = if self.args.flag_nat.starts_with("extip:") {
 | 
							let public_address = if self.args.flag_nat.starts_with("extip:") {
 | 
				
			||||||
			let host = &self.args.flag_nat[6..];
 | 
								let host = &self.args.flag_nat[6..];
 | 
				
			||||||
			let host = host.parse().map_err(|_| format!("Invalid host given with `--nat extip:{}`", host))?;
 | 
								let host = host.parse().map_err(|_| format!("Invalid host given with `--nat extip:{}`", host))?;
 | 
				
			||||||
@ -692,7 +692,7 @@ impl Configuration {
 | 
				
			|||||||
		ret.nat_enabled = self.args.flag_nat == "any" || self.args.flag_nat == "upnp";
 | 
							ret.nat_enabled = self.args.flag_nat == "any" || self.args.flag_nat == "upnp";
 | 
				
			||||||
		ret.boot_nodes = to_bootnodes(&self.args.flag_bootnodes)?;
 | 
							ret.boot_nodes = to_bootnodes(&self.args.flag_bootnodes)?;
 | 
				
			||||||
		let (listen, public) = self.net_addresses()?;
 | 
							let (listen, public) = self.net_addresses()?;
 | 
				
			||||||
		ret.listen_address = listen.map(|l| format!("{}", l));
 | 
							ret.listen_address = Some(format!("{}", listen));
 | 
				
			||||||
		ret.public_address = public.map(|p| format!("{}", p));
 | 
							ret.public_address = public.map(|p| format!("{}", p));
 | 
				
			||||||
		ret.use_secret = match self.args.flag_node_key.as_ref()
 | 
							ret.use_secret = match self.args.flag_node_key.as_ref()
 | 
				
			||||||
			.map(|s| s.parse::<Secret>().or_else(|_| Secret::from_unsafe_slice(&s.sha3())).map_err(|e| format!("Invalid key: {:?}", e))
 | 
								.map(|s| s.parse::<Secret>().or_else(|_| Secret::from_unsafe_slice(&s.sha3())).map_err(|e| format!("Invalid key: {:?}", e))
 | 
				
			||||||
@ -746,7 +746,19 @@ impl Configuration {
 | 
				
			|||||||
		Self::cors(self.args.flag_ipfs_api_cors.as_ref())
 | 
							Self::cors(self.args.flag_ipfs_api_cors.as_ref())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn hosts(hosts: &str) -> Option<Vec<String>> {
 | 
						fn hosts(&self, hosts: &str, interface: &str) -> Option<Vec<String>> {
 | 
				
			||||||
 | 
							if self.args.flag_unsafe_expose {
 | 
				
			||||||
 | 
								return None;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if interface == "0.0.0.0" && hosts == "none" {
 | 
				
			||||||
 | 
								return None;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Self::parse_hosts(hosts)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fn parse_hosts(hosts: &str) -> Option<Vec<String>> {
 | 
				
			||||||
		match hosts {
 | 
							match hosts {
 | 
				
			||||||
			"none" => return Some(Vec::new()),
 | 
								"none" => return Some(Vec::new()),
 | 
				
			||||||
			"*" | "all" | "any" => return None,
 | 
								"*" | "all" | "any" => return None,
 | 
				
			||||||
@ -757,19 +769,19 @@ impl Configuration {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn rpc_hosts(&self) -> Option<Vec<String>> {
 | 
						fn rpc_hosts(&self) -> Option<Vec<String>> {
 | 
				
			||||||
		Self::hosts(&self.args.flag_jsonrpc_hosts)
 | 
							self.hosts(&self.args.flag_jsonrpc_hosts, &self.rpc_interface())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn ws_hosts(&self) -> Option<Vec<String>> {
 | 
						fn ws_hosts(&self) -> Option<Vec<String>> {
 | 
				
			||||||
		Self::hosts(&self.args.flag_ws_hosts)
 | 
							self.hosts(&self.args.flag_ws_hosts, &self.ws_interface())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn ws_origins(&self) -> Option<Vec<String>> {
 | 
						fn ws_origins(&self) -> Option<Vec<String>> {
 | 
				
			||||||
		Self::hosts(&self.args.flag_ws_origins)
 | 
							Self::parse_hosts(&self.args.flag_ws_origins)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn ipfs_hosts(&self) -> Option<Vec<String>> {
 | 
						fn ipfs_hosts(&self) -> Option<Vec<String>> {
 | 
				
			||||||
		Self::hosts(&self.args.flag_ipfs_api_hosts)
 | 
							self.hosts(&self.args.flag_ipfs_api_hosts, &self.ipfs_interface())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn ipc_config(&self) -> Result<IpcConfiguration, String> {
 | 
						fn ipc_config(&self) -> Result<IpcConfiguration, String> {
 | 
				
			||||||
@ -795,7 +807,7 @@ impl Configuration {
 | 
				
			|||||||
		let conf = HttpConfiguration {
 | 
							let conf = HttpConfiguration {
 | 
				
			||||||
			enabled: self.rpc_enabled(),
 | 
								enabled: self.rpc_enabled(),
 | 
				
			||||||
			interface: self.rpc_interface(),
 | 
								interface: self.rpc_interface(),
 | 
				
			||||||
			port: self.args.flag_rpcport.unwrap_or(self.args.flag_jsonrpc_port),
 | 
								port: self.args.flag_ports_shift + self.args.flag_rpcport.unwrap_or(self.args.flag_jsonrpc_port),
 | 
				
			||||||
			apis: match self.args.flag_public_node {
 | 
								apis: match self.args.flag_public_node {
 | 
				
			||||||
				false => self.rpc_apis().parse()?,
 | 
									false => self.rpc_apis().parse()?,
 | 
				
			||||||
				true => self.rpc_apis().parse::<ApiSet>()?.retain(ApiSet::PublicContext),
 | 
									true => self.rpc_apis().parse::<ApiSet>()?.retain(ApiSet::PublicContext),
 | 
				
			||||||
@ -816,7 +828,7 @@ impl Configuration {
 | 
				
			|||||||
		let conf = WsConfiguration {
 | 
							let conf = WsConfiguration {
 | 
				
			||||||
			enabled: self.ws_enabled(),
 | 
								enabled: self.ws_enabled(),
 | 
				
			||||||
			interface: self.ws_interface(),
 | 
								interface: self.ws_interface(),
 | 
				
			||||||
			port: self.args.flag_ws_port,
 | 
								port: self.args.flag_ports_shift + self.args.flag_ws_port,
 | 
				
			||||||
			apis: self.args.flag_ws_apis.parse()?,
 | 
								apis: self.args.flag_ws_apis.parse()?,
 | 
				
			||||||
			hosts: self.ws_hosts(),
 | 
								hosts: self.ws_hosts(),
 | 
				
			||||||
			origins: self.ws_origins()
 | 
								origins: self.ws_origins()
 | 
				
			||||||
@ -825,15 +837,17 @@ impl Configuration {
 | 
				
			|||||||
		Ok(conf)
 | 
							Ok(conf)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn network_settings(&self) -> NetworkSettings {
 | 
						fn network_settings(&self) -> Result<NetworkSettings, String> {
 | 
				
			||||||
		NetworkSettings {
 | 
							let http_conf = self.http_config()?;
 | 
				
			||||||
 | 
							let net_addresses = self.net_addresses()?;
 | 
				
			||||||
 | 
							Ok(NetworkSettings {
 | 
				
			||||||
			name: self.args.flag_identity.clone(),
 | 
								name: self.args.flag_identity.clone(),
 | 
				
			||||||
			chain: self.chain(),
 | 
								chain: self.chain(),
 | 
				
			||||||
			network_port: self.args.flag_port,
 | 
								network_port: net_addresses.0.port(),
 | 
				
			||||||
			rpc_enabled: self.rpc_enabled(),
 | 
								rpc_enabled: http_conf.enabled,
 | 
				
			||||||
			rpc_interface: self.args.flag_rpcaddr.clone().unwrap_or(self.args.flag_jsonrpc_interface.clone()),
 | 
								rpc_interface: http_conf.interface,
 | 
				
			||||||
			rpc_port: self.args.flag_rpcport.unwrap_or(self.args.flag_jsonrpc_port),
 | 
								rpc_port: http_conf.port,
 | 
				
			||||||
		}
 | 
							})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn update_policy(&self) -> Result<UpdatePolicy, String> {
 | 
						fn update_policy(&self) -> Result<UpdatePolicy, String> {
 | 
				
			||||||
@ -906,7 +920,11 @@ impl Configuration {
 | 
				
			|||||||
		if self.args.flag_geth {
 | 
							if self.args.flag_geth {
 | 
				
			||||||
			geth_ipc_path(self.args.flag_testnet)
 | 
								geth_ipc_path(self.args.flag_testnet)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			parity_ipc_path(&self.directories().base, &self.args.flag_ipcpath.clone().unwrap_or(self.args.flag_ipc_path.clone()))
 | 
								parity_ipc_path(
 | 
				
			||||||
 | 
									&self.directories().base,
 | 
				
			||||||
 | 
									&self.args.flag_ipcpath.clone().unwrap_or(self.args.flag_ipc_path.clone()),
 | 
				
			||||||
 | 
									self.args.flag_ports_shift,
 | 
				
			||||||
 | 
								)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -919,13 +937,14 @@ impl Configuration {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn ui_interface(&self) -> String {
 | 
						fn ui_interface(&self) -> String {
 | 
				
			||||||
		match self.args.flag_ui_interface.as_str() {
 | 
							self.interface(&self.args.flag_ui_interface)
 | 
				
			||||||
			"local" => "127.0.0.1",
 | 
						}
 | 
				
			||||||
			x => x,
 | 
					
 | 
				
			||||||
		}.into()
 | 
						fn interface(&self, interface: &str) -> String {
 | 
				
			||||||
 | 
							if self.args.flag_unsafe_expose {
 | 
				
			||||||
 | 
								return "0.0.0.0".into();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn interface(interface: &str) -> String {
 | 
					 | 
				
			||||||
		match interface {
 | 
							match interface {
 | 
				
			||||||
			"all" => "0.0.0.0",
 | 
								"all" => "0.0.0.0",
 | 
				
			||||||
			"local" => "127.0.0.1",
 | 
								"local" => "127.0.0.1",
 | 
				
			||||||
@ -934,23 +953,24 @@ impl Configuration {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn rpc_interface(&self) -> String {
 | 
						fn rpc_interface(&self) -> String {
 | 
				
			||||||
		Self::interface(&self.network_settings().rpc_interface)
 | 
							let rpc_interface = self.args.flag_rpcaddr.clone().unwrap_or(self.args.flag_jsonrpc_interface.clone());
 | 
				
			||||||
 | 
							self.interface(&rpc_interface)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn ws_interface(&self) -> String {
 | 
						fn ws_interface(&self) -> String {
 | 
				
			||||||
		Self::interface(&self.args.flag_ws_interface)
 | 
							self.interface(&self.args.flag_ws_interface)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn ipfs_interface(&self) -> String {
 | 
						fn ipfs_interface(&self) -> String {
 | 
				
			||||||
		Self::interface(&self.args.flag_ipfs_api_interface)
 | 
							self.interface(&self.args.flag_ipfs_api_interface)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn secretstore_interface(&self) -> String {
 | 
						fn secretstore_interface(&self) -> String {
 | 
				
			||||||
		Self::interface(&self.args.flag_secretstore_interface)
 | 
							self.interface(&self.args.flag_secretstore_interface)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn secretstore_http_interface(&self) -> String {
 | 
						fn secretstore_http_interface(&self) -> String {
 | 
				
			||||||
		Self::interface(&self.args.flag_secretstore_http_interface)
 | 
							self.interface(&self.args.flag_secretstore_http_interface)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn secretstore_self_secret(&self) -> Result<Option<Secret>, String> {
 | 
						fn secretstore_self_secret(&self) -> Result<Option<Secret>, String> {
 | 
				
			||||||
@ -986,7 +1006,7 @@ impl Configuration {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn stratum_interface(&self) -> String {
 | 
						fn stratum_interface(&self) -> String {
 | 
				
			||||||
		Self::interface(&self.args.flag_stratum_interface)
 | 
							self.interface(&self.args.flag_stratum_interface)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn rpc_enabled(&self) -> bool {
 | 
						fn rpc_enabled(&self) -> bool {
 | 
				
			||||||
@ -1322,23 +1342,23 @@ mod tests {
 | 
				
			|||||||
		let conf = parse(&["parity", "--testnet", "--identity", "testname"]);
 | 
							let conf = parse(&["parity", "--testnet", "--identity", "testname"]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// then
 | 
							// then
 | 
				
			||||||
		assert_eq!(conf.network_settings(), NetworkSettings {
 | 
							assert_eq!(conf.network_settings(), Ok(NetworkSettings {
 | 
				
			||||||
			name: "testname".to_owned(),
 | 
								name: "testname".to_owned(),
 | 
				
			||||||
			chain: "testnet".to_owned(),
 | 
								chain: "testnet".to_owned(),
 | 
				
			||||||
			network_port: 30303,
 | 
								network_port: 30303,
 | 
				
			||||||
			rpc_enabled: true,
 | 
								rpc_enabled: true,
 | 
				
			||||||
			rpc_interface: "local".to_owned(),
 | 
								rpc_interface: "127.0.0.1".to_owned(),
 | 
				
			||||||
			rpc_port: 8545,
 | 
								rpc_port: 8545,
 | 
				
			||||||
		});
 | 
							}));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#[test]
 | 
						#[test]
 | 
				
			||||||
	fn should_parse_rpc_settings_with_geth_compatiblity() {
 | 
						fn should_parse_rpc_settings_with_geth_compatiblity() {
 | 
				
			||||||
		// given
 | 
							// given
 | 
				
			||||||
		fn assert(conf: Configuration) {
 | 
							fn assert(conf: Configuration) {
 | 
				
			||||||
			let net = conf.network_settings();
 | 
								let net = conf.network_settings().unwrap();
 | 
				
			||||||
			assert_eq!(net.rpc_enabled, true);
 | 
								assert_eq!(net.rpc_enabled, true);
 | 
				
			||||||
			assert_eq!(net.rpc_interface, "all".to_owned());
 | 
								assert_eq!(net.rpc_interface, "0.0.0.0".to_owned());
 | 
				
			||||||
			assert_eq!(net.rpc_port, 8000);
 | 
								assert_eq!(net.rpc_port, 8000);
 | 
				
			||||||
			assert_eq!(conf.rpc_cors(), Some(vec!["*".to_owned()]));
 | 
								assert_eq!(conf.rpc_cors(), Some(vec!["*".to_owned()]));
 | 
				
			||||||
			assert_eq!(conf.rpc_apis(), "web3,eth".to_owned());
 | 
								assert_eq!(conf.rpc_apis(), "web3,eth".to_owned());
 | 
				
			||||||
@ -1516,4 +1536,57 @@ mod tests {
 | 
				
			|||||||
			_ => panic!("Should be Cmd::Run"),
 | 
								_ => panic!("Should be Cmd::Run"),
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#[test]
 | 
				
			||||||
 | 
						fn should_apply_ports_shift() {
 | 
				
			||||||
 | 
							// given
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// when
 | 
				
			||||||
 | 
							let conf0 = parse(&["parity", "--ports-shift", "1", "--stratum"]);
 | 
				
			||||||
 | 
							let conf1 = parse(&["parity", "--ports-shift", "1", "--jsonrpc-port", "8544"]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// then
 | 
				
			||||||
 | 
							assert_eq!(conf0.net_addresses().unwrap().0.port(), 30304);
 | 
				
			||||||
 | 
							assert_eq!(conf0.network_settings().unwrap().network_port, 30304);
 | 
				
			||||||
 | 
							assert_eq!(conf0.network_settings().unwrap().rpc_port, 8546);
 | 
				
			||||||
 | 
							assert_eq!(conf0.http_config().unwrap().port, 8546);
 | 
				
			||||||
 | 
							assert_eq!(conf0.ws_config().unwrap().port, 8547);
 | 
				
			||||||
 | 
							assert_eq!(conf0.signer_config().port, 8181);
 | 
				
			||||||
 | 
							assert_eq!(conf0.secretstore_config().unwrap().port, 8084);
 | 
				
			||||||
 | 
							assert_eq!(conf0.secretstore_config().unwrap().http_port, 8083);
 | 
				
			||||||
 | 
							assert_eq!(conf0.ipfs_config().port, 5002);
 | 
				
			||||||
 | 
							assert_eq!(conf0.stratum_options().unwrap().unwrap().port, 8009);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							assert_eq!(conf1.net_addresses().unwrap().0.port(), 30304);
 | 
				
			||||||
 | 
							assert_eq!(conf1.network_settings().unwrap().network_port, 30304);
 | 
				
			||||||
 | 
							assert_eq!(conf1.network_settings().unwrap().rpc_port, 8545);
 | 
				
			||||||
 | 
							assert_eq!(conf1.http_config().unwrap().port, 8545);
 | 
				
			||||||
 | 
							assert_eq!(conf1.ws_config().unwrap().port, 8547);
 | 
				
			||||||
 | 
							assert_eq!(conf1.signer_config().port, 8181);
 | 
				
			||||||
 | 
							assert_eq!(conf1.secretstore_config().unwrap().port, 8084);
 | 
				
			||||||
 | 
							assert_eq!(conf1.secretstore_config().unwrap().http_port, 8083);
 | 
				
			||||||
 | 
							assert_eq!(conf1.ipfs_config().port, 5002);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#[test]
 | 
				
			||||||
 | 
						fn should_expose_all_servers() {
 | 
				
			||||||
 | 
							// given
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// when
 | 
				
			||||||
 | 
							let conf0 = parse(&["parity", "--unsafe-expose"]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// then
 | 
				
			||||||
 | 
							assert_eq!(&conf0.network_settings().unwrap().rpc_interface, "0.0.0.0");
 | 
				
			||||||
 | 
							assert_eq!(&conf0.http_config().unwrap().interface, "0.0.0.0");
 | 
				
			||||||
 | 
							assert_eq!(conf0.http_config().unwrap().hosts, None);
 | 
				
			||||||
 | 
							assert_eq!(&conf0.ws_config().unwrap().interface, "0.0.0.0");
 | 
				
			||||||
 | 
							assert_eq!(conf0.ws_config().unwrap().hosts, None);
 | 
				
			||||||
 | 
							assert_eq!(&conf0.signer_config().interface, "0.0.0.0");
 | 
				
			||||||
 | 
							assert_eq!(conf0.signer_config().skip_origin_validation, true);
 | 
				
			||||||
 | 
							assert_eq!(&conf0.secretstore_config().unwrap().interface, "0.0.0.0");
 | 
				
			||||||
 | 
							assert_eq!(&conf0.secretstore_config().unwrap().http_interface, "0.0.0.0");
 | 
				
			||||||
 | 
							assert_eq!(&conf0.ipfs_config().interface, "0.0.0.0");
 | 
				
			||||||
 | 
							assert_eq!(conf0.ipfs_config().hosts, None);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -166,13 +166,12 @@ pub fn geth_ipc_path(testnet: bool) -> String {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Formats and returns parity ipc path.
 | 
					/// Formats and returns parity ipc path.
 | 
				
			||||||
pub fn parity_ipc_path(base: &str, s: &str) -> String {
 | 
					pub fn parity_ipc_path(base: &str, path: &str, shift: u16) -> String {
 | 
				
			||||||
	// Windows path should not be hardcoded here.
 | 
						let mut path = path.to_owned();
 | 
				
			||||||
	if cfg!(windows) {
 | 
						if shift != 0 {
 | 
				
			||||||
		return r"\\.\pipe\parity.jsonrpc".to_owned();
 | 
							path = path.replace("jsonrpc.ipc", &format!("jsonrpc-{}.ipc", shift));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						replace_home(base, &path)
 | 
				
			||||||
	replace_home(base, s)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Validates and formats bootnodes option.
 | 
					/// Validates and formats bootnodes option.
 | 
				
			||||||
 | 
				
			|||||||
@ -18,7 +18,6 @@ use std::io;
 | 
				
			|||||||
use std::sync::Arc;
 | 
					use std::sync::Arc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use dapps;
 | 
					use dapps;
 | 
				
			||||||
use dir::default_data_path;
 | 
					 | 
				
			||||||
use parity_rpc::informant::{RpcStats, Middleware};
 | 
					use parity_rpc::informant::{RpcStats, Middleware};
 | 
				
			||||||
use parity_rpc::{self as rpc, HttpServerError, Metadata, Origin, DomainsValidation};
 | 
					use parity_rpc::{self as rpc, HttpServerError, Metadata, Origin, DomainsValidation};
 | 
				
			||||||
use helpers::parity_ipc_path;
 | 
					use helpers::parity_ipc_path;
 | 
				
			||||||
@ -63,10 +62,14 @@ pub struct IpcConfiguration {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
impl Default for IpcConfiguration {
 | 
					impl Default for IpcConfiguration {
 | 
				
			||||||
	fn default() -> Self {
 | 
						fn default() -> Self {
 | 
				
			||||||
		let data_dir = default_data_path();
 | 
					 | 
				
			||||||
		IpcConfiguration {
 | 
							IpcConfiguration {
 | 
				
			||||||
			enabled: true,
 | 
								enabled: true,
 | 
				
			||||||
			socket_addr: parity_ipc_path(&data_dir, "$BASE/jsonrpc.ipc"),
 | 
								socket_addr: if cfg!(windows) {
 | 
				
			||||||
 | 
									r"\\.\pipe\jsonrpc.ipc".into()
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									let data_dir = ::dir::default_data_path();
 | 
				
			||||||
 | 
									parity_ipc_path(&data_dir, "$BASE/jsonrpc.ipc", 0)
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
			apis: ApiSet::IpcContext,
 | 
								apis: ApiSet::IpcContext,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -39,7 +39,7 @@ impl Default for NetworkSettings {
 | 
				
			|||||||
			chain: "foundation".into(),
 | 
								chain: "foundation".into(),
 | 
				
			||||||
			network_port: 30303,
 | 
								network_port: 30303,
 | 
				
			||||||
			rpc_enabled: true,
 | 
								rpc_enabled: true,
 | 
				
			||||||
			rpc_interface: "local".into(),
 | 
								rpc_interface: "127.0.0.1".into(),
 | 
				
			||||||
			rpc_port: 8545
 | 
								rpc_port: 8545
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user