mirror of
https://github.com/chatmail/core.git
synced 2026-05-08 09:26:29 +03:00
Process Chat-User-Avatar headers with embedded base64 images
This commit is contained in:
@@ -278,7 +278,7 @@ impl MimeMessage {
|
|||||||
parser.maybe_remove_bad_parts();
|
parser.maybe_remove_bad_parts();
|
||||||
parser.maybe_remove_inline_mailinglist_footer();
|
parser.maybe_remove_inline_mailinglist_footer();
|
||||||
parser.heuristically_parse_ndn(context).await;
|
parser.heuristically_parse_ndn(context).await;
|
||||||
parser.parse_headers(context);
|
parser.parse_headers(context).await;
|
||||||
|
|
||||||
if warn_empty_signature && parser.signatures.is_empty() {
|
if warn_empty_signature && parser.signatures.is_empty() {
|
||||||
for part in parser.parts.iter_mut() {
|
for part in parser.parts.iter_mut() {
|
||||||
@@ -325,13 +325,13 @@ impl MimeMessage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Parses avatar action headers.
|
/// Parses avatar action headers.
|
||||||
fn parse_avatar_headers(&mut self) {
|
async fn parse_avatar_headers(&mut self, context: &Context) {
|
||||||
if let Some(header_value) = self.get(HeaderDef::ChatGroupAvatar).cloned() {
|
if let Some(header_value) = self.get(HeaderDef::ChatGroupAvatar).cloned() {
|
||||||
self.group_avatar = self.avatar_action_from_header(header_value);
|
self.group_avatar = self.avatar_action_from_header(context, header_value).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(header_value) = self.get(HeaderDef::ChatUserAvatar).cloned() {
|
if let Some(header_value) = self.get(HeaderDef::ChatUserAvatar).cloned() {
|
||||||
self.user_avatar = self.avatar_action_from_header(header_value);
|
self.user_avatar = self.avatar_action_from_header(context, header_value).await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -421,9 +421,9 @@ impl MimeMessage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_headers(&mut self, context: &Context) {
|
async fn parse_headers(&mut self, context: &Context) {
|
||||||
self.parse_system_message_headers(context);
|
self.parse_system_message_headers(context);
|
||||||
self.parse_avatar_headers();
|
self.parse_avatar_headers(context).await;
|
||||||
self.parse_videochat_headers();
|
self.parse_videochat_headers();
|
||||||
self.squash_attachment_parts();
|
self.squash_attachment_parts();
|
||||||
|
|
||||||
@@ -500,10 +500,37 @@ impl MimeMessage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn avatar_action_from_header(&mut self, header_value: String) -> Option<AvatarAction> {
|
async fn avatar_action_from_header(
|
||||||
|
&mut self,
|
||||||
|
context: &Context,
|
||||||
|
header_value: String,
|
||||||
|
) -> Option<AvatarAction> {
|
||||||
if header_value == "0" {
|
if header_value == "0" {
|
||||||
Some(AvatarAction::Delete)
|
Some(AvatarAction::Delete)
|
||||||
|
} else if let Some(avatar) = header_value
|
||||||
|
.split_ascii_whitespace()
|
||||||
|
.collect::<String>()
|
||||||
|
.strip_prefix("base64:")
|
||||||
|
.map(base64::decode)
|
||||||
|
{
|
||||||
|
// Avatar sent directly in the header as base64.
|
||||||
|
if let Ok(decoded_data) = avatar {
|
||||||
|
match BlobObject::create(context, "avatar", &decoded_data).await {
|
||||||
|
Ok(blob) => Some(AvatarAction::Change(blob.as_name().to_string())),
|
||||||
|
Err(err) => {
|
||||||
|
warn!(
|
||||||
|
context,
|
||||||
|
"Could not save decoded avatar to blob file: {}", err
|
||||||
|
);
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Avatar sent in attachment, as previous versions of Delta Chat did.
|
||||||
|
|
||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
while let Some(part) = self.parts.get_mut(i) {
|
while let Some(part) = self.parts.get_mut(i) {
|
||||||
if let Some(part_filename) = &part.org_filename {
|
if let Some(part_filename) = &part.org_filename {
|
||||||
|
|||||||
Reference in New Issue
Block a user