From 1616b11eb5a3cc06bb574d3350684aacc2a2a16b Mon Sep 17 00:00:00 2001 From: zuevav Date: Thu, 24 Sep 2026 14:06:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D1=85=D0=BE=D0=B4=20AD:=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=D1=87=D0=B8=D0=BD=D0=B0=20=D0=BE=D1=82=D0=BA=D0=B0=D0=B7?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BE=D0=B4?= =?UTF-8?q?=D1=83=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D0=BB=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=20=D0=B4=D0=BE=D0=BC=D0=B5=D0=BD=D0=B0=20(=D0=B1?= =?UTF-8?q?=D0=BB=D0=BE=D0=BA=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0,=20?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D1=91=D0=BA=D1=88=D0=B8=D0=B9=20=D0=BF=D0=B0?= =?UTF-8?q?=D1=80=D0=BE=D0=BB=D1=8C,=20=D1=81=D0=BC=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=B0=D1=80=D0=BE=D0=BB=D1=8F,=20=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B0=E2=80=A6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- internal/lkgateway/auth.go | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/internal/lkgateway/auth.go b/internal/lkgateway/auth.go index 78e5c50..8a266bc 100644 --- a/internal/lkgateway/auth.go +++ b/internal/lkgateway/auth.go @@ -626,7 +626,7 @@ func adAuthenticate(a AuthSettings, login, password string) (*adResult, error) { sam, upn := adSplitLogin(a, login) if err := conn.Bind(upn, password); err != nil { if ldap.IsErrorWithCode(err, ldap.LDAPResultInvalidCredentials) { - return nil, fmt.Errorf("неверный логин или пароль (AD)") + return nil, fmt.Errorf("%s", adBindReason(err)) } return nil, fmt.Errorf("AD bind: %v", err) } @@ -1464,3 +1464,26 @@ a{color:var(--accent)} {{end}} {{end}}` + +// adBindReason — причина отказа AD по подкоду «data NNN» ответа контроллера домена +// (иначе все случаи выглядят как «неверный пароль»). +func adBindReason(err error) string { + s := strings.ToLower(err.Error()) + switch { + case strings.Contains(s, "data 775"): + return "учётная запись заблокирована в AD (слишком много неверных попыток) — разблокирует администратор домена" + case strings.Contains(s, "data 532"): + return "срок действия пароля AD истёк — смените пароль (Ctrl+Alt+Del на компьютере в домене)" + case strings.Contains(s, "data 773"): + return "AD требует сменить пароль при следующем входе — смените пароль на компьютере в домене" + case strings.Contains(s, "data 533"): + return "учётная запись отключена в AD" + case strings.Contains(s, "data 701"): + return "срок действия учётной записи AD истёк" + case strings.Contains(s, "data 530"), strings.Contains(s, "data 531"): + return "вход этой учётной записи сейчас запрещён политикой AD (время/компьютер)" + case strings.Contains(s, "data 525"): + return "пользователь не найден в AD" + } + return "неверный логин или пароль (AD)" +}