Repository navigation
Single sign-on: refuse accounts locked by intruder detection - #4
Merged
Merged
Conversation
eDirectory refuses the proxied-authorization control for disabled and expired accounts, but accepts it for an account locked by intruder detection: on the lab (9.3.3) the locked account's own bind returned 53 while a proxied read as it succeeded. So a locked person could sign in through single sign-on and act in the console. OidcLogin's search now reads lockedByIntruder and loginIntruderResetTime and refuses with the new code "locked". A lock whose reset time has passed counts as over: eDirectory leaves the attribute TRUE after the reset until the next login (checked on the lab with a real lockout). A single sign-on session reaching another server (Server.on) checks the same on that server before acting as the person there. The service account check covers reading the two attributes, and the live check LivePhase3Check covers a locked and a lapsed account. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 30, 2026
jcombs-pointblue
added a commit
that referenced
this pull request
Oct 31, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # console-server/src/main/java/com/pointblue/console/server/http/Agents.java # console-server/src/main/java/com/pointblue/console/server/http/Mcp.java # console-server/src/main/java/com/pointblue/console/server/http/Server.java # console-server/src/test/java/com/pointblue/console/server/http/AgentsTest.java # console-server/src/test/java/com/pointblue/console/server/live/LiveAgentsCheck.java # console-web/src/api.ts # console-web/src/help/content.ts # console-web/src/pages/AgentKeysPage.tsx # console-web/src/pages/SettingsPage.tsx # docs/API.md # docs/MCP.md # docs/STATUS.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
eDirectory refuses the RFC 4370 proxied-authorization control (-672) for disabled and expired accounts. It accepts it for an account locked by intruder detection. On idm254 (eDirectory 9.3.3), the locked account's own bind returned 53, but a proxied read as it succeeded. So a person locked by intruder detection could still sign in through single sign-on and act in the console.
Change
OidcLogin: the service account's search for the person now readslockedByIntruderandloginIntruderResetTime(it used to ask for no attributes,1.1). A locked account is refused with the new codelocked. The check runs afternever-proxyand beforeno-role.loginIntruderResetTimehas passed counts as over. eDirectory releases the lock at that time but leaveslockedByIntruder: TRUEuntil the next login.Server.on: when a single sign-on session first reaches another server, it reads the same two attributes on that server, as the service account, before acting as the person there. The answers are 403locked, 403no-accountif the entry isn't found, or 503 if the read fails.ServiceAccountCheck: the single sign-on check now also checks that the service account can read the two lockout attributes. If it couldn't, the lock check would quietly let everyone through.sso-error=locked.docs/DEPLOYING.md§6 now say that locked accounts are refused too.Tests
OidcLoginTest(new): the lock rule. Covers never locked, unlocked, locked with no reset time, a reset time in the future, a reset time in the past, exactly at the reset time, and an unreadable reset time.Phase3Test:lou(locked until 2099) withlockedand letslapsedin (reset time in 2020).singleSignOnReachesAnotherServerOnlyWhileUnlocked: a secondncpServerwhose address points at the fake. It answers 403lockedwhile the person is locked and 200 once the reset time has passed.aliceis no longer locked in the fixture, since she is the single sign-on user. The help desk unlock test now locks her first.mvn -pl console-server -am test: 152 tests, all pass.Live checks on idm254
LivePhase3Check idm254 o=data, extended with a lock and a lapsed lock. All steps pass, includinga locked account cannot sign in: /?sso-error=lockedanda lock whose reset time has passed is over: /. The service account check now listsuid, lockedByIntruder, loginIntruderResetTime. Its scratch OU and user were deleted (deleted=2).detectIntruder,lockoutAfterDetection, limit 3, lock reset 60 s) and a scratch user in it. Results:lockedByIntruder: TRUEwith the old reset time.o=data), eDirectory lets a bind through even withlockedByIntruder: TRUEset by hand. The console still refuses that case. eDirectory only sets the attribute where lockout is on, so it should only appear when someone sets it by hand.Not covered
Server.oncheck was tested only with the fake directory. idm254 has one server.🤖 Generated with Claude Code