diff --git a/README.md b/README.md index bf5a14f..4bc625f 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ chmod +x scripts/warp-amnezia.sh Необязательно передайте в контейнер **amnezia-admin** переменные `WARP_DIR`, `WARP_CONF_PATH`, `WARP_CLIENTS_LIST`, `AMNEZIA_START_SCRIPT` через установщик — см. таблицу выше. -После установки: **админ-панель** `http://IP:8080` (или ваш `HOST_PORT`). **Лендинг** с поддержкой по умолчанию на порту **80**; если порт занят, установщик сообщит об ошибке — задайте **`LANDING_PORT=8081`** или **`SKIP_LANDING=1`** (на работу панели это не влияет). Кнопка на лендинге ведёт на админку с тем же `HOST_PORT`. +После установки: **админ-панель** `http://IP:8080` (или ваш `HOST_PORT`). **Лендинг** с инструкцией по умолчанию на порту **80** (без блока доната — только текст администратору и дисклеймер); если порт занят, установщик сообщит об ошибке — задайте **`LANDING_PORT=8081`** или **`SKIP_LANDING=1`** (на работу панели это не влияет). Кнопка на лендинге ведёт на админку с тем же `HOST_PORT`. Футер с ссылками (**Amnezia Admin WebUI**, Boosty, Ozon СБП, Telegram) в админке находится **внизу страницы** — прокрутите ниже таблицы. @@ -237,7 +237,7 @@ ADMIN_PASSWORD=localtest node server.js ## Support links -Как на главной странице установки (**лендинг на порту 80**): **Amnezia Admin WebUI** · GitHub · Boosty · Ozon СБП · Telegram · текст поддержки. +Эти ссылки дублируют блок в **футере админ-панели** (`:8080`). На публичном лендинге **`:80`** этого блока нет — там только напоминание написать администратору сервера. Поддержать проект — поставь звезду на GitHub **И донат**. Связаться с автором — Telegram. @@ -248,11 +248,11 @@ ADMIN_PASSWORD=localtest node server.js | Ozon СБП | [Ozon СБП](https://finance.ozon.ru/apps/sbp/ozonbankpay/019dc200-2a5d-7931-a619-782d285f6798) | | Telegram | [@lot_andrey](https://t.me/lot_andrey) | -Ссылки совпадают с блоком в репозитории [domen_hydra](https://github.com/andrey271192/domen_hydra) (Boosty / Ozon), отображаются на **публичной странице** после установки и в футере админ-панели. +Ссылки совпадают с блоком в репозитории [domen_hydra](https://github.com/andrey271192/domen_hydra) (Boosty / Ozon); в интерфейсе они видны **только в админке**, не на лендинге `:80`. Файл [`.github/FUNDING.yml`](.github/FUNDING.yml) задаёт кнопку **Sponsor** на GitHub. -Тот же блок поддержки продублирован в **футере веб-интерфейса** и на **`http://сервер:80/`** (если лендинг не отключён). +Блок с донатом и ссылками на автора — **только в футере админ-панели**; лендинг на **`http://сервер:80/`** его не показывает. --- diff --git a/landing/index.html b/landing/index.html index cee1a9c..01c7805 100644 --- a/landing/index.html +++ b/landing/index.html @@ -258,18 +258,6 @@ diff --git a/package.json b/package.json index ae44b3a..7b8d720 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "amnezia-admin", - "version": "1.1.0", + "version": "1.1.1", "private": true, "description": "Web-панель AmneziaWG: несколько инстансов, WARP, каскад/Endpoint, экспорт .conf (Docker)", "license": "MIT", diff --git a/server.js b/server.js index fbaa7d0..ed5e758 100644 --- a/server.js +++ b/server.js @@ -798,9 +798,17 @@ function parseInterfaceKeyValues(head) { return out; } +/** Имя файла только из ASCII — иначе Node отклоняет заголовок Content-Disposition. */ function safeExportFilenamePart(name, fallback) { - const s = String(name || fallback || "client").replace(/[^\w\u0400-\u04FF\-]+/g, "_"); - return s.slice(0, 80) || "client"; + const toAsciiToken = (s) => + String(s ?? "") + .normalize("NFKD") + .replace(/[^\x20-\x7E]/g, "") + .replace(/[^a-zA-Z0-9._-]/g, "_") + .replace(/_+/g, "_") + .replace(/^_|_$/g, "") + .slice(0, 80); + return toAsciiToken(name) || toAsciiToken(fallback) || "client"; } function formatExportAllowedIps(lc, fallback = "0.0.0.0/0, ::/0") {