Files
keenetic-dns-routes/app/rci_url.py

42 lines
1.5 KiB
Python

"""Разбор RCI base URL: отдельно host:port и учётные данные из user:pass@."""
from __future__ import annotations
from urllib.parse import unquote, urlparse
def parse_rci_url(url: str) -> tuple[str, str, str]:
"""
Возвращает (чистый base без userinfo, логин из URL или "", пароль из URL или "").
Поддерживает http(s)://user:pass@host:port/...
"""
u = (url or "").strip().rstrip("/")
if not u:
return "", "", ""
p = urlparse(u.replace(" ", ""))
scheme = (p.scheme or "http").lower()
if scheme not in ("http", "https"):
scheme = "http"
user = unquote(p.username) if p.username else ""
pw = unquote(p.password) if p.password else ""
host = p.hostname
if not host:
return "", user, pw
port = p.port
netloc = f"{host}:{port}" if port else host
base = f"{scheme}://{netloc}"
return base, user, pw
def sanitize_router_dict(r: dict) -> dict:
"""Убирает user:pass из rci_base_url и при необходимости переносит в keenetic_*."""
out = dict(r)
raw = str(out.get("rci_base_url") or "")
base, u_url, p_url = parse_rci_url(raw)
if base:
out["rci_base_url"] = base
if not (out.get("keenetic_login") or "").strip() and u_url:
out["keenetic_login"] = u_url
if not (out.get("keenetic_password") or "").strip() and p_url:
out["keenetic_password"] = p_url
return out