$lg,
"lang" => $lang,
)
);
*/
$translations = [
'fr_FR' => [
'error' => 'Erreur',
'information' => 'Information',
'missing_language' => 'Paramètre langue absent de la requête !',
'unknown_language' => 'Langue inconnue !',
'missing_entity' => 'Paramètre entité absent de la requête !',
'missing_provider' => 'Paramètre prestataire absent de la requête !',
'missing_insured' => 'ID assuré absent de la requête !',
'missing_request' => 'ID demande absent de la requête !',
'entity_not_found' => 'Entité introuvable !',
'insured_not_found' => 'Assuré introuvable !',
'no_request_found' => 'Aucune demande trouvée !',
'token_used' => 'Token déjà utilisé !',
'request_expired' => 'Demande expirée depuis %s !',
// 'request_expired' => 'Demande expirée depuis ',
'verification_done' => 'Vérification déjà effectuée !',
'too_many_attempts' => 'Trop de tentatives !',
'secure_identity_verification' => 'Vérification d\'identité sécurisée',
'provider' => 'Prestataire',
'patient' => 'Patient',
'counter' => 'Compteur',
'attempts_on' => 'tentative(s) sur',
'loading_request' => 'Vérification du lien...',
'verification_instructions' => 'Instructions pour la vérification',
'instruction_1' => 'Positionnez votre visage dans l\'ovale',
'instruction_2' => 'Assurez-vous d\'être dans un endroit bien éclairé',
'instruction_3' => 'Regardez directement la caméra',
'instruction_4' => 'Restez immobile lors de la capture',
'instruction_5' => 'Retirez lunettes de soleil, casquette ou masque',
'start_camera' => 'Démarrer la caméra',
'position_face' => 'Positionnez votre visage dans l\'ovale',
'take_photo' => 'Prendre la photo',
'confirm_photo' => 'Confirmez votre photo',
'confirm_verify' => 'Confirmer et vérifier',
'retake_photo' => 'Reprendre la photo',
'verification_processing' => 'Vérification de votre identité en cours...',
'please_wait' => 'Merci de patienter',
'identity_verified' => 'Identité vérifiée !',
'identity_confirmed' => 'Votre identité a été confirmée avec succès.',
'confidence' => 'Confiance',
'access_services' => 'Vous pouvez maintenant accéder à vos prestations.',
'verification_failed' => 'Vérification échouée',
'face_not_match' => 'Votre visage ne correspond pas à notre base de données.',
'contact_support' => 'Veuillez contacter notre service client.',
'remaining_attempts' => 'Tentatives restantes',
'redirection_in' => 'Redirection dans %s secondes...',
'invalid_link' => 'Lien de vérification invalide',
'expired_link' => 'Lien expiré ou invalide',
'server_error' => 'Erreur de connexion au serveur',
'camera_error' => 'Impossible d\'accéder à la caméra. Veuillez autoriser l\'accès.',
],
'en_US' => [
'error' => 'Error',
'information' => 'Information',
'missing_language' => 'Language parameter missing from query!',
'unknown_language' => 'Unknown language!',
'missing_entity' => 'Entity parameter missing from query!',
'missing_provider' => 'Provider parameter missing from query!',
'missing_insured' => 'Insured ID missing from query!',
'missing_request' => 'Request ID missing from query!',
'entity_not_found' => 'Entity not found!',
'insured_not_found' => 'Insured not found!',
'no_request_found' => 'No requests found!',
'token_used' => 'Token already used!',
'request_expired' => 'Request expired since %s!',
// 'request_expired' => 'Request expired since ',
'verification_done' => 'Verification already completed!',
'too_many_attempts' => 'Too many attempts!',
'secure_identity_verification' => 'Secure identity verification',
'provider' => 'Provider',
'patient' => 'Patient',
'counter' => 'Counter',
'attempts_on' => 'attempt(s) out of',
'loading_request' => 'Checking verification link...',
'verification_instructions' => 'Verification instructions',
'instruction_1' => 'Place your face inside the oval',
'instruction_2' => 'Ensure you are in a well-lit place',
'instruction_3' => 'Look directly at the camera',
'instruction_4' => 'Remain still during capture',
'instruction_5' => 'Remove sunglasses, cap, or mask',
'start_camera' => 'Start camera',
'position_face' => 'Position your face inside the oval',
'take_photo' => 'Take photo',
'confirm_photo' => 'Confirm your photo',
'confirm_verify' => 'Confirm and verify',
'retake_photo' => 'Retake photo',
'verification_processing' => 'Identity verification in progress...',
'please_wait' => 'Please wait',
'identity_verified' => 'Identity verified!',
'identity_confirmed' => 'Your identity has been successfully confirmed.',
'confidence' => 'Confidence',
'access_services' => 'You may now access your services.',
'verification_failed' => 'Verification failed',
'face_not_match' => 'Your face does not match our database.',
'contact_support' => 'Please contact customer support.',
'remaining_attempts' => 'Remaining attempts',
'redirection_in' => 'Redirecting in %s seconds...',
'invalid_link' => 'Invalid verification link',
'expired_link' => 'Expired or invalid link',
'server_error' => 'Server connection error',
'camera_error' => 'Unable to access the camera. Please allow access.',
]
];
function t($key, $lang, $translations, $params)
{
$text = $translations[$lang][$key] ?? $key;
if (!empty($params)) {
return vsprintf($text, $params);
}
return $text;
}
$tab_code_langue = ["fr_FR", "en_US"];
if (!in_array($codeLangue, $tab_code_langue)) {
afficherMessage("Langue inconnue!/Unknown language!", "Erreur");
}
if (!isset($_GET['codeEntite'])) {
$message = t('missing_entity', $lang, $translations);
afficherMessage($message, "Error");
}
if (!isset($_GET['codePrestataire'])) {
$message = t('missing_provider', $lang, $translations);
afficherMessage($message, "Erreur");
}
if (!isset($_GET['idBeneficiaire'])) {
$message = t('missing_insured', $lang, $translations);
afficherMessage($message, "Erreur");
}
if (!isset($_GET['idDemande'])) {
$message = t('missing_request', $lang, $translations);
afficherMessage($message, "Erreur");
}
$_SESSION['codeLangue'] = $lg;
$_SESSION['codeEntite'] = base64_decode($_GET['codeEntite']);
$_SESSION['codePrestataire'] = base64_decode($_GET['codePrestataire']);
$_SESSION['idBeneficiaire'] = base64_decode($_GET['idBeneficiaire']);
$_SESSION['idDemande'] = base64_decode($_GET['idDemande']);
$codeSociete = $_SESSION['codeEntite'];
$idBeneficiaire = $_SESSION['idBeneficiaire'];
$idDemande = $_SESSION['idDemande'];
$codePrestataire = $_SESSION['codePrestataire'];
$codeBdd = $codeSociete;
$_SESSION['idLogapiface'] = 0;
require_once "Assure.php";
$assure = new Assure();
$_SESSION['assure'] = $assure;
$_SESSION['codeBdd'] = $codeBdd;
$bdd = $assure->geUneBd($codeBdd);
if(!$bdd) {
$message = t('entity_not_found', $lang, $translations);
afficherMessage("$message", "Erreur");
}
$_SESSION['BdName'] = $bdd['BdName'];
$_SESSION['BdLogin'] = $bdd['BdLogin'];
$_SESSION['BdMdp'] = $bdd['BdMdp'];
if($assure->existeligne($codeSociete)) {
$fassureExiste = $assure->assureExiste($codeSociete, $idBeneficiaire);
if(!$fassureExiste) {
$message = t('insured_not_found', $lang, $translations);
afficherMessage("$message", "Erreur");
}
$demande = $assure->checkdemandereconnaissancefaciale_id();
if(!$demande) {
$message = $codeLangue == 'en_US' ? "No requests found!" : "Aucune demande trouvée!";
afficherMessage("$message", "Erreur");
}
$idDemande = $demande["idDemande"];
$codeEtat = $demande["codeEtat"];
$demandeExpiree = $demande["demandeExpiree"];
$dateExpirationFr = $demande["dateExpirationFr"];
$dateExpirationEng = $demande["dateExpirationEng"];
$etatDemande = $demande["etatDemande"];
$etatDemandeEng = $demande["etatDemandeEng"];
$beneficiaire = $demande["beneficiaire"];
$prestataire = $demande["prestataire"];
$lienPhoto = $demande["lienPhoto"];
$attempts = $demande["attempts"];
$_SESSION['lienPhoto'] = $lienPhoto;
$_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=="6") {
$message = t('token_used', $lang, $translations);
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 !";
$message = t(
'request_expired',
$lang,
$translations,
$lang == 'en_US' ? $dateExpirationEng : $dateExpirationFr
);
afficherMessage("$message", "Erreur");
}
if($codeEtat=="1") {
$message = $codeLangue == 'en_US' ? "Verification already completed!" : "Vérification déjà effectuée!";
afficherMessage("$message", "Information");
}
$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");
}
// 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);
}
}
}
function afficherMessage($message, $titre) {
echo "
$titre
";
exit();
}
// Chiffrer l’image au moment de l’upload (PHP)
function encryptImage($sourcePath, $destPath)
{
$key = base64_decode(trim(file_get_contents('/var/www/keys/inter-sante-photo.key')));
$plaintext = file_get_contents($sourcePath);
$iv = openssl_random_pseudo_bytes(16);
$cipher = openssl_encrypt($plaintext, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
file_put_contents($destPath, $iv . $cipher); // concat IV + données
}
// Déchiffrer pour afficher la photo dans INTER-SANTE
function decryptImage($path)
{
$key = base64_decode(trim(file_get_contents('/var/www/keys/inter-sante-photo.key')));
$data = file_get_contents($path);
$iv = substr($data, 0, 16);
$ciphertext = substr($data, 16);
// return openssl_decrypt($ciphertext, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
return base64_encode(openssl_decrypt($ciphertext, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv));
}
?>
INTER-SANTÉ - Vérification d'identité
Demande 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
Vérification de votre identité en cours...
Merci de patienter