Compare commits
	
		
			2 Commits
		
	
	
		
			155c006740
			...
			2fe128a017
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 2fe128a017 | ||
|  | 87494faffe | 
| @ -16,7 +16,7 @@ func main() { | |||||||
| 	/* | 	/* | ||||||
| 	  MAILGUN_API_KEY=key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | 	  MAILGUN_API_KEY=key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | ||||||
| 	  MAILGUN_DOMAIN=mail.example.com | 	  MAILGUN_DOMAIN=mail.example.com | ||||||
| 	  MAILGUN_FROM="Rob the Robot <rob.the.robot@mail.example.com>" | 	  MAILER_FROM="Rob the Robot <rob.the.robot@mail.example.com>" | ||||||
| 	*/ | 	*/ | ||||||
| 
 | 
 | ||||||
| 	to := flag.String("to", "", "message recipient in the format of 'John Doe <john@example.com>'") | 	to := flag.String("to", "", "message recipient in the format of 'John Doe <john@example.com>'") | ||||||
| @ -36,7 +36,7 @@ func main() { | |||||||
| 
 | 
 | ||||||
| 	domain := os.Getenv("MAILGUN_DOMAIN") | 	domain := os.Getenv("MAILGUN_DOMAIN") | ||||||
| 	apiKey := os.Getenv("MAILGUN_API_KEY") | 	apiKey := os.Getenv("MAILGUN_API_KEY") | ||||||
| 	from := os.Getenv("MAILGUN_FROM") | 	from := os.Getenv("MAILER_FROM") | ||||||
| 
 | 
 | ||||||
| 	if 0 == len(*text) { | 	if 0 == len(*text) { | ||||||
| 		*text = "Testing some Mailgun awesomeness!" | 		*text = "Testing some Mailgun awesomeness!" | ||||||
|  | |||||||
							
								
								
									
										7
									
								
								examples/example.env
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								examples/example.env
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | SALT=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||||||
|  | 
 | ||||||
|  | MAILGUN_API_KEY=key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | ||||||
|  | MAILGUN_DOMAIN=mail.example.com | ||||||
|  | 
 | ||||||
|  | MAILER_FROM="Rob the Robot <rob.the.robot@mail.example.com>" | ||||||
|  | MAILER_REPLY_TO=support@example.com | ||||||
							
								
								
									
										1
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								go.mod
									
									
									
									
									
								
							| @ -4,6 +4,7 @@ go 1.13 | |||||||
| 
 | 
 | ||||||
| require ( | require ( | ||||||
| 	git.rootprojects.org/root/keypairs v0.5.2 | 	git.rootprojects.org/root/keypairs v0.5.2 | ||||||
|  | 	github.com/google/uuid v1.1.1 | ||||||
| 	github.com/joho/godotenv v1.3.0 | 	github.com/joho/godotenv v1.3.0 | ||||||
| 	github.com/mailgun/mailgun-go/v3 v3.6.4 | 	github.com/mailgun/mailgun-go/v3 v3.6.4 | ||||||
| ) | ) | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
								
							| @ -10,6 +10,8 @@ github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 h1:E2s37DuLxFhQD | |||||||
| github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= | github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= | ||||||
| github.com/go-chi/chi v4.0.0+incompatible h1:SiLLEDyAkqNnw+T/uDTf3aFB9T4FTrwMpuYrgaRcnW4= | github.com/go-chi/chi v4.0.0+incompatible h1:SiLLEDyAkqNnw+T/uDTf3aFB9T4FTrwMpuYrgaRcnW4= | ||||||
| github.com/go-chi/chi v4.0.0+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= | github.com/go-chi/chi v4.0.0+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= | ||||||
|  | github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= | ||||||
|  | github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||||
| github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= | github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= | ||||||
| github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= | github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= | ||||||
| github.com/mailgun/mailgun-go/v3 v3.6.4 h1:+cvbZRgLSHivbz/w1iWLmxVl6Bqf4geD2D7QMj4+8PE= | github.com/mailgun/mailgun-go/v3 v3.6.4 h1:+cvbZRgLSHivbz/w1iWLmxVl6Bqf4geD2D7QMj4+8PE= | ||||||
|  | |||||||
							
								
								
									
										46
									
								
								mockid/mailgun.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								mockid/mailgun.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,46 @@ | |||||||
|  | package mockid | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"os" | ||||||
|  | 	"time" | ||||||
|  | 
 | ||||||
|  | 	mailgun "github.com/mailgun/mailgun-go/v3" | ||||||
|  | 
 | ||||||
|  | 	_ "github.com/joho/godotenv/autoload" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	mgDomain string | ||||||
|  | 	mgAPIKey string | ||||||
|  | 	mgFrom   string | ||||||
|  | 	mg       *mailgun.MailgunImpl | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	/* | ||||||
|  | 	  MAILGUN_API_KEY=key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | ||||||
|  | 	  MAILGUN_DOMAIN=mail.example.com | ||||||
|  | 	  MAILER_FROM="Rob the Robot <rob.the.robot@mail.example.com>" | ||||||
|  | 	*/ | ||||||
|  | 
 | ||||||
|  | 	mgDomain = os.Getenv("MAILGUN_DOMAIN") | ||||||
|  | 	mgAPIKey = os.Getenv("MAILGUN_API_KEY") | ||||||
|  | 	mgFrom = os.Getenv("MAILER_FROM") | ||||||
|  | 
 | ||||||
|  | 	mg = mailgun.NewMailgun(mgDomain, mgAPIKey) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func SendSimpleMessage(to, from, subject, text, replyTo string) (string, error) { | ||||||
|  | 	m := mg.NewMessage(from, subject, text, to) | ||||||
|  | 	if 0 != len(replyTo) { | ||||||
|  | 		// mailgun's required "h:" prefix is added by the library | ||||||
|  | 		m.AddHeader("Reply-To", replyTo) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) | ||||||
|  | 	defer cancel() | ||||||
|  | 
 | ||||||
|  | 	_, id, err := mg.Send(ctx, m) | ||||||
|  | 	return id, err | ||||||
|  | } | ||||||
							
								
								
									
										131
									
								
								mockid/mockid.go
									
									
									
									
									
								
							
							
						
						
									
										131
									
								
								mockid/mockid.go
									
									
									
									
									
								
							| @ -5,6 +5,7 @@ import ( | |||||||
| 	"crypto/ecdsa" | 	"crypto/ecdsa" | ||||||
| 	"crypto/rand" | 	"crypto/rand" | ||||||
| 	"crypto/rsa" | 	"crypto/rsa" | ||||||
|  | 	"crypto/sha1" | ||||||
| 	"crypto/sha256" | 	"crypto/sha256" | ||||||
| 	"crypto/sha512" | 	"crypto/sha512" | ||||||
| 	"encoding/base64" | 	"encoding/base64" | ||||||
| @ -15,14 +16,19 @@ import ( | |||||||
| 	"math/big" | 	"math/big" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"net/url" | 	"net/url" | ||||||
|  | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
|  | 	"sync" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"git.rootprojects.org/root/keypairs" | 	"git.rootprojects.org/root/keypairs" | ||||||
| 	"git.rootprojects.org/root/keypairs/keyfetch" | 	"git.rootprojects.org/root/keypairs/keyfetch" | ||||||
|  | 
 | ||||||
| 	//jwt "github.com/dgrijalva/jwt-go" | 	//jwt "github.com/dgrijalva/jwt-go" | ||||||
|  | 
 | ||||||
|  | 	"github.com/google/uuid" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type PublicJWK struct { | type PublicJWK struct { | ||||||
| @ -53,13 +59,39 @@ func (t *InspectableToken) MarshalJSON() ([]byte, error) { | |||||||
| 	)), nil | 	)), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var nonces map[string]int64 | var defaultFrom string | ||||||
|  | var defaultReplyTo string | ||||||
|  | 
 | ||||||
|  | //var nonces map[string]int64 | ||||||
|  | //var nonCh chan string | ||||||
|  | var nonces sync.Map | ||||||
|  | var salt []byte | ||||||
| 
 | 
 | ||||||
| func init() { | func init() { | ||||||
| 	nonces = make(map[string]int64) | 	var err error | ||||||
|  | 	salt64 := os.Getenv("SALT") | ||||||
|  | 	salt, err = base64.RawURLEncoding.DecodeString(salt64) | ||||||
|  | 	if len(salt64) < 22 || nil != err { | ||||||
|  | 		panic("SALT must be set as 22+ character base64") | ||||||
|  | 	} | ||||||
|  | 	defaultFrom = os.Getenv("MAILER_FROM") | ||||||
|  | 	defaultReplyTo = os.Getenv("MAILER_REPLY_TO") | ||||||
|  | 	//nonces = make(map[string]int64) | ||||||
|  | 	//nonCh = make(chan string) | ||||||
|  | 
 | ||||||
|  | 	/* | ||||||
|  | 		  go func() { | ||||||
|  | 		    for { | ||||||
|  | 		      nonce := <- nonCh | ||||||
|  | 			    nonces[nonce] = time.Now().Unix() | ||||||
|  | 		    } | ||||||
|  | 		  }() | ||||||
|  | 	*/ | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Route(jwksPrefix string, privkey keypairs.PrivateKey) { | func Route(jwksPrefix string, privkey keypairs.PrivateKey) { | ||||||
|  | 	// TODO get from main() | ||||||
|  | 	tokPrefix := jwksPrefix | ||||||
| 	pubkey := keypairs.NewPublicKey(privkey.Public()) | 	pubkey := keypairs.NewPublicKey(privkey.Public()) | ||||||
| 
 | 
 | ||||||
| 	http.HandleFunc("/api/new-nonce", func(w http.ResponseWriter, r *http.Request) { | 	http.HandleFunc("/api/new-nonce", func(w http.ResponseWriter, r *http.Request) { | ||||||
| @ -87,7 +119,84 @@ func Route(jwksPrefix string, privkey keypairs.PrivateKey) { | |||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	http.HandleFunc("/api/new-account", requireNonce(func(w http.ResponseWriter, r *http.Request) { | 	http.HandleFunc("/api/new-account", requireNonce(func(w http.ResponseWriter, r *http.Request) { | ||||||
| 		http.Error(w, "Not Implemented", http.StatusNotImplemented) | 		// Try to decode the request body into the struct. If there is an error, | ||||||
|  | 		// respond to the client with the error message and a 400 status code. | ||||||
|  | 		data := map[string]string{} | ||||||
|  | 		err := json.NewDecoder(r.Body).Decode(&data) | ||||||
|  | 		if nil != err { | ||||||
|  | 			http.Error(w, err.Error(), http.StatusBadRequest) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// TODO check DNS for MX records | ||||||
|  | 		parts := strings.Split(data["to"], ", <>\n\r\t") | ||||||
|  | 		to := parts[0] | ||||||
|  | 		if len(parts) > 1 || !strings.Contains(to, "@") { | ||||||
|  | 			http.Error(w, "invalid email address", http.StatusBadRequest) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		token, err := uuid.NewRandom() | ||||||
|  | 		if nil != err { | ||||||
|  | 			// nothing else to do if we run out of random | ||||||
|  | 			// or are on a platform that doesn't support random | ||||||
|  | 			panic(fmt.Errorf("random bytes read failure: %w", err)) | ||||||
|  | 		} | ||||||
|  | 		token64 := base64.RawURLEncoding.EncodeToString([]byte(token[:])) | ||||||
|  | 		// hash token to prevent fs read timing attacks | ||||||
|  | 		hash := sha1.Sum(append(token[:], salt...)) | ||||||
|  | 		tokname := base64.RawURLEncoding.EncodeToString(hash[:]) | ||||||
|  | 		if err := ioutil.WriteFile( | ||||||
|  | 			filepath.Join(tokPrefix, tokname+".tok.txt"), | ||||||
|  | 			[]byte(`{"comment":"I have no idea..."}`), | ||||||
|  | 			os.FileMode(0600), | ||||||
|  | 		); nil != err { | ||||||
|  | 			http.Error(w, "database connection failed when writing verification token", http.StatusInternalServerError) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		subject := "Verify New Account" | ||||||
|  | 		// TODO go tpl | ||||||
|  | 		// TODO determine OS and Browser from user agent | ||||||
|  | 		baseURL := getBaseURL(r) | ||||||
|  | 		text := fmt.Sprintf( | ||||||
|  | 			"It looks like you just tried to register a new Pocket ID account.\n\n    Verify account: %s/verify/%s\n\nNot you? Just ignore this message.", | ||||||
|  | 			baseURL, token64, | ||||||
|  | 		) | ||||||
|  | 		_, err = SendSimpleMessage(to, defaultFrom, subject, text, defaultReplyTo) | ||||||
|  | 		if nil != err { | ||||||
|  | 			// TODO neuter mailgun output | ||||||
|  | 			http.Error(w, err.Error(), http.StatusBadRequest) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		fmt.Fprintf(w, `{ "success": true, "error": "" }%s`, "\n") | ||||||
|  | 	})) | ||||||
|  | 
 | ||||||
|  | 	// TODO use chi | ||||||
|  | 	http.HandleFunc("/verify/", requireNonce(func(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 		parts := strings.Split(r.URL.Path, "/") | ||||||
|  | 		if 3 != len(parts) { | ||||||
|  | 			http.Error(w, "invalid url path", http.StatusBadRequest) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		token64 := parts[2] | ||||||
|  | 		token, err := base64.RawURLEncoding.DecodeString(token64) | ||||||
|  | 		if err != nil || 0 == len(token) { | ||||||
|  | 			http.Error(w, "invalid url path", http.StatusBadRequest) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		// hash token to prevent fs read timing attacks | ||||||
|  | 		hash := sha1.Sum(append(token, salt...)) | ||||||
|  | 		tokname := base64.RawURLEncoding.EncodeToString(hash[:]) | ||||||
|  | 		tokfile := filepath.Join(tokPrefix, tokname+".tok.txt") | ||||||
|  | 		_, err = ioutil.ReadFile(tokfile) | ||||||
|  | 		if nil != err { | ||||||
|  | 			http.Error(w, "database connection failed when reading verification token", http.StatusInternalServerError) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		os.Remove(tokfile) | ||||||
|  | 
 | ||||||
|  | 		fmt.Fprintf(w, `{ "success": true, "error": "" }%s`, "\n") | ||||||
| 	})) | 	})) | ||||||
| 
 | 
 | ||||||
| 	http.HandleFunc("/api/jwks", func(w http.ResponseWriter, r *http.Request) { | 	http.HandleFunc("/api/jwks", func(w http.ResponseWriter, r *http.Request) { | ||||||
| @ -521,6 +630,7 @@ func JOSEVerify(pubkey keypairs.PublicKey, hash []byte, sig []byte) bool { | |||||||
| 	case *rsa.PublicKey: | 	case *rsa.PublicKey: | ||||||
| 		// TODO keypairs.Size(key) to detect key size ? | 		// TODO keypairs.Size(key) to detect key size ? | ||||||
| 		//alg := "SHA256" | 		//alg := "SHA256" | ||||||
|  | 		// TODO: this hasn't been tested yet | ||||||
| 		if err := rsa.VerifyPKCS1v15(pub, crypto.SHA256, hash, sig); nil != err { | 		if err := rsa.VerifyPKCS1v15(pub, crypto.SHA256, hash, sig); nil != err { | ||||||
| 			verified = true | 			verified = true | ||||||
| 		} | 		} | ||||||
| @ -566,7 +676,8 @@ func issueNonce(w http.ResponseWriter, r *http.Request) { | |||||||
| 	b := make([]byte, 16) | 	b := make([]byte, 16) | ||||||
| 	_, _ = rand.Read(b) | 	_, _ = rand.Read(b) | ||||||
| 	nonce := base64.RawURLEncoding.EncodeToString(b) | 	nonce := base64.RawURLEncoding.EncodeToString(b) | ||||||
| 	nonces[nonce] = time.Now().Unix() | 	//nonCh <- nonce | ||||||
|  | 	nonces.Store(nonce, time.Now()) | ||||||
| 
 | 
 | ||||||
| 	w.Header().Set("Replay-Nonce", nonce) | 	w.Header().Set("Replay-Nonce", nonce) | ||||||
| } | } | ||||||
| @ -575,8 +686,13 @@ func requireNonce(next http.HandlerFunc) http.HandlerFunc { | |||||||
| 	return func(w http.ResponseWriter, r *http.Request) { | 	return func(w http.ResponseWriter, r *http.Request) { | ||||||
| 		nonce := r.Header.Get("Replay-Nonce") | 		nonce := r.Header.Get("Replay-Nonce") | ||||||
| 		// TODO expire nonces every so often | 		// TODO expire nonces every so often | ||||||
| 		t := nonces[nonce] | 		//t := nonces[nonce] | ||||||
| 		if 0 == t { | 		var t time.Time | ||||||
|  | 		tmp, ok := nonces.Load(nonce) | ||||||
|  | 		if ok { | ||||||
|  | 			t = tmp.(time.Time) | ||||||
|  | 		} | ||||||
|  | 		if !ok || time.Now().Sub(t) > 15*time.Minute { | ||||||
| 			http.Error( | 			http.Error( | ||||||
| 				w, | 				w, | ||||||
| 				`{ "error": "invalid or expired nonce", "error_code": "ENONCE" }`, | 				`{ "error": "invalid or expired nonce", "error_code": "ENONCE" }`, | ||||||
| @ -585,7 +701,8 @@ func requireNonce(next http.HandlerFunc) http.HandlerFunc { | |||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		delete(nonces, nonce) | 		//delete(nonces, nonce) | ||||||
|  | 		nonces.Delete(nonce) | ||||||
| 		issueNonce(w, r) | 		issueNonce(w, r) | ||||||
| 
 | 
 | ||||||
| 		next(w, r) | 		next(w, r) | ||||||
|  | |||||||
							
								
								
									
										9
									
								
								vendor/github.com/google/uuid/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/google/uuid/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | language: go | ||||||
|  | 
 | ||||||
|  | go: | ||||||
|  |   - 1.4.3 | ||||||
|  |   - 1.5.3 | ||||||
|  |   - tip | ||||||
|  | 
 | ||||||
|  | script: | ||||||
|  |   - go test -v ./... | ||||||
							
								
								
									
										10
									
								
								vendor/github.com/google/uuid/CONTRIBUTING.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/google/uuid/CONTRIBUTING.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | # How to contribute | ||||||
|  | 
 | ||||||
|  | We definitely welcome patches and contribution to this project! | ||||||
|  | 
 | ||||||
|  | ### Legal requirements | ||||||
|  | 
 | ||||||
|  | In order to protect both you and ourselves, you will need to sign the | ||||||
|  | [Contributor License Agreement](https://cla.developers.google.com/clas). | ||||||
|  | 
 | ||||||
|  | You may have already signed it for other Google projects. | ||||||
							
								
								
									
										9
									
								
								vendor/github.com/google/uuid/CONTRIBUTORS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/google/uuid/CONTRIBUTORS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | Paul Borman <borman@google.com> | ||||||
|  | bmatsuo | ||||||
|  | shawnps | ||||||
|  | theory | ||||||
|  | jboverfelt | ||||||
|  | dsymonds | ||||||
|  | cd1 | ||||||
|  | wallclockbuilder | ||||||
|  | dansouza | ||||||
							
								
								
									
										27
									
								
								vendor/github.com/google/uuid/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/google/uuid/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | |||||||
|  | Copyright (c) 2009,2014 Google Inc. All rights reserved. | ||||||
|  | 
 | ||||||
|  | Redistribution and use in source and binary forms, with or without | ||||||
|  | modification, are permitted provided that the following conditions are | ||||||
|  | met: | ||||||
|  | 
 | ||||||
|  |    * Redistributions of source code must retain the above copyright | ||||||
|  | notice, this list of conditions and the following disclaimer. | ||||||
|  |    * Redistributions in binary form must reproduce the above | ||||||
|  | copyright notice, this list of conditions and the following disclaimer | ||||||
|  | in the documentation and/or other materials provided with the | ||||||
|  | distribution. | ||||||
|  |    * Neither the name of Google Inc. nor the names of its | ||||||
|  | contributors may be used to endorse or promote products derived from | ||||||
|  | this software without specific prior written permission. | ||||||
|  | 
 | ||||||
|  | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||||
|  | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||||
|  | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||||
|  | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||||
|  | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||||
|  | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||||
|  | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
							
								
								
									
										19
									
								
								vendor/github.com/google/uuid/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/google/uuid/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | |||||||
|  | # uuid  | ||||||
|  | The uuid package generates and inspects UUIDs based on | ||||||
|  | [RFC 4122](http://tools.ietf.org/html/rfc4122) | ||||||
|  | and DCE 1.1: Authentication and Security Services.  | ||||||
|  | 
 | ||||||
|  | This package is based on the github.com/pborman/uuid package (previously named | ||||||
|  | code.google.com/p/go-uuid).  It differs from these earlier packages in that | ||||||
|  | a UUID is a 16 byte array rather than a byte slice.  One loss due to this | ||||||
|  | change is the ability to represent an invalid UUID (vs a NIL UUID). | ||||||
|  | 
 | ||||||
|  | ###### Install | ||||||
|  | `go get github.com/google/uuid` | ||||||
|  | 
 | ||||||
|  | ###### Documentation  | ||||||
|  | [](http://godoc.org/github.com/google/uuid) | ||||||
|  | 
 | ||||||
|  | Full `go doc` style documentation for the package can be viewed online without | ||||||
|  | installing this package by using the GoDoc site here:  | ||||||
|  | http://godoc.org/github.com/google/uuid | ||||||
							
								
								
									
										80
									
								
								vendor/github.com/google/uuid/dce.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								vendor/github.com/google/uuid/dce.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,80 @@ | |||||||
|  | // Copyright 2016 Google Inc.  All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | package uuid | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"encoding/binary" | ||||||
|  | 	"fmt" | ||||||
|  | 	"os" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // A Domain represents a Version 2 domain | ||||||
|  | type Domain byte | ||||||
|  | 
 | ||||||
|  | // Domain constants for DCE Security (Version 2) UUIDs. | ||||||
|  | const ( | ||||||
|  | 	Person = Domain(0) | ||||||
|  | 	Group  = Domain(1) | ||||||
|  | 	Org    = Domain(2) | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // NewDCESecurity returns a DCE Security (Version 2) UUID. | ||||||
|  | // | ||||||
|  | // The domain should be one of Person, Group or Org. | ||||||
|  | // On a POSIX system the id should be the users UID for the Person | ||||||
|  | // domain and the users GID for the Group.  The meaning of id for | ||||||
|  | // the domain Org or on non-POSIX systems is site defined. | ||||||
|  | // | ||||||
|  | // For a given domain/id pair the same token may be returned for up to | ||||||
|  | // 7 minutes and 10 seconds. | ||||||
|  | func NewDCESecurity(domain Domain, id uint32) (UUID, error) { | ||||||
|  | 	uuid, err := NewUUID() | ||||||
|  | 	if err == nil { | ||||||
|  | 		uuid[6] = (uuid[6] & 0x0f) | 0x20 // Version 2 | ||||||
|  | 		uuid[9] = byte(domain) | ||||||
|  | 		binary.BigEndian.PutUint32(uuid[0:], id) | ||||||
|  | 	} | ||||||
|  | 	return uuid, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewDCEPerson returns a DCE Security (Version 2) UUID in the person | ||||||
|  | // domain with the id returned by os.Getuid. | ||||||
|  | // | ||||||
|  | //  NewDCESecurity(Person, uint32(os.Getuid())) | ||||||
|  | func NewDCEPerson() (UUID, error) { | ||||||
|  | 	return NewDCESecurity(Person, uint32(os.Getuid())) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewDCEGroup returns a DCE Security (Version 2) UUID in the group | ||||||
|  | // domain with the id returned by os.Getgid. | ||||||
|  | // | ||||||
|  | //  NewDCESecurity(Group, uint32(os.Getgid())) | ||||||
|  | func NewDCEGroup() (UUID, error) { | ||||||
|  | 	return NewDCESecurity(Group, uint32(os.Getgid())) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Domain returns the domain for a Version 2 UUID.  Domains are only defined | ||||||
|  | // for Version 2 UUIDs. | ||||||
|  | func (uuid UUID) Domain() Domain { | ||||||
|  | 	return Domain(uuid[9]) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ID returns the id for a Version 2 UUID. IDs are only defined for Version 2 | ||||||
|  | // UUIDs. | ||||||
|  | func (uuid UUID) ID() uint32 { | ||||||
|  | 	return binary.BigEndian.Uint32(uuid[0:4]) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (d Domain) String() string { | ||||||
|  | 	switch d { | ||||||
|  | 	case Person: | ||||||
|  | 		return "Person" | ||||||
|  | 	case Group: | ||||||
|  | 		return "Group" | ||||||
|  | 	case Org: | ||||||
|  | 		return "Org" | ||||||
|  | 	} | ||||||
|  | 	return fmt.Sprintf("Domain%d", int(d)) | ||||||
|  | } | ||||||
							
								
								
									
										12
									
								
								vendor/github.com/google/uuid/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/google/uuid/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | |||||||
|  | // Copyright 2016 Google Inc.  All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | // Package uuid generates and inspects UUIDs. | ||||||
|  | // | ||||||
|  | // UUIDs are based on RFC 4122 and DCE 1.1: Authentication and Security | ||||||
|  | // Services. | ||||||
|  | // | ||||||
|  | // A UUID is a 16 byte (128 bit) array.  UUIDs may be used as keys to | ||||||
|  | // maps or compared directly. | ||||||
|  | package uuid | ||||||
							
								
								
									
										1
									
								
								vendor/github.com/google/uuid/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/google/uuid/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | module github.com/google/uuid | ||||||
							
								
								
									
										53
									
								
								vendor/github.com/google/uuid/hash.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								vendor/github.com/google/uuid/hash.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,53 @@ | |||||||
|  | // Copyright 2016 Google Inc.  All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | package uuid | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"crypto/md5" | ||||||
|  | 	"crypto/sha1" | ||||||
|  | 	"hash" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Well known namespace IDs and UUIDs | ||||||
|  | var ( | ||||||
|  | 	NameSpaceDNS  = Must(Parse("6ba7b810-9dad-11d1-80b4-00c04fd430c8")) | ||||||
|  | 	NameSpaceURL  = Must(Parse("6ba7b811-9dad-11d1-80b4-00c04fd430c8")) | ||||||
|  | 	NameSpaceOID  = Must(Parse("6ba7b812-9dad-11d1-80b4-00c04fd430c8")) | ||||||
|  | 	NameSpaceX500 = Must(Parse("6ba7b814-9dad-11d1-80b4-00c04fd430c8")) | ||||||
|  | 	Nil           UUID // empty UUID, all zeros | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // NewHash returns a new UUID derived from the hash of space concatenated with | ||||||
|  | // data generated by h.  The hash should be at least 16 byte in length.  The | ||||||
|  | // first 16 bytes of the hash are used to form the UUID.  The version of the | ||||||
|  | // UUID will be the lower 4 bits of version.  NewHash is used to implement | ||||||
|  | // NewMD5 and NewSHA1. | ||||||
|  | func NewHash(h hash.Hash, space UUID, data []byte, version int) UUID { | ||||||
|  | 	h.Reset() | ||||||
|  | 	h.Write(space[:]) | ||||||
|  | 	h.Write(data) | ||||||
|  | 	s := h.Sum(nil) | ||||||
|  | 	var uuid UUID | ||||||
|  | 	copy(uuid[:], s) | ||||||
|  | 	uuid[6] = (uuid[6] & 0x0f) | uint8((version&0xf)<<4) | ||||||
|  | 	uuid[8] = (uuid[8] & 0x3f) | 0x80 // RFC 4122 variant | ||||||
|  | 	return uuid | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewMD5 returns a new MD5 (Version 3) UUID based on the | ||||||
|  | // supplied name space and data.  It is the same as calling: | ||||||
|  | // | ||||||
|  | //  NewHash(md5.New(), space, data, 3) | ||||||
|  | func NewMD5(space UUID, data []byte) UUID { | ||||||
|  | 	return NewHash(md5.New(), space, data, 3) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewSHA1 returns a new SHA1 (Version 5) UUID based on the | ||||||
|  | // supplied name space and data.  It is the same as calling: | ||||||
|  | // | ||||||
|  | //  NewHash(sha1.New(), space, data, 5) | ||||||
|  | func NewSHA1(space UUID, data []byte) UUID { | ||||||
|  | 	return NewHash(sha1.New(), space, data, 5) | ||||||
|  | } | ||||||
							
								
								
									
										37
									
								
								vendor/github.com/google/uuid/marshal.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								vendor/github.com/google/uuid/marshal.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | |||||||
|  | // Copyright 2016 Google Inc.  All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | package uuid | ||||||
|  | 
 | ||||||
|  | import "fmt" | ||||||
|  | 
 | ||||||
|  | // MarshalText implements encoding.TextMarshaler. | ||||||
|  | func (uuid UUID) MarshalText() ([]byte, error) { | ||||||
|  | 	var js [36]byte | ||||||
|  | 	encodeHex(js[:], uuid) | ||||||
|  | 	return js[:], nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // UnmarshalText implements encoding.TextUnmarshaler. | ||||||
|  | func (uuid *UUID) UnmarshalText(data []byte) error { | ||||||
|  | 	id, err := ParseBytes(data) | ||||||
|  | 	if err == nil { | ||||||
|  | 		*uuid = id | ||||||
|  | 	} | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // MarshalBinary implements encoding.BinaryMarshaler. | ||||||
|  | func (uuid UUID) MarshalBinary() ([]byte, error) { | ||||||
|  | 	return uuid[:], nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // UnmarshalBinary implements encoding.BinaryUnmarshaler. | ||||||
|  | func (uuid *UUID) UnmarshalBinary(data []byte) error { | ||||||
|  | 	if len(data) != 16 { | ||||||
|  | 		return fmt.Errorf("invalid UUID (got %d bytes)", len(data)) | ||||||
|  | 	} | ||||||
|  | 	copy(uuid[:], data) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										90
									
								
								vendor/github.com/google/uuid/node.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								vendor/github.com/google/uuid/node.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,90 @@ | |||||||
|  | // Copyright 2016 Google Inc.  All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | package uuid | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"sync" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	nodeMu sync.Mutex | ||||||
|  | 	ifname string  // name of interface being used | ||||||
|  | 	nodeID [6]byte // hardware for version 1 UUIDs | ||||||
|  | 	zeroID [6]byte // nodeID with only 0's | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // NodeInterface returns the name of the interface from which the NodeID was | ||||||
|  | // derived.  The interface "user" is returned if the NodeID was set by | ||||||
|  | // SetNodeID. | ||||||
|  | func NodeInterface() string { | ||||||
|  | 	defer nodeMu.Unlock() | ||||||
|  | 	nodeMu.Lock() | ||||||
|  | 	return ifname | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetNodeInterface selects the hardware address to be used for Version 1 UUIDs. | ||||||
|  | // If name is "" then the first usable interface found will be used or a random | ||||||
|  | // Node ID will be generated.  If a named interface cannot be found then false | ||||||
|  | // is returned. | ||||||
|  | // | ||||||
|  | // SetNodeInterface never fails when name is "". | ||||||
|  | func SetNodeInterface(name string) bool { | ||||||
|  | 	defer nodeMu.Unlock() | ||||||
|  | 	nodeMu.Lock() | ||||||
|  | 	return setNodeInterface(name) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func setNodeInterface(name string) bool { | ||||||
|  | 	iname, addr := getHardwareInterface(name) // null implementation for js | ||||||
|  | 	if iname != "" && addr != nil { | ||||||
|  | 		ifname = iname | ||||||
|  | 		copy(nodeID[:], addr) | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// We found no interfaces with a valid hardware address.  If name | ||||||
|  | 	// does not specify a specific interface generate a random Node ID | ||||||
|  | 	// (section 4.1.6) | ||||||
|  | 	if name == "" { | ||||||
|  | 		ifname = "random" | ||||||
|  | 		randomBits(nodeID[:]) | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NodeID returns a slice of a copy of the current Node ID, setting the Node ID | ||||||
|  | // if not already set. | ||||||
|  | func NodeID() []byte { | ||||||
|  | 	defer nodeMu.Unlock() | ||||||
|  | 	nodeMu.Lock() | ||||||
|  | 	if nodeID == zeroID { | ||||||
|  | 		setNodeInterface("") | ||||||
|  | 	} | ||||||
|  | 	nid := nodeID | ||||||
|  | 	return nid[:] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetNodeID sets the Node ID to be used for Version 1 UUIDs.  The first 6 bytes | ||||||
|  | // of id are used.  If id is less than 6 bytes then false is returned and the | ||||||
|  | // Node ID is not set. | ||||||
|  | func SetNodeID(id []byte) bool { | ||||||
|  | 	if len(id) < 6 { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	defer nodeMu.Unlock() | ||||||
|  | 	nodeMu.Lock() | ||||||
|  | 	copy(nodeID[:], id) | ||||||
|  | 	ifname = "user" | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NodeID returns the 6 byte node id encoded in uuid.  It returns nil if uuid is | ||||||
|  | // not valid.  The NodeID is only well defined for version 1 and 2 UUIDs. | ||||||
|  | func (uuid UUID) NodeID() []byte { | ||||||
|  | 	var node [6]byte | ||||||
|  | 	copy(node[:], uuid[10:]) | ||||||
|  | 	return node[:] | ||||||
|  | } | ||||||
							
								
								
									
										12
									
								
								vendor/github.com/google/uuid/node_js.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/google/uuid/node_js.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | |||||||
|  | // Copyright 2017 Google Inc.  All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | // +build js | ||||||
|  | 
 | ||||||
|  | package uuid | ||||||
|  | 
 | ||||||
|  | // getHardwareInterface returns nil values for the JS version of the code. | ||||||
|  | // This remvoves the "net" dependency, because it is not used in the browser. | ||||||
|  | // Using the "net" library inflates the size of the transpiled JS code by 673k bytes. | ||||||
|  | func getHardwareInterface(name string) (string, []byte) { return "", nil } | ||||||
							
								
								
									
										33
									
								
								vendor/github.com/google/uuid/node_net.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								vendor/github.com/google/uuid/node_net.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | |||||||
|  | // Copyright 2017 Google Inc.  All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | // +build !js | ||||||
|  | 
 | ||||||
|  | package uuid | ||||||
|  | 
 | ||||||
|  | import "net" | ||||||
|  | 
 | ||||||
|  | var interfaces []net.Interface // cached list of interfaces | ||||||
|  | 
 | ||||||
|  | // getHardwareInterface returns the name and hardware address of interface name. | ||||||
|  | // If name is "" then the name and hardware address of one of the system's | ||||||
|  | // interfaces is returned.  If no interfaces are found (name does not exist or | ||||||
|  | // there are no interfaces) then "", nil is returned. | ||||||
|  | // | ||||||
|  | // Only addresses of at least 6 bytes are returned. | ||||||
|  | func getHardwareInterface(name string) (string, []byte) { | ||||||
|  | 	if interfaces == nil { | ||||||
|  | 		var err error | ||||||
|  | 		interfaces, err = net.Interfaces() | ||||||
|  | 		if err != nil { | ||||||
|  | 			return "", nil | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	for _, ifs := range interfaces { | ||||||
|  | 		if len(ifs.HardwareAddr) >= 6 && (name == "" || name == ifs.Name) { | ||||||
|  | 			return ifs.Name, ifs.HardwareAddr | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return "", nil | ||||||
|  | } | ||||||
							
								
								
									
										59
									
								
								vendor/github.com/google/uuid/sql.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								vendor/github.com/google/uuid/sql.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,59 @@ | |||||||
|  | // Copyright 2016 Google Inc.  All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | package uuid | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"database/sql/driver" | ||||||
|  | 	"fmt" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Scan implements sql.Scanner so UUIDs can be read from databases transparently | ||||||
|  | // Currently, database types that map to string and []byte are supported. Please | ||||||
|  | // consult database-specific driver documentation for matching types. | ||||||
|  | func (uuid *UUID) Scan(src interface{}) error { | ||||||
|  | 	switch src := src.(type) { | ||||||
|  | 	case nil: | ||||||
|  | 		return nil | ||||||
|  | 
 | ||||||
|  | 	case string: | ||||||
|  | 		// if an empty UUID comes from a table, we return a null UUID | ||||||
|  | 		if src == "" { | ||||||
|  | 			return nil | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// see Parse for required string format | ||||||
|  | 		u, err := Parse(src) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return fmt.Errorf("Scan: %v", err) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		*uuid = u | ||||||
|  | 
 | ||||||
|  | 	case []byte: | ||||||
|  | 		// if an empty UUID comes from a table, we return a null UUID | ||||||
|  | 		if len(src) == 0 { | ||||||
|  | 			return nil | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// assumes a simple slice of bytes if 16 bytes | ||||||
|  | 		// otherwise attempts to parse | ||||||
|  | 		if len(src) != 16 { | ||||||
|  | 			return uuid.Scan(string(src)) | ||||||
|  | 		} | ||||||
|  | 		copy((*uuid)[:], src) | ||||||
|  | 
 | ||||||
|  | 	default: | ||||||
|  | 		return fmt.Errorf("Scan: unable to scan type %T into UUID", src) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Value implements sql.Valuer so that UUIDs can be written to databases | ||||||
|  | // transparently. Currently, UUIDs map to strings. Please consult | ||||||
|  | // database-specific driver documentation for matching types. | ||||||
|  | func (uuid UUID) Value() (driver.Value, error) { | ||||||
|  | 	return uuid.String(), nil | ||||||
|  | } | ||||||
							
								
								
									
										123
									
								
								vendor/github.com/google/uuid/time.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								vendor/github.com/google/uuid/time.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,123 @@ | |||||||
|  | // Copyright 2016 Google Inc.  All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | package uuid | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"encoding/binary" | ||||||
|  | 	"sync" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // A Time represents a time as the number of 100's of nanoseconds since 15 Oct | ||||||
|  | // 1582. | ||||||
|  | type Time int64 | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	lillian    = 2299160          // Julian day of 15 Oct 1582 | ||||||
|  | 	unix       = 2440587          // Julian day of 1 Jan 1970 | ||||||
|  | 	epoch      = unix - lillian   // Days between epochs | ||||||
|  | 	g1582      = epoch * 86400    // seconds between epochs | ||||||
|  | 	g1582ns100 = g1582 * 10000000 // 100s of a nanoseconds between epochs | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	timeMu   sync.Mutex | ||||||
|  | 	lasttime uint64 // last time we returned | ||||||
|  | 	clockSeq uint16 // clock sequence for this run | ||||||
|  | 
 | ||||||
|  | 	timeNow = time.Now // for testing | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // UnixTime converts t the number of seconds and nanoseconds using the Unix | ||||||
|  | // epoch of 1 Jan 1970. | ||||||
|  | func (t Time) UnixTime() (sec, nsec int64) { | ||||||
|  | 	sec = int64(t - g1582ns100) | ||||||
|  | 	nsec = (sec % 10000000) * 100 | ||||||
|  | 	sec /= 10000000 | ||||||
|  | 	return sec, nsec | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // GetTime returns the current Time (100s of nanoseconds since 15 Oct 1582) and | ||||||
|  | // clock sequence as well as adjusting the clock sequence as needed.  An error | ||||||
|  | // is returned if the current time cannot be determined. | ||||||
|  | func GetTime() (Time, uint16, error) { | ||||||
|  | 	defer timeMu.Unlock() | ||||||
|  | 	timeMu.Lock() | ||||||
|  | 	return getTime() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func getTime() (Time, uint16, error) { | ||||||
|  | 	t := timeNow() | ||||||
|  | 
 | ||||||
|  | 	// If we don't have a clock sequence already, set one. | ||||||
|  | 	if clockSeq == 0 { | ||||||
|  | 		setClockSequence(-1) | ||||||
|  | 	} | ||||||
|  | 	now := uint64(t.UnixNano()/100) + g1582ns100 | ||||||
|  | 
 | ||||||
|  | 	// If time has gone backwards with this clock sequence then we | ||||||
|  | 	// increment the clock sequence | ||||||
|  | 	if now <= lasttime { | ||||||
|  | 		clockSeq = ((clockSeq + 1) & 0x3fff) | 0x8000 | ||||||
|  | 	} | ||||||
|  | 	lasttime = now | ||||||
|  | 	return Time(now), clockSeq, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ClockSequence returns the current clock sequence, generating one if not | ||||||
|  | // already set.  The clock sequence is only used for Version 1 UUIDs. | ||||||
|  | // | ||||||
|  | // The uuid package does not use global static storage for the clock sequence or | ||||||
|  | // the last time a UUID was generated.  Unless SetClockSequence is used, a new | ||||||
|  | // random clock sequence is generated the first time a clock sequence is | ||||||
|  | // requested by ClockSequence, GetTime, or NewUUID.  (section 4.2.1.1) | ||||||
|  | func ClockSequence() int { | ||||||
|  | 	defer timeMu.Unlock() | ||||||
|  | 	timeMu.Lock() | ||||||
|  | 	return clockSequence() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func clockSequence() int { | ||||||
|  | 	if clockSeq == 0 { | ||||||
|  | 		setClockSequence(-1) | ||||||
|  | 	} | ||||||
|  | 	return int(clockSeq & 0x3fff) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetClockSequence sets the clock sequence to the lower 14 bits of seq.  Setting to | ||||||
|  | // -1 causes a new sequence to be generated. | ||||||
|  | func SetClockSequence(seq int) { | ||||||
|  | 	defer timeMu.Unlock() | ||||||
|  | 	timeMu.Lock() | ||||||
|  | 	setClockSequence(seq) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func setClockSequence(seq int) { | ||||||
|  | 	if seq == -1 { | ||||||
|  | 		var b [2]byte | ||||||
|  | 		randomBits(b[:]) // clock sequence | ||||||
|  | 		seq = int(b[0])<<8 | int(b[1]) | ||||||
|  | 	} | ||||||
|  | 	oldSeq := clockSeq | ||||||
|  | 	clockSeq = uint16(seq&0x3fff) | 0x8000 // Set our variant | ||||||
|  | 	if oldSeq != clockSeq { | ||||||
|  | 		lasttime = 0 | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Time returns the time in 100s of nanoseconds since 15 Oct 1582 encoded in | ||||||
|  | // uuid.  The time is only defined for version 1 and 2 UUIDs. | ||||||
|  | func (uuid UUID) Time() Time { | ||||||
|  | 	time := int64(binary.BigEndian.Uint32(uuid[0:4])) | ||||||
|  | 	time |= int64(binary.BigEndian.Uint16(uuid[4:6])) << 32 | ||||||
|  | 	time |= int64(binary.BigEndian.Uint16(uuid[6:8])&0xfff) << 48 | ||||||
|  | 	return Time(time) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ClockSequence returns the clock sequence encoded in uuid. | ||||||
|  | // The clock sequence is only well defined for version 1 and 2 UUIDs. | ||||||
|  | func (uuid UUID) ClockSequence() int { | ||||||
|  | 	return int(binary.BigEndian.Uint16(uuid[8:10])) & 0x3fff | ||||||
|  | } | ||||||
							
								
								
									
										43
									
								
								vendor/github.com/google/uuid/util.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								vendor/github.com/google/uuid/util.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,43 @@ | |||||||
|  | // Copyright 2016 Google Inc.  All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | package uuid | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"io" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // randomBits completely fills slice b with random data. | ||||||
|  | func randomBits(b []byte) { | ||||||
|  | 	if _, err := io.ReadFull(rander, b); err != nil { | ||||||
|  | 		panic(err.Error()) // rand should never fail | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // xvalues returns the value of a byte as a hexadecimal digit or 255. | ||||||
|  | var xvalues = [256]byte{ | ||||||
|  | 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||||
|  | 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||||
|  | 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||||
|  | 	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255, 255, 255, 255, 255, 255, | ||||||
|  | 	255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||||
|  | 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||||
|  | 	255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||||
|  | 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||||
|  | 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||||
|  | 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||||
|  | 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||||
|  | 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||||
|  | 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||||
|  | 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||||
|  | 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||||
|  | 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // xtob converts hex characters x1 and x2 into a byte. | ||||||
|  | func xtob(x1, x2 byte) (byte, bool) { | ||||||
|  | 	b1 := xvalues[x1] | ||||||
|  | 	b2 := xvalues[x2] | ||||||
|  | 	return (b1 << 4) | b2, b1 != 255 && b2 != 255 | ||||||
|  | } | ||||||
							
								
								
									
										245
									
								
								vendor/github.com/google/uuid/uuid.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										245
									
								
								vendor/github.com/google/uuid/uuid.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,245 @@ | |||||||
|  | // Copyright 2018 Google Inc.  All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | package uuid | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"crypto/rand" | ||||||
|  | 	"encoding/hex" | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // A UUID is a 128 bit (16 byte) Universal Unique IDentifier as defined in RFC | ||||||
|  | // 4122. | ||||||
|  | type UUID [16]byte | ||||||
|  | 
 | ||||||
|  | // A Version represents a UUID's version. | ||||||
|  | type Version byte | ||||||
|  | 
 | ||||||
|  | // A Variant represents a UUID's variant. | ||||||
|  | type Variant byte | ||||||
|  | 
 | ||||||
|  | // Constants returned by Variant. | ||||||
|  | const ( | ||||||
|  | 	Invalid   = Variant(iota) // Invalid UUID | ||||||
|  | 	RFC4122                   // The variant specified in RFC4122 | ||||||
|  | 	Reserved                  // Reserved, NCS backward compatibility. | ||||||
|  | 	Microsoft                 // Reserved, Microsoft Corporation backward compatibility. | ||||||
|  | 	Future                    // Reserved for future definition. | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var rander = rand.Reader // random function | ||||||
|  | 
 | ||||||
|  | // Parse decodes s into a UUID or returns an error.  Both the standard UUID | ||||||
|  | // forms of xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and | ||||||
|  | // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded as well as the | ||||||
|  | // Microsoft encoding {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} and the raw hex | ||||||
|  | // encoding: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. | ||||||
|  | func Parse(s string) (UUID, error) { | ||||||
|  | 	var uuid UUID | ||||||
|  | 	switch len(s) { | ||||||
|  | 	// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | ||||||
|  | 	case 36: | ||||||
|  | 
 | ||||||
|  | 	// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | ||||||
|  | 	case 36 + 9: | ||||||
|  | 		if strings.ToLower(s[:9]) != "urn:uuid:" { | ||||||
|  | 			return uuid, fmt.Errorf("invalid urn prefix: %q", s[:9]) | ||||||
|  | 		} | ||||||
|  | 		s = s[9:] | ||||||
|  | 
 | ||||||
|  | 	// {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} | ||||||
|  | 	case 36 + 2: | ||||||
|  | 		s = s[1:] | ||||||
|  | 
 | ||||||
|  | 	// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | ||||||
|  | 	case 32: | ||||||
|  | 		var ok bool | ||||||
|  | 		for i := range uuid { | ||||||
|  | 			uuid[i], ok = xtob(s[i*2], s[i*2+1]) | ||||||
|  | 			if !ok { | ||||||
|  | 				return uuid, errors.New("invalid UUID format") | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return uuid, nil | ||||||
|  | 	default: | ||||||
|  | 		return uuid, fmt.Errorf("invalid UUID length: %d", len(s)) | ||||||
|  | 	} | ||||||
|  | 	// s is now at least 36 bytes long | ||||||
|  | 	// it must be of the form  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | ||||||
|  | 	if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { | ||||||
|  | 		return uuid, errors.New("invalid UUID format") | ||||||
|  | 	} | ||||||
|  | 	for i, x := range [16]int{ | ||||||
|  | 		0, 2, 4, 6, | ||||||
|  | 		9, 11, | ||||||
|  | 		14, 16, | ||||||
|  | 		19, 21, | ||||||
|  | 		24, 26, 28, 30, 32, 34} { | ||||||
|  | 		v, ok := xtob(s[x], s[x+1]) | ||||||
|  | 		if !ok { | ||||||
|  | 			return uuid, errors.New("invalid UUID format") | ||||||
|  | 		} | ||||||
|  | 		uuid[i] = v | ||||||
|  | 	} | ||||||
|  | 	return uuid, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ParseBytes is like Parse, except it parses a byte slice instead of a string. | ||||||
|  | func ParseBytes(b []byte) (UUID, error) { | ||||||
|  | 	var uuid UUID | ||||||
|  | 	switch len(b) { | ||||||
|  | 	case 36: // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | ||||||
|  | 	case 36 + 9: // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | ||||||
|  | 		if !bytes.Equal(bytes.ToLower(b[:9]), []byte("urn:uuid:")) { | ||||||
|  | 			return uuid, fmt.Errorf("invalid urn prefix: %q", b[:9]) | ||||||
|  | 		} | ||||||
|  | 		b = b[9:] | ||||||
|  | 	case 36 + 2: // {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} | ||||||
|  | 		b = b[1:] | ||||||
|  | 	case 32: // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | ||||||
|  | 		var ok bool | ||||||
|  | 		for i := 0; i < 32; i += 2 { | ||||||
|  | 			uuid[i/2], ok = xtob(b[i], b[i+1]) | ||||||
|  | 			if !ok { | ||||||
|  | 				return uuid, errors.New("invalid UUID format") | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return uuid, nil | ||||||
|  | 	default: | ||||||
|  | 		return uuid, fmt.Errorf("invalid UUID length: %d", len(b)) | ||||||
|  | 	} | ||||||
|  | 	// s is now at least 36 bytes long | ||||||
|  | 	// it must be of the form  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | ||||||
|  | 	if b[8] != '-' || b[13] != '-' || b[18] != '-' || b[23] != '-' { | ||||||
|  | 		return uuid, errors.New("invalid UUID format") | ||||||
|  | 	} | ||||||
|  | 	for i, x := range [16]int{ | ||||||
|  | 		0, 2, 4, 6, | ||||||
|  | 		9, 11, | ||||||
|  | 		14, 16, | ||||||
|  | 		19, 21, | ||||||
|  | 		24, 26, 28, 30, 32, 34} { | ||||||
|  | 		v, ok := xtob(b[x], b[x+1]) | ||||||
|  | 		if !ok { | ||||||
|  | 			return uuid, errors.New("invalid UUID format") | ||||||
|  | 		} | ||||||
|  | 		uuid[i] = v | ||||||
|  | 	} | ||||||
|  | 	return uuid, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // MustParse is like Parse but panics if the string cannot be parsed. | ||||||
|  | // It simplifies safe initialization of global variables holding compiled UUIDs. | ||||||
|  | func MustParse(s string) UUID { | ||||||
|  | 	uuid, err := Parse(s) | ||||||
|  | 	if err != nil { | ||||||
|  | 		panic(`uuid: Parse(` + s + `): ` + err.Error()) | ||||||
|  | 	} | ||||||
|  | 	return uuid | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // FromBytes creates a new UUID from a byte slice. Returns an error if the slice | ||||||
|  | // does not have a length of 16. The bytes are copied from the slice. | ||||||
|  | func FromBytes(b []byte) (uuid UUID, err error) { | ||||||
|  | 	err = uuid.UnmarshalBinary(b) | ||||||
|  | 	return uuid, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Must returns uuid if err is nil and panics otherwise. | ||||||
|  | func Must(uuid UUID, err error) UUID { | ||||||
|  | 	if err != nil { | ||||||
|  | 		panic(err) | ||||||
|  | 	} | ||||||
|  | 	return uuid | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // String returns the string form of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | ||||||
|  | // , or "" if uuid is invalid. | ||||||
|  | func (uuid UUID) String() string { | ||||||
|  | 	var buf [36]byte | ||||||
|  | 	encodeHex(buf[:], uuid) | ||||||
|  | 	return string(buf[:]) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // URN returns the RFC 2141 URN form of uuid, | ||||||
|  | // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,  or "" if uuid is invalid. | ||||||
|  | func (uuid UUID) URN() string { | ||||||
|  | 	var buf [36 + 9]byte | ||||||
|  | 	copy(buf[:], "urn:uuid:") | ||||||
|  | 	encodeHex(buf[9:], uuid) | ||||||
|  | 	return string(buf[:]) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func encodeHex(dst []byte, uuid UUID) { | ||||||
|  | 	hex.Encode(dst, uuid[:4]) | ||||||
|  | 	dst[8] = '-' | ||||||
|  | 	hex.Encode(dst[9:13], uuid[4:6]) | ||||||
|  | 	dst[13] = '-' | ||||||
|  | 	hex.Encode(dst[14:18], uuid[6:8]) | ||||||
|  | 	dst[18] = '-' | ||||||
|  | 	hex.Encode(dst[19:23], uuid[8:10]) | ||||||
|  | 	dst[23] = '-' | ||||||
|  | 	hex.Encode(dst[24:], uuid[10:]) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Variant returns the variant encoded in uuid. | ||||||
|  | func (uuid UUID) Variant() Variant { | ||||||
|  | 	switch { | ||||||
|  | 	case (uuid[8] & 0xc0) == 0x80: | ||||||
|  | 		return RFC4122 | ||||||
|  | 	case (uuid[8] & 0xe0) == 0xc0: | ||||||
|  | 		return Microsoft | ||||||
|  | 	case (uuid[8] & 0xe0) == 0xe0: | ||||||
|  | 		return Future | ||||||
|  | 	default: | ||||||
|  | 		return Reserved | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Version returns the version of uuid. | ||||||
|  | func (uuid UUID) Version() Version { | ||||||
|  | 	return Version(uuid[6] >> 4) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (v Version) String() string { | ||||||
|  | 	if v > 15 { | ||||||
|  | 		return fmt.Sprintf("BAD_VERSION_%d", v) | ||||||
|  | 	} | ||||||
|  | 	return fmt.Sprintf("VERSION_%d", v) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (v Variant) String() string { | ||||||
|  | 	switch v { | ||||||
|  | 	case RFC4122: | ||||||
|  | 		return "RFC4122" | ||||||
|  | 	case Reserved: | ||||||
|  | 		return "Reserved" | ||||||
|  | 	case Microsoft: | ||||||
|  | 		return "Microsoft" | ||||||
|  | 	case Future: | ||||||
|  | 		return "Future" | ||||||
|  | 	case Invalid: | ||||||
|  | 		return "Invalid" | ||||||
|  | 	} | ||||||
|  | 	return fmt.Sprintf("BadVariant%d", int(v)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SetRand sets the random number generator to r, which implements io.Reader. | ||||||
|  | // If r.Read returns an error when the package requests random data then | ||||||
|  | // a panic will be issued. | ||||||
|  | // | ||||||
|  | // Calling SetRand with nil sets the random number generator to the default | ||||||
|  | // generator. | ||||||
|  | func SetRand(r io.Reader) { | ||||||
|  | 	if r == nil { | ||||||
|  | 		rander = rand.Reader | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	rander = r | ||||||
|  | } | ||||||
							
								
								
									
										44
									
								
								vendor/github.com/google/uuid/version1.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								vendor/github.com/google/uuid/version1.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,44 @@ | |||||||
|  | // Copyright 2016 Google Inc.  All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | package uuid | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"encoding/binary" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // NewUUID returns a Version 1 UUID based on the current NodeID and clock | ||||||
|  | // sequence, and the current time.  If the NodeID has not been set by SetNodeID | ||||||
|  | // or SetNodeInterface then it will be set automatically.  If the NodeID cannot | ||||||
|  | // be set NewUUID returns nil.  If clock sequence has not been set by | ||||||
|  | // SetClockSequence then it will be set automatically.  If GetTime fails to | ||||||
|  | // return the current NewUUID returns nil and an error. | ||||||
|  | // | ||||||
|  | // In most cases, New should be used. | ||||||
|  | func NewUUID() (UUID, error) { | ||||||
|  | 	nodeMu.Lock() | ||||||
|  | 	if nodeID == zeroID { | ||||||
|  | 		setNodeInterface("") | ||||||
|  | 	} | ||||||
|  | 	nodeMu.Unlock() | ||||||
|  | 
 | ||||||
|  | 	var uuid UUID | ||||||
|  | 	now, seq, err := GetTime() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return uuid, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	timeLow := uint32(now & 0xffffffff) | ||||||
|  | 	timeMid := uint16((now >> 32) & 0xffff) | ||||||
|  | 	timeHi := uint16((now >> 48) & 0x0fff) | ||||||
|  | 	timeHi |= 0x1000 // Version 1 | ||||||
|  | 
 | ||||||
|  | 	binary.BigEndian.PutUint32(uuid[0:], timeLow) | ||||||
|  | 	binary.BigEndian.PutUint16(uuid[4:], timeMid) | ||||||
|  | 	binary.BigEndian.PutUint16(uuid[6:], timeHi) | ||||||
|  | 	binary.BigEndian.PutUint16(uuid[8:], seq) | ||||||
|  | 	copy(uuid[10:], nodeID[:]) | ||||||
|  | 
 | ||||||
|  | 	return uuid, nil | ||||||
|  | } | ||||||
							
								
								
									
										38
									
								
								vendor/github.com/google/uuid/version4.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								vendor/github.com/google/uuid/version4.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | |||||||
|  | // Copyright 2016 Google Inc.  All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | package uuid | ||||||
|  | 
 | ||||||
|  | import "io" | ||||||
|  | 
 | ||||||
|  | // New creates a new random UUID or panics.  New is equivalent to | ||||||
|  | // the expression | ||||||
|  | // | ||||||
|  | //    uuid.Must(uuid.NewRandom()) | ||||||
|  | func New() UUID { | ||||||
|  | 	return Must(NewRandom()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewRandom returns a Random (Version 4) UUID. | ||||||
|  | // | ||||||
|  | // The strength of the UUIDs is based on the strength of the crypto/rand | ||||||
|  | // package. | ||||||
|  | // | ||||||
|  | // A note about uniqueness derived from the UUID Wikipedia entry: | ||||||
|  | // | ||||||
|  | //  Randomly generated UUIDs have 122 random bits.  One's annual risk of being | ||||||
|  | //  hit by a meteorite is estimated to be one chance in 17 billion, that | ||||||
|  | //  means the probability is about 0.00000000006 (6 × 10−11), | ||||||
|  | //  equivalent to the odds of creating a few tens of trillions of UUIDs in a | ||||||
|  | //  year and having one duplicate. | ||||||
|  | func NewRandom() (UUID, error) { | ||||||
|  | 	var uuid UUID | ||||||
|  | 	_, err := io.ReadFull(rander, uuid[:]) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return Nil, err | ||||||
|  | 	} | ||||||
|  | 	uuid[6] = (uuid[6] & 0x0f) | 0x40 // Version 4 | ||||||
|  | 	uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10 | ||||||
|  | 	return uuid, nil | ||||||
|  | } | ||||||
							
								
								
									
										2
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							| @ -4,6 +4,8 @@ git.rootprojects.org/root/keypairs/keyfetch | |||||||
| git.rootprojects.org/root/keypairs/keyfetch/uncached | git.rootprojects.org/root/keypairs/keyfetch/uncached | ||||||
| # github.com/go-chi/chi v4.0.0+incompatible | # github.com/go-chi/chi v4.0.0+incompatible | ||||||
| github.com/go-chi/chi | github.com/go-chi/chi | ||||||
|  | # github.com/google/uuid v1.1.1 | ||||||
|  | github.com/google/uuid | ||||||
| # github.com/joho/godotenv v1.3.0 | # github.com/joho/godotenv v1.3.0 | ||||||
| github.com/joho/godotenv | github.com/joho/godotenv | ||||||
| github.com/joho/godotenv/autoload | github.com/joho/godotenv/autoload | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user