@@ -208,11 +208,12 @@ impl MimeMessage {
208
208
) -> Result < Self > {
209
209
let mail = mailparse:: parse_mail ( body) ?;
210
210
211
- let message_time = mail
211
+ let timestamp_rcvd = smeared_time ( context) ;
212
+ let timestamp_sent = mail
212
213
. headers
213
214
. get_header_value ( HeaderDef :: Date )
214
215
. and_then ( |v| mailparse:: dateparse ( & v) . ok ( ) )
215
- . unwrap_or_default ( ) ;
216
+ . map_or ( timestamp_rcvd , |value| min ( value , timestamp_rcvd + 60 ) ) ;
216
217
let mut hop_info = parse_receive_headers ( & mail. get_headers ( ) ) ;
217
218
218
219
let mut headers = Default :: default ( ) ;
@@ -279,7 +280,7 @@ impl MimeMessage {
279
280
let private_keyring = load_self_secret_keyring ( context) . await ?;
280
281
281
282
let mut decryption_info =
282
- prepare_decryption ( context, & mail, & from. addr , message_time ) . await ?;
283
+ prepare_decryption ( context, & mail, & from. addr , timestamp_sent ) . await ?;
283
284
284
285
// Memory location for a possible decrypted message.
285
286
let mut mail_raw = Vec :: new ( ) ;
@@ -325,7 +326,7 @@ impl MimeMessage {
325
326
let gossip_headers = mail. headers . get_all_values ( "Autocrypt-Gossip" ) ;
326
327
gossiped_keys = update_gossip_peerstates (
327
328
context,
328
- message_time ,
329
+ timestamp_sent ,
329
330
& from. addr ,
330
331
& recipients,
331
332
gossip_headers,
@@ -376,12 +377,12 @@ impl MimeMessage {
376
377
377
378
// If it is not a read receipt, degrade encryption.
378
379
if let ( Some ( peerstate) , Ok ( mail) ) = ( & mut decryption_info. peerstate , mail) {
379
- if message_time > peerstate. last_seen_autocrypt
380
+ if timestamp_sent > peerstate. last_seen_autocrypt
380
381
&& mail. ctype . mimetype != "multipart/report"
381
382
// Disallowing keychanges is disabled for now:
382
383
// && decryption_info.dkim_results.allow_keychange
383
384
{
384
- peerstate. degrade_encryption ( message_time ) ;
385
+ peerstate. degrade_encryption ( timestamp_sent ) ;
385
386
}
386
387
}
387
388
}
@@ -395,12 +396,6 @@ impl MimeMessage {
395
396
}
396
397
}
397
398
398
- let timestamp_rcvd = smeared_time ( context) ;
399
- let timestamp_sent = headers
400
- . get ( HeaderDef :: Date . get_headername ( ) )
401
- . and_then ( |value| mailparse:: dateparse ( value) . ok ( ) )
402
- . map_or ( timestamp_rcvd, |value| min ( value, timestamp_rcvd + 60 ) ) ;
403
-
404
399
let mut parser = MimeMessage {
405
400
parts : Vec :: new ( ) ,
406
401
headers,
@@ -2237,6 +2232,7 @@ mod tests {
2237
2232
message:: { Message , MessageState , MessengerMessage } ,
2238
2233
receive_imf:: receive_imf,
2239
2234
test_utils:: TestContext ,
2235
+ tools:: time,
2240
2236
} ;
2241
2237
2242
2238
impl AvatarAction {
@@ -3849,4 +3845,40 @@ Content-Disposition: reaction\n\
3849
3845
3850
3846
Ok ( ( ) )
3851
3847
}
3848
+
3849
+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 2 ) ]
3850
+ async fn test_time_in_future ( ) -> Result < ( ) > {
3851
+ let alice = TestContext :: new_alice ( ) . await ;
3852
+
3853
+ let beginning_time = time ( ) ;
3854
+
3855
+ // Receive a message with a date far in the future (year 3004)
3856
+ // I'm just going to assume that no one uses this code after the year 3000
3857
+ let mime_message = MimeMessage :: from_bytes (
3858
+ & alice,
3859
+ b"To: alice@example.org\n \
3860
+ From: bob@example.net\n \
3861
+ Date: Today, 29 February 3004 00:00:10 -800\n \
3862
+ Message-ID: 56789@example.net\n \
3863
+ Subject: Meeting\n \
3864
+ Mime-Version: 1.0 (1.0)\n \
3865
+ Content-Type: text/plain; charset=utf-8\n \
3866
+ \n \
3867
+ Hi",
3868
+ None ,
3869
+ )
3870
+ . await ?;
3871
+
3872
+ // We do allow the time to be in the future a bit (because of unsynchronized clocks),
3873
+ // but only 60 seconds:
3874
+ assert ! ( mime_message. decryption_info. message_time <= time( ) + 60 ) ;
3875
+ assert ! ( mime_message. decryption_info. message_time >= beginning_time + 60 ) ;
3876
+ assert_eq ! (
3877
+ mime_message. decryption_info. message_time,
3878
+ mime_message. timestamp_sent
3879
+ ) ;
3880
+ assert ! ( mime_message. timestamp_rcvd <= time( ) ) ;
3881
+
3882
+ Ok ( ( ) )
3883
+ }
3852
3884
}
0 commit comments