@@ -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
6465func (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
7173func (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