v0.12.0 migrate sqlite3 to psql18, updated auth, deploy docs, account and replay updates
test / test (push) Canceled after 0s

This commit is contained in:
lixen committed 2026-09-26 20:58:19 -04:00
1 parent 5d2be4abb2
commit d0326b059e
66 files changed
+4016 -2433

No files matched your search

+49
View File
@@ -0,0 +1,49 @@
package main
import (
"bytes"
"fmt"
"io"
"os"
)
const (
minJWTSecretLen = 32
maxJWTSecretLen = 4096
)
// loadJWTSecret reads a signing key file. The file must be a regular file
// readable only by its owner, like an SSH private key; trailing line endings
// are ignored so `openssl rand -base64 48 > file` works as-is.
func loadJWTSecret(path string) ([]byte, error) {
file, err := os.Open(path)
if err != nil {
return nil, fmt.Errorf("open JWT secret file: %w", err)
}
defer file.Close()
info, err := file.Stat()
if err != nil {
return nil, fmt.Errorf("stat JWT secret file: %w", err)
}
if !info.Mode().IsRegular() {
return nil, fmt.Errorf("JWT secret file %s is not a regular file", path)
}
if perm := info.Mode().Perm(); perm&0o077 != 0 {
return nil, fmt.Errorf("JWT secret file %s has mode %04o; it must not be accessible by group or others (chmod 600)",
path, perm)
}
data, err := io.ReadAll(io.LimitReader(file, maxJWTSecretLen+1))
if err != nil {
return nil, fmt.Errorf("read JWT secret file: %w", err)
}
if len(data) > maxJWTSecretLen {
return nil, fmt.Errorf("JWT secret file %s exceeds %d bytes", path, maxJWTSecretLen)
}
secret := bytes.TrimRight(data, "\r\n")
if len(secret) < minJWTSecretLen {
return nil, fmt.Errorf("JWT secret file %s must contain at least %d bytes", path, minJWTSecretLen)
}
return secret, nil
}