Skip to content

Commit eea848f

Browse files
committed
fix: don't ignore QR token timestamp from sync messages
1 parent 214a1d3 commit eea848f

File tree

3 files changed

+40
-14
lines changed

3 files changed

+40
-14
lines changed

src/qr.rs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use crate::key::Fingerprint;
1919
use crate::net::http::post_empty;
2020
use crate::net::proxy::{DEFAULT_SOCKS_PORT, ProxyConfig};
2121
use crate::token;
22-
use crate::tools::validate_id;
22+
use crate::tools::{time, validate_id};
2323

2424
const OPENPGP4FPR_SCHEME: &str = "OPENPGP4FPR:"; // yes: uppercase
2525
const IDELTACHAT_SCHEME: &str = "https://i.delta.chat/#";
@@ -741,8 +741,16 @@ pub async fn set_config_from_qr(context: &Context, qr: &str) -> Result<()> {
741741
authcode,
742742
..
743743
} => {
744-
token::save(context, token::Namespace::InviteNumber, None, &invitenumber).await?;
745-
token::save(context, token::Namespace::Auth, None, &authcode).await?;
744+
let timestamp = time();
745+
token::save(
746+
context,
747+
token::Namespace::InviteNumber,
748+
None,
749+
&invitenumber,
750+
timestamp,
751+
)
752+
.await?;
753+
token::save(context, token::Namespace::Auth, None, &authcode, timestamp).await?;
746754
context.sync_qr_code_tokens(None).await?;
747755
context.scheduler.interrupt_inbox().await;
748756
}
@@ -752,14 +760,23 @@ pub async fn set_config_from_qr(context: &Context, qr: &str) -> Result<()> {
752760
grpid,
753761
..
754762
} => {
763+
let timestamp = time();
755764
token::save(
756765
context,
757766
token::Namespace::InviteNumber,
758767
Some(&grpid),
759768
&invitenumber,
769+
timestamp,
770+
)
771+
.await?;
772+
token::save(
773+
context,
774+
token::Namespace::Auth,
775+
Some(&grpid),
776+
&authcode,
777+
timestamp,
760778
)
761779
.await?;
762-
token::save(context, token::Namespace::Auth, Some(&grpid), &authcode).await?;
763780
context.sync_qr_code_tokens(Some(&grpid)).await?;
764781
context.scheduler.interrupt_inbox().await;
765782
}

src/sync.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -258,8 +258,8 @@ impl Context {
258258
for item in &items.items {
259259
match &item.data {
260260
SyncDataOrUnknown::SyncData(data) => match data {
261-
AddQrToken(token) => self.add_qr_token(token).await,
262-
DeleteQrToken(token) => self.delete_qr_token(token).await,
261+
AddQrToken(token) => self.add_qr_token(token, item.timestamp).await,
262+
DeleteQrToken(token) => self.delete_qr_token(token, item.timestamp).await,
263263
AlterChat { id, action } => self.sync_alter_chat(id, action).await,
264264
SyncData::Config { key, val } => self.sync_config(key, val).await,
265265
SyncData::SaveMessage { src, dest } => self.save_message(src, dest).await,
@@ -284,21 +284,28 @@ impl Context {
284284
}
285285
}
286286

287-
async fn add_qr_token(&self, token: &QrTokenData) -> Result<()> {
287+
async fn add_qr_token(&self, token: &QrTokenData, timestamp: i64) -> Result<()> {
288288
let grpid = token.grpid.as_deref();
289-
token::save(self, Namespace::InviteNumber, grpid, &token.invitenumber).await?;
290-
token::save(self, Namespace::Auth, grpid, &token.auth).await?;
289+
token::save(
290+
self,
291+
Namespace::InviteNumber,
292+
grpid,
293+
&token.invitenumber,
294+
timestamp,
295+
)
296+
.await?;
297+
token::save(self, Namespace::Auth, grpid, &token.auth, timestamp).await?;
291298
Ok(())
292299
}
293300

294-
async fn delete_qr_token(&self, token: &QrTokenData) -> Result<()> {
301+
async fn delete_qr_token(&self, token: &QrTokenData, timestamp: i64) -> Result<()> {
295302
self.sql
296303
.execute(
297304
"DELETE FROM tokens
298305
WHERE foreign_key IN
299306
(SELECT foreign_key FROM tokens
300-
WHERE token=? OR token=?)",
301-
(&token.invitenumber, &token.auth),
307+
WHERE token=? OR token=? AND timestamp <= ?)",
308+
(&token.invitenumber, &token.auth, timestamp),
302309
)
303310
.await?;
304311
Ok(())

src/token.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,13 @@ pub async fn save(
2828
namespace: Namespace,
2929
foreign_key: Option<&str>,
3030
token: &str,
31+
timestamp: i64,
3132
) -> Result<()> {
3233
context
3334
.sql
3435
.execute(
3536
"INSERT INTO tokens (namespc, foreign_key, token, timestamp) VALUES (?, ?, ?, ?)",
36-
(namespace, foreign_key.unwrap_or(""), token, time()),
37+
(namespace, foreign_key.unwrap_or(""), token, timestamp),
3738
)
3839
.await?;
3940
Ok(())
@@ -71,7 +72,8 @@ pub async fn lookup_or_new(
7172
}
7273

7374
let token = create_id();
74-
save(context, namespace, foreign_key, &token).await?;
75+
let timestamp = time();
76+
save(context, namespace, foreign_key, &token, timestamp).await?;
7577
Ok(token)
7678
}
7779

0 commit comments

Comments
 (0)