backend/internal/auth/ukey/ukey.go

52 lines
1 KiB
Go

package ukey
import (
"crypto/rand"
"math/big"
"github.com/cristalhq/base64"
"github.com/gin-gonic/gin"
"golang.org/x/crypto/blake2b"
"stereo.cat/backend/internal/auth"
"stereo.cat/backend/internal/types"
)
func GenerateUploadKey(cfg *types.StereoConfig, user *auth.User, c *gin.Context) []byte {
length := 32
chars := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789@#!&*%~?"
key := make([]byte, length)
for i := range length {
num, err := rand.Int(rand.Reader, big.NewInt(int64(len(chars))))
if err != nil {
types.ErrorInvalidParams.Throw(c, err)
return nil
}
key[i] = chars[num.Int64()]
}
hasher, err := blake2b.New512(nil)
if err != nil {
types.ErrorInvalidParams.Throw(c, err)
return nil
}
_, err = hasher.Write(key)
if err != nil {
types.ErrorInvalidParams.Throw(c, err)
return nil
}
hashed := base64.RawStdEncoding.EncodeToString(hasher.Sum(nil))
user.HashedApiKey = hashed
err = cfg.Database.Updates(user).Error
if err != nil {
types.ErrorDatabase.Throw(c, err)
return nil
}
return key
}