diff --git a/app/web/routes.py b/app/web/routes.py index 7bacf7f..a11295f 100644 --- a/app/web/routes.py +++ b/app/web/routes.py @@ -90,6 +90,7 @@ from ..mapping import ( ) from ..shared_store import record_human_validation from ..rar_env import MediuIndisponibil, medii_disponibile_cont, rar_env_efectiv_cont, rezolva_rar_env +from ..rar_client import RarAuthError, RarClient, RarError, base_url_pentru_env # Campuri canonice cu eticheta umana pentru dropdown mapare coloane _CANONICAL_FIELDS = [(k, v[0]) for k, v in _CANONICAL_SYNONYMS.items()] @@ -4034,6 +4035,66 @@ async def web_confirma_import( # care cere cheie API; sesiunea web e suficienta ca identitate). # # =========================================================================== # +# --------------------------------------------------------------------------- +# US-007 (PRD 5.20): Validare credentiale RAR env-aware +# +# Premisa confirmata live (2026-06-29): creds de productie NU se valideaza pe RAR +# test si invers (401 incrucisat). Deci login-ul de proba TREBUIE sa loveasca +# endpoint-ul mediului caruia ii apartin credentialele. +# +# Puncte de validare existente: +# - /cont/test-rar-creds (testeaza integrarea RAR, fara efecte secundare) +# Puncte non-aplicabile (nu colecteaza/valideaza creds RAR): +# - signup (/signup): nu colecteaza credentiale RAR — creare cont platforma, nu RAR +# - preview import: nu valideaza credentiale RAR +# Puncte viitoare (US-008): +# - /cont/rar-creds la salvare creds per-mediu (va apela _valideaza_login_rar) +# --------------------------------------------------------------------------- + + +def _eticheta_mediu_rar(env: str) -> str: + """Eticheta umana a mediului RAR pentru mesaje de eroare/succes. + + 'test' -> 'TESTARE', 'prod' -> 'PRODUCTIE'. + """ + return "PRODUCTIE" if env == "prod" else "TESTARE" + + +def _valideaza_login_rar( + settings, + email: str, + password: str, + env: str, +) -> tuple[bool, str | None]: + """Valideaza credentialele RAR prin login pe mediul specificat (US-007, PRD 5.20). + + Creeaza un RarClient cu base_url-ul mediului `env` (NU base_url-ul global), + deoarece RAR test si RAR prod sunt sisteme separate cu credentiale separate. + + Parametri + --------- + settings: configuratia aplicatiei (pentru base_url_test/prod si timeout) + email: email-ul contului RAR + password: parola contului RAR + env: mediul tinta: 'test' sau 'prod' + + Returneaza + ---------- + (True, None) la succes (login reusit) + (False, mesaj) la esec; `mesaj` include eticheta mediului ('TESTARE'/'PRODUCTIE'), + ex. 'Credentiale RAR invalide pe TESTARE.' + """ + env_label = _eticheta_mediu_rar(env) + try: + with RarClient(settings, base_url=base_url_pentru_env(settings, env)) as rar: + rar.login(email, password) + return True, None + except RarAuthError: + return False, f"Credentiale RAR invalide pe {env_label}." + except RarError as exc: + return False, f"Eroare la conectare RAR ({env_label}): {exc}" + + def _render_cont( request: Request, *, @@ -4365,3 +4426,61 @@ def cont_rar_creds( ) finally: conn.close() + + +@router.post("/cont/test-rar-creds", response_class=HTMLResponse) +def cont_test_rar_creds( + request: Request, + rar_email: str = Form(""), + rar_parola: str = Form(""), + rar_env: str = Form(default=""), + csrf_token: str | None = Form(None), +) -> HTMLResponse: + """Testeaza credentialele RAR prin login real pe mediul specificat (US-007, PRD 5.20). + + Fara efecte secundare: nu salveaza nimic, nu creeaza submission. Pur validare. + Camp parola NICIODATA re-pus in raspuns. + + Decizie env (documentata US-007): + - param `rar_env` explicit ('test'/'prod') -> folosit direct + - altfel -> rar_env_efectiv_cont (default-ul contului) sau ancora globala settings.rar_env + - signup nu colecteaza creds RAR, deci nu apeleaza aceasta functie + """ + account_id = require_login(request) + verify_csrf(request, csrf_token) + + email = rar_email.strip() + parola = rar_parola.strip() + + if not email or not parola: + return templates.TemplateResponse( + "_integrare_test_rezultat.html", + {"request": request, "succes": False, + "mesaj": "Email si parola sunt obligatorii."}, + ) + + # Determina env-ul de validare + settings = get_settings() + env_cerut = (rar_env or "").strip().lower() + if env_cerut in ("test", "prod"): + env = env_cerut + else: + # Fallback: env-ul efectiv al contului (default) sau ancora globala + conn = get_connection() + try: + env = rar_env_efectiv_cont(conn, account_id) or settings.rar_env or "test" + finally: + conn.close() + + ok, mesaj_eroare = _valideaza_login_rar(settings, email, parola, env) + if ok: + env_label = _eticheta_mediu_rar(env) + return templates.TemplateResponse( + "_integrare_test_rezultat.html", + {"request": request, "succes": True, + "mesaj": f"Credentiale RAR valide pe {env_label}."}, + ) + return templates.TemplateResponse( + "_integrare_test_rezultat.html", + {"request": request, "succes": False, "mesaj": mesaj_eroare}, + ) diff --git a/app/web/templates/_integrare.html b/app/web/templates/_integrare.html index 488f905..f4f2c43 100644 --- a/app/web/templates/_integrare.html +++ b/app/web/templates/_integrare.html @@ -226,7 +226,7 @@ - {# Formular test conexiune #} + {# Formular test conexiune cheie API #}
+ Verifica daca credentialele RAR sunt corecte pe mediul ales. Nu se salveaza nimic. +
+ + +