@@ -163,8 +163,8 @@ impl TryFrom<Vec<u8>> for ResolverStatePb {
163163 }
164164}
165165
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 ( )
168168}
169169fn datetime_to_timestamp ( dt : & DateTime < Utc > ) -> Timestamp {
170170 Timestamp {
@@ -233,7 +233,7 @@ impl ResolverState {
233233 }
234234 // missing bitset treated as full
235235 flags_admin:: resolver_state:: packed_bitset:: Bitset :: FullBitset ( true ) => ( ) ,
236- _ => return Err ( ErrorCode :: from_location ( ) ) ,
236+ _ => fail ! ( ) ,
237237 }
238238 }
239239 for client in state_pb. clients {
@@ -273,12 +273,13 @@ impl ResolverState {
273273 client_secret : & str ,
274274 evaluation_context : & str ,
275275 encryption_key : & Bytes ,
276- ) -> Option < AccountResolver < ' a , H > > {
276+ ) -> Result < AccountResolver < ' a , H > , String > {
277277 self . get_resolver (
278278 client_secret,
279279 // allow this unwrap cause it only happens in std
280280 #[ 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 ( ) ) ?,
282283 encryption_key,
283284 )
284285 }
@@ -288,17 +289,20 @@ impl ResolverState {
288289 client_secret : & str ,
289290 evaluation_context : Struct ,
290291 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+ } )
302306 }
303307}
304308
@@ -416,59 +420,56 @@ pub trait Host {
416420 ) -> Result < Vec < u8 > , String > {
417421 #[ cfg( feature = "std" ) ]
418422 {
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 ;
429425
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} ;
436427
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 ( ) ?) ;
444430
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 ,
463436 ) ;
464437
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+ }
468468 }
469- }
470469
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( ) ) )
472473 }
473474
474475 #[ cfg( not( feature = "std" ) ) ]
@@ -477,7 +478,7 @@ pub trait Host {
477478 if encryption_key. iter ( ) . all ( |& b| b == 0 ) {
478479 Ok ( encrypted_data. to_vec ( ) )
479480 } else {
480- Err ( "Decryption not available in no_std mode" . into ( ) )
481+ Err ( "decryption not available in no_std mode" . into ( ) )
481482 }
482483 }
483484 }
@@ -525,7 +526,7 @@ impl<'a, H: Host> AccountResolver<'a, H> {
525526
526527 if flags_to_resolve. len ( ) > MAX_NO_OF_FLAGS_TO_BATCH_RESOLVE {
527528 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." ,
529530 MAX_NO_OF_FLAGS_TO_BATCH_RESOLVE ,
530531 flags_to_resolve. len( ) ) ) ;
531532 }
@@ -611,7 +612,7 @@ impl<'a, H: Host> AccountResolver<'a, H> {
611612 pub fn apply_flags ( & self , request : & flags_resolver:: ApplyFlagsRequest ) -> Result < ( ) , String > {
612613 let send_time_ts = request. send_time . as_ref ( ) . ok_or ( "send_time is required" ) ?;
613614 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 ( ) ) ?;
615616
616617 let resolve_token_outer = self . decrypt_resolve_token ( & request. resolve_token ) ?;
617618 let Some ( flags_resolver:: resolve_token:: ResolveToken :: TokenV1 ( resolve_token) ) =
@@ -664,14 +665,15 @@ impl<'a, H: Host> AccountResolver<'a, H> {
664665 _ => Err ( "TargetingKeyError" . to_string ( ) ) ,
665666 }
666667 }
667- pub fn resolve_flag_name ( & ' a self , flag_name : & str ) -> Option < Fallible < ResolvedValue < ' a > > > {
668+ pub fn resolve_flag_name ( & ' a self , flag_name : & str ) -> Result < ResolvedValue < ' a > , String > {
668669 self . state
669670 . flags
670671 . get ( flag_name)
671- . map ( |flag| self . resolve_flag ( flag) )
672+ . ok_or ( "flag not found" . to_string ( ) )
673+ . and_then ( |flag| self . resolve_flag ( flag) )
672674 }
673675
674- pub fn resolve_flag ( & ' a self , flag : & ' a Flag ) -> Fallible < ResolvedValue < ' a > > {
676+ pub fn resolve_flag ( & ' a self , flag : & ' a Flag ) -> Result < ResolvedValue < ' a > , String > {
675677 let mut resolved_value = ResolvedValue :: new ( flag) ;
676678
677679 if flag. state == flags_admin:: flag:: State :: Archived as i32 {
@@ -884,9 +886,7 @@ impl<'a, H: Host> AccountResolver<'a, H> {
884886 resolve_token : & flags_resolver:: ResolveToken ,
885887 ) -> Result < Vec < u8 > , String > {
886888 let mut token_buf = Vec :: with_capacity ( resolve_token. encoded_len ( ) ) ;
887- resolve_token
888- . encode ( & mut token_buf)
889- . map_err ( |_| "encrypt resolve token failed" ) ?;
889+ resolve_token. encode ( & mut token_buf) . or_fail ( ) ?;
890890
891891 H :: encrypt_resolve_token ( & token_buf, & self . encryption_key )
892892 }
@@ -897,8 +897,8 @@ impl<'a, H: Host> AccountResolver<'a, H> {
897897 ) -> Result < flags_resolver:: ResolveToken , String > {
898898 let decrypted_data = H :: decrypt_resolve_token ( encrypted_token, & self . encryption_key ) ?;
899899
900- flags_resolver:: ResolveToken :: decode ( & decrypted_data[ ..] )
901- . map_err ( |e| format ! ( "Failed to decode resolve token: {}" , e ) )
900+ let t = flags_resolver:: ResolveToken :: decode ( & decrypted_data[ ..] ) . or_fail ( ) ? ;
901+ Ok ( t )
902902 }
903903}
904904
0 commit comments