dndex/server/auth/generate.go

72 lines
1.7 KiB
Go

package auth
import (
"context"
"local/dndex/storage"
"local/dndex/storage/entity"
"net/http"
"github.com/google/uuid"
)
func GeneratePlain(g storage.RateLimitedGraph, r *http.Request) (string, error) {
token, _, err := generateToken(g, r)
if err != nil {
return "", err
}
return token.Obfuscate()
}
func Generate(g storage.RateLimitedGraph, r *http.Request, salt string) (string, error) {
token, key, err := generateToken(g, r)
if err != nil {
return "", err
}
return token.Encode(salt + key)
}
func generateToken(g storage.RateLimitedGraph, r *http.Request) (Token, string, error) {
namespaceRequested := readRequestedNamespace(r)
key, err := getKeyForNamespace(r.Context(), g, namespaceRequested)
if err != nil {
return Token{}, "", err
}
token, err := makeTokenForNamespace(r.Context(), g, namespaceRequested)
if err != nil {
return Token{}, "", err
}
return token, key, nil
}
func readRequestedNamespace(r *http.Request) string {
return readRequested(r, UserKey)
}
func readRequested(r *http.Request, key string) string {
return r.FormValue(key)
}
func getKeyForNamespace(ctx context.Context, g storage.RateLimitedGraph, namespace string) (string, error) {
namespaceOne, err := g.Get(ctx, namespace, UserKey)
if err != nil {
return "", err
}
return namespaceOne.Title, nil
}
func makeTokenForNamespace(ctx context.Context, g storage.RateLimitedGraph, namespace string) (Token, error) {
token := Token{
Namespace: namespace,
Token: uuid.New().String(),
}
obf, err := token.Obfuscate()
if err != nil {
return Token{}, err
}
one := entity.One{
ID: token.Token,
Title: obf,
}
return token, g.Insert(ctx, namespace+"."+AuthKey, one)
}