diff --git a/weed/admin/view/app/object_store_users.templ b/weed/admin/view/app/object_store_users.templ index dedd258e2..686f57e1c 100644 --- a/weed/admin/view/app/object_store_users.templ +++ b/weed/admin/view/app/object_store_users.templ @@ -205,12 +205,21 @@ templ ObjectStoreUsers(data dash.ObjectStoreUsersData) {
- + + + + + + + + + Hold Ctrl/Cmd to select multiple permissions
@@ -249,12 +258,21 @@ templ ObjectStoreUsers(data dash.ObjectStoreUsersData) {
- + + + + + + + + +
diff --git a/weed/admin/view/app/object_store_users_templ.go b/weed/admin/view/app/object_store_users_templ.go index 8d08d5161..a2fc3ac71 100644 --- a/weed/admin/view/app/object_store_users_templ.go +++ b/weed/admin/view/app/object_store_users_templ.go @@ -193,7 +193,7 @@ func ObjectStoreUsers(data dash.ObjectStoreUsersData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "
Create New User
Hold Ctrl/Cmd to select multiple permissions
Edit User
User Details
Manage Access Keys
Access Keys for
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "
Create New User
Hold Ctrl/Cmd to select multiple permissions
Edit User
User Details
Manage Access Keys
Access Keys for
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/weed/s3api/policy_engine/integration.go b/weed/s3api/policy_engine/integration.go index 2a6a5c8fa..9c4bee9e4 100644 --- a/weed/s3api/policy_engine/integration.go +++ b/weed/s3api/policy_engine/integration.go @@ -213,6 +213,50 @@ func convertSingleAction(action, bucketName string) (*PolicyStatement, error) { resources = []string{fmt.Sprintf("arn:aws:s3:::%s/*", resourcePattern)} } + case "GetObjectRetention": + s3Actions = []string{"s3:GetObjectRetention"} + if strings.HasSuffix(resourcePattern, "/*") { + bucket := strings.TrimSuffix(resourcePattern, "/*") + resources = []string{fmt.Sprintf("arn:aws:s3:::%s/*", bucket)} + } else { + resources = []string{fmt.Sprintf("arn:aws:s3:::%s/*", resourcePattern)} + } + + case "PutObjectRetention": + s3Actions = []string{"s3:PutObjectRetention"} + if strings.HasSuffix(resourcePattern, "/*") { + bucket := strings.TrimSuffix(resourcePattern, "/*") + resources = []string{fmt.Sprintf("arn:aws:s3:::%s/*", bucket)} + } else { + resources = []string{fmt.Sprintf("arn:aws:s3:::%s/*", resourcePattern)} + } + + case "GetObjectLegalHold": + s3Actions = []string{"s3:GetObjectLegalHold"} + if strings.HasSuffix(resourcePattern, "/*") { + bucket := strings.TrimSuffix(resourcePattern, "/*") + resources = []string{fmt.Sprintf("arn:aws:s3:::%s/*", bucket)} + } else { + resources = []string{fmt.Sprintf("arn:aws:s3:::%s/*", resourcePattern)} + } + + case "PutObjectLegalHold": + s3Actions = []string{"s3:PutObjectLegalHold"} + if strings.HasSuffix(resourcePattern, "/*") { + bucket := strings.TrimSuffix(resourcePattern, "/*") + resources = []string{fmt.Sprintf("arn:aws:s3:::%s/*", bucket)} + } else { + resources = []string{fmt.Sprintf("arn:aws:s3:::%s/*", resourcePattern)} + } + + case "GetBucketObjectLockConfiguration": + s3Actions = []string{"s3:GetBucketObjectLockConfiguration"} + resources = []string{fmt.Sprintf("arn:aws:s3:::%s", resourcePattern)} + + case "PutBucketObjectLockConfiguration": + s3Actions = []string{"s3:PutBucketObjectLockConfiguration"} + resources = []string{fmt.Sprintf("arn:aws:s3:::%s", resourcePattern)} + default: return nil, fmt.Errorf("unknown action type: %s", actionType) } @@ -280,6 +324,24 @@ func GetActionMappings() map[string][]string { "BypassGovernanceRetention": { "s3:BypassGovernanceRetention", }, + "GetObjectRetention": { + "s3:GetObjectRetention", + }, + "PutObjectRetention": { + "s3:PutObjectRetention", + }, + "GetObjectLegalHold": { + "s3:GetObjectLegalHold", + }, + "PutObjectLegalHold": { + "s3:PutObjectLegalHold", + }, + "GetBucketObjectLockConfiguration": { + "s3:GetBucketObjectLockConfiguration", + }, + "PutBucketObjectLockConfiguration": { + "s3:PutBucketObjectLockConfiguration", + }, } } diff --git a/weed/s3api/s3_constants/s3_actions.go b/weed/s3api/s3_constants/s3_actions.go index a565ec115..e476eeaee 100644 --- a/weed/s3api/s3_constants/s3_actions.go +++ b/weed/s3api/s3_constants/s3_actions.go @@ -1,15 +1,21 @@ package s3_constants const ( - ACTION_READ = "Read" - ACTION_READ_ACP = "ReadAcp" - ACTION_WRITE = "Write" - ACTION_WRITE_ACP = "WriteAcp" - ACTION_ADMIN = "Admin" - ACTION_TAGGING = "Tagging" - ACTION_LIST = "List" - ACTION_DELETE_BUCKET = "DeleteBucket" - ACTION_BYPASS_GOVERNANCE_RETENTION = "BypassGovernanceRetention" + ACTION_READ = "Read" + ACTION_READ_ACP = "ReadAcp" + ACTION_WRITE = "Write" + ACTION_WRITE_ACP = "WriteAcp" + ACTION_ADMIN = "Admin" + ACTION_TAGGING = "Tagging" + ACTION_LIST = "List" + ACTION_DELETE_BUCKET = "DeleteBucket" + ACTION_BYPASS_GOVERNANCE_RETENTION = "BypassGovernanceRetention" + ACTION_GET_OBJECT_RETENTION = "GetObjectRetention" + ACTION_PUT_OBJECT_RETENTION = "PutObjectRetention" + ACTION_GET_OBJECT_LEGAL_HOLD = "GetObjectLegalHold" + ACTION_PUT_OBJECT_LEGAL_HOLD = "PutObjectLegalHold" + ACTION_GET_BUCKET_OBJECT_LOCK_CONFIG = "GetBucketObjectLockConfiguration" + ACTION_PUT_BUCKET_OBJECT_LOCK_CONFIG = "PutBucketObjectLockConfiguration" SeaweedStorageDestinationHeader = "x-seaweedfs-destination" MultipartUploadsFolder = ".uploads"