@@ -163,8 +163,8 @@ impl TryFrom<Vec<u8>> for ResolverStatePb {
163
163
}
164
164
}
165
165
166
- fn timestamp_to_datetime ( ts : & Timestamp ) -> Option < DateTime < Utc > > {
167
- DateTime :: from_timestamp ( ts. seconds , ts. nanos as u32 )
166
+ fn timestamp_to_datetime ( ts : & Timestamp ) -> Fallible < DateTime < Utc > > {
167
+ DateTime :: from_timestamp ( ts. seconds , ts. nanos as u32 ) . or_fail ( )
168
168
}
169
169
fn datetime_to_timestamp ( dt : & DateTime < Utc > ) -> Timestamp {
170
170
Timestamp {
@@ -233,7 +233,7 @@ impl ResolverState {
233
233
}
234
234
// missing bitset treated as full
235
235
flags_admin:: resolver_state:: packed_bitset:: Bitset :: FullBitset ( true ) => ( ) ,
236
- _ => return Err ( ErrorCode :: from_location ( ) ) ,
236
+ _ => fail ! ( ) ,
237
237
}
238
238
}
239
239
for client in state_pb. clients {
@@ -273,12 +273,13 @@ impl ResolverState {
273
273
client_secret : & str ,
274
274
evaluation_context : & str ,
275
275
encryption_key : & Bytes ,
276
- ) -> Option < AccountResolver < ' a , H > > {
276
+ ) -> Result < AccountResolver < ' a , H > , String > {
277
277
self . get_resolver (
278
278
client_secret,
279
279
// allow this unwrap cause it only happens in std
280
280
#[ allow( clippy:: unwrap_used) ]
281
- serde_json:: from_str ( evaluation_context) . unwrap ( ) ,
281
+ serde_json:: from_str ( evaluation_context)
282
+ . map_err ( |_| "failed to parse evaluation context" . to_string ( ) ) ?,
282
283
encryption_key,
283
284
)
284
285
}
@@ -288,17 +289,20 @@ impl ResolverState {
288
289
client_secret : & str ,
289
290
evaluation_context : Struct ,
290
291
encryption_key : & Bytes ,
291
- ) -> Option < AccountResolver < ' a , H > > {
292
- self . secrets . get ( client_secret) . map ( |client| {
293
- AccountResolver :: new (
294
- client,
295
- self ,
296
- EvaluationContext {
297
- context : evaluation_context,
298
- } ,
299
- encryption_key,
300
- )
301
- } )
292
+ ) -> Result < AccountResolver < ' a , H > , String > {
293
+ self . secrets
294
+ . get ( client_secret)
295
+ . ok_or ( "client secret not found" . to_string ( ) )
296
+ . map ( |client| {
297
+ AccountResolver :: new (
298
+ client,
299
+ self ,
300
+ EvaluationContext {
301
+ context : evaluation_context,
302
+ } ,
303
+ encryption_key,
304
+ )
305
+ } )
302
306
}
303
307
}
304
308
@@ -416,59 +420,56 @@ pub trait Host {
416
420
) -> Result < Vec < u8 > , String > {
417
421
#[ cfg( feature = "std" ) ]
418
422
{
419
- const ENCRYPTION_WRITE_BUFFER_SIZE : usize = 4096 ;
420
-
421
- use crypto:: { aes, blockmodes, buffer} ;
422
-
423
- let mut iv = [ 0u8 ; 16 ] ;
424
- iv. copy_from_slice (
425
- encrypted_data
426
- . get ( 0 ..16 )
427
- . ok_or ( "Failed to decrypt resolve token" ) ?,
428
- ) ;
423
+ {
424
+ const ENCRYPTION_WRITE_BUFFER_SIZE : usize = 4096 ;
429
425
430
- let mut decryptor = aes:: cbc_decryptor (
431
- aes:: KeySize :: KeySize128 ,
432
- & iv,
433
- encryption_key,
434
- blockmodes:: PkcsPadding ,
435
- ) ;
426
+ use crypto:: { aes, blockmodes, buffer} ;
436
427
437
- let encrypted_token_read_buffer = & mut buffer:: RefReadBuffer :: new (
438
- encrypted_data
439
- . get ( 16 ..)
440
- . ok_or ( "Failed to decrypt resolve token" ) ?,
441
- ) ;
442
- let mut write_buffer = [ 0 ; ENCRYPTION_WRITE_BUFFER_SIZE ] ;
443
- let encrypted_token_write_buffer = & mut buffer:: RefWriteBuffer :: new ( & mut write_buffer) ;
428
+ let mut iv = [ 0u8 ; 16 ] ;
429
+ iv. copy_from_slice ( encrypted_data. get ( 0 ..16 ) . or_fail ( ) ?) ;
444
430
445
- let mut final_decrypted_token = Vec :: < u8 > :: new ( ) ;
446
- loop {
447
- use crypto:: buffer:: { BufferResult , ReadBuffer , WriteBuffer } ;
448
-
449
- let result = decryptor
450
- . decrypt (
451
- encrypted_token_read_buffer,
452
- encrypted_token_write_buffer,
453
- true ,
454
- )
455
- . map_err ( |_| "Failed to decrypt resolve token" ) ?;
456
-
457
- final_decrypted_token. extend (
458
- encrypted_token_write_buffer
459
- . take_read_buffer ( )
460
- . take_remaining ( )
461
- . iter ( )
462
- . copied ( ) ,
431
+ let mut decryptor = aes:: cbc_decryptor (
432
+ aes:: KeySize :: KeySize128 ,
433
+ & iv,
434
+ encryption_key,
435
+ blockmodes:: PkcsPadding ,
463
436
) ;
464
437
465
- match result {
466
- BufferResult :: BufferUnderflow => break ,
467
- BufferResult :: BufferOverflow => { }
438
+ let encrypted_token_read_buffer =
439
+ & mut buffer:: RefReadBuffer :: new ( encrypted_data. get ( 16 ..) . or_fail ( ) ?) ;
440
+ let mut write_buffer = [ 0 ; ENCRYPTION_WRITE_BUFFER_SIZE ] ;
441
+ let encrypted_token_write_buffer =
442
+ & mut buffer:: RefWriteBuffer :: new ( & mut write_buffer) ;
443
+
444
+ let mut final_decrypted_token = Vec :: < u8 > :: new ( ) ;
445
+ loop {
446
+ use crypto:: buffer:: { BufferResult , ReadBuffer , WriteBuffer } ;
447
+
448
+ let result = decryptor
449
+ . decrypt (
450
+ encrypted_token_read_buffer,
451
+ encrypted_token_write_buffer,
452
+ true ,
453
+ )
454
+ . or_fail ( ) ?;
455
+
456
+ final_decrypted_token. extend (
457
+ encrypted_token_write_buffer
458
+ . take_read_buffer ( )
459
+ . take_remaining ( )
460
+ . iter ( )
461
+ . copied ( ) ,
462
+ ) ;
463
+
464
+ match result {
465
+ BufferResult :: BufferUnderflow => break ,
466
+ BufferResult :: BufferOverflow => { }
467
+ }
468
468
}
469
- }
470
469
471
- Ok ( final_decrypted_token)
470
+ Ok ( final_decrypted_token)
471
+ }
472
+ . map_err ( |e : ErrorCode | format ! ( "failed to decrypt resolve token [{}]" , e. b64_str( ) ) )
472
473
}
473
474
474
475
#[ cfg( not( feature = "std" ) ) ]
@@ -477,7 +478,7 @@ pub trait Host {
477
478
if encryption_key. iter ( ) . all ( |& b| b == 0 ) {
478
479
Ok ( encrypted_data. to_vec ( ) )
479
480
} else {
480
- Err ( "Decryption not available in no_std mode" . into ( ) )
481
+ Err ( "decryption not available in no_std mode" . into ( ) )
481
482
}
482
483
}
483
484
}
@@ -525,7 +526,7 @@ impl<'a, H: Host> AccountResolver<'a, H> {
525
526
526
527
if flags_to_resolve. len ( ) > MAX_NO_OF_FLAGS_TO_BATCH_RESOLVE {
527
528
return Err ( format ! (
528
- "Max {} flags allowed in a single resolve request, this request would return {} flags." ,
529
+ "max {} flags allowed in a single resolve request, this request would return {} flags." ,
529
530
MAX_NO_OF_FLAGS_TO_BATCH_RESOLVE ,
530
531
flags_to_resolve. len( ) ) ) ;
531
532
}
@@ -611,7 +612,7 @@ impl<'a, H: Host> AccountResolver<'a, H> {
611
612
pub fn apply_flags ( & self , request : & flags_resolver:: ApplyFlagsRequest ) -> Result < ( ) , String > {
612
613
let send_time_ts = request. send_time . as_ref ( ) . ok_or ( "send_time is required" ) ?;
613
614
let send_time = to_date_time_utc ( send_time_ts) . ok_or ( "invalid send_time" ) ?;
614
- let receive_time: DateTime < Utc > = timestamp_to_datetime ( & H :: current_time ( ) ) . or_fail ( ) ?;
615
+ let receive_time: DateTime < Utc > = timestamp_to_datetime ( & H :: current_time ( ) ) ?;
615
616
616
617
let resolve_token_outer = self . decrypt_resolve_token ( & request. resolve_token ) ?;
617
618
let Some ( flags_resolver:: resolve_token:: ResolveToken :: TokenV1 ( resolve_token) ) =
@@ -671,14 +672,15 @@ impl<'a, H: Host> AccountResolver<'a, H> {
671
672
_ => Err ( "TargetingKeyError" . to_string ( ) ) ,
672
673
}
673
674
}
674
- pub fn resolve_flag_name ( & ' a self , flag_name : & str ) -> Option < Fallible < ResolvedValue < ' a > > > {
675
+ pub fn resolve_flag_name ( & ' a self , flag_name : & str ) -> Result < ResolvedValue < ' a > , String > {
675
676
self . state
676
677
. flags
677
678
. get ( flag_name)
678
- . map ( |flag| self . resolve_flag ( flag) )
679
+ . ok_or ( "flag not found" . to_string ( ) )
680
+ . and_then ( |flag| self . resolve_flag ( flag) )
679
681
}
680
682
681
- pub fn resolve_flag ( & ' a self , flag : & ' a Flag ) -> Fallible < ResolvedValue < ' a > > {
683
+ pub fn resolve_flag ( & ' a self , flag : & ' a Flag ) -> Result < ResolvedValue < ' a > , String > {
682
684
let mut resolved_value = ResolvedValue :: new ( flag) ;
683
685
684
686
if flag. state == flags_admin:: flag:: State :: Archived as i32 {
@@ -889,9 +891,7 @@ impl<'a, H: Host> AccountResolver<'a, H> {
889
891
resolve_token : & flags_resolver:: ResolveToken ,
890
892
) -> Result < Vec < u8 > , String > {
891
893
let mut token_buf = Vec :: with_capacity ( resolve_token. encoded_len ( ) ) ;
892
- resolve_token
893
- . encode ( & mut token_buf)
894
- . map_err ( |_| "encrypt resolve token failed" ) ?;
894
+ resolve_token. encode ( & mut token_buf) . or_fail ( ) ?;
895
895
896
896
H :: encrypt_resolve_token ( & token_buf, & self . encryption_key )
897
897
}
@@ -902,8 +902,8 @@ impl<'a, H: Host> AccountResolver<'a, H> {
902
902
) -> Result < flags_resolver:: ResolveToken , String > {
903
903
let decrypted_data = H :: decrypt_resolve_token ( encrypted_token, & self . encryption_key ) ?;
904
904
905
- flags_resolver:: ResolveToken :: decode ( & decrypted_data[ ..] )
906
- . map_err ( |e| format ! ( "Failed to decode resolve token: {}" , e ) )
905
+ let t = flags_resolver:: ResolveToken :: decode ( & decrypted_data[ ..] ) . or_fail ( ) ? ;
906
+ Ok ( t )
907
907
}
908
908
}
909
909
0 commit comments