From ee56024206ba140d82b174f61e3ad084f240b431 Mon Sep 17 00:00:00 2001 From: Howard Yang Date: Fri, 15 Apr 2022 11:08:26 +0800 Subject: [PATCH] Return Vec for rp_ids() --- src/api/customization.rs | 10 ++++-- src/ctap/storage.rs | 16 ++-------- src/env/test/customization.rs | 60 ++++++----------------------------- 3 files changed, 20 insertions(+), 66 deletions(-) diff --git a/src/api/customization.rs b/src/api/customization.rs index 4747212..03025c5 100644 --- a/src/api/customization.rs +++ b/src/api/customization.rs @@ -18,6 +18,8 @@ //! Our deploy script enforces the invariants. use crate::ctap::data_formats::CredentialProtectionPolicy; +use alloc::string::String; +use alloc::vec::Vec; pub trait Customization { // ########################################################################### @@ -66,7 +68,7 @@ pub trait Customization { /// /// Only the RP IDs listed in default_min_pin_length_rp_ids are allowed to read /// the minimum PIN length with the minPinLength extension. - fn default_min_pin_length_rp_ids(&self) -> &[&str]; + fn default_min_pin_length_rp_ids(&self) -> Vec; /// Enforces the alwaysUv option. /// @@ -164,8 +166,11 @@ impl Customization for CustomizationImpl { self.default_min_pin_length } - fn default_min_pin_length_rp_ids(&self) -> &[&str] { + fn default_min_pin_length_rp_ids(&self) -> Vec { self.default_min_pin_length_rp_ids + .iter() + .map(|s| String::from(*s)) + .collect() } fn enforce_always_uv(&self) -> bool { @@ -221,7 +226,6 @@ mod test { use super::*; #[test] - #[allow(clippy::assertions_on_constants)] fn test_invariants() { assert!(is_valid(&DEFAULT_CUSTOMIZATION)); } diff --git a/src/ctap/storage.rs b/src/ctap/storage.rs index 19782d4..02d2a52 100644 --- a/src/ctap/storage.rs +++ b/src/ctap/storage.rs @@ -397,15 +397,7 @@ pub fn set_min_pin_length(env: &mut impl Env, min_pin_length: u8) -> Result<(), /// allowed. pub fn min_pin_length_rp_ids(env: &mut impl Env) -> Result, Ctap2StatusCode> { let rp_ids = env.store().find(key::MIN_PIN_LENGTH_RP_IDS)?.map_or_else( - || { - Some( - env.customization() - .default_min_pin_length_rp_ids() - .iter() - .map(|&s| String::from(s)) - .collect(), - ) - }, + || Some(env.customization().default_min_pin_length_rp_ids()), |value| deserialize_min_pin_length_rp_ids(&value), ); debug_assert!(rp_ids.is_some()); @@ -418,8 +410,7 @@ pub fn set_min_pin_length_rp_ids( min_pin_length_rp_ids: Vec, ) -> Result<(), Ctap2StatusCode> { let mut min_pin_length_rp_ids = min_pin_length_rp_ids; - for &rp_id in env.customization().default_min_pin_length_rp_ids().iter() { - let rp_id = String::from(rp_id); + for rp_id in env.customization().default_min_pin_length_rp_ids() { if !min_pin_length_rp_ids.contains(&rp_id) { min_pin_length_rp_ids.push(rp_id); } @@ -1140,8 +1131,7 @@ mod test { // Changes by the setter are reflected by the getter. let mut rp_ids = vec![String::from("example.com")]; assert_eq!(set_min_pin_length_rp_ids(&mut env, rp_ids.clone()), Ok(())); - for &rp_id in env.customization().default_min_pin_length_rp_ids().iter() { - let rp_id = String::from(rp_id); + for rp_id in env.customization().default_min_pin_length_rp_ids() { if !rp_ids.contains(&rp_id) { rp_ids.push(rp_id); } diff --git a/src/env/test/customization.rs b/src/env/test/customization.rs index 79bea19..0b7ee23 100644 --- a/src/env/test/customization.rs +++ b/src/env/test/customization.rs @@ -1,13 +1,12 @@ -use std::slice::from_raw_parts; - use crate::api::customization::{Customization, CustomizationImpl}; use crate::ctap::data_formats::CredentialProtectionPolicy; +use alloc::string::String; +use alloc::vec::Vec; pub struct TestCustomization { pub default_cred_protect: Option, pub default_min_pin_length: u8, - default_min_pin_length_rp_ids_backing_store: Vec, - default_min_pin_length_rp_ids: Vec<*const str>, + pub default_min_pin_length_rp_ids: Vec, pub enforce_always_uv: bool, pub max_msg_size: usize, pub max_pin_retries: u8, @@ -15,17 +14,6 @@ pub struct TestCustomization { pub max_rp_ids_length: usize, } -impl TestCustomization { - pub fn set_default_min_pin_length_rp_ids(&mut self, rp_ids: Vec) { - self.default_min_pin_length_rp_ids_backing_store = rp_ids; - self.default_min_pin_length_rp_ids = self - .default_min_pin_length_rp_ids_backing_store - .iter() - .map(|s| s.as_ref() as *const str) - .collect::>(); - } -} - impl Customization for TestCustomization { fn default_cred_protect(&self) -> Option { self.default_cred_protect @@ -35,10 +23,8 @@ impl Customization for TestCustomization { self.default_min_pin_length } - fn default_min_pin_length_rp_ids(&self) -> &[&str] { - let length = self.default_min_pin_length_rp_ids.len(); - let rp_ids = self.default_min_pin_length_rp_ids.as_ptr() as *const &str; - unsafe { from_raw_parts(rp_ids, length) } + fn default_min_pin_length_rp_ids(&self) -> Vec { + self.default_min_pin_length_rp_ids.clone() } fn enforce_always_uv(&self) -> bool { @@ -75,30 +61,21 @@ impl From for TestCustomization { max_rp_ids_length, } = c; - let default_min_pin_length_rp_ids_backing_store = default_min_pin_length_rp_ids + let default_min_pin_length_rp_ids = default_min_pin_length_rp_ids .iter() - .map(|s| (*s).to_owned()) + .map(|s| String::from(*s)) .collect::>(); - let mut ret = Self { + Self { default_cred_protect, default_min_pin_length, - default_min_pin_length_rp_ids_backing_store, - default_min_pin_length_rp_ids: vec![], + default_min_pin_length_rp_ids, enforce_always_uv, max_msg_size, max_pin_retries, use_signature_counter, max_rp_ids_length, - }; - - ret.default_min_pin_length_rp_ids = ret - .default_min_pin_length_rp_ids_backing_store - .iter() - .map(|s| s.as_ref() as *const str) - .collect::>(); - - ret + } } } @@ -112,21 +89,4 @@ mod test { let customization = TestCustomization::from(DEFAULT_CUSTOMIZATION.clone()); assert!(is_valid(&customization)); } - - #[test] - fn test_vec_storage_impl() { - let mut customization = TestCustomization::from(DEFAULT_CUSTOMIZATION.clone()); - assert!(customization.default_min_pin_length_rp_ids().is_empty()); - customization - .set_default_min_pin_length_rp_ids(vec!["abc.com".to_owned(), "def.com".to_owned()]); - assert_eq!( - customization.default_min_pin_length_rp_ids(), - ["abc.com", "def.com"] - ); - customization.set_default_min_pin_length_rp_ids(vec!["example.com".to_owned()]); - assert_eq!( - customization.default_min_pin_length_rp_ids(), - ["example.com"] - ); - } }