Skip to content

Commit

Permalink
[feature] #2121: Check keypair is valid when constructed (#2130)
Browse files Browse the repository at this point in the history
  • Loading branch information
mversic committed Apr 25, 2022
1 parent e10a3e8 commit df1f6a6
Show file tree
Hide file tree
Showing 13 changed files with 139 additions and 46 deletions.
15 changes: 6 additions & 9 deletions cli/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,13 +123,15 @@ impl Configuration {
let mut configuration: Configuration = serde_json::from_reader(reader).wrap_err(
format!("Failed to parse {:?} as Iroha peer configuration.", path),
)?;
configuration.finalize();
configuration.finalize()?;
Ok(configuration)
}

fn finalize(&mut self) {
self.sumeragi.key_pair = self.key_pair();
fn finalize(&mut self) -> Result<()> {
self.sumeragi.key_pair = KeyPair::new(self.public_key.clone(), self.private_key.clone())?;
self.sumeragi.peer_id = PeerId::new(&self.torii.p2p_addr, &self.public_key.clone());

Ok(())
}

/// Loads configuration from environment
Expand All @@ -139,14 +141,9 @@ impl Configuration {
/// - Configuration `TrustedPeers` contains entries with duplicate public keys
pub fn load_environment(&mut self) -> Result<()> {
iroha_config::Configurable::load_environment(self)?;
self.finalize();
self.finalize()?;
Ok(())
}

/// Get `public_key` and `private_key` configuration parameters.
pub fn key_pair(&self) -> iroha_crypto::KeyPair {
iroha_crypto::KeyPair::new(self.public_key.clone(), self.private_key.clone())
}
}

#[cfg(test)]
Expand Down
3 changes: 2 additions & 1 deletion cli/src/samples.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ pub fn get_config(trusted_peers: HashSet<PeerId>, key_pair: Option<KeyPair>) ->
..KuraConfiguration::default()
},
sumeragi: SumeragiConfiguration {
key_pair: KeyPair::new(public_key.clone(), private_key.clone()),
key_pair: KeyPair::new(public_key.clone(), private_key.clone())
.expect("Key pair mismatch"),
peer_id: PeerId::new(DEFAULT_TORII_P2P_ADDR, &public_key),
trusted_peers: TrustedPeers {
peers: trusted_peers,
Expand Down
4 changes: 2 additions & 2 deletions client/benches/torii.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ fn query_requests(criterion: &mut Criterion) {
client_config.torii_telemetry_url =
small::SmallStr::from_string(format!("http://{}", client_config.torii_telemetry_url));
}
let mut iroha_client = Client::new(&client_config);
let mut iroha_client = Client::new(&client_config).expect("Invalid client configuration");
thread::sleep(std::time::Duration::from_millis(5000));

let _ = iroha_client
Expand Down Expand Up @@ -157,7 +157,7 @@ fn instruction_submits(criterion: &mut Criterion) {
client_config.torii_telemetry_url =
small::SmallStr::from_string(format!("http://{}", client_config.torii_telemetry_url));
}
let mut iroha_client = Client::new(&client_config);
let mut iroha_client = Client::new(&client_config).expect("Invalid client configuration");
thread::sleep(std::time::Duration::from_millis(5000));
let _ = iroha_client
.submit_all(vec![create_domain.into(), create_account.into()])
Expand Down
20 changes: 13 additions & 7 deletions client/src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,39 +52,45 @@ pub struct Client {
/// Representation of `Iroha` client.
impl Client {
/// Constructor for client from configuration
pub fn new(configuration: &Configuration) -> Self {
///
/// # Errors
/// If configuration isn't valid (e.g public/private keys don't match)
pub fn new(configuration: &Configuration) -> Result<Self> {
Self::with_headers(configuration, http_client::Headers::default())
}

/// Constructor for client from configuration and headers
///
/// *Authentication* header will be added, if `login` and `password` fields are presented
///
/// # Errors
/// If configuration isn't valid (e.g public/private keys don't match)
pub fn with_headers(
configuration: &Configuration,
mut headers: HashMap<String, String>,
) -> Self {
) -> Result<Self> {
if let Some(basic_auth) = &configuration.basic_auth {
let credentials = format!("{}:{}", basic_auth.web_login, basic_auth.password);
let encoded = base64::encode(credentials);
headers.insert(String::from("Authorization"), format!("Basic {}", encoded));
}

Self {
Ok(Self {
torii_url: configuration.torii_api_url.clone(),
telemetry_url: configuration.torii_telemetry_url.clone(),
transaction_limits: configuration.transaction_limits,
key_pair: KeyPair::new(
configuration.public_key.clone(),
configuration.private_key.clone(),
),
)?,
proposed_transaction_ttl_ms: configuration.transaction_time_to_live_ms,
transaction_status_timeout: Duration::from_millis(
configuration.transaction_status_timeout_ms,
),
account_id: configuration.account_id.clone(),
headers,
add_transaction_nonce: configuration.add_transaction_nonce,
}
})
}

/// Builds transaction out of supplied instructions or wasm.
Expand Down Expand Up @@ -738,7 +744,7 @@ mod tests {
add_transaction_nonce: true,
..Configuration::default()
};
let client = Client::new(&cfg);
let client = Client::new(&cfg).expect("Invalid client configuration");

let build_transaction = || {
client
Expand All @@ -765,7 +771,7 @@ mod tests {
basic_auth: Some(basic_auth),
..Configuration::default()
};
let client = Client::new(&cfg);
let client = Client::new(&cfg).expect("Invalid client configuration");

let value = client
.headers
Expand Down
2 changes: 1 addition & 1 deletion client/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ impl Configuration {
"9ac47abf59b356e0bd7dcbbbb4dec080e302156a48ca907e47cb6aea1d32719e7233bfc89dcbd68c19fde6ce6158225298ec1131b6a130d1aeb454c1ab5183c0"
).expect("Private key not hex encoded");

KeyPair::new(public_key, private_key)
KeyPair::new(public_key, private_key).expect("Key pair mismatch")
}

/// Account ID used by default for demo purposes
Expand Down
9 changes: 5 additions & 4 deletions client/tests/integration/multisignature_transaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ fn multisignature_transactions_should_wait_for_all_signatures() {
&network.genesis.api_address,
&network.genesis.telemetry_address,
);
let mut iroha_client = Client::new(&client_configuration);
let mut iroha_client =
Client::new(&client_configuration).expect("Invalid client configuration");
iroha_client
.submit_all(vec![
create_domain.into(),
Expand All @@ -70,7 +71,7 @@ fn multisignature_transactions_should_wait_for_all_signatures() {
client_configuration.account_id = account_id.clone();
client_configuration.public_key = public_key1;
client_configuration.private_key = private_key1;
let iroha_client = Client::new(&client_configuration);
let iroha_client = Client::new(&client_configuration).expect("Invalid client configuration");
let instructions: Vec<Instruction> = vec![mint_asset.clone().into()];
let transaction = iroha_client
.build_transaction(instructions.into(), UnlimitedMetadata::new())
Expand All @@ -88,7 +89,7 @@ fn multisignature_transactions_should_wait_for_all_signatures() {
client_configuration.torii_api_url = small::SmallStr::from_string(
"http://".to_owned() + &network.peers.values().last().unwrap().api_address,
);
let iroha_client_1 = Client::new(&client_configuration);
let iroha_client_1 = Client::new(&client_configuration).expect("Invalid client configuration");
let request = client::asset::by_account_id(account_id);
assert!(iroha_client_1
.request(request.clone())
Expand All @@ -97,7 +98,7 @@ fn multisignature_transactions_should_wait_for_all_signatures() {
let (public_key2, private_key2) = key_pair_2.into();
client_configuration.public_key = public_key2;
client_configuration.private_key = private_key2;
let iroha_client_2 = Client::new(&client_configuration);
let iroha_client_2 = Client::new(&client_configuration).expect("Invalid client configuration");
let instructions: Vec<Instruction> = vec![mint_asset.into()];
let transaction = iroha_client_2
.build_transaction(instructions.into(), UnlimitedMetadata::new())
Expand Down
12 changes: 6 additions & 6 deletions client_cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ pub fn submit(
metadata: UnlimitedMetadata,
) -> Result<()> {
let instruction = instruction.into();
let iroha_client = Client::new(cfg);
let iroha_client = Client::new(cfg)?;
#[cfg(debug_assertions)]
let err_msg = format!(
"Failed to build transaction from instruction {:?}",
Expand Down Expand Up @@ -208,7 +208,7 @@ mod events {
}

pub fn listen(filter: EventFilter, cfg: &Configuration) -> Result<()> {
let mut iroha_client = Client::new(cfg);
let mut iroha_client = Client::new(cfg)?;
println!("Listening to events with filter: {:?}", filter);
for event in iroha_client
.listen_for_events(filter)
Expand Down Expand Up @@ -274,7 +274,7 @@ mod domain {

impl RunArgs for List {
fn run(self, cfg: &ClientConfiguration) -> Result<()> {
let client = Client::new(cfg);
let client = Client::new(cfg)?;

let vec = match self {
Self::All => client
Expand Down Expand Up @@ -398,7 +398,7 @@ mod account {

impl RunArgs for List {
fn run(self, cfg: &ClientConfiguration) -> Result<()> {
let client = Client::new(cfg);
let client = Client::new(cfg)?;

let vec = match self {
Self::All => client
Expand Down Expand Up @@ -560,7 +560,7 @@ mod asset {
impl RunArgs for Get {
fn run(self, cfg: &ClientConfiguration) -> Result<()> {
let Self { account, asset } = self;
let iroha_client = Client::new(cfg);
let iroha_client = Client::new(cfg)?;
let asset_id = AssetId::new(asset, account);
let value = iroha_client
.request(asset::by_id(asset_id))
Expand All @@ -579,7 +579,7 @@ mod asset {

impl RunArgs for List {
fn run(self, cfg: &ClientConfiguration) -> Result<()> {
let client = Client::new(cfg);
let client = Client::new(cfg)?;

let vec = match self {
Self::All => client
Expand Down
4 changes: 2 additions & 2 deletions core/src/genesis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ impl GenesisNetworkTrait for GenesisNetwork {
.account_private_key
.clone()
.ok_or_else(|| eyre!("Genesis account private key is empty."))?,
);
)?;

raw_transaction.sign_and_accept(genesis_key_pair, tx_limits)
})
Expand Down Expand Up @@ -364,7 +364,7 @@ pub mod config {
"d748e18ce60cb30dea3e73c9019b7af45a8d465e3d71bcc9a5ef99a008205e534cffd0ee429b1bdd36b3910ec570852b8bb63f18750341772fb46bc856c5caaf"
).expect("Private key not hex encoded");

KeyPair::new(public_key, private_key)
KeyPair::new(public_key, private_key).expect("Key pair mismatch")
}
}

Expand Down
2 changes: 1 addition & 1 deletion core/src/sumeragi/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ impl SumeragiConfiguration {
"282ed9f3cf92811c3818dbc4ae594ed59dc1a2f78e4241e31924e101d6b1fb831c61faf8fe94e253b93114240394f79a607b7fa55f9e5a41ebec74b88055768b"
).expect("Private key not hex encoded");

KeyPair::new(public_key, private_key)
KeyPair::new(public_key, private_key).expect("Key pair mismatch")
}

fn placeholder_peer_id() -> PeerId {
Expand Down
7 changes: 4 additions & 3 deletions core/test_network/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ pub fn get_key_pair() -> KeyPair {
Algorithm::Ed25519,
"9AC47ABF 59B356E0 BD7DCBBB B4DEC080 E302156A 48CA907E 47CB6AEA 1D32719E 7233BFC8 9DCBD68C 19FDE6CE 61582252 98EC1131 B6A130D1 AEB454C1 AB5183C0",
).expect("Private key not hex encoded")
)
).expect("Key pair mismatch")
}

/// Trait used to differentiate a test instance of `genesis`.
Expand Down Expand Up @@ -805,14 +805,15 @@ impl TestClientConfiguration for ClientConfiguration {
impl TestClient for Client {
fn test(api_url: &str, telemetry_url: &str) -> Self {
Client::new(&ClientConfiguration::test(api_url, telemetry_url))
.expect("Invalid client configuration")
}

fn test_with_key(api_url: &str, telemetry_url: &str, keys: KeyPair) -> Self {
let mut configuration = ClientConfiguration::test(api_url, telemetry_url);
let (public_key, private_key) = keys.into();
configuration.public_key = public_key;
configuration.private_key = private_key;
Client::new(&configuration)
Client::new(&configuration).expect("Invalid client configuration")
}

fn test_with_account(
Expand All @@ -826,7 +827,7 @@ impl TestClient for Client {
let (public_key, private_key) = keys.into();
configuration.public_key = public_key;
configuration.private_key = private_key;
Client::new(&configuration)
Client::new(&configuration).expect("Invalid client configuration")
}

fn for_each_event(mut self, event_filter: EventFilter, f: impl Fn(Result<Event>)) {
Expand Down
Loading

0 comments on commit df1f6a6

Please sign in to comment.