Files
maria_uslugi/admin/tools/ajax_send_validation_link.php
2026-03-05 10:25:39 +01:00

102 lines
3.7 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
// admin/tools/ajax_send_validation_link.php
header('Content-Type: application/json; charset=utf-8');
require_once __DIR__ . '/../../public/includes/init_admin.php';
// ID "super admin"
const ADMIN_PRACTICIEN_ID = 88888888;
$me = (int)($_SESSION['reference_id'] ?? 0);
if ($me !== ADMIN_PRACTICIEN_ID) {
http_response_code(403);
echo json_encode(['ok'=>false, 'error'=>'Доступ запрещён.'], JSON_UNESCAPED_UNICODE);
exit;
}
function jerr(string $msg, int $code = 400): void {
http_response_code($code);
echo json_encode(['ok'=>false, 'error'=>$msg], JSON_UNESCAPED_UNICODE);
exit;
}
// CSRF
$csrf = $_POST['csrf'] ?? '';
if (empty($_SESSION['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $csrf)) {
jerr('Ошибка CSRF. Обновите страницу.', 400);
}
$id = (int)($_POST['id'] ?? 0);
if ($id <= 0) {
jerr('Неверный идентификатор пользователя.', 400);
}
// Загружаем аккаунт
$st = $pdo->prepare("SELECT id, email, role FROM compte WHERE id = ? AND role IN ('client','praticien','secretaire')");
$st->execute([$id]);
$compte = $st->fetch(PDO::FETCH_ASSOC);
if (!$compte) {
jerr('Пользователь не найден или роль не поддерживается.', 404);
}
$email = trim($compte['email'] ?? '');
if ($email === '') {
jerr('У пользователя не указан e-mail.', 400);
}
// Генерируем новый токен
try {
$token = bin2hex(random_bytes(32));
} catch (Exception $e) {
jerr('Не удалось сгенерировать токен.', 500);
}
// Сохраняем токен и сбрасываем флаг подтверждения
$upd = $pdo->prepare("UPDATE compte SET token_validation = ?, email_valide = 0, modifie_le = NOW() WHERE id = ?");
$upd->execute([$token, $compte['id']]);
// Строим ссылку подтверждения
$host = $_SERVER['HTTP_HOST'] ?? 'uslugi.fr';
$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$validateUrl = $scheme . '://' . $host . '/auth/validate.php?token=' . urlencode($token);
// Отправка письма (простой mail(), можно заменить на PHPMailer)
$subject = 'Подтверждение регистрации на uslugi.fr';
// On prépare le contenu HTML (avec des sauts de ligne <br>)
$htmlBody = nl2br(
"Здравствуйте!\n\n" .
"Вы (или кто-то другой) зарегистрировались на сайте uslugi.fr с этим адресом электронной почты.\n\n" .
"Чтобы подтвердить регистрацию, перейдите по следующей ссылке:\n" .
"<a href='$validateUrl'>$validateUrl</a>\n\n" .
"Если вы не регистрировались на сайте, просто проигнорируйте это письмо.\n\n" .
"С уважением,\n" .
"Команда uslugi.fr\n"
);
// On garde une version texte pur sans HTML
$textBody = strip_tags($htmlBody);
// REMPLACEMENT DE mail() PAR uslugi_mail()
list($sent, $err) = uslugi_mail(
$email,
$subject, // Plus besoin de base64_encode ici
$htmlBody,
$textBody,
['to_name' => "Пользователь"] // Optionnel : vous pouvez passer le nom si vous l'avez
);
// On adapte le test de succès
if (!$sent) {
// On affiche l'erreur réelle retournée par Brevo/PHPMailer pour le debug
jerr('Ошибка отправки (Brevo): ' . $err, 500);
}
echo json_encode([
'ok' => true,
'message' => 'Ссылка для подтверждения регистрации успешно отправлена на ' . $email
], JSON_UNESCAPED_UNICODE);