account system and syslogs
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
/**
|
||||
* Best-effort device / browser label from a User-Agent string.
|
||||
* Not for security decisions — display and audit only.
|
||||
*/
|
||||
export function parseDeviceFromUserAgent(
|
||||
userAgent: string | null | undefined,
|
||||
): { device: string; userAgent: string | null } {
|
||||
const ua = userAgent?.trim() || null;
|
||||
if (!ua) {
|
||||
return { device: "Unknown device", userAgent: null };
|
||||
}
|
||||
|
||||
const os =
|
||||
/Windows NT/i.test(ua)
|
||||
? "Windows"
|
||||
: /Android/i.test(ua)
|
||||
? "Android"
|
||||
: /iPhone|iPad|iPod/i.test(ua)
|
||||
? "iOS"
|
||||
: /Mac OS X|Macintosh/i.test(ua)
|
||||
? "macOS"
|
||||
: /CrOS/i.test(ua)
|
||||
? "Chrome OS"
|
||||
: /Linux/i.test(ua)
|
||||
? "Linux"
|
||||
: null;
|
||||
|
||||
const browser =
|
||||
/Edg\//i.test(ua)
|
||||
? "Edge"
|
||||
: /OPR\/|Opera/i.test(ua)
|
||||
? "Opera"
|
||||
: /Firefox\//i.test(ua)
|
||||
? "Firefox"
|
||||
: /Chrome\//i.test(ua) && !/Edg\//i.test(ua)
|
||||
? "Chrome"
|
||||
: /Safari\//i.test(ua) && !/Chrome\//i.test(ua)
|
||||
? "Safari"
|
||||
: /curl\//i.test(ua)
|
||||
? "curl"
|
||||
: null;
|
||||
|
||||
const formFactor = /Mobile|Android.*Mobile|iPhone|iPod/i.test(ua)
|
||||
? "Mobile"
|
||||
: /iPad|Tablet|Android(?!.*Mobile)/i.test(ua)
|
||||
? "Tablet"
|
||||
: "Desktop";
|
||||
|
||||
const parts = [formFactor, os, browser].filter(Boolean);
|
||||
return {
|
||||
device: parts.length > 0 ? parts.join(" · ") : "Unknown device",
|
||||
userAgent: ua.slice(0, 512),
|
||||
};
|
||||
}
|
||||
|
||||
export function getRequestUserAgent(request: Request): string | null {
|
||||
const ua = request.headers.get("user-agent")?.trim();
|
||||
return ua || null;
|
||||
}
|
||||
Reference in New Issue
Block a user