Skip to content

Commit c8d2b4b

Browse files
committed
add UpdateFileMetadata api
also made sure to check for uploading or modifying specific files in the UploadFileMetadata API. This is probably worthless, but on the 1% chance that we bind a token to a file we're also uploading(?), then this is necessary.
1 parent 73e2c11 commit c8d2b4b

File tree

4 files changed

+63
-4
lines changed

4 files changed

+63
-4
lines changed

Cargo.lock

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,4 @@ COPY --from=builder-sqlx /build/bin/sqlx /usr/bin/sqlx
3131
COPY migrations /app/migrations
3232
COPY fly-airship-client ./fly-airship-client
3333

34-
CMD ["./fly-airship-client", "--", "/app/bin/file_server"]
34+
CMD ["/app/bin/file_server"]

src/main.rs

+37-2
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ use bfsp::{
5353
file_server_message::Message::{
5454
ChunksUploadedQuery, DeleteChunksQuery, DeleteFileMetadataQuery, DownloadChunkQuery,
5555
DownloadFileMetadataQuery, GetUsageQuery, ListChunkMetadataQuery, ListFileMetadataQuery,
56-
UploadChunk, UploadFileMetadata,
56+
UpdateFileMetadata, UploadChunk, UploadFileMetadata,
5757
},
5858
ChunkID, ChunkMetadata, ChunksUploadedQueryResp, DownloadChunkResp, FileServerMessage, Message,
5959
};
@@ -497,6 +497,13 @@ pub async fn handle_message<M: MetaDB + 'static, C: ChunkDB + 'static>(
497497
.encode_to_vec(),
498498
Err(_) => todo!(),
499499
},
500+
UpdateFileMetadata(query) => {
501+
let enc_meta = query.encrypted_file_metadata.unwrap();
502+
match handle_update_file_metadata(meta_db.as_ref(), &token, enc_meta).await {
503+
Ok(_) => bfsp::UpdateFileMetadataResp { err: None }.encode_to_vec(),
504+
Err(_) => todo!(),
505+
}
506+
}
500507
_ => todo!(),
501508
}
502509
.prepend_len())
@@ -660,7 +667,7 @@ pub async fn handle_upload_file_metadata<D: MetaDB>(
660667
token: &Biscuit,
661668
enc_file_meta: EncryptedFileMetadata,
662669
) -> Result<(), UploadMetadataError> {
663-
let user_id = authorize(Right::Write, token, Vec::new(), meta_db)
670+
let user_id = authorize(Right::Write, token, vec![enc_file_meta.id.clone()], meta_db)
664671
.await
665672
.unwrap();
666673

@@ -682,6 +689,34 @@ pub async fn handle_upload_file_metadata<D: MetaDB>(
682689
Ok(())
683690
}
684691

692+
#[tracing::instrument(err, skip(token, meta_db, enc_file_meta))]
693+
pub async fn handle_update_file_metadata<D: MetaDB>(
694+
meta_db: &D,
695+
token: &Biscuit,
696+
enc_file_meta: EncryptedFileMetadata,
697+
) -> Result<(), UploadMetadataError> {
698+
let user_id = authorize(Right::Write, token, vec![enc_file_meta.id.clone()], meta_db)
699+
.await
700+
.unwrap();
701+
702+
let storage_usages = meta_db.total_usages(&[user_id]).await.unwrap();
703+
let storage_usage = *storage_usages.get(&user_id).unwrap();
704+
705+
let storage_caps = meta_db.storage_caps(&[user_id]).await.unwrap();
706+
let storage_cap = *storage_caps.get(&user_id).unwrap();
707+
708+
if storage_usage + enc_file_meta.metadata.len() as u64 > storage_cap {
709+
todo!("Deny uploads that exceed storage cap");
710+
}
711+
712+
meta_db
713+
.update_file_meta(enc_file_meta, user_id)
714+
.await
715+
.unwrap();
716+
717+
Ok(())
718+
}
719+
685720
#[tracing::instrument(err, skip(token, meta_db))]
686721
pub async fn handle_download_file_metadata<D: MetaDB>(
687722
meta_db: &D,

src/meta_db.rs

+24
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ pub trait MetaDB: Sized + Send + Sync + std::fmt::Debug {
8484
enc_metadata: EncryptedFileMetadata,
8585
user_id: i64,
8686
) -> impl Future<Output = Result<()>> + Send;
87+
fn update_file_meta(
88+
&self,
89+
enc_metadata: EncryptedFileMetadata,
90+
user_id: i64,
91+
) -> impl Future<Output = Result<()>> + Send;
92+
8793
fn get_file_meta(
8894
&self,
8995
meta_id: String,
@@ -297,6 +303,24 @@ impl MetaDB for PostgresMetaDB {
297303
Ok(())
298304
}
299305

306+
#[tracing::instrument(err, skip(enc_file_meta))]
307+
async fn update_file_meta(
308+
&self,
309+
enc_file_meta: EncryptedFileMetadata,
310+
user_id: i64,
311+
) -> Result<()> {
312+
sqlx::query(
313+
"update file_metadata set id = $1, encrypted_metadata = $2, user_id = $3 where id = $1",
314+
)
315+
.bind(enc_file_meta.id)
316+
.bind(enc_file_meta.metadata)
317+
.bind(user_id)
318+
.execute(&self.pool)
319+
.await?;
320+
321+
Ok(())
322+
}
323+
300324
#[tracing::instrument(err)]
301325
async fn get_file_meta(
302326
&self,

0 commit comments

Comments
 (0)