Первичная настройка, часть 2: шаг 9 «Оповещения и резервные копии», шаг 10 — итоговая проверка готовности (живые проверки со ссылкой «Исправить»); проверка модуля неторговых поручений QUIK (объекты M2M, инструменты, справочник получателей, цикл, ошибки операций); восстановление из копии на /first-run по одноразовому коду; возврат на тот же шаг мастера после «Сохранить» (return_to с ?step); пароль SMTP не выводится в страницу; карточки почты, адресатов и копий — общие для настроек и мастера
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
package lkgateway
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
@@ -75,3 +77,31 @@ func TestStoreCertKindAndExpiry(t *testing.T) {
|
||||
t.Fatalf("отметка 7 не сохранена: %s", raw)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSafeReturnPathKeepsStep(t *testing.T) {
|
||||
for in, want := range map[string]string{
|
||||
"/admin/wizard?step=4": "/admin/wizard?step=4",
|
||||
"/admin/wizard?step=3&sub=done&flash=x": "/admin/wizard?step=3&sub=done",
|
||||
"/admin/setup#sec-org": "/admin/setup",
|
||||
"/admin/wizard?step=4%0d%0aX": "/admin/wizard",
|
||||
"//evil.example/admin": "",
|
||||
"/admin/x?a=<script>": "/admin/x",
|
||||
} {
|
||||
if got := safeReturnPath(in); got != want {
|
||||
t.Errorf("safeReturnPath(%q)=%q, want %q", in, got, want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestFirstRunRestoreNeedsCode(t *testing.T) {
|
||||
if !authExempt("/first-run/backup/list") || authExempt("/first-runx") {
|
||||
t.Fatal("пути восстановления при первичной настройке должны быть без входа, но не шире")
|
||||
}
|
||||
mux := http.NewServeMux()
|
||||
registerFirstRunRestore(mux)
|
||||
rec := httptest.NewRecorder()
|
||||
mux.ServeHTTP(rec, httptest.NewRequest(http.MethodPost, "/first-run/backup/restore", strings.NewReader("code=1234&name=2026-10-05_1445")))
|
||||
if !strings.Contains(rec.Body.String(), `"ok":false`) {
|
||||
t.Fatalf("без ожидающей первичной настройки восстановление не должно запускаться: %s", rec.Body.String())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user