36 lines
932 B
Go
36 lines
932 B
Go
package s3key
|
|
|
|
import (
|
|
"path"
|
|
"strings"
|
|
|
|
"git.sendico.io/tech/sxchnge/bff/pkg/merrors"
|
|
)
|
|
|
|
// Join confines an object reference to a relative S3 prefix.
|
|
func Join(prefix, reference string) (string, error) {
|
|
cleanPrefix, err := cleanRelative(prefix, "prefix")
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
cleanReference, err := cleanRelative(reference, "obj_ref")
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return path.Join(cleanPrefix, cleanReference), nil
|
|
}
|
|
|
|
func cleanRelative(value, argument string) (string, error) {
|
|
value = strings.TrimSpace(value)
|
|
for _, segment := range strings.Split(value, "/") {
|
|
if segment == ".." {
|
|
return "", merrors.InvalidArgument(argument+" is invalid", argument)
|
|
}
|
|
}
|
|
clean := path.Clean(value)
|
|
if value == "" || clean == "." || path.IsAbs(clean) || clean == ".." || strings.HasPrefix(clean, "../") {
|
|
return "", merrors.InvalidArgument(argument+" is invalid", argument)
|
|
}
|
|
return clean, nil
|
|
}
|