Skip to content

Commit b853b81

Browse files
fixup! feat: fallible
1 parent bd9e7fd commit b853b81

File tree

5 files changed

+121
-124
lines changed

5 files changed

+121
-124
lines changed

confidence-cloudflare-resolver/src/lib.rs

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ static CONFIDENCE_CLIENT_SECRET: OnceLock<String> = OnceLock::new();
3131

3232
static FLAG_LOGGER: Lazy<Logger> = Lazy::new(|| Logger::new());
3333

34-
static RESOLVER_STATE: Lazy<ResolverState> =
35-
Lazy::new(|| ResolverState::from_proto(STATE_JSON.to_owned().into(), ACCOUNT_ID));
34+
static RESOLVER_STATE: Lazy<ResolverState> = Lazy::new(|| {
35+
ResolverState::from_proto(STATE_JSON.to_owned().try_into().unwrap(), ACCOUNT_ID).unwrap()
36+
});
3637

3738
trait ResponseExt {
3839
fn with_cors_headers(self, allowed_origin: &str) -> Result<Self>
@@ -156,17 +157,16 @@ pub async fn main(req: Request, env: Env, _ctx: Context) -> Result<Response> {
156157
evaluation_context,
157158
&Bytes::from(STANDARD.decode(ENCRYPTION_KEY_BASE64).unwrap()),
158159
) {
159-
Some(resolver) => match resolver.resolve_flags(&resolver_request) {
160+
Ok(resolver) => match resolver.resolve_flags(&resolver_request) {
160161
Ok(response) => Response::from_json(&response)?
161162
.with_cors_headers(&allowed_origin),
162-
Err(err) => Response::error(
163-
format!("Failed to resolve flags: {}", err),
164-
500,
165-
)?
166-
.with_cors_headers(&allowed_origin),
163+
Err(msg) => {
164+
Response::error(msg, 500)?.with_cors_headers(&allowed_origin)
165+
}
167166
},
168-
None => Response::error("Error setting up the resolver", 500)?
169-
.with_cors_headers(&allowed_origin),
167+
Err(msg) => {
168+
Response::error(msg, 500)?.with_cors_headers(&allowed_origin)
169+
}
170170
}
171171
}
172172
"flags:apply" => {
@@ -187,21 +187,20 @@ pub async fn main(req: Request, env: Env, _ctx: Context) -> Result<Response> {
187187
Struct::default(),
188188
&Bytes::from(STANDARD.decode(ENCRYPTION_KEY_BASE64).unwrap()),
189189
) {
190-
Some(resolver) => match resolver.apply_flags(&apply_flag_req) {
191-
Ok(_response) => {
190+
Ok(resolver) => match resolver.apply_flags(&apply_flag_req) {
191+
Ok(()) => {
192192
return Response::from_json(&ApplyFlagsResponse::default());
193193
}
194-
Err(err) => {
195-
Response::error(format!("Failed to apply flags: {}", err), 500)?
196-
.with_cors_headers(&allowed_origin)
194+
Err(msg) => {
195+
Response::error(msg, 500)?.with_cors_headers(&allowed_origin)
197196
}
198197
},
199-
None => Response::error("Error setting up the resolver", 500)?
200-
.with_cors_headers(&allowed_origin),
198+
Err(msg) => {
199+
Response::error(msg, 500)?.with_cors_headers(&allowed_origin)
200+
}
201201
}
202202
}
203-
_ => Response::error("The URL is invalid", 404)?
204-
.with_cors_headers(&allowed_origin),
203+
_ => Response::error("Not found", 404)?.with_cors_headers(&allowed_origin),
205204
}
206205
}
207206
})

confidence-resolver/src/lib.rs

Lines changed: 73 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}
169169
fn 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)) =
@@ -671,14 +672,15 @@ impl<'a, H: Host> AccountResolver<'a, H> {
671672
_ => Err("TargetingKeyError".to_string()),
672673
}
673674
}
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> {
675676
self.state
676677
.flags
677678
.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))
679681
}
680682

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> {
682684
let mut resolved_value = ResolvedValue::new(flag);
683685

684686
if flag.state == flags_admin::flag::State::Archived as i32 {
@@ -889,9 +891,7 @@ impl<'a, H: Host> AccountResolver<'a, H> {
889891
resolve_token: &flags_resolver::ResolveToken,
890892
) -> Result<Vec<u8>, String> {
891893
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()?;
895895

896896
H::encrypt_resolve_token(&token_buf, &self.encryption_key)
897897
}
@@ -902,8 +902,8 @@ impl<'a, H: Host> AccountResolver<'a, H> {
902902
) -> Result<flags_resolver::ResolveToken, String> {
903903
let decrypted_data = H::decrypt_resolve_token(encrypted_token, &self.encryption_key)?;
904904

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)
907907
}
908908
}
909909

0 commit comments

Comments
 (0)