Update departure time text and improve forms
Remove specific time details from departure info on plan page. Add email domain blocking, extended validation, and multi-admin Telegram notifications in forms.
This commit is contained in:
+1
-1
@@ -27,7 +27,7 @@ disableComments = true
|
|||||||
- **Обсуждение деталей:** [Telegram чат "Полёты БВС"](https://t.me/polet_bvs)
|
- **Обсуждение деталей:** [Telegram чат "Полёты БВС"](https://t.me/polet_bvs)
|
||||||
|
|
||||||
### Важная информация
|
### Важная информация
|
||||||
- **Время выезда:** обычно рано утром, 5-6 утра из Москвы, иногда раньше в зависимости от удалённости локации
|
- **Время выезда:** обычно рано утром, в зависимости от удалённости локации
|
||||||
- **Email:** проверьте папку "Нежелательные" - ответ может попасть туда
|
- **Email:** проверьте папку "Нежелательные" - ответ может попасть туда
|
||||||
|
|
||||||
{{< rawhtml >}}
|
{{< rawhtml >}}
|
||||||
|
|||||||
+82
-9
@@ -52,11 +52,72 @@ function get_forms_settings() {
|
|||||||
'save_json' => getenv('FORMS_SAVE_JSON') === 'true',
|
'save_json' => getenv('FORMS_SAVE_JSON') === 'true',
|
||||||
'notifications' => getenv('FORMS_NOTIFICATIONS') === 'true',
|
'notifications' => getenv('FORMS_NOTIFICATIONS') === 'true',
|
||||||
'telegram_bot_token' => getenv('TELEGRAM_BOT_TOKEN'),
|
'telegram_bot_token' => getenv('TELEGRAM_BOT_TOKEN'),
|
||||||
'telegram_chat_id' => getenv('TELEGRAM_ADMIN_CHAT_ID'),
|
'telegram_chat_ids' => array_filter(array_map('trim', explode(',', getenv('TELEGRAM_ADMIN_CHAT_ID') ?: ''))),
|
||||||
'encryption_key' => getenv('FORMS_ENCRYPTION_KEY') ?: 'default_key_change_me'
|
'encryption_key' => getenv('FORMS_ENCRYPTION_KEY') ?: 'default_key_change_me'
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Проверка email на заблокированные домены
|
||||||
|
*
|
||||||
|
* @param string $email Email адрес для проверки
|
||||||
|
* @return bool true если домен заблокирован, false если разрешён
|
||||||
|
*/
|
||||||
|
function is_blocked_email_domain($email) {
|
||||||
|
$blocked_domains = [
|
||||||
|
'.ua', // Украина
|
||||||
|
'.fr', // Франция (спам)
|
||||||
|
'.cn', // Китай
|
||||||
|
'.com.cn',
|
||||||
|
'.net.cn',
|
||||||
|
'.org.cn',
|
||||||
|
'.gov.cn',
|
||||||
|
'.edu.cn',
|
||||||
|
'.ac.cn'
|
||||||
|
];
|
||||||
|
|
||||||
|
$email_parts = explode('@', strtolower($email));
|
||||||
|
if (count($email_parts) !== 2) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$domain = $email_parts[1];
|
||||||
|
|
||||||
|
foreach ($blocked_domains as $blocked) {
|
||||||
|
if ($domain === ltrim($blocked, '.') ||
|
||||||
|
substr($domain, -strlen($blocked)) === $blocked) {
|
||||||
|
error_log("Заблокирован email с доменом: $domain (правило: $blocked) от IP: " . ($_SERVER['REMOTE_ADDR'] ?? 'unknown'));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Расширенная валидация email
|
||||||
|
*
|
||||||
|
* @param string $email Email для валидации
|
||||||
|
* @return array ['valid' => bool, 'error' => string]
|
||||||
|
*/
|
||||||
|
function validate_email_extended($email) {
|
||||||
|
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||||
|
return [
|
||||||
|
'valid' => false,
|
||||||
|
'error' => 'Некорректный формат email адреса.'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_blocked_email_domain($email)) {
|
||||||
|
return [
|
||||||
|
'valid' => false,
|
||||||
|
'error' => 'К сожалению, регистрация с этого домена временно недоступна.'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return ['valid' => true, 'error' => ''];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Простое шифрование данных для безопасного хранения
|
* Простое шифрование данных для безопасного хранения
|
||||||
* Совместимо с Python Crypto.Cipher.AES + unpad
|
* Совместимо с Python Crypto.Cipher.AES + unpad
|
||||||
@@ -158,7 +219,7 @@ function send_telegram_notification($form_data, $form_type) {
|
|||||||
return true; // Отправка отключена
|
return true; // Отправка отключена
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($settings['telegram_bot_token']) || empty($settings['telegram_chat_id'])) {
|
if (empty($settings['telegram_bot_token']) || empty($settings['telegram_chat_ids'])) {
|
||||||
error_log("Telegram настройки не настроены");
|
error_log("Telegram настройки не настроены");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -186,10 +247,14 @@ function send_telegram_notification($form_data, $form_type) {
|
|||||||
|
|
||||||
$message .= "\n⏰ *Время:* " . date('Y-m-d H:i:s');
|
$message .= "\n⏰ *Время:* " . date('Y-m-d H:i:s');
|
||||||
|
|
||||||
// Отправляем сообщение
|
// Отправляем сообщение всем администраторам
|
||||||
$url = "https://api.telegram.org/bot" . $settings['telegram_bot_token'] . "/sendMessage";
|
$url = "https://api.telegram.org/bot" . $settings['telegram_bot_token'] . "/sendMessage";
|
||||||
|
$all_sent = true;
|
||||||
|
$sent_count = 0;
|
||||||
|
|
||||||
|
foreach ($settings['telegram_chat_ids'] as $chat_id) {
|
||||||
$data = [
|
$data = [
|
||||||
'chat_id' => $settings['telegram_chat_id'],
|
'chat_id' => $chat_id,
|
||||||
'text' => $message,
|
'text' => $message,
|
||||||
'parse_mode' => 'Markdown'
|
'parse_mode' => 'Markdown'
|
||||||
];
|
];
|
||||||
@@ -207,15 +272,23 @@ function send_telegram_notification($form_data, $form_type) {
|
|||||||
$response = json_decode($result, true);
|
$response = json_decode($result, true);
|
||||||
|
|
||||||
if ($response && $response['ok']) {
|
if ($response && $response['ok']) {
|
||||||
return true;
|
$sent_count++;
|
||||||
} else {
|
} else {
|
||||||
error_log("Ошибка отправки в Telegram: " . $result);
|
error_log("Ошибка отправки в Telegram (chat_id: $chat_id): " . $result);
|
||||||
return false;
|
$all_sent = false;
|
||||||
}
|
}
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
error_log("Исключение при отправке в Telegram: " . $e->getMessage());
|
error_log("Исключение при отправке в Telegram (chat_id: $chat_id): " . $e->getMessage());
|
||||||
return false;
|
$all_sent = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($sent_count > 0) {
|
||||||
|
error_log("Уведомление отправлено $sent_count админам из " . count($settings['telegram_chat_ids']));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+10
-25
@@ -18,9 +18,14 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
$error = "Имя, тема и сообщение обязательны для заполнения.";
|
$error = "Имя, тема и сообщение обязательны для заполнения.";
|
||||||
} elseif (empty($email) && empty($telegram)) {
|
} elseif (empty($email) && empty($telegram)) {
|
||||||
$error = "Укажите email или Telegram ник (одно из двух обязательно).";
|
$error = "Укажите email или Telegram ник (одно из двух обязательно).";
|
||||||
} elseif (!empty($email) && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
} elseif (!empty($email)) {
|
||||||
$error = "Некорректный email адрес.";
|
$email_validation = validate_email_extended($email);
|
||||||
} else {
|
if (!$email_validation['valid']) {
|
||||||
|
$error = $email_validation['error'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($error)) {
|
||||||
// Подготавливаем данные заявки
|
// Подготавливаем данные заявки
|
||||||
$form_data = [
|
$form_data = [
|
||||||
'name' => $name,
|
'name' => $name,
|
||||||
@@ -36,28 +41,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
|
|
||||||
// 1. Отправка email (если включено)
|
// 1. Отправка email (если включено)
|
||||||
if ($settings['send_email']) {
|
if ($settings['send_email']) {
|
||||||
$to = getenv('FORMS_MAIN_EMAIL') ?: "sleeptrip@mail.ru";
|
$email_sent = send_email_notification($form_data, 'ask');
|
||||||
$email_subject = "Вопрос с сайта: " . $subject;
|
if ($email_sent) {
|
||||||
$email_body = "Новый вопрос с сайта:\n\n";
|
|
||||||
$email_body .= "Имя: " . $name . "\n";
|
|
||||||
$email_body .= "Email: " . ($email ?: 'не указан') . "\n";
|
|
||||||
$email_body .= "Telegram: " . ($telegram ?: 'не указан') . "\n";
|
|
||||||
$email_body .= "Телефон: " . ($phone ?: 'не указан') . "\n";
|
|
||||||
$email_body .= "Тема: " . $subject . "\n\n";
|
|
||||||
$email_body .= "Сообщение:\n" . $message . "\n\n";
|
|
||||||
$email_body .= "---\n";
|
|
||||||
$email_body .= "Отправлено с: " . $_SERVER['HTTP_HOST'] . "\n";
|
|
||||||
$email_body .= "Дата: " . date('Y-m-d H:i:s') . "\n";
|
|
||||||
|
|
||||||
$from_email = getenv('FORMS_FROM_EMAIL') ?: 'noreply@sleeptrip.ru';
|
|
||||||
$headers = "From: " . $from_email . "\r\n";
|
|
||||||
if (!empty($email)) {
|
|
||||||
$headers .= "Reply-To: " . $email . "\r\n";
|
|
||||||
}
|
|
||||||
$headers .= "X-Mailer: PHP/" . phpversion();
|
|
||||||
$headers .= "Content-Type: text/plain; charset=UTF-8\r\n";
|
|
||||||
|
|
||||||
if (mail($to, $email_subject, $email_body, $headers)) {
|
|
||||||
$success_messages[] = "Email отправлен";
|
$success_messages[] = "Email отправлен";
|
||||||
} else {
|
} else {
|
||||||
$error_messages[] = "Ошибка отправки email";
|
$error_messages[] = "Ошибка отправки email";
|
||||||
|
|||||||
+13
-4
@@ -22,11 +22,20 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
$error = "Обязательное поле: Телефон.";
|
$error = "Обязательное поле: Телефон.";
|
||||||
} elseif (empty($email) && empty($telegram)) {
|
} elseif (empty($email) && empty($telegram)) {
|
||||||
$error = "Укажите email или Telegram ник (одно из двух обязательно).";
|
$error = "Укажите email или Telegram ник (одно из двух обязательно).";
|
||||||
} elseif (!empty($email) && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
} elseif (!empty($email)) {
|
||||||
$error = "Некорректный email адрес.";
|
$email_validation = validate_email_extended($email);
|
||||||
} elseif ($consent !== 'agree') {
|
if (!$email_validation['valid']) {
|
||||||
|
$error = $email_validation['error'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверка согласия
|
||||||
|
if (empty($error) && $consent !== 'agree') {
|
||||||
$error = "Для отправки заявки необходимо согласие на обработку персональных данных.";
|
$error = "Для отправки заявки необходимо согласие на обработку персональных данных.";
|
||||||
} elseif (!empty($bvs_file) && $bvs_file['error'] !== UPLOAD_ERR_NO_FILE) {
|
}
|
||||||
|
|
||||||
|
// Проверка загруженного файла
|
||||||
|
if (empty($error) && !empty($bvs_file) && $bvs_file['error'] !== UPLOAD_ERR_NO_FILE) {
|
||||||
// Проверка загруженного файла
|
// Проверка загруженного файла
|
||||||
if ($bvs_file['error'] !== UPLOAD_ERR_OK) {
|
if ($bvs_file['error'] !== UPLOAD_ERR_OK) {
|
||||||
$error = "Ошибка при загрузке файла. Попробуйте еще раз.";
|
$error = "Ошибка при загрузке файла. Попробуйте еще раз.";
|
||||||
|
|||||||
Reference in New Issue
Block a user