From fcded5fe17223325bfd11b623ae0ff0bfc21d1ca Mon Sep 17 00:00:00 2001 From: zuevav Date: Fri, 18 Sep 2026 20:05:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0:=20?= =?UTF-8?q?=D1=82=D0=B5=D1=85=D0=BD=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B=20?= =?UTF-8?q?=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=B2=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=88=D0=B5=D0=B9=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B5=20(bu?= =?UTF-8?q?ild-tag=20internaldocs)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Из клиентской сборки убрана проектная документация, читавшаяся прямым `strings`: архитектура обмена с НРД, протокол событий bj↔bj2depo (FTV_M2M, 41 КБ), схема базы, криптография, QUIK МНП. Это самая крупная и самая дешёвая утечка знаний — её не нужно было даже декомпилировать. Файлы перенесены в web/templates/internal/ (выпадают из общего embed-глоба) и встраиваются только при `go build -tags internaldocs` (internaldocs_on.go). По умолчанию (клиентский релиз, build-release.sh) страницы заменяются заглушкой «доступно на портале» (internaldocs_off.go); ссылки на них в индексе справки показываются под {{if internalDocs}}. Операторские страницы (ручной ввод, робот, внешние системы, API ЛК) остаются — они нужны на месте. Клиентская сборка: -27 тыс. символов внутренней документации, «Согласовано 10.09», «Для программиста Fancy», «как устроен обмен» → 0 совпадений. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL --- internal/lkgateway/admin.go | 31 ++++++++++--------- internal/lkgateway/internaldocs_off.go | 28 +++++++++++++++++ internal/lkgateway/internaldocs_on.go | 26 ++++++++++++++++ .../lkgateway/web/templates/admin_help.html | 20 ++++++------ .../admin_help_architecture.html | 0 .../{ => internal}/admin_help_crypto.html | 0 .../{ => internal}/admin_help_database.html | 0 .../admin_help_fancy_events.html | 0 .../{ => internal}/admin_help_quik.html | 0 scripts/build-release.sh | 4 +++ 10 files changed, 84 insertions(+), 25 deletions(-) create mode 100644 internal/lkgateway/internaldocs_off.go create mode 100644 internal/lkgateway/internaldocs_on.go rename internal/lkgateway/web/templates/{ => internal}/admin_help_architecture.html (100%) rename internal/lkgateway/web/templates/{ => internal}/admin_help_crypto.html (100%) rename internal/lkgateway/web/templates/{ => internal}/admin_help_database.html (100%) rename internal/lkgateway/web/templates/{ => internal}/admin_help_fancy_events.html (100%) rename internal/lkgateway/web/templates/{ => internal}/admin_help_quik.html (100%) diff --git a/internal/lkgateway/admin.go b/internal/lkgateway/admin.go index 65512a1..bad1050 100644 --- a/internal/lkgateway/admin.go +++ b/internal/lkgateway/admin.go @@ -49,16 +49,17 @@ var templateFuncs = template.FuncMap{ return template.URL(uri) }, // m2mCode — человекочитаемое название кода M2M: «Текст (M2Mxx)». - "m2mCode": m2mCodeLabel, - "quikCodeMap": quikClientCodeMapText, - "curUser": authTemplateFuncs["curUser"], - "can": authTemplateFuncs["can"], - "devOn": authTemplateFuncs["devOn"], - "devLicensed": authTemplateFuncs["devLicensed"], - "authOpen": authOpen, - "roleTitle": roleTitle, - "stageCls": func(r depoQueueRow) string { c, _ := r.StageRu(); return c }, - "stageText": func(r depoQueueRow) string { _, t := r.StageRu(); return t }, + "m2mCode": m2mCodeLabel, + "quikCodeMap": quikClientCodeMapText, + "curUser": authTemplateFuncs["curUser"], + "can": authTemplateFuncs["can"], + "devOn": authTemplateFuncs["devOn"], + "devLicensed": authTemplateFuncs["devLicensed"], + "authOpen": authOpen, + "internalDocs": func() bool { return internalDocsBuilt }, + "roleTitle": roleTitle, + "stageCls": func(r depoQueueRow) string { c, _ := r.StageRu(); return c }, + "stageText": func(r depoQueueRow) string { _, t := r.StageRu(); return t }, "deref": func(v *float64) float64 { if v == nil { return 0 @@ -240,7 +241,7 @@ func newAdmin() (*admin, error) { if err != nil { return nil, fmt.Errorf("parse admin_help: %w", err) } - helpDB, err := parse("admin_help_database.html") + helpDB, err := parseInternalDoc("admin_help_database.html") if err != nil { return nil, fmt.Errorf("parse admin_help_database: %w", err) } @@ -248,7 +249,7 @@ func newAdmin() (*admin, error) { if err != nil { return nil, fmt.Errorf("parse admin_help_lk: %w", err) } - helpCrypto, err := parse("admin_help_crypto.html") + helpCrypto, err := parseInternalDoc("admin_help_crypto.html") if err != nil { return nil, fmt.Errorf("parse admin_help_crypto: %w", err) } @@ -268,15 +269,15 @@ func newAdmin() (*admin, error) { if err != nil { return nil, fmt.Errorf("parse admin_help_robot: %w", err) } - helpArch, err := parse("admin_help_architecture.html") + helpArch, err := parseInternalDoc("admin_help_architecture.html") if err != nil { return nil, fmt.Errorf("parse admin_help_architecture: %w", err) } - helpQuik, err := parse("admin_help_quik.html") + helpQuik, err := parseInternalDoc("admin_help_quik.html") if err != nil { return nil, fmt.Errorf("parse admin_help_quik: %w", err) } - helpFancyEvents, err := parse("admin_help_fancy_events.html") + helpFancyEvents, err := parseInternalDoc("admin_help_fancy_events.html") if err != nil { return nil, fmt.Errorf("parse admin_help_fancy_events: %w", err) } diff --git a/internal/lkgateway/internaldocs_off.go b/internal/lkgateway/internaldocs_off.go new file mode 100644 index 0000000..13c7784 --- /dev/null +++ b/internal/lkgateway/internaldocs_off.go @@ -0,0 +1,28 @@ +//go:build !internaldocs + +package lkgateway + +// internaldocs_off.go — КЛИЕНТСКАЯ сборка (по умолчанию, без флага internaldocs): +// технические страницы справки (архитектура обмена с НРД, протокол событий +// bj↔bj2depo, схема базы, криптография, QUIK МНП) в бинарь НЕ попадают. Это +// проектная документация, из которой видно, как устроен продукт; операторам +// депозитария она не нужна, а конкуренту дала бы готовую карту. Внедренцам +// эти страницы доступны в нашей сборке (go build -tags internaldocs) и на портале. + +import "html/template" + +// internalDocsBuilt — технических страниц справки в этом бинаре нет. +const internalDocsBuilt = false + +const internalDocsStub = `← все инструкции +

Техническая документация

+

Подробные технические материалы (архитектура обмена с НРД, протоколы интеграции, схема базы данных) не входят в рабочую сборку. Они доступны специалистам внедрения на портале lic.zetit.ru и в документации, переданной по договору.

` + +// parseInternalDoc — заглушка: содержимого нет, показываем, куда обратиться. +func parseInternalDoc(_ string) (*template.Template, error) { + t := template.New("layout.html").Funcs(templateFuncs) + if _, err := t.ParseFS(templatesFS, "web/templates/layout.html"); err != nil { + return nil, err + } + return t.New("content").Parse(internalDocsStub) +} diff --git a/internal/lkgateway/internaldocs_on.go b/internal/lkgateway/internaldocs_on.go new file mode 100644 index 0000000..fd300f9 --- /dev/null +++ b/internal/lkgateway/internaldocs_on.go @@ -0,0 +1,26 @@ +//go:build internaldocs + +package lkgateway + +// internaldocs_on.go — сборка ДЛЯ НАС (флаг internaldocs): технические страницы +// справки встроены. Собирать: go build -tags internaldocs. + +import ( + "embed" + "html/template" +) + +//go:embed web/templates/internal/*.html +var internalDocsFS embed.FS + +// internalDocsBuilt — технические страницы справки вшиты в этот бинарь. +const internalDocsBuilt = true + +// parseInternalDoc — страница внедрения (layout из основного FS + сам документ). +func parseInternalDoc(name string) (*template.Template, error) { + t := template.New("layout.html").Funcs(templateFuncs) + if _, err := t.ParseFS(templatesFS, "web/templates/layout.html"); err != nil { + return nil, err + } + return t.ParseFS(internalDocsFS, "web/templates/internal/"+name) +} diff --git a/internal/lkgateway/web/templates/admin_help.html b/internal/lkgateway/web/templates/admin_help.html index 6802582..8b18b26 100644 --- a/internal/lkgateway/web/templates/admin_help.html +++ b/internal/lkgateway/web/templates/admin_help.html @@ -5,24 +5,24 @@
- + {{if internalDocs}}

База данных →

PostgreSQL: подключение, схемы fansy / fansy_staging / m2m_core, что подгружается извне (ETL Fansy) и что пишет сама система. Учётные записи, гранты, миграции.

-
+ {{end}}

API личного кабинета →

REST-контракт ESIA Finance V1: POST /api/v1/back_office/claims/, GET/PATCH-операции, формат callback'ов, аутентификация Basic, примеры запросов curl.

- + {{if internalDocs}}

Криптография (Валидата) →

Установка АПК «Валидата Клиент L» на Astra Linux SE, подключение через PKCS#11, проверка подписи и квитанций НРД.

-
+ {{end}}

Внешние системы →

@@ -41,23 +41,23 @@

Робот НРД на TEST3 (код MC0012500000), 4 тестовых сценария (отказ / принять все / частично / встречный перевод), управление через DocumentSeries и DocumentNumber, тестовые наборы депозитариев и кодов ошибок.

{{end}} - + {{if internalDocs}}

Архитектура обмена с НРД →

Полная схема: bj-server → ИШ (на Astra Linux ВМ) → ONYX (НРД) → {{if devOn}}робот-автотест{{else}}депозитарий-контрагент{{end}}. Кто на чьей стороне, какое СКЗИ, какие сертификаты, FAQ.

-
- + {{end}} + {{if internalDocs}}

bj ↔ bj2depo: трансферные таблицы и события — для программиста Fancy →

FTV_M2M / FTV_M2M_LINES / FTV_M2M_EVENTS: какие идентификаторы даёт bj, словарь событий в обе стороны (BJ_* и DEPO_*), правила STATE и идемпотентности, порядок по этапам, примеры SQL, открытые вопросы.

-
- + {{end}} + {{if internalDocs}}

QUIK МНП: подготовка к M2M — для администратора QUIK →

Чек-лист для QUIK Administrator: классы INSTROUTM2M / INSTRINM2M, инструменты, включение типов «Ввод/Вывод ЦБ М2М», права технологического пользователя, перезапуск модуля. Со ссылками на страницы документов ARQA и разбором ошибок.

-
+ {{end}}
{{end}} diff --git a/internal/lkgateway/web/templates/admin_help_architecture.html b/internal/lkgateway/web/templates/internal/admin_help_architecture.html similarity index 100% rename from internal/lkgateway/web/templates/admin_help_architecture.html rename to internal/lkgateway/web/templates/internal/admin_help_architecture.html diff --git a/internal/lkgateway/web/templates/admin_help_crypto.html b/internal/lkgateway/web/templates/internal/admin_help_crypto.html similarity index 100% rename from internal/lkgateway/web/templates/admin_help_crypto.html rename to internal/lkgateway/web/templates/internal/admin_help_crypto.html diff --git a/internal/lkgateway/web/templates/admin_help_database.html b/internal/lkgateway/web/templates/internal/admin_help_database.html similarity index 100% rename from internal/lkgateway/web/templates/admin_help_database.html rename to internal/lkgateway/web/templates/internal/admin_help_database.html diff --git a/internal/lkgateway/web/templates/admin_help_fancy_events.html b/internal/lkgateway/web/templates/internal/admin_help_fancy_events.html similarity index 100% rename from internal/lkgateway/web/templates/admin_help_fancy_events.html rename to internal/lkgateway/web/templates/internal/admin_help_fancy_events.html diff --git a/internal/lkgateway/web/templates/admin_help_quik.html b/internal/lkgateway/web/templates/internal/admin_help_quik.html similarity index 100% rename from internal/lkgateway/web/templates/admin_help_quik.html rename to internal/lkgateway/web/templates/internal/admin_help_quik.html diff --git a/scripts/build-release.sh b/scripts/build-release.sh index 0a0cb17..8fbc76a 100755 --- a/scripts/build-release.sh +++ b/scripts/build-release.sh @@ -21,6 +21,10 @@ rm -rf "$DIST" && mkdir -p "$DIST" cd "$ROOT" ver() { eval "v=\${$1:-}"; [ -n "$v" ] && echo "$v" || echo "$VERSION"; } echo "Сборка релиза $VERSION (канал $CHANNEL) в $DIST" +# ВАЖНО: клиентский релиз собирается БЕЗ тега internaldocs — технические страницы +# справки (архитектура НРД, протокол FTV_M2M, схема базы, крипто, QUIK) в бинарь не +# попадают (см. internal/lkgateway/internaldocs_off.go). Свою сборку со справкой +# делаем отдельно: go build -tags internaldocs. Не добавляйте этот тег сюда. go build -trimpath -ldflags "-s -w -X $MOD/internal/lkgateway.BuildVersion=$(ver BJ_SERVER_VERSION)" -o "$DIST/bj-server" ./cmd/bj-server CGO_ENABLED=0 go build -trimpath -ldflags "-s -w -X main.installerVersion=$(ver INSTALLER_VERSION)" -o "$DIST/bj-installer" ./cmd/bj-installer CGO_ENABLED=0 go build -trimpath -ldflags "-s -w -X main.version=$(ver COMPONENT_INSTALL_VERSION)" -o "$DIST/bj-component-install" ./cmd/bj-component-install