Skip to content

Commit d99ffb6

Browse files
authored
Merge pull request #88 from lytics/feat-add-setters-for-bucket-iam-policy
google/apistore: add IAM policy setters for buckets
2 parents c62eabb + 1dcdcab commit d99ffb6

1 file changed

Lines changed: 55 additions & 2 deletions

File tree

google/apistore.go

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,16 @@ func (c *APIStore) AddReader(bucket, object, entity string) error {
6060
return err
6161
}
6262

63-
// AddBucketReader adds a reader of the bucket
63+
// AddBucketReader updates the bucket ACL to add entity as a reader on the bucket
64+
// The bucket must be in fine-grained access control mode, or this will produce an error
6465
func (c *APIStore) AddBucketReader(bucket, entity string) error {
6566
ac := &storage.BucketAccessControl{Entity: entity, Role: "READER"}
6667
_, err := c.service.BucketAccessControls.Insert(bucket, ac).Do()
6768
return err
6869
}
6970

70-
// AddBucketWriter adds a writer of the bucket
71+
// AddBucketWriter updates the bucket ACL to add entity as a writer on the bucket
72+
// The bucket must be in fine-grained access control mode, or this will produce an error
7173
func (c *APIStore) AddBucketWriter(bucket, entity string) error {
7274
ac := &storage.BucketAccessControl{Entity: entity, Role: "WRITER"}
7375
_, err := c.service.BucketAccessControls.Insert(bucket, ac).Do()
@@ -85,3 +87,54 @@ func (c *APIStore) SetBucketAgeLifecycle(name string, days int64) error {
8587
_, err := c.service.Buckets.Patch(name, bucket).Do()
8688
return err
8789
}
90+
91+
// GrantObjectViewer updates the IAM policy on the bucket to grant member the roles/storage.objectViewer role
92+
// The existing policy attributes on the bucket are preserved
93+
func (c *APIStore) GrantObjectViewer(bucket, member string) error {
94+
return c.grantRole(bucket, member, "roles/storage.objectViewer")
95+
}
96+
97+
// GrantObjectCreator updates the IAM policy on the bucket to grant member the roles/storage.objectCreator role
98+
// The existing policy attributes on the bucket are preserved
99+
func (c *APIStore) GrantObjectCreator(bucket, member string) error {
100+
return c.grantRole(bucket, member, "roles/storage.objectCreator")
101+
}
102+
103+
// GrantObjectAdmin updates the IAM policy on the bucket to grant member the roles/storage.objectAdmin role
104+
// The existing policy attributes on the bucket are preserved
105+
func (c *APIStore) GrantObjectAdmin(bucket, member string) error {
106+
return c.grantRole(bucket, member, "roles/storage.objectAdmin")
107+
}
108+
109+
// grantRole updates the IAM policy for @bucket in order to rant @role to @member
110+
// we have to retrieve the existing policy in order to modify it, per https://cloud.google.com/storage/docs/json_api/v1/buckets/setIamPolicy
111+
func (c *APIStore) grantRole(bucket, member, role string) error {
112+
existingPolicy, err := c.service.Buckets.GetIamPolicy(bucket).Do()
113+
if err != nil {
114+
return err
115+
}
116+
117+
var added bool
118+
for _, b := range existingPolicy.Bindings {
119+
if b.Role == role {
120+
for _, m := range b.Members {
121+
if m == member {
122+
// already granted
123+
return nil
124+
}
125+
}
126+
b.Members = append(b.Members, member)
127+
added = true
128+
break
129+
}
130+
}
131+
132+
if !added {
133+
b := new(storage.PolicyBindings)
134+
b.Role = role
135+
b.Members = []string{member}
136+
existingPolicy.Bindings = append(existingPolicy.Bindings, b)
137+
}
138+
_, err = c.service.Buckets.SetIamPolicy(bucket, existingPolicy).Do()
139+
return err
140+
}

0 commit comments

Comments
 (0)