48 lines
1 KiB
Go
48 lines
1 KiB
Go
package types
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"crypto/rand"
|
|
"fmt"
|
|
"io"
|
|
"strings"
|
|
)
|
|
|
|
// standard characters allowed in token string.
|
|
var chars = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
|
|
|
|
// default token length
|
|
var length = 40
|
|
|
|
// GenerateToken generates random strings good for use in URIs to
|
|
// identify unique objects.
|
|
func GenerateToken() string {
|
|
b := make([]byte, length)
|
|
r := make([]byte, length+(length/4)) // storage for random bytes.
|
|
clen := byte(len(chars))
|
|
maxrb := byte(256 - (256 % len(chars)))
|
|
i := 0
|
|
for {
|
|
io.ReadFull(rand.Reader, r)
|
|
for _, c := range r {
|
|
if c >= maxrb {
|
|
// Skip this number to avoid modulo bias.
|
|
continue
|
|
}
|
|
b[i] = chars[c%clen]
|
|
i++
|
|
if i == length {
|
|
return string(b)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// helper function to create a Gravatar Hash
|
|
// for the given Email address.
|
|
func CreateGravatar(email string) string {
|
|
email = strings.ToLower(strings.TrimSpace(email))
|
|
hash := md5.New()
|
|
hash.Write([]byte(email))
|
|
return fmt.Sprintf("%x", hash.Sum(nil))
|
|
}
|