@@ -44,6 +44,7 @@ use matrix_sdk_base::crypto::{
44
44
use matrix_sdk_common:: { executor:: spawn, locks:: Mutex as StdMutex } ;
45
45
use ruma:: {
46
46
api:: client:: {
47
+ error:: ErrorBody ,
47
48
keys:: {
48
49
get_keys, upload_keys, upload_signatures:: v3:: Request as UploadSignaturesRequest ,
49
50
upload_signing_keys:: v3:: Request as UploadSigningKeysRequest ,
@@ -85,7 +86,7 @@ use crate::{
85
86
client:: { ClientInner , WeakClient } ,
86
87
error:: HttpResult ,
87
88
store_locks:: CrossProcessStoreLockGuard ,
88
- Client , Error , HttpError , Result , Room , TransmissionProgress ,
89
+ Client , Error , HttpError , Result , Room , RumaApiError , TransmissionProgress ,
89
90
} ;
90
91
91
92
pub mod backups;
@@ -622,7 +623,26 @@ impl Client {
622
623
self . keys_query ( r. request_id ( ) , request. device_keys . clone ( ) ) . await ?;
623
624
}
624
625
AnyOutgoingRequest :: KeysUpload ( request) => {
625
- self . keys_upload ( r. request_id ( ) , request) . await ?;
626
+ self . keys_upload ( r. request_id ( ) , request) . await . inspect_err ( |e| {
627
+ match e. as_ruma_api_error ( ) {
628
+ Some ( RumaApiError :: ClientApi ( e) ) if e. status_code == 400 => {
629
+ if let ErrorBody :: Standard { message, .. } = & e. body {
630
+ // This is one of the nastiest errors we can have. The server
631
+ // telling us that we already have a one-time key uploaded means
632
+ // that we forgot about some of our one-time keys. This will lead to
633
+ // UTDs.
634
+ if message. starts_with ( "One time key" ) {
635
+ tracing:: error!(
636
+ sentry = true ,
637
+ error_message = message,
638
+ "Duplicate one-time keys have been uploaded"
639
+ ) ;
640
+ }
641
+ }
642
+ }
643
+ _ => { }
644
+ }
645
+ } ) ?;
626
646
}
627
647
AnyOutgoingRequest :: ToDeviceRequest ( request) => {
628
648
let response = self . send_to_device ( request) . await ?;
0 commit comments