From f51414269db2837d4e556d06ad84a43bc2c59536 Mon Sep 17 00:00:00 2001 From: zuevav Date: Fri, 18 Sep 2026 09:42:58 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D0=BA=D0=B8:=20=D0=BA=D0=BB=D1=8E=D1=87=20=D0=BA=D0=B0=D0=B1?= =?UTF-8?q?=D0=B8=D0=BD=D0=B5=D1=82=D0=B0=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D1=86=D0=B5=D0=BB?= =?UTF-8?q?=D0=B8=D0=BA=D0=BE=D0=BC=20=E2=80=94=20=D0=B7=D0=B0=D0=BA=D1=80?= =?UTF-8?q?=D1=8B=D1=82=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=BD=D1=82=D1=83=D1=80?= =?UTF-8?q?,=20=D0=BD=D1=83=D0=B6=D0=B5=D0=BD=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B5=20=D0=BA=D0=B0=D0=B1=D0=B8=D0=BD=D0=B5=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 --- internal/lkgateway/lkdist.go | 18 +++++------------- internal/lkgateway/lkusers_admin_test.go | 9 +++------ .../lkgateway/web/templates/admin_help_lk.html | 2 +- .../lkgateway/web/templates/admin_setup.html | 2 +- 4 files changed, 10 insertions(+), 21 deletions(-) diff --git a/internal/lkgateway/lkdist.go b/internal/lkgateway/lkdist.go index bc5c3c2..d87f368 100644 --- a/internal/lkgateway/lkdist.go +++ b/internal/lkgateway/lkdist.go @@ -49,17 +49,10 @@ func lkNewAPIKey() (string, error) { return "lk-" + hex.EncodeToString(b), nil } -// lkKeyRevealUntil — до какого момента ключ на странице настроек показывается целиком: -// сразу после создания администратору нужно переписать его в установщик кабинета. -var lkKeyRevealUntil time.Time - -// lkKeyForPage — ключ для страницы настроек: целиком сразу после создания, потом маска. -func lkKeyForPage(key string) string { - if key != "" && time.Now().Before(lkKeyRevealUntil) { - return key - } - return maskSecret(key) -} +// lkKeyForPage — ключ для страницы настроек. Показывается целиком: настройки ядра — +// закрытый контур, а при переустановке кабинета ключ нужно переписать в установщик; +// маскированный пришлось бы пересоздавать и менять на всех кабинетах. +func lkKeyForPage(key string) string { return key } // maskSecret — показать ключ так, чтобы его нельзя было списать со скриншота, // но можно было сверить с тем, что стоит у кабинета. @@ -320,8 +313,7 @@ func (h *setupHandlers) lkSaveDist(w http.ResponseWriter, r *http.Request) { return } s.APIKey = key - lkKeyRevealUntil = time.Now().Add(10 * time.Minute) // показать целиком один раз, чтобы переписать в установщик - msg = "Создан новый ключ доступа кабинета. Он показан целиком ниже в течение 10 минут — введите его в установщике кабинета (или в lk.env) и перезапустите службу кабинета, если она уже работала." + msg = "Создан новый ключ доступа кабинета. Введите его в установщике кабинета (или в lk.env); если кабинет уже работал — удалите там lk.json и пройдите установщик заново либо впишите ключ в lk.env и перезапустите службу." case "clearkey": s.APIKey = "" msg = "Ключ удалён: кабинет больше не сможет обращаться к ядру." diff --git a/internal/lkgateway/lkusers_admin_test.go b/internal/lkgateway/lkusers_admin_test.go index 6cf8b0b..45bd01f 100644 --- a/internal/lkgateway/lkusers_admin_test.go +++ b/internal/lkgateway/lkusers_admin_test.go @@ -19,7 +19,7 @@ func TestSetupPageLKUsersAndLink(t *testing.T) { rec := httptest.NewRecorder() render(rec, a.setup, SetupData{ page: nowPage("Настройка", "setup"), Settings: s, - LKKeyMask: maskSecret(s.LK.APIKey), LKAgent: lkAgentStatus(s), + LKKeyMask: lkKeyForPage(s.LK.APIKey), LKAgent: lkAgentStatus(s), LKUsers: []LKUser{ {ID: 1, Login: "manager", Contract: "ADMIN", FullName: "Сотрудник", Active: true, IsAdmin: true}, {ID: 2, Login: "br859", Contract: "БР-859", Active: false}, @@ -35,10 +35,7 @@ func TestSetupPageLKUsersAndLink(t *testing.T) { t.Errorf("в странице нет %q", want) } } - if strings.Contains(body, s.LK.APIKey) { - t.Error("ключ кабинета показан целиком без создания") - } - if !strings.Contains(body, "lk-0123") { - t.Error("маска ключа не показана") + if !strings.Contains(body, s.LK.APIKey) { + t.Error("ключ кабинета должен быть показан целиком: понадобится при переустановке") } } diff --git a/internal/lkgateway/web/templates/admin_help_lk.html b/internal/lkgateway/web/templates/admin_help_lk.html index bd9f90b..4f13c67 100644 --- a/internal/lkgateway/web/templates/admin_help_lk.html +++ b/internal/lkgateway/web/templates/admin_help_lk.html @@ -6,7 +6,7 @@

Речь о нашем модуле bj-lk — кабинете, который клиенты открывают в браузере. Он ставится отдельно от ядра: на веб-сервер депозитария или на обычный хостинг с выделенным именем. Своей базы у кабинета нет, данные клиентов он не хранит — берёт у ядра на время запроса.

Шаг 1. Ключ и архив

-

Настройки → «Личный кабинет» → «Кабинет клиента на своём сервере»: создайте ключ доступа (сразу после создания он показан целиком 10 минут — перепишите его для установщика) и скачайте архив. В архиве — исполняемый файл, служба systemd, файл настроек службы, установщик и README. Ключа в архиве нет.

+

Настройки → «Личный кабинет» → «Кабинет клиента на своём сервере»: создайте ключ доступа (он показан на странице целиком — его нужно ввести в установщике) и скачайте архив. В архиве — исполняемый файл, служба systemd, файл настроек службы, установщик и README. Ключа в архиве нет.

Шаг 2. Файлы на сервер и запуск

tar xzf bj-lk-ГГГГ-ММ-ДД.tar.gz
diff --git a/internal/lkgateway/web/templates/admin_setup.html b/internal/lkgateway/web/templates/admin_setup.html
index 359fe6b..15a57d2 100644
--- a/internal/lkgateway/web/templates/admin_setup.html
+++ b/internal/lkgateway/web/templates/admin_setup.html
@@ -617,7 +617,7 @@ function hbBind(inp,box,list,onPick){
             
             {{if .Settings.LK.APIKey}}{{end}}
           
-          Ключ показан не полностью. В архив он не попадает: его вводят в установщике кабинета (или вписывают в lk.env при установке без браузера). Целиком ключ виден один раз — сразу после создания.
+          В архив ключ не попадает: его вводят в установщике кабинета (или вписывают в lk.env при установке без браузера). Здесь он показан целиком — понадобится при переустановке кабинета.