2022-04-10 12:51:14 +00:00
|
|
|
|
"""
|
|
|
|
|
`Draft IRCv3 account-registration
|
|
|
|
|
<https://ircv3.net/specs/extensions/account-registration>`_
|
|
|
|
|
"""
|
|
|
|
|
|
2020-10-09 12:38:53 +00:00
|
|
|
|
from irctest import cases
|
2021-02-28 19:44:50 +00:00
|
|
|
|
from irctest.patma import ANYSTR
|
2020-10-09 12:38:53 +00:00
|
|
|
|
|
2021-07-07 13:04:22 +00:00
|
|
|
|
REGISTER_CAP_NAME = "draft/account-registration"
|
2021-02-22 18:02:13 +00:00
|
|
|
|
|
2020-10-09 12:38:53 +00:00
|
|
|
|
|
2023-09-24 15:38:33 +00:00
|
|
|
|
@cases.mark_services
|
|
|
|
|
@cases.mark_specifications("IRCv3")
|
|
|
|
|
class RegisterTestCase(cases.BaseServerTestCase):
|
|
|
|
|
def testRegisterDefaultName(self):
|
|
|
|
|
"""
|
|
|
|
|
"If <account> is *, then this value is the user’s current nickname."
|
|
|
|
|
"""
|
|
|
|
|
self.connectClient(
|
|
|
|
|
"bar", name="bar", capabilities=[REGISTER_CAP_NAME], skip_if_cap_nak=True
|
|
|
|
|
)
|
|
|
|
|
self.sendLine("bar", "CAP LS 302")
|
|
|
|
|
caps = self.getCapLs("bar")
|
|
|
|
|
self.assertIn(REGISTER_CAP_NAME, caps)
|
|
|
|
|
self.assertNotIn("email-required", (caps[REGISTER_CAP_NAME] or "").split(","))
|
|
|
|
|
self.sendLine("bar", "REGISTER * * shivarampassphrase")
|
|
|
|
|
msgs = self.getMessages("bar")
|
|
|
|
|
register_response = [msg for msg in msgs if msg.command == "REGISTER"][0]
|
|
|
|
|
self.assertMessageMatch(register_response, params=["SUCCESS", ANYSTR, ANYSTR])
|
|
|
|
|
|
|
|
|
|
def testRegisterSameName(self):
|
|
|
|
|
"""
|
|
|
|
|
Requested account name is the same as the nick
|
|
|
|
|
"""
|
|
|
|
|
self.connectClient(
|
|
|
|
|
"bar", name="bar", capabilities=[REGISTER_CAP_NAME], skip_if_cap_nak=True
|
|
|
|
|
)
|
|
|
|
|
self.sendLine("bar", "CAP LS 302")
|
|
|
|
|
caps = self.getCapLs("bar")
|
|
|
|
|
self.assertIn(REGISTER_CAP_NAME, caps)
|
|
|
|
|
self.assertNotIn("email-required", (caps[REGISTER_CAP_NAME] or "").split(","))
|
|
|
|
|
self.sendLine("bar", "REGISTER bar * shivarampassphrase")
|
|
|
|
|
msgs = self.getMessages("bar")
|
|
|
|
|
register_response = [msg for msg in msgs if msg.command == "REGISTER"][0]
|
|
|
|
|
self.assertMessageMatch(register_response, params=["SUCCESS", ANYSTR, ANYSTR])
|
|
|
|
|
|
|
|
|
|
def testRegisterDifferentName(self):
|
|
|
|
|
"""
|
|
|
|
|
Requested account name differs from the nick
|
|
|
|
|
"""
|
|
|
|
|
self.connectClient(
|
|
|
|
|
"bar", name="bar", capabilities=[REGISTER_CAP_NAME], skip_if_cap_nak=True
|
|
|
|
|
)
|
|
|
|
|
self.sendLine("bar", "CAP LS 302")
|
|
|
|
|
caps = self.getCapLs("bar")
|
|
|
|
|
self.assertIn(REGISTER_CAP_NAME, caps)
|
|
|
|
|
self.assertNotIn("email-required", (caps[REGISTER_CAP_NAME] or "").split(","))
|
|
|
|
|
self.sendLine("bar", "REGISTER foo * shivarampassphrase")
|
|
|
|
|
if "custom-account-name" in (caps[REGISTER_CAP_NAME] or "").split(","):
|
|
|
|
|
msgs = self.getMessages("bar")
|
|
|
|
|
register_response = [msg for msg in msgs if msg.command == "REGISTER"][0]
|
|
|
|
|
self.assertMessageMatch(
|
|
|
|
|
register_response, params=["SUCCESS", ANYSTR, ANYSTR]
|
|
|
|
|
)
|
|
|
|
|
else:
|
|
|
|
|
self.assertMessageMatch(
|
|
|
|
|
self.getMessage("bar"),
|
|
|
|
|
command="FAIL",
|
|
|
|
|
params=["REGISTER", "ACCOUNT_NAME_MUST_BE_NICK", "foo", ANYSTR],
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
2022-11-20 22:33:20 +00:00
|
|
|
|
@cases.mark_services
|
2021-08-08 22:29:57 +00:00
|
|
|
|
@cases.mark_specifications("IRCv3")
|
2021-09-10 05:03:41 +00:00
|
|
|
|
class RegisterBeforeConnectTestCase(cases.BaseServerTestCase):
|
2021-02-17 21:43:37 +00:00
|
|
|
|
@staticmethod
|
2021-02-28 12:40:08 +00:00
|
|
|
|
def config() -> cases.TestCaseControllerConfig:
|
|
|
|
|
return cases.TestCaseControllerConfig(
|
2023-09-24 11:26:32 +00:00
|
|
|
|
account_registration_requires_email=False,
|
|
|
|
|
account_registration_before_connect=True,
|
2021-02-28 12:40:08 +00:00
|
|
|
|
)
|
2020-10-09 12:38:53 +00:00
|
|
|
|
|
|
|
|
|
def testBeforeConnect(self):
|
2021-02-22 18:02:13 +00:00
|
|
|
|
self.addClient("bar")
|
2021-07-04 13:04:48 +00:00
|
|
|
|
self.requestCapabilities("bar", [REGISTER_CAP_NAME], skip_if_cap_nak=True)
|
2021-07-30 16:10:49 +00:00
|
|
|
|
self.sendLine("bar", "CAP LS 302")
|
2021-02-22 18:02:13 +00:00
|
|
|
|
caps = self.getCapLs("bar")
|
2020-10-09 12:38:53 +00:00
|
|
|
|
self.assertIn(REGISTER_CAP_NAME, caps)
|
2023-09-24 11:26:32 +00:00
|
|
|
|
self.assertIn("before-connect", caps[REGISTER_CAP_NAME] or "")
|
2021-02-22 18:02:13 +00:00
|
|
|
|
self.sendLine("bar", "NICK bar")
|
2021-07-07 13:04:22 +00:00
|
|
|
|
self.sendLine("bar", "REGISTER * * shivarampassphrase")
|
2021-02-22 18:02:13 +00:00
|
|
|
|
msgs = self.getMessages("bar")
|
|
|
|
|
register_response = [msg for msg in msgs if msg.command == "REGISTER"][0]
|
2021-02-28 19:44:50 +00:00
|
|
|
|
self.assertMessageMatch(register_response, params=["SUCCESS", ANYSTR, ANYSTR])
|
2021-02-22 18:02:13 +00:00
|
|
|
|
|
2020-10-09 12:38:53 +00:00
|
|
|
|
|
2022-11-20 22:33:20 +00:00
|
|
|
|
@cases.mark_services
|
2021-08-08 22:29:57 +00:00
|
|
|
|
@cases.mark_specifications("IRCv3")
|
2021-09-10 05:03:41 +00:00
|
|
|
|
class RegisterBeforeConnectDisallowedTestCase(cases.BaseServerTestCase):
|
2021-02-17 21:43:37 +00:00
|
|
|
|
@staticmethod
|
2021-02-28 12:40:08 +00:00
|
|
|
|
def config() -> cases.TestCaseControllerConfig:
|
|
|
|
|
return cases.TestCaseControllerConfig(
|
2023-09-24 11:26:32 +00:00
|
|
|
|
account_registration_requires_email=False,
|
|
|
|
|
account_registration_before_connect=False,
|
2021-02-28 12:40:08 +00:00
|
|
|
|
)
|
2020-10-09 12:38:53 +00:00
|
|
|
|
|
|
|
|
|
def testBeforeConnect(self):
|
2021-02-22 18:02:13 +00:00
|
|
|
|
self.addClient("bar")
|
2021-07-04 13:04:48 +00:00
|
|
|
|
self.requestCapabilities("bar", [REGISTER_CAP_NAME], skip_if_cap_nak=True)
|
2021-07-30 16:10:49 +00:00
|
|
|
|
self.sendLine("bar", "CAP LS 302")
|
2021-02-22 18:02:13 +00:00
|
|
|
|
caps = self.getCapLs("bar")
|
2020-10-09 12:38:53 +00:00
|
|
|
|
self.assertIn(REGISTER_CAP_NAME, caps)
|
2023-09-24 11:26:32 +00:00
|
|
|
|
self.assertNotIn("before-connect", caps[REGISTER_CAP_NAME] or "")
|
2021-02-22 18:02:13 +00:00
|
|
|
|
self.sendLine("bar", "NICK bar")
|
2021-07-07 13:04:22 +00:00
|
|
|
|
self.sendLine("bar", "REGISTER * * shivarampassphrase")
|
2021-02-22 18:02:13 +00:00
|
|
|
|
msgs = self.getMessages("bar")
|
|
|
|
|
fail_response = [msg for msg in msgs if msg.command == "FAIL"][0]
|
2021-02-28 19:44:50 +00:00
|
|
|
|
self.assertMessageMatch(
|
2021-02-28 22:30:56 +00:00
|
|
|
|
fail_response,
|
|
|
|
|
params=["REGISTER", "COMPLETE_CONNECTION_REQUIRED", ANYSTR, ANYSTR],
|
2021-02-28 19:44:50 +00:00
|
|
|
|
)
|
2021-02-22 18:02:13 +00:00
|
|
|
|
|
2020-10-09 12:38:53 +00:00
|
|
|
|
|
2022-11-20 22:33:20 +00:00
|
|
|
|
@cases.mark_services
|
2021-08-08 22:29:57 +00:00
|
|
|
|
@cases.mark_specifications("IRCv3")
|
2023-09-24 11:26:32 +00:00
|
|
|
|
class RegisterEmailVerifiedBeforeConnectTestCase(cases.BaseServerTestCase):
|
2021-02-17 21:43:37 +00:00
|
|
|
|
@staticmethod
|
2021-02-28 12:40:08 +00:00
|
|
|
|
def config() -> cases.TestCaseControllerConfig:
|
|
|
|
|
return cases.TestCaseControllerConfig(
|
2023-09-24 11:26:32 +00:00
|
|
|
|
account_registration_requires_email=True,
|
|
|
|
|
account_registration_before_connect=True,
|
2021-02-28 12:40:08 +00:00
|
|
|
|
)
|
2020-10-09 12:38:53 +00:00
|
|
|
|
|
|
|
|
|
def testBeforeConnect(self):
|
2021-02-22 18:02:13 +00:00
|
|
|
|
self.addClient("bar")
|
2021-07-04 13:04:48 +00:00
|
|
|
|
self.requestCapabilities(
|
|
|
|
|
"bar", capabilities=[REGISTER_CAP_NAME], skip_if_cap_nak=True
|
|
|
|
|
)
|
2021-07-30 16:10:49 +00:00
|
|
|
|
self.sendLine("bar", "CAP LS 302")
|
2021-02-22 18:02:13 +00:00
|
|
|
|
caps = self.getCapLs("bar")
|
2020-10-09 12:38:53 +00:00
|
|
|
|
self.assertIn(REGISTER_CAP_NAME, caps)
|
2023-09-24 11:26:32 +00:00
|
|
|
|
self.assertIn("email-required", caps[REGISTER_CAP_NAME] or "")
|
|
|
|
|
self.assertIn("before-connect", caps[REGISTER_CAP_NAME] or "")
|
2021-02-22 18:02:13 +00:00
|
|
|
|
self.sendLine("bar", "NICK bar")
|
2021-07-07 13:04:22 +00:00
|
|
|
|
self.sendLine("bar", "REGISTER * * shivarampassphrase")
|
2021-02-22 18:02:13 +00:00
|
|
|
|
msgs = self.getMessages("bar")
|
|
|
|
|
fail_response = [msg for msg in msgs if msg.command == "FAIL"][0]
|
2021-02-28 19:44:50 +00:00
|
|
|
|
self.assertMessageMatch(
|
|
|
|
|
fail_response, params=["REGISTER", "INVALID_EMAIL", ANYSTR, ANYSTR]
|
|
|
|
|
)
|
2020-10-09 12:38:53 +00:00
|
|
|
|
|
2023-09-24 11:26:32 +00:00
|
|
|
|
|
|
|
|
|
@cases.mark_services
|
|
|
|
|
@cases.mark_specifications("IRCv3")
|
|
|
|
|
class RegisterEmailVerifiedAfterConnectTestCase(cases.BaseServerTestCase):
|
|
|
|
|
@staticmethod
|
|
|
|
|
def config() -> cases.TestCaseControllerConfig:
|
|
|
|
|
return cases.TestCaseControllerConfig(
|
|
|
|
|
account_registration_before_connect=False,
|
|
|
|
|
account_registration_requires_email=True,
|
|
|
|
|
)
|
|
|
|
|
|
2020-10-09 12:38:53 +00:00
|
|
|
|
def testAfterConnect(self):
|
2021-07-04 13:04:48 +00:00
|
|
|
|
self.connectClient(
|
|
|
|
|
"bar", name="bar", capabilities=[REGISTER_CAP_NAME], skip_if_cap_nak=True
|
|
|
|
|
)
|
2023-09-24 11:26:32 +00:00
|
|
|
|
self.sendLine("bar", "CAP LS 302")
|
|
|
|
|
caps = self.getCapLs("bar")
|
|
|
|
|
self.assertIn(REGISTER_CAP_NAME, caps)
|
|
|
|
|
self.assertIn("email-required", caps[REGISTER_CAP_NAME] or "")
|
2021-07-07 13:04:22 +00:00
|
|
|
|
self.sendLine("bar", "REGISTER * * shivarampassphrase")
|
2021-02-22 18:02:13 +00:00
|
|
|
|
msgs = self.getMessages("bar")
|
|
|
|
|
fail_response = [msg for msg in msgs if msg.command == "FAIL"][0]
|
2021-02-28 19:44:50 +00:00
|
|
|
|
self.assertMessageMatch(
|
|
|
|
|
fail_response, params=["REGISTER", "INVALID_EMAIL", ANYSTR, ANYSTR]
|
|
|
|
|
)
|
2021-02-22 18:02:13 +00:00
|
|
|
|
|
2020-10-09 12:38:53 +00:00
|
|
|
|
|
2022-11-20 22:33:20 +00:00
|
|
|
|
@cases.mark_services
|
2021-08-10 16:42:37 +00:00
|
|
|
|
@cases.mark_specifications("IRCv3", "Ergo")
|
2021-09-10 05:03:41 +00:00
|
|
|
|
class RegisterNoLandGrabsTestCase(cases.BaseServerTestCase):
|
2021-02-17 21:43:37 +00:00
|
|
|
|
@staticmethod
|
2021-02-28 12:40:08 +00:00
|
|
|
|
def config() -> cases.TestCaseControllerConfig:
|
|
|
|
|
return cases.TestCaseControllerConfig(
|
2023-09-24 11:26:32 +00:00
|
|
|
|
account_registration_requires_email=False,
|
|
|
|
|
account_registration_before_connect=True,
|
2021-02-28 12:40:08 +00:00
|
|
|
|
)
|
2020-10-09 12:38:53 +00:00
|
|
|
|
|
|
|
|
|
def testBeforeConnect(self):
|
|
|
|
|
# have an anonymous client take the 'root' username:
|
2021-07-04 13:04:48 +00:00
|
|
|
|
self.connectClient(
|
|
|
|
|
"root", name="root", capabilities=[REGISTER_CAP_NAME], skip_if_cap_nak=True
|
|
|
|
|
)
|
2020-10-09 12:38:53 +00:00
|
|
|
|
|
|
|
|
|
# cannot register it out from under the anonymous nick holder:
|
2021-02-22 18:02:13 +00:00
|
|
|
|
self.addClient("bar")
|
|
|
|
|
self.sendLine("bar", "NICK root")
|
2021-07-07 13:04:22 +00:00
|
|
|
|
self.sendLine("bar", "REGISTER * * shivarampassphrase")
|
2021-02-22 18:02:13 +00:00
|
|
|
|
msgs = self.getMessages("bar")
|
|
|
|
|
fail_response = [msg for msg in msgs if msg.command == "FAIL"][0]
|
2021-02-28 19:44:50 +00:00
|
|
|
|
self.assertMessageMatch(
|
|
|
|
|
fail_response, params=["REGISTER", "USERNAME_EXISTS", ANYSTR, ANYSTR]
|
|
|
|
|
)
|