diff --git a/native/native_rust_library/src/backup/upload_handler.rs b/native/native_rust_library/src/backup/upload_handler.rs --- a/native/native_rust_library/src/backup/upload_handler.rs +++ b/native/native_rust_library/src/backup/upload_handler.rs @@ -234,12 +234,20 @@ Err(err) => return Err(err.into()), }; + let version_info = backup_client::BackupVersionInfo { + code_version: crate::generated::CODE_VERSION as u16, + state_version: crate::generated::STATE_VERSION as u16, + // TODO: Pass DB version value here + ..Default::default() + }; + let backup_data = BackupData { backup_id: backup_id.clone(), user_data, user_keys, attachments, siwe_backup_msg, + version_info, }; let result = backup_client diff --git a/services/backup/src/http/handlers/backup.rs b/services/backup/src/http/handlers/backup.rs --- a/services/backup/src/http/handlers/backup.rs +++ b/services/backup/src/http/handlers/backup.rs @@ -5,7 +5,7 @@ }; use comm_lib::{ auth::{AuthorizationCredential, UserIdentity}, - backup::LatestBackupInfoResponse, + backup::{BackupVersionInfo, LatestBackupInfoResponse}, blob::{ client::BlobServiceClient, types::{http::BlobSizesRequest, BlobInfo}, @@ -54,6 +54,9 @@ let aux_data = multipart.get_aux_data().await?; let siwe_backup_msg = aux_data.get_siwe_backup_msg()?; + let version_info = aux_data + .get_backup_version_info()? + .ok_or(BackupError::BadRequest)?; let item = BackupItem::new( user.user_id.clone(), @@ -64,7 +67,7 @@ siwe_backup_msg, // TODO: use real values here 0, - Default::default(), + version_info, ); db_client @@ -170,6 +173,11 @@ let (attachments, attachments_revokes) = multipart.process_attachmens_field(&blob_client).await?; + let aux_data = multipart.get_aux_data().await?; + let version_info = aux_data + .get_backup_version_info()? + .ok_or(BackupError::BadRequest)?; + let existing_backup_item = db_client .find_backup_item(&user.user_id, &backup_id) .await @@ -185,7 +193,7 @@ existing_backup_item.siwe_backup_msg.clone(), // TODO: use real values here 0, - Default::default(), + version_info, ); db_client @@ -361,6 +369,9 @@ let aux_data = multipart.get_aux_data().await?; let siwe_backup_msg = aux_data.get_siwe_backup_msg()?; + // old clients didn't upload version info + let version_info = aux_data.get_backup_version_info()?.unwrap_or_default(); + let ordered_backup_item = db_client .find_last_backup_item(user_id) .await @@ -431,7 +442,7 @@ siwe_backup_msg, // TODO: use real values here 0, - Default::default(), + version_info, ); Ok((item, revokes)) @@ -616,6 +627,17 @@ let siwe_backup_msg = parse_bytes_to_string(buf.clone())?; Ok(Some(siwe_backup_msg)) } + + fn get_backup_version_info( + &self, + ) -> actix_web::Result> { + let Some(buf) = self.0.get("version_info") else { + return Ok(None); + }; + + let version_info = serde_json::from_slice(buf)?; + Ok(Some(version_info)) + } } mod blob_utils { diff --git a/services/commtest/src/backup/backup_utils.rs b/services/commtest/src/backup/backup_utils.rs --- a/services/commtest/src/backup/backup_utils.rs +++ b/services/commtest/src/backup/backup_utils.rs @@ -24,6 +24,7 @@ )), attachments: vec![], siwe_backup_msg: Some("message".to_string()), + version_info: Default::default(), } } diff --git a/shared/backup_client/src/lib.rs b/shared/backup_client/src/lib.rs --- a/shared/backup_client/src/lib.rs +++ b/shared/backup_client/src/lib.rs @@ -54,6 +54,7 @@ user_data, attachments, siwe_backup_msg, + version_info, } = backup_data; let endpoint = match (user_data.clone(), user_keys.clone()) { @@ -89,6 +90,9 @@ form = form.text("siwe_backup_msg", siwe_backup_msg_value); } + let version_info_payload = serde_json::to_string(&version_info)?; + form = form.text("version_info", version_info_payload); + let response = client .post(self.url.join(endpoint)?) .bearer_auth(user_identity.as_authorization_token()?) @@ -343,6 +347,7 @@ pub user_data: Option>, pub attachments: Vec, pub siwe_backup_msg: Option, + pub version_info: BackupVersionInfo, } #[derive(Debug, Clone, Serialize, Deserialize)]