Skip to content

Commit 749db85

Browse files
Merge pull request #89 from EMCECS/feature-bucket-policy-enhancement
Add Support for Principals other than "*" in Bucket Policy
2 parents fcdce24 + a6baaa3 commit 749db85

File tree

2 files changed

+44
-8
lines changed

2 files changed

+44
-8
lines changed

src/main/java/com/emc/object/s3/bean/BucketPolicyStatement.java

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,17 @@
2626
*/
2727
package com.emc.object.s3.bean;
2828

29-
import javax.xml.bind.annotation.XmlElement;
30-
import javax.xml.bind.annotation.XmlElementWrapper;
31-
import javax.xml.bind.annotation.XmlEnum;
32-
import javax.xml.bind.annotation.XmlType;
29+
import com.fasterxml.jackson.annotation.JsonRawValue;
30+
import com.fasterxml.jackson.core.JsonParser;
31+
import com.fasterxml.jackson.databind.DeserializationContext;
32+
import com.fasterxml.jackson.databind.JsonDeserializer;
33+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
34+
35+
import javax.xml.bind.annotation.*;
36+
import java.io.IOException;
3337
import java.util.*;
3438

35-
@XmlType(propOrder = {"sid", "effect", "principal", "actions", "resource", "conditions"})
39+
@XmlType(propOrder = {"sid", "effect", "rawPrincipal", "actions", "resource", "conditions"})
3640
public class BucketPolicyStatement {
3741
private String sid;
3842
private Effect effect;
@@ -57,10 +61,23 @@ public void setSid(String sid) {
5761

5862
public void setEffect(Effect effect) { this.effect = effect; }
5963

64+
@XmlTransient
65+
public String getPrincipal() {
66+
if ("\"*\"".equals(principal)) return "*"; // backward-compatible for "*"
67+
return principal;
68+
}
69+
6070
@XmlElement(name = "Principal")
61-
public String getPrincipal() { return principal; }
71+
@JsonRawValue()
72+
@JsonDeserialize(using = RawDeserializer.class)
73+
public String getRawPrincipal() { return principal; }
74+
75+
public void setPrincipal(String principal) {
76+
if ("*".equals(principal)) this.principal = "\"*\""; // backward-compatible for "*"
77+
else this.principal = principal;
78+
}
6279

63-
public void setPrincipal(String principal) { this.principal= principal; }
80+
public void setRawPrincipal(String principal) { this.principal = principal; }
6481

6582
@XmlElement(name = "Action")
6683
public List<BucketPolicyAction> getActions() {
@@ -159,4 +176,11 @@ public int hashCode() {
159176
public enum Effect {
160177
Allow, Deny
161178
}
179+
180+
public static class RawDeserializer extends JsonDeserializer<String> {
181+
@Override
182+
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
183+
return p.getCodec().readTree(p).toString();
184+
}
185+
}
162186
}

src/test/java/com/emc/object/s3/bean/BucketPolicyTest.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,13 @@ public class BucketPolicyTest {
6262
" \"aws:SourceIp\" : [ \"54.240.143.128/30\", \"2001:DB8:1234:5678:ABCD::/80\" ]" + System.lineSeparator() +
6363
" }" + System.lineSeparator() +
6464
" }" + System.lineSeparator() +
65+
" }, {" + System.lineSeparator() +
66+
" \"Sid\" : \"PrincipalArn\"," + System.lineSeparator() +
67+
" \"Effect\" : \"Allow\"," + System.lineSeparator() +
68+
" \"Principal\" : {\"AWS\":[\"arn:ecs:iam::ns:user/my-user\",\"arn:ecs:iam::ns:user/other-user\"]}," + System.lineSeparator() +
69+
" \"Action\" : [ \"s3:*\" ]," + System.lineSeparator() +
70+
" \"Resource\" : \"arn:aws:s3:::examplebucket/*\"," + System.lineSeparator() +
71+
" \"Condition\" : { }" + System.lineSeparator() +
6572
" } ]" + System.lineSeparator() +
6673
"}";
6774

@@ -74,7 +81,12 @@ public class BucketPolicyTest {
7481
.withCondition(PolicyConditionOperator.IpAddress, new PolicyConditionCriteria()
7582
.withCondition(PolicyConditionKey.SourceIp, "54.240.143.0/24", "2001:DB8:1234:5678::/64"))
7683
.withCondition(PolicyConditionOperator.NotIpAddress, new PolicyConditionCriteria()
77-
.withCondition(PolicyConditionKey.SourceIp, "54.240.143.128/30", "2001:DB8:1234:5678:ABCD::/80"))
84+
.withCondition(PolicyConditionKey.SourceIp, "54.240.143.128/30", "2001:DB8:1234:5678:ABCD::/80")),
85+
new BucketPolicyStatement().withSid("PrincipalArn")
86+
.withEffect(BucketPolicyStatement.Effect.Allow)
87+
.withPrincipal("{\"AWS\":[\"arn:ecs:iam::ns:user/my-user\",\"arn:ecs:iam::ns:user/other-user\"]}")
88+
.withActions(BucketPolicyAction.All)
89+
.withResource("arn:aws:s3:::examplebucket/*")
7890
);
7991

8092
@Test

0 commit comments

Comments
 (0)