72 lines
1.7 KiB
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)
|
|
}
|