Канал ИШ: необязательные параметры — NULL (иначе ИШ молча выкидывал канал); мастер: шаг «Учётные записи», HTTPS сразу, DEPO без процедур — не блокирует

- bj-igate-admin: пустые строки в числовых/интервальных параметрах канала ИШ разбирал с ошибкой и не
  загружал канал («There are no active channels», API 500 «more than one Channel…»); теперь NULL, как пишет
  интерфейс ИШ; старые каналы чинятся при «Создать канал»; папка архивов 1042S — по имени
- проверка «Шлюз НРД»: канал контура действительно загружен и включён (api/admin/channels/wsl)
- «Учёт DEPO»: нет процедур bj2depo — жёлтое «не забудьте доустановить», не блокирует
- HTTPS: перенаправление с http:// включено по умолчанию, только когда HTTPS реально слушает порт
- мастер: шаг «Учётные записи» (роли, создание, «Придумать пароль») перед проверкой; письма с проверки убраны;
  форма «создать» не меняет существующую запись с тем же логином

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-06 23:19:01 +03:00
parent b3f3454e4a
commit 44f00a006a
12 changed files with 264 additions and 47 deletions
+27
View File
@@ -157,3 +157,30 @@ func TestSMTPTestTo(t *testing.T) {
t.Errorf("без поля — прежний: %q", got)
}
}
// Форма «Создать учётную запись» из мастера не меняет существующего пользователя с тем же логином.
func TestCreateUserLoginTaken(t *testing.T) {
old := usersFile
usersFile = filepath.Join(t.TempDir(), "users.json")
defer func() { usersFile = old }()
prev := globalUsers
globalUsers = &userStore{users: map[string]*User{}}
defer func() { globalUsers = prev }()
if err := globalUsers.Put(&User{Login: "admin", Role: "admin", Source: "local", Active: true}); err != nil {
t.Fatal(err)
}
h := &setupHandlers{}
r := httptest.NewRequest(http.MethodPost, "/admin/setup/users", strings.NewReader("login=admin&role=viewer&create=1&password=12345678&return_to=%2Fadmin%2Fwizard%3Fstep%3D13"))
r.Header.Set("Content-Type", "application/x-www-form-urlencoded")
w := httptest.NewRecorder()
h.saveUser(w, r)
if u := globalUsers.Get("admin"); u == nil || u.Role != "admin" {
t.Fatalf("существующий администратор изменён: %+v", u)
}
if loc := w.Header().Get("Location"); !strings.HasPrefix(loc, "/admin/wizard?step=13") || !strings.Contains(loc, "flash=") {
t.Fatalf("возврат в мастер: %q", loc)
}
if doneUsers() {
t.Fatal("один администратор — шаг не выполнен")
}
}