More pylint cleanup
This commit is contained in:
		
							
								
								
									
										27
									
								
								DEVNOTES.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								DEVNOTES.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					## Running just one test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					python -m unittest tests.test_pop.TestPop3.test_CAPA
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Patch for enable logging in test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Patch generated using below
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					git diff --patch -U1 tests >> ./DEVNOTES.md
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					git apply - <<PATCH
 | 
				
			||||||
 | 
					diff --git a/tests/test_pop.py b/tests/test_pop.py
 | 
				
			||||||
 | 
					index 55c1a91..a825665 100644
 | 
				
			||||||
 | 
					--- a/tests/test_pop.py
 | 
				
			||||||
 | 
					+++ b/tests/test_pop.py
 | 
				
			||||||
 | 
					@@ -55,3 +55,3 @@ def setUpModule() -> None:
 | 
				
			||||||
 | 
					     global MAILS_PATH
 | 
				
			||||||
 | 
					-    logging.basicConfig(level=logging.CRITICAL)
 | 
				
			||||||
 | 
					+    logging.basicConfig(level=logging.DEBUG)
 | 
				
			||||||
 | 
					     td = tempfile.TemporaryDirectory(prefix="m41.pop.")
 | 
				
			||||||
 | 
					PATCH
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
@@ -96,11 +96,10 @@ def parse_checkers(cfg: Config) -> list[Checker]:
 | 
				
			|||||||
            raise Exception("Both addrs and addr_rexs is set")
 | 
					            raise Exception("Both addrs and addr_rexs is set")
 | 
				
			||||||
        if m.addrs:
 | 
					        if m.addrs:
 | 
				
			||||||
            return lambda malias: malias in m.addrs
 | 
					            return lambda malias: malias in m.addrs
 | 
				
			||||||
        elif m.addr_rexs:
 | 
					        if m.addr_rexs:
 | 
				
			||||||
            compiled_res = [re.compile(reg) for reg in m.addr_rexs]
 | 
					            compiled_res = [re.compile(reg) for reg in m.addr_rexs]
 | 
				
			||||||
            return lambda malias: any(reg.match(malias) for reg in compiled_res)
 | 
					            return lambda malias: any(reg.match(malias) for reg in compiled_res)
 | 
				
			||||||
        else:
 | 
					        raise Exception("Neither addrs nor addr_rexs is set")
 | 
				
			||||||
            raise Exception("Neither addrs nor addr_rexs is set")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    matches = {m.name: make_match_fn(Match(m)) for m in cfg.matches or []}
 | 
					    matches = {m.name: make_match_fn(Match(m)) for m in cfg.matches or []}
 | 
				
			||||||
    matches[DEFAULT_MATCH_ALL] = lambda _: True
 | 
					    matches[DEFAULT_MATCH_ALL] = lambda _: True
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -72,14 +72,14 @@ class PopLogger(logging.LoggerAdapter):
 | 
				
			|||||||
    def __init__(self):
 | 
					    def __init__(self):
 | 
				
			||||||
        super().__init__(logging.getLogger("pop3"), None)
 | 
					        super().__init__(logging.getLogger("pop3"), None)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def process(self, msg, kwargs):
 | 
					    def process(self, log_msg, kwargs):
 | 
				
			||||||
        state: State = c_state.get(None)
 | 
					        st: State = c_state.get(None)
 | 
				
			||||||
        if not state:
 | 
					        if not st:
 | 
				
			||||||
            return super().process(msg, kwargs)
 | 
					            return super().process(log_msg, kwargs)
 | 
				
			||||||
        user = "NA"
 | 
					        user = "NA"
 | 
				
			||||||
        if state.username:
 | 
					        if st.username:
 | 
				
			||||||
            user = state.username
 | 
					            user = st.username
 | 
				
			||||||
        return super().process(f"{state.ip} {state.req_id} {user} {msg}", kwargs)
 | 
					        return super().process(f"{st.ip} {st.req_id} {user} {log_msg}", kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
logger = PopLogger()
 | 
					logger = PopLogger()
 | 
				
			||||||
@@ -101,8 +101,7 @@ async def next_req() -> Request:
 | 
				
			|||||||
            if request.cmd == Command.QUIT:
 | 
					            if request.cmd == Command.QUIT:
 | 
				
			||||||
                raise ClientQuit
 | 
					                raise ClientQuit
 | 
				
			||||||
            return request
 | 
					            return request
 | 
				
			||||||
    else:
 | 
					    raise ClientError(f"Bad command {InvalidCommand.RETRIES} times")
 | 
				
			||||||
        raise ClientError(f"Bad command {InvalidCommand.RETRIES} times")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async def expect_cmd(*commands: Command) -> Request:
 | 
					async def expect_cmd(*commands: Command) -> Request:
 | 
				
			||||||
@@ -150,25 +149,23 @@ async def auth_stage() -> None:
 | 
				
			|||||||
                write(ok("Following are supported"))
 | 
					                write(ok("Following are supported"))
 | 
				
			||||||
                write(msg("USER"))
 | 
					                write(msg("USER"))
 | 
				
			||||||
                write(end())
 | 
					                write(end())
 | 
				
			||||||
            else:
 | 
					                continue
 | 
				
			||||||
                await handle_user_pass_auth(req)
 | 
					            await handle_user_pass_auth(req)
 | 
				
			||||||
                if state().username in scfg().loggedin_users:
 | 
					            if state().username in scfg().loggedin_users:
 | 
				
			||||||
                    logger.warning(
 | 
					                logger.warning(
 | 
				
			||||||
                        f"User: {state().username} already has an active session"
 | 
					                    f"User: {state().username} already has an active session"
 | 
				
			||||||
                    )
 | 
					                )
 | 
				
			||||||
                    raise AuthError("Already logged in")
 | 
					                raise AuthError("Already logged in")
 | 
				
			||||||
                else:
 | 
					            scfg().loggedin_users.add(state().username)
 | 
				
			||||||
                    scfg().loggedin_users.add(state().username)
 | 
					            write(ok("Login successful"))
 | 
				
			||||||
                    write(ok("Login successful"))
 | 
					            return
 | 
				
			||||||
                    return
 | 
					 | 
				
			||||||
        except AuthError as ae:
 | 
					        except AuthError as ae:
 | 
				
			||||||
            write(err(f"Auth Failed: {ae}"))
 | 
					            write(err(f"Auth Failed: {ae}"))
 | 
				
			||||||
        except ClientQuit as c:
 | 
					        except ClientQuit:
 | 
				
			||||||
            write(ok("Bye"))
 | 
					            write(ok("Bye"))
 | 
				
			||||||
            logger.warning("Client has QUIT before auth succeeded")
 | 
					            logger.warning("Client has QUIT before auth succeeded")
 | 
				
			||||||
            raise
 | 
					            raise
 | 
				
			||||||
    else:
 | 
					    raise ClientError("Failed to authenticate")
 | 
				
			||||||
        raise ClientError("Failed to authenticate")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def trans_command_capa(_, __) -> None:
 | 
					def trans_command_capa(_, __) -> None:
 | 
				
			||||||
@@ -269,9 +266,8 @@ async def process_transactions(mails_list: list[MailEntry]) -> set[str]:
 | 
				
			|||||||
        except KeyError:
 | 
					        except KeyError:
 | 
				
			||||||
            write(err("Not implemented"))
 | 
					            write(err("Not implemented"))
 | 
				
			||||||
            raise ClientError("We shouldn't reach here")
 | 
					            raise ClientError("We shouldn't reach here")
 | 
				
			||||||
        else:
 | 
					        func(mails, req)
 | 
				
			||||||
            func(mails, req)
 | 
					        await state().writer.drain()
 | 
				
			||||||
            await state().writer.drain()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_deleted_items(deleted_items_path: Path) -> set[str]:
 | 
					def get_deleted_items(deleted_items_path: Path) -> set[str]:
 | 
				
			||||||
@@ -339,12 +335,12 @@ def parse_users(users: list[User]) -> dict[str, tuple[PWInfo, str]]:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def make_pop_server_callback(mails_path: Path, users: list[User], timeout_seconds: int):
 | 
					def make_pop_server_callback(mails_path: Path, users: list[User], timeout_seconds: int):
 | 
				
			||||||
    scfg = SharedState(mails_path=mails_path, users=parse_users(users))
 | 
					    s_state = SharedState(mails_path=mails_path, users=parse_users(users))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async def session_cb(reader: StreamReader, writer: StreamWriter):
 | 
					    async def session_cb(reader: StreamReader, writer: StreamWriter):
 | 
				
			||||||
        c_shared_state.set(scfg)
 | 
					        c_shared_state.set(s_state)
 | 
				
			||||||
        ip, _ = writer.get_extra_info("peername")
 | 
					        ip, _ = writer.get_extra_info("peername")
 | 
				
			||||||
        c_state.set(State(reader=reader, writer=writer, ip=ip, req_id=scfg.next_id()))
 | 
					        c_state.set(State(reader=reader, writer=writer, ip=ip, req_id=s_state.next_id()))
 | 
				
			||||||
        logger.info(f"Got pop server callback")
 | 
					        logger.info(f"Got pop server callback")
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,12 +20,10 @@ class ClientDisconnected(ClientError):
 | 
				
			|||||||
class InvalidCommand(ClientError):
 | 
					class InvalidCommand(ClientError):
 | 
				
			||||||
    RETRIES = 3
 | 
					    RETRIES = 3
 | 
				
			||||||
    """WIll allow NUM_BAD_COMMANDS times"""
 | 
					    """WIll allow NUM_BAD_COMMANDS times"""
 | 
				
			||||||
    pass
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class AuthError(ClientError):
 | 
					class AuthError(ClientError):
 | 
				
			||||||
    RETRIES = 3
 | 
					    RETRIES = 3
 | 
				
			||||||
    pass
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Command(Enum):
 | 
					class Command(Enum):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -42,17 +42,15 @@ async def a_main(cfg: config.Config) -> None:
 | 
				
			|||||||
    def get_tls_context(tls: Union[config.TLSCfg, str]):
 | 
					    def get_tls_context(tls: Union[config.TLSCfg, str]):
 | 
				
			||||||
        if tls == "default":
 | 
					        if tls == "default":
 | 
				
			||||||
            return default_tls_context
 | 
					            return default_tls_context
 | 
				
			||||||
        elif tls == "disable":
 | 
					        if tls == "disable":
 | 
				
			||||||
            return None
 | 
					            return None
 | 
				
			||||||
        else:
 | 
					        tls_cfg = config.TLSCfg(tls)
 | 
				
			||||||
            tls_cfg = config.TLSCfg(tls)
 | 
					        return create_tls_context(tls_cfg.certfile, tls_cfg.keyfile)
 | 
				
			||||||
            return create_tls_context(tls_cfg.certfile, tls_cfg.keyfile)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_host(host):
 | 
					    def get_host(host):
 | 
				
			||||||
        if host == "default":
 | 
					        if host == "default":
 | 
				
			||||||
            return cfg.default_host
 | 
					            return cfg.default_host
 | 
				
			||||||
        else:
 | 
					        return host
 | 
				
			||||||
            return host
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    mbox_finder = config.gen_addr_to_mboxes(cfg)
 | 
					    mbox_finder = config.gen_addr_to_mboxes(cfg)
 | 
				
			||||||
    servers: list[asyncio.Server] = []
 | 
					    servers: list[asyncio.Server] = []
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,6 +24,8 @@ class MyHandler(AsyncMessage):
 | 
				
			|||||||
        super().__init__()
 | 
					        super().__init__()
 | 
				
			||||||
        self.mails_path = mails_path
 | 
					        self.mails_path = mails_path
 | 
				
			||||||
        self.mbox_finder = mbox_finder
 | 
					        self.mbox_finder = mbox_finder
 | 
				
			||||||
 | 
					        self.rcpt_tos = []
 | 
				
			||||||
 | 
					        self.peer = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async def handle_DATA(
 | 
					    async def handle_DATA(
 | 
				
			||||||
        self, server: SMTP, session: SMTPSession, envelope: SMTPEnvelope
 | 
					        self, server: SMTP, session: SMTPSession, envelope: SMTPEnvelope
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user