From 74f40ad23da079587b730db43eb976ab47cefb94 Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Wed, 3 Mar 2021 13:56:53 -0500 Subject: [PATCH 1/2] allow ERR_INPUTTOOLONG if a PRIVMSG cannot be relayed --- irctest/server_tests/test_message_tags.py | 43 +++++++++++++---------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/irctest/server_tests/test_message_tags.py b/irctest/server_tests/test_message_tags.py index 412df4b..323954c 100644 --- a/irctest/server_tests/test_message_tags.py +++ b/irctest/server_tests/test_message_tags.py @@ -154,25 +154,30 @@ class MessageTagsTestCase(cases.BaseServerTestCase, cases.OptionalityHelper): self.assertEqual(len(max_privmsg), 4096 + (512 - 2)) self.sendLine("alice", max_privmsg) echo = self.getMessage("alice") - relay = self.getMessage("bob") - self.assertMessageMatch( - echo, - command="PRIVMSG", - params=["#test", StrRe("b{400,496}")], - tags={"+baz": "a" * 4081, "msgid": StrRe(".+"), **ANYDICT}, - ) - self.assertMessageMatch( - relay, - command="PRIVMSG", - params=["#test", StrRe("b{400,496}")], - tags={"+baz": "a" * 4081, "msgid": StrRe(".+"), **ANYDICT}, - ) - self.assertEqual(echo.tags["msgid"], relay.tags["msgid"]) - # message may have been truncated - self.assertIn("b" * 400, echo.params[1]) - self.assertEqual(echo.params[1].rstrip("b"), "") - self.assertIn("b" * 400, relay.params[1]) - self.assertEqual(relay.params[1].rstrip("b"), "") + # the server may still reject this message on the grounds that the final + # parameter is too long to be relayed without truncation, once alice's + # NUH is included. however, if the message was accepted, the tags MUST + # be relayed intact, because they are unquestionably valid: + if echo.command != ERR_INPUTTOOLONG: + relay = self.getMessage("bob") + self.assertMessageMatch( + echo, + command="PRIVMSG", + params=["#test", StrRe("b{400,496}")], + tags={"+baz": "a" * 4081, "msgid": StrRe(".+"), **ANYDICT}, + ) + self.assertMessageMatch( + relay, + command="PRIVMSG", + params=["#test", StrRe("b{400,496}")], + tags={"+baz": "a" * 4081, "msgid": StrRe(".+"), **ANYDICT}, + ) + self.assertEqual(echo.tags["msgid"], relay.tags["msgid"]) + # message may have been truncated + self.assertIn("b" * 400, echo.params[1]) + self.assertEqual(echo.params[1].rstrip("b"), "") + self.assertIn("b" * 400, relay.params[1]) + self.assertEqual(relay.params[1].rstrip("b"), "") excess_privmsg = "@foo=bar;+baz=%s PRIVMSG #test %s" % ("a" * 4082, "b" * 495) # TAGMSG data is over the limit, but we're within the overall limit for a line From 0f2445c1eb656db419cc1d9e1065b8ae3e711979 Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Wed, 3 Mar 2021 14:37:03 -0500 Subject: [PATCH 2/2] review fixes --- irctest/server_tests/test_message_tags.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/irctest/server_tests/test_message_tags.py b/irctest/server_tests/test_message_tags.py index 323954c..ce190f7 100644 --- a/irctest/server_tests/test_message_tags.py +++ b/irctest/server_tests/test_message_tags.py @@ -108,6 +108,7 @@ class MessageTagsTestCase(cases.BaseServerTestCase, cases.OptionalityHelper): self.assertEqual(alice_msg.tags["msgid"], bob_msg.tags["msgid"]) @cases.mark_capabilities("message-tags") + @cases.mark_specifications("ircdocs") def testLengthLimits(self): self.connectClient( "alice", @@ -157,7 +158,9 @@ class MessageTagsTestCase(cases.BaseServerTestCase, cases.OptionalityHelper): # the server may still reject this message on the grounds that the final # parameter is too long to be relayed without truncation, once alice's # NUH is included. however, if the message was accepted, the tags MUST - # be relayed intact, because they are unquestionably valid: + # be relayed intact, because they are unquestionably valid. See the + # original context of ERR_INPUTTOOLONG: + # https://defs.ircdocs.horse/defs/numerics.html#err-inputtoolong-417 if echo.command != ERR_INPUTTOOLONG: relay = self.getMessage("bob") self.assertMessageMatch(