Merged
Conversation
Contributor
MrIron-no
commented
Sep 20, 2025
- Allow U:lined servers to set umode +x remotely using OPMODE.
- Only permit ACCOUNT messages from U:lined servers.
Ratler
reviewed
Mar 21, 2026
…ion instead of send_reply. Fixed bug causing remote deoper not to propagate the mode change.
e590dcd to
2097123
Compare
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Add a lightweight P10 fake server (tests/p10_server.py) that connects to ircd as a U:lined service, completes the full P10 handshake, and can send S2S messages like OPMODE and ACCOUNT. This enables testing server-to-server protocol behavior from the Python test harness. Add integration tests for PR #62 (Remote +x): - test_fix.py: 3 TDD tests that verify OPMODE +x from a U:lined server sets hidden host (fail on base branch, pass with PR #62) - test_edge_cases.py: 6 adversarial tests covering remote users, unsupported modes, ACCOUNT, -o regression, and rapid sequences Infrastructure changes: - Docker configs: add Connect + UWorld blocks for services.test.net - Dockerfile: clean host-compiled binaries before Linux build to fix exec format error on cross-platform Docker builds
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
PR #62's OPMODE +x handler requires IsAccount(dptr) — it silently ignores +x on users without an account. Updated the test to verify this correct behavior instead of expecting a MODE notification.
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Add test_account_rejected_from_non_ulined_server which connects a second fake P10 server (notulined.test.net) that has a Connect block but no UWorld entry. Verifies that ACCOUNT from this server gets ERR_NOPRIVILEGES (481) and the user's account is not set. This covers the second half of PR #62: ms_account now requires CONF_UWORLD before accepting ACCOUNT messages.
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
- Remove incorrect 481 (ERR_NOPRIVILEGES) expectation from test_account_rejected_from_non_ulined_server; protocol_violation() only sends a DESYNCH wallops, not a numeric reply - Rename test_nooper_uworld_cannot_send_plus_x to _can_ and flip assertion; PR #62 intentionally only gates +o/-o behind CONF_UWORLD_OPER while +x needs only basic CONF_UWORLD - Rename test_nooper_uworld_unknown_mode_should_be_rejected to _silently_ignored; unknown modes fall through without error - Strengthen test_opmode_minus_o_still_works to verify MODE -o notification now that PR #62 adds send_umode_out() to de_oper() - Add Connect/UWorld blocks for uworldonly.test.net in hub config - Switch Dockerfile to debian:trixie-slim and use autogen.sh for reliable autotools bootstrapping in container builds
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Add a lightweight P10 fake server (tests/p10_server.py) that connects to ircd as a U:lined service, completes the full P10 handshake, and can send S2S messages like OPMODE and ACCOUNT. This enables testing server-to-server protocol behavior from the Python test harness. Add integration tests for PR #62 (Remote +x): - test_fix.py: 3 TDD tests that verify OPMODE +x from a U:lined server sets hidden host (fail on base branch, pass with PR #62) - test_edge_cases.py: 6 adversarial tests covering remote users, unsupported modes, ACCOUNT, -o regression, and rapid sequences Infrastructure changes: - Docker configs: add Connect + UWorld blocks for services.test.net - Dockerfile: clean host-compiled binaries before Linux build to fix exec format error on cross-platform Docker builds
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
PR #62's OPMODE +x handler requires IsAccount(dptr) — it silently ignores +x on users without an account. Updated the test to verify this correct behavior instead of expecting a MODE notification.
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Add test_account_rejected_from_non_ulined_server which connects a second fake P10 server (notulined.test.net) that has a Connect block but no UWorld entry. Verifies that ACCOUNT from this server gets ERR_NOPRIVILEGES (481) and the user's account is not set. This covers the second half of PR #62: ms_account now requires CONF_UWORLD before accepting ACCOUNT messages.
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
- Remove incorrect 481 (ERR_NOPRIVILEGES) expectation from test_account_rejected_from_non_ulined_server; protocol_violation() only sends a DESYNCH wallops, not a numeric reply - Rename test_nooper_uworld_cannot_send_plus_x to _can_ and flip assertion; PR #62 intentionally only gates +o/-o behind CONF_UWORLD_OPER while +x needs only basic CONF_UWORLD - Rename test_nooper_uworld_unknown_mode_should_be_rejected to _silently_ignored; unknown modes fall through without error - Strengthen test_opmode_minus_o_still_works to verify MODE -o notification now that PR #62 adds send_umode_out() to de_oper() - Add Connect/UWorld blocks for uworldonly.test.net in hub config - Switch Dockerfile to debian:trixie-slim and use autogen.sh for reliable autotools bootstrapping in container builds
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Add a lightweight P10 fake server (tests/p10_server.py) that connects to ircd as a U:lined service, completes the full P10 handshake, and can send S2S messages like OPMODE and ACCOUNT. This enables testing server-to-server protocol behavior from the Python test harness. Add integration tests for PR #62 (Remote +x): - test_fix.py: 3 TDD tests that verify OPMODE +x from a U:lined server sets hidden host (fail on base branch, pass with PR #62) - test_edge_cases.py: 6 adversarial tests covering remote users, unsupported modes, ACCOUNT, -o regression, and rapid sequences Infrastructure changes: - Docker configs: add Connect + UWorld blocks for services.test.net - Dockerfile: clean host-compiled binaries before Linux build to fix exec format error on cross-platform Docker builds
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
PR #62's OPMODE +x handler requires IsAccount(dptr) — it silently ignores +x on users without an account. Updated the test to verify this correct behavior instead of expecting a MODE notification.
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Add test_account_rejected_from_non_ulined_server which connects a second fake P10 server (notulined.test.net) that has a Connect block but no UWorld entry. Verifies that ACCOUNT from this server gets ERR_NOPRIVILEGES (481) and the user's account is not set. This covers the second half of PR #62: ms_account now requires CONF_UWORLD before accepting ACCOUNT messages.
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
- Remove incorrect 481 (ERR_NOPRIVILEGES) expectation from test_account_rejected_from_non_ulined_server; protocol_violation() only sends a DESYNCH wallops, not a numeric reply - Rename test_nooper_uworld_cannot_send_plus_x to _can_ and flip assertion; PR #62 intentionally only gates +o/-o behind CONF_UWORLD_OPER while +x needs only basic CONF_UWORLD - Rename test_nooper_uworld_unknown_mode_should_be_rejected to _silently_ignored; unknown modes fall through without error - Strengthen test_opmode_minus_o_still_works to verify MODE -o notification now that PR #62 adds send_umode_out() to de_oper() - Add Connect/UWorld blocks for uworldonly.test.net in hub config - Switch Dockerfile to debian:trixie-slim and use autogen.sh for reliable autotools bootstrapping in container builds
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Add a lightweight P10 fake server (tests/p10_server.py) that connects to ircd as a U:lined service, completes the full P10 handshake, and can send S2S messages like OPMODE and ACCOUNT. This enables testing server-to-server protocol behavior from the Python test harness. Add integration tests for PR #62 (Remote +x): - test_fix.py: 3 TDD tests that verify OPMODE +x from a U:lined server sets hidden host (fail on base branch, pass with PR #62) - test_edge_cases.py: 6 adversarial tests covering remote users, unsupported modes, ACCOUNT, -o regression, and rapid sequences Infrastructure changes: - Docker configs: add Connect + UWorld blocks for services.test.net - Dockerfile: clean host-compiled binaries before Linux build to fix exec format error on cross-platform Docker builds
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
PR #62's OPMODE +x handler requires IsAccount(dptr) — it silently ignores +x on users without an account. Updated the test to verify this correct behavior instead of expecting a MODE notification.
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Add test_account_rejected_from_non_ulined_server which connects a second fake P10 server (notulined.test.net) that has a Connect block but no UWorld entry. Verifies that ACCOUNT from this server gets ERR_NOPRIVILEGES (481) and the user's account is not set. This covers the second half of PR #62: ms_account now requires CONF_UWORLD before accepting ACCOUNT messages.
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
- Remove incorrect 481 (ERR_NOPRIVILEGES) expectation from test_account_rejected_from_non_ulined_server; protocol_violation() only sends a DESYNCH wallops, not a numeric reply - Rename test_nooper_uworld_cannot_send_plus_x to _can_ and flip assertion; PR #62 intentionally only gates +o/-o behind CONF_UWORLD_OPER while +x needs only basic CONF_UWORLD - Rename test_nooper_uworld_unknown_mode_should_be_rejected to _silently_ignored; unknown modes fall through without error - Strengthen test_opmode_minus_o_still_works to verify MODE -o notification now that PR #62 adds send_umode_out() to de_oper() - Add Connect/UWorld blocks for uworldonly.test.net in hub config - Switch Dockerfile to debian:trixie-slim and use autogen.sh for reliable autotools bootstrapping in container builds
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Add a lightweight P10 fake server (tests/p10_server.py) that connects to ircd as a U:lined service, completes the full P10 handshake, and can send S2S messages like OPMODE and ACCOUNT. This enables testing server-to-server protocol behavior from the Python test harness. Add integration tests for PR #62 (Remote +x): - test_fix.py: 3 TDD tests that verify OPMODE +x from a U:lined server sets hidden host (fail on base branch, pass with PR #62) - test_edge_cases.py: 6 adversarial tests covering remote users, unsupported modes, ACCOUNT, -o regression, and rapid sequences Infrastructure changes: - Docker configs: add Connect + UWorld blocks for services.test.net - Dockerfile: clean host-compiled binaries before Linux build to fix exec format error on cross-platform Docker builds
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
PR #62's OPMODE +x handler requires IsAccount(dptr) — it silently ignores +x on users without an account. Updated the test to verify this correct behavior instead of expecting a MODE notification.
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Add test_account_rejected_from_non_ulined_server which connects a second fake P10 server (notulined.test.net) that has a Connect block but no UWorld entry. Verifies that ACCOUNT from this server gets ERR_NOPRIVILEGES (481) and the user's account is not set. This covers the second half of PR #62: ms_account now requires CONF_UWORLD before accepting ACCOUNT messages.
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
- Remove incorrect 481 (ERR_NOPRIVILEGES) expectation from test_account_rejected_from_non_ulined_server; protocol_violation() only sends a DESYNCH wallops, not a numeric reply - Rename test_nooper_uworld_cannot_send_plus_x to _can_ and flip assertion; PR #62 intentionally only gates +o/-o behind CONF_UWORLD_OPER while +x needs only basic CONF_UWORLD - Rename test_nooper_uworld_unknown_mode_should_be_rejected to _silently_ignored; unknown modes fall through without error - Strengthen test_opmode_minus_o_still_works to verify MODE -o notification now that PR #62 adds send_umode_out() to de_oper() - Add Connect/UWorld blocks for uworldonly.test.net in hub config - Switch Dockerfile to debian:trixie-slim and use autogen.sh for reliable autotools bootstrapping in container builds
Ratler
added a commit
that referenced
this pull request
Mar 24, 2026
MrIron-no
added a commit
to MrIron-no/ircu2
that referenced
this pull request
Mar 24, 2026
* Added support for remote +x from U:lined servers. * Only permit ACCOUNT messages from U:lined servers. * ms_opmode: Made permission checks explicit and return protocol_violation instead of send_reply. Fixed bug causing remote deoper not to propagate the mode change.
Ratler
added a commit
that referenced
this pull request
Mar 25, 2026
* feat(tests): add Python test harness with Docker infrastructure - Dockerfile with multi-stage build for ircu from working tree - docker-compose with hub + 2 leaves topology - Custom async IRC client with CAP negotiation support - pytest fixtures for container lifecycle management - PR #59 tests (part message suppression for banned users) - PR #61 tests (userhost-in-names capability) - IRC message parser unit tests * docs: add test harness README - tests/README.md: setup, usage, topology, API reference * fix(tests): fix wait_for buffer bug and use get_running_loop - Fixed infinite loop in wait_for where stashed messages were re-read from buffer endlessly - Replaced deprecated asyncio.get_event_loop() with get_running_loop() - Simplified buffer search using enumerate * chore: switch from pip/requirements.txt to uv - Move dependencies from requirements.txt to pyproject.toml [project.dependencies] - Remove requirements.txt - Add uv.lock - Add .venv and uv.lock to .dockerignore * fix(tests): ensure Docker rebuild on every test run Add --force-recreate and explicit docker compose down before up to guarantee tests always run against the currently checked-out code. This is critical for TDD workflow where you switch branches between runs. * fix(tests): rewrite PR #59 tests for cross-server propagation bug The original test_fix.py tested local part message suppression, which already worked on the base branch. The actual bug PR #59 fixes is that part messages leak across server-to-server links for banned users. Rewrote tests to use ircd_network fixture (multi-server topology): - Observer on leaf1 sees banned user's part message from hub (bug) - Fixed docker-compose to use static IPs (10.55.0.x) so ircu's built-in DNS resolver can find the other servers - Control test verifies unbanned part messages work cross-server * feat(tests): add P10 test server and PR #62 remote +x tests Add a lightweight P10 fake server (tests/p10_server.py) that connects to ircd as a U:lined service, completes the full P10 handshake, and can send S2S messages like OPMODE and ACCOUNT. This enables testing server-to-server protocol behavior from the Python test harness. Add integration tests for PR #62 (Remote +x): - test_fix.py: 3 TDD tests that verify OPMODE +x from a U:lined server sets hidden host (fail on base branch, pass with PR #62) - test_edge_cases.py: 6 adversarial tests covering remote users, unsupported modes, ACCOUNT, -o regression, and rapid sequences Infrastructure changes: - Docker configs: add Connect + UWorld blocks for services.test.net - Dockerfile: clean host-compiled binaries before Linux build to fix exec format error on cross-platform Docker builds * fix(tests): align test_remote_opmode_x_without_account with PR #62 PR #62's OPMODE +x handler requires IsAccount(dptr) — it silently ignores +x on users without an account. Updated the test to verify this correct behavior instead of expecting a MODE notification. * fix(tests): test both no-account and with-account paths for OPMODE +x Extend test_remote_opmode_x_without_account to a two-phase test: first verifies +x is ignored without an account (IsAccount guard), then sets the account and verifies +x succeeds and hides the host. * feat(tests): add ACCOUNT U:line restriction test for PR #62 Add test_account_rejected_from_non_ulined_server which connects a second fake P10 server (notulined.test.net) that has a Connect block but no UWorld entry. Verifies that ACCOUNT from this server gets ERR_NOPRIVILEGES (481) and the user's account is not set. This covers the second half of PR #62: ms_account now requires CONF_UWORLD before accepting ACCOUNT messages. * docs: update test README with P10 server API and PR #62 tests * fix(tests): align PR #62 tests with updated code review - Remove incorrect 481 (ERR_NOPRIVILEGES) expectation from test_account_rejected_from_non_ulined_server; protocol_violation() only sends a DESYNCH wallops, not a numeric reply - Rename test_nooper_uworld_cannot_send_plus_x to _can_ and flip assertion; PR #62 intentionally only gates +o/-o behind CONF_UWORLD_OPER while +x needs only basic CONF_UWORLD - Rename test_nooper_uworld_unknown_mode_should_be_rejected to _silently_ignored; unknown modes fall through without error - Strengthen test_opmode_minus_o_still_works to verify MODE -o notification now that PR #62 adds send_umode_out() to de_oper() - Add Connect/UWorld blocks for uworldonly.test.net in hub config - Switch Dockerfile to debian:trixie-slim and use autogen.sh for reliable autotools bootstrapping in container builds * docs: update test README with new PR #62 test files and uworldonly server
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.