58f11302fe
Track authenticated sessions per device (parsing user-agent for desktop vs mobile via mileusna/useragent), enforce configurable concurrent device limits (Auth.DeviceLimits), and surface device status and "remove other devices" management in the account dialog. Adds device/session context to the auth module stores and exposes limits through the API. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
63 lines
1.6 KiB
Go
63 lines
1.6 KiB
Go
package auth
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestDeviceSessionFromMetadata(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
metadata RequestMetadata
|
|
deviceType string
|
|
system string
|
|
browser string
|
|
client string
|
|
}{
|
|
{
|
|
name: "unknown desktop fallback",
|
|
metadata: RequestMetadata{},
|
|
deviceType: "desktop",
|
|
system: "unknown",
|
|
browser: "unknown",
|
|
client: "PC-WEB",
|
|
},
|
|
{
|
|
name: "desktop chrome",
|
|
metadata: RequestMetadata{
|
|
UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36",
|
|
Platform: `"Windows"`,
|
|
Mobile: "?0",
|
|
},
|
|
deviceType: "desktop",
|
|
system: "Windows",
|
|
browser: "Chrome 126",
|
|
client: "PC-WEB",
|
|
},
|
|
{
|
|
name: "mobile safari from client hints",
|
|
metadata: RequestMetadata{
|
|
UserAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X) AppleWebKit/605.1.15 Version/18.0 Mobile/15E148 Safari/604.1",
|
|
Platform: `"iOS"`,
|
|
Mobile: "?1",
|
|
},
|
|
deviceType: "mobile",
|
|
system: "iOS",
|
|
browser: "Safari 18",
|
|
client: "MOBILE-WEB",
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
session := deviceSessionFromMetadata(test.metadata)
|
|
if session.DeviceType != test.deviceType || session.System != test.system || session.Client != test.client {
|
|
t.Fatalf("unexpected device metadata %#v", session)
|
|
}
|
|
if !strings.HasPrefix(session.Browser, test.browser) {
|
|
t.Fatalf("expected browser %q, got %q", test.browser, session.Browser)
|
|
}
|
|
})
|
|
}
|
|
}
|