diff --git a/Contestation/Assure.php b/Contestation/Assure.php index 9f540ad..f74520e 100755 --- a/Contestation/Assure.php +++ b/Contestation/Assure.php @@ -89,11 +89,114 @@ class Assure extends Modelecontestation { $idDemande = $_SESSION['idDemande']; $sql = 'call sp_p_checkdemandereconnaissancefaciale_id(?, ?, ?, ?);'; - $resultat = $this->executerRequete($sql, array($codeSociete, $codePrestataire, $idBeneficiaire, $idDemande)); + $resultat = $this->executerRequeteAdin($sql, array($codeSociete, $codePrestataire, $idBeneficiaire, $idDemande)); $ligne = $resultat->fetch(PDO::FETCH_ASSOC); return $ligne; } + public function get_nbTentativeBiometrie($codeSociete) + { + $sql = 'select nbTentativeBiometrie FROM societeuser WHERE (codeSociete=?);'; + + $resultat = $this->executerRequeteAdin($sql, array($codeSociete))->fetch(PDO::FETCH_ASSOC); + + return $resultat['nbTentativeBiometrie']; + } + + public function get_parametres_societe($codeSociete) + { + $sql = 'select + dureeTokenReconnaissanceFaciale, + dossierPhoto, + nbTentativeBiometrie, + lienPhotoFace + FROM societeuser WHERE (codeSociete=?);'; + + $resultat = $this->executerRequeteAdin($sql, array($codeSociete))->fetch(PDO::FETCH_ASSOC); + + return $resultat; + } + + public function valider_token() + { + $codeSociete = $_SESSION['codeBdd']; + $codePrestataire = $_SESSION['codePrestataire']; + $idBeneficiaire = $_SESSION['idBeneficiaire']; + $idDemande = $_SESSION['idDemande']; + + $sql = 'call sp_p_demandereconnaissancefaciale_valide(?, ?, ?, ?);'; + $resultat = $this->executerRequeteAdin($sql, array($codeSociete, $codePrestataire, $idBeneficiaire, $idDemande)); + $ligne = $resultat->fetch(PDO::FETCH_ASSOC); + return $ligne; + } + + public function init_confirmerlaface($del) + { + $codePrestataire = $_SESSION['codePrestataire']; + $user = $_SESSION['login']; + $username = $_SESSION['numeroBeneficiaire']; + + $sql = 'call sp_init_confirmerlaface(?, ?, ?, ?);'; + $resultat = $this->executerRequete($sql, array($codePrestataire, $user, $username, $del)); + $ligne = $resultat->fetch(PDO::FETCH_ASSOC); + $_SESSION['idLogapiface'] = $ligne['idLogapiface']; + } + + public function init_reconnaitrelaface() + { + $codePrestataire = $_SESSION['codePrestataire']; + $user = $_SESSION['login']; + + $sql = 'call sp_init_reconnaitrelaface(?, ?);'; + $resultat = $this->executerRequete($sql, array($codePrestataire, $user)); + $ligne = $resultat->fetch(PDO::FETCH_ASSOC); + $_SESSION['idLogapiface'] = $ligne['idLogapiface']; + } + + public function succes_reconnaitrelaface($username, $resultat) + { + $idLogapiface = $_SESSION['idLogapiface']; + + $sql = 'call sp_succes_reconnaitrelaface(?, ?, ?);'; + $this->executerRequete($sql, array($idLogapiface, $username, $resultat)); + } + + public function echec_reconnaitrelaface($resultat) + { + $idLogapiface = $_SESSION['idLogapiface']; + + $sql = 'call sp_echec_reconnaitrelaface(?, ?);'; + $this->executerRequete($sql, array($idLogapiface, $resultat)); + } + + public function init_traiterlaface($codeActionFace) + { + $codePrestataire = $_SESSION['codePrestataire']; + $user = $_SESSION['login']; + $username = $_SESSION['numeroBeneficiaire']; + + $sql = 'call sp_init_traiterlaface(?, ?, ?, ?);'; + $resultat = $this->executerRequete($sql, array($codePrestataire, $user, $username, $codeActionFace)); + $ligne = $resultat->fetch(PDO::FETCH_ASSOC); + $_SESSION['idLogapiface'] = $ligne['idLogapiface']; + } + + public function resultat_traitement_face($username, $success, $message) + { + $idLogapiface = $_SESSION['idLogapiface']; + + $sql = 'CALL sp_resultat_traitement_face(?, ?, ?, ?);'; + + $this->executerRequete($sql, array($idLogapiface, $username, $success, $message)); + } + + public function maj_demandereconnaissancefaciale($codeEtat) + { + $idDemande = $_SESSION['idDemande']; + + $sql = 'call sp_p_maj_demandereconnaissancefaciale(?, ?, ?);'; + $this->executerRequete($sql, array($codeEtat, $_SERVER['REMOTE_ADDR'], $idDemande)); + } } diff --git a/Contestation/Demandereconnaissancefaciale.php b/Contestation/Demandereconnaissancefaciale.php index f35211e..a49d545 100755 --- a/Contestation/Demandereconnaissancefaciale.php +++ b/Contestation/Demandereconnaissancefaciale.php @@ -3,7 +3,7 @@ session_unset(); if (!isset($_GET['lg'])) { - afficherMessage("Paramètre langue absent de la requête!"); + afficherMessage("Paramètre langue absent de la requête!", "Erreur"); } $lg = $_GET['lg']; @@ -11,27 +11,27 @@ $tab_code_langue = ["fr_FR", "en_US"]; if (!in_array($codeLangue, $tab_code_langue)) { - afficherMessage("Langue inconnue!"); + afficherMessage("Langue inconnue!", "Erreur"); } if (!isset($_GET['codeEntite'])) { $msg = $codeLangue == 'en_US' ? "Entity parameter missing from query!" : "Paramètre entité absent de la requête!"; - afficherMessage($msg); + afficherMessage($msg, "Error"); } if (!isset($_GET['codePrestataire'])) { $msg = $codeLangue == 'en_US' ? "Provider parameter missing from query!" : "Paramètre prestataire absent de la requête!"; - afficherMessage($msg); + afficherMessage($msg, "Erreur"); } if (!isset($_GET['idBeneficiaire'])) { $msg = $codeLangue == 'en_US' ? "Insured ID missing from query!" : "ID assuré absent de la requête!"; - afficherMessage($msg); + afficherMessage($msg, "Erreur"); } if (!isset($_GET['idDemande'])) { $msg = $codeLangue == 'en_US' ? "Reqest ID missing from query!" : "ID demande absent de la requête!"; - afficherMessage($msg); + afficherMessage($msg, "Erreur"); } $_SESSION['codeLangue'] = $lg; @@ -47,28 +47,19 @@ $codeBdd = $codeSociete; + $_SESSION['idLogapiface'] = 0; + require_once "Assure.php"; $assure = new Assure(); + $_SESSION['assure'] = $assure; $_SESSION['codeBdd'] = $codeBdd; $bdd = $assure->geUneBd($codeBdd); - /* - var_dump( - array( - // "bdd" => $bdd, - "codeSociete" => $codeSociete, - "codePrestataire" => $codePrestataire, - "idBeneficiaire" => $idBeneficiaire, - ) - - ); - */ - if(!$bdd) { $message = $codeLangue == 'en_US' ? "Entity not found!" : "Entité introuvable!"; - afficherMessage("$message"); + afficherMessage("$message", "Erreur"); } $_SESSION['BdName'] = $bdd['BdName']; @@ -80,7 +71,7 @@ if(!$fassureExiste) { $message = $codeLangue == 'en_US' ? "Insured not found!" : "Assuré introuvable!"; - afficherMessage("$message"); + afficherMessage("$message", "Erreur"); } $demande = $assure->checkdemandereconnaissancefaciale_id(); @@ -101,83 +92,85 @@ $beneficiaire = $demande["beneficiaire"]; $prestataire = $demande["prestataire"]; - // var_dump($demande); - /* - idDemande - codePrestataire - idBeneficiaire - codeEtat - nbTentative - lienPhotoWebcam - dateExpiration - dateExpirationFr - dateExpirationEng - demandeExpiree - beneficiaire - prestataire - */ + $lienPhoto = $demande["lienPhoto"]; - /* - var_dump( - array( - // "bdd" => $bdd, - "idDemande" => $idDemande, - "codeEtat" => $codeEtat, - "demandeExpiree" => $demandeExpiree, - "etatDemande" => $etatDemande, - "etatDemandeEng" => $etatDemandeEng, + $attempts = $demande["attempts"]; + + $_SESSION['lienPhoto'] = $lienPhoto; - "beneficiaire" => $beneficiaire, - "prestataire" => $prestataire, - ) - - ); - */ + $_SESSION['numeroBeneficiaire'] = $demande["numeroBeneficiaire"]; + $_SESSION['login'] = $demande["numeroBeneficiaire"]; + $_SESSION['attempts'] = $attempts; /* codeEtat libelle + 6 Token déjà utilisé 3 Expiré 1 Vérifié 2 Echec 4 Erreur + 5 Trop de tentatives 0 En attente */ - if($codeEtat=="3" || $demandeExpiree=="1") { + if($codeEtat=="6") { + $message = $codeLangue == 'en_US' ? "Token already used!" : "Token déjà utilisé!"; + afficherMessage("$message", "Information"); + } + + if($codeEtat=="3" || $demandeExpiree=="1") { + // changer le status + $assure->maj_demandereconnaissancefaciale("3"); // Expirée + $message = $codeLangue == 'en_US' ? "Request expired since $dateExpirationEng !" : "Demande expirée depuis $dateExpirationFr !"; - afficherMessage("$message"); + afficherMessage("$message", "Erreur"); } - if($codeEtat=="1") { - $message = $codeLangue == 'en_US' ? "Verification already completed!" : "Vérification déjà exffectuée!"; - afficherMessage("$message"); + if($codeEtat=="1") { + $message = $codeLangue == 'en_US' ? "Verification already completed!" : "Vérification déjà effectuée!"; + afficherMessage("$message", "Information"); } - if($codeEtat=="2") { - $message = $codeLangue == 'en_US' ? "Failure, please try again!" : "Echec, veuilez réessayer!"; - afficherMessage("$message"); + $param_societe = $assure->get_parametres_societe($codeSociete); + + $_SESSION['dureeToken'] = $param_societe["dureeTokenReconnaissanceFaciale"]; + $_SESSION['dossierPhoto'] = $param_societe["dossierPhoto"]; + $_SESSION['nbTentative'] = $param_societe["nbTentativeBiometrie"]; + $_SESSION['lienPhotoFace'] = $param_societe["lienPhotoFace"]; + + $maxAttempts = $_SESSION['nbTentative']; + + if($attempts>=$maxAttempts) { + // changer le status + $assure->maj_demandereconnaissancefaciale("5"); // Trop de tentatives + + $message = $codeLangue == 'en_US' ? "Too many attempts!" : "Trop de tentatives!"; + afficherMessage("$message", "Erreur"); } - if($codeEtat=="4") { - $message = $codeLangue == 'en_US' ? "Error, please try again!" : "Erreur, veuilez réessayer!"; - afficherMessage("$message"); - } + // vérifier que la photo du bénéficiaire existe + if ($_SESSION['lienPhoto']>" ") + { + $photo = $_SESSION['lienPhotoFace'].$_SESSION['lienPhoto']; + if(!file_exists($photo)) + { + $_SESSION['lienPhoto'] = ""; + } + else + { + $_SESSION['photoAssureCrypte'] = decryptImage($photo); + } + } - /* - $message = $codeLangue == 'en_US' - ? "Parameters successfully verified!" - : "Paramètres vérifiés avec succès!"; - afficherMessage("$message", false); - */ } - function afficherMessage($message) { + function afficherMessage($message, $titre) { echo " - Erreur + $titre @@ -459,13 +485,20 @@

🏥 INTER-SANTÉ

Vérification d'identité sécurisée

+ +

Prestataire :

+ +

Patient :

+ +

Compteur :

+
-

Vérification du lien...

+

Demande Vérification du lien...

@@ -533,6 +566,8 @@
+ + - - - - \ No newline at end of file diff --git a/Contestation/Demandereconnaissancefacialeia.php b/Contestation/Demandereconnaissancefacialeia.php deleted file mode 100755 index 7961815..0000000 --- a/Contestation/Demandereconnaissancefacialeia.php +++ /dev/null @@ -1,673 +0,0 @@ -geUneBd($codeBdd); - - /* - var_dump( - array( - // "bdd" => $bdd, - "codeSociete" => $codeSociete, - "codePrestataire" => $codePrestataire, - "idBeneficiaire" => $idBeneficiaire, - ) - - ); - */ - - if(!$bdd) { - $message = $codeLangue == 'en_US' ? "Entity not found!" : "Entité introuvable!"; - afficherMessage("$message"); - } - - $_SESSION['BdName'] = $bdd['BdName']; - $_SESSION['BdLogin'] = $bdd['BdLogin']; - $_SESSION['BdMdp'] = $bdd['BdMdp']; - - if($assure->existeligne($codeSociete)) { - $fassureExiste = $assure->assureExiste($codeSociete, $idBeneficiaire); - - if(!$fassureExiste) { - $message = $codeLangue == 'en_US' ? "Insured not found!" : "Assuré introuvable!"; - afficherMessage("$message"); - } - - $demandereconnaissancefaciale = $assure->checkdemandereconnaissancefaciale(); - - var_dump($demandereconnaissancefaciale); - - /* - if(!$feuilleMaladieEncours) { - $message = $codeLangue == 'en_US' ? "Deadline for appeal has passed!" : "Delai de contestation dépassé!"; - afficherMessage("$message"); - } - - $feuilleDejaContestee = $validercontestation->feuilleContestee($codeSociete, $idAdherent, $numeroFeuilleMaladie); - - if($feuilleDejaContestee) { - $message = $codeLangue == 'en_US' ? "File already contested!" : "Dossier déjà contesté!"; - afficherMessage("$message"); - } - - $validercontestation->contester($codeSociete, $idAdherent, $numeroFeuilleMaladie, $motifContestation); - */ - - $message = $codeLangue == 'en_US' - ? "Parameters successfully verified!" - : "Paramètres vérifiés avec succès!"; - afficherMessage("$message", false); - } - - function afficherMessage($message) { - echo " - - - - - Erreur - - - - - -
-
-
- -
-

Erreur

-

{$message}

-
-
- - "; - exit(); - } - -?> - - - - - - - INTER-SANTÉ - Vérification d'identité - - - -
-
-

🏥 INTER-SANTÉ

-

Vérification d'identité sécurisée

-
- -
- -
-
-

Vérification du lien...

-
- - -
-
-

Instructions pour la vérification

-
    -
  • Positionnez votre visage dans l'ovale
  • -
  • Assurez-vous d'être dans un endroit bien éclairé
  • -
  • Regardez directement la caméra
  • -
  • Restez immobile lors de la capture
  • -
  • Retirez lunettes de soleil, casquette ou masque
  • -
-
- -
- - -
-
- - -
-
-
- Positionnez votre visage dans l'ovale -
- -
- - -
-

Confirmez votre photo

- Votre photo - - -
- - -
-
-

- Vérification de votre identité en cours...
- Merci de patienter -

-
- - -
-
-
-

-

-
-
-
- - -
-
-

❌ Erreur

-

-
-
-
-
- - - - diff --git a/Contestation/check_verification_status.php b/Contestation/check_verification_status.php deleted file mode 100644 index 78bd991..0000000 --- a/Contestation/check_verification_status.php +++ /dev/null @@ -1,58 +0,0 @@ - false, - 'message' => 'ID de requête manquant' - ]); - exit; -} - -$db = new Database(); -$conn = $db->getConnection(); - -// Récupérer le statut de la vérification -$sql = "SELECT vr.*, pas.session_token - FROM facial_verification_requests vr - LEFT JOIN prestation_authorization_sessions pas - ON vr.id = pas.verification_request_id - AND pas.status = 'active' - WHERE vr.id = ?"; - -$stmt = $conn->prepare($sql); -$stmt->execute([$requestId]); -$request = $stmt->fetch(PDO::FETCH_ASSOC); - -if (!$request) { - echo json_encode([ - 'success' => false, - 'message' => 'Requête non trouvée' - ]); - exit; -} - -// Calculer le temps restant -$now = new DateTime(); -$expiresAt = new DateTime($request['expires_at']); -$interval = $now->diff($expiresAt); -$secondsRemaining = ($expiresAt->getTimestamp() - $now->getTimestamp()); - -echo json_encode([ - 'success' => true, - 'status' => $request['status'], - 'attempts' => $request['attempts'], - 'match_confidence' => $request['match_confidence'], - 'session_token' => $request['session_token'], - 'seconds_remaining' => max(0, $secondsRemaining), - 'verified_at' => $request['verified_at'] -]); diff --git a/Contestation/facial_verification.php b/Contestation/facial_verification.php deleted file mode 100644 index ca9effa..0000000 --- a/Contestation/facial_verification.php +++ /dev/null @@ -1,513 +0,0 @@ - - - - - - INTER-SANTÉ - Vérification d'identité - - - -
-
-

🏥 INTER-SANTÉ

-

Vérification d'identité sécurisée

-
- -
- -
-
-

Vérification du lien...

-
- - -
-
-

Instructions pour la vérification

-
    -
  • Positionnez votre visage dans l'ovale
  • -
  • Assurez-vous d'être dans un endroit bien éclairé
  • -
  • Regardez directement la caméra
  • -
  • Restez immobile lors de la capture
  • -
  • Retirez lunettes de soleil, casquette ou masque
  • -
-
- -
- - -
-
- - -
-
-
- Positionnez votre visage dans l'ovale -
- -
- - -
-

Confirmez votre photo

- Votre photo - - -
- - -
-
-

- Vérification de votre identité en cours...
- Merci de patienter -

-
- - -
-
-
-

-

-
-
-
- - -
-
-

❌ Erreur

-

-
-
-
-
- - - - diff --git a/Contestation/integration_example.php b/Contestation/integration_example.php deleted file mode 100644 index 0a82b30..0000000 --- a/Contestation/integration_example.php +++ /dev/null @@ -1,341 +0,0 @@ -getConnection(); - - $sql = "SELECT id, nom, prenoms, numero_carte, email, telephone, photo_reference_path - FROM assures - WHERE id = ? AND statut = 'actif'"; - - $stmt = $conn->prepare($sql); - $stmt->execute([$assureId]); - $assure = $stmt->fetch(PDO::FETCH_ASSOC); - - if (!$assure) { - return [ - 'success' => false, - 'message' => 'Assuré non trouvé ou inactif' - ]; - } - - // 3. Vérifier si une photo de référence existe - if (empty($assure['photo_reference_path'])) { - // Pas de photo de référence = accès sans vérification faciale - // Loguer cette tentative pour sécurité - logAction("Accès sans vérification faciale - Assuré #{$assureId} - Aucune photo de référence", 'WARNING'); - - return [ - 'success' => true, - 'require_facial_verification' => false, - 'message' => 'Accès autorisé (pas de photo de référence)', - 'assure' => $assure - ]; - } - - // 4. Envoyer le lien de vérification faciale - $verifier = new FacialVerificationLink($conn); - - // Choisir le canal d'envoi selon les préférences - $method = 'both'; // 'email', 'whatsapp', ou 'both' - - $result = $verifier->sendVerificationLink($assureId, $method); - - if ($result['success']) { - return [ - 'success' => true, - 'require_facial_verification' => true, - 'message' => 'Lien de vérification envoyé', - 'email_sent' => $result['email_sent'], - 'whatsapp_sent' => $result['whatsapp_sent'], - 'assure' => $assure - ]; - } else { - return [ - 'success' => false, - 'message' => $result['message'] - ]; - } -} - -// ==================================================================== -// SCÉNARIO 2: Vérification de session avant saisie des prestations -// ==================================================================== - -/** - * Vérifie si l'utilisateur a une session d'autorisation valide - * À appeler au début de saisie_prestations.php - */ -function checkAuthorizationSession() { - $sessionToken = $_GET['token'] ?? $_SESSION['authorization_token'] ?? null; - - if (!$sessionToken) { - return [ - 'authorized' => false, - 'message' => 'Aucune session d\'autorisation' - ]; - } - - $db = new Database(); - $conn = $db->getConnection(); - - $sql = "SELECT pas.*, a.id as assure_id, a.nom, a.prenoms, a.numero_carte - FROM prestation_authorization_sessions pas - JOIN assures a ON pas.assure_id = a.id - WHERE pas.session_token = ? - AND pas.status = 'active' - AND pas.expires_at > NOW()"; - - $stmt = $conn->prepare($sql); - $stmt->execute([$sessionToken]); - $session = $stmt->fetch(PDO::FETCH_ASSOC); - - if (!$session) { - return [ - 'authorized' => false, - 'message' => 'Session invalide ou expirée' - ]; - } - - // Stocker en session PHP pour les requêtes suivantes - $_SESSION['authorization_token'] = $sessionToken; - $_SESSION['authorized_assure_id'] = $session['assure_id']; - - return [ - 'authorized' => true, - 'assure' => [ - 'id' => $session['assure_id'], - 'nom' => $session['nom'], - 'prenoms' => $session['prenoms'], - 'numero_carte' => $session['numero_carte'] - ], - 'session' => $session - ]; -} - -/** - * Marque une session comme utilisée après saisie d'une prestation - */ -function markSessionAsUsed($sessionToken) { - $db = new Database(); - $conn = $db->getConnection(); - - $sql = "UPDATE prestation_authorization_sessions - SET prestations_saisies = prestations_saisies + 1, - used_at = NOW() - WHERE session_token = ?"; - - $stmt = $conn->prepare($sql); - return $stmt->execute([$sessionToken]); -} - -// ==================================================================== -// SCÉNARIO 3: Interface utilisateur pour le prestataire -// ==================================================================== - -/** - * Génère l'interface HTML pour le prestataire après scan NFC/QR - */ -function renderVerificationWaitingScreen($assure, $verificationSent) { - ?> - - - - - - Vérification en attente - INTER-SANTÉ - - - -
-

🏥 INTER-SANTÉ

-

Vérification d'identité en cours

- -
-

-

Carte N°

-
- -
- -

- Un lien de vérification a été envoyé à l'assuré.
- En attente de la vérification faciale... -

- -
- -
✓ Email envoyé
- -
✗ Email non envoyé
- - - -
✓ WhatsApp envoyé
- -
✗ WhatsApp non envoyé
- -
- -

- Le lien de vérification est valable pendant 15 minutes -

-
- - - - - false, 'message' => 'Données manquantes']); - exit; - } - - // Traiter le scan - $result = handleNFCOrQRCodeScan($tagData); - - if ($result['success'] && $result['require_facial_verification']) { - // Afficher l'écran d'attente - renderVerificationWaitingScreen($result['assure'], $result); - } elseif ($result['success'] && !$result['require_facial_verification']) { - // Accès direct (pas de photo de référence) - header('Location: saisie_prestations.php?assure_id=' . $result['assure']['id']); - } else { - // Erreur - echo json_encode($result); - } -} - -// Dans votre fichier saisie_prestations.php -session_start(); - -// Vérifier l'autorisation -$auth = checkAuthorizationSession(); - -if (!$auth['authorized']) { - die('Accès non autorisé. Veuillez scanner la carte de l\'assuré.'); -} - -// L'utilisateur est autorisé, afficher le formulaire de saisie -$assure = $auth['assure']; - -// ... Votre code de saisie de prestations ... - -// Après enregistrement d'une prestation -if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_prestation'])) { - // Enregistrer la prestation - // ... - - // Marquer la session comme utilisée - markSessionAsUsed($_SESSION['authorization_token']); -} diff --git a/Contestation/verify_facial_api.php b/Contestation/verify_facial_api.php index 63d5911..3ad3dcc 100644 --- a/Contestation/verify_facial_api.php +++ b/Contestation/verify_facial_api.php @@ -1,37 +1,34 @@ false, 'message' => 'Méthode non autorisée']); + exit; +} class FacialVerificationAPI { - private $db; + private $assure_api; private $maxAttempts = 3; - public function __construct($db) { - $this->db = $db; + public function __construct() { + $this->assure_api = $_SESSION['assure']; + $this->maxAttempts = $this->assure_api + ? $this->assure_api->get_nbTentativeBiometrie($_SESSION['codeEntite']) + : 3; } /** * Valide un token de vérification */ public function validateToken($token) { + $_SESSION['lienPhoto'] = ""; try { - $sql = "SELECT vr.*, a.nom, a.prenoms, a.photo_reference_path - FROM facial_verification_requests vr - JOIN assures a ON vr.assure_id = a.id - WHERE vr.verification_token = ? - AND vr.status = 'pending' - AND vr.expires_at > NOW()"; - - $stmt = $this->db->prepare($sql); - $stmt->execute([$token]); - $request = $stmt->fetch(PDO::FETCH_ASSOC); - + $request = $this->assure_api->valider_token(); + if (!$request) { return [ 'success' => false, @@ -39,11 +36,13 @@ class FacialVerificationAPI { ]; } + $_SESSION['lienPhoto'] = $request['lienPhoto']; + return [ 'success' => true, 'message' => 'Token valide', 'assure' => [ - 'nom' => $request['nom'], + 'nom' => $request['nom'], 'prenoms' => $request['prenoms'] ] ]; @@ -62,322 +61,157 @@ class FacialVerificationAPI { * Utilisez Azure Face API, AWS Rekognition, ou une solution locale */ private function compareFaces($referenceImagePath, $capturedImageBase64) { - // Option 1: Azure Face API (Recommandé) - return $this->compareWithAzureFaceAPI($referenceImagePath, $capturedImageBase64); - - // Option 2: AWS Rekognition - // return $this->compareWithAWSRekognition($referenceImagePath, $capturedImageBase64); - - // Option 3: Solution locale avec OpenCV/dlib (avancé) - // return $this->compareWithLocalFaceRecognition($referenceImagePath, $capturedImageBase64); + //AWS Rekognition + return $this->compareWithAWSRekognition($referenceImagePath, $capturedImageBase64); } - - /** - * Comparaison avec Azure Face API - */ - private function compareWithAzureFaceAPI($referenceImagePath, $capturedImageBase64) { - $endpoint = AZURE_FACE_ENDPOINT; // Ex: https://your-resource.cognitiveservices.azure.com - $apiKey = AZURE_FACE_API_KEY; - - try { - // 1. Détecter le visage dans l'image de référence - $referenceImageData = base64_encode(file_get_contents($referenceImagePath)); - $referenceFaceId = $this->detectFaceAzure($referenceImageData, $endpoint, $apiKey); - - if (!$referenceFaceId) { - return [ - 'match' => false, - 'confidence' => 0, - 'error' => 'Aucun visage détecté dans la photo de référence' - ]; - } - - // 2. Détecter le visage dans l'image capturée - $capturedImageData = explode(',', $capturedImageBase64)[1]; // Enlever le préfixe data:image - $capturedFaceId = $this->detectFaceAzure($capturedImageData, $endpoint, $apiKey); - - if (!$capturedFaceId) { - return [ - 'match' => false, - 'confidence' => 0, - 'error' => 'Aucun visage détecté dans votre photo' - ]; - } - - // 3. Comparer les deux visages - $verifyUrl = $endpoint . '/face/v1.0/verify'; - - $data = [ - 'faceId1' => $referenceFaceId, - 'faceId2' => $capturedFaceId - ]; - - $ch = curl_init($verifyUrl); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); - curl_setopt($ch, CURLOPT_HTTPHEADER, [ - 'Content-Type: application/json', - 'Ocp-Apim-Subscription-Key: ' . $apiKey - ]); - - $response = curl_exec($ch); - $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - curl_close($ch); - - if ($httpCode !== 200) { - throw new Exception("Azure API error: " . $response); - } - - $result = json_decode($response, true); - - return [ - 'match' => $result['isIdentical'], - 'confidence' => round($result['confidence'] * 100, 2), - 'error' => null - ]; - - } catch (Exception $e) { - error_log("Erreur Azure Face API: " . $e->getMessage()); - return [ - 'match' => false, - 'confidence' => 0, - 'error' => 'Erreur lors de la vérification faciale' - ]; - } - } - - /** - * Détecte un visage avec Azure Face API et retourne le faceId - */ - private function detectFaceAzure($imageBase64, $endpoint, $apiKey) { - $detectUrl = $endpoint . '/face/v1.0/detect?returnFaceId=true'; - - $ch = curl_init($detectUrl); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, base64_decode($imageBase64)); - curl_setopt($ch, CURLOPT_HTTPHEADER, [ - 'Content-Type: application/octet-stream', - 'Ocp-Apim-Subscription-Key: ' . $apiKey - ]); - - $response = curl_exec($ch); - $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - curl_close($ch); - - if ($httpCode !== 200) { - return null; - } - - $faces = json_decode($response, true); - - if (empty($faces)) { - return null; - } - - return $faces[0]['faceId']; - } - + /** * Comparaison avec AWS Rekognition (Alternative) */ private function compareWithAWSRekognition($referenceImagePath, $capturedImageBase64) { - require_once 'vendor/autoload.php'; // AWS SDK + require_once 'vendor/autoload.php'; try { $rekognitionClient = new Aws\Rekognition\RekognitionClient([ - 'version' => 'latest', - 'region' => AWS_REGION, + 'version' => 'latest', + 'region' => 'us-west-2', 'credentials' => [ - 'key' => AWS_ACCESS_KEY_ID, - 'secret' => AWS_SECRET_ACCESS_KEY + 'key' => 'AKIA2O2PTXQ7XN5OATO3', + 'secret' => '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' ] ]); - - $referenceImageData = file_get_contents($referenceImagePath); - $capturedImageData = base64_decode(explode(',', $capturedImageBase64)[1]); - + + + $referenceImageData = $referenceImagePath; + $capturedImageData = $capturedImageBase64; + + $this->assure_api->init_traiterlaface('2'); + $result = $rekognitionClient->compareFaces([ - 'SourceImage' => ['Bytes' => $referenceImageData], - 'TargetImage' => ['Bytes' => $capturedImageData], + 'SourceImage' => ['Bytes' => base64_decode($capturedImageData)], + 'TargetImage' => ['Bytes' => base64_decode($referenceImageData)], 'SimilarityThreshold' => 80 ]); if (empty($result['FaceMatches'])) { + + $this->assure_api->resultat_traitement_face($_SESSION['numeroBeneficiaire'], '0', "Les faces ne correspondent pas! / The faces do not match!"); + return [ - 'match' => false, + 'match' => false, 'confidence' => 0, - 'error' => 'Les visages ne correspondent pas' + 'error' => 'Les visages ne correspondent pas' ]; } $similarity = $result['FaceMatches'][0]['Similarity']; + // Face confirmée! / Face confirmed! + $this->assure_api->resultat_traitement_face($_SESSION['numeroBeneficiaire'], '1', ''); + return [ - 'match' => $similarity >= 80, + 'match' => $similarity >= 80, 'confidence' => round($similarity, 2), - 'error' => null + 'error' => null ]; } catch (Exception $e) { - error_log("Erreur AWS Rekognition: " . $e->getMessage()); + + $this->assure_api->resultat_traitement_face($_SESSION['numeroBeneficiaire'], '9', $msgErreur); + return [ - 'match' => false, + 'match' => false, 'confidence' => 0, - 'error' => 'Erreur lors de la vérification faciale' + 'error' => 'Erreur lors de la vérification faciale', + 'error_kane' => $e->getMessage(), ]; } } - - /** - * Enregistre la photo capturée - */ - private function saveCapturedImage($assureId, $imageBase64) { - $uploadDir = 'uploads/facial_verification/'; - - if (!file_exists($uploadDir)) { - mkdir($uploadDir, 0755, true); - } - - $imageData = explode(',', $imageBase64)[1]; - $imageData = base64_decode($imageData); - - $filename = $uploadDir . $assureId . '_' . time() . '.jpg'; - file_put_contents($filename, $imageData); - - return $filename; - } - - /** - * Met à jour le statut de la vérification - */ - private function updateVerificationStatus($token, $status, $matchResult = null, $capturedPhotoPath = null) { - $sql = "UPDATE facial_verification_requests - SET status = ?, - verified_at = NOW(), - match_confidence = ?, - captured_photo_path = ?, - attempts = attempts + 1 - WHERE verification_token = ?"; - - $stmt = $this->db->prepare($sql); - $stmt->execute([ - $status, - $matchResult ? $matchResult['confidence'] : null, - $capturedPhotoPath, - $token - ]); - } - - /** - * Crée une session d'autorisation pour l'accès aux prestations - */ - private function createAuthorizationSession($assureId, $verificationRequestId) { - $sessionToken = bin2hex(random_bytes(32)); - $expiresAt = date('Y-m-d H:i:s', time() + 3600); // 1 heure - - $sql = "INSERT INTO prestation_authorization_sessions - (assure_id, verification_request_id, session_token, expires_at, status) - VALUES (?, ?, ?, ?, 'active')"; - - $stmt = $this->db->prepare($sql); - $stmt->execute([$assureId, $verificationRequestId, $sessionToken, $expiresAt]); - - return $sessionToken; - } - + /** * Vérifie le visage capturé */ public function verifyFace($token, $capturedImageBase64) { try { // 1. Récupérer les infos de la demande - $sql = "SELECT vr.*, a.photo_reference_path, a.id as assure_id - FROM facial_verification_requests vr - JOIN assures a ON vr.assure_id = a.id - WHERE vr.verification_token = ? - AND vr.status = 'pending' - AND vr.expires_at > NOW()"; - - $stmt = $this->db->prepare($sql); - $stmt->execute([$token]); - $request = $stmt->fetch(PDO::FETCH_ASSOC); + $request = $this->assure_api->valider_token(); if (!$request) { return [ 'success' => false, - 'match' => false, + 'match' => false, 'message' => 'Demande expirée ou invalide' ]; } // 2. Vérifier le nombre de tentatives if ($request['attempts'] >= $this->maxAttempts) { - $this->updateVerificationStatus($token, 'failed'); + + $this->assure_api->maj_demandereconnaissancefaciale("2"); // Echec + return [ 'success' => false, - 'match' => false, + 'match' => false, 'message' => 'Nombre maximum de tentatives atteint' ]; } - // 3. Enregistrer la photo capturée - $capturedPhotoPath = $this->saveCapturedImage($request['assure_id'], $capturedImageBase64); - // 4. Comparer les visages $comparisonResult = $this->compareFaces( - $request['photo_reference_path'], + $_SESSION['photoAssureCrypte'], $capturedImageBase64 ); if ($comparisonResult['error']) { - $this->updateVerificationStatus($token, 'error', $comparisonResult, $capturedPhotoPath); + + $this->assure_api->maj_demandereconnaissancefaciale("2"); // Echec + return [ - 'success' => false, - 'match' => false, - 'message' => $comparisonResult['error'], - 'attempts_remaining' => $this->maxAttempts - ($request['attempts'] + 1) + 'success' => false, + 'match' => false, + 'message' => $comparisonResult['error'], + // 'attempts_remaining'=> $this->maxAttempts - ($request['attempts'] + 1) + 'attempts_remaining'=> ($this->maxAttempts - $request['attempts']) ]; } - // 5. Seuil de confiance minimum (ex: 80%) + // 5. Seuil de confiance minimum (80%) $confidenceThreshold = 80; $isMatch = $comparisonResult['match'] && $comparisonResult['confidence'] >= $confidenceThreshold; if ($isMatch) { - // Succès: créer une session d'autorisation - $this->updateVerificationStatus($token, 'verified', $comparisonResult, $capturedPhotoPath); - $sessionToken = $this->createAuthorizationSession($request['assure_id'], $request['id']); + + $this->assure_api->maj_demandereconnaissancefaciale("1"); // Vérifié return [ - 'success' => true, - 'match' => true, - 'confidence' => $comparisonResult['confidence'], - 'message' => 'Identité vérifiée avec succès', - 'session_token' => $sessionToken, - 'redirect_url' => 'saisie_prestations.php?token=' . $sessionToken + 'success' => true, + 'match' => true, + 'confidence' => $comparisonResult['confidence'], + 'message' => 'Identité vérifiée avec succès', ]; } else { - // Échec de correspondance $attemptsRemaining = $this->maxAttempts - ($request['attempts'] + 1); if ($attemptsRemaining > 0) { - $this->updateVerificationStatus($token, 'pending', $comparisonResult, $capturedPhotoPath); + + $this->assure_api->maj_demandereconnaissancefaciale("1"); // En attente + return [ - 'success' => false, - 'match' => false, - 'confidence' => $comparisonResult['confidence'], - 'message' => 'Votre visage ne correspond pas', + 'success' => false, + 'match' => false, + 'confidence' => $comparisonResult['confidence'], + 'message' => 'Votre visage ne correspond pas', 'attempts_remaining' => $attemptsRemaining ]; } else { - $this->updateVerificationStatus($token, 'failed', $comparisonResult, $capturedPhotoPath); + + $this->assure_api->maj_demandereconnaissancefaciale("2"); // Echec + return [ - 'success' => false, - 'match' => false, - 'confidence' => $comparisonResult['confidence'], - 'message' => 'Vérification échouée. Nombre maximum de tentatives atteint.', + 'success' => false, + 'match' => false, + 'confidence' => $comparisonResult['confidence'], + 'message' => 'Vérification échouée. Nombre maximum de tentatives atteint.', 'attempts_remaining' => 0 ]; } @@ -387,7 +221,7 @@ class FacialVerificationAPI { error_log("Erreur verifyFace: " . $e->getMessage()); return [ 'success' => false, - 'match' => false, + 'match' => false, 'message' => 'Erreur lors de la vérification: ' . $e->getMessage() ]; } @@ -396,12 +230,11 @@ class FacialVerificationAPI { // Traiter la requête if ($_SERVER['REQUEST_METHOD'] === 'POST') { - $input = json_decode(file_get_contents('php://input'), true); + $input = json_decode(file_get_contents('php://input'), true); $action = $input['action'] ?? null; - $db = new Database(); - $api = new FacialVerificationAPI($db->getConnection()); - + $api = new FacialVerificationAPI(); + switch ($action) { case 'validate_token': $token = $input['token'] ?? null; @@ -415,7 +248,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { case 'verify_face': $token = $input['token'] ?? null; $image = $input['image'] ?? null; - + if (!$token || !$image) { echo json_encode(['success' => false, 'message' => 'Token et image requis']); exit; @@ -427,5 +260,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { echo json_encode(['success' => false, 'message' => 'Action invalide']); } } else { + // echo json_encode(['success' => false, 'message' => 'Méthode non autorisée']); + ob_end_clean(); // ✅ vide le buffer avant d'envoyer le JSON echo json_encode(['success' => false, 'message' => 'Méthode non autorisée']); -} +} \ No newline at end of file diff --git a/Framework/Moritio.php b/Framework/Moritio.php index ba7f64d..a7f9b68 100755 --- a/Framework/Moritio.php +++ b/Framework/Moritio.php @@ -1,103 +1,95 @@ -ionCube')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' get-loader.ioncube.com and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' http://ioncu.be/LV ')."\n\n");exit(199); ?> -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 -jAehVfImOjaXCRIDYTAGlkLNTri== -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= -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 \ No newline at end of file +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 +h6T2h1NpQMwMztYhVGtjiD3Cwf4= \ No newline at end of file diff --git a/Societes/envoyx/test b/Societes/envoyx/test new file mode 100644 index 0000000..3598c30 --- /dev/null +++ b/Societes/envoyx/test @@ -0,0 +1 @@ +tests \ No newline at end of file diff --git a/Societes/fideliasn/test b/Societes/fideliasn/test new file mode 100644 index 0000000..3598c30 --- /dev/null +++ b/Societes/fideliasn/test @@ -0,0 +1 @@ +tests \ No newline at end of file diff --git a/Societes/generaliacm/test b/Societes/generaliacm/test new file mode 100644 index 0000000..3598c30 --- /dev/null +++ b/Societes/generaliacm/test @@ -0,0 +1 @@ +tests \ No newline at end of file diff --git a/Vue/gabarit.php b/Vue/gabarit.php index 323c169..9c65f0a 100755 --- a/Vue/gabarit.php +++ b/Vue/gabarit.php @@ -1,6 +1,5 @@ - @@ -189,8 +187,6 @@ - -