Ключ подписи ставится прямо в мастере (шаг «Ключ подписи»), а не на отдельной странице

- Мастер установки ключа — общий блок part_keywiz.html: на шаге мастера и на
  странице /admin/setup/keywizard. Формы возвращают туда, откуда открыли (ret=
  wizard), с выбранным контуром; вид — как у мастера.
- «Установить ключ» у канала на шаге «Шлюз НРД» ведёт на шаг «Ключ подписи» с
  контуром этого канала.
- Подсказка «сначала установите шлюз» — по установленному ИШ (раньше — по
  готовности шлюза, которая сама требует ключа).

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 17:50:34 +03:00
parent 71be8f2052
commit 5af3c5e3ba
7 changed files with 183 additions and 121 deletions
+40 -15
View File
@@ -105,6 +105,39 @@ type keyWizardData struct {
Drives []flashDrive
SuggestContour string // контур по сертификату в архиве: test3 (издатель «Тестовый УЦ») | prod | "" (не понятно)
SuggestIssuer string
WantContour string // контур, для которого открыли установку (кнопка «Установить ключ» у канала)
InWizard bool // блок — на шаге мастера: формы возвращают туда же
}
// keyWizView — данные блока установки ключа (want — контур, у которого нажали «Установить ключ»).
func (h *setupHandlers) keyWizView(want string, inWizard bool) *keyWizardData {
if h.keyWiz == nil { // обработчики без мастера ключа (тесты)
h.keyWiz = newKeyWizardState()
}
h.keyWiz.mu.Lock()
st := h.keyWiz
h.keyWiz.mu.Unlock()
d := &keyWizardData{State: st, InWizard: inWizard}
if want == "test3" || want == "prod" {
d.WantContour = want
}
if st.StagingID != "" && !st.Done { // список флешек — на шаге выбора носителя (архив уже загружен)
d.Drives = listFlashDrives()
d.SuggestContour, d.SuggestIssuer = keyArchiveContour(filepath.Join("/var/lib/bj/media/iso", st.StagingID))
}
return d
}
// keyWizBack — куда вернуться после действия: на шаг мастера (ret=wizard) или на отдельную страницу.
func keyWizBack(r *http.Request) string {
u := "/admin/setup/keywizard?"
if r.FormValue("ret") == "wizard" {
u = "/admin/wizard?step=8&"
}
if c := r.FormValue("want"); c == "test3" || c == "prod" {
u += "contour=" + c + "&"
}
return u
}
// keyArchiveContour — контур ключа по сертификатам в распакованном архиве (не самоподписанным — это УЦ):
@@ -229,25 +262,17 @@ func (h *setupHandlers) renderKeyWizard(w http.ResponseWriter, r *http.Request)
}
h.keyWiz.mu.Lock()
h.keyWiz.Flash = r.URL.Query().Get("flash")
st := h.keyWiz
h.keyWiz.mu.Unlock()
// Список флешек нужен на шаге выбора носителя (когда архив уже загружен).
var drives []flashDrive
if st.StagingID != "" && !st.Done {
drives = listFlashDrives()
}
d := keyWizardData{page: nowPage("Установка ключа", "setup"), State: st, Drives: drives}
if st.StagingID != "" && !st.Done {
d.SuggestContour, d.SuggestIssuer = keyArchiveContour(filepath.Join("/var/lib/bj/media/iso", st.StagingID))
}
render(w, h.tpl.a.keyWizard, d)
d := h.keyWizView(r.URL.Query().Get("contour"), false)
d.page = nowPage("Установка ключа", "setup")
render(w, h.tpl.a.keyWizard, *d)
}
func (h *setupHandlers) keyWizardReset(w http.ResponseWriter, r *http.Request) {
h.keyWiz.mu.Lock()
h.keyWiz.reset()
h.keyWiz.mu.Unlock()
http.Redirect(w, r, "/admin/setup/keywizard", http.StatusSeeOther)
http.Redirect(w, r, strings.TrimRight(keyWizBack(r), "?&"), http.StatusSeeOther)
}
// keyWizardUpload — шаг 1: приём .7z + пароль, распаковка, инспекция.
@@ -320,7 +345,7 @@ func (h *setupHandlers) keyWizardUpload(w http.ResponseWriter, r *http.Request)
h.keyWiz.set(1, "active", "")
h.keyWiz.mu.Unlock()
http.Redirect(w, r, "/admin/setup/keywizard", http.StatusSeeOther)
http.Redirect(w, r, strings.TrimRight(keyWizBack(r), "?&"), http.StatusSeeOther)
}
// keyWizardInstall — шаги 2-5: запись на флешку, справочник, проверка, готово.
@@ -427,7 +452,7 @@ func (h *setupHandlers) keyWizardInstall(w http.ResponseWriter, r *http.Request)
if dev {
final += " Финальная проверка — тестовым документом роботу."
}
http.Redirect(w, r, "/admin/setup/keywizard?flash="+urlQ(final), http.StatusSeeOther)
http.Redirect(w, r, keyWizBack(r)+"flash="+urlQ(final), http.StatusSeeOther)
}
// restartAndVerifyISH перезапускает Интеграционный шлюз и проверяет, что он
@@ -635,7 +660,7 @@ func runKeymediaOp(ctx context.Context, action string, fields map[string]string)
}
func (h *setupHandlers) keyWizFlash(w http.ResponseWriter, r *http.Request, msg string) {
http.Redirect(w, r, "/admin/setup/keywizard?flash="+urlQ(msg), http.StatusSeeOther)
http.Redirect(w, r, keyWizBack(r)+"flash="+urlQ(msg), http.StatusSeeOther)
}
func fallback(s, def string) string {