wjones127 commented on code in PR #5402:
URL: https://github.com/apache/arrow-rs/pull/5402#discussion_r1496356095
##########
object_store/src/aws/builder.rs:
##########
@@ -912,6 +1002,120 @@ fn parse_bucket_az(bucket: &str) -> Option<&str> {
Some(bucket.strip_suffix("--x-s3")?.rsplit_once("--")?.1)
}
+/// Encryption configuration options for S3.
+///
+/// These options are used to configure server-side encryption for S3 objects.
+/// To configure them, pass them to [`AmazonS3Builder::with_config`].
+///
+/// Both [SSE-KMS] and [DSSE-KMS] are supported. [SSE-C] is not yet supported.
+///
+/// [SSE-KMS]:
https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html
+/// [DSSE-KMS]:
https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingDSSEncryption.html
+/// [SSE-C]:
https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerSideEncryptionCustomerKeys.html
+#[derive(PartialEq, Eq, Hash, Clone, Debug, Copy, Serialize, Deserialize)]
+#[non_exhaustive]
+pub enum S3EncryptionConfigKey {
+ /// Type of encryption to use. If set, must be one of "AES256", "aws:kms",
or "aws:kms:dsse".
+ ServerSideEncryption,
+ /// The KMS key ID to use for server-side encryption. If set,
ServerSideEncryption
+ /// must be "aws:kms" or "aws:kms:dsse".
+ KmsKeyId,
+ /// If set to true, will use the bucket's default KMS key for server-side
encryption.
+ /// If set to false, will disable the use of the bucket's default KMS key
for server-side encryption.
+ BucketKeyEnabled,
+}
+
+impl AsRef<str> for S3EncryptionConfigKey {
+ fn as_ref(&self) -> &str {
+ match self {
+ Self::ServerSideEncryption => "aws_server_side_encryption",
+ Self::KmsKeyId => "aws_sse_kms_key_id",
+ Self::BucketKeyEnabled => "aws_sse_bucket_key_enabled",
+ }
+ }
+}
+
+#[derive(Debug, Clone)]
+enum S3EncryptionType {
+ S3,
+ SseKms,
+ DsseKms,
+}
+
+impl crate::config::Parse for S3EncryptionType {
+ fn parse(s: &str) -> Result<Self> {
+ match s {
+ "AES256" => Ok(Self::S3),
+ "aws:kms" => Ok(Self::SseKms),
+ "aws:kms:dsse" => Ok(Self::DsseKms),
+ _ => Err(Error::InvalidEncryptionType { passed: s.into() }.into()),
+ }
+ }
+}
+
+impl From<&S3EncryptionType> for &'static str {
+ fn from(value: &S3EncryptionType) -> Self {
+ match value {
+ S3EncryptionType::S3 => "AES256",
+ S3EncryptionType::SseKms => "aws:kms",
+ S3EncryptionType::DsseKms => "aws:kms:dsse",
+ }
+ }
+}
+
+impl std::fmt::Display for S3EncryptionType {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ f.write_str(self.into())
+ }
+}
+
+/// A sequence of headers to be sent for write requests that specify
server-side
+/// encryption.
+///
+/// Whether these headers are sent depends on both the kind of encryption set
+/// and the kind of request being made.
+#[derive(Default, Clone)]
+pub struct S3EncryptionHeaders(pub HeaderMap);
+
+impl std::fmt::Debug for S3EncryptionHeaders {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ // TODO: if we take a user-provided key, hide the key from debug
output.
+ f.debug_map().entries(self.0.iter()).finish()
+ }
+}
+
+impl S3EncryptionHeaders {
+ fn try_new(
+ encryption_type: &S3EncryptionType,
+ key_id: Option<String>,
+ bucket_key_enabled: Option<bool>,
+ ) -> Result<Self> {
+ let mut headers = HeaderMap::new();
+ headers.insert(
+ "x-amz-server-side-encryption",
+ HeaderValue::from_static(encryption_type.into()),
Review Comment:
Okay. Given that, we can just derive `Debug` for `S3EncryptionHeaders`. I've
made a note that for SSE-C we should use `set_sensitive`. The current headers
are not sensitive.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]