mirror of
https://github.com/cubefs/cubefs.git
synced 2026-08-02 02:00:56 +00:00
Refacrot: move actions to command proto package
Signed-off-by: Mofei Zhang <mofei2816@gmail.com>
This commit is contained in:
parent
1abdc584fe
commit
d99f147e6a
@ -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},
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@ -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])
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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
148
proto/perm_action.go
Normal 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
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user