Первичная настройка, повторная проверка: копии без ключевых носителей СКЗИ (--one-file-system, без keymedia), без отпечатка железа и списка компонентов; восстановление на новый сервер — пароль базы bj из копии, база и пользователь ИШ; ключ для контура без канала запоминается и подключается при настройке канала; первый настроенный канал становится рабочим контуром; справочник сертификатов перечитывается после ключа и смены контура; шлюз НРД — шаг 7, ключ — шаг 8 (ключ ставится в профиль ИШ); подсказка контура ключа по сертификату; ИШ: параметры работающего шлюза не перезаписываются; без чужого кода отправителя и получателя по умолчанию; прокси для выхода в интернет; установка с образа без интернета; HTTPS — новый сертификат при смене адреса; bj-network — без cloud-init; проверка готовности: справочник участников, сетевые доступы, учётные записи, последний обмен с НРД

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-10-05 17:33:10 +03:00
parent 765d7b5994
commit 10305a095e
25 changed files with 634 additions and 95 deletions
+51
View File
@@ -1,6 +1,8 @@
package lkgateway
import (
"context"
"errors"
"net/http"
"net/http/httptest"
"os"
@@ -144,3 +146,52 @@ func TestHTTPSSelfSignedAndRedirect(t *testing.T) {
}
}
}
func TestReceiverUnknownRejected(t *testing.T) {
if !handbookLoaded() {
t.Skip("справочник участников не вшит")
}
svc := &Service{defaultSender: "MC0413600000", defaultReceiver: "MC0010300000"}
if _, err := svc.BuildRequest(context.Background(), CreateClaimRequest{ReceivingDepositoryINN: "0000000001"}); err == nil || !errors.Is(err, errReceiverUnknown) {
t.Fatalf("неизвестный депозитарий получателя должен давать errReceiverUnknown, а не чужой код: %v", err)
}
}
func TestBuildRequestNeedsOrganization(t *testing.T) {
svc := &Service{}
if _, err := svc.BuildRequest(context.Background(), CreateClaimRequest{}); err == nil || !strings.Contains(err.Error(), "организация не задана") {
t.Fatalf("без кода отправителя перевод не должен формироваться: %v", err)
}
}
func TestProxyBypass(t *testing.T) {
for host, want := range map[string]bool{"localhost": true, "10.10.10.21": true, "192.168.1.5": true, "127.0.0.1": true, "sql002": true, "bj.local": true,
"lic.zetit.ru": false, "www.nsd.ru": false, "8.8.8.8": false, "corp.example.ru": true, "a.corp.example.ru": true} {
if got := proxyBypass(host, "corp.example.ru"); got != want {
t.Errorf("proxyBypass(%s)=%v, want %v", host, got, want)
}
}
p := ProxySettings{Address: "proxy.example.ru:3128", User: "u", Password: "p@ss"}
if u := p.url(); u == nil || u.String() != "http://u:p%40ss@proxy.example.ru:3128" {
t.Errorf("url: %v", u)
}
}
func TestKeyArchiveContour(t *testing.T) {
dir := t.TempDir()
raw, err := nsdCertsFS.ReadFile("nsd-certs/nsd-test-gost-petrov-20240924.cer")
if err != nil {
t.Skip(err)
}
_ = os.MkdirAll(filepath.Join(dir, "spr1"), 0o755)
_ = os.WriteFile(filepath.Join(dir, "spr1", "user.cer"), raw, 0o644)
if c, iss := keyArchiveContour(dir); c != "test3" || iss == "" {
t.Fatalf("тестовый сертификат: %q %q", c, iss)
}
raw, _ = nsdCertsFS.ReadFile("nsd-certs/nsd-prod-gost-shlyappo-20260821.cer")
dir2 := t.TempDir()
_ = os.WriteFile(filepath.Join(dir2, "user.cer"), raw, 0o644)
if c, _ := keyArchiveContour(dir2); c != "prod" {
t.Fatalf("боевой сертификат: %q", c)
}
}