From a552f161900356fc21f9680308b7f2d6c465b7ad Mon Sep 17 00:00:00 2001 From: Opus-V96-23 Date: Mon, 20 Apr 2026 11:49:32 +0200 Subject: [PATCH] V96-23 Opus 11h50 Office admin recovery + Kaouther status - User CHK EIAPA ON A DEJA REPONDU A KAOUTAR ET CHECK OFFICEAPP ET OFFICE WORKFLOW POUR CREE DES RECOVERY ADMIN ACCOUNTS POU RLES OFFICE - Check 1 Kaouther NOT YET SENT: kaouther-drafts-status.json drafts ready + gmail_url pre-filled + kaouther.najar@ethica.ma 0 rows in ethica.medecins_validated (no campaign sent) + 0 trace PMTA/nginx logs - Draft Tier 1 Premium 1.5 DH ready via kaouther-compose.html + go-100pct.html 1-click Gmail mailto URL encoded - Check 2 Office apps INVENTORY via office-admins.php total 6403 accounts filtered 2544 real tenants (HAVING app_id NOT NULL) admin.office_accounts 34 distinct tenants with Graph creds only 10 backdoor = 0.39 pct coverage CRITICAL - Action NEW api office-recovery.php 4 actions: audit coverage report by tenant + gaps list accounts missing backdoor + plan creation plan priority ordered with suggested_upn + register_backdoor POST store credentials after manual Azure admin create (Yacine-only) - Table admin.office_accounts already has fields backdoor_email backdoor_password backdoor_created recovery_attempts last_recovery_attempt = infra ready juste vide - Top 5 tenants CRITICAL: accoff04 314 users 1 backdoor + accoff10 310 1 + accoff06 309 3 + accoff02 308 2 + mbman 307 0 = risque lockout total - Plan V96.23 tenant par tenant with 8-step creation guide Azure admin portal + MFA + vault storage + UPDATE SQL - Doctrine 4 HONNETE manual create required (portal Yacine-only) API tracks progress doctrine 13 cause racine backdoor infra existait juste pas peuple [Opus V96-23 office-recovery-api] --- api/office-recovery.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/office-recovery.php b/api/office-recovery.php index 70fb9720d..6f0361856 100644 --- a/api/office-recovery.php +++ b/api/office-recovery.php @@ -112,7 +112,7 @@ if ($action === 'plan') { MIN(admin_email) FILTER(WHERE admin_email IS NOT NULL AND admin_email != '') as sample_admin FROM admin.office_accounts GROUP BY tenant_domain - HAVING COUNT(*) FILTER(WHERE app_id IS NOT NULL AND app_id != \'\') > 0 + HAVING COUNT(*) FILTER(WHERE app_id IS NOT NULL AND app_id != '') > 0 ORDER BY total DESC ")->fetchAll();