diff --git a/src/bouncer/backlog.py b/src/bouncer/backlog.py index 979c14d..880c600 100644 --- a/src/bouncer/backlog.py +++ b/src/bouncer/backlog.py @@ -187,7 +187,8 @@ class Backlog: """ assert self._db is not None await self._db.execute( - "INSERT INTO nickserv_creds (network, nick, password, email, registered_at, host, status, verify_url) " + "INSERT INTO nickserv_creds " + "(network, nick, password, email, registered_at, host, status, verify_url) " "VALUES (?, ?, ?, ?, ?, ?, ?, ?) " "ON CONFLICT(network, nick) DO UPDATE SET " "password = excluded.password, email = excluded.email, " @@ -231,7 +232,10 @@ class Backlog: async def get_nickserv_creds_by_host( self, network: str, host: str ) -> tuple[str, str] | None: - """Get stored verified NickServ nick and password by host. Returns (nick, password) or None.""" + """Get stored verified NickServ nick and password by host. + + Returns (nick, password) or None. + """ assert self._db is not None cursor = await self._db.execute( "SELECT nick, password FROM nickserv_creds " diff --git a/src/bouncer/network.py b/src/bouncer/network.py index 4b4c7bf..c803f53 100644 --- a/src/bouncer/network.py +++ b/src/bouncer/network.py @@ -492,7 +492,7 @@ class Network: Called immediately after SASL PLAIN success so the fingerprint is registered before a potential K-line disconnects us. """ - from bouncer.cert import fingerprint, has_cert, cert_path + from bouncer.cert import cert_path, fingerprint, has_cert nick = self._sasl_nick or self.nick if not has_cert(self.data_dir, self.cred_network, nick): @@ -594,14 +594,19 @@ class Network: ) if creds: stored_nick, stored_pass = creds - log.info("[%s] found stored creds for nick %s, switching", self.cfg.name, stored_nick) + log.info("[%s] found stored creds for nick %s, switching", + self.cfg.name, stored_nick) # Switch to the registered nick first self._nick_confirmed.clear() await self.send_raw("NICK", stored_nick) try: - await asyncio.wait_for(self._nick_confirmed.wait(), timeout=self.bouncer_cfg.nick_timeout) + await asyncio.wait_for( + self._nick_confirmed.wait(), + timeout=self.bouncer_cfg.nick_timeout, + ) except asyncio.TimeoutError: - log.warning("[%s] nick change to %s not confirmed", self.cfg.name, stored_nick) + log.warning("[%s] nick change to %s not confirmed", + self.cfg.name, stored_nick) self._nickserv_password = stored_pass self._nickserv_pending = "identify" @@ -687,7 +692,7 @@ class Network: return if "you are now logged in" in lower: - self._status(f"Q auth successful") + self._status("Q auth successful") log.info("[%s] Q AUTH succeeded", self.cfg.name) self._nickserv_pending = "" # Switch to configured nick if set @@ -695,7 +700,10 @@ class Network: self._nick_confirmed.clear() await self.send_raw("NICK", self.cfg.nick) try: - await asyncio.wait_for(self._nick_confirmed.wait(), timeout=self.bouncer_cfg.nick_timeout) + await asyncio.wait_for( + self._nick_confirmed.wait(), + timeout=self.bouncer_cfg.nick_timeout, + ) except asyncio.TimeoutError: log.warning("[%s] nick change to %s not confirmed", self.cfg.name, self.cfg.nick) @@ -798,7 +806,7 @@ class Network: self._nickserv_pending = "" await self._nickserv_register() elif "too soon" in lower or "wait" in lower or "too many" in lower: - self._status(f"REGISTER rejected (too soon/rate limited)") + self._status("REGISTER rejected (too soon/rate limited)") log.warning("[%s] NickServ rate limited: %s", self.cfg.name, text) self._nickserv_pending = "" await self._nickserv_complete() @@ -837,7 +845,7 @@ class Network: url = match.group(1) token = url.rsplit("/verify/", 1)[-1] if "/verify/" in url else "" log.info("[%s] visiting verification URL: %s", self.cfg.name, url) - self._status(f"visiting verification URL...") + self._status("visiting verification URL...") try: import aiohttp from aiohttp_socks import ProxyConnector @@ -1005,7 +1013,10 @@ class Network: self._nick_confirmed.clear() await self.send_raw("NICK", p_nick) try: - await asyncio.wait_for(self._nick_confirmed.wait(), timeout=self.bouncer_cfg.nick_timeout) + await asyncio.wait_for( + self._nick_confirmed.wait(), + timeout=self.bouncer_cfg.nick_timeout, + ) except asyncio.TimeoutError: log.warning("[%s] could not switch to pending nick %s", self.cfg.name, p_nick) diff --git a/tests/test_cert.py b/tests/test_cert.py index 7639e13..1a294e7 100644 --- a/tests/test_cert.py +++ b/tests/test_cert.py @@ -91,7 +91,6 @@ class TestGenerateCert: assert fp1 != fp2 # New cert = new fingerprint def test_custom_validity_days(self, data_dir: Path) -> None: - import datetime from cryptography import x509 as x509_mod pem = generate_cert(data_dir, "libera", "testnick", validity_days=365) cert_data = pem.read_bytes() diff --git a/tests/test_network.py b/tests/test_network.py index 5b5e263..13252e2 100644 --- a/tests/test_network.py +++ b/tests/test_network.py @@ -324,7 +324,8 @@ class TestHandleWelcome: writer.drain = AsyncMock() net._writer = writer - await net._handle(_msg(":server 001 coolguy :Welcome to the network coolguy!user@host.example.com")) + welcome = ":server 001 coolguy :Welcome to the network coolguy!user@host.example.com" + await net._handle(_msg(welcome)) assert net.nick == "coolguy" assert net.state == State.PROBATION @@ -337,7 +338,8 @@ class TestHandleWelcome: writer.drain = AsyncMock() net._writer = writer - await net._handle(_msg(":server 001 nick :Welcome to the IRC Network nick!user@visible.host.com")) + welcome = ":server 001 nick :Welcome to the IRC Network nick!user@visible.host.com" + await net._handle(_msg(welcome)) assert net.visible_host == "visible.host.com"