Статус: карточка ключа организации — контур и пометка «ИСТЁК»; SMB-пароль папок шлюза — генерация и показ

Ключ организации на странице «Статус» теперь строится из своего сертификата
в справочнике активного профиля ИШ (ownStoreCerts), включая истёкший: карточка
показывает владельца, издателя, контур (боевой/тестовый) и срок. Истёкший ключ
виден явной пометкой «ИСТЁК» и отдельным заголовком, а не маскируется под
«ключ не подключён». Показать владельца ДО установки ключа нельзя — сертификата
нет в файлах флешки, он появляется в справочнике профиля только после установки.

Папки шлюза по сети (простой режим): кнопка «Сгенерировать» создаёт надёжный
пароль (16 символов, crypto.getRandomValues) прямо в поле, поле теперь видимое;
после сохранения пароль показывается один раз с кнопкой «Скопировать» —
записать, так как позже bj его не покажет. Пустое поле по-прежнему оставляет
прежний пароль при повторном сохранении.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
fontvielle
2026-10-21 11:29:48 +03:00
parent 847f858cd9
commit 365ec1196d
3 changed files with 32 additions and 14 deletions
+10 -6
View File
@@ -68,17 +68,21 @@ var templateFuncs = template.FuncMap{
if globalRC == nil {
return nil
}
own := ownValidCerts(storeCertsForUI(globalRC.Snapshot()))
// Свой сертификат из справочника активного профиля ИШ — включая истёкший,
// чтобы «Статус» показал владельца и пометку «ИСТЁК», а не просто «не подключён».
own := ownStoreCerts(globalRC.Snapshot())
if len(own) == 0 {
return nil
}
c := own[0]
for _, x := range own[1:] { // самый долгий — тот, что в работе
if x.NotAfter.After(c.NotAfter) {
c = x
c, ca := own[0], storeNotAfter(own[0])
for _, x := range own[1:] { // самый долгий срок — тот ключ, что в работе
if t := storeNotAfter(x); t.After(ca) {
c, ca = x, t
}
}
return map[string]any{"Owner": c.SubjectCN, "Issuer": c.IssuerCN, "Until": c.NotAfter.Format("02.01.2006"), "Days": certDaysLeft(c.NotAfter)}
contour := map[string]string{"prod": "боевой", "guest": "гостевой", "test3": "тестовый"}[contourOf(currentNSDProfile())]
return map[string]any{"Owner": c.SubjectCN, "Issuer": c.IssuerCN, "Until": ca.Format("02.01.2006"),
"Days": certDaysLeft(ca), "Expired": !ca.IsZero() && ca.Before(time.Now()), "Contour": contour}
},
// СКЗИ готова: Валидата установлена и ключ организации подключён (как шаги мастера «Валидата» и «Ключ»)
"cryptoReady": func() bool {