Files
seaweedfs/weed/s3api/s3bucket/s3api_bucket.go
T
Chris Lu 35ab67fa8a s3: reject reserved bucket name "filemeta" (#9760)
filemeta is the filer SQL store's default table name. A bucket of that
name passes VerifyS3BucketName but is rejected by the store's isValidBucket
guard on every operation, so it creates fine yet can't be deleted and wedges
fsck. Reject it at creation so both checks agree.
2026-05-31 11:15:05 -07:00

49 lines
1.6 KiB
Go

package s3bucket
import (
"fmt"
"net"
"strings"
"unicode"
)
// Reserved because it is the default table/collection name of the filer
// store; a bucket of the same name collides with it and wedges the bucket
// (cannot be deleted, breaks fsck) on SQL backends with per-bucket tables.
const reservedBucketName = "filemeta"
// https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html
func VerifyS3BucketName(name string) (err error) {
if len(name) < 3 || len(name) > 63 {
return fmt.Errorf("bucket name must between [3, 63] characters")
}
if name == reservedBucketName {
return fmt.Errorf("bucket name %q is reserved", name)
}
for idx, ch := range name {
if !(unicode.IsLower(ch) || ch == '.' || ch == '-' || unicode.IsNumber(ch)) {
return fmt.Errorf("bucket name can only contain lower case characters, numbers, dots, and hyphens")
}
if idx > 0 && (ch == '.' && name[idx-1] == '.') {
return fmt.Errorf("bucket names must not contain two adjacent periods")
}
//TODO buckets with s3 transfer acceleration cannot have . in name
}
if name[0] == '.' || name[0] == '-' {
return fmt.Errorf("name must start with number or lower case character")
}
if name[len(name)-1] == '.' || name[len(name)-1] == '-' {
return fmt.Errorf("name must end with number or lower case character")
}
if strings.HasPrefix(name, "xn--") {
return fmt.Errorf("prefix xn-- is reserved and not allowed in bucket prefix")
}
if strings.HasSuffix(name, "-s3alias") {
return fmt.Errorf("suffix -s3alias is reserved and not allowed in bucket suffix")
}
if net.ParseIP(name) != nil {
return fmt.Errorf("bucket name cannot be ip addresses")
}
return nil
}