diff --git a/Cargo.lock b/Cargo.lock index 34cf671a0..acc33e9ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1783,7 +1783,7 @@ dependencies = [ [[package]] name = "parity-ui-precompiled" version = "1.4.0" -source = "git+https://github.com/paritytech/js-precompiled.git#d370bad71ec9c573828136f7b64f893173cdacee" +source = "git+https://github.com/paritytech/js-precompiled.git#1be3eaa4cefa85e25b48ac5e8cf579c92108e562" dependencies = [ "parity-dapps-glue 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/ethcore/src/lib.rs b/ethcore/src/lib.rs index 980bdd25c..7dc49fff8 100644 --- a/ethcore/src/lib.rs +++ b/ethcore/src/lib.rs @@ -49,33 +49,25 @@ //! //! ```bash //! -//! # install multirust -//! curl -sf https://raw.githubusercontent.com/brson/multirust/master/blastoff.sh | sh -s -- --yes -//! -//! # export rust LIBRARY_PATH -//! export LIBRARY_PATH=/usr/local/lib +//! # install rustup +//! curl https://sh.rustup.rs -sSf | sh //! //! # download and build parity //! git clone https://github.com/paritytech/parity //! cd parity -//! multirust override beta //! cargo build --release //! ``` //! //! - OSX: //! //! ```bash -//! # install rocksdb && multirust +//! # install rocksdb && rustup //! brew update -//! brew install multirust -//! -//! # export rust LIBRARY_PATH -//! export LIBRARY_PATH=/usr/local/lib +//! curl https://sh.rustup.rs -sSf | sh //! //! # download and build parity //! git clone https://github.com/paritytech/parity //! cd parity -//! multirust override beta //! cargo build --release //! ``` diff --git a/js/package.json b/js/package.json index 8fedeb462..212108acc 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "parity.js", - "version": "1.7.74", + "version": "1.7.75", "main": "release/index.js", "jsnext:main": "src/index.js", "author": "Parity Team ", @@ -46,7 +46,7 @@ "ci:build:npm": "NODE_ENV=production webpack --config webpack/npm", "ci:build:jsonrpc": "babel-node ./scripts/build-rpc-json.js --output .npmjs/jsonrpc", "ci:build:embed": "NODE_ENV=production EMBED=1 node webpack/embed", - "start": "npm install && npm run build:lib && npm run build:dll && npm run start:app", + "start": "npm run clean && npm install && npm run build:lib && npm run build:dll && npm run start:app", "start:app": "node webpack/dev.server", "clean": "rm -rf ./.build ./.coverage ./.happypack ./.npmjs ./build ./node_modules/.cache ./node_modules/@parity", "coveralls": "npm run testCoverage && coveralls < coverage/lcov.info", diff --git a/parity/cli/usage.txt b/parity/cli/usage.txt index 9d2e4f6d5..2eee70c7c 100644 --- a/parity/cli/usage.txt +++ b/parity/cli/usage.txt @@ -90,9 +90,9 @@ Account Options: UI Options: --force-ui Enable Trusted UI WebSocket endpoint, - even when --unlock is in use. (default: ${flag_force_ui}) + even when --unlock is in use. (default: {flag_force_ui}) --no-ui Disable Trusted UI WebSocket endpoint. - (default: ${flag_no_ui}) + (default: {flag_no_ui}) --ui-port PORT Specify the port of Trusted UI server (default: {flag_ui_port}). --ui-interface IP Specify the hostname portion of the Trusted UI diff --git a/parity/run.rs b/parity/run.rs index 083cbe5ce..dad99b9c3 100644 --- a/parity/run.rs +++ b/parity/run.rs @@ -411,7 +411,7 @@ pub fn execute(cmd: RunCmd, can_restart: bool, logger: Arc) -> R ); info!("Operating mode: {}", Colour::White.bold().paint(format!("{}", mode))); - // display warning about using experimental journaldb alorithm + // display warning about using experimental journaldb algorithm if !algorithm.is_stable() { warn!("Your chosen strategy is {}! You can re-run with --pruning to change.", Colour::Red.bold().paint("unstable")); } diff --git a/secret_store/src/key_server_cluster/cluster.rs b/secret_store/src/key_server_cluster/cluster.rs index bd857bda8..209126605 100644 --- a/secret_store/src/key_server_cluster/cluster.rs +++ b/secret_store/src/key_server_cluster/cluster.rs @@ -16,7 +16,7 @@ use std::io; use std::time; -use std::sync::Arc; +use std::sync::{Arc, Weak}; use std::sync::atomic::{AtomicBool, Ordering}; use std::collections::{BTreeMap, BTreeSet, VecDeque}; use std::collections::btree_map::Entry; @@ -27,8 +27,8 @@ use parking_lot::{RwLock, Mutex}; use tokio_io::IoFuture; use tokio_core::reactor::{Handle, Remote, Interval}; use tokio_core::net::{TcpListener, TcpStream}; -use ethkey::{Secret, KeyPair, Signature, Random, Generator}; -use key_server_cluster::{Error, NodeId, SessionId, AclStorage, KeyStorage}; +use ethkey::{Public, Secret, KeyPair, Signature, Random, Generator}; +use key_server_cluster::{Error, NodeId, SessionId, AclStorage, KeyStorage, DocumentEncryptedKeyShadow}; use key_server_cluster::message::{self, Message, ClusterMessage, EncryptionMessage, DecryptionMessage}; use key_server_cluster::decryption_session::{SessionImpl as DecryptionSessionImpl, SessionState as DecryptionSessionState, SessionParams as DecryptionSessionParams, Session as DecryptionSession, DecryptionSessionId}; @@ -236,6 +236,28 @@ pub struct Connection { last_message_time: Mutex, } +/// Encryption session implementation, which removes session from cluster on drop. +struct EncryptionSessionWrapper { + /// Wrapped session. + session: Arc, + /// Session Id. + session_id: SessionId, + /// Cluster data reference. + cluster: Weak, +} + +/// Decryption session implementation, which removes session from cluster on drop. +struct DecryptionSessionWrapper { + /// Wrapped session. + session: Arc, + /// Session Id. + session_id: SessionId, + /// Session sub id. + access_key: Secret, + /// Cluster data reference. + cluster: Weak, +} + impl ClusterCore { pub fn new(handle: Handle, config: ClusterConfiguration) -> Result, Error> { let listen_address = make_socket_address(&config.listen_address.0, config.listen_address.1)?; @@ -1011,9 +1033,9 @@ impl ClusterClient for ClusterClientImpl { connected_nodes.insert(self.data.self_key_pair.public().clone()); let cluster = Arc::new(ClusterView::new(self.data.clone(), connected_nodes.clone())); - let session = self.data.sessions.new_encryption_session(self.data.self_key_pair.public().clone(), session_id, cluster)?; + let session = self.data.sessions.new_encryption_session(self.data.self_key_pair.public().clone(), session_id.clone(), cluster)?; session.initialize(threshold, connected_nodes)?; - Ok(session) + Ok(EncryptionSessionWrapper::new(Arc::downgrade(&self.data), session_id, session)) } fn new_decryption_session(&self, session_id: SessionId, requestor_signature: Signature, is_shadow_decryption: bool) -> Result, Error> { @@ -1022,9 +1044,9 @@ impl ClusterClient for ClusterClientImpl { let access_key = Random.generate()?.secret().clone(); let cluster = Arc::new(ClusterView::new(self.data.clone(), connected_nodes.clone())); - let session = self.data.sessions.new_decryption_session(self.data.self_key_pair.public().clone(), session_id, access_key, cluster)?; + let session = self.data.sessions.new_decryption_session(self.data.self_key_pair.public().clone(), session_id, access_key.clone(), cluster)?; session.initialize(requestor_signature, is_shadow_decryption)?; - Ok(session) + Ok(DecryptionSessionWrapper::new(Arc::downgrade(&self.data), session_id, access_key, session)) } #[cfg(test)] @@ -1043,6 +1065,64 @@ impl ClusterClient for ClusterClientImpl { } } +impl EncryptionSessionWrapper { + pub fn new(cluster: Weak, session_id: SessionId, session: Arc) -> Arc { + Arc::new(EncryptionSessionWrapper { + session: session, + session_id: session_id, + cluster: cluster, + }) + } +} + +impl EncryptionSession for EncryptionSessionWrapper { + fn state(&self) -> EncryptionSessionState { + self.session.state() + } + + fn wait(&self, timeout: Option) -> Result { + self.session.wait(timeout) + } + + #[cfg(test)] + fn joint_public_key(&self) -> Option> { + self.session.joint_public_key() + } +} + +impl Drop for EncryptionSessionWrapper { + fn drop(&mut self) { + if let Some(cluster) = self.cluster.upgrade() { + cluster.sessions.remove_encryption_session(&self.session_id); + } + } +} + +impl DecryptionSessionWrapper { + pub fn new(cluster: Weak, session_id: SessionId, access_key: Secret, session: Arc) -> Arc { + Arc::new(DecryptionSessionWrapper { + session: session, + session_id: session_id, + access_key: access_key, + cluster: cluster, + }) + } +} + +impl DecryptionSession for DecryptionSessionWrapper { + fn wait(&self) -> Result { + self.session.wait() + } +} + +impl Drop for DecryptionSessionWrapper { + fn drop(&mut self) { + if let Some(cluster) = self.cluster.upgrade() { + cluster.sessions.remove_decryption_session(&self.session_id, &self.access_key); + } + } +} + fn make_socket_address(address: &str, port: u16) -> Result { let ip_address: IpAddr = address.parse().map_err(|_| Error::InvalidNodeAddress)?; Ok(SocketAddr::new(ip_address, port))