contact: forbid indexing and slicing

This commit is contained in:
Alexander Krotov
2020-06-19 02:44:23 +03:00
committed by link2xt
parent ad531876fd
commit c655fd8a64

View File

@@ -1,5 +1,7 @@
//! Contacts module //! Contacts module
#![forbid(clippy::indexing_slicing)]
use async_std::path::PathBuf; use async_std::path::PathBuf;
use deltachat_derive::*; use deltachat_derive::*;
use itertools::Itertools; use itertools::Itertools;
@@ -1029,10 +1031,10 @@ pub fn addr_normalize(addr: &str) -> &str {
let norm = addr.trim(); let norm = addr.trim();
if norm.starts_with("mailto:") { if norm.starts_with("mailto:") {
return &norm[7..]; norm.get(7..).unwrap_or(norm)
} } else {
norm norm
}
} }
fn sanitize_name_and_addr(name: impl AsRef<str>, addr: impl AsRef<str>) -> (String, String) { fn sanitize_name_and_addr(name: impl AsRef<str>, addr: impl AsRef<str>) -> (String, String) {
@@ -1042,11 +1044,15 @@ fn sanitize_name_and_addr(name: impl AsRef<str>, addr: impl AsRef<str>) -> (Stri
if let Some(captures) = ADDR_WITH_NAME_REGEX.captures(addr.as_ref()) { if let Some(captures) = ADDR_WITH_NAME_REGEX.captures(addr.as_ref()) {
( (
if name.as_ref().is_empty() { if name.as_ref().is_empty() {
normalize_name(&captures[1]) captures
.get(1)
.map_or("".to_string(), |m| normalize_name(m.as_str()))
} else { } else {
name.as_ref().to_string() name.as_ref().to_string()
}, },
captures[2].to_string(), captures
.get(2)
.map_or("".to_string(), |m| m.as_str().to_string()),
) )
} else { } else {
(name.as_ref().to_string(), addr.as_ref().to_string()) (name.as_ref().to_string(), addr.as_ref().to_string())
@@ -1117,24 +1123,17 @@ pub(crate) async fn set_profile_image(
/// ///
/// Typically, this function is not needed as it is called implicitly by `Contact::add_address_book`. /// Typically, this function is not needed as it is called implicitly by `Contact::add_address_book`.
pub fn normalize_name(full_name: impl AsRef<str>) -> String { pub fn normalize_name(full_name: impl AsRef<str>) -> String {
let mut full_name = full_name.as_ref().trim(); let full_name = full_name.as_ref().trim();
if full_name.is_empty() { if full_name.is_empty() {
return full_name.into(); return full_name.into();
} }
let len = full_name.len(); match full_name.as_bytes() {
if len > 1 { [b'\'', .., b'\''] | [b'\"', .., b'\"'] | [b'<', .., b'>'] => full_name
let firstchar = full_name.as_bytes()[0]; .get(1..full_name.len() - 1)
let lastchar = full_name.as_bytes()[len - 1]; .map_or("".to_string(), |s| s.trim().into()),
if firstchar == b'\'' && lastchar == b'\'' _ => full_name.to_string(),
|| firstchar == b'\"' && lastchar == b'\"'
|| firstchar == b'<' && lastchar == b'>'
{
full_name = &full_name[1..len - 1];
} }
}
full_name.trim().into()
} }
fn cat_fingerprint( fn cat_fingerprint(