From ac6fe5c85e10970c06465ea2dd6c65663671d870 Mon Sep 17 00:00:00 2001 From: BlackDex Date: Wed, 1 Jan 2025 16:32:54 +0100 Subject: [PATCH] Refactor the uri match change Refactored the uri match fix to also convert numbers within a string to an int. If it fails it will be null. Signed-off-by: BlackDex --- src/db/models/cipher.rs | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/db/models/cipher.rs b/src/db/models/cipher.rs index 326f3d41..5fa90daf 100644 --- a/src/db/models/cipher.rs +++ b/src/db/models/cipher.rs @@ -241,20 +241,23 @@ impl Cipher { // NOTE: This was marked as *Backwards Compatibility Code*, but as of January 2021 this is still being used by upstream // Set the first element of the Uris array as Uri, this is needed several (mobile) clients. if self.atype == 1 { - if type_data_json["uris"].is_array() { - // Fix uri match values first, they are only allowed to be a number or null - // If it is a string, convert it to null since all clients do not allow strings anyway - let uri_count = type_data_json["uris"].as_array().unwrap().len(); - for n in 0..uri_count { - if type_data_json["uris"][n]["match"].is_string() { - type_data_json["uris"][n]["match"] = Value::Null; + // Upstream always has an `uri` key/value + type_data_json["uri"] = Value::Null; + if let Some(uris) = type_data_json["uris"].as_array_mut() { + if !uris.is_empty() { + // Fix uri match values first, they are only allowed to be a number or null + // If it is a string, convert it to an int or null if that fails + for uri in &mut *uris { + if uri["match"].is_string() { + let match_value = match uri["match"].as_str().unwrap_or_default().parse::() { + Ok(n) => json!(n), + _ => Value::Null, + }; + uri["match"] = match_value; + } } + type_data_json["uri"] = uris[0]["uri"].clone(); } - let uri = type_data_json["uris"][0]["uri"].clone(); - type_data_json["uri"] = uri; - } else { - // Upstream always has an Uri key/value - type_data_json["uri"] = Value::Null; } }