52 lines
1 KiB
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
|
|
}
|