Skip to content

Commit dd19d96

Browse files
committed
Use Password type
* Add as_str and as_bytes methods to Password * Implement Default trait for Password
1 parent ce08135 commit dd19d96

File tree

19 files changed

+190
-148
lines changed

19 files changed

+190
-148
lines changed

codechain/account_command.rs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use std::str::FromStr;
2020
use rpassword;
2121

2222
use ccore::AccountProvider;
23-
use ckey::{FullAddress, Private};
23+
use ckey::{FullAddress, Password, Private};
2424
use ckeystore::accounts_dir::RootDiskDirectory;
2525
use ckeystore::KeyStore;
2626
use clap::ArgMatches;
@@ -46,7 +46,7 @@ pub fn run_account_command(matches: ArgMatches) -> Result<(), String> {
4646
match matches.subcommand() {
4747
("create", _) => {
4848
if let Some(password) = read_password_and_confirm() {
49-
let (address, _) = ap.new_account_and_public(password.as_ref()).expect("Cannot create account");
49+
let (address, _) = ap.new_account_and_public(&password).expect("Cannot create account");
5050
println!(
5151
"{}",
5252
FullAddress::create_version0(network_id, address).expect("The network id is hardcoded to 0x11")
@@ -60,8 +60,8 @@ pub fn run_account_command(matches: ArgMatches) -> Result<(), String> {
6060
let json_path = matches.value_of("JSON_PATH").expect("JSON_PATH arg is required and its index is 1");
6161
match fs::read(json_path) {
6262
Ok(json) => {
63-
let password = rpassword::prompt_password_stdout("Password: ").unwrap();
64-
match ap.import_wallet(json.as_slice(), password.as_ref()) {
63+
let password = prompt_password("Password: ");
64+
match ap.import_wallet(json.as_slice(), &password) {
6565
Ok(address) => {
6666
println!(
6767
"{}",
@@ -84,7 +84,7 @@ pub fn run_account_command(matches: ArgMatches) -> Result<(), String> {
8484
match Private::from_str(key) {
8585
Ok(private) => {
8686
if let Some(password) = read_password_and_confirm() {
87-
match ap.insert_account(private, password.as_ref()) {
87+
match ap.insert_account(private, &password) {
8888
Ok(address) => println!(
8989
"{}",
9090
FullAddress::create_version0(network_id, address)
@@ -114,8 +114,8 @@ pub fn run_account_command(matches: ArgMatches) -> Result<(), String> {
114114
let key = matches.value_of("ADDRESS").expect("ADDRESS arg is required and its index is 1");
115115
match FullAddress::from_str(key) {
116116
Ok(full_address) => {
117-
let password = rpassword::prompt_password_stdout("Password: ").unwrap();
118-
match ap.remove_account(full_address.address, password.as_ref()) {
117+
let password = prompt_password("Password: ");
118+
match ap.remove_account(full_address.address, &password) {
119119
Ok(_) => println!("{} is deleted", full_address),
120120
Err(e) => return Err(format!("{:?}", e)),
121121
}
@@ -128,9 +128,9 @@ pub fn run_account_command(matches: ArgMatches) -> Result<(), String> {
128128
let key = matches.value_of("ADDRESS").expect("ADDRESS arg is required and its index is 1");
129129
match FullAddress::from_str(key) {
130130
Ok(full_address) => {
131-
let old_password = rpassword::prompt_password_stdout("Old Password: ").unwrap();
131+
let old_password = prompt_password("Old Password: ");
132132
if let Some(new_password) = read_password_and_confirm() {
133-
match ap.change_password(full_address.address, old_password.as_ref(), new_password.as_ref()) {
133+
match ap.change_password(full_address.address, &old_password, &new_password) {
134134
Ok(_) => println!("Password has changed"),
135135
Err(e) => return Err(format!("{:?}", e)),
136136
}
@@ -146,11 +146,15 @@ pub fn run_account_command(matches: ArgMatches) -> Result<(), String> {
146146
}
147147
}
148148

149-
fn read_password_and_confirm() -> Option<String> {
149+
fn prompt_password(prompt: &str) -> Password {
150+
Password::from(rpassword::prompt_password_stdout(prompt).unwrap())
151+
}
152+
153+
fn read_password_and_confirm() -> Option<Password> {
150154
let first = rpassword::prompt_password_stdout("Password: ").unwrap();
151155
let second = rpassword::prompt_password_stdout("Confirm Password: ").unwrap();
152156
if first == second {
153-
Some(first)
157+
Some(Password::from(first))
154158
} else {
155159
None
156160
}

codechain/main.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ use ccore::{
6464
ShardValidatorConfig, Spec, Stratum, StratumConfig, StratumError,
6565
};
6666
use cdiscovery::{KademliaConfig, KademliaExtension, UnstructuredConfig, UnstructuredExtension};
67+
use ckey::Password;
6768
use ckeystore::accounts_dir::RootDiskDirectory;
6869
use ckeystore::KeyStore;
6970
use clap::ArgMatches;
@@ -154,7 +155,7 @@ fn new_shard_validator(config: ShardValidatorConfig, ap: Arc<AccountProvider>) -
154155
Some(password_path) => {
155156
let content = fs::read_to_string(password_path).map_err(|e| format!("{:?}", e))?;
156157
let password = content.lines().next().ok_or("Password file is empty")?;
157-
Some(password.to_string())
158+
Some(Password::from(password))
158159
}
159160
};
160161
Some((config.account, password))
@@ -230,7 +231,7 @@ fn new_miner(config: &config::Config, spec: &Spec, ap: Arc<AccountProvider>) ->
230231
// Read the first line as password.
231232
let password = content.lines().next().ok_or("Password file is empty")?;
232233
miner
233-
.set_engine_signer(engine_signer, password.to_string())
234+
.set_engine_signer(engine_signer, Password::from(password))
234235
.map_err(|e| format!("{:?}", e))?
235236
}
236237
Err(_) => return Err(format!("Failed to read the password file")),

core/src/account_provider.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ use std::fmt;
1818
use std::sync::Arc;
1919

2020
use ckey::{
21-
public_to_address, Address, Error as KeyError, Generator, KeyPair, Message, Private, Public, Random, Signature,
21+
public_to_address, Address, Error as KeyError, Generator, KeyPair, Message, Password, Private, Public, Random,
22+
Signature,
2223
};
2324
use ckeystore::accounts_dir::MemoryDirectory;
2425
use ckeystore::{Error as KeystoreError, KeyStore, SecretStore, SimpleSecretStore};
@@ -81,7 +82,7 @@ impl AccountProvider {
8182
})
8283
}
8384

84-
pub fn new_account_and_public(&self, password: &str) -> Result<(Address, Public), SignError> {
85+
pub fn new_account_and_public(&self, password: &Password) -> Result<(Address, Public), SignError> {
8586
let acc = Random.generate().expect("secp context has generation capabilities; qed");
8687
let private = acc.private().clone();
8788
let public = acc.public().clone();
@@ -90,7 +91,7 @@ impl AccountProvider {
9091
Ok((address, public))
9192
}
9293

93-
pub fn insert_account(&self, private: Private, password: &str) -> Result<Address, SignError> {
94+
pub fn insert_account(&self, private: Private, password: &Password) -> Result<Address, SignError> {
9495
let acc = KeyPair::from_private(private)?;
9596
let private = acc.private().clone();
9697
let public = acc.public().clone();
@@ -99,11 +100,11 @@ impl AccountProvider {
99100
Ok(address)
100101
}
101102

102-
pub fn remove_account(&self, address: Address, password: &str) -> Result<(), SignError> {
103+
pub fn remove_account(&self, address: Address, password: &Password) -> Result<(), SignError> {
103104
Ok(self.keystore.write().remove_account(&address, password)?)
104105
}
105106

106-
pub fn sign(&self, address: Address, password: Option<String>, message: Message) -> Result<Signature, SignError> {
107+
pub fn sign(&self, address: Address, password: Option<Password>, message: Message) -> Result<Signature, SignError> {
107108
match password {
108109
Some(password) => {
109110
let signature = self.keystore.read().sign(&address, &password, &message)?;
@@ -123,11 +124,16 @@ impl AccountProvider {
123124
Ok(addresses)
124125
}
125126

126-
pub fn import_wallet(&self, json: &[u8], password: &str) -> Result<Address, SignError> {
127+
pub fn import_wallet(&self, json: &[u8], password: &Password) -> Result<Address, SignError> {
127128
Ok(self.keystore.write().import_wallet(json, password, false)?)
128129
}
129130

130-
pub fn change_password(&self, address: Address, old_password: &str, new_password: &str) -> Result<(), SignError> {
131+
pub fn change_password(
132+
&self,
133+
address: Address,
134+
old_password: &Password,
135+
new_password: &Password,
136+
) -> Result<(), SignError> {
131137
Ok(self.keystore.read().change_password(&address, &old_password, &new_password)?)
132138
}
133139
}

core/src/consensus/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ pub use self::validator_set::ValidatorSet;
3737
use std::fmt;
3838
use std::sync::{Arc, Weak};
3939

40-
use ckey::{Address, Signature};
40+
use ckey::{Address, Password, Signature};
4141
use cnetwork::NetworkExtension;
4242
use ctypes::machine::Machine;
4343
use primitives::{Bytes, H256, U256};
@@ -215,7 +215,7 @@ pub trait ConsensusEngine<M: Machine>: Sync + Send {
215215
fn broadcast_proposal_block(&self, _block: SealedBlock) {}
216216

217217
/// Register an account which signs consensus messages.
218-
fn set_signer(&self, _ap: Arc<AccountProvider>, _address: Address, _password: String) {}
218+
fn set_signer(&self, _ap: Arc<AccountProvider>, _address: Address, _password: Password) {}
219219

220220
/// Sign using the EngineSigner, to be used for consensus parcel signing.
221221
fn sign(&self, _hash: H256) -> Result<Signature, Error> {

core/src/consensus/signer.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
use std::sync::Arc;
1818

19-
use ckey::{Address, Signature};
19+
use ckey::{Address, Password, Signature};
2020
use primitives::H256;
2121

2222
use super::super::account_provider::{AccountProvider, SignError};
@@ -25,7 +25,7 @@ use super::super::account_provider::{AccountProvider, SignError};
2525
pub struct EngineSigner {
2626
account_provider: Arc<AccountProvider>,
2727
address: Option<Address>,
28-
password: Option<String>,
28+
password: Option<Password>,
2929
}
3030

3131
impl Default for EngineSigner {
@@ -40,7 +40,7 @@ impl Default for EngineSigner {
4040

4141
impl EngineSigner {
4242
/// Set up the signer to sign with given address and password.
43-
pub fn set(&mut self, ap: Arc<AccountProvider>, address: Address, password: String) {
43+
pub fn set(&mut self, ap: Arc<AccountProvider>, address: Address, password: Password) {
4444
self.account_provider = ap;
4545
self.address = Some(address);
4646
self.password = Some(password);

core/src/consensus/solo_authority/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ mod params;
1818

1919
use std::sync::{Arc, Weak};
2020

21-
use ckey::{public_to_address, recover, Address, Signature};
21+
use ckey::{public_to_address, recover, Address, Password, Signature};
2222
use ctypes::machine::WithBalances;
2323
use parking_lot::RwLock;
2424
use primitives::{H256, U256};
@@ -186,7 +186,7 @@ impl ConsensusEngine<CodeChainMachine> for SoloAuthority {
186186
}
187187

188188
/// Register an account which signs consensus messages.
189-
fn set_signer(&self, ap: Arc<AccountProvider>, address: Address, password: String) {
189+
fn set_signer(&self, ap: Arc<AccountProvider>, address: Address, password: Password) {
190190
self.signer.write().set(ap, address, password);
191191
}
192192

core/src/consensus/tendermint/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use std::sync::atomic::{AtomicUsize, Ordering as AtomicOrdering};
2323
use std::sync::{Arc, Weak};
2424

2525
use ccrypto::blake256;
26-
use ckey::{public_to_address, recover, Address, Message, Signature};
26+
use ckey::{public_to_address, recover, Address, Message, Password, Signature};
2727
use cnetwork::{Api, NetworkExtension, NodeId, TimerToken};
2828
use ctypes::machine::WithBalances;
2929
use ctypes::BlockNumber;
@@ -720,7 +720,7 @@ impl ConsensusEngine<CodeChainMachine> for Tendermint {
720720
header.set_score(new_score);
721721
}
722722

723-
fn set_signer(&self, ap: Arc<AccountProvider>, address: Address, password: String) {
723+
fn set_signer(&self, ap: Arc<AccountProvider>, address: Address, password: Password) {
724724
{
725725
self.signer.write().set(ap, address, password);
726726
}

core/src/miner/miner.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use std::collections::HashSet;
1818
use std::sync::Arc;
1919
use std::time::{Duration, Instant};
2020

21-
use ckey::Address;
21+
use ckey::{Address, Password};
2222
use cstate::{StateError, TopLevelState};
2323
use ctypes::parcel::Error as ParcelError;
2424
use ctypes::BlockNumber;
@@ -543,7 +543,7 @@ impl MinerService for Miner {
543543
*self.extra_data.write() = extra_data;
544544
}
545545

546-
fn set_engine_signer(&self, address: Address, password: String) -> Result<(), SignError> {
546+
fn set_engine_signer(&self, address: Address, password: Password) -> Result<(), SignError> {
547547
if self.engine.seals_internally().is_some() {
548548
if let Some(ref ap) = self.accounts {
549549
ctrace!(MINER, "Set engine signer to {:?}", address);

core/src/miner/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ mod sealing_queue;
2121
mod stratum;
2222
mod work_notify;
2323

24-
use ckey::Address;
24+
use ckey::{Address, Password};
2525
use cstate::TopStateInfo;
2626
use primitives::{Bytes, H256, U256};
2727

@@ -55,7 +55,7 @@ pub trait MinerService: Send + Sync {
5555
fn set_extra_data(&self, extra_data: Bytes);
5656

5757
/// Set info necessary to sign consensus messages.
58-
fn set_engine_signer(&self, address: Address, password: String) -> Result<(), SignError>;
58+
fn set_engine_signer(&self, address: Address, password: Password) -> Result<(), SignError>;
5959

6060
/// Get current minimal fee for parcels accepted to queue.
6161
fn minimal_fee(&self) -> U256;

core/src/shard_validator/extension.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
use std::collections::{HashMap, HashSet};
1818
use std::sync::Arc;
1919

20-
use ckey::{Address, Signature};
20+
use ckey::{Address, Password, Signature};
2121
use cnetwork::{Api, NetworkExtension, NodeId};
2222
use ctypes::parcel::Action;
2323
use parking_lot::RwLock;
@@ -29,7 +29,7 @@ use super::client::ShardValidatorClient;
2929
use super::message::Message;
3030

3131
pub struct ShardValidator {
32-
account: Option<(Address, Option<String>)>,
32+
account: Option<(Address, Option<Password>)>,
3333
account_provider: Arc<AccountProvider>,
3434

3535
api: RwLock<Option<Arc<Api>>>,
@@ -46,7 +46,7 @@ enum RegisterActionOutcome {
4646
}
4747

4848
impl ShardValidator {
49-
pub fn new(account: Option<(Address, Option<String>)>, account_provider: Arc<AccountProvider>) -> Arc<Self> {
49+
pub fn new(account: Option<(Address, Option<Password>)>, account_provider: Arc<AccountProvider>) -> Arc<Self> {
5050
Arc::new(Self {
5151
account,
5252
account_provider,
@@ -62,7 +62,7 @@ fn register_action(
6262
action: Action,
6363
actions: &mut HashMap<H256, Action>,
6464
account_provider: &AccountProvider,
65-
account: &Option<(Address, Option<String>)>,
65+
account: &Option<(Address, Option<Password>)>,
6666
) -> Result<RegisterActionOutcome, AccountProviderError> {
6767
let action_hash = action.hash();
6868

0 commit comments

Comments
 (0)