diff --git a/internal/lkgateway/admin.go b/internal/lkgateway/admin.go
index c7cefcf..25bb391 100644
--- a/internal/lkgateway/admin.go
+++ b/internal/lkgateway/admin.go
@@ -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 {
diff --git a/internal/lkgateway/web/templates/part_igate.html b/internal/lkgateway/web/templates/part_igate.html
index 5984873..57775e2 100644
--- a/internal/lkgateway/web/templates/part_igate.html
+++ b/internal/lkgateway/web/templates/part_igate.html
@@ -94,8 +94,9 @@
-
+
+ Пароль вводят в Windows при первом открытии папок. Запишите его: bj передаёт пароль в Samba и показать позже не сможет. Пустое поле при повторном сохранении оставляет прежний пароль.
@@ -214,6 +215,13 @@
}
function load(){ return fetch('/admin/setup/igate/share',{cache:'no-store'}).then(function(r){return r.json()}).then(show).catch(function(){ stl.textContent='Состояние не получено.'; }); }
f.addEventListener('change',function(e){ if(e.target.name==='mode') sync(); });
+ var genbtn=document.getElementById('ig-sh-gen');
+ if(genbtn) genbtn.addEventListener('click',function(){
+ var cs='ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789', a=new Uint32Array(16), s='';
+ crypto.getRandomValues(a); for(var i=0;i<16;i++) s+=cs[a[i]%cs.length];
+ f.password.type='text'; f.password.value=s; f.password.focus(); f.password.select();
+ o.innerHTML='Пароль создан — запишите его перед сохранением.';
+ });
f.addEventListener('submit',function(e){ e.preventDefault();
var p=new URLSearchParams(), url='/admin/setup/igate/share', d=mode()==='domain';
if(d && !cur.joined){
@@ -225,7 +233,13 @@
if(!d){ p.set('user',f.user.value.trim()); p.set('password',f.password.value); }
o.textContent='Сохраняю… (первый раз — установка Samba, до пары минут)';
}
- post(url,p).then(function(r){ o.innerHTML=r.ok?ok(r.output):bad(r.error); f.password.value=''; f.adminpw.value=''; return load(); }).catch(function(){ o.innerHTML=bad('не сохранено'); }); });
+ var pwSet=(!d)?f.password.value:'';
+ post(url,p).then(function(r){
+ if(r.ok){ o.innerHTML=ok(r.output)+(pwSet?' Пароль:'+esc(pwSet)+' — запишите, посмотреть позже нельзя.':'');
+ var cb=o.querySelector('[data-copy]'); if(cb) cb.onclick=function(){ (window.bjCopy||function(t){navigator.clipboard&&navigator.clipboard.writeText(t)})(cb.dataset.copy); cb.textContent='Скопировано ✓'; };
+ } else o.innerHTML=bad(r.error);
+ f.password.value=''; f.adminpw.value=''; return load();
+ }).catch(function(){ o.innerHTML=bad('не сохранено'); }); });
load();
})();
var st=null;
diff --git a/internal/lkgateway/web/templates/part_status.html b/internal/lkgateway/web/templates/part_status.html
index 644f25b..82914ce 100644
--- a/internal/lkgateway/web/templates/part_status.html
+++ b/internal/lkgateway/web/templates/part_status.html
@@ -19,14 +19,14 @@
{{end}}
-{{define "cryptoStatus"}}{{$kc := orgKeyCert}}{{$ok := and cryptoReady $kc}}
+{{define "cryptoStatus"}}{{$kc := orgKeyCert}}{{$exp := and $kc (index $kc "Expired")}}{{$ok := and cryptoReady $kc (not $exp)}}
-
-
{{if $ok}}{{if lt (index $kc "Days") 30}}Ключ организации скоро закончится{{else}}Подпись работает{{end}}{{else}}Ключ организации не подключён{{end}}
- {{if $ok}}СКЗИ «Валидата» установлена, ключ организации подключён — документы для НРД подписываются.{{if lt (index $kc "Days") 30}} Получите новый ключ в Удостоверяющем центре и установите его.{{end}}{{else}}Пошаговая установка: флешка с ключом или архив ключа от НРД с паролем → справочник сертификатов → проверка подписи.{{end}}
{{if $exp}}Ключ организации истёк{{else if $ok}}{{if lt (index $kc "Days") 30}}Ключ организации скоро закончится{{else}}Подпись работает{{end}}{{else}}Ключ организации не подключён{{end}}
+ {{if $exp}}Ключ «{{index $kc "Owner"}}» истёк {{index $kc "Until"}} — подпись для НРД не проходит. Получите новый ключ в Удостоверяющем центре и установите его.{{else if $ok}}СКЗИ «Валидата» установлена, ключ организации подключён — документы для НРД подписываются.{{if lt (index $kc "Days") 30}} Получите новый ключ в Удостоверяющем центре и установите его.{{end}}{{else}}Пошаговая установка: флешка с ключом или архив ключа от НРД с паролем → справочник сертификатов → проверка подписи.{{end}}
{{if .NSDCerts.Pending}}⚠ есть изменения к применению ({{.NSDCerts.Pending}}){{else if .NSDCerts.LastRun.IsZero}}ещё не сверялись{{else}}✓ сверены {{msk .NSDCerts.LastRun}}{{end}} · bj сверяет сам при запуске и раз в 6 часов