Files
scadaproj/ZB.MOM.WW.Auth/tests/ZB.MOM.WW.Auth.Ldap.Tests/Integration/glauth-userbind/config.toml
T
Joseph Doherty d549a782fd fix(auth): user bind proves the bound account is the entry whose groups it returns (scadaproj#40)
BindMode=User bound as UserBindTemplate({0}) and then returned the groups of
whatever entry (UserNameAttribute={0}) found - two directory lookups that can
name two accounts (Auth-007). Reproduced live against GLAuth: mallory bound as
herself and signed in with boss's Admins group.

After the bind the service now asks RFC 4532 Who-am-I and requires the entry
to be that account (dn: -> DN match; AD u:DOMAIN\name -> sAMAccountName match).
Without a Who-am-I answer only a DN template is provable (bind DN must equal
the entry DN); anything else fails closed as GroupLookupFailed. {0} is
RFC 4514-escaped in DN templates; validator message leads with EXAMPLE\{0}.

Auth 0.4.3 -> 0.4.4 (unpublished).

Claude-Session: https://claude.ai/code/session_01GT67AEHd2Acv1YPwGfXEoV
2026-11-09 15:02:16 -05:00

50 lines
1.2 KiB
TOML

# GLAuth fixture for the user-bind identity test (Auth-007, scadaproj#40).
# Start: docker compose up -d (listens on localhost:3897)
# All passwords are "password" (sha256 below).
#
# mallory binds as herself (cn=mallory,ou=Users,...). The admin entry carries mail=mallory,
# so with UserNameAttribute=mail a search for the typed name "mallory" finds the ADMIN — the
# account that bound and the account searched for differ. The library must refuse.
[ldap]
enabled = true
listen = "0.0.0.0:3893"
[ldaps]
enabled = false
[backend]
datastore = "config"
baseDN = "dc=zb,dc=local"
[behaviors]
LimitFailedBinds = false
[[groups]]
name = "Users"
gidnumber = 6001
[[groups]]
name = "Admins"
gidnumber = 6002
[[users]]
name = "mallory"
mail = "mallory-real@zb.local"
uidnumber = 6101
primarygroup = 6001
passsha256 = "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8"
[[users.capabilities]]
action = "search"
object = "*"
[[users]]
name = "boss"
mail = "mallory"
uidnumber = 6102
primarygroup = 6001
othergroups = [6002]
passsha256 = "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8"
[[users.capabilities]]
action = "search"
object = "*"