chrislu
2 years ago
4 changed files with 80 additions and 57 deletions
-
40weed/s3api/s3bucket/s3api_bucket.go
-
37weed/s3api/s3bucket/s3api_bucket_test.go
-
41weed/shell/command_s3_bucket_create.go
-
19weed/shell/command_s3_bucket_create_test.go
@ -0,0 +1,40 @@ |
|||||
|
package s3bucket |
||||
|
|
||||
|
import ( |
||||
|
"fmt" |
||||
|
"net" |
||||
|
"strings" |
||||
|
"unicode" |
||||
|
) |
||||
|
|
||||
|
// 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") |
||||
|
} |
||||
|
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 accleration 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 a reserved and not allowed in bucket prefix") |
||||
|
} |
||||
|
if strings.HasSuffix(name, "-s3alias") { |
||||
|
return fmt.Errorf("suffix -s3alias is a reserved and not allowed in bucket suffix") |
||||
|
} |
||||
|
if net.ParseIP(name) != nil { |
||||
|
return fmt.Errorf("bucket name cannot be ip addresses") |
||||
|
} |
||||
|
return nil |
||||
|
} |
@ -0,0 +1,37 @@ |
|||||
|
package s3bucket |
||||
|
|
||||
|
import ( |
||||
|
"github.com/stretchr/testify/assert" |
||||
|
"testing" |
||||
|
) |
||||
|
|
||||
|
func Test_verifyBucketName(t *testing.T) { |
||||
|
invalidS3BucketNames := []string{ |
||||
|
"A9325325b", |
||||
|
"123.12.153.10", |
||||
|
"abc214..2", |
||||
|
"d", |
||||
|
".ewfs3253543", |
||||
|
"grehtrry-", |
||||
|
"----------", |
||||
|
"x@fdsgr032", |
||||
|
} |
||||
|
for _, invalidName := range invalidS3BucketNames { |
||||
|
err := VerifyS3BucketName(invalidName) |
||||
|
assert.NotNil(t, err) |
||||
|
} |
||||
|
validS3BucketName := []string{ |
||||
|
"a9325325b", |
||||
|
"999.12.153.10", |
||||
|
"abc214.2", |
||||
|
"3d3d3d", |
||||
|
"ewfs3253543", |
||||
|
"grehtrry-a", |
||||
|
"0----------0", |
||||
|
"xafdsgr032", |
||||
|
} |
||||
|
for _, invalidName := range validS3BucketName { |
||||
|
err := VerifyS3BucketName(invalidName) |
||||
|
assert.Nil(t, err) |
||||
|
} |
||||
|
} |
@ -1,19 +0,0 @@ |
|||||
package shell |
|
||||
|
|
||||
import ( |
|
||||
"github.com/stretchr/testify/assert" |
|
||||
"testing" |
|
||||
) |
|
||||
|
|
||||
func Test_verifyBucketName(t *testing.T) { |
|
||||
invalidS3BucketNames := []string{"A9325325b", "123.12.153.10", "abc214..2", "d", ".ewfs3253543", "grehtrry-", "----------", "x@fdsgr032"} |
|
||||
for _, invalidName := range invalidS3BucketNames { |
|
||||
err := verifyS3BucketName(invalidName) |
|
||||
assert.NotNil(t, err) |
|
||||
} |
|
||||
validS3BucketName := []string{"a9325325b", "999.12.153.10", "abc214.2", "3d3d3d", "ewfs3253543", "grehtrry-a", "0----------0", "xafdsgr032"} |
|
||||
for _, invalidName := range validS3BucketName { |
|
||||
err := verifyS3BucketName(invalidName) |
|
||||
assert.Nil(t, err) |
|
||||
} |
|
||||
} |
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue