From 0bca5fa832a068af7aa623d3d9a7b453ef8af887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Thu, 1 Dec 2022 06:03:22 +0100 Subject: General cleanaup. --- mu4web/main.py | 35 ++++++++++++++--------------------- mu4web/mu.py | 22 +--------------------- mu4web/user/__init__.py | 11 ++--------- mu4web/user/pam.py | 2 +- 4 files changed, 18 insertions(+), 52 deletions(-) diff --git a/mu4web/main.py b/mu4web/main.py index d57cc64..276f261 100644 --- a/mu4web/main.py +++ b/mu4web/main.py @@ -1,9 +1,6 @@ from email.message import EmailMessage from email.headerregistry import Address from urllib.parse import urlencode -import password -from password import Passwords -import os from datetime import datetime from flask_login import ( LoginManager, @@ -13,9 +10,7 @@ from flask_login import ( logout_user, ) from typing import ( - Literal, Optional, - Union, cast, ) from mu import get_mail @@ -25,11 +20,9 @@ from user.local import LocalUser from user.pam import PamUser from maildir import find_maildirs, serialize_maildir - import flask from flask import ( Flask, - session, request, redirect, url_for, @@ -179,7 +172,7 @@ def page_base(title: Optional[str] = None, )))) -def response_for(id: str, username: Optional[str] = None) -> str: +def response_for(id: str) -> str: mail = cast(EmailMessage, get_mail(id)) @@ -264,11 +257,8 @@ def search_field(q: str) -> HTML: ('input', {'type': 'Submit', 'value': 'Sök'})) -SortDirection = Union[Literal['rising'], - Literal['falling']] - - -def search_result(q: str, by: Optional[mu.Sortfield], direction: SortDirection) -> HTML: +def search_result(q: str, by: Optional[str], direction: str) -> HTML: + assert direction in ('rising', 'falling') # keys = ['from', 'to', 'subject', 'date', 'size', 'maildir', 'msgid'] keys = ['from', 'to', 'subject', 'date'] @@ -317,8 +307,8 @@ def search_result(q: str, by: Optional[mu.Sortfield], direction: SortDirection) ('tbody', body))) -def search_page(q: str, by: Optional[mu.Sortfield], - direction: SortDirection) -> str: +def search_page(q: str, by: Optional[str], + direction: str) -> str: main_body = [search_field(q)] if q: @@ -342,7 +332,6 @@ def index_page(): body = [('div', ('table', ('tbody', rows))), ('div', entries), ] - return render_document(page_base(title='Mail index', body=body)) @@ -376,7 +365,7 @@ def search_page_(): direction = request.args.get('direction', DEFAULT_DIRECTION) if direction not in ('rising', 'falling'): direction = DEFAULT_DIRECTION - return search_page(request.args.get('q'), + return search_page(request.args.get('q', ''), request.args.get('by', None), direction) @@ -396,7 +385,7 @@ def multipart_page(msg_id: str, attachement_idx - Index of attachement in top level mail. Needed for links to work. """ - tree, idx = attachement_tree(msg_id, attachement, attachement_idx) + tree, _ = attachement_tree(msg_id, attachement, attachement_idx) body: list[HTML] = [('a', {'href': '/?' + urlencode({'id': msg_id})}, 'Återvänd till brev'), ('ul', tree), @@ -422,7 +411,7 @@ def attachement_response(attachement: EmailMessage): @app.route('/raw') @login_required def raw_message(): - msg_id = request.args.get('id') + msg_id = request.args.get('id', '') filename = mu.find_file(msg_id) if not filename: return 'No message with that id', 404 @@ -433,12 +422,16 @@ def raw_message(): @login_required def attachement_part_page(): msg_id = request.args.get('id') - attachement_idx = int(request.args.get('idx')) + if not msg_id: + return "Message id required", 404 + attachement_idx = int(request.args.get('idx', 0)) mail = cast(EmailMessage, get_mail(msg_id)) attachement = list(mail.walk())[attachement_idx] if attachement.is_multipart(): - return multipart_page() + return multipart_page(msg_id, + attachement, + attachement_idx) else: return attachement_response(attachement) diff --git a/mu4web/mu.py b/mu4web/mu.py index bcce0ed..0029870 100644 --- a/mu4web/mu.py +++ b/mu4web/mu.py @@ -62,30 +62,10 @@ class MuError(Exception): return repr(self) -Sortfield = Union[Literal['cc'], - Literal['c'], - Literal['bcc'], - Literal['h'], - Literal['date'], - Literal['d'], - Literal['from'], - Literal['f'], - Literal['maildir'], - Literal['m'], - Literal['msgid'], - Literal['i'], - Literal['prio'], - Literal['p'], - Literal['subject'], - Literal['s'], - Literal['to'], - Literal['t'], - Literal['list'], - Literal['v']] def search(query: str, - sortfield: Optional[Sortfield] = 'subject', + sortfield: Optional[str] = 'subject', reverse: bool = False) -> list[dict[str, str]]: """ [Parameters] diff --git a/mu4web/user/__init__.py b/mu4web/user/__init__.py index 490bcee..1ecc49f 100644 --- a/mu4web/user/__init__.py +++ b/mu4web/user/__init__.py @@ -1,26 +1,19 @@ -import os - - class User: def __init__(self, username: str): self._username = username self._authenticated = False - # @property def is_authenticated(self): return self._authenticated - # @property def is_active(self): return True - # @property def is_anonymous(self): return False - # @property def get_id(self): return self._username - def validate(self, password: str) -> bool: - ... + def validate(self, _: str) -> bool: + raise NotImplementedError() diff --git a/mu4web/user/pam.py b/mu4web/user/pam.py index 7942f3b..ed86afe 100644 --- a/mu4web/user/pam.py +++ b/mu4web/user/pam.py @@ -2,5 +2,5 @@ from . import User import pam class PamUser(User): - def validate(self, password): + def validate(self, password: str) -> bool: return pam.authenticate(self._username, password) -- cgit v1.2.3