Refacrot: move actions to command proto package

Signed-off-by: Mofei Zhang <mofei2816@gmail.com>
This commit is contained in:
Mofei Zhang 2020-03-16 08:43:17 +08:00
parent 1abdc584fe
commit d99f147e6a
No known key found for this signature in database
GPG Key ID: 7C19725C197AE672
8 changed files with 228 additions and 204 deletions

View File

@ -20,6 +20,8 @@ import (
"encoding/xml"
"errors"
"github.com/chubaofs/chubaofs/proto"
"github.com/chubaofs/chubaofs/util/log"
)
@ -39,26 +41,25 @@ const (
// https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/acl-overview.html
var (
aclBucketPermissionActions = map[Permission][]Action{
ReadPermission: {ListBucketAction, ListBucketVersionsAction, ListBucketMultipartUploadsAction},
WritePermission: {PutObjectAction, DeleteObjectAction, DeleteBucketAction},
ReadACPPermission: {GetBucketAclAction},
WriteACPPermission: {PutBucketAclAction},
aclBucketPermissionActions = map[Permission]proto.Actions{
ReadPermission: {proto.ListBucketAction, proto.ListBucketVersionsAction, proto.ListBucketMultipartUploadsAction},
WritePermission: {proto.PutObjectAction, proto.DeleteObjectAction, proto.DeleteBucketAction},
ReadACPPermission: {proto.GetBucketAclAction},
WriteACPPermission: {proto.PutBucketAclAction},
FullControlPermission: {
ListBucketAction, ListBucketVersionsAction, ListBucketMultipartUploadsAction,
PutObjectAction, DeleteObjectAction, DeleteBucketAction,
GetBucketAclAction,
PutBucketAclAction},
proto.ListBucketAction, proto.ListBucketVersionsAction, proto.ListBucketMultipartUploadsAction,
proto.PutObjectAction, proto.DeleteObjectAction, proto.DeleteBucketAction,
proto.GetBucketAclAction, proto.PutBucketAclAction},
}
aclObjectPermissionActions = map[Permission][]Action{
ReadPermission: {GetObjectAction, GetObjectVersionAction, GetObjectTorrentAction},
aclObjectPermissionActions = map[Permission]proto.Actions{
ReadPermission: {proto.GetObjectAction, proto.GetObjectVersionAction, proto.GetObjectTorrentAction},
WritePermission: {},
ReadACPPermission: {GetObjectAclAction, GetObjectVersionAclAction},
WriteACPPermission: {PutObjectAclAction, PutObjectVersionAclAction},
ReadACPPermission: {proto.GetObjectAclAction, proto.GetObjectVersionAclAction},
WriteACPPermission: {proto.PutObjectAclAction, proto.PutObjectVersionAclAction},
FullControlPermission: {
GetObjectAction, GetObjectVersionAction, GetObjectTorrentAction,
GetObjectAclAction, GetObjectVersionAclAction,
PutObjectAclAction, PutObjectVersionAclAction},
proto.GetObjectAction, proto.GetObjectVersionAction, proto.GetObjectTorrentAction,
proto.GetObjectAclAction, proto.GetObjectVersionAclAction,
proto.PutObjectAclAction, proto.PutObjectVersionAclAction},
}
)

View File

@ -3,6 +3,8 @@ package objectnode
import (
"net/http"
"github.com/chubaofs/chubaofs/proto"
"github.com/gorilla/mux"
)
@ -19,10 +21,10 @@ func GetRequestID(r *http.Request) (id string) {
return mux.Vars(r)[ContextKeyRequestID]
}
func SetRequestAction(r *http.Request, action Action) {
func SetRequestAction(r *http.Request, action proto.Action) {
mux.Vars(r)[ContextKeyRequestAction] = action.String()
}
func GetActionFromContext(r *http.Request) (action Action) {
return ActionFromString(mux.Vars(r)[ContextKeyRequestAction])
func GetActionFromContext(r *http.Request) (action proto.Action) {
return proto.ParseAction(mux.Vars(r)[ContextKeyRequestAction])
}

View File

@ -19,6 +19,8 @@ import (
"net/http"
"strings"
"github.com/chubaofs/chubaofs/proto"
"github.com/gorilla/mux"
"github.com/chubaofs/chubaofs/util/log"
@ -28,7 +30,7 @@ type RequestParam struct {
resource string
bucket string
object string
action Action
action proto.Action
sourceIP string
conditionVars map[string][]string
vars map[string]string
@ -43,7 +45,7 @@ func (p *RequestParam) Object() string {
return p.object
}
func (p *RequestParam) Action() Action {
func (p *RequestParam) Action() proto.Action {
return p.action
}

View File

@ -220,7 +220,7 @@ func (o *ObjectNode) policyCheck(f http.HandlerFunc) http.HandlerFunc {
return
}
switch param.action {
case CreateBucketAction:
case proto.CreateBucketAction:
default:
if err = loadBucketMeta(param.Bucket()); err != nil {
log.LogErrorf("policyCheck: load bucket metadata fail: requestID(%v) err(%v)", GetRequestID(r), err)
@ -253,7 +253,7 @@ func (o *ObjectNode) policyCheck(f http.HandlerFunc) http.HandlerFunc {
allowed = false
return
}
if param.action == CreateBucketAction {
if param.action == proto.CreateBucketAction {
allowed = true
return
}

View File

@ -17,150 +17,33 @@ package objectnode
import (
"strings"
"github.com/chubaofs/chubaofs/proto"
"github.com/chubaofs/chubaofs/util"
"github.com/google/uuid"
)
// Reference:
// https://docs.aws.amazon.com/AmazonS3/latest/dev/access-policy-language-overview.html
// https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html
// https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/amazon-s3-policy-keys.html
type Action string
func (a Action) String() string {
return string(a)
}
func (a Action) IsKnown() bool {
return len(a) != 0 && a != UnknownAction
}
func (a Action) UniqueRouteName() (name string) {
func ActionToUniqueRouteName(action proto.Action) (name string) {
var id uuid.UUID
var err error
if id, err = uuid.NewRandom(); err != nil {
name = a.String() + ":" + util.RandomString(32, util.UpperLetter|util.LowerLetter)
name = action.String() + ":" + util.RandomString(32, util.UpperLetter|util.LowerLetter)
return
}
name = a.String() + ":" + strings.ReplaceAll(id.String(), "-", "")
name = action.String() + ":" + strings.ReplaceAll(id.String(), "-", "")
return
}
const (
OSSActionPrefix = "oss:action:"
GetObjectAction Action = OSSActionPrefix + "GetObject"
PutObjectAction Action = OSSActionPrefix + "PutObject"
CopyObjectAction Action = OSSActionPrefix + "CopyObject"
ListObjectsAction Action = OSSActionPrefix + "ListObjects"
DeleteObjectAction Action = OSSActionPrefix + "DeleteObject"
DeleteObjectsAction Action = OSSActionPrefix + "DeleteObjects"
HeadObjectAction Action = OSSActionPrefix + "HeadObject"
CreateBucketAction Action = OSSActionPrefix + "CreateBucket"
DeleteBucketAction Action = OSSActionPrefix + "DeleteBucket"
HeadBucketAction Action = OSSActionPrefix + "HeadBucket"
ListBucketAction Action = OSSActionPrefix + "ListBucket"
ListBucketVersionsAction Action = OSSActionPrefix + "ListBucketVersions"
ListBucketMultipartUploadsAction Action = OSSActionPrefix + "ListBucketMultipartUploads"
GetBucketPolicyAction Action = OSSActionPrefix + "GetBucketPolicy"
PutBucketPolicyAction Action = OSSActionPrefix + "PutBucketPolicy"
GetBucketAclAction Action = OSSActionPrefix + "GetBucketAcl"
PutBucketAclAction Action = OSSActionPrefix + "PutBucketAcl"
GetObjectAclAction Action = OSSActionPrefix + "GetObjectAcl"
GetObjectVersionAction Action = OSSActionPrefix + "GetObjectVersion"
PutObjectVersionAction Action = OSSActionPrefix + "PutObjectVersion"
GetObjectTorrentAction Action = OSSActionPrefix + "GetObjectTorrent"
PutObjectTorrentAction Action = OSSActionPrefix + "PutObjectTorrent"
PutObjectAclAction Action = OSSActionPrefix + "PutObjectAcl"
GetObjectVersionAclAction Action = OSSActionPrefix + "GetObjectVersionAcl"
PutObjectVersionAclAction Action = OSSActionPrefix + "PutObjectVersionAcl"
DeleteBucketPolicyAction Action = OSSActionPrefix + "DeleteBucketPolicy"
CreateMultipartUploadAction Action = OSSActionPrefix + "CreateMultipartUpload"
ListMultipartUploadsAction Action = OSSActionPrefix + "ListMultipartUploads"
UploadPartAction Action = OSSActionPrefix + "UploadPart"
ListPartsAction Action = OSSActionPrefix + "ListParts"
CompleteMultipartUploadAction Action = OSSActionPrefix + "CompleteMultipartUpload"
AbortMultipartUploadAction Action = OSSActionPrefix + "AbortMultipartUpload"
GetBucketLocationAction Action = OSSActionPrefix + "GetBucketLocation"
GetObjectXAttrAction Action = OSSActionPrefix + "GetObjectXAttr"
PutObjectXAttrAction Action = OSSActionPrefix + "PutObjectXAttr"
ListObjectXAttrsAction Action = OSSActionPrefix + "ListObjectXAttrs"
DeleteObjectXAttrAction Action = OSSActionPrefix + "DeleteObjectXAttr"
GetObjectTaggingAction Action = OSSActionPrefix + "GetObjectTagging"
PutObjectTaggingAction Action = OSSActionPrefix + "PutObjectTagging"
DeleteObjectTaggingAction Action = OSSActionPrefix + "DeleteObjectTagging"
GetBucketTaggingAction Action = OSSActionPrefix + "GetBucketTagging"
PutBucketTaggingAction Action = OSSActionPrefix + "PutBucketTagging"
DeleteBucketTaggingAction Action = OSSActionPrefix + "DeleteBucketTagging"
UnknownAction Action = OSSActionPrefix + "Unknown"
)
var (
AllActions = []Action{
GetObjectAction,
PutObjectAction,
CopyObjectAction,
ListObjectsAction,
DeleteObjectAction,
HeadObjectAction,
CreateBucketAction,
DeleteBucketAction,
HeadBucketAction,
ListBucketAction,
ListBucketVersionsAction,
ListBucketMultipartUploadsAction,
GetBucketPolicyAction,
PutBucketPolicyAction,
GetBucketAclAction,
PutBucketAclAction,
GetObjectAclAction,
GetObjectVersionAction,
PutObjectVersionAction,
GetObjectTorrentAction,
PutObjectTorrentAction,
PutObjectAclAction,
GetObjectVersionAclAction,
PutObjectVersionAclAction,
DeleteBucketPolicyAction,
CreateMultipartUploadAction,
ListMultipartUploadsAction,
UploadPartAction,
ListPartsAction,
CompleteMultipartUploadAction,
AbortMultipartUploadAction,
GetBucketLocationAction,
GetObjectXAttrAction,
PutObjectXAttrAction,
ListObjectXAttrsAction,
DeleteObjectXAttrAction,
GetObjectTaggingAction,
PutObjectTaggingAction,
DeleteObjectTaggingAction,
GetBucketTaggingAction,
PutBucketTaggingAction,
DeleteBucketTaggingAction,
}
)
func ActionFromString(str string) Action {
if len(str) == 0 {
return UnknownAction
}
for _, act := range AllActions {
if act.String() == str {
return act
}
}
return UnknownAction
}
func ActionFromRouteName(name string) Action {
func ActionFromRouteName(name string) proto.Action {
routeSNLoc := routeSNRegexp.FindStringIndex(name)
if len(routeSNLoc) != 2 {
return ActionFromString(name)
return proto.ParseAction(name)
}
return ActionFromString(name[:len(name)-33])
return proto.ParseAction(name[:len(name)-33])
}
func (s Statement) checkActions(p *RequestParam) bool {
@ -184,7 +67,7 @@ func (s Statement) checkNotActions(p *RequestParam) bool {
}
//
func IsIntersectionActions(actions []Action, action Action) bool {
func IsIntersectionActions(actions proto.Actions, action proto.Action) bool {
if len(actions) == 0 {
return true
}
@ -195,17 +78,3 @@ func IsIntersectionActions(actions []Action, action Action) bool {
}
return false
}
type Actions []Action
func (actions Actions) Constant(action Action) bool {
if len(actions) == 0 {
return false
}
for _, a := range actions {
if a == action {
return true
}
}
return false
}

View File

@ -17,6 +17,8 @@ package objectnode
import (
"net/http"
"github.com/chubaofs/chubaofs/proto"
"github.com/gorilla/mux"
)
@ -34,14 +36,14 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
var registerBucketHttpHeadRouters = func(r *mux.Router) {
// Head object
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html
r.NewRoute().Name(HeadObjectAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.HeadObjectAction)).
Methods(http.MethodHead).
Path("/{object:.+}").
HandlerFunc(o.headObjectHandler)
// Head bucket
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadBucket.html
r.NewRoute().Name(HeadBucketAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.HeadBucketAction)).
Methods(http.MethodHead).
HandlerFunc(o.headBucketHandler)
}
@ -49,7 +51,7 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
var registerBucketHttpGetRouters = func(r *mux.Router) {
// Get object with pre-signed auth signature v2
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html
r.NewRoute().Name(GetObjectAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.GetObjectAction)).
Methods(http.MethodGet).
Path("/{object:.+}").
Queries("AWSAccessKeyId", "{accessKey:.+}",
@ -58,7 +60,7 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
// Get object with pre-signed auth signature v4
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html
r.NewRoute().Name(GetObjectAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.GetObjectAction)).
Methods(http.MethodGet).
Path("/{object:.+}").
Queries("X-Amz-Credential", "{creadential:.+}",
@ -69,7 +71,7 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
// Get object tagging
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html
r.NewRoute().Name(GetObjectTaggingAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.GetObjectTaggingAction)).
Methods(http.MethodGet).
Path("/{object:.+}").
Queries("tagging", "").
@ -77,14 +79,14 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
// Get object XAttr
// Notes: ChubaoFS owned API for XAttr operation
r.NewRoute().Name(GetObjectXAttrAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.GetObjectXAttrAction)).
Methods(http.MethodGet).
Path("/{object:.+}").
Queries("xattr", "", "key", "{key:.+}").
HandlerFunc(o.getObjectXAttrHandler)
// List object XAttrs
r.NewRoute().Name(ListObjectXAttrsAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.ListObjectXAttrsAction)).
Methods(http.MethodGet).
Path("/{object:.+}").
Queries("xattr", "").
@ -92,7 +94,7 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
// Get object acl
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAcl.html
r.NewRoute().Name(GetObjectAclAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.GetObjectAclAction)).
Methods(http.MethodGet).
Path("/{objject:.+}").
Queries("acl", "").
@ -100,63 +102,63 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
// Get object
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html
r.NewRoute().Name(GetObjectAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.GetObjectAction)).
Methods(http.MethodGet).
Path("/{object:.+}").
HandlerFunc(o.getObjectHandler)
// List objects version 2
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html
r.NewRoute().Name(ListObjectsAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.ListObjectsAction)).
Methods(http.MethodGet).
Queries("list-type", "2").
HandlerFunc(o.getBucketV2Handler)
// List multipart uploads
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html
r.NewRoute().Name(ListMultipartUploadsAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.ListMultipartUploadsAction)).
Methods(http.MethodGet).
Queries("uploads", "").
HandlerFunc(o.listMultipartUploadsHandler)
// List parts
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html
r.NewRoute().Name(ListPartsAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.ListPartsAction)).
Methods(http.MethodGet).
Queries("uploadId", "{uploadId:.*}").
HandlerFunc(o.listPartsHandler)
// Get bucket location
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLocation.html
r.NewRoute().Name(GetBucketLocationAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.GetBucketLocationAction)).
Methods(http.MethodGet).
Queries("location", "").
HandlerFunc(o.getBucketLocation)
// Get bucket policy
// https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketPolicy.html
r.NewRoute().Name(GetBucketPolicyAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.GetBucketPolicyAction)).
Methods(http.MethodGet).
Queries("policy", "").
HandlerFunc(o.getBucketPolicyHandler)
// Get bucket acl
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketAcl.html
r.NewRoute().Name(GetBucketAclAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.GetBucketAclAction)).
Methods(http.MethodGet).
Queries("acl", "").
HandlerFunc(o.getBucketACLHandler)
// Get bucket tagging
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketTagging.html
r.NewRoute().Name(GetBucketTaggingAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.GetBucketTaggingAction)).
Methods(http.MethodGet).
Queries("tagging", "").
HandlerFunc(o.getBucketTaggingHandler)
// List objects version 1
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html
r.NewRoute().Name(ListObjectsAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.ListObjectsAction)).
Methods(http.MethodGet).
HandlerFunc(o.getBucketV1Handler)
}
@ -164,7 +166,7 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
var registerBucketHttpPostRouters = func(r *mux.Router) {
// Create multipart upload
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html
r.NewRoute().Name(CreateMultipartUploadAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.CreateMultipartUploadAction)).
Methods(http.MethodPost).
Path("/{object:.+}").
Queries("uploads", "").
@ -172,7 +174,7 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
// Complete multipart
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html
r.NewRoute().Name(CompleteMultipartUploadAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.CompleteMultipartUploadAction)).
Methods(http.MethodPost).
Path("/{object:.+}").
Queries("uploadId", "{uploadId:.*}").
@ -180,7 +182,7 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
// Delete objects (multiple objects)
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjects.html
r.NewRoute().Name(DeleteObjectsAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.DeleteObjectsAction)).
Methods(http.MethodPost).
Queries("delete", "").
HandlerFunc(o.deleteObjectsHandler)
@ -189,7 +191,7 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
var registerBucketHttpPutRouters = func(r *mux.Router) {
// Upload part
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html .
r.NewRoute().Name(UploadPartAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.UploadPartAction)).
Methods(http.MethodPut).
Path("/{object:.+}").
Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}").
@ -197,7 +199,7 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
// Copy object
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html .
r.NewRoute().Name(CopyObjectAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.CopyObjectAction)).
Methods(http.MethodPut).
Path("/{object:.+}").
HeadersRegexp(HeaderNameCopySource, ".*?(\\/|%2F).*?").
@ -205,7 +207,7 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
// Put object tagging
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html
r.NewRoute().Name(PutObjectTaggingAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.PutObjectTaggingAction)).
Methods(http.MethodPut).
Path("/{object:.+}").
Queries("tagging", "").
@ -213,7 +215,7 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
// Put object xattrs
// Notes: ChubaoFS owned API for XAttr operation
r.NewRoute().Name(PutObjectXAttrAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.PutObjectXAttrAction)).
Methods(http.MethodPut).
Path("/{object:.+}").
Queries("xattr", "").
@ -221,7 +223,7 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
// Put object acl
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAcl.html
r.NewRoute().Name(PutObjectAclAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.PutObjectAclAction)).
Methods(http.MethodPut).
Path("/{object:.+}").
Queries("acl", "").
@ -229,35 +231,35 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
// Put object
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html
r.NewRoute().Name(PutObjectAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.PutObjectAction)).
Methods(http.MethodPut).
Path("/{object:.+}").
HandlerFunc(o.putObjectHandler)
// Put bucket acl
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAcl.html
r.NewRoute().Name(PutBucketAclAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.PutBucketAclAction)).
Methods(http.MethodPut).
Queries("acl", "").
HandlerFunc(o.putBucketACLHandler)
// Put bucket policy
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketPolicy.html
r.NewRoute().Name(PutBucketPolicyAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.PutBucketPolicyAction)).
Methods(http.MethodPut).
Queries("policy", "").
HandlerFunc(o.putBucketPolicyHandler)
// Put bucket tagging
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketTagging.html
r.NewRoute().Name(PutBucketTaggingAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.PutBucketTaggingAction)).
Methods(http.MethodPut).
Queries("tagging", "").
HandlerFunc(o.putBucketTaggingHandler)
// Create bucket
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html
r.NewRoute().Name(CreateBucketAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.CreateBucketAction)).
Methods(http.MethodPut).
HandlerFunc(o.createBucketHandler)
}
@ -265,7 +267,7 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
var registerBucketHttpDeleteRouters = func(r *mux.Router) {
// Abort multipart upload
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html .
r.NewRoute().Name(AbortMultipartUploadAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.AbortMultipartUploadAction)).
Methods(http.MethodDelete).
Path("/{object:.+}").
Queries("uploadId", "{uploadId:.*}").
@ -273,7 +275,7 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
// Delete object tagging
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html
r.NewRoute().Name(DeleteObjectTaggingAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.DeleteObjectTaggingAction)).
Methods(http.MethodDelete).
Path("/{object:.+").
Queries("tagging", "").
@ -281,7 +283,7 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
// Delete object xattrs
// Notes: ChubaoFS owned API for XAttr operation
r.NewRoute().Name(DeleteObjectXAttrAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.DeleteObjectXAttrAction)).
Methods(http.MethodDelete).
Path("/{object:.+}").
Queries("xattr", "", "key", "{key:.+}").
@ -289,28 +291,28 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
// Delete object
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html .
r.NewRoute().Name(DeleteObjectAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.DeleteObjectAction)).
Methods(http.MethodDelete).
Path("/{object:.+}").
HandlerFunc(o.deleteObjectHandler)
// Delete bucket policy
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketPolicy.html
r.NewRoute().Name(DeleteBucketPolicyAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.DeleteBucketPolicyAction)).
Methods(http.MethodDelete).
Queries("policy", "").
HandlerFunc(o.deleteBucketPolicyHandler)
// Delete bucket tagging
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketTagging.html
r.NewRoute().Name(DeleteBucketTaggingAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.DeleteBucketTaggingAction)).
Methods(http.MethodDelete).
Queries("tagging", "").
HandlerFunc(o.deleteBucketTaggingHandler)
// Delete bucket
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html
r.NewRoute().Name(DeleteBucketAction.UniqueRouteName()).
r.NewRoute().Name(ActionToUniqueRouteName(proto.DeleteBucketAction)).
Methods(http.MethodDelete).
HandlerFunc(o.deleteBucketHandler)
@ -326,7 +328,7 @@ func (o *ObjectNode) registerApiRouters(router *mux.Router) {
// List buckets
// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html
router.NewRoute().Name(ListBucketAction.UniqueRouteName()).
router.NewRoute().Name(ActionToUniqueRouteName(proto.ListBucketAction)).
Methods(http.MethodGet).
HandlerFunc(o.listBucketsHandler)

View File

@ -59,7 +59,7 @@ type ObjectNode struct {
wg sync.WaitGroup
userStore *UserStore
signatureIgnoredActions Actions // signature ignored actions
signatureIgnoredActions proto.Actions // signature ignored actions
control common.Control
}
@ -108,7 +108,7 @@ func (o *ObjectNode) loadConfig(cfg *config.Config) (err error) {
// parse signature ignored actions
signatureIgnoredActionNames := cfg.GetStringSlice(configSignatureIgnoredActions)
for _, actionName := range signatureIgnoredActionNames {
action := ActionFromString(actionName)
action := proto.ParseAction(actionName)
if action.IsKnown() {
o.signatureIgnoredActions = append(o.signatureIgnoredActions, action)
log.LogInfof("loadConfig: signature ignored action: %v", action)

148
proto/perm_action.go Normal file
View File

@ -0,0 +1,148 @@
// Copyright 2018 The ChubaoFS Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
// implied. See the License for the specific language governing
// permissions and limitations under the License.
package proto
type Action string
func (a Action) String() string {
return string(a)
}
func (a Action) IsKnown() bool {
return len(a) != 0 && a != UnknownAction
}
const (
OSSActionPrefix = "oss:action:"
GetObjectAction Action = OSSActionPrefix + "GetObject"
PutObjectAction Action = OSSActionPrefix + "PutObject"
CopyObjectAction Action = OSSActionPrefix + "CopyObject"
ListObjectsAction Action = OSSActionPrefix + "ListObjects"
DeleteObjectAction Action = OSSActionPrefix + "DeleteObject"
DeleteObjectsAction Action = OSSActionPrefix + "DeleteObjects"
HeadObjectAction Action = OSSActionPrefix + "HeadObject"
CreateBucketAction Action = OSSActionPrefix + "CreateBucket"
DeleteBucketAction Action = OSSActionPrefix + "DeleteBucket"
HeadBucketAction Action = OSSActionPrefix + "HeadBucket"
ListBucketAction Action = OSSActionPrefix + "ListBucket"
ListBucketVersionsAction Action = OSSActionPrefix + "ListBucketVersions"
ListBucketMultipartUploadsAction Action = OSSActionPrefix + "ListBucketMultipartUploads"
GetBucketPolicyAction Action = OSSActionPrefix + "GetBucketPolicy"
PutBucketPolicyAction Action = OSSActionPrefix + "PutBucketPolicy"
GetBucketAclAction Action = OSSActionPrefix + "GetBucketAcl"
PutBucketAclAction Action = OSSActionPrefix + "PutBucketAcl"
GetObjectAclAction Action = OSSActionPrefix + "GetObjectAcl"
GetObjectVersionAction Action = OSSActionPrefix + "GetObjectVersion"
PutObjectVersionAction Action = OSSActionPrefix + "PutObjectVersion"
GetObjectTorrentAction Action = OSSActionPrefix + "GetObjectTorrent"
PutObjectTorrentAction Action = OSSActionPrefix + "PutObjectTorrent"
PutObjectAclAction Action = OSSActionPrefix + "PutObjectAcl"
GetObjectVersionAclAction Action = OSSActionPrefix + "GetObjectVersionAcl"
PutObjectVersionAclAction Action = OSSActionPrefix + "PutObjectVersionAcl"
DeleteBucketPolicyAction Action = OSSActionPrefix + "DeleteBucketPolicy"
CreateMultipartUploadAction Action = OSSActionPrefix + "CreateMultipartUpload"
ListMultipartUploadsAction Action = OSSActionPrefix + "ListMultipartUploads"
UploadPartAction Action = OSSActionPrefix + "UploadPart"
ListPartsAction Action = OSSActionPrefix + "ListParts"
CompleteMultipartUploadAction Action = OSSActionPrefix + "CompleteMultipartUpload"
AbortMultipartUploadAction Action = OSSActionPrefix + "AbortMultipartUpload"
GetBucketLocationAction Action = OSSActionPrefix + "GetBucketLocation"
GetObjectXAttrAction Action = OSSActionPrefix + "GetObjectXAttr"
PutObjectXAttrAction Action = OSSActionPrefix + "PutObjectXAttr"
ListObjectXAttrsAction Action = OSSActionPrefix + "ListObjectXAttrs"
DeleteObjectXAttrAction Action = OSSActionPrefix + "DeleteObjectXAttr"
GetObjectTaggingAction Action = OSSActionPrefix + "GetObjectTagging"
PutObjectTaggingAction Action = OSSActionPrefix + "PutObjectTagging"
DeleteObjectTaggingAction Action = OSSActionPrefix + "DeleteObjectTagging"
GetBucketTaggingAction Action = OSSActionPrefix + "GetBucketTagging"
PutBucketTaggingAction Action = OSSActionPrefix + "PutBucketTagging"
DeleteBucketTaggingAction Action = OSSActionPrefix + "DeleteBucketTagging"
UnknownAction Action = OSSActionPrefix + "Unknown"
)
var (
AllActions = []Action{
GetObjectAction,
PutObjectAction,
CopyObjectAction,
ListObjectsAction,
DeleteObjectAction,
HeadObjectAction,
CreateBucketAction,
DeleteBucketAction,
HeadBucketAction,
ListBucketAction,
ListBucketVersionsAction,
ListBucketMultipartUploadsAction,
GetBucketPolicyAction,
PutBucketPolicyAction,
GetBucketAclAction,
PutBucketAclAction,
GetObjectAclAction,
GetObjectVersionAction,
PutObjectVersionAction,
GetObjectTorrentAction,
PutObjectTorrentAction,
PutObjectAclAction,
GetObjectVersionAclAction,
PutObjectVersionAclAction,
DeleteBucketPolicyAction,
CreateMultipartUploadAction,
ListMultipartUploadsAction,
UploadPartAction,
ListPartsAction,
CompleteMultipartUploadAction,
AbortMultipartUploadAction,
GetBucketLocationAction,
GetObjectXAttrAction,
PutObjectXAttrAction,
ListObjectXAttrsAction,
DeleteObjectXAttrAction,
GetObjectTaggingAction,
PutObjectTaggingAction,
DeleteObjectTaggingAction,
GetBucketTaggingAction,
PutBucketTaggingAction,
DeleteBucketTaggingAction,
}
)
func ParseAction(str string) Action {
if len(str) == 0 {
return UnknownAction
}
for _, act := range AllActions {
if act.String() == str {
return act
}
}
return UnknownAction
}
type Actions []Action
func (actions Actions) Constant(action Action) bool {
if len(actions) == 0 {
return false
}
for _, a := range actions {
if a == action {
return true
}
}
return false
}