@@ -11,7 +11,6 @@ use primitives::{
11
11
} ;
12
12
use serde:: { Deserialize , Serialize } ;
13
13
use serde_json:: Value ;
14
- use std:: cell:: RefCell ;
15
14
use std:: collections:: HashMap ;
16
15
use std:: error:: Error ;
17
16
use std:: fs;
@@ -39,10 +38,10 @@ pub struct EthereumAdapter {
39
38
keystore_pwd : Password ,
40
39
config : Config ,
41
40
// Auth tokens that we have verified (tokenId => session)
42
- session_tokens : RefCell < HashMap < String , Session > > ,
41
+ session_tokens : HashMap < String , Session > ,
43
42
// Auth tokens that we've generated to authenticate with someone (address => token)
44
- authorization_tokens : RefCell < HashMap < String , String > > ,
45
- wallet : RefCell < Option < SafeAccount > > ,
43
+ authorization_tokens : HashMap < String , String > ,
44
+ wallet : Option < SafeAccount > ,
46
45
}
47
46
48
47
// Enables EthereumAdapter to be able to
@@ -81,14 +80,14 @@ impl Adapter for EthereumAdapter {
81
80
address,
82
81
keystore_json,
83
82
keystore_pwd : keystore_pwd. into ( ) ,
84
- session_tokens : RefCell :: new ( HashMap :: new ( ) ) ,
85
- authorization_tokens : RefCell :: new ( HashMap :: new ( ) ) ,
86
- wallet : RefCell :: new ( None ) ,
83
+ session_tokens : HashMap :: new ( ) ,
84
+ authorization_tokens : HashMap :: new ( ) ,
85
+ wallet : None ,
87
86
config : config. to_owned ( ) ,
88
87
} )
89
88
}
90
89
91
- fn unlock ( & self ) -> AdapterResult < ( ) > {
90
+ fn unlock ( & mut self ) -> AdapterResult < ( ) > {
92
91
let account = SafeAccount :: from_file (
93
92
serde_json:: from_value ( self . keystore_json . clone ( ) )
94
93
. map_err ( |_| map_error ( "Invalid keystore json provided" ) ) ?,
@@ -97,7 +96,7 @@ impl Adapter for EthereumAdapter {
97
96
)
98
97
. map_err ( |_| map_error ( "Failed to create account" ) ) ?;
99
98
100
- self . wallet . replace ( Some ( account) ) ;
99
+ self . wallet = Some ( account) ;
101
100
102
101
Ok ( ( ) )
103
102
}
@@ -107,18 +106,18 @@ impl Adapter for EthereumAdapter {
107
106
}
108
107
109
108
fn sign ( & self , state_root : & str ) -> AdapterResult < String > {
110
- let message = Message :: from_slice ( & hash_message ( state_root ) ) ;
111
- match self . wallet . borrow ( ) . clone ( ) {
112
- Some ( wallet ) => {
113
- let wallet_sign = wallet
114
- . sign ( & self . keystore_pwd , & message )
115
- . map_err ( |_| map_error ( "failed to sign messages" ) ) ? ;
116
- let signature : Signature = wallet_sign . into_electrum ( ) . into ( ) ;
117
- Ok ( format ! ( "0x{}" , signature) )
118
- }
119
- None => Err ( AdapterError :: Configuration (
109
+ if let Some ( wallet ) = & self . wallet {
110
+ let message = Message :: from_slice ( & hash_message ( state_root ) ) ;
111
+ let wallet_sign = wallet
112
+ . sign ( & self . keystore_pwd , & message )
113
+ . map_err ( |_| map_error ( "failed to sign messages" ) ) ? ;
114
+ let signature : Signature = wallet_sign . into_electrum ( ) . into ( ) ;
115
+
116
+ Ok ( format ! ( "0x{}" , signature) )
117
+ } else {
118
+ Err ( AdapterError :: Configuration (
120
119
"Unlock the wallet before signing" . to_string ( ) ,
121
- ) ) ,
120
+ ) )
122
121
}
123
122
}
124
123
@@ -136,7 +135,7 @@ impl Adapter for EthereumAdapter {
136
135
let signature = Signature :: from_electrum ( & decoded_signature) ;
137
136
let message = Message :: from_slice ( & hash_message ( state_root) ) ;
138
137
139
- verify_address ( & address, & signature, & message) . or ( Ok ( false ) )
138
+ verify_address ( & address, & signature, & message) . or_else ( |_| Ok ( false ) )
140
139
}
141
140
142
141
fn validate_channel ( & self , channel : & Channel ) -> AdapterResult < bool > {
@@ -179,15 +178,14 @@ impl Adapter for EthereumAdapter {
179
178
Ok ( true )
180
179
}
181
180
182
- fn session_from_token ( & self , token : & str ) -> AdapterResult < Session > {
181
+ fn session_from_token ( & mut self , token : & str ) -> AdapterResult < Session > {
183
182
if token. len ( ) < 16 {
184
183
return Err ( AdapterError :: Failed ( "invaild token id" . to_string ( ) ) ) ;
185
184
}
186
185
187
186
let token_id = token[ token. len ( ) - 16 ..] . to_string ( ) ;
188
187
189
- let mut session_tokens = self . session_tokens . borrow_mut ( ) ;
190
- if let Some ( token) = session_tokens. get ( & token_id) {
188
+ if let Some ( token) = self . session_tokens . get ( & token_id) {
191
189
return Ok ( token. to_owned ( ) ) ;
192
190
}
193
191
@@ -241,29 +239,27 @@ impl Adapter for EthereumAdapter {
241
239
} ,
242
240
} ;
243
241
244
- session_tokens. insert ( token_id, sess. clone ( ) ) ;
242
+ self . session_tokens . insert ( token_id, sess. clone ( ) ) ;
245
243
Ok ( sess)
246
244
}
247
245
248
- fn get_auth ( & self , validator : & ValidatorDesc ) -> AdapterResult < String > {
249
- let mut authorization_tokens = self . authorization_tokens . borrow_mut ( ) ;
250
- match (
251
- self . wallet . borrow ( ) . clone ( ) ,
252
- authorization_tokens. get ( & validator. id ) ,
253
- ) {
246
+ fn get_auth ( & mut self , validator_id : & str ) -> AdapterResult < String > {
247
+ let validator = validator_id. to_owned ( ) ;
248
+ match ( & self . wallet , self . authorization_tokens . get ( & validator) ) {
254
249
( Some ( _) , Some ( token) ) => Ok ( token. to_owned ( ) ) ,
255
250
( Some ( wallet) , None ) => {
256
251
let era = Utc :: now ( ) . timestamp ( ) as f64 / 60000.0 ;
257
252
let payload = Payload {
258
- id : validator. id . clone ( ) ,
253
+ id : validator. clone ( ) ,
259
254
era : era. floor ( ) as i64 ,
260
255
identity : None ,
261
256
address : None ,
262
257
} ;
263
- let token = ewt_sign ( & wallet, & self . keystore_pwd , & payload)
258
+ let token = ewt_sign ( wallet, & self . keystore_pwd , & payload)
264
259
. map_err ( |_| map_error ( "Failed to sign token" ) ) ?;
265
260
266
- authorization_tokens. insert ( validator. id . clone ( ) , token. clone ( ) ) ;
261
+ self . authorization_tokens
262
+ . insert ( validator. clone ( ) , token. clone ( ) ) ;
267
263
268
264
Ok ( token)
269
265
}
@@ -420,7 +416,7 @@ mod test {
420
416
421
417
#[ test]
422
418
fn should_init_and_unlock_ethereum_adapter ( ) {
423
- let eth_adapter = setup_eth_adapter ( ) ;
419
+ let mut eth_adapter = setup_eth_adapter ( ) ;
424
420
let unlock = eth_adapter. unlock ( ) . expect ( "should unlock eth adapter" ) ;
425
421
426
422
assert_eq ! ( ( ) , unlock, "failed to unlock eth adapter" ) ;
@@ -429,7 +425,7 @@ mod test {
429
425
#[ test]
430
426
fn should_get_whoami_sign_and_verify_messages ( ) {
431
427
// whoami
432
- let eth_adapter = setup_eth_adapter ( ) ;
428
+ let mut eth_adapter = setup_eth_adapter ( ) ;
433
429
let whoami = eth_adapter. whoami ( ) ;
434
430
assert_eq ! (
435
431
whoami, "0x2bDeAFAE53940669DaA6F519373f686c1f3d3393" ,
@@ -460,7 +456,7 @@ mod test {
460
456
461
457
#[ test]
462
458
fn should_generate_correct_ewt_sign_and_verify ( ) {
463
- let eth_adapter = setup_eth_adapter ( ) ;
459
+ let mut eth_adapter = setup_eth_adapter ( ) ;
464
460
eth_adapter. unlock ( ) . expect ( "should unlock eth adapter" ) ;
465
461
466
462
let payload = Payload {
@@ -469,7 +465,7 @@ mod test {
469
465
address : Some ( eth_adapter. whoami ( ) ) ,
470
466
identity : None ,
471
467
} ;
472
- let wallet = eth_adapter. wallet . borrow ( ) . clone ( ) ;
468
+ let wallet = eth_adapter. wallet . clone ( ) ;
473
469
let response = ewt_sign ( & wallet. unwrap ( ) , & eth_adapter. keystore_pwd , & payload)
474
470
. expect ( "failed to generate ewt signature" ) ;
475
471
let expected =
0 commit comments