66d71cde30
Signed-off-by: Denis Kirillov <denis@nspcc.ru>
105 lines
3.8 KiB
Go
105 lines
3.8 KiB
Go
package acl
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// BasicACL is Access Control List that defines who can interact with containers and what exactly they can do.
|
|
type BasicACL uint32
|
|
|
|
func (a BasicACL) String() string {
|
|
return fmt.Sprintf("0x%08x", uint32(a))
|
|
}
|
|
|
|
const (
|
|
// PublicBasicRule is a basic ACL value for final public-read-write container for which extended ACL CANNOT be set.
|
|
PublicBasicRule BasicACL = 0x1FBFBFFF
|
|
|
|
// PrivateBasicRule is a basic ACL value for final private container for which extended ACL CANNOT be set.
|
|
PrivateBasicRule BasicACL = 0x1C8C8CCC
|
|
|
|
// ReadOnlyBasicRule is a basic ACL value for final public-read container for which extended ACL CANNOT be set.
|
|
ReadOnlyBasicRule BasicACL = 0x1FBF8CFF
|
|
|
|
// PublicAppendRule is a basic ACL value for final public-append container for which extended ACL CANNOT be set.
|
|
PublicAppendRule BasicACL = 0x1FBF9FFF
|
|
|
|
// EACLPublicBasicRule is a basic ACL value for non-final public-read-write container for which extended ACL CAN be set.
|
|
EACLPublicBasicRule BasicACL = 0x0FBFBFFF
|
|
|
|
// EACLPrivateBasicRule is a basic ACL value for non-final private container for which extended ACL CAN be set.
|
|
EACLPrivateBasicRule BasicACL = 0x0C8C8CCC
|
|
|
|
// EACLReadOnlyBasicRule is a basic ACL value for non-final public-read container for which extended ACL CAN be set.
|
|
EACLReadOnlyBasicRule BasicACL = 0x0FBF8CFF
|
|
|
|
// EACLPublicAppendRule is a basic ACL value for non-final public-append container for which extended ACL CAN be set.
|
|
EACLPublicAppendRule BasicACL = 0x0FBF9FFF
|
|
)
|
|
|
|
const (
|
|
// PublicBasicName is a well-known name for 0x1FBFBFFF basic ACL.
|
|
// It represents fully-public container without eACL.
|
|
PublicBasicName = "public-read-write"
|
|
|
|
// PrivateBasicName is a well-known name for 0x1C8C8CCC basic ACL.
|
|
// It represents fully-private container without eACL.
|
|
PrivateBasicName = "private"
|
|
|
|
// ReadOnlyBasicName is a well-known name for 0x1FBF8CFF basic ACL.
|
|
// It represents public read-only container without eACL.
|
|
ReadOnlyBasicName = "public-read"
|
|
|
|
// PublicAppendName is a well-known name for 0x1FBF9FFF basic ACL.
|
|
// It represents fully-public container without eACL except DELETE operation is only allowed on the owner.
|
|
PublicAppendName = "public-append"
|
|
|
|
// EACLPublicBasicName is a well-known name for 0x0FBFBFFF basic ACL.
|
|
// It represents fully-public container that allows eACL.
|
|
EACLPublicBasicName = "eacl-public-read-write"
|
|
|
|
// EACLPrivateBasicName is a well-known name for 0x0C8C8CCC basic ACL.
|
|
// It represents fully-private container that allows eACL.
|
|
EACLPrivateBasicName = "eacl-private"
|
|
|
|
// EACLReadOnlyBasicName is a well-known name for 0x0FBF8CFF basic ACL.
|
|
// It represents public read-only container that allows eACL.
|
|
EACLReadOnlyBasicName = "eacl-public-read"
|
|
|
|
// EACLPublicAppendName is a well-known name for 0x0FBF9FFF basic ACL.
|
|
// It represents fully-public container that allows eACL except DELETE operation is only allowed on the owner.
|
|
EACLPublicAppendName = "eacl-public-append"
|
|
)
|
|
|
|
// ParseBasicACL parse string ACL (well-known names or hex representation).
|
|
func ParseBasicACL(basicACL string) (BasicACL, error) {
|
|
switch basicACL {
|
|
case PublicBasicName:
|
|
return PublicBasicRule, nil
|
|
case PrivateBasicName:
|
|
return PrivateBasicRule, nil
|
|
case ReadOnlyBasicName:
|
|
return ReadOnlyBasicRule, nil
|
|
case PublicAppendName:
|
|
return PublicAppendRule, nil
|
|
case EACLPublicBasicName:
|
|
return EACLPublicBasicRule, nil
|
|
case EACLPrivateBasicName:
|
|
return EACLPrivateBasicRule, nil
|
|
case EACLReadOnlyBasicName:
|
|
return EACLReadOnlyBasicRule, nil
|
|
case EACLPublicAppendName:
|
|
return EACLPublicAppendRule, nil
|
|
default:
|
|
basicACL = strings.TrimPrefix(strings.ToLower(basicACL), "0x")
|
|
|
|
value, err := strconv.ParseUint(basicACL, 16, 32)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("can't parse basic ACL: %s", basicACL)
|
|
}
|
|
|
|
return BasicACL(value), nil
|
|
}
|
|
}
|