From 80d080e2d634292bf295e366a88b607c18443b06 Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Tue, 7 Jul 2026 22:58:47 +0300 Subject: [PATCH] docs: documenteaza sub-proiectul oauth2/ in CLAUDE.md Adauga sectiune despre index.php, pick.php, tokens/, php.ini si tests/run_tests.php (ce face si cum se ruleaza). Co-Authored-By: Claude Sonnet 5 --- CLAUDE.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index 2aaa572..8cb321a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -34,6 +34,23 @@ Directorul `efactura-generator/` din acest repo este o **oglindă** a proiectulu `config.json` de pe server (`~/public_html/efactura-generator/config.json`) conține `api_key` și nu e nici în repo, nici în sync — se gestionează manual pe a2hosting. +## Sub-proiectul `oauth2/` + +Flux OAuth2 ANAF eFactura (obținere access/refresh token) folosit de aplicația desktop ROA/ROACONT. Deployat pe `https://romfast.ro/oauth2/`. + +- **`index.php`** — endpoint principal, trei ramuri: + 1. **Refresh token** (`refresh_token` primit prin `$_POST` sau `$_GET`) → passthrough curl către ANAF, întoarce JSON brut (folosit de butonul "Actualizare" din ROA). + 2. **Intrare inițială** (fără `?code`) → redirect 302 către ANAF authorize. Dacă vine cu `?state=<64 hex>` salvează state-ul în sesiunea PHP (flux automat, legat de `pick.php`); fără `state` = flux manual/retro-compat (tokenurile apar direct în pagină). + 3. **Callback ANAF** (`?code=...` sau `?error=...`) → schimb code→token; dacă există state valid în sesiune scrie fișier în `tokens/.json` (succes sau eroare) și afișează doar o pagină de confirmare; altfel (retro-compat) afișează access/refresh token direct în HTML. +- **`pick.php`** — endpoint de polling apelat de ROA cu `POST state=<64 hex>`. Răspunde `{"status":"pending"}` până apare fișierul de token, apoi îl livrează o singură dată (claim atomic prin `rename`) și îl șterge. TTL 600s pentru fișiere orfane/`.tmp`. +- **`tokens/`** — director de stocare temporară token/eroare, cheie = SHA-256(state). Protejat cu `.htaccess` (`Require all denied`); creat automat de `index.php`/`pick.php` dacă lipsește. Nu se commite conținutul (fișiere efemere, curățate de TTL). +- **`php.ini`** — config logging erori local pentru acest subdirector (`error_log = /oauth2/error_log.txt`). +- **`tests/run_tests.php`** — suită de teste self-contained (fără framework extern), acoperă `index.php` + `pick.php`. Rulare: + ```bash + php oauth2/tests/run_tests.php + ``` + Ce face: copiază `index.php`/`pick.php` într-un director temporar (nu atinge `tokens/` din repo), pornește `php -S 127.0.0.1:8317` pe copie cu `session.save_path` propriu, rulează matricea de teste prin cereri HTTP reale (fără dependențe externe), oprește serverul și curăță totul la final (`register_shutdown_function`). Exit code 0 = toate testele au trecut; ieșirea arată `OK`/`FAIL` per test plus un rezumat `N trecute, M eșuate`. Notă: testele de refresh declanșează un apel curl real către `logincert.anaf.ro` cu un refresh_token fictiv (ANAF răspunde `invalid_grant`) — asercțiunile (nu e 302, `Content-Type` JSON) rămân valabile și offline. + ## Development No build process. Serve locally with: @@ -85,6 +102,7 @@ The navbar HTML is **manually duplicated** across every page (no templating). Wh - `/menu/` — company pages (about, contact, support, services, jobs, references) - `/roa/` — ROA ERP product pages (one per module) - `/efactura-generator/` — standalone Romanian e-invoice editor (loads XML, edits, prints, exports XML) +- `/oauth2/` — ANAF eFactura OAuth2 token flow for the ROA desktop app (see "Sub-proiectul `oauth2/`" above) ### efactura-generator