From 33861d98d84dcc54221ff12adf6c6adf31df5d92 Mon Sep 17 00:00:00 2001 From: fontvielle Date: Fri, 16 Oct 2026 13:11:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=BD=D0=BA=D0=B5=D1=82=D0=B0=20=D1=83?= =?UTF-8?q?=D1=87=D0=B0=D1=81=D1=82=D0=BD=D0=B8=D0=BA=D0=B0=20M2M:=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20=D1=87=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=20=D1=88=D0=BB=D1=8E=D0=B7=20=D1=82=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=B2=20=D0=B1=D0=BE=D0=B5=D0=B2?= =?UTF-8?q?=D0=BE=D0=BC=20=D0=BA=D0=BE=D0=BD=D1=82=D1=83=D1=80=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Требование: в тест анкету не слать, подача только в бою. send_igw теперь пропускается лишь при боевом канале ИШ (Channel=PROD, профиль prod-*); в тестовом/гостевом контуре отправка через шлюз заблокирована (кнопка disabled + явный статус, серверная проверка isProdIGW как defense-in-depth). Скачивание XML и письмо на M2MOST@nsd.ru остаются доступны везде. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01XG3zNMMf2LMoDpXo22mwMX --- internal/lkgateway/participant_form.go | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/internal/lkgateway/participant_form.go b/internal/lkgateway/participant_form.go index 73d73cf..d12aa6c 100644 --- a/internal/lkgateway/participant_form.go +++ b/internal/lkgateway/participant_form.go @@ -31,6 +31,12 @@ const participantFormRecipient = "M2MOST@nsd.ru" var pfINNRe = regexp.MustCompile(`^\d{10}$`) var pfCodeRe = regexp.MustCompile(`^MC\d{10}$`) +// isProdIGW — текущий канал ИШ боевой. Анкету участника в НРД шлём ТОЛЬКО в бою: +// в тестовом/гостевом контуре отправка через шлюз заблокирована. +func isProdIGW(channel string) bool { + return strings.HasPrefix(strings.ToUpper(strings.TrimSpace(channel)), "PROD") +} + // participantFormData — поля анкеты (юридические реквизиты организации). type participantFormData struct { INN string @@ -287,6 +293,8 @@ func registerParticipantForm(mux *http.ServeMux, rc *RuntimeConfig, igwClient *i flash, flashKind = "Анкета не прошла проверку — исправьте поля ниже.", "err" case igwClient == nil || igwChannel == "": flash, flashKind = "Боевой ИШ не настроен (раздел «НРД», профиль prod-*). Отправка через шлюз недоступна — переключитесь в боевой контур.", "err" + case !isProdIGW(igwChannel): + flash, flashKind = "Сейчас выбран тестовый контур. Анкету участника шлём только в боевом контуре — переключитесь на профиль prod-* («НРД») и повторите.", "err" default: body, encErr := participantFormBytes(d) if encErr != nil { @@ -311,11 +319,11 @@ func registerParticipantForm(mux *http.ServeMux, rc *RuntimeConfig, igwClient *i } xmlPreview := participantFormXML(d) - participantFormRender(w, d, errs, action, flash, flashKind, xmlPreview, igwClient != nil && igwChannel != "") + participantFormRender(w, d, errs, action, flash, flashKind, xmlPreview, igwClient != nil && igwChannel != "", isProdIGW(igwChannel)) }) } -func participantFormRender(w http.ResponseWriter, d participantFormData, errs []string, action, flash, flashKind, xmlPreview string, igwReady bool) { +func participantFormRender(w http.ResponseWriter, d participantFormData, errs []string, action, flash, flashKind, xmlPreview string, igwConfigured, igwProd bool) { w.Header().Set("Content-Type", "text/html; charset=utf-8") inp := func(name, label, val, ph string) string { return `` @@ -335,9 +343,14 @@ func participantFormRender(w http.ResponseWriter, d participantFormData, errs [] flashHTML = `
` + html.EscapeString(flash) + `
` } igwBtn := `` - igwStatus := `

Боевой ИШ: настроен — анкету можно отправить через шлюз (#M2MPF).

` - if !igwReady { - igwStatus = `

Боевой ИШ: не настроен (раздел «НРД», профиль prod-*). Пока доступны «Скачать» и «Отправить письмом».

` + igwStatus := `

Боевой контур: да — анкету можно отправить через шлюз (#M2MPF).

` + if !igwProd { + igwBtn = `` + if igwConfigured { + igwStatus = `

Контур тестовый — анкету участника в НРД шлём только в боевом контуре. Переключитесь на профиль prod-* («НРД»). Пока доступны «Скачать» и «Отправить письмом».

` + } else { + igwStatus = `

Боевой ИШ: не настроен (раздел «НРД», профиль prod-*). Пока доступны «Скачать» и «Отправить письмом».

` + } } page := `Регистрация участника M2M