773fa8e0bf
- Шапка мастера: правый блок (шлюз НРД, пользователь, тема) снова справа — после правила [hidden] скрытое меню перестало его распирать. - Домен в шаге «Учётные записи»: bj сам находит домен и контроллеры (логин с @домен, домены поиска DNS, rootDSE DNS-серверов, SRV _ldap._tcp.dc._msdcs); адрес и домен — в расширенных настройках, открываются сами, если не нашлось. Контроллеры по очереди, LDAPS → LDAP+StartTLS. - Неудачная попытка ничего не теряет: введённое (и пароль) — черновиком, форма заполнена; причины словами (неизвестный ЦС, имя в сертификате, IP вместо имени, порт закрыт, нет в DNS). - Сертификат неизвестного центра: карточка «кем выдан, отпечаток (SHA-1 как в Windows и SHA-256)» и «Доверять и подключить»; после входа bj берёт из домена сертификат центра (AIA / Certification Authorities), подписавший сертификат контроллера, — подходят все контроллеры. То же в Настройка → Пользователи при «Проверить». - Лицензия: модуль onec-middle «1С: база мидл-офиса (тест)»; раздел настроек — адрес публикации, пользователь, пароль, проверка через OData $metadata; в мастере — в «Модулях». - ЛК (callback, API, готовность) — только при модуле «ЕСИА Финанс»; карточка режима QUIK и стили настроек как в мастере. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
57 lines
2.1 KiB
Go
57 lines
2.1 KiB
Go
package lkgateway
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestOneCBase(t *testing.T) {
|
|
for in, want := range map[string]string{
|
|
"http://1c/middle/": "http://1c/middle",
|
|
"1c-server/middle": "http://1c-server/middle",
|
|
"https://1c/mid/odata/standard.odata/$metadata": "https://1c/mid",
|
|
" http://1c/mid/OData/standard.odata ": "http://1c/mid",
|
|
} {
|
|
if got := oneCBase(in); got != want {
|
|
t.Errorf("oneCBase(%q) = %q, want %q", in, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestOneCCheck(t *testing.T) {
|
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
u, p, _ := r.BasicAuth()
|
|
switch {
|
|
case !strings.HasPrefix(r.URL.Path, "/mid/odata/standard.odata/$metadata"):
|
|
http.NotFound(w, r)
|
|
case u != "bj" || p != "секрет":
|
|
w.WriteHeader(http.StatusUnauthorized)
|
|
default:
|
|
w.Write([]byte(`<edmx:Edmx><edmx:DataServices><Schema><EntityType Name="Catalog_Клиенты"/><EntityType Name="Document_Поручение"/></Schema></edmx:DataServices></edmx:Edmx>`))
|
|
}
|
|
}))
|
|
defer srv.Close()
|
|
ctx := context.Background()
|
|
if ok, msg := oneCCheck(ctx, OneCSettings{URL: srv.URL + "/mid", User: "bj", Password: "секрет"}); !ok || !strings.Contains(msg, "объектов в OData — 2") {
|
|
t.Fatalf("рабочее подключение: %v %q", ok, msg)
|
|
}
|
|
if ok, msg := oneCCheck(ctx, OneCSettings{URL: srv.URL + "/mid", User: "bj", Password: "не тот"}); ok || !strings.Contains(msg, "не пустила") {
|
|
t.Fatalf("неверный пароль: %v %q", ok, msg)
|
|
}
|
|
if ok, msg := oneCCheck(ctx, OneCSettings{URL: srv.URL + "/other", User: "bj", Password: "секрет"}); ok || !strings.Contains(msg, "Публиковать стандартный интерфейс OData") {
|
|
t.Fatalf("без OData: %v %q", ok, msg)
|
|
}
|
|
}
|
|
|
|
func TestOneCModuleGate(t *testing.T) {
|
|
if f := moduleForPath("/admin/setup/onec"); f != "onec-middle" {
|
|
t.Fatalf("раздел 1С без модуля лицензии: %q", f)
|
|
}
|
|
if moduleTitle("onec-middle") == "onec-middle" {
|
|
t.Fatal("нет названия модуля для лицензии")
|
|
}
|
|
}
|