Page MenuHomePhabricator

D13877.id.diff
No OneTemporary

D13877.id.diff

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
@@ -184,6 +184,65 @@
Ok(HttpResponse::Ok().finish())
}
+#[instrument(skip_all, fields(backup_id))]
+pub async fn upload_user_data(
+ user: UserIdentity,
+ blob_client: Authenticated<BlobServiceClient>,
+ db_client: web::Data<DatabaseClient>,
+ mut multipart: actix_multipart::Multipart,
+) -> actix_web::Result<HttpResponse> {
+ let backup_id = get_named_text_field("backup_id", &mut multipart).await?;
+ let blob_client = blob_client.with_user_identity(user.clone());
+ tracing::Span::current().record("backup_id", &backup_id);
+
+ info!("Backup User Data upload started");
+
+ let (user_data_blob_info, user_data_revoke) = forward_field_to_blob(
+ &mut multipart,
+ &blob_client,
+ "user_data_hash",
+ "user_data",
+ )
+ .await?;
+
+ let (attachments, attachments_revokes) =
+ process_attachments(&mut multipart, &blob_client).await?;
+
+ let existing_backup_item = db_client
+ .find_backup_item(&user.user_id, &backup_id)
+ .await
+ .map_err(BackupError::from)?
+ .ok_or(BackupError::NoBackup)?;
+
+ let item = BackupItem::new(
+ user.user_id.clone(),
+ backup_id,
+ existing_backup_item.user_keys.clone(),
+ Some(user_data_blob_info),
+ attachments,
+ existing_backup_item.siwe_backup_msg.clone(),
+ );
+
+ db_client
+ .put_backup_item(item)
+ .await
+ .map_err(BackupError::from)?;
+
+ user_data_revoke.cancel();
+ for attachment_revoke in attachments_revokes {
+ attachment_revoke.cancel();
+ }
+
+ existing_backup_item.revoke_user_data_holders(&blob_client);
+
+ db_client
+ .remove_old_backups(&user.user_id, &blob_client)
+ .await
+ .map_err(BackupError::from)?;
+
+ Ok(HttpResponse::Ok().finish())
+}
+
#[instrument(skip_all, fields(hash_field_name, data_field_name))]
async fn forward_field_to_blob<'revoke, 'blob: 'revoke>(
multipart: &mut actix_multipart::Multipart,
diff --git a/services/backup/src/http/mod.rs b/services/backup/src/http/mod.rs
--- a/services/backup/src/http/mod.rs
+++ b/services/backup/src/http/mod.rs
@@ -68,6 +68,12 @@
web::resource("/user_keys")
.route(web::post().to(handlers::backup::upload_user_keys)),
)
+ // Uploads User Data without creating a new backup.
+ // User Data are mandatory for this operation.
+ .service(
+ web::resource("/user_data")
+ .route(web::post().to(handlers::backup::upload_user_data)),
+ )
.service(
web::resource("{backup_id}/user_keys")
.route(web::get().to(handlers::backup::download_user_keys)),

File Metadata

Mime Type
text/plain
Expires
Thu, Nov 7, 3:24 PM (19 h, 47 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2436748
Default Alt Text
D13877.id.diff (2 KB)

Event Timeline