[#1243] object: Look for X-Headers within origin before APE check

* X-Headers can be found in `origin` field of `MetaHeader` if the request
  has been forwarded from non-container node.

Signed-off-by: Airat Arifullin <a.arifullin@yadro.com>
This commit is contained in:
Airat Arifullin 2025-01-10 16:27:08 +03:00
parent dc410fca90
commit 50a4df4324

View file

@ -12,6 +12,7 @@ import (
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/object/util"
objectV2 "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/object"
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/refs"
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/session"
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/bearer"
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
@ -171,7 +172,7 @@ func (p *putStreamBasicChecker) Send(ctx context.Context, request *objectV2.PutR
ContainerOwner: reqCtx.ContainerOwner,
Role: nativeSchemaRole(reqCtx.Role),
BearerToken: reqCtx.BearerToken,
XHeaders: request.GetMetaHeader().GetXHeaders(),
XHeaders: getXHeaders(request),
}
if err := p.apeChecker.CheckAPE(ctx, prm); err != nil {
@ -226,7 +227,7 @@ func (p *patchStreamBasicChecker) Send(ctx context.Context, request *objectV2.Pa
ContainerOwner: reqCtx.ContainerOwner,
Role: nativeSchemaRole(reqCtx.Role),
BearerToken: reqCtx.BearerToken,
XHeaders: request.GetMetaHeader().GetXHeaders(),
XHeaders: getXHeaders(request),
}
if err := p.apeChecker.CheckAPE(ctx, prm); err != nil {
@ -295,7 +296,7 @@ func (c *Service) Head(ctx context.Context, request *objectV2.HeadRequest) (*obj
SenderKey: hex.EncodeToString(reqCtx.SenderKey),
ContainerOwner: reqCtx.ContainerOwner,
BearerToken: reqCtx.BearerToken,
XHeaders: request.GetMetaHeader().GetXHeaders(),
XHeaders: getXHeaders(request),
})
if err != nil {
return nil, toStatusErr(err)
@ -324,7 +325,7 @@ func (c *Service) Search(request *objectV2.SearchRequest, stream objectSvc.Searc
SenderKey: hex.EncodeToString(reqCtx.SenderKey),
ContainerOwner: reqCtx.ContainerOwner,
BearerToken: reqCtx.BearerToken,
XHeaders: request.GetMetaHeader().GetXHeaders(),
XHeaders: getXHeaders(request),
})
if err != nil {
return toStatusErr(err)
@ -353,7 +354,7 @@ func (c *Service) Delete(ctx context.Context, request *objectV2.DeleteRequest) (
SenderKey: hex.EncodeToString(reqCtx.SenderKey),
ContainerOwner: reqCtx.ContainerOwner,
BearerToken: reqCtx.BearerToken,
XHeaders: request.GetMetaHeader().GetXHeaders(),
XHeaders: getXHeaders(request),
})
if err != nil {
return nil, toStatusErr(err)
@ -387,7 +388,7 @@ func (c *Service) GetRange(request *objectV2.GetRangeRequest, stream objectSvc.G
SenderKey: hex.EncodeToString(reqCtx.SenderKey),
ContainerOwner: reqCtx.ContainerOwner,
BearerToken: reqCtx.BearerToken,
XHeaders: request.GetMetaHeader().GetXHeaders(),
XHeaders: getXHeaders(request),
})
if err != nil {
return toStatusErr(err)
@ -416,7 +417,7 @@ func (c *Service) GetRangeHash(ctx context.Context, request *objectV2.GetRangeHa
SenderKey: hex.EncodeToString(reqCtx.SenderKey),
ContainerOwner: reqCtx.ContainerOwner,
BearerToken: reqCtx.BearerToken,
XHeaders: request.GetMetaHeader().GetXHeaders(),
XHeaders: getXHeaders(request),
}
resp, err := c.next.GetRangeHash(ctx, request)
@ -451,7 +452,7 @@ func (c *Service) PutSingle(ctx context.Context, request *objectV2.PutSingleRequ
SenderKey: hex.EncodeToString(reqCtx.SenderKey),
ContainerOwner: reqCtx.ContainerOwner,
BearerToken: reqCtx.BearerToken,
XHeaders: request.GetMetaHeader().GetXHeaders(),
XHeaders: getXHeaders(request),
}
if err = c.apeChecker.CheckAPE(ctx, prm); err != nil {
@ -476,3 +477,17 @@ func getAddressParamsSDK(cidV2 *refs.ContainerID, objV2 *refs.ObjectID) (cnrID c
}
return
}
type metaHeaderProvider interface {
GetMetaHeader() *session.RequestMetaHeader
}
// getXHeaders retrieves x-headers from a request. If the request is being forwarded, then
// x-headers may be found within `origin` field of meta header.
func getXHeaders(mh metaHeaderProvider) (res []session.XHeader) {
res = mh.GetMetaHeader().GetXHeaders()
if len(res) == 0 {
res = mh.GetMetaHeader().GetOrigin().GetXHeaders()
}
return
}