Skip to content

Commit 9b77402

Browse files
committed
fix: don't ignore QR token timestamp from sync messages
1 parent 82bc1bf commit 9b77402

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
@@ -20,7 +20,7 @@ use crate::message::Message;
2020
use crate::net::http::post_empty;
2121
use crate::net::proxy::{DEFAULT_SOCKS_PORT, ProxyConfig};
2222
use crate::token;
23-
use crate::tools::validate_id;
23+
use crate::tools::{time, validate_id};
2424

2525
const OPENPGP4FPR_SCHEME: &str = "OPENPGP4FPR:"; // yes: uppercase
2626
const IDELTACHAT_SCHEME: &str = "https://i.delta.chat/#";
@@ -787,8 +787,16 @@ pub async fn set_config_from_qr(context: &Context, qr: &str) -> Result<()> {
787787
authcode,
788788
..
789789
} => {
790-
token::save(context, token::Namespace::InviteNumber, None, &invitenumber).await?;
791-
token::save(context, token::Namespace::Auth, None, &authcode).await?;
790+
let timestamp = time();
791+
token::save(
792+
context,
793+
token::Namespace::InviteNumber,
794+
None,
795+
&invitenumber,
796+
timestamp,
797+
)
798+
.await?;
799+
token::save(context, token::Namespace::Auth, None, &authcode, timestamp).await?;
792800
context.sync_qr_code_tokens(None).await?;
793801
context.scheduler.interrupt_inbox().await;
794802
}
@@ -798,14 +806,23 @@ pub async fn set_config_from_qr(context: &Context, qr: &str) -> Result<()> {
798806
grpid,
799807
..
800808
} => {
809+
let timestamp = time();
801810
token::save(
802811
context,
803812
token::Namespace::InviteNumber,
804813
Some(&grpid),
805814
&invitenumber,
815+
timestamp,
816+
)
817+
.await?;
818+
token::save(
819+
context,
820+
token::Namespace::Auth,
821+
Some(&grpid),
822+
&authcode,
823+
timestamp,
806824
)
807825
.await?;
808-
token::save(context, token::Namespace::Auth, Some(&grpid), &authcode).await?;
809826
context.sync_qr_code_tokens(Some(&grpid)).await?;
810827
context.scheduler.interrupt_inbox().await;
811828
}

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)