Merge branch 'Add-S3-server-side-encryption-option' into 'main'

Add S3 server side encryption option

See merge request gstreamer/gst-plugins-rs!1288
This commit is contained in:
Vittorio Palmisano 2024-03-29 18:15:05 +00:00
commit 0823ad048f

View file

@ -22,7 +22,7 @@ use aws_sdk_s3::{
upload_part::builders::UploadPartFluentBuilder, upload_part::builders::UploadPartFluentBuilder,
}, },
primitives::ByteStream, primitives::ByteStream,
types::{CompletedMultipartUpload, CompletedPart}, types::{CompletedMultipartUpload, CompletedPart, ServerSideEncryption},
Client, Client,
}; };
@ -30,6 +30,7 @@ use futures::future;
use once_cell::sync::Lazy; use once_cell::sync::Lazy;
use std::collections::HashMap; use std::collections::HashMap;
use std::convert::From; use std::convert::From;
use std::str::FromStr;
use std::sync::Mutex; use std::sync::Mutex;
use std::time::Duration; use std::time::Duration;
@ -105,6 +106,7 @@ struct Settings {
key: Option<String>, key: Option<String>,
content_type: Option<String>, content_type: Option<String>,
content_disposition: Option<String>, content_disposition: Option<String>,
server_side_encryption: Option<String>,
buffer_size: u64, buffer_size: u64,
access_key: Option<String>, access_key: Option<String>,
secret_access_key: Option<String>, secret_access_key: Option<String>,
@ -159,6 +161,7 @@ impl Default for Settings {
key: None, key: None,
content_type: None, content_type: None,
content_disposition: None, content_disposition: None,
server_side_encryption: None,
access_key: None, access_key: None,
secret_access_key: None, secret_access_key: None,
session_token: None, session_token: None,
@ -358,6 +361,12 @@ impl S3Sink {
let content_type = settings.content_type.clone(); let content_type = settings.content_type.clone();
let content_disposition = settings.content_disposition.clone(); let content_disposition = settings.content_disposition.clone();
let metadata = settings.to_metadata(self); let metadata = settings.to_metadata(self);
let server_side_encryption = match ServerSideEncryption::from_str(
&settings.server_side_encryption.clone().unwrap_or_default(),
) {
Ok(v) => Some(v),
Err(_e) => None,
};
client client
.create_multipart_upload() .create_multipart_upload()
@ -366,6 +375,7 @@ impl S3Sink {
.set_content_type(content_type) .set_content_type(content_type)
.set_content_disposition(content_disposition) .set_content_disposition(content_disposition)
.set_metadata(metadata) .set_metadata(metadata)
.set_server_side_encryption(server_side_encryption)
} }
fn create_abort_multipart_upload_request( fn create_abort_multipart_upload_request(
@ -775,6 +785,10 @@ impl ObjectImpl for S3Sink {
.nick("content-disposition") .nick("content-disposition")
.blurb("Content-Disposition header to set for uploaded object") .blurb("Content-Disposition header to set for uploaded object")
.build(), .build(),
glib::ParamSpecString::builder("server-side-encryption")
.nick("server-side-encryption")
.blurb("The S3 server side encryption algorithm to use (AES256 or aws:kms)")
.build(),
] ]
}); });
@ -888,6 +902,11 @@ impl ObjectImpl for S3Sink {
.get::<Option<String>>() .get::<Option<String>>()
.expect("type checked upstream"); .expect("type checked upstream");
} }
"server-side-encryption" => {
settings.server_side_encryption = value
.get::<Option<String>>()
.expect("type checked upstream");
}
_ => unimplemented!(), _ => unimplemented!(),
} }
} }
@ -929,6 +948,7 @@ impl ObjectImpl for S3Sink {
"endpoint-uri" => settings.endpoint_uri.to_value(), "endpoint-uri" => settings.endpoint_uri.to_value(),
"content-type" => settings.content_type.to_value(), "content-type" => settings.content_type.to_value(),
"content-disposition" => settings.content_disposition.to_value(), "content-disposition" => settings.content_disposition.to_value(),
"server-side-encryption" => settings.server_side_encryption.to_value(),
_ => unimplemented!(), _ => unimplemented!(),
} }
} }