|
|
@@ -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::<u8>() {
|
|
|
+ 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;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -269,6 +272,19 @@ impl Cipher {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // Fix invalid SSH Entries
|
|
|
+ // This breaks at least the native mobile client if invalid
|
|
|
+ // The only way to fix this is by setting type_data_json to `null`
|
|
|
+ // Opening this ssh-key in the mobile client will probably crash the client, but you can edit, save and afterwards delete it
|
|
|
+ if self.atype == 5
|
|
|
+ && (type_data_json["keyFingerprint"].as_str().is_none_or(|v| v.is_empty())
|
|
|
+ || type_data_json["privateKey"].as_str().is_none_or(|v| v.is_empty())
|
|
|
+ || type_data_json["publicKey"].as_str().is_none_or(|v| v.is_empty()))
|
|
|
+ {
|
|
|
+ warn!("Error parsing ssh-key, mandatory fields are invalid for {}", self.uuid);
|
|
|
+ type_data_json = Value::Null;
|
|
|
+ }
|
|
|
+
|
|
|
// Clone the type_data and add some default value.
|
|
|
let mut data_json = type_data_json.clone();
|
|
|
|