Files
softspm_www/api/config.php
T
2026-09-03 21:57:48 +02:00

188 lines
7.1 KiB
PHP

<?php
declare(strict_types=1);
/**
* Ustawienia integracji formularzy z api.softspm.pl/send_email_api.php
*
* Sekretów NIE trzymamy w tym pliku ani nigdzie w katalogu strony.
* Kolejność szukania klucza API i sekretu podpisu (wygrywa pierwsze znalezione):
*
* 1. zmienne środowiskowe SOFTSPM_MAIL_API_KEY i SOFTSPM_FORM_SECRET
* 2. wspólna konfiguracja serwera: /etc/hydronexis/config.php
* - stałe SOFTSPM_MAIL_API_KEY / SOFTSPM_FORM_SECRET, albo
* - klucze softspm_mail_api_key / softspm_form_secret w zwracanej tablicy
* 3. api/config.local.php (wzór: config.local.sample.php) - na potrzeby dev
*
* Ścieżkę wspólnej konfiguracji można zmienić zmienną SOFTSPM_SHARED_CONFIG.
*/
$config = [
// --- API wysyłki (patrz doc/manual_send_email.html) ---------------------
'api_url' => 'https://api.softspm.pl/send_email_api.php',
'api_key' => '',
'timeout' => 15,
// --- Sekret do podpisywania tokenów antybotowych (HMAC-SHA256) ---------
// Dowolny losowy ciąg, min. 32 znaki. Zmiana unieważnia otwarte formularze.
'token_secret' => '',
// --- Akademia Wodociągowca: publiczne API v1 (webinary i kursy) --------
// Dokumentacja: akademiawodociagowca/docs/api_public_v1.html
// Klucz z panelu Akademii: Ustawienia -> Klucze API. Pokazywany raz.
'akademia_api_url' => 'https://akademiawodociagowca.pl/api/public/v1',
'akademia_api_key' => '',
// Bufor odpowiedzi w sekundach. Dokumentacja Akademii zaleca 1-5 minut.
'akademia_cache_ttl' => 300,
// --- Adresat zgłoszeń --------------------------------------------------
// Ustawiany wyłącznie po stronie serwera. Nigdy nie pochodzi z formularza -
// inaczej endpoint stałby się otwartym przekaźnikiem spamu.
// Wartość domyślna; produkcja nadpisuje ją z /etc/hydronexis/config.php.
'recipient' => 'pzators@go2.pl',
// Opcjonalnie: inny adres dla wybranego formularza, np.
// 'recipients' => ['szkolenia' => 'szkolenia@softspm.com'],
'recipients' => [],
'subject_prefix' => '[softspm.com]',
// --- Skąd wolno wysyłać (nagłówek Origin / Referer) --------------------
'allowed_hosts' => [
'softspm.com',
'www.softspm.com',
'localhost',
'127.0.0.1',
],
// --- Zabezpieczenia ----------------------------------------------------
// Minimalny czas od pierwszej interakcji z formularzem do wysyłki.
// Człowiek czyta, pisze i przesuwa suwak; skrypt robi wszystko w jednej serii.
'min_fill_seconds' => 3,
// Minimalny odstęp między pobraniem tokenu a potwierdzeniem suwakiem.
// 0 = wyłączone. Podnoś ostrożnie: ktoś, kto od razu chwyta suwak, robi
// obie rzeczy w tej samej sekundzie i zostałby odrzucony niesłusznie.
'min_slide_seconds' => 0,
// Po tylu sekundach token formularza wygasa (otwarta karta w tle).
'max_token_age' => 7200,
// Po tylu sekundach wygasa samo potwierdzenie suwakiem.
'max_proof_age' => 1800,
// Limit zgłoszeń z jednego adresu IP.
'rate_limit' => [
'per_hour' => 5,
'per_day' => 20,
],
// --- Dane robocze (zużyte tokeny, liczniki, log) ------------------------
'storage_dir' => __DIR__ . '/storage',
];
// --- 1. Zmienne środowiskowe ------------------------------------------------
$fromEnv = [
'api_key' => getenv('SOFTSPM_MAIL_API_KEY'),
'token_secret' => getenv('SOFTSPM_FORM_SECRET'),
'akademia_api_key' => getenv('SOFTSPM_AKADEMIA_API_KEY'),
'akademia_api_url' => getenv('SOFTSPM_AKADEMIA_API_URL'),
];
foreach ($fromEnv as $key => $value) {
if (is_string($value) && $value !== '') {
$config[$key] = $value;
}
}
// --- 2. Wspólna konfiguracja serwera ---------------------------------------
$sharedPath = getenv('SOFTSPM_SHARED_CONFIG');
if (!is_string($sharedPath) || $sharedPath === '') {
$sharedPath = '/etc/hydronexis/config.php';
}
if (is_file($sharedPath) && is_readable($sharedPath)) {
// Plik wczytujemy w osobnym zasięgu, żeby nie mieszał w zmiennych tego pliku.
$shared = (static function (string $file) {
/** @psalm-suppress UnresolvableInclude */
return require $file;
})($sharedPath);
if (!is_array($shared)) {
$shared = [];
}
/**
* Jedna wartość może przyjść na dwa sposoby: jako stała zdefiniowana
* w /etc/hydronexis/config.php albo jako klucz w tablicy zwracanej przez
* ten plik. Zmienna środowiskowa ustawiona wcześniej ma pierwszeństwo.
*/
$pick = static function (string $constant, string $key) use ($shared) {
if (defined($constant)) {
$value = constant($constant);
if (is_string($value) && $value !== '') {
return $value;
}
if (is_array($value) && $value !== []) {
return $value;
}
}
if (isset($shared[$key]) && (is_string($shared[$key]) || is_array($shared[$key])) && $shared[$key] !== '') {
return $shared[$key];
}
if (isset($shared[$constant]) && (is_string($shared[$constant]) || is_array($shared[$constant])) && $shared[$constant] !== '') {
return $shared[$constant];
}
return null;
};
// Sekrety - tylko jeśli nie przyszły ze zmiennych środowiskowych.
if ($config['api_key'] === '') {
$value = $pick('SOFTSPM_MAIL_API_KEY', 'softspm_mail_api_key');
if (is_string($value)) {
$config['api_key'] = $value;
}
}
if ($config['token_secret'] === '') {
$value = $pick('SOFTSPM_FORM_SECRET', 'softspm_form_secret');
if (is_string($value)) {
$config['token_secret'] = $value;
}
}
// Klucz do publicznego API Akademii Wodociągowca.
if ($config['akademia_api_key'] === '') {
$value = $pick('SOFTSPM_AKADEMIA_API_KEY', 'softspm_akademia_api_key');
if (is_string($value)) {
$config['akademia_api_key'] = $value;
}
}
// Adres API Akademii - tylko gdy instancja stoi pod innym adresem.
$value = $pick('SOFTSPM_AKADEMIA_API_URL', 'softspm_akademia_api_url');
if (is_string($value)) {
$config['akademia_api_url'] = $value;
}
// Adresat zgłoszeń - jeden dla wszystkich formularzy.
$value = $pick('SOFTSPM_FORM_RECIPIENT', 'softspm_form_recipient');
if (is_string($value)) {
$config['recipient'] = $value;
}
// Opcjonalnie: adresaci per formularz, tablica id_formularza => adres.
$value = $pick('SOFTSPM_FORM_RECIPIENTS', 'softspm_form_recipients');
if (is_array($value)) {
$config['recipients'] = $value;
}
// Opcjonalnie: domeny, z których wolno wysyłać.
$value = $pick('SOFTSPM_FORM_HOSTS', 'softspm_form_hosts');
if (is_array($value) && $value !== []) {
$config['allowed_hosts'] = $value;
}
}
// --- 3. Konfiguracja lokalna (dev) ------------------------------------------
$local = __DIR__ . '/config.local.php';
if (is_file($local)) {
$override = require $local;
if (is_array($override)) {
$config = array_replace($config, $override);
}
}
return $config;