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?
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 = ""

Reply via email to