@@ -18,7 +18,7 @@ use crate::constants::KeyGenType;
18
18
use crate :: context:: Context ;
19
19
use crate :: log:: LogExt ;
20
20
use crate :: pgp:: KeyPair ;
21
- use crate :: tools:: { time , EmailAddress } ;
21
+ use crate :: tools:: EmailAddress ;
22
22
23
23
/// Convenience trait for working with keys.
24
24
///
@@ -82,10 +82,9 @@ pub(crate) async fn load_self_public_key(context: &Context) -> Result<SignedPubl
82
82
match context
83
83
. sql
84
84
. query_row_optional (
85
- r#"SELECT public_key
86
- FROM keypairs
87
- WHERE addr=(SELECT value FROM config WHERE keyname="configured_addr")
88
- AND is_default=1"# ,
85
+ "SELECT public_key
86
+ FROM keypairs
87
+ WHERE id=(SELECT value FROM config WHERE keyname='key_id')" ,
89
88
( ) ,
90
89
|row| {
91
90
let bytes: Vec < u8 > = row. get ( 0 ) ?;
@@ -106,10 +105,9 @@ pub(crate) async fn load_self_secret_key(context: &Context) -> Result<SignedSecr
106
105
match context
107
106
. sql
108
107
. query_row_optional (
109
- r#"SELECT private_key
110
- FROM keypairs
111
- WHERE addr=(SELECT value FROM config WHERE keyname="configured_addr")
112
- AND is_default=1"# ,
108
+ "SELECT private_key
109
+ FROM keypairs
110
+ WHERE id=(SELECT value FROM config WHERE keyname='key_id')" ,
113
111
( ) ,
114
112
|row| {
115
113
let bytes: Vec < u8 > = row. get ( 0 ) ?;
@@ -132,8 +130,7 @@ pub(crate) async fn load_self_secret_keyring(context: &Context) -> Result<Vec<Si
132
130
. query_map (
133
131
r#"SELECT private_key
134
132
FROM keypairs
135
- WHERE addr=(SELECT value FROM config WHERE keyname="configured_addr")
136
- ORDER BY is_default DESC"# ,
133
+ ORDER BY id=(SELECT value FROM config WHERE keyname='key_id') DESC"# ,
137
134
( ) ,
138
135
|row| row. get :: < _ , Vec < u8 > > ( 0 ) ,
139
136
|keys| keys. collect :: < Result < Vec < _ > , _ > > ( ) . map_err ( Into :: into) ,
@@ -233,13 +230,10 @@ pub(crate) async fn load_keypair(
233
230
let res = context
234
231
. sql
235
232
. query_row_optional (
236
- r#"
237
- SELECT public_key, private_key
238
- FROM keypairs
239
- WHERE addr=?1
240
- AND is_default=1;
241
- "# ,
242
- ( addr, ) ,
233
+ "SELECT public_key, private_key
234
+ FROM keypairs
235
+ WHERE id=(SELECT value FROM config WHERE keyname='key_id')" ,
236
+ ( ) ,
243
237
|row| {
244
238
let pub_bytes: Vec < u8 > = row. get ( 0 ) ?;
245
239
let sec_bytes: Vec < u8 > = row. get ( 1 ) ?;
@@ -288,42 +282,44 @@ pub async fn store_self_keypair(
288
282
keypair : & KeyPair ,
289
283
default : KeyPairUse ,
290
284
) -> Result < ( ) > {
291
- context
285
+ let mut config_cache_lock = context. sql . config_cache . write ( ) . await ;
286
+ let new_key_id = context
292
287
. sql
293
288
. transaction ( |transaction| {
294
289
let public_key = DcKey :: to_bytes ( & keypair. public ) ;
295
290
let secret_key = DcKey :: to_bytes ( & keypair. secret ) ;
296
- transaction
297
- . execute (
298
- "DELETE FROM keypairs WHERE public_key=? OR private_key=?;" ,
299
- ( & public_key, & secret_key) ,
300
- )
301
- . context ( "failed to remove old use of key" ) ?;
302
- if default == KeyPairUse :: Default {
303
- transaction
304
- . execute ( "UPDATE keypairs SET is_default=0;" , ( ) )
305
- . context ( "failed to clear default" ) ?;
306
- }
291
+
307
292
let is_default = match default {
308
- KeyPairUse :: Default => i32 :: from ( true ) ,
309
- KeyPairUse :: ReadOnly => i32 :: from ( false ) ,
293
+ KeyPairUse :: Default => true ,
294
+ KeyPairUse :: ReadOnly => false ,
310
295
} ;
311
296
312
- let addr = keypair. addr . to_string ( ) ;
313
- let t = time ( ) ;
314
-
315
297
transaction
316
298
. execute (
317
- "INSERT INTO keypairs (addr, is_default, public_key, private_key, created )
318
- VALUES (?,?,?,?,?); " ,
319
- ( addr , is_default , & public_key, & secret_key, t ) ,
299
+ "INSERT OR REPLACE INTO keypairs (public_key, private_key)
300
+ VALUES (?,?) " ,
301
+ ( & public_key, & secret_key) ,
320
302
)
321
- . context ( "failed to insert keypair" ) ?;
322
-
323
- Ok ( ( ) )
303
+ . context ( "Failed to insert keypair" ) ?;
304
+
305
+ if is_default {
306
+ let new_key_id = transaction. last_insert_rowid ( ) ;
307
+ transaction. execute (
308
+ "INSERT OR REPLACE INTO config (keyname, value) VALUES ('key_id', ?)" ,
309
+ ( new_key_id, ) ,
310
+ ) ?;
311
+ Ok ( Some ( new_key_id) )
312
+ } else {
313
+ Ok ( None )
314
+ }
324
315
} )
325
316
. await ?;
326
317
318
+ if let Some ( new_key_id) = new_key_id {
319
+ // Update config cache if transaction succeeded and changed current default key.
320
+ config_cache_lock. insert ( "key_id" . to_string ( ) , Some ( new_key_id. to_string ( ) ) ) ;
321
+ }
322
+
327
323
Ok ( ( ) )
328
324
}
329
325
0 commit comments