On Sat, 18 Sept 2021 at 15:34, Daniel Gruno <[email protected]> wrote: > > On 18/09/2021 05.16, sebb wrote: > > On Sat, 18 Sept 2021 at 03:13, <[email protected]> wrote: > >> > >> This is an automated email from the ASF dual-hosted git repository. > >> > >> humbedooh pushed a commit to branch master > >> in repository > >> https://gitbox.apache.org/repos/asf/incubator-ponymail-foal.git > >> > >> > >> The following commit(s) were added to refs/heads/master by this push: > >> new df57669 Try to locate a better date for the From line. > >> df57669 is described below > >> > >> commit df57669628d5287b854e20ed7245a46fd101af1a > >> Author: Daniel Gruno <[email protected]> > >> AuthorDate: Fri Sep 17 21:13:03 2021 -0500 > >> > >> Try to locate a better date for the From line. > >> > >> This could probably get molded into an external function, but for now > >> it is only needed here. > >> --- > >> server/endpoints/mbox.py | 14 +++++++++++++- > >> 1 file changed, 13 insertions(+), 1 deletion(-) > >> > >> diff --git a/server/endpoints/mbox.py b/server/endpoints/mbox.py > >> index 59cfc01..ec67eae 100644 > >> --- a/server/endpoints/mbox.py > >> +++ b/server/endpoints/mbox.py > >> @@ -26,6 +26,9 @@ import typing > >> import aiohttp.web > >> import asyncio.exceptions > >> import time > >> +import email.utils > >> +import datetime > >> +import dateutil.tz > >> > >> > >> async def convert_source(session: plugins.session.SessionObject, email: > >> dict): > >> @@ -34,7 +37,16 @@ async def convert_source(session: > >> plugins.session.SessionObject, email: dict): > >> source_as_text = source["_source"]["source"] > >> # Ensure it starts with "From "...or fake it > >> if not source_as_text.startswith("From "): > >> - from_line = "From MAILER-DAEMON %s\n" % time.strftime("%a %b > >> %d %H:%M:%S %Y") > >> + from_line = "From MAILER-DAEMON %s\n" % time.strftime("%a %b > >> %d %H:%M:%S %Y", time.gmtime(0)) # Fallback in case no date found > >> + # If we have any Received: headers, we can extrapolate an > >> approximate time from the last (top) one. > >> + from_match = re.search(r"(?:[\r\n]|^)Received:\s+from[^;]+?; > >> (.+?)[\r\n]", source_as_text) > >> + if from_match: > >> + recv_time = email.utils.parsedate_tz(from_match.group(1)) > >> + if recv_time: > >> + dt_tuple = datetime.datetime(*recv_time[:7]) > >> + if recv_time[9]: # If we have an offset, set timezone > >> + dt_tuple = > >> dt_tuple.replace(tzinfo=dateutil.tz.tzoffset("Offset", recv_time[9])) > >> + from_line = "From MAILER-DAEMON %s\n" % > >> dt_tuple.strftime("%a %b %d %H:%M:%S %Y %z") > > > > -1 > > Conversion to a From_ line timestamp c/should use a standard function, > > which can then be tested separately. > > Or at least use a shared constant. > > Doing either of those might have avoided the bug in the above line. > > I don't quite follow here, what bug?
Can you replace the format strings with a single constant? Read the code very carefully... > I went and looked at the RFC for mbox formats, and it suggested that a > datetime.ctime() call would be the best option here, so I've now change > it to do just that. For the fallback, I've just put in jan 1st 1970 as > plain text, there is really no need to call ctime for that. > > > >> source_as_text = from_line + source_as_text > >> # Convert to mboxrd format > >> mboxrd_source = "" >
