package middleware import ( "context" "fmt" "time" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/creds/accessbox" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object" ) // keyWrapper is wrapper for context keys. type keyWrapper string // boxKey is an ID used to store Box in a context. var boxKey = keyWrapper("__context_box_key") // GetBoxData extracts accessbox.Box from context. func GetBoxData(ctx context.Context) (*accessbox.Box, error) { data, ok := ctx.Value(boxKey).(*Box) if !ok || data == nil { return nil, fmt.Errorf("couldn't get box from context") } if data.AccessBox == nil { return nil, fmt.Errorf("couldn't get box data from context") } box := data.AccessBox if box.Gate == nil { box.Gate = &accessbox.GateData{} } return box, nil } // GetAuthHeaders extracts auth.AuthHeader from context. func GetAuthHeaders(ctx context.Context) (*AuthHeader, error) { data, ok := ctx.Value(boxKey).(*Box) if !ok || data == nil { return nil, fmt.Errorf("couldn't get box from context") } return data.AuthHeaders, nil } // GetClientTime extracts time.Time from context. func GetClientTime(ctx context.Context) (time.Time, error) { data, ok := ctx.Value(boxKey).(*Box) if !ok || data == nil { return time.Time{}, fmt.Errorf("couldn't get box from context") } if data.ClientTime.IsZero() { return time.Time{}, fmt.Errorf("couldn't get client time from context") } return data.ClientTime, nil } // GetAccessBoxAttrs extracts []object.Attribute from context. func GetAccessBoxAttrs(ctx context.Context) ([]object.Attribute, error) { data, ok := ctx.Value(boxKey).(*Box) if !ok || data == nil { return nil, fmt.Errorf("couldn't get box from context") } return data.Attributes, nil } // SetBox sets Box in the context. func SetBox(ctx context.Context, box *Box) context.Context { return context.WithValue(ctx, boxKey, box) }