@@ -18,7 +18,7 @@ use crate::constants::KeyGenType;
1818use crate :: context:: Context ;
1919use crate :: log:: LogExt ;
2020use crate :: pgp:: KeyPair ;
21- use crate :: tools:: { time , EmailAddress } ;
21+ use crate :: tools:: EmailAddress ;
2222
2323/// Convenience trait for working with keys.
2424///
@@ -82,10 +82,9 @@ pub(crate) async fn load_self_public_key(context: &Context) -> Result<SignedPubl
8282 match context
8383 . sql
8484 . 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')" ,
8988 ( ) ,
9089 |row| {
9190 let bytes: Vec < u8 > = row. get ( 0 ) ?;
@@ -106,10 +105,9 @@ pub(crate) async fn load_self_secret_key(context: &Context) -> Result<SignedSecr
106105 match context
107106 . sql
108107 . 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')" ,
113111 ( ) ,
114112 |row| {
115113 let bytes: Vec < u8 > = row. get ( 0 ) ?;
@@ -132,8 +130,7 @@ pub(crate) async fn load_self_secret_keyring(context: &Context) -> Result<Vec<Si
132130 . query_map (
133131 r#"SELECT private_key
134132 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"# ,
137134 ( ) ,
138135 |row| row. get :: < _ , Vec < u8 > > ( 0 ) ,
139136 |keys| keys. collect :: < Result < Vec < _ > , _ > > ( ) . map_err ( Into :: into) ,
@@ -233,13 +230,10 @@ pub(crate) async fn load_keypair(
233230 let res = context
234231 . sql
235232 . 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+ ( ) ,
243237 |row| {
244238 let pub_bytes: Vec < u8 > = row. get ( 0 ) ?;
245239 let sec_bytes: Vec < u8 > = row. get ( 1 ) ?;
@@ -288,42 +282,44 @@ pub async fn store_self_keypair(
288282 keypair : & KeyPair ,
289283 default : KeyPairUse ,
290284) -> Result < ( ) > {
291- context
285+ let mut config_cache_lock = context. sql . config_cache . write ( ) . await ;
286+ let new_key_id = context
292287 . sql
293288 . transaction ( |transaction| {
294289 let public_key = DcKey :: to_bytes ( & keypair. public ) ;
295290 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+
307292 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 ,
310295 } ;
311296
312- let addr = keypair. addr . to_string ( ) ;
313- let t = time ( ) ;
314-
315297 transaction
316298 . 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) ,
320302 )
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+ }
324315 } )
325316 . await ?;
326317
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+
327323 Ok ( ( ) )
328324}
329325
0 commit comments