This is an automated email from the ASF dual-hosted git repository. sebb pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-ponymail-foal.git
commit 5b23fd3bd2445ac944f6f65125ba7396e38fbc42 Author: Sebb <[email protected]> AuthorDate: Tue Dec 14 12:24:24 2021 +0000 Add type hints --- server/endpoints/gravatar.py | 4 ++-- server/endpoints/mbox.py | 2 +- server/plugins/aaa.py | 6 +++--- server/plugins/auditlog.py | 2 +- server/plugins/background.py | 2 +- server/plugins/database.py | 14 +++++++------- server/plugins/messages.py | 26 +++++++++++++++----------- server/plugins/oauthGeneric.py | 7 ++++--- server/plugins/oauthGithub.py | 2 +- server/plugins/oauthGoogle.py | 5 +++-- server/plugins/session.py | 2 +- 11 files changed, 39 insertions(+), 33 deletions(-) diff --git a/server/endpoints/gravatar.py b/server/endpoints/gravatar.py index c0b1cf9..e5a4b97 100644 --- a/server/endpoints/gravatar.py +++ b/server/endpoints/gravatar.py @@ -29,7 +29,7 @@ gravatars = [] gravatar_cache = {} -async def fetch_gravatar(gid): +async def fetch_gravatar(gid: str) -> None: headers = {"User-Agent": "Pony Mail Agent/0.1"} fetch_url = GRAVATAR_URL % gid # Fetch image and store internally @@ -42,7 +42,7 @@ async def fetch_gravatar(gid): pass -async def gravatar_exists_in_db(session, gid): +async def gravatar_exists_in_db(session: plugins.session.SessionObject, gid: str) -> bool: res = await session.database.search( index=session.database.dbs.db_mbox, size=1, diff --git a/server/endpoints/mbox.py b/server/endpoints/mbox.py index 624a889..27dd2dc 100644 --- a/server/endpoints/mbox.py +++ b/server/endpoints/mbox.py @@ -33,7 +33,7 @@ import email.utils as eutils import datetime -async def convert_source(session: plugins.session.SessionObject, email: dict): +async def convert_source(session: plugins.session.SessionObject, email: dict) -> str: source = await plugins.messages.get_source(session, permalink=email.get("dbid", email["mid"])) if source: source_as_text = source["_source"]["source"] diff --git a/server/plugins/aaa.py b/server/plugins/aaa.py index 789901c..a3f920a 100644 --- a/server/plugins/aaa.py +++ b/server/plugins/aaa.py @@ -23,15 +23,15 @@ It handles rights management for lists. import plugins.session -def can_access_email(session: plugins.session.SessionObject, email) -> bool: +def can_access_email(session: plugins.session.SessionObject, email: dict) -> bool: """Determine if an email can be accessed by the current user""" # If public email, it can always be accessed if not email.get("private", True): # Assume private if the flag is missing return True # If user can access the list, they can read the email - return can_access_list(session, email.get("list_raw")) + return can_access_list(session, email.get("list_raw", None)) -def can_access_list(session: plugins.session.SessionObject, _listid) -> bool: +def can_access_list(session: plugins.session.SessionObject, _listid: str) -> bool: """Determine if a list can be accessed by the current user""" # If logged in via a known oauth, we assume access for now...TO BE CHANGED if session.credentials and session.credentials.authoritative: diff --git a/server/plugins/auditlog.py b/server/plugins/auditlog.py index 955ba82..43d69db 100644 --- a/server/plugins/auditlog.py +++ b/server/plugins/auditlog.py @@ -68,7 +68,7 @@ async def view( yield AuditLogEntry(doc["_source"]) -async def add_entry(session: plugins.session.SessionObject, action: str, target: str, lid: str, log: str): +async def add_entry(session: plugins.session.SessionObject, action: str, target: str, lid: str, log: str) -> None: """ Adds an entry to the audit log""" # Default log entries based on type diff --git a/server/plugins/background.py b/server/plugins/background.py index 72c626d..d61f872 100644 --- a/server/plugins/background.py +++ b/server/plugins/background.py @@ -208,7 +208,7 @@ async def get_public_activity(database: plugins.configuration.DBConfig) -> dict: return activity -async def run_tasks(server: plugins.server.BaseServer): +async def run_tasks(server: plugins.server.BaseServer) -> None: """ Runs long-lived background data gathering tasks such as gathering statistics about email activity and the list of archived mailing lists, for populating the pony mail main index. diff --git a/server/plugins/database.py b/server/plugins/database.py index eccb18b..ffe2d3c 100644 --- a/server/plugins/database.py +++ b/server/plugins/database.py @@ -113,13 +113,13 @@ class Database: return res async def scan(self, - query=None, - scroll="5m", - preserve_order=False, - size=1000, - request_timeout=60, - clear_scroll=True, - scroll_kwargs=None, + query: dict = None, + scroll: str = "5m", + preserve_order: bool = False, + size: int = 1000, + request_timeout: int = 60, + clear_scroll: bool = True, + scroll_kwargs: dict = None, **kwargs) -> typing.AsyncIterator[typing.List[dict]]: scroll_kwargs = scroll_kwargs or {} diff --git a/server/plugins/messages.py b/server/plugins/messages.py index c7da36d..db99c5b 100644 --- a/server/plugins/messages.py +++ b/server/plugins/messages.py @@ -75,7 +75,7 @@ USED_UI_FIELDS = [ MUST_HAVE = [ 'private', 'deleted', 'list_raw'] -def trim_email(doc, external=False): +def trim_email(doc: dict, external: bool = False) -> None: """Trims away document fields not used by the UI""" for header in list(doc.keys()): # Remove meta data fields which start with an underscore @@ -89,7 +89,7 @@ def trim_email(doc, external=False): # Format an email address given a name (optional) and an email address. # Same as email.utils.formataddr except no Unicode escaping happens. -def make_address(name, email): +def make_address(name: str, email: str) -> str: if name and email: quotes = '' if NEEDS_QUOTES.search(name): @@ -103,7 +103,7 @@ def make_address(name, email): # anonymise a string of email entries -def anonymize_mail_address(emailstring): +def anonymize_mail_address(emailstring: str) -> str: out = [] if not emailstring: return "" @@ -116,7 +116,7 @@ def anonymize_mail_address(emailstring): # rejoin one per line return ",\n ".join(out) -def anonymize(doc): +def anonymize(doc: dict) -> dict: """ Anonymizes an email, hiding author email addresses.""" # ES direct hit? ptr: typing.Dict[str, str] = doc @@ -161,7 +161,11 @@ async def find_parent(session, doc: typing.Dict[str, str]): return doc -async def fetch_children(session, pdoc, counter=0, pdocs=None, short=False): +async def fetch_children(session: plugins.session.SessionObject, + pdoc: dict, + counter: int = 0, + pdocs: dict = None, + short: bool = False) -> typing.Tuple[list,list,dict]: """ Fetches all child messages of a parent email """ @@ -169,8 +173,8 @@ async def fetch_children(session, pdoc, counter=0, pdocs=None, short=False): pdocs = {} counter = counter + 1 if counter > 250: - return [] - docs = await get_email_irt(session, pdoc["message-id"]) + return [], [], {} + docs: typing.List[dict] = await get_email_irt(session, pdoc["message-id"]) thread = [] emails = [] @@ -211,8 +215,8 @@ async def fetch_children(session, pdoc, counter=0, pdocs=None, short=False): async def get_email( session: plugins.session.SessionObject, permalink: str = None, - messageid=None, - source=False, + messageid: str = None, + source: bool = False, ) -> typing.Optional[dict]: """ Returns a matching mbox or source document or None @@ -268,8 +272,8 @@ async def get_email( async def get_email_irt( session: plugins.session.SessionObject, - irt, - source=False, + irt: str, + source: bool = False, ) -> typing.List[dict]: """ Returns a list of mbox or source document(s) that are related. May be empty. diff --git a/server/plugins/oauthGeneric.py b/server/plugins/oauthGeneric.py index 77c2d0f..20edd38 100644 --- a/server/plugins/oauthGeneric.py +++ b/server/plugins/oauthGeneric.py @@ -19,11 +19,11 @@ # Generic OAuth plugin import re +import typing import aiohttp.client -async def process(formdata, _session, _server): - js = None +async def process(formdata: dict, _session, _server) -> typing.Optional[dict]: # Extract domain, allowing for :port # Does not handle user/password prefix etc m = re.match(r"https?://([^/:]+)(?::\d+)?/", formdata["oauth_token"]) @@ -35,4 +35,5 @@ async def process(formdata, _session, _server): js = await rv.json() js["oauth_domain"] = oauth_domain js["authoritative"] = True - return js + return js + return None \ No newline at end of file diff --git a/server/plugins/oauthGithub.py b/server/plugins/oauthGithub.py index 07d6f6a..55ae1e9 100644 --- a/server/plugins/oauthGithub.py +++ b/server/plugins/oauthGithub.py @@ -32,7 +32,7 @@ import plugins.server import typing -async def process(formdata, _session, server: plugins.server.BaseServer) -> typing.Optional[dict]: +async def process(formdata: dict, _session, server: plugins.server.BaseServer) -> typing.Optional[dict]: formdata["client_id"] = server.config.oauth.github_client_id formdata["client_secret"] = server.config.oauth.github_client_secret headers = {"Accept": "application/json"} diff --git a/server/plugins/oauthGoogle.py b/server/plugins/oauthGoogle.py index 99edd8c..24a5d5f 100644 --- a/server/plugins/oauthGoogle.py +++ b/server/plugins/oauthGoogle.py @@ -29,11 +29,12 @@ import google.auth.transport.urllib3 # type: ignore import google.oauth2.id_token # type: ignore import plugins.server import plugins.session +import typing import urllib3 -async def process(formdata, _session, server: plugins.server.BaseServer): - js = None +async def process(formdata: dict, _session, server: plugins.server.BaseServer) -> typing.Optional[dict]: + js: typing.Optional[dict] = None request = google.auth.transport.urllib3.Request(urllib3.PoolManager()) # This is a synchronous process, so we offload it to an async runner in order to let the main loop continue. id_info = await server.runners.run( diff --git a/server/plugins/session.py b/server/plugins/session.py index ed44730..ccb8ce7 100644 --- a/server/plugins/session.py +++ b/server/plugins/session.py @@ -184,7 +184,7 @@ async def get_session( return session -async def set_session(server: plugins.server.BaseServer, cid, **credentials): +async def set_session(server: plugins.server.BaseServer, cid: str, **credentials): """Create a new user session in the database""" session_id = str(uuid.uuid4()) cookie: http.cookies.SimpleCookie = http.cookies.SimpleCookie()
