From a923353ec43cdb3e66ed39660fa567f07ed9ea16 Mon Sep 17 00:00:00 2001 From: Val Lorentz Date: Sat, 16 Apr 2022 08:12:27 +0200 Subject: [PATCH] Add test for ban exception mode (+e) (#162) --- irctest/controllers/inspircd.py | 1 + irctest/server_tests/chmodes/ban.py | 64 ++++++++++++++++++++- irctest/server_tests/chmodes/mute_extban.py | 2 +- 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/irctest/controllers/inspircd.py b/irctest/controllers/inspircd.py index ca14f7e..75e2a69 100644 --- a/irctest/controllers/inspircd.py +++ b/irctest/controllers/inspircd.py @@ -60,6 +60,7 @@ TEMPLATE_CONFIG = """ target="services.example.org"> # Protocol: + diff --git a/irctest/server_tests/chmodes/ban.py b/irctest/server_tests/chmodes/ban.py index 471e40a..d0f4829 100644 --- a/irctest/server_tests/chmodes/ban.py +++ b/irctest/server_tests/chmodes/ban.py @@ -3,9 +3,10 @@ Channel ban (`RFC 1459 `__, `RFC 2812 `__, `Modern `__) +and ban exception (`Modern `__) """ -from irctest import cases +from irctest import cases, runner from irctest.numerics import ERR_BANNEDFROMCHAN, RPL_BANLIST, RPL_ENDOFBANLIST from irctest.patma import ANYSTR, StrRe @@ -33,7 +34,7 @@ class BanModeTestCase(cases.BaseServerTestCase): @cases.mark_specifications("Modern") def testBanList(self): - """`RPL_BANLIST `""" + """`RPL_BANLIST `_""" self.connectClient("chanop") self.joinChannel(1, "#chan") self.getMessages(1) @@ -77,6 +78,65 @@ class BanModeTestCase(cases.BaseServerTestCase): ], ) + @cases.mark_specifications("Modern") + def testBanException(self): + """`Exception mode `_ and checked against + `ISUPPORT CHANMODES `_""" + self.connectClient("chanop", name="chanop") + + if "EXCEPTS" in self.server_support: + mode = self.server_support["EXCEPTS"] or "e" + if "CHANMODES" in self.server_support: + self.assertIn( + mode, + self.server_support["CHANMODES"], + fail_msg="ISUPPORT EXCEPTS is present, but '{item}' is missing " + "from 'CHANMODES={list}'", + ) + self.assertIn( + mode, + self.server_support["CHANMODES"].split(",")[0], + fail_msg="ISUPPORT EXCEPTS is present, but '{item}' is not " + "in group A", + ) + else: + mode = "e" + if "CHANMODES" in self.server_support: + if "e" not in self.server_support["CHANMODES"]: + raise runner.OptionalExtensionNotSupported( + "Ban exception (or mode letter is not +e)" + ) + self.assertIn( + mode, + self.server_support["CHANMODES"].split(",")[0], + fail_msg="Mode +e (assumed to be ban exception) is present, " + "but 'e' is not in group A", + ) + else: + raise runner.OptionalExtensionNotSupported("ISUPPORT CHANMODES") + + self.sendLine("chanop", "JOIN #chan") + self.getMessages("chanop") + self.sendLine("chanop", "MODE #chan +b ba*!*@*") + self.getMessages("chanop") + + # banned client cannot join + self.connectClient("Bar", name="bar") + self.sendLine("bar", "JOIN #chan") + self.assertMessageMatch(self.getMessage("bar"), command=ERR_BANNEDFROMCHAN) + + # chanop sets exception + self.sendLine("chanop", "MODE #chan +e *ar!*@*") + self.assertMessageMatch(self.getMessage("chanop"), command="MODE") + + # client can now join + self.sendLine("bar", "JOIN #chan") + self.assertMessageMatch(self.getMessage("bar"), command="JOIN") + + # TODO: Add testBanExceptionList, once the numerics are specified in Modern + @cases.mark_specifications("Ergo") def testCaseInsensitive(self): """Some clients allow unsetting modes if their argument matches diff --git a/irctest/server_tests/chmodes/mute_extban.py b/irctest/server_tests/chmodes/mute_extban.py index 5c3c6d4..cd8e131 100644 --- a/irctest/server_tests/chmodes/mute_extban.py +++ b/irctest/server_tests/chmodes/mute_extban.py @@ -198,7 +198,7 @@ class MuteExtbanTestCase(cases.BaseServerTestCase): self.getMessages(client) # +e grants an exemption to +b - self.sendLine("chanop", f"MODE #chan +e {prefix}{self.char()}:*!~evan@*") + self.sendLine("chanop", f"MODE #chan +e {prefix}{self.char()}:*!*evan@*") replies = {msg.command for msg in self.getMessages("chanop")} self.assertIn("MODE", replies) self.assertNotIn(ERR_CHANOPRIVSNEEDED, replies)