Ключ: мастер не пишет «Готово» при ошибке; справочник подготовленной флешки — как есть; проверка подписи

- Мастер смотрел не на итог установщика, а ставил галочки подряд: при «ошибке
  пересборки» и несформированном профиле ИШ показывал «Готово». Теперь этап с
  ошибкой — красный, причина — в сообщении, «Готово» — только когда справочник
  собран, профиль ИШ создан и ключ подписывает (оба пути — флешка и архив).
- Подготовленная флешка: справочник на ней уже совместимый (пересобран при первой
  установке) — если пересборка не удалась, берётся как есть (gdbm cf9a5713;
  архивный НРД ce9a5713 — только с пересборкой).
- В конце установки — проверка под igate: ключ подписывает проверочный документ
  профилем ИШ; не подписывает — понятная ошибка («вставлена ли флешка?»).

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 18:41:10 +03:00
parent c616d83a5c
commit fb2fc15569
4 changed files with 74 additions and 5 deletions
+32 -1
View File
@@ -312,7 +312,13 @@ func (h *setupHandlers) keyWizardUseMedia(w http.ResponseWriter, r *http.Request
rebuild, _ := res["rebuild"].(string)
igate, _ := res["igate"].(string)
h.keyWiz.set(1, "ok", "Флешка "+dev+" подключена к ИШ только для чтения — на неё ничего не записано")
h.keyWiz.set(2, "ok", fmt.Sprintf("Справочник для ИШ собран на диске (%s); профиль «%s» %s", rebuildRu(rebuild), h.keyWiz.Profile, igateRu(igate)))
if bad := keyInstallProblem(res); bad != "" {
h.keyWiz.set(2, "error", bad)
h.keyWiz.mu.Unlock()
h.keyWizFlash(w, r, "Ключ с флешки не подключён: "+bad)
return
}
h.keyWiz.set(2, "ok", fmt.Sprintf("Справочник для ИШ (%s); профиль «%s» %s ключ подписывает", rebuildRu(rebuild), h.keyWiz.Profile, igateRu(igate)))
h.keyWiz.set(3, "active", "")
h.keyWiz.mu.Unlock()
@@ -539,6 +545,12 @@ func (h *setupHandlers) keyWizardInstall(w http.ResponseWriter, r *http.Request)
rebuild, _ := res["rebuild"].(string)
igate, _ := res["igate"].(string)
igp, _ := res["igate_profile_dir"].(string)
if bad := keyInstallProblem(res); bad != "" {
h.keyWiz.set(2, "error", bad)
h.keyWiz.mu.Unlock()
h.keyWizFlash(w, r, "Ключ записан на флешку, но не подключён: "+bad)
return
}
h.keyWiz.set(2, "ok", fmt.Sprintf("Справочник «%s» пересобран (%s); профиль ИШ %s %s",
fallback(spr, "—"), rebuildRu(rebuild), igateRu(igate), igp))
h.keyWiz.set(3, "active", "")
@@ -639,10 +651,29 @@ func crlRu(s string) string {
}
// rebuildRu — статус пересборки справочника сертификатов на флешке.
// keyInstallProblem — что не так в итоге установщика ключа (пусто — ключ подключён и подписывает).
// Раньше мастер ставил галочки по порядку, даже если справочник не собрался и профиль ИШ не создан.
func keyInstallProblem(res map[string]any) string {
rebuild, _ := res["rebuild"].(string)
igate, _ := res["igate"].(string)
check, _ := res["keycheck"].(string)
switch {
case rebuild != "ok" && rebuild != "as-is":
return "справочник сертификатов не собран — " + rebuildRu(rebuild)
case igate != "connected" && igate != "pending-channel":
return "профиль ИШ не сформирован — " + strings.TrimSuffix(igateRu(igate), ":")
case strings.HasPrefix(check, "fail"):
return "ключ не подписывает: " + strings.TrimPrefix(check, "fail: ") + " — вставлена ли флешка с ключом?"
}
return ""
}
func rebuildRu(s string) string {
switch {
case s == "ok":
return "совместимый формат, сертификаты извлечены из архива"
case s == "as-is":
return "справочник с флешки уже совместимый — взят как есть"
case s == "skip":
return "пропущено"
case strings.HasPrefix(s, "fail"):