use super::*;
pub(crate) fn website_object_response(
result: &WebsiteObjectResult,
head_only: bool,
) -> S3HttpResponse {
let body = if head_only {
Vec::new()
} else {
result.body.clone()
};
S3HttpResponse::new(result.status)
.with_header("content-type", result.content_type.clone())
.with_header("content-length", result.body.len().to_string())
.with_header("x-bucketwarden-website-key", result.resolved_key.clone())
.with_body(body)
}
pub(crate) fn acl_xml(result: &AclResult) -> String {
let policy = AccessControlPolicy {
owner: AccessControlOwner {
id: result.owner.clone(),
display_name: result.owner.clone(),
},
access_control_list: result.grants.clone(),
};
let grants = policy
.access_control_list
.iter()
.map(|grant| {
format!(
"<Grant><Grantee><ID>{}</ID><DisplayName>{}</DisplayName></Grantee><Permission>{}</Permission></Grant>",
xml_escape(&grant.grantee),
xml_escape(&grant.grantee),
xml_escape(&grant.permission)
)
})
.collect::<String>();
format!(
"<AccessControlPolicy><Owner><ID>{}</ID><DisplayName>{}</DisplayName></Owner><AccessControlList>{grants}</AccessControlList></AccessControlPolicy>",
xml_escape(&policy.owner.id),
xml_escape(&policy.owner.display_name)
)
}
pub(crate) fn bucket_ownership_controls_xml(result: &BucketOwnershipControls) -> String {
format!(
"<OwnershipControls><Rule><ObjectOwnership>{}</ObjectOwnership></Rule></OwnershipControls>",
xml_escape(&result.object_ownership)
)
}
pub(crate) fn bucket_object_lock_configuration_xml(
result: &BucketObjectLockConfiguration,
) -> String {
let default_retention = result
.default_retention
.as_ref()
.map(|retention| {
let days = retention
.days
.map(|value| format!("<Days>{value}</Days>"))
.unwrap_or_default();
let years = retention
.years
.map(|value| format!("<Years>{value}</Years>"))
.unwrap_or_default();
format!(
"<Rule><DefaultRetention><Mode>{}</Mode>{days}{years}</DefaultRetention></Rule>",
xml_escape(&retention.mode)
)
})
.unwrap_or_default();
let enabled = if result.enabled {
"Enabled"
} else {
"Disabled"
};
format!(
"<ObjectLockConfiguration><ObjectLockEnabled>{enabled}</ObjectLockEnabled>{default_retention}</ObjectLockConfiguration>"
)
}
pub(crate) fn bucket_encryption_configuration_xml(
result: &BucketEncryptionConfiguration,
) -> String {
let kms_key_id = result
.default_encryption
.kms_key_id
.as_ref()
.map(|value| format!("<KMSMasterKeyID>{}</KMSMasterKeyID>", xml_escape(value)))
.unwrap_or_default();
format!(
"<ServerSideEncryptionConfiguration><Rule><ApplyServerSideEncryptionByDefault><SSEAlgorithm>{}</SSEAlgorithm>{kms_key_id}</ApplyServerSideEncryptionByDefault></Rule></ServerSideEncryptionConfiguration>",
xml_escape(&result.default_encryption.algorithm)
)
}