## Copyright © 2026 Olaf Kolkman ## SPDX-License-Identifier: GPL-3.0-or-later from datetime import datetime, timedelta, timezone from hashlib import sha256 from backend.app.core.config import settings def hash_token(token: str) -> str: return sha256(token.encode('utf-8')).hexdigest() def token_expires_at() -> datetime: return datetime.now(timezone.utc) + timedelta(days=settings.token_expiry_days) def clean_url(url: str) -> str: from urllib.parse import parse_qsl, urlsplit, urlunsplit parts = urlsplit(url) if not parts.query: return url params = parse_qsl(parts.query, keep_blank_values=True) filtered = [(k, v) for k, v in params if k not in settings.tracking_params] new_query = '&'.join(f'{k}={v}' if v != '' else k for k, v in filtered) return urlunsplit((parts.scheme, parts.netloc, parts.path, new_query, parts.fragment))