102 lines
3.7 KiB
PHP
102 lines
3.7 KiB
PHP
<?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);
|
||
|