diff --git a/src/mimeparser.rs b/src/mimeparser.rs index 9f8a4dc64..1028a11ec 100644 --- a/src/mimeparser.rs +++ b/src/mimeparser.rs @@ -51,6 +51,16 @@ pub enum AvatarAction { Change(String), } +impl AvatarAction { + pub fn is_change(&self) -> bool { + match self { + AvatarAction::None => false, + AvatarAction::Delete => false, + AvatarAction::Change(_) => true, + } + } +} + #[derive(Debug, Display, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive, ToSql, FromSql)] #[repr(i32)] pub enum SystemMessage { @@ -1143,7 +1153,7 @@ mod tests { } #[test] - fn test_mimeparser_with_user_avatar() { + fn test_mimeparser_with_avatars() { let t = dummy_context(); let raw = include_bytes!("../test-data/message/mail_attach_txt.eml"); @@ -1154,14 +1164,32 @@ mod tests { let raw = include_bytes!("../test-data/message/mail_with_user_avatar.eml"); let mimeparser = MimeParser::from_bytes(&t.ctx, &raw[..]).unwrap(); assert_eq!(mimeparser.parts.len(), 1); - assert_ne!(mimeparser.user_avatar, AvatarAction::None); - assert_ne!(mimeparser.user_avatar, AvatarAction::Delete); + assert_eq!(mimeparser.parts[0].typ, Viewtype::Text); + assert!(mimeparser.user_avatar.is_change()); assert_eq!(mimeparser.group_avatar, AvatarAction::None); let raw = include_bytes!("../test-data/message/mail_with_user_avatar_deleted.eml"); let mimeparser = MimeParser::from_bytes(&t.ctx, &raw[..]).unwrap(); assert_eq!(mimeparser.parts.len(), 1); + assert_eq!(mimeparser.parts[0].typ, Viewtype::Text); assert_eq!(mimeparser.user_avatar, AvatarAction::Delete); assert_eq!(mimeparser.group_avatar, AvatarAction::None); + + let raw = include_bytes!("../test-data/message/mail_with_user_and_group_avatars.eml"); + let mimeparser = MimeParser::from_bytes(&t.ctx, &raw[..]).unwrap(); + assert_eq!(mimeparser.parts.len(), 1); + assert_eq!(mimeparser.parts[0].typ, Viewtype::Text); + assert!(mimeparser.user_avatar.is_change()); + assert!(mimeparser.group_avatar.is_change()); + + // if the Chat-User-Avatar header is missing, the avatar become a normal attachment + let raw = include_bytes!("../test-data/message/mail_with_user_and_group_avatars.eml"); + let raw = String::from_utf8_lossy(raw).to_string(); + let raw = raw.replace("Chat-User-Avatar:", "Xhat-Xser-Xvatar:"); + let mimeparser = MimeParser::from_bytes(&t.ctx, raw.as_bytes()).unwrap(); + assert_eq!(mimeparser.parts.len(), 1); + assert_eq!(mimeparser.parts[0].typ, Viewtype::Image); + assert_eq!(mimeparser.user_avatar, AvatarAction::None); + assert!(mimeparser.group_avatar.is_change()); } } diff --git a/test-data/message/mail_with_user_and_group_avatars.eml b/test-data/message/mail_with_user_and_group_avatars.eml new file mode 100644 index 000000000..2812bdd61 --- /dev/null +++ b/test-data/message/mail_with_user_and_group_avatars.eml @@ -0,0 +1,55 @@ +Chat-Group-ID: WVnDtF5azch +Chat-Group-Name: =?utf-8?q?testgr1?= +Chat-Group-Avatar: group-image.png +Chat-User-Avatar: avatar.png +Subject: =?utf-8?q?Chat=3A_testgr1=3A_hi!_?= +Date: Thu, 12 Dec 2019 17:24:03 +0000 +X-Mailer: Delta Chat Core 1.0.0-beta.15/CLI +Chat-Version: 1.0 +Message-ID: +To: +From: =?utf-8?q??= +Content-Type: multipart/mixed; boundary="LV8nfXkpyyn39fsVyoB1b29PKDMeb5" + + +--LV8nfXkpyyn39fsVyoB1b29PKDMeb5 +Content-Type: text/plain; charset=utf-8 + +hi! + +-- +Sent with my Delta Chat Messenger: https://delta.chat + +--LV8nfXkpyyn39fsVyoB1b29PKDMeb5 +Content-Type: image/png +Content-Disposition: attachment; filename="group-image.png" +Content-Transfer-Encoding: base64 + +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT +1Iw0AYht+mSqVUHCwi4pChOlkQFXHUKhShQqgVWnUwufQPmjQkKS6OgmvBwZ/FqoOLs64OroIg+APi +4uqk6CIlfpcUWsR4x3EP733vy913gNCoMM3qGgc03TbTyYSYza2KoVdEEMYATUFmljEnSSn4jq97BP +h+F+dZ/nV/jl41bzEgIBLPMsO0iTeIpzdtg/M+cZSVZJX4nHjMpAsSP3Jd8fiNc9FlgWdGzUx6njhK +LBY7WOlgVjI14inimKrplC9kPVY5b3HWKjXWuid/YSSvryxzndYwkljEEiSIUFBDGRXYiNOuk2IhTe +cJH/+Q65fIpZCrDEaOBVShQXb94H/wu7dWYXLCS4okgO4Xx/kYAUK7QLPuON/HjtM8AYLPwJXe9lcb +wMwn6fW2FjsC+raBi+u2puwBlzvA4JMhm7IrBWkJhQLwfkbflAP6b4Hwmte31jlOH4AM9Sp1AxwcAq +NFyl73eXdPZ9/+rWn17wcR7HKATfSiTAAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+MMChYX +Fh+1IOwAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAGElEQVQoz2P858hAEm +BiYBjVMKphuGoAAAO8AV+n297RAAAAAElFTkSuQmCC + +--LV8nfXkpyyn39fsVyoB1b29PKDMeb5 +Content-Type: image/png +Content-Disposition: attachment; filename="avatar.png" +Content-Transfer-Encoding: base64 + +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT +1Iw0AcxV9TpUUqIhYRcchQnSyIFXHUKhShQqgVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi +4uqk6CIl/q8ptIjx4Lgf7+497t4BQr3MNKtrAtB020wl4mImuyoGXhFCEIOIoV9mljEnSUl4jq97+P +h6F+VZ3uf+HL1qzmKATySeZYZpE28QT2/aBud94jAryirxOfG4SRckfuS64vIb50KTBZ4ZNtOpeeIw +sVjoYKWDWdHUiKeII6qmU76QcVnlvMVZK1dZ6578haGcvrLMdZojSGARS5AgQkEVJZRhI0qrToqFFO +3HPfzDTb9ELoVcJTByLKACDXLTD/4Hv7u18rFJNykUB7pfHOdjFAjsAo2a43wfO07jBPA/A1d621+p +AzOfpNfaWuQI6NsGLq7bmrIHXO4AQ0+GbMpNyU9TyOeB9zP6piwwcAv0rLm9tfZx+gCkqavkDXBwCI +wVKHvd493Bzt7+PdPq7wd6nHKqMKZUTAAAAANQTFRF/sYAhYATyAAAAAlwSFlzAAAuIwAALiMBeKU/ +dgAAAAd0SU1FB+MMCBY0D29+N8YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAA +AADElEQVQI12NgIA0AAAAwAAHHqoWOAAAAAElFTkSuQmCC + +--LV8nfXkpyyn39fsVyoB1b29PKDMeb5--