diff --git a/src/webauthn.rs b/src/webauthn.rs index ec0c1a7..f9e85e5 100644 --- a/src/webauthn.rs +++ b/src/webauthn.rs @@ -15,6 +15,7 @@ pub struct PublicKeyCredentialRpEntity { #[serde(rename_all = "camelCase")] pub struct PublicKeyCredentialUserEntity { pub id: Bytes, + #[serde(default, deserialize_with = "deserialize_from_str_and_skip_if_too_long")] #[serde(skip_serializing_if = "Option::is_none")] pub icon: Option>, #[serde(skip_serializing_if = "Option::is_none")] @@ -23,6 +24,24 @@ pub struct PublicKeyCredentialUserEntity { pub display_name: Option>, } +fn deserialize_from_str_and_skip_if_too_long<'de, L, D>(deserializer: D) -> Result>, D::Error> +where + L: heapless_bytes::Unsigned + heapless_bytes::ArrayLength, + D: serde::Deserializer<'de>, +{ + let result: Result, D::Error> = serde::Deserialize::deserialize(deserializer); + match result { + Ok(string) => { + Ok(Some(string)) + }, + Err(err) => { + info_now!("skipping field: {:?}", err); + Ok(None) + } + } +} + + impl PublicKeyCredentialUserEntity { pub fn from(id: Bytes) -> Self { Self { id, icon: None, name: None, display_name: None }