mirror of
https://github.com/chatmail/core.git
synced 2026-05-22 16:26:31 +03:00
always handle incoming group-avatars
This commit is contained in:
committed by
holger krekel
parent
a8842da50a
commit
7c3d8356c4
@@ -3,7 +3,6 @@ use sha2::{Digest, Sha256};
|
|||||||
|
|
||||||
use num_traits::FromPrimitive;
|
use num_traits::FromPrimitive;
|
||||||
|
|
||||||
use crate::blob::BlobObject;
|
|
||||||
use crate::chat::{self, Chat};
|
use crate::chat::{self, Chat};
|
||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
use crate::constants::*;
|
use crate::constants::*;
|
||||||
@@ -810,7 +809,6 @@ fn create_or_lookup_group(
|
|||||||
let mut X_MrRemoveFromGrp = None;
|
let mut X_MrRemoveFromGrp = None;
|
||||||
let mut X_MrAddToGrp = None;
|
let mut X_MrAddToGrp = None;
|
||||||
let mut X_MrGrpNameChanged = false;
|
let mut X_MrGrpNameChanged = false;
|
||||||
let mut X_MrGrpImageChanged = "".to_string();
|
|
||||||
let mut better_msg: String = From::from("");
|
let mut better_msg: String = From::from("");
|
||||||
|
|
||||||
if mime_parser.is_system_message == SystemMessage::LocationStreamingEnabled {
|
if mime_parser.is_system_message == SystemMessage::LocationStreamingEnabled {
|
||||||
@@ -877,9 +875,6 @@ fn create_or_lookup_group(
|
|||||||
if let Some(optional_field) = field {
|
if let Some(optional_field) = field {
|
||||||
X_MrAddToGrp = Some(optional_field);
|
X_MrAddToGrp = Some(optional_field);
|
||||||
mime_parser.is_system_message = SystemMessage::MemberAddedToGroup;
|
mime_parser.is_system_message = SystemMessage::MemberAddedToGroup;
|
||||||
if let Some(optional_field) = mime_parser.get(HeaderDef::ChatGroupImage).cloned() {
|
|
||||||
X_MrGrpImageChanged = optional_field;
|
|
||||||
}
|
|
||||||
better_msg = context.stock_system_msg(
|
better_msg = context.stock_system_msg(
|
||||||
StockMessage::MsgAddMember,
|
StockMessage::MsgAddMember,
|
||||||
X_MrAddToGrp.as_ref().unwrap(),
|
X_MrAddToGrp.as_ref().unwrap(),
|
||||||
@@ -902,13 +897,14 @@ fn create_or_lookup_group(
|
|||||||
);
|
);
|
||||||
|
|
||||||
mime_parser.is_system_message = SystemMessage::GroupNameChanged;
|
mime_parser.is_system_message = SystemMessage::GroupNameChanged;
|
||||||
} else if let Some(optional_field) = mime_parser.get(HeaderDef::ChatGroupImage).cloned()
|
} else if let Some(value) = mime_parser.get(HeaderDef::ChatContent).cloned() {
|
||||||
|
if value == "group-avatar-changed" && mime_parser.group_avatar != ImageAction::None
|
||||||
{
|
{
|
||||||
// fld_value is a pointer somewhere into mime_parser, must not be freed
|
// this is just an explicit message containing the group-avatar,
|
||||||
X_MrGrpImageChanged = optional_field;
|
// apart from that, the group-avatar is send along with various other messages
|
||||||
mime_parser.is_system_message = SystemMessage::GroupImageChanged;
|
mime_parser.is_system_message = SystemMessage::GroupImageChanged;
|
||||||
better_msg = context.stock_system_msg(
|
better_msg = context.stock_system_msg(
|
||||||
if X_MrGrpImageChanged == "0" {
|
if mime_parser.group_avatar == ImageAction::Delete {
|
||||||
StockMessage::MsgGrpImgDeleted
|
StockMessage::MsgGrpImgDeleted
|
||||||
} else {
|
} else {
|
||||||
StockMessage::MsgGrpImgChanged
|
StockMessage::MsgGrpImgChanged
|
||||||
@@ -920,6 +916,7 @@ fn create_or_lookup_group(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
set_better_msg(mime_parser, &better_msg);
|
set_better_msg(mime_parser, &better_msg);
|
||||||
|
|
||||||
// check, if we have a chat with this group ID
|
// check, if we have a chat with this group ID
|
||||||
@@ -1039,46 +1036,24 @@ fn create_or_lookup_group(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !X_MrGrpImageChanged.is_empty() {
|
if mime_parser.group_avatar != ImageAction::None {
|
||||||
info!(
|
info!(context, "group-avatar change for {}", chat_id);
|
||||||
context,
|
|
||||||
"grp-image-change {} chat {}", X_MrGrpImageChanged, chat_id
|
|
||||||
);
|
|
||||||
let mut changed = false;
|
|
||||||
let mut grpimage: Option<BlobObject> = None;
|
|
||||||
if X_MrGrpImageChanged == "0" {
|
|
||||||
changed = true;
|
|
||||||
} else {
|
|
||||||
for part in &mut mime_parser.parts {
|
|
||||||
if part.typ == Viewtype::Image {
|
|
||||||
grpimage = part
|
|
||||||
.param
|
|
||||||
.get_blob(Param::File, context, true)
|
|
||||||
.unwrap_or(None);
|
|
||||||
info!(context, "found image {:?}", grpimage);
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if changed {
|
|
||||||
info!(
|
|
||||||
context,
|
|
||||||
"New group image set to '{}'.",
|
|
||||||
grpimage
|
|
||||||
.as_ref()
|
|
||||||
.map(|blob| blob.as_name().to_string())
|
|
||||||
.unwrap_or_default()
|
|
||||||
);
|
|
||||||
if let Ok(mut chat) = Chat::load_from_db(context, chat_id) {
|
if let Ok(mut chat) = Chat::load_from_db(context, chat_id) {
|
||||||
match grpimage {
|
match &mime_parser.group_avatar {
|
||||||
Some(blob) => chat.param.set(Param::ProfileImage, blob.as_name()),
|
ImageAction::Change(profile_image) => {
|
||||||
None => chat.param.remove(Param::ProfileImage),
|
chat.param.set(Param::ProfileImage, profile_image);
|
||||||
|
true
|
||||||
|
}
|
||||||
|
ImageAction::Delete => {
|
||||||
|
chat.param.remove(Param::ProfileImage);
|
||||||
|
true
|
||||||
|
}
|
||||||
|
ImageAction::None => false,
|
||||||
};
|
};
|
||||||
chat.update_param(context)?;
|
chat.update_param(context)?;
|
||||||
send_EVENT_CHAT_MODIFIED = true;
|
send_EVENT_CHAT_MODIFIED = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// add members to group/check members
|
// add members to group/check members
|
||||||
// for recreation: we should add a timestamp
|
// for recreation: we should add a timestamp
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ pub enum HeaderDef {
|
|||||||
ChatGroupName,
|
ChatGroupName,
|
||||||
ChatGroupNameChanged,
|
ChatGroupNameChanged,
|
||||||
ChatVerified,
|
ChatVerified,
|
||||||
ChatGroupImage,
|
ChatGroupAvatar,
|
||||||
ChatProfileImage,
|
ChatProfileImage,
|
||||||
ChatVoiceMessage,
|
ChatVoiceMessage,
|
||||||
ChatGroupMemberRemoved,
|
ChatGroupMemberRemoved,
|
||||||
|
|||||||
@@ -687,10 +687,10 @@ impl<'a, 'b> MimeFactory<'a, 'b> {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
SystemMessage::GroupImageChanged => {
|
SystemMessage::GroupImageChanged => {
|
||||||
if grpimage.is_none() {
|
protected_headers.push(Header::new(
|
||||||
protected_headers
|
"Chat-Content".to_string(),
|
||||||
.push(Header::new("Chat-Group-Image".to_string(), "0".to_string()));
|
"group-avatar-changed".to_string(),
|
||||||
}
|
));
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
@@ -758,7 +758,7 @@ impl<'a, 'b> MimeFactory<'a, 'b> {
|
|||||||
|
|
||||||
let (mail, filename_as_sent) = build_body_file(context, &meta, "group-image")?;
|
let (mail, filename_as_sent) = build_body_file(context, &meta, "group-image")?;
|
||||||
meta_part = Some(mail);
|
meta_part = Some(mail);
|
||||||
protected_headers.push(Header::new("Chat-Group-Image".into(), filename_as_sent));
|
protected_headers.push(Header::new("Chat-Group-Avatar".into(), filename_as_sent));
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.msg.type_0 == Viewtype::Sticker {
|
if self.msg.type_0 == Viewtype::Sticker {
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ pub struct MimeParser<'a> {
|
|||||||
pub location_kml: Option<location::Kml>,
|
pub location_kml: Option<location::Kml>,
|
||||||
pub message_kml: Option<location::Kml>,
|
pub message_kml: Option<location::Kml>,
|
||||||
pub profile_image: ImageAction,
|
pub profile_image: ImageAction,
|
||||||
|
pub group_avatar: ImageAction,
|
||||||
reports: Vec<Report>,
|
reports: Vec<Report>,
|
||||||
mdns_enabled: bool,
|
mdns_enabled: bool,
|
||||||
parsed_protected_headers: bool,
|
parsed_protected_headers: bool,
|
||||||
@@ -92,6 +93,7 @@ impl<'a> MimeParser<'a> {
|
|||||||
location_kml: None,
|
location_kml: None,
|
||||||
message_kml: None,
|
message_kml: None,
|
||||||
profile_image: ImageAction::None,
|
profile_image: ImageAction::None,
|
||||||
|
group_avatar: ImageAction::None,
|
||||||
mdns_enabled,
|
mdns_enabled,
|
||||||
parsed_protected_headers: false,
|
parsed_protected_headers: false,
|
||||||
};
|
};
|
||||||
@@ -191,14 +193,8 @@ impl<'a> MimeParser<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.get(HeaderDef::ChatGroupImage).is_some() && !self.parts.is_empty() {
|
if let Some(header_value) = self.get(HeaderDef::ChatGroupAvatar).cloned() {
|
||||||
let textpart = &self.parts[0];
|
self.group_avatar = self.image_action_from_header(header_value);
|
||||||
if textpart.typ == Viewtype::Text && self.parts.len() >= 2 {
|
|
||||||
let imgpart = &mut self.parts[1];
|
|
||||||
if imgpart.typ == Viewtype::Image {
|
|
||||||
imgpart.is_meta = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(header_value) = self.get(HeaderDef::ChatProfileImage).cloned() {
|
if let Some(header_value) = self.get(HeaderDef::ChatProfileImage).cloned() {
|
||||||
@@ -1174,16 +1170,19 @@ mod tests {
|
|||||||
let raw = include_bytes!("../test-data/message/mail_attach_txt.eml");
|
let raw = include_bytes!("../test-data/message/mail_attach_txt.eml");
|
||||||
let mimeparser = MimeParser::from_bytes(&t.ctx, &raw[..]).unwrap();
|
let mimeparser = MimeParser::from_bytes(&t.ctx, &raw[..]).unwrap();
|
||||||
assert_eq!(mimeparser.profile_image, ImageAction::None);
|
assert_eq!(mimeparser.profile_image, ImageAction::None);
|
||||||
|
assert_eq!(mimeparser.group_avatar, ImageAction::None);
|
||||||
|
|
||||||
let raw = include_bytes!("../test-data/message/mail_with_profile_image.eml");
|
let raw = include_bytes!("../test-data/message/mail_with_profile_image.eml");
|
||||||
let mimeparser = MimeParser::from_bytes(&t.ctx, &raw[..]).unwrap();
|
let mimeparser = MimeParser::from_bytes(&t.ctx, &raw[..]).unwrap();
|
||||||
assert_eq!(mimeparser.parts.len(), 1);
|
assert_eq!(mimeparser.parts.len(), 1);
|
||||||
assert_ne!(mimeparser.profile_image, ImageAction::None);
|
assert_ne!(mimeparser.profile_image, ImageAction::None);
|
||||||
assert_ne!(mimeparser.profile_image, ImageAction::Delete);
|
assert_ne!(mimeparser.profile_image, ImageAction::Delete);
|
||||||
|
assert_eq!(mimeparser.group_avatar, ImageAction::None);
|
||||||
|
|
||||||
let raw = include_bytes!("../test-data/message/mail_with_profile_image_deleted.eml");
|
let raw = include_bytes!("../test-data/message/mail_with_profile_image_deleted.eml");
|
||||||
let mimeparser = MimeParser::from_bytes(&t.ctx, &raw[..]).unwrap();
|
let mimeparser = MimeParser::from_bytes(&t.ctx, &raw[..]).unwrap();
|
||||||
assert_eq!(mimeparser.parts.len(), 1);
|
assert_eq!(mimeparser.parts.len(), 1);
|
||||||
assert_eq!(mimeparser.profile_image, ImageAction::Delete);
|
assert_eq!(mimeparser.profile_image, ImageAction::Delete);
|
||||||
|
assert_eq!(mimeparser.group_avatar, ImageAction::None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user