forked from TrueCloudLab/frostfs-s3-gw
[#495] Add acl to copy-object
Signed-off-by: Angira Kekteeva <kira@nspcc.ru>
This commit is contained in:
parent
de7281ac58
commit
a8bff13801
1 changed files with 35 additions and 5 deletions
|
@ -10,6 +10,7 @@ import (
|
||||||
"github.com/nspcc-dev/neofs-s3-gw/api/data"
|
"github.com/nspcc-dev/neofs-s3-gw/api/data"
|
||||||
"github.com/nspcc-dev/neofs-s3-gw/api/errors"
|
"github.com/nspcc-dev/neofs-s3-gw/api/errors"
|
||||||
"github.com/nspcc-dev/neofs-s3-gw/api/layer"
|
"github.com/nspcc-dev/neofs-s3-gw/api/layer"
|
||||||
|
"github.com/nspcc-dev/neofs-sdk-go/session"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -32,12 +33,15 @@ func path2BucketObject(path string) (bucket, prefix string) {
|
||||||
|
|
||||||
func (h *handler) CopyObjectHandler(w http.ResponseWriter, r *http.Request) {
|
func (h *handler) CopyObjectHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
var (
|
var (
|
||||||
err error
|
versionID string
|
||||||
info *data.ObjectInfo
|
err error
|
||||||
metadata map[string]string
|
info *data.ObjectInfo
|
||||||
|
metadata map[string]string
|
||||||
|
sessionTokenEACL *session.Container
|
||||||
|
|
||||||
reqInfo = api.GetReqInfo(r.Context())
|
reqInfo = api.GetReqInfo(r.Context())
|
||||||
versionID string
|
|
||||||
|
containsACL = containsACLHeaders(r)
|
||||||
)
|
)
|
||||||
|
|
||||||
src := r.Header.Get("X-Amz-Copy-Source")
|
src := r.Header.Get("X-Amz-Copy-Source")
|
||||||
|
@ -81,6 +85,13 @@ func (h *handler) CopyObjectHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if containsACL {
|
||||||
|
if sessionTokenEACL, err = getSessionTokenSetEACL(r.Context()); err != nil {
|
||||||
|
h.logAndSendError(w, "could not get eacl session token from a box", reqInfo, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if info, err = h.obj.GetObjectInfo(r.Context(), p); err != nil {
|
if info, err = h.obj.GetObjectInfo(r.Context(), p); err != nil {
|
||||||
h.logAndSendError(w, "could not find object", reqInfo, err)
|
h.logAndSendError(w, "could not find object", reqInfo, err)
|
||||||
return
|
return
|
||||||
|
@ -130,6 +141,25 @@ func (h *handler) CopyObjectHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if containsACL {
|
||||||
|
newEaclTable, err := h.getNewEAclTable(r, dstBktInfo, info)
|
||||||
|
if err != nil {
|
||||||
|
h.logAndSendError(w, "could not get new eacl table", reqInfo, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
newEaclTable.SetSessionToken(sessionTokenEACL)
|
||||||
|
|
||||||
|
p := &layer.PutBucketACLParams{
|
||||||
|
BktInfo: dstBktInfo,
|
||||||
|
EACL: newEaclTable,
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = h.obj.PutBucketACL(r.Context(), p); err != nil {
|
||||||
|
h.logAndSendError(w, "could not put bucket acl", reqInfo, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
h.log.Info("object is copied",
|
h.log.Info("object is copied",
|
||||||
zap.String("bucket", info.Bucket),
|
zap.String("bucket", info.Bucket),
|
||||||
zap.String("object", info.Name),
|
zap.String("object", info.Name),
|
||||||
|
|
Loading…
Reference in a new issue