Files
UNITRONIX e855f5786d Add Go server and security audit; update web console
Add a new betterdesk-server Go codebase (server, api, auth, db, relay, signal, metrics, audit, ratelimit, proto, tools, tests) and related deployment/migration scripts. Add a comprehensive SECURITY_AUDIT_2026-03-01 report and .gitattributes; update copilot-instructions (ALL-IN-ONE v2.4.0), README, VERSION, Dockerfiles, scripts, docker-compose and entrypoint. Large updates to web-nodejs (translations, routes, services, frontend assets and middleware) and numerous new utilities; remove legacy Flask web files and archive hbbs-patch-v2 artifacts. Prepares repository for PostgreSQL support, DB migration tooling and the new Go server as the production backend.
2026-03-02 00:43:04 +01:00

75 lines
1.6 KiB
Go

package auth
import (
"strings"
"testing"
"time"
)
func TestJWTGenerateAndValidate(t *testing.T) {
mgr := NewJWTManager("test-secret-key-32bytes-minimum!", 1*time.Hour)
token, err := mgr.Generate("admin", "admin")
if err != nil {
t.Fatalf("Generate: %v", err)
}
parts := strings.SplitN(token, ".", 3)
if len(parts) != 3 {
t.Fatalf("Expected 3 parts, got %d", len(parts))
}
claims, err := mgr.Validate(token)
if err != nil {
t.Fatalf("Validate: %v", err)
}
if claims.Sub != "admin" {
t.Errorf("Expected sub=admin, got %q", claims.Sub)
}
if claims.Role != "admin" {
t.Errorf("Expected role=admin, got %q", claims.Role)
}
if claims.Jti == "" {
t.Error("Expected non-empty jti")
}
}
func TestJWTExpired(t *testing.T) {
mgr := NewJWTManager("test-secret", 0) // 0 expiry = already expired
token, _ := mgr.Generate("user", "viewer")
time.Sleep(2 * time.Second)
_, err := mgr.Validate(token)
if err != ErrTokenExpired {
t.Errorf("Expected ErrTokenExpired, got %v", err)
}
}
func TestJWTInvalidSignature(t *testing.T) {
mgr1 := NewJWTManager("secret-one", 1*time.Hour)
mgr2 := NewJWTManager("secret-two", 1*time.Hour)
token, _ := mgr1.Generate("user", "admin")
_, err := mgr2.Validate(token)
if err != ErrInvalidToken {
t.Errorf("Expected ErrInvalidToken, got %v", err)
}
}
func TestJWTMalformed(t *testing.T) {
mgr := NewJWTManager("secret", 1*time.Hour)
tests := []string{
"",
"one",
"one.two",
"one.two.three",
}
for _, tok := range tests {
_, err := mgr.Validate(tok)
if err == nil {
t.Errorf("Expected error for token %q", tok)
}
}
}