Пароль домена не попадает в страницу; домен в мастере — открыт, крупно, группы; справочник DEPO без переводов; 1С — бэк-офис
- Безопасность: в мастере подпись к паролю выводила сам сохранённый пароль служебной записи домена — теперь только «задан/введён» (тест: пароль не попадает в HTML). Список сессий в настройках больше не содержит токены (по ним можно было войти под чужим именем) — короткий ID. - Домен: после подключения и «Доверять» блок остаётся открытым, страница возвращается к нему; карточка «Домен подключён» и «Найден домен» — крупно; поиск сотрудников и групп; группе — доступ с ролью (ADGroups), список групп с «убрать». - «Обмен с DEPO»: справочник FTV_M2M_HANDBOOK считается и когда переводов ещё нет (на свежей установке писало «не создана»). - Модуль 1С: onec-back «1С: база бэк-офиса (тест)» вместо мидл-офиса (в лицензиях не выдавался). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
<button data-sec="nsd"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M3 21h18M4 21V10M20 21V10M3 10l9-6 9 6M8 21v-7M12 21v-7M16 21v-7"/></svg></span>НРД<span class="ind {{if .Settings.NSD.IGWBaseURL}}ok{{else}}warn{{end}}"></span></button>
|
||||
{{if mod "web-cabinet"}}<button data-sec="cabinet"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="9" r="3.2"/><path d="M6 19c.6-3 3-4.6 6-4.6s5.4 1.6 6 4.6"/><rect x="3" y="4" width="18" height="16" rx="2"/></svg></span>Кабинет клиента<span class="ind {{if .Settings.LK.APIKey}}ok{{else}}warn{{end}}"></span></button>{{end}}
|
||||
{{if mod "esia-finance"}}<button data-sec="lk"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2"/><circle cx="9" cy="11" r="2"/><path d="M6 16c.4-1.4 1.6-2.2 3-2.2s2.6.8 3 2.2"/><path d="M15 10h4M15 13h3"/></svg></span>ЕСИА Финанс<span class="ind {{if .Settings.LK.PublicURL}}ok{{else}}warn{{end}}"></span></button>{{end}}
|
||||
{{if mod "onec-middle"}}<button data-sec="onec"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="10" cy="6" rx="6" ry="2.5"/><path d="M4 6v10c0 1.4 2.7 2.5 6 2.5"/><path d="M16 6v4"/><path d="M4 11c0 1.4 2.7 2.5 6 2.5"/><path d="M14 16h7M18 13l3 3-3 3"/></svg></span>1С: мидл-офис<span class="ind {{if .Settings.OneC.CheckOK}}ok{{else}}warn{{end}}"></span></button>{{end}}
|
||||
{{if mod "onec-back"}}<button data-sec="onec"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="10" cy="6" rx="6" ry="2.5"/><path d="M4 6v10c0 1.4 2.7 2.5 6 2.5"/><path d="M16 6v4"/><path d="M4 11c0 1.4 2.7 2.5 6 2.5"/><path d="M14 16h7M18 13l3 3-3 3"/></svg></span>1С: бэк-офис<span class="ind {{if .Settings.OneC.CheckOK}}ok{{else}}warn{{end}}"></span></button>{{end}}
|
||||
<button data-sec="tests"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M9 3h6M10 3v6l-5 8.5A2 2 0 0 0 6.7 21h10.6a2 2 0 0 0 1.7-3.5L14 9V3"/><path d="M8 15h8"/></svg></span>Диагностика</button>
|
||||
<button data-sec="alerts"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M18 8a6 6 0 0 0-12 0c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.7 21a2 2 0 0 1-3.4 0"/></svg></span>Оповещения<span class="ind {{if or .Settings.Alerts.SMTP.Enabled .Settings.Alerts.Zabbix.Enabled}}ok{{end}}"></span></button>
|
||||
<button data-sec="update"><span class="nico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20V8M6 12l6-6 6 6"/><path d="M5 4h14"/></svg></span>Обновления{{if .UpdatesAvailable}}<span class="ind warn"></span>{{end}}</button>
|
||||
@@ -203,7 +203,7 @@
|
||||
<h2>Активные сессии ({{len $U.Sessions}})</h2>
|
||||
{{if $U.Sessions}}<table style="font-size:12.5px"><thead><tr><th>Пользователь</th><th>Вход</th><th>Активность</th><th>Адрес</th><th>Браузер</th><th></th></tr></thead><tbody>
|
||||
{{range $U.Sessions}}<tr><td><b>{{.Login}}</b></td><td>{{msk .Created}}</td><td>{{msk .Seen}}</td><td><code>{{.IP}}</code></td><td class="muted" style="font-size:11px;max-width:320px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">{{.UA}}</td>
|
||||
<td><form method="post" action="/admin/setup/users/session-drop"><input type="hidden" name="token" value="{{.Token}}"><button class="btn" type="submit">Завершить</button></form></td></tr>{{end}}
|
||||
<td><form method="post" action="/admin/setup/users/session-drop"><input type="hidden" name="id" value="{{.ID}}"><button class="btn" type="submit">Завершить</button></form></td></tr>{{end}}
|
||||
</tbody></table>{{else}}<p class="muted">Сессий нет.</p>{{end}}
|
||||
</div>
|
||||
</section>
|
||||
@@ -785,11 +785,11 @@
|
||||
</section>
|
||||
{{end}}
|
||||
|
||||
{{/* ============ 1С: БАЗА МИДЛ-ОФИСА (модуль onec-middle, тестовый) ============ */}}
|
||||
{{if mod "onec-middle"}}
|
||||
{{/* ============ 1С: БАЗА БЭК-ОФИСА (модуль onec-back, тестовый) ============ */}}
|
||||
{{if mod "onec-back"}}
|
||||
<section class="settings-section" id="sec-onec">
|
||||
<h1>1С: база мидл-офиса</h1>
|
||||
<p class="muted" style="margin:-8px 0 16px">Связь bj с базой 1С мидл-офиса. Модуль в разработке: сейчас здесь задаётся и проверяется подключение к базе, обмен данными появится в следующих выпусках.</p>
|
||||
<h1>1С: база бэк-офиса</h1>
|
||||
<p class="muted" style="margin:-8px 0 16px">Связь bj с базой 1С бэк-офиса. Модуль в разработке: сейчас здесь задаётся и проверяется подключение к базе, обмен данными появится в следующих выпусках.</p>
|
||||
<div class="card">
|
||||
<h2><span class="dot {{if .Settings.OneC.CheckOK}}ok{{else}}warn{{end}}"></span>Подключение к базе 1С</h2>
|
||||
<p class="muted">bj обращается к базе через стандартный интерфейс OData. Его включают при публикации базы: конфигуратор 1С → Администрирование → Публикация на веб-сервере → «Публиковать стандартный интерфейс OData».</p>
|
||||
|
||||
@@ -663,6 +663,31 @@
|
||||
.acc-form label{display:block;margin:0}
|
||||
.acc-form label input{width:100%;box-sizing:border-box;margin-top:4px}
|
||||
.acc-pw{display:flex;gap:6px;align-items:flex-end}
|
||||
.ad-st{display:flex;gap:12px;align-items:center;margin:12px 0 4px;padding:12px 16px;border-radius:12px;border:1px solid var(--border);background:var(--card-2);max-width:640px;box-sizing:border-box}
|
||||
.ad-st b{display:block;font-size:15px;font-weight:650}
|
||||
.ad-st small{display:block;color:var(--muted);font-size:13px;line-height:1.4;margin-top:2px;overflow-wrap:anywhere}
|
||||
.ad-st-ic{flex:none;position:relative;width:26px;height:26px;border-radius:50%;background:var(--border-strong)}
|
||||
.ad-st-ok{background:color-mix(in srgb,var(--ok) 9%,var(--card));border-color:color-mix(in srgb,var(--ok) 40%,var(--border))}
|
||||
.ad-st-ok .ad-st-ic{background:var(--ok)}
|
||||
.ad-st-ok .ad-st-ic::after{content:"";position:absolute;left:50%;top:45%;width:6px;height:11px;border:solid #fff;border-width:0 2.2px 2.2px 0;transform:translate(-50%,-50%) rotate(45deg)}
|
||||
.ad-st-warn{background:var(--warn-weak);border-color:color-mix(in srgb,var(--warn) 45%,var(--border))}
|
||||
.ad-st-warn .ad-st-ic{background:var(--warn)}
|
||||
.ad-st-warn .ad-st-ic::after{content:"!";position:absolute;inset:0;display:grid;place-items:center;color:#fff;font-weight:700;font-size:15px}
|
||||
.ad-st-spin{background:none;border:2.5px solid var(--accent-weak);border-top-color:var(--accent);box-sizing:border-box;animation:dq-spin .8s linear infinite}
|
||||
.ad-q-l{display:block;margin:14px 0 0;font-weight:600;font-size:14px;max-width:640px}
|
||||
.ad-q-l input{display:block;width:100%;box-sizing:border-box;margin-top:6px;font-size:15px !important;font-weight:400}
|
||||
.ad-res{list-style:none;margin:8px 0 0;padding:0;display:grid;gap:6px;max-width:640px}
|
||||
.ad-hit{display:flex;gap:10px;align-items:baseline;width:100%;text-align:left;padding:10px 14px;border:1px solid var(--border);border-radius:10px;background:var(--card);color:var(--text);font:inherit;font-size:14px;cursor:pointer}
|
||||
.ad-hit:hover:not(:disabled){border-color:var(--border-strong)}
|
||||
.ad-hit.is-sel{border-color:var(--accent);background:var(--accent-weak)}
|
||||
.ad-hit:disabled{opacity:.6;cursor:default}
|
||||
.ad-kind{flex:none;font-size:11px;font-weight:600;padding:2px 8px;border-radius:999px;background:var(--card-2);color:var(--muted);border:1px solid var(--border)}
|
||||
.ad-kind-g{background:var(--accent-weak);color:var(--accent);border-color:transparent}
|
||||
.ad-pick{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:12px;padding:12px 14px;border:1px solid var(--accent);border-radius:12px;background:color-mix(in srgb,var(--accent-weak) 50%,var(--card));max-width:640px;box-sizing:border-box}
|
||||
.ad-pick[hidden]{display:none}
|
||||
.ad-groups{margin-top:16px;max-width:640px}
|
||||
.ad-grp{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:8px 12px;border:1px solid var(--border);border-radius:10px;margin-top:6px;font-size:14px}
|
||||
.ad-grp form{margin:0}
|
||||
@media (max-width:600px){.acc-roles,.acc-form{grid-template-columns:minmax(0,1fr)}}
|
||||
</style>
|
||||
{{with .Fancy}}{{$U := .Users}}
|
||||
@@ -687,42 +712,58 @@
|
||||
<p class="muted" style="font-size:12.5px;margin:8px 0 0">Пароль передайте сотруднику лично; сменить его можно в разделе Настройка → Пользователи.</p>
|
||||
<div style="margin-top:12px"><button type="submit" class="btn btn-ok">Создать учётную запись</button></div>
|
||||
</form>
|
||||
{{$A := .Settings.Auth}}{{$D := adDraft}}
|
||||
<details class="acc-ad" {{if $D}}open{{end}} style="margin-top:20px;padding-top:14px;border-top:1px solid var(--border)">
|
||||
<summary style="cursor:pointer;color:var(--accent);font-size:14px">Добавить сотрудника из домена (Active Directory) — необязательно</summary>
|
||||
{{if and $A.ADEnabled $A.ADBindUser}}
|
||||
<p class="muted" style="font-size:13.5px;margin:10px 0 0">Домен <b>{{$A.ADDomain}}</b> подключён. Найдите сотрудника — он будет входить в bj своим доменным логином и паролем; пароль проверяет домен.</p>
|
||||
<input type="text" id="acc-ad-q" placeholder="Фамилия, логин или почта" autocomplete="off" style="width:100%;max-width:420px;margin-top:10px">
|
||||
<div id="acc-ad-st" class="muted" style="font-size:13px;margin-top:6px"></div>
|
||||
<ul id="acc-ad-res" style="list-style:none;margin:8px 0 0;padding:0;display:grid;gap:6px;max-width:640px"></ul>
|
||||
<form method="post" action="/admin/setup/users" id="acc-ad-form" hidden style="margin-top:12px;display:flex;gap:10px;align-items:end;flex-wrap:wrap">
|
||||
<input type="hidden" name="return_to" value="/admin/wizard?step=13"><input type="hidden" name="create" value="1"><input type="hidden" name="active" value="1"><input type="hidden" name="source" value="ad">
|
||||
{{$A := .Settings.Auth}}{{$D := adDraft}}{{$on := and $A.ADEnabled $A.ADBindUser}}
|
||||
<details class="acc-ad" id="acc-ad" {{if or $D $on}}open{{end}} style="margin-top:20px;padding-top:14px;border-top:1px solid var(--border)">
|
||||
<summary style="cursor:pointer;color:var(--accent);font-size:14px">Сотрудники из домена (Active Directory) — необязательно</summary>
|
||||
{{if $on}}
|
||||
<div class="ad-st ad-st-ok"><span class="ad-st-ic"></span><div><b>Домен {{$A.ADDomain}} подключён</b><small>контроллер {{$A.ADServerHost}} · служебная запись {{$A.ADBindUser}}{{if $A.ADCAPEM}} · сертификат контроллера проверяется{{end}}</small></div></div>
|
||||
<label class="ad-q-l">Найдите сотрудника или группу<input type="search" id="acc-ad-q" placeholder="Фамилия, логин, почта или название группы" autocomplete="off"></label>
|
||||
<div id="acc-ad-st" class="muted" style="font-size:13px;margin-top:6px" aria-live="polite"></div>
|
||||
<ul id="acc-ad-res" class="ad-res"></ul>
|
||||
<form method="post" action="/admin/setup/users" id="acc-ad-form" class="ad-pick" hidden>
|
||||
<input type="hidden" name="return_to" value="/admin/wizard?step=13"><input type="hidden" name="section" value="acc-ad"><input type="hidden" name="create" value="1"><input type="hidden" name="active" value="1"><input type="hidden" name="source" value="ad">
|
||||
<input type="hidden" name="login"><input type="hidden" name="name"><input type="hidden" name="email">
|
||||
<span>Добавить <b id="acc-ad-who"></b> с ролью</span>
|
||||
<span>Сотрудник <b id="acc-ad-who"></b> — входит своим доменным логином и паролем, с ролью</span>
|
||||
<select name="role">{{range .Users.Roles}}<option value="{{.Key}}" {{if eq .Key "operator"}}selected{{end}}>{{.Title}}</option>{{end}}</select>
|
||||
<button type="submit" class="btn btn-ok">Добавить из домена</button>
|
||||
<button type="submit" class="btn btn-ok">Добавить сотрудника</button>
|
||||
</form>
|
||||
<form method="post" action="/admin/setup/users/ad-group" id="acc-ad-gform" class="ad-pick" hidden>
|
||||
<input type="hidden" name="return_to" value="/admin/wizard?step=13"><input type="hidden" name="section" value="acc-ad"><input type="hidden" name="group">
|
||||
<span>Все сотрудники группы <b id="acc-ad-gwho"></b> — входят своим доменным логином и паролем, с ролью</span>
|
||||
<select name="role">{{range .Users.Roles}}<option value="{{.Key}}" {{if eq .Key "operator"}}selected{{end}}>{{.Title}}</option>{{end}}</select>
|
||||
<button type="submit" class="btn btn-ok">Дать доступ группе</button>
|
||||
</form>
|
||||
{{if $A.ADGroups}}<div class="ad-groups"><div class="muted" style="font-size:13px;margin-bottom:6px">Группы домена с доступом в bj — их сотрудники входят без отдельной учётной записи:</div>
|
||||
{{range $A.ADGroups}}<div class="ad-grp"><span><b>{{.Name}}</b> → {{roleTitle .Role}}</span>
|
||||
<form method="post" action="/admin/setup/users/ad-group"><input type="hidden" name="return_to" value="/admin/wizard?step=13"><input type="hidden" name="section" value="acc-ad"><input type="hidden" name="group" value="{{.Name}}"><input type="hidden" name="remove" value="1"><button type="submit" class="dq-link">убрать</button></form></div>{{end}}
|
||||
</div>{{end}}
|
||||
<script>(function(){
|
||||
var q=document.getElementById('acc-ad-q'), st=document.getElementById('acc-ad-st'), ul=document.getElementById('acc-ad-res'), f=document.getElementById('acc-ad-form'), who=document.getElementById('acc-ad-who'), t=0;
|
||||
var q=document.getElementById('acc-ad-q'), st=document.getElementById('acc-ad-st'), ul=document.getElementById('acc-ad-res'), f=document.getElementById('acc-ad-form'), gf=document.getElementById('acc-ad-gform'), who=document.getElementById('acc-ad-who'), gwho=document.getElementById('acc-ad-gwho'), t=0;
|
||||
function esc(s){return String(s==null?'':s).replace(/[&<>"]/g,function(c){return{'&':'&','<':'<','>':'>','"':'"'}[c]})}
|
||||
q.addEventListener('input',function(){ clearTimeout(t); t=setTimeout(function(){
|
||||
var v=q.value.trim(); if(v.length<2){ ul.innerHTML=''; st.textContent=''; return; } st.textContent='Ищу в домене…';
|
||||
var v=q.value.trim(); f.hidden=true; gf.hidden=true; if(v.length<2){ ul.innerHTML=''; st.textContent=''; return; } st.textContent='Ищу в домене…';
|
||||
fetch('/admin/setup/users/ad-search?q='+encodeURIComponent(v),{cache:'no-store',headers:{'Accept':'application/json'}}).then(function(r){return r.json()}).then(function(d){
|
||||
if(!d.ok){ st.textContent='Не получилось: '+d.error; ul.innerHTML=''; return; }
|
||||
st.textContent=d.users.length?'Найдено: '+d.users.length:'Никого не нашлось';
|
||||
ul.innerHTML=d.users.map(function(u,i){ return '<li><button type="button" class="btn btn-secondary" style="width:100%;text-align:left" data-i="'+i+'"'+(u.have?' disabled':'')+'><b>'+esc(u.name||u.login)+'</b> <span class="muted">'+esc(u.login)+(u.email?' · '+esc(u.email):'')+(u.have?' · уже есть в bj':'')+'</span></button></li>'; }).join('');
|
||||
ul.querySelectorAll('button').forEach(function(b){ b.onclick=function(){ var u=d.users[+b.dataset.i]; f.login.value=u.login; f.name.value=u.name||''; f.email.value=u.email||''; who.textContent=(u.name||u.login)+' ('+u.login+')'; f.hidden=false; }; });
|
||||
st.textContent=d.users.length?'Найдено: '+d.users.length+' — выберите, кого добавить':'Никого не нашлось';
|
||||
ul.innerHTML=d.users.map(function(u,i){ var g=u.kind==='group';
|
||||
return '<li><button type="button" class="ad-hit" data-i="'+i+'"'+(u.have?' disabled':'')+'><span class="ad-kind'+(g?' ad-kind-g':'')+'">'+(g?'группа':'сотрудник')+'</span><b>'+esc(u.name||u.login)+'</b> <span class="muted">'+(g?esc(u.desc||u.login):esc(u.login)+(u.email?' · '+esc(u.email):''))+(u.have?(g?' · доступ уже дан':' · уже есть в bj'):'')+'</span></button></li>'; }).join('');
|
||||
ul.querySelectorAll('button').forEach(function(b){ b.onclick=function(){ var u=d.users[+b.dataset.i];
|
||||
ul.querySelectorAll('.ad-hit').forEach(function(x){ x.classList.toggle('is-sel',x===b); });
|
||||
if(u.kind==='group'){ gf.group.value=u.login; gwho.textContent='«'+(u.name||u.login)+'»'; gf.hidden=false; f.hidden=true; gf.scrollIntoView({block:'nearest',behavior:'smooth'}); return; }
|
||||
f.login.value=u.login; f.name.value=u.name||''; f.email.value=u.email||''; who.textContent=(u.name||u.login)+' ('+u.login+')'; f.hidden=false; gf.hidden=true; f.scrollIntoView({block:'nearest',behavior:'smooth'}); }; });
|
||||
}).catch(function(){ st.textContent='Домен не ответил'; });
|
||||
},350); });
|
||||
if(document.getElementById('acc-ad').open && !document.querySelector('#ad-connect[open]')) q.focus({preventScroll:true});
|
||||
})();</script>
|
||||
{{end}}
|
||||
<details id="ad-connect" {{if or $D (not (and $A.ADEnabled $A.ADBindUser))}}open{{end}} style="margin-top:12px"><summary style="cursor:pointer;font-size:13px;color:var(--accent)">{{if and $A.ADEnabled $A.ADBindUser}}Другой домен или учётная запись{{else}}Подключить домен{{end}}</summary>
|
||||
{{$bu := $A.ADBindUser}}{{$pw := $A.ADBindPassword}}{{$fs := ""}}{{$fd := ""}}{{$adv := false}}
|
||||
{{/* пароль в страницу не попадает никогда — только пометка, что он есть */}}
|
||||
{{$bu := $A.ADBindUser}}{{$pw := ""}}{{if $A.ADBindPassword}}{{$pw = "задан"}}{{end}}{{$fs := ""}}{{$fd := ""}}{{$adv := false}}
|
||||
{{if $D}}{{$bu = $D.BindUser}}{{$pw = ""}}{{if $D.HasPassword}}{{$pw = "введён"}}{{end}}{{$fs = $D.Form.Server}}{{$fd = $D.Form.Domain}}{{$adv = $D.Form.Adv}}{{end}}
|
||||
<p class="muted" style="font-size:13px;margin:8px 0 0">Введите учётную запись домена и пароль — домен и его контроллеры bj найдёт сам. Прав администратора домена не нужно; лучше отдельная служебная запись (например svc-bj): bj хранит её пароль, чтобы искать сотрудников.</p>
|
||||
<div id="ad-found" class="muted" style="font-size:13px;margin-top:8px" aria-live="polite"></div>
|
||||
<div id="ad-found" class="ad-st" hidden aria-live="polite"></div>
|
||||
<form method="post" action="/admin/setup/users/ad-connect" class="acc-form" id="ad-form">
|
||||
<input type="hidden" name="return_to" value="/admin/wizard?step=13">
|
||||
<input type="hidden" name="return_to" value="/admin/wizard?step=13"><input type="hidden" name="section" value="acc-ad">
|
||||
<label>Учётная запись домена<input type="text" name="ad_bind_user" data-need="учётная запись домена" value="{{$bu}}" placeholder="svc-bj или svc-bj@corp.example.ru" autocomplete="off"></label>
|
||||
<label>Пароль{{if $pw}} <span class="muted">({{$pw}}; пусто — оставить)</span>{{end}}<input type="password" name="ad_bind_password" {{if not $pw}}data-need="пароль"{{end}} autocomplete="new-password"></label>
|
||||
<details id="ad-adv" {{if $adv}}open{{end}} style="grid-column:1/-1;margin-top:2px"><summary style="cursor:pointer;font-size:13px;color:var(--muted)">Расширенные настройки — если домен не найдётся сам</summary>
|
||||
@@ -739,14 +780,15 @@
|
||||
<script>(function(){
|
||||
var box=document.getElementById('ad-connect'), outer=box.closest('details.acc-ad'), out=document.getElementById('ad-found'), adv=document.getElementById('ad-adv'), f=document.getElementById('ad-form'), done=false;
|
||||
function esc(s){return String(s==null?'':s).replace(/[&<>"]/g,function(c){return{'&':'&','<':'<','>':'>','"':'"'}[c]})}
|
||||
function look(){ if(done||!box.open||(outer&&!outer.open)) return; done=true; out.textContent='Ищу домен…';
|
||||
function look(){ if(done||!box.open||(outer&&!outer.open)) return; done=true; out.hidden=false; out.className='ad-st'; out.innerHTML='<span class="ad-st-ic ad-st-spin"></span><div><b>Ищу домен…</b><small>по сетевым настройкам сервера bj</small></div>';
|
||||
fetch('/admin/setup/users/ad-discover',{cache:'no-store',headers:{'Accept':'application/json'}}).then(function(r){return r.json()}).then(function(d){
|
||||
var x=d.found;
|
||||
if(d.ok){ out.innerHTML='<span style="color:var(--ok)">✓</span> Найден домен <b>'+esc(x.domain)+'</b>, контроллеры: '+x.dcs.map(esc).join(', ')+' <span class="muted">('+esc(x.from)+')</span>';
|
||||
out.hidden=false;
|
||||
if(d.ok){ out.className='ad-st ad-st-ok'; out.innerHTML='<span class="ad-st-ic"></span><div><b>Найден домен '+esc(x.domain)+'</b><small>контроллеры: '+x.dcs.map(esc).join(', ')+' · '+esc(x.from)+'</small></div>';
|
||||
f.ad_domain.placeholder=x.domain+' — найден сам'; f.ad_server.placeholder=x.dcs[0]+' — найден сам'; return; }
|
||||
out.textContent=x&&x.domain?'Домен '+x.domain+' найден, но его контроллеры не нашлись в DNS — укажите контроллер в расширенных настройках.':'Домен сам не нашёлся — укажите его в расширенных настройках или впишите учётную запись с доменом: svc-bj@corp.example.ru.';
|
||||
out.className='ad-st ad-st-warn'; out.innerHTML='<span class="ad-st-ic"></span><div><b>'+(x&&x.domain?'Домен '+esc(x.domain)+' найден, но его контроллеры — нет':'Домен сам не нашёлся')+'</b><small>'+(x&&x.domain?'укажите контроллер в расширенных настройках ниже':'укажите домен в расширенных настройках ниже или впишите учётную запись с доменом: svc-bj@corp.example.ru')+'</small></div>';
|
||||
adv.open=true;
|
||||
}).catch(function(){ out.textContent=''; done=false; });
|
||||
}).catch(function(){ out.hidden=true; done=false; });
|
||||
}
|
||||
box.addEventListener('toggle',look); if(outer) outer.addEventListener('toggle',look); look();
|
||||
})();</script>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
{{if .IsCA}}<p class="muted" style="font-size:12.5px;margin:10px 0 0">Если это центр сертификации вашего домена — доверьтесь ему: bj запомнит его и будет проверять по нему все контроллеры. Сверить отпечаток можно на контроллере: certlm.msc → Доверенные корневые центры сертификации → сертификат → Состав → Отпечаток.</p>
|
||||
{{else}}<p class="muted" style="font-size:12.5px;margin:10px 0 0">Контроллер не прислал сертификат центра, поэтому показан его собственный. После «Доверять» bj войдёт в домен, возьмёт оттуда сертификат центра «{{.Issuer}}» (только если именно он подписал этот сертификат) — и дальше подойдут все контроллеры домена и их новые сертификаты. Сверить отпечаток можно на контроллере: certlm.msc → Личное → Сертификаты → сертификат {{.Subject}} → Состав → Отпечаток.</p>{{end}}
|
||||
<form method="post" action="/admin/setup/users/ad-trust" style="margin-top:10px">
|
||||
{{if $.Ret}}<input type="hidden" name="return_to" value="{{$.Ret}}">{{end}}<input type="hidden" name="fp" value="{{.SHA256}}">
|
||||
{{if $.Ret}}<input type="hidden" name="return_to" value="{{$.Ret}}"><input type="hidden" name="section" value="acc-ad">{{end}}<input type="hidden" name="fp" value="{{.SHA256}}">
|
||||
<button type="submit" class="btn btn-ok">Доверять и подключить</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user