mirror of
https://github.com/chatmail/core.git
synced 2026-05-22 16:26:31 +03:00
feat: Scale up contact origins to OutgoingTo when sending a message
This commit is contained in:
@@ -292,7 +292,7 @@ impl ChatId {
|
|||||||
ChatIdBlocked::get_for_contact(context, contact_id, create_blocked)
|
ChatIdBlocked::get_for_contact(context, contact_id, create_blocked)
|
||||||
.await
|
.await
|
||||||
.map(|chat| chat.id)?;
|
.map(|chat| chat.id)?;
|
||||||
Contact::scaleup_origin_by_id(context, contact_id, Origin::CreateChat).await?;
|
ContactId::scaleup_origin(context, &[contact_id], Origin::CreateChat).await?;
|
||||||
chat_id
|
chat_id
|
||||||
} else {
|
} else {
|
||||||
warn!(
|
warn!(
|
||||||
@@ -489,7 +489,7 @@ impl ChatId {
|
|||||||
// went to "contact requests" list rather than normal chatlist.
|
// went to "contact requests" list rather than normal chatlist.
|
||||||
for contact_id in get_chat_contacts(context, self).await? {
|
for contact_id in get_chat_contacts(context, self).await? {
|
||||||
if contact_id != ContactId::SELF {
|
if contact_id != ContactId::SELF {
|
||||||
Contact::scaleup_origin_by_id(context, contact_id, Origin::CreateChat)
|
ContactId::scaleup_origin(context, &[contact_id], Origin::CreateChat)
|
||||||
.await?;
|
.await?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,6 +120,29 @@ impl ContactId {
|
|||||||
.await?;
|
.await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Updates the origin of the contacts, but only if `origin` is higher than the current one.
|
||||||
|
pub(crate) async fn scaleup_origin(
|
||||||
|
context: &Context,
|
||||||
|
ids: &[Self],
|
||||||
|
origin: Origin,
|
||||||
|
) -> Result<()> {
|
||||||
|
context
|
||||||
|
.sql
|
||||||
|
.execute(
|
||||||
|
&format!(
|
||||||
|
"UPDATE contacts SET origin=? WHERE id IN ({}) AND origin<?",
|
||||||
|
sql::repeat_vars(ids.len())
|
||||||
|
),
|
||||||
|
rusqlite::params_from_iter(
|
||||||
|
params_iter(&[origin])
|
||||||
|
.chain(params_iter(ids))
|
||||||
|
.chain(params_iter(&[origin])),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for ContactId {
|
impl fmt::Display for ContactId {
|
||||||
@@ -1383,22 +1406,6 @@ impl Contact {
|
|||||||
.await?;
|
.await?;
|
||||||
Ok(exists)
|
Ok(exists)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Updates the origin of the contact, but only if new origin is higher than the current one.
|
|
||||||
pub async fn scaleup_origin_by_id(
|
|
||||||
context: &Context,
|
|
||||||
contact_id: ContactId,
|
|
||||||
origin: Origin,
|
|
||||||
) -> Result<()> {
|
|
||||||
context
|
|
||||||
.sql
|
|
||||||
.execute(
|
|
||||||
"UPDATE contacts SET origin=? WHERE id=? AND origin<?;",
|
|
||||||
(origin, contact_id, origin),
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn set_blocked(
|
pub(crate) async fn set_blocked(
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ 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::{Chattype, DC_FROM_HANDSHAKE};
|
use crate::constants::{Chattype, DC_FROM_HANDSHAKE};
|
||||||
use crate::contact::Contact;
|
use crate::contact::{Contact, ContactId, Origin};
|
||||||
use crate::context::Context;
|
use crate::context::Context;
|
||||||
use crate::e2ee::EncryptHelper;
|
use crate::e2ee::EncryptHelper;
|
||||||
use crate::ephemeral::Timer as EphemeralTimer;
|
use crate::ephemeral::Timer as EphemeralTimer;
|
||||||
@@ -155,6 +155,7 @@ impl<'a> MimeFactory<'a> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let mut recipients = Vec::with_capacity(5);
|
let mut recipients = Vec::with_capacity(5);
|
||||||
|
let mut recipient_ids = HashSet::new();
|
||||||
let mut req_mdn = false;
|
let mut req_mdn = false;
|
||||||
|
|
||||||
if chat.is_self_talk() {
|
if chat.is_self_talk() {
|
||||||
@@ -169,7 +170,7 @@ impl<'a> MimeFactory<'a> {
|
|||||||
context
|
context
|
||||||
.sql
|
.sql
|
||||||
.query_map(
|
.query_map(
|
||||||
"SELECT c.authname, c.addr \
|
"SELECT c.authname, c.addr, c.id \
|
||||||
FROM chats_contacts cc \
|
FROM chats_contacts cc \
|
||||||
LEFT JOIN contacts c ON cc.contact_id=c.id \
|
LEFT JOIN contacts c ON cc.contact_id=c.id \
|
||||||
WHERE cc.chat_id=? AND cc.contact_id>9;",
|
WHERE cc.chat_id=? AND cc.contact_id>9;",
|
||||||
@@ -177,19 +178,23 @@ impl<'a> MimeFactory<'a> {
|
|||||||
|row| {
|
|row| {
|
||||||
let authname: String = row.get(0)?;
|
let authname: String = row.get(0)?;
|
||||||
let addr: String = row.get(1)?;
|
let addr: String = row.get(1)?;
|
||||||
Ok((authname, addr))
|
let id: ContactId = row.get(2)?;
|
||||||
|
Ok((authname, addr, id))
|
||||||
},
|
},
|
||||||
|rows| {
|
|rows| {
|
||||||
for row in rows {
|
for row in rows {
|
||||||
let (authname, addr) = row?;
|
let (authname, addr, id) = row?;
|
||||||
if !recipients_contain_addr(&recipients, &addr) {
|
if !recipients_contain_addr(&recipients, &addr) {
|
||||||
recipients.push((authname, addr));
|
recipients.push((authname, addr));
|
||||||
}
|
}
|
||||||
|
recipient_ids.insert(id);
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
let recipient_ids: Vec<_> = recipient_ids.into_iter().collect();
|
||||||
|
ContactId::scaleup_origin(context, &recipient_ids, Origin::OutgoingTo).await?;
|
||||||
|
|
||||||
if !msg.is_system_message()
|
if !msg.is_system_message()
|
||||||
&& msg.param.get_int(Param::Reaction).unwrap_or_default() == 0
|
&& msg.param.get_int(Param::Reaction).unwrap_or_default() == 0
|
||||||
|
|||||||
@@ -955,7 +955,7 @@ async fn add_parts(
|
|||||||
if create_blocked == Blocked::Request && parent.is_some() {
|
if create_blocked == Blocked::Request && parent.is_some() {
|
||||||
// we do not want any chat to be created implicitly. Because of the origin-scale-up,
|
// we do not want any chat to be created implicitly. Because of the origin-scale-up,
|
||||||
// the contact requests will pop up and this should be just fine.
|
// the contact requests will pop up and this should be just fine.
|
||||||
Contact::scaleup_origin_by_id(context, from_id, Origin::IncomingReplyTo)
|
ContactId::scaleup_origin(context, &[from_id], Origin::IncomingReplyTo)
|
||||||
.await?;
|
.await?;
|
||||||
info!(
|
info!(
|
||||||
context,
|
context,
|
||||||
|
|||||||
@@ -447,7 +447,7 @@ pub(crate) async fn handle_securejoin_handshake(
|
|||||||
return Ok(HandshakeMessage::Ignore);
|
return Ok(HandshakeMessage::Ignore);
|
||||||
}
|
}
|
||||||
contact_id.regossip_keys(context).await?;
|
contact_id.regossip_keys(context).await?;
|
||||||
Contact::scaleup_origin_by_id(context, contact_id, Origin::SecurejoinInvited).await?;
|
ContactId::scaleup_origin(context, &[contact_id], Origin::SecurejoinInvited).await?;
|
||||||
info!(context, "Auth verified.",);
|
info!(context, "Auth verified.",);
|
||||||
context.emit_event(EventType::ContactsChanged(Some(contact_id)));
|
context.emit_event(EventType::ContactsChanged(Some(contact_id)));
|
||||||
inviter_progress(context, contact_id, 600);
|
inviter_progress(context, contact_id, 600);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ use super::qrinvite::QrInvite;
|
|||||||
use super::{encrypted_and_signed, verify_sender_by_fingerprint};
|
use super::{encrypted_and_signed, verify_sender_by_fingerprint};
|
||||||
use crate::chat::{self, ChatId};
|
use crate::chat::{self, ChatId};
|
||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
use crate::contact::{Contact, Origin};
|
use crate::contact::{ContactId, Origin};
|
||||||
use crate::context::Context;
|
use crate::context::Context;
|
||||||
use crate::events::EventType;
|
use crate::events::EventType;
|
||||||
use crate::headerdef::HeaderDef;
|
use crate::headerdef::HeaderDef;
|
||||||
@@ -326,8 +326,12 @@ impl BobState {
|
|||||||
Some(context.get_config_i64(Config::KeyId).await?).filter(|&id| id > 0);
|
Some(context.get_config_i64(Config::KeyId).await?).filter(|&id| id > 0);
|
||||||
peerstate.save_to_db(&context.sql).await?;
|
peerstate.save_to_db(&context.sql).await?;
|
||||||
|
|
||||||
Contact::scaleup_origin_by_id(context, self.invite.contact_id(), Origin::SecurejoinJoined)
|
ContactId::scaleup_origin(
|
||||||
.await?;
|
context,
|
||||||
|
&[self.invite.contact_id()],
|
||||||
|
Origin::SecurejoinJoined,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
context.emit_event(EventType::ContactsChanged(None));
|
context.emit_event(EventType::ContactsChanged(None));
|
||||||
|
|
||||||
self.update_next(&context.sql, SecureJoinStep::Completed)
|
self.update_next(&context.sql, SecureJoinStep::Completed)
|
||||||
|
|||||||
Reference in New Issue
Block a user