func (a *ACLHandle ) List (ctx context .Context ) (rules []ACLRule , err error ) {
ctx = trace .StartSpan (ctx , "cloud.google.com/go/storage.ACL.List" )
defer func () { trace .EndSpan (ctx , err ) }()
if a .object != "" {
return a .objectList (ctx )
}
if a .isDefault {
return a .bucketDefaultList (ctx )
}
return a .bucketList (ctx )
}
func (a *ACLHandle ) bucketDefaultList (ctx context .Context ) ([]ACLRule , error ) {
var acls *raw .ObjectAccessControls
var err error
err = runWithRetry (ctx , func () error {
req := a .c .raw .DefaultObjectAccessControls .List (a .bucket )
a .configureCall (ctx , req )
acls , err = req .Do ()
return err
})
if err != nil {
return nil , err
}
return toObjectACLRules (acls .Items ), nil
}
func (a *ACLHandle ) bucketDefaultDelete (ctx context .Context , entity ACLEntity ) error {
return runWithRetry (ctx , func () error {
req := a .c .raw .DefaultObjectAccessControls .Delete (a .bucket , string (entity ))
a .configureCall (ctx , req )
return req .Do ()
})
}
func (a *ACLHandle ) bucketList (ctx context .Context ) ([]ACLRule , error ) {
var acls *raw .BucketAccessControls
var err error
err = runWithRetry (ctx , func () error {
req := a .c .raw .BucketAccessControls .List (a .bucket )
a .configureCall (ctx , req )
acls , err = req .Do ()
return err
})
if err != nil {
return nil , err
}
return toBucketACLRules (acls .Items ), nil
}
func (a *ACLHandle ) bucketSet (ctx context .Context , entity ACLEntity , role ACLRole ) error {
acl := &raw .BucketAccessControl {
Bucket : a .bucket ,
Entity : string (entity ),
Role : string (role ),
}
err := runWithRetry (ctx , func () error {
req := a .c .raw .BucketAccessControls .Update (a .bucket , string (entity ), acl )
a .configureCall (ctx , req )
_ , err := req .Do ()
return err
})
if err != nil {
return err
}
return nil
}
func (a *ACLHandle ) bucketDelete (ctx context .Context , entity ACLEntity ) error {
return runWithRetry (ctx , func () error {
req := a .c .raw .BucketAccessControls .Delete (a .bucket , string (entity ))
a .configureCall (ctx , req )
return req .Do ()
})
}
func (a *ACLHandle ) objectList (ctx context .Context ) ([]ACLRule , error ) {
var acls *raw .ObjectAccessControls
var err error
err = runWithRetry (ctx , func () error {
req := a .c .raw .ObjectAccessControls .List (a .bucket , a .object )
a .configureCall (ctx , req )
acls , err = req .Do ()
return err
})
if err != nil {
return nil , err
}
return toObjectACLRules (acls .Items ), nil
}
func (a *ACLHandle ) objectSet (ctx context .Context , entity ACLEntity , role ACLRole , isBucketDefault bool ) error {
type setRequest interface {
Do (opts ...googleapi .CallOption ) (*raw .ObjectAccessControl , error )
Header () http .Header
}
acl := &raw .ObjectAccessControl {
Bucket : a .bucket ,
Entity : string (entity ),
Role : string (role ),
}
var req setRequest
if isBucketDefault {
req = a .c .raw .DefaultObjectAccessControls .Update (a .bucket , string (entity ), acl )
} else {
req = a .c .raw .ObjectAccessControls .Update (a .bucket , a .object , string (entity ), acl )
}
a .configureCall (ctx , req )
return runWithRetry (ctx , func () error {
_ , err := req .Do ()
return err
})
}
func (a *ACLHandle ) objectDelete (ctx context .Context , entity ACLEntity ) error {
return runWithRetry (ctx , func () error {
req := a .c .raw .ObjectAccessControls .Delete (a .bucket , a .object , string (entity ))
a .configureCall (ctx , req )
return req .Do ()
})
}
func (a *ACLHandle ) configureCall (ctx context .Context , call interface { Header () http .Header }) {
vc := reflect .ValueOf (call )
vc .MethodByName ("Context" ).Call ([]reflect .Value {reflect .ValueOf (ctx )})
if a .userProject != "" {
vc .MethodByName ("UserProject" ).Call ([]reflect .Value {reflect .ValueOf (a .userProject )})
}
setClientHeader (call .Header ())
}
func toObjectACLRules (items []*raw .ObjectAccessControl ) []ACLRule {
var rs []ACLRule
for _ , item := range items {
rs = append (rs , toObjectACLRule (item ))
}
return rs
}
func toBucketACLRules (items []*raw .BucketAccessControl ) []ACLRule {
var rs []ACLRule
for _ , item := range items {
rs = append (rs , toBucketACLRule (item ))
}
return rs
}
func toObjectACLRule (a *raw .ObjectAccessControl ) ACLRule {
return ACLRule {
Entity : ACLEntity (a .Entity ),
EntityID : a .EntityId ,
Role : ACLRole (a .Role ),
Domain : a .Domain ,
Email : a .Email ,
ProjectTeam : toObjectProjectTeam (a .ProjectTeam ),
}
}
func toBucketACLRule (a *raw .BucketAccessControl ) ACLRule {
return ACLRule {
Entity : ACLEntity (a .Entity ),
EntityID : a .EntityId ,
Role : ACLRole (a .Role ),
Domain : a .Domain ,
Email : a .Email ,
ProjectTeam : toBucketProjectTeam (a .ProjectTeam ),
}
}
func toRawObjectACL (rules []ACLRule ) []*raw .ObjectAccessControl {
if len (rules ) == 0 {
return nil
}
r := make ([]*raw .ObjectAccessControl , 0 , len (rules ))
for _ , rule := range rules {
r = append (r , rule .toRawObjectAccessControl ("" ))
}
return r
}
func toRawBucketACL (rules []ACLRule ) []*raw .BucketAccessControl {
if len (rules ) == 0 {
return nil
}
r := make ([]*raw .BucketAccessControl , 0 , len (rules ))
for _ , rule := range rules {
r = append (r , rule .toRawBucketAccessControl ("" ))
}
return r
}
func (r ACLRule ) toRawBucketAccessControl (bucket string ) *raw .BucketAccessControl {
return &raw .BucketAccessControl {
Bucket : bucket ,
Entity : string (r .Entity ),