mirror of
https://github.com/pgsty/minio.git
synced 2026-11-12 02:25:34 +03:00
fix(auth): authorize attributes and archive reads with stored tags
Require both Attributes actions on the addressed version and GetObject permission for archive listings. Preserve conditional allows, missing-object masks and retryable storage errors. Fixes #342 Signed-off-by: Feng Ruohang <rh@vonng.com>
This commit is contained in:
@@ -54,7 +54,7 @@ func TestGetObjectAttributesReadQuorumLost(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
const object, missing = "object", "missing"
|
||||
if _, err := z.PutObject(ctx, bucket, object, mustGetPutObjReader(t, bytes.NewReader([]byte("data")), 4, "", ""), ObjectOptions{}); err != nil {
|
||||
if _, err := z.PutObject(ctx, bucket, object, mustGetPutObjReader(t, bytes.NewReader([]byte("data")), 4, "", ""), ObjectOptions{UserDefined: map[string]string{xhttp.AmzObjectTagging: "tier=restricted"}}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
@@ -63,6 +63,9 @@ func TestGetObjectAttributesReadQuorumLost(t *testing.T) {
|
||||
withList := newDeleteAuthzPolicyUser(t, "", bucket, "["+read+
|
||||
`, {"Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": ["arn:aws:s3:::`+bucket+`"]}]`)
|
||||
|
||||
tagged := newDeleteAuthzPolicyUser(t, "", bucket, `[{"Effect":"Allow","Action":["s3:GetObject","s3:GetObjectAttributes"],"Resource":["arn:aws:s3:::`+bucket+`/*"],"Condition":{"StringEquals":{"s3:ExistingObjectTag/tier":"restricted"}}}]`)
|
||||
unauthorized := newDeleteAuthzPolicyUser(t, "", bucket, `[{"Effect":"Allow","Action":["s3:GetObjectAttributes"],"Resource":["arn:aws:s3:::`+bucket+`/*"]}]`)
|
||||
|
||||
check := func(stage, user string, creds auth.Credentials, key string, want int) {
|
||||
t.Helper()
|
||||
target := makeTestTargetURL("", bucket, key, url.Values{"attributes": []string{""}})
|
||||
@@ -85,7 +88,13 @@ func TestGetObjectAttributesReadQuorumLost(t *testing.T) {
|
||||
check("healthy", "withoutList", withoutList, missing, http.StatusForbidden)
|
||||
check("healthy", "withList", withList, missing, http.StatusNotFound)
|
||||
|
||||
check("healthy", "tagged", tagged, object, http.StatusOK)
|
||||
check("healthy", "unauthorized", unauthorized, object, http.StatusForbidden)
|
||||
|
||||
defer objectReadFault(z, bucket, object, 10)()
|
||||
check("read quorum lost", "withoutList", withoutList, object, http.StatusServiceUnavailable)
|
||||
check("read quorum lost", "withList", withList, object, http.StatusServiceUnavailable)
|
||||
check("read quorum lost", "tagged", tagged, object, http.StatusServiceUnavailable)
|
||||
check("read quorum lost", "unauthorized", unauthorized, object, http.StatusForbidden)
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user