mirror of
https://github.com/chatmail/core.git
synced 2026-05-08 09:26:29 +03:00
first bit
This commit is contained in:
34
src/e2ee.rs
34
src/e2ee.rs
@@ -339,7 +339,7 @@ pub fn try_decrypt(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok((encrypted, signatures, gossipped_addr))
|
Ok((!signatures.is_empty(), signatures, gossipped_addr))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new_data_part(
|
fn new_data_part(
|
||||||
@@ -436,25 +436,11 @@ fn update_gossip_peerstates(
|
|||||||
let mut recipients: Option<HashSet<String>> = None;
|
let mut recipients: Option<HashSet<String>> = None;
|
||||||
let mut gossipped_addr: HashSet<String> = Default::default();
|
let mut gossipped_addr: HashSet<String> = Default::default();
|
||||||
|
|
||||||
for cur_data in unsafe { (*(*gossip_headers).fld_list).into_iter() } {
|
let fields = wrapmime::iter_optional_field_values(
|
||||||
let field = cur_data as *mut mailimf_field;
|
gossip_headers,
|
||||||
if field.is_null() {
|
b"Autocrypt-Gossip\0" as *const u8 as *const libc::c_char,
|
||||||
continue;
|
)?;
|
||||||
}
|
for value in fields.iter() {
|
||||||
|
|
||||||
let field = unsafe { *field };
|
|
||||||
|
|
||||||
if field.fld_type == MAILIMF_FIELD_OPTIONAL_FIELD as libc::c_int {
|
|
||||||
let optional_field = unsafe { field.fld_data.fld_optional_field };
|
|
||||||
if optional_field.is_null() {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
let optional_field = unsafe { *optional_field };
|
|
||||||
if !optional_field.fld_name.is_null()
|
|
||||||
&& as_str(optional_field.fld_name) == "Autocrypt-Gossip"
|
|
||||||
{
|
|
||||||
let value = to_string_lossy(optional_field.fld_value);
|
|
||||||
let gossip_header = Aheader::from_str(&value);
|
let gossip_header = Aheader::from_str(&value);
|
||||||
|
|
||||||
if let Ok(ref header) = gossip_header {
|
if let Ok(ref header) = gossip_header {
|
||||||
@@ -462,8 +448,7 @@ fn update_gossip_peerstates(
|
|||||||
recipients = Some(mailimf_get_recipients(imffields));
|
recipients = Some(mailimf_get_recipients(imffields));
|
||||||
}
|
}
|
||||||
if recipients.as_ref().unwrap().contains(&header.addr) {
|
if recipients.as_ref().unwrap().contains(&header.addr) {
|
||||||
let mut peerstate =
|
let mut peerstate = Peerstate::from_addr(context, &context.sql, &header.addr);
|
||||||
Peerstate::from_addr(context, &context.sql, &header.addr);
|
|
||||||
if let Some(ref mut peerstate) = peerstate {
|
if let Some(ref mut peerstate) = peerstate {
|
||||||
peerstate.apply_gossip(header, message_time);
|
peerstate.apply_gossip(header, message_time);
|
||||||
peerstate.save_to_db(&context.sql, false)?;
|
peerstate.save_to_db(&context.sql, false)?;
|
||||||
@@ -482,14 +467,11 @@ fn update_gossip_peerstates(
|
|||||||
} else {
|
} else {
|
||||||
info!(
|
info!(
|
||||||
context,
|
context,
|
||||||
"Ignoring gossipped \"{}\" as the address is not in To/Cc list.",
|
"Ignoring gossipped \"{}\" as the address is not in To/Cc list.", &header.addr,
|
||||||
&header.addr,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(gossipped_addr)
|
Ok(gossipped_addr)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -202,6 +202,35 @@ pub unsafe fn mailimf_find_optional_field(
|
|||||||
ptr::null_mut()
|
ptr::null_mut()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn iter_optional_field_values(
|
||||||
|
header: *const mailimf_fields,
|
||||||
|
wanted_fld_name: *const libc::c_char,
|
||||||
|
) -> Result<Vec<String>, Error> {
|
||||||
|
ensure!(
|
||||||
|
!header.is_null() && unsafe { !(*header).fld_list.is_null() },
|
||||||
|
"iter_optional_fields: invalid input"
|
||||||
|
);
|
||||||
|
let mut result = Vec::default();
|
||||||
|
for cur_data in unsafe { (*(*header).fld_list).into_iter() } {
|
||||||
|
let field: *mut mailimf_field = cur_data as *mut _;
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
if (*field).fld_type == MAILIMF_FIELD_OPTIONAL_FIELD as libc::c_int {
|
||||||
|
let optional_field: *mut mailimf_optional_field =
|
||||||
|
(*field).fld_data.fld_optional_field;
|
||||||
|
if !optional_field.is_null()
|
||||||
|
&& !(*optional_field).fld_name.is_null()
|
||||||
|
&& !(*optional_field).fld_value.is_null()
|
||||||
|
&& strcasecmp((*optional_field).fld_name, wanted_fld_name) == 0i32
|
||||||
|
{
|
||||||
|
result.push(to_string((*optional_field).fld_value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(result)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn mailimf_get_recipients(imffields: *mut mailimf_fields) -> HashSet<String> {
|
pub fn mailimf_get_recipients(imffields: *mut mailimf_fields) -> HashSet<String> {
|
||||||
/* returned addresses are normalized. */
|
/* returned addresses are normalized. */
|
||||||
let mut recipients: HashSet<String> = Default::default();
|
let mut recipients: HashSet<String> = Default::default();
|
||||||
|
|||||||
Reference in New Issue
Block a user