fix: don't ignore QR token timestamp from sync messages

This commit is contained in:
link2xt
2025-09-09 03:07:55 +00:00
parent 214a1d3e2d
commit eea848f72b
3 changed files with 40 additions and 14 deletions

View File

@@ -19,7 +19,7 @@ use crate::key::Fingerprint;
use crate::net::http::post_empty; use crate::net::http::post_empty;
use crate::net::proxy::{DEFAULT_SOCKS_PORT, ProxyConfig}; use crate::net::proxy::{DEFAULT_SOCKS_PORT, ProxyConfig};
use crate::token; use crate::token;
use crate::tools::validate_id; use crate::tools::{time, validate_id};
const OPENPGP4FPR_SCHEME: &str = "OPENPGP4FPR:"; // yes: uppercase const OPENPGP4FPR_SCHEME: &str = "OPENPGP4FPR:"; // yes: uppercase
const IDELTACHAT_SCHEME: &str = "https://i.delta.chat/#"; const IDELTACHAT_SCHEME: &str = "https://i.delta.chat/#";
@@ -741,8 +741,16 @@ pub async fn set_config_from_qr(context: &Context, qr: &str) -> Result<()> {
authcode, authcode,
.. ..
} => { } => {
token::save(context, token::Namespace::InviteNumber, None, &invitenumber).await?; let timestamp = time();
token::save(context, token::Namespace::Auth, None, &authcode).await?; token::save(
context,
token::Namespace::InviteNumber,
None,
&invitenumber,
timestamp,
)
.await?;
token::save(context, token::Namespace::Auth, None, &authcode, timestamp).await?;
context.sync_qr_code_tokens(None).await?; context.sync_qr_code_tokens(None).await?;
context.scheduler.interrupt_inbox().await; context.scheduler.interrupt_inbox().await;
} }
@@ -752,14 +760,23 @@ pub async fn set_config_from_qr(context: &Context, qr: &str) -> Result<()> {
grpid, grpid,
.. ..
} => { } => {
let timestamp = time();
token::save( token::save(
context, context,
token::Namespace::InviteNumber, token::Namespace::InviteNumber,
Some(&grpid), Some(&grpid),
&invitenumber, &invitenumber,
timestamp,
)
.await?;
token::save(
context,
token::Namespace::Auth,
Some(&grpid),
&authcode,
timestamp,
) )
.await?; .await?;
token::save(context, token::Namespace::Auth, Some(&grpid), &authcode).await?;
context.sync_qr_code_tokens(Some(&grpid)).await?; context.sync_qr_code_tokens(Some(&grpid)).await?;
context.scheduler.interrupt_inbox().await; context.scheduler.interrupt_inbox().await;
} }

View File

@@ -258,8 +258,8 @@ impl Context {
for item in &items.items { for item in &items.items {
match &item.data { match &item.data {
SyncDataOrUnknown::SyncData(data) => match data { SyncDataOrUnknown::SyncData(data) => match data {
AddQrToken(token) => self.add_qr_token(token).await, AddQrToken(token) => self.add_qr_token(token, item.timestamp).await,
DeleteQrToken(token) => self.delete_qr_token(token).await, DeleteQrToken(token) => self.delete_qr_token(token, item.timestamp).await,
AlterChat { id, action } => self.sync_alter_chat(id, action).await, AlterChat { id, action } => self.sync_alter_chat(id, action).await,
SyncData::Config { key, val } => self.sync_config(key, val).await, SyncData::Config { key, val } => self.sync_config(key, val).await,
SyncData::SaveMessage { src, dest } => self.save_message(src, dest).await, SyncData::SaveMessage { src, dest } => self.save_message(src, dest).await,
@@ -284,21 +284,28 @@ impl Context {
} }
} }
async fn add_qr_token(&self, token: &QrTokenData) -> Result<()> { async fn add_qr_token(&self, token: &QrTokenData, timestamp: i64) -> Result<()> {
let grpid = token.grpid.as_deref(); let grpid = token.grpid.as_deref();
token::save(self, Namespace::InviteNumber, grpid, &token.invitenumber).await?; token::save(
token::save(self, Namespace::Auth, grpid, &token.auth).await?; self,
Namespace::InviteNumber,
grpid,
&token.invitenumber,
timestamp,
)
.await?;
token::save(self, Namespace::Auth, grpid, &token.auth, timestamp).await?;
Ok(()) Ok(())
} }
async fn delete_qr_token(&self, token: &QrTokenData) -> Result<()> { async fn delete_qr_token(&self, token: &QrTokenData, timestamp: i64) -> Result<()> {
self.sql self.sql
.execute( .execute(
"DELETE FROM tokens "DELETE FROM tokens
WHERE foreign_key IN WHERE foreign_key IN
(SELECT foreign_key FROM tokens (SELECT foreign_key FROM tokens
WHERE token=? OR token=?)", WHERE token=? OR token=? AND timestamp <= ?)",
(&token.invitenumber, &token.auth), (&token.invitenumber, &token.auth, timestamp),
) )
.await?; .await?;
Ok(()) Ok(())

View File

@@ -28,12 +28,13 @@ pub async fn save(
namespace: Namespace, namespace: Namespace,
foreign_key: Option<&str>, foreign_key: Option<&str>,
token: &str, token: &str,
timestamp: i64,
) -> Result<()> { ) -> Result<()> {
context context
.sql .sql
.execute( .execute(
"INSERT INTO tokens (namespc, foreign_key, token, timestamp) VALUES (?, ?, ?, ?)", "INSERT INTO tokens (namespc, foreign_key, token, timestamp) VALUES (?, ?, ?, ?)",
(namespace, foreign_key.unwrap_or(""), token, time()), (namespace, foreign_key.unwrap_or(""), token, timestamp),
) )
.await?; .await?;
Ok(()) Ok(())
@@ -71,7 +72,8 @@ pub async fn lookup_or_new(
} }
let token = create_id(); let token = create_id();
save(context, namespace, foreign_key, &token).await?; let timestamp = time();
save(context, namespace, foreign_key, &token, timestamp).await?;
Ok(token) Ok(token)
} }