@@ -52,10 +52,9 @@ use crate::auth::AuthError;
52
52
use crate :: auth:: consts:: * ;
53
53
use crate :: auth:: scope:: is_scopes;
54
54
use crate :: aws_common:: app_name;
55
- use crate :: database:: Database ;
56
- use crate :: database :: secret_store :: {
55
+ use crate :: database:: {
56
+ Database ,
57
57
Secret ,
58
- SecretStore ,
59
58
} ;
60
59
61
60
#[ derive( Debug , Copy , Clone , PartialEq , Eq , serde:: Serialize , serde:: Deserialize ) ]
@@ -123,8 +122,8 @@ impl DeviceRegistration {
123
122
}
124
123
125
124
/// Loads the OIDC registered client from the secret store, deleting it if it is expired.
126
- async fn load_from_secret_store ( secret_store : & SecretStore , region : & Region ) -> Result < Option < Self > , AuthError > {
127
- let device_registration = secret_store . get ( Self :: SECRET_KEY ) . await ?;
125
+ async fn load_from_secret_store ( database : & Database , region : & Region ) -> Result < Option < Self > , AuthError > {
126
+ let device_registration = database . get_secret ( Self :: SECRET_KEY ) . await ?;
128
127
129
128
if let Some ( device_registration) = device_registration {
130
129
// check that the data is not expired, assume it is invalid if not present
@@ -138,7 +137,7 @@ impl DeviceRegistration {
138
137
}
139
138
140
139
// delete the data if its expired or invalid
141
- if let Err ( err) = secret_store . delete ( Self :: SECRET_KEY ) . await {
140
+ if let Err ( err) = database . delete_secret ( Self :: SECRET_KEY ) . await {
142
141
error ! ( ?err, "Failed to delete device registration from keychain" ) ;
143
142
}
144
143
@@ -152,7 +151,7 @@ impl DeviceRegistration {
152
151
client : & Client ,
153
152
region : & Region ,
154
153
) -> Result < Self , AuthError > {
155
- match Self :: load_from_secret_store ( & database. secret_store , region) . await {
154
+ match Self :: load_from_secret_store ( database, region) . await {
156
155
Ok ( Some ( registration) ) if registration. oauth_flow == OAuthFlow :: DeviceCode => match & registration. scopes {
157
156
Some ( scopes) if is_scopes ( scopes) => return Ok ( registration) ,
158
157
_ => warn ! ( "Invalid scopes in device registration, ignoring" ) ,
@@ -181,17 +180,17 @@ impl DeviceRegistration {
181
180
SCOPES . iter ( ) . map ( |s| ( * s) . to_owned ( ) ) . collect ( ) ,
182
181
) ;
183
182
184
- if let Err ( err) = device_registration. save ( & database. secret_store ) . await {
183
+ if let Err ( err) = device_registration. save ( database) . await {
185
184
error ! ( ?err, "Failed to write device registration to keychain" ) ;
186
185
}
187
186
188
187
Ok ( device_registration)
189
188
}
190
189
191
190
/// Saves to the passed secret store.
192
- pub async fn save ( & self , secret_store : & SecretStore ) -> Result < ( ) , AuthError > {
191
+ pub async fn save ( & self , secret_store : & Database ) -> Result < ( ) , AuthError > {
193
192
secret_store
194
- . set ( Self :: SECRET_KEY , & serde_json:: to_string ( & self ) ?)
193
+ . set_secret ( Self :: SECRET_KEY , & serde_json:: to_string ( & self ) ?)
195
194
. await ?;
196
195
Ok ( ( ) )
197
196
}
@@ -285,8 +284,8 @@ impl BuilderIdToken {
285
284
}
286
285
287
286
/// Load the token from the keychain, refresh the token if it is expired and return it
288
- pub async fn load ( database : & mut Database ) -> Result < Option < Self > , AuthError > {
289
- match database. secret_store . get ( Self :: SECRET_KEY ) . await {
287
+ pub async fn load ( database : & Database ) -> Result < Option < Self > , AuthError > {
288
+ match database. get_secret ( Self :: SECRET_KEY ) . await {
290
289
Ok ( Some ( secret) ) => {
291
290
let token: Option < Self > = serde_json:: from_str ( & secret. 0 ) ?;
292
291
match token {
@@ -296,7 +295,7 @@ impl BuilderIdToken {
296
295
let client = client ( region. clone ( ) ) ;
297
296
// if token is expired try to refresh
298
297
if token. is_expired ( ) {
299
- token. refresh_token ( & client, & database. secret_store , & region) . await
298
+ token. refresh_token ( & client, database, & region) . await
300
299
} else {
301
300
Ok ( Some ( token) )
302
301
}
@@ -316,19 +315,19 @@ impl BuilderIdToken {
316
315
pub async fn refresh_token (
317
316
& self ,
318
317
client : & Client ,
319
- secret_store : & SecretStore ,
318
+ database : & Database ,
320
319
region : & Region ,
321
320
) -> Result < Option < Self > , AuthError > {
322
321
let Some ( refresh_token) = & self . refresh_token else {
323
322
// if the token is expired and has no refresh token, delete it
324
- if let Err ( err) = self . delete ( secret_store ) . await {
323
+ if let Err ( err) = self . delete ( database ) . await {
325
324
error ! ( ?err, "Failed to delete builder id token" ) ;
326
325
}
327
326
328
327
return Ok ( None ) ;
329
328
} ;
330
329
331
- let registration = match DeviceRegistration :: load_from_secret_store ( secret_store , region) . await ? {
330
+ let registration = match DeviceRegistration :: load_from_secret_store ( database , region) . await ? {
332
331
Some ( registration) if registration. oauth_flow == self . oauth_flow => registration,
333
332
// If the OIDC client registration is for a different oauth flow or doesn't exist, then
334
333
// we can't refresh the token.
@@ -365,7 +364,7 @@ impl BuilderIdToken {
365
364
) ;
366
365
debug ! ( "Refreshed access token, new token: {:?}" , token) ;
367
366
368
- if let Err ( err) = token. save ( secret_store ) . await {
367
+ if let Err ( err) = token. save ( database ) . await {
369
368
error ! ( ?err, "Failed to store builder id access token" ) ;
370
369
} ;
371
370
@@ -378,7 +377,7 @@ impl BuilderIdToken {
378
377
// if the error is the client's fault, clear the token
379
378
if let SdkError :: ServiceError ( service_err) = & err {
380
379
if !service_err. err ( ) . is_slow_down_exception ( ) {
381
- if let Err ( err) = self . delete ( secret_store ) . await {
380
+ if let Err ( err) = self . delete ( database ) . await {
382
381
error ! ( ?err, "Failed to delete builder id token" ) ;
383
382
}
384
383
}
@@ -398,16 +397,16 @@ impl BuilderIdToken {
398
397
}
399
398
400
399
/// Save the token to the keychain
401
- pub async fn save ( & self , secret_store : & SecretStore ) -> Result < ( ) , AuthError > {
402
- secret_store
403
- . set ( Self :: SECRET_KEY , & serde_json:: to_string ( self ) ?)
400
+ pub async fn save ( & self , database : & Database ) -> Result < ( ) , AuthError > {
401
+ database
402
+ . set_secret ( Self :: SECRET_KEY , & serde_json:: to_string ( self ) ?)
404
403
. await ?;
405
404
Ok ( ( ) )
406
405
}
407
406
408
407
/// Delete the token from the keychain
409
- pub async fn delete ( & self , secret_store : & SecretStore ) -> Result < ( ) , AuthError > {
410
- secret_store . delete ( Self :: SECRET_KEY ) . await ?;
408
+ pub async fn delete ( & self , database : & Database ) -> Result < ( ) , AuthError > {
409
+ database . delete_secret ( Self :: SECRET_KEY ) . await ?;
411
410
Ok ( ( ) )
412
411
}
413
412
@@ -479,7 +478,7 @@ pub async fn poll_create_token(
479
478
let token: BuilderIdToken =
480
479
BuilderIdToken :: from_output ( output, region, start_url, OAuthFlow :: DeviceCode , scopes) ;
481
480
482
- if let Err ( err) = token. save ( & database. secret_store ) . await {
481
+ if let Err ( err) = token. save ( database) . await {
483
482
error ! ( ?err, "Failed to store builder id token" ) ;
484
483
} ;
485
484
@@ -500,13 +499,13 @@ pub async fn is_logged_in(database: &mut Database) -> bool {
500
499
}
501
500
502
501
pub async fn logout ( database : & mut Database ) -> Result < ( ) , AuthError > {
503
- let Ok ( secret_store) = SecretStore :: new ( ) . await else {
502
+ let Ok ( secret_store) = Database :: new ( ) . await else {
504
503
return Ok ( ( ) ) ;
505
504
} ;
506
505
507
506
let ( builder_res, device_res) = tokio:: join!(
508
- secret_store. delete ( BuilderIdToken :: SECRET_KEY ) ,
509
- secret_store. delete ( DeviceRegistration :: SECRET_KEY ) ,
507
+ secret_store. delete_secret ( BuilderIdToken :: SECRET_KEY ) ,
508
+ secret_store. delete_secret ( DeviceRegistration :: SECRET_KEY ) ,
510
509
) ;
511
510
512
511
let profile_res = database. unset_auth_profile ( ) ;
0 commit comments