You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							40 lines
						
					
					
						
							1.3 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							40 lines
						
					
					
						
							1.3 KiB
						
					
					
				
								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 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
							 | 
						|
								}
							 |