Replace ua-parser wrapper with uarite uaparse

This commit is contained in:
2026-09-09 19:22:59 +00:00
parent 97ce10dd6f
commit 17abcc48c0
4 changed files with 6 additions and 36 deletions
+3 -4
View File
@@ -15,6 +15,7 @@ from uuid import UUID
import base64url
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from uarite import uaparse
from paskia import authcode, db, remoteauth
from paskia.authcode import CookieCode
@@ -23,7 +24,7 @@ from paskia.domains import current_domain, registry
from paskia.fastapi.session import AUTH_COOKIE, infodict
from paskia.fastapi.wschat import authenticate_and_login
from paskia.fastapi.wsutil import validate_origin, websocket_error_handler
from paskia.util import pow, useragent
from paskia.util import pow
# Create a FastAPI subapp for remote auth WebSocket endpoints
app = FastAPI(docs_url=None, redoc_url=None, openapi_url=None)
@@ -458,9 +459,7 @@ async def websocket_remote_auth_permit(ws: WebSocket, auth=AUTH_COOKIE):
if requesting_domain
else request.rp_id
),
"user_agent_pretty": useragent.compact_user_agent(
request.user_agent
),
"user_agent_pretty": uaparse(request.user_agent).pretty,
"client_ip": request.ip,
"action": request.action,
"pow": {
+2 -2
View File
@@ -11,10 +11,10 @@ from datetime import datetime
from uuid import UUID
import msgspec
from uarite import uaparse
from paskia import db
from paskia.db.structs import Credential, Org, OriginEntry, Permission, Role, User
from paskia.util import useragent
# -------------------------------------------------------------------------
# API structs - inherit from db structs, add uuid for serialization
@@ -124,7 +124,7 @@ class ApiUserSession(msgspec.Struct, omit_defaults=True):
credential_uuid=s.credential_uuid,
host=s.host,
ip=s.ip,
user_agent=useragent.compact_user_agent(s.user_agent),
user_agent=uaparse(s.user_agent).pretty,
validated=s.validated,
last_renewed=s.validated,
is_current=s.key == current_key,
-29
View File
@@ -1,29 +0,0 @@
from ua_parser import parse
def compact_user_agent(ua: str | None) -> str:
"""Format user agent string into a compact display format.
Returns empty string for empty/missing user agents.
Returns original UA for unrecognized ones.
"""
if not ua or not ua.strip() or ua == "-":
return ""
r = parse(ua)
browser = r.user_agent.family if r.user_agent else None
ver = r.user_agent.major if r.user_agent else ""
os_name = r.os.family if r.os else None
dev = r.device.family if r.device else None
# If browser is unrecognized, return original UA
if browser in (None, "Other") and os_name in (None, "Other"):
return ua
# Filter out "Other" values
browser = browser if browser and browser != "Other" else ""
os_name = os_name if os_name and os_name != "Other" else ""
# Exclude device if it's "Other" or matches browser family (parser bug)
if dev in (None, "Other") or dev == browser:
dev = ""
# Build compact string, filtering empty parts
parts = [f"{browser}/{ver}" if browser else "", os_name, dev]
result = " ".join(p for p in parts if p).strip()
return result
+1 -1
View File
@@ -22,8 +22,8 @@ dependencies = [
"jsondiff>=2.2.1",
"msgspec>=0.20.0",
"fastapi-vue~=1.4.2",
"ua-parser[regex]>=1.0.1",
"kanta>=0.7.0",
"uarite>=0.2.1",
]
[dependency-groups]
dev = [