Учёт DEPO в мастере: поле базы, логин и пароль bj на экране, скрипт показывается на странице

База DEPO — видимое поле (необязательно: пусто — найдётся по учётным таблицам), порт заполнен
по умолчанию. «Отдать скрипт администратору»: логин и пароль bj видны и меняются, «Показать
скрипт» выводит его на странице с кнопкой «Скопировать». В начале скрипта — блок «Проверьте
перед запуском»: @db и @pass.

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 13:35:01 +03:00
parent 46cbebaff7
commit be83b86747
6 changed files with 155 additions and 35 deletions
+47 -5
View File
@@ -286,27 +286,64 @@ func depoEnsureLogin(s *FancyMSSQLSettings) {
}
}
// wizardDepoScript — POST /admin/setup/wizard-depo/script.sql: один скрипт подготовки базы файлом.
// depoScriptCreds — логин и пароль bj с экрана «Отдать скрипт администратору» (поля видны и меняются;
// пустой пароль — bj придумает сам). Возвращает текст ошибки.
func depoScriptCreds(r *http.Request, s *FancyMSSQLSettings) string {
if u := strings.TrimSpace(r.FormValue("bj_user")); u != "" {
if !depoLoginRe.MatchString(u) {
return "логин bj — латинские буквы, цифры, точка, дефис и _"
}
if u != s.User {
s.User, s.Password = u, ""
}
}
if p := r.FormValue("bj_password"); p != "" {
if len(p) < 8 {
return "пароль bj — не короче 8 знаков (SQL Server не примет короче)"
}
s.Password = p
}
return ""
}
// wizardDepoScript — POST /admin/setup/wizard-depo/script.sql: один скрипт подготовки базы файлом
// (view=1 — текстом для показа на странице).
func (h *setupHandlers) wizardDepoScript(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost || !requireDepo(w, r) {
return
}
view := r.FormValue("view") != ""
fail := func(msg string) {
if view {
http.Error(w, msg, http.StatusBadRequest)
return
}
wizDepoGo(w, r, "setup", msg, false)
}
s, db, agent, bad := h.depoSetupForm(r)
if bad == "" {
bad = depoScriptCreds(r, &s)
}
if bad != "" {
wizDepoGo(w, r, "setup", bad, false)
fail(bad)
return
}
depoEnsureLogin(&s)
s.DepoTablesMode = "script"
if err := h.rc.UpdateFancy(s); err != nil {
wizDepoGo(w, r, "setup", "не сохранилось: "+err.Error(), false)
fail("не сохранилось: " + err.Error())
return
}
body := depoSetupScript(s, db, s.User, s.Password, agent)
w.Header().Set("Cache-Control", "no-store")
if view {
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
_, _ = w.Write([]byte(body))
return
}
if !s.IsPostgres() {
body = "\uFEFF" + body // SSMS без BOM читает кириллицу в комментариях как ANSI
}
w.Header().Set("Cache-Control", "no-store")
w.Header().Set("Content-Type", "application/sql; charset=utf-8")
w.Header().Set("Content-Disposition", `attachment; filename="`+depoSetupFileName(s)+`"`)
_, _ = w.Write([]byte(body))
@@ -354,7 +391,12 @@ func (h *setupHandlers) wizardDepoSetup(w http.ResponseWriter, r *http.Request)
if u != s.User || r.FormValue("password") != "" {
s.User, s.Password = u, r.FormValue("password")
}
default: // script — администратор выполнил скрипт: логин и пароль bj уже в настройках
default: // script — администратор выполнил скрипт: логин и пароль bj — с экрана (они же в настройках)
if bad := depoScriptCreds(r, &s); bad != "" {
wizDepoGo(w, r, "setup", bad, false)
return
}
s.DepoTablesMode = "script"
if s.User == "" || s.Password == "" {
wizDepoGo(w, r, "setup", "сначала скачайте скрипт и передайте администратору SQL", false)
return