[Commits] [SCM] claws branch, master, updated. 3.17.4-21-gf26621eea

mones at claws-mail.org mones at claws-mail.org
Fri Sep 20 07:32:52 CET 2019


The branch, master has been updated
       via  f26621eea6336206824b3cf1ff5443d2ce9915b6 (commit)
      from  906217311b7c4097520c0f9258733979fd1275b9 (commit)

Summary of changes:
 tools/README      | 44 ++++++++++++++++++----------------
 tools/fix_date.sh | 71 ++++++++++++++++++++++++++++++++-----------------------
 2 files changed, 65 insertions(+), 50 deletions(-)


- Log -----------------------------------------------------------------
commit f26621eea6336206824b3cf1ff5443d2ce9915b6
Author: Ricardo Mones <ricardo at mones.org>
Date:   Fri Sep 20 09:31:16 2019 +0200

    Update script and doc from web's tools dir

diff --git a/tools/README b/tools/README
index 5383def05..c6310b550 100644
--- a/tools/README
+++ b/tools/README
@@ -592,29 +592,33 @@ Other tools
   Contact: Paul Mangan <paul at claws-mail.org>
   
 
-* fix-date.sh
+* fix_date.sh
 
- WHAT IT DOES
-	Add a 'Date:' header to the selected email(s) when such header is 
-	missing. The correct date is guessed from other headers that contain 
-	timestamp information (preferred: Fetchinfo header if found) or from 
-	the file or system date as a fallback. The order or preference for the
-	date valuereplacement can be changed by editing the script.
-	This script can be used to fix messages that show non RFC-compliant
-	Date headers as well.
-	X-Original-Date is always added too if not already existing (if so,
-	it's left untouched), to keep track of the original value if any.
-	An existing Date: header is not overwritten unless you use the --force
-	switch.
-	Non RFC-compliant dates can be overwritten using the --rfc switch. Use
-	--strict to use strict RFC matching patterns for date values in other
-	headers.
-	
-  HOW TO USE IT
-	fix_date.sh %F
+  Add a 'Date:' header to the selected email(s) when such header is
+  missing.  The correct date is guessed from other headers that
+  contain timestamp information (preferred: Fetchinfo header if found)
+  or from the file or system date as a fallback. The order or
+  preference for the date value replacement can be changed by editing
+  the script.
 
-  Contact: wwp <wwp at claws-mail.org>
+  This script can be used to fix messages that show non RFC-compliant
+  Date headers as well.
+
+  X-Original-Date is always added too if not already existing (if so,
+  it's left untouched), to keep track of the original value if any.
+
+  An existing Date: header is not overwritten unless you use the
+  --force switch.
+
+  Non RFC-compliant dates can be overwritten using the --rfc switch.
+  Use --strict to use strict RFC matching patterns for date values in
+  other headers.
+
+  WORKS ON: selected message(s)
+
+  COMMAND: fix_date.sh %F
 
+  CONTACT: wwp <wwp at claws-mail.org>
 
 * mairix.sh
 
diff --git a/tools/fix_date.sh b/tools/fix_date.sh
index 2c2344d64..1cb8f37aa 100755
--- a/tools/fix_date.sh
+++ b/tools/fix_date.sh
@@ -19,7 +19,7 @@
 # fix_date.sh		helper script to fix non-standard date or add missing
 #					date header to emails
 
-# usage: fix_date.sh <filename> [<filename>..]
+# usage: fix_date.sh <filename> [<filename> ..]
 # It will replace the Date: value w/ the one picked up from more recent
 # Fetchinfo time header, Received: field.. Otherwise, it will take the file
 #  modification time (using a RFC 2822-compliant form).
@@ -28,7 +28,7 @@
 
 # TODO: fallback to X-OriginalArrivalTime: ?
 
-VERSION="0.1.2"
+VERSION="0.1.3"
 
 
 version()
@@ -42,13 +42,13 @@ usage()
 	echo "usage:"
 	echo "  ${0##*/} [<switches>] <filename> [<filename> ..]"
 	echo "switches:"
-	echo "  --help     display this help then exit"
-	echo "  --version  display version information then exit"
-	echo "  --force    always force (re-)writing of Date: header"
-	echo "  --rfc      force re-writing of Date: header when it's not RFC-compliant"
-	echo "  --debug    turn on debug information (be more verbose)"
-	echo "  --strict   use RFC-strict matching patterns for dates"
-	echo "  --         end of switches (in case a filename starts with a -)"
+	echo "  -h --help     display this help then exit"
+	echo "  -v --version  display version information then exit"
+	echo "  -d --debug    turn on debug information (be more verbose)"
+	echo "  -f --force    always force (re-)writing of Date: header"
+	echo "  -r --rfc      force re-writing of Date: header when it's not RFC-compliant"
+	echo "  -s --strict   use RFC-strict matching patterns for dates"
+	echo "  --            end of switches (in case a filename starts with a -)"
 	exit $1
 }
 
@@ -69,6 +69,7 @@ dump_date_fields()
 	echo "Date:$REPLACEMENT_DATE" >> "$TMP"
 }
 
+
 # use --force to always (re-)write the Date header
 # otherwise, the Date header will be written if only it doesn't exist
 FORCE=0
@@ -81,21 +82,23 @@ DEBUG=0
 STRICT=0
 # 0 = valid, always valid until --strict is used, then date_valid overrides this value
 DATE_VALID=0
+# max header lines (300 is a reasonable minimum value but 600 has already been encountered, set to 1000 by security)
+MAX_HEADER_LINES=1000
 
 while [ -n "$1" ]
 do
 	case "$1" in
-	--help)		usage 0;;
-	--version)	version;;
-	--force)	FORCE=1;;
-	--debug)	DEBUG=1;;
-	--rfc)		RFC=1;;
-	--strict)	STRICT=1;;
-	--)			shift
-				break;;
-	-*)			echo "error: unrecognized switch '$1'"
-				usage 1;;
-	*)			break;;
+	-h|--help)		usage 0;;
+	-v|--version)	version;;
+	-f|--force)		FORCE=1;;
+	-d|--debug)		DEBUG=1;;
+	-r|--rfc)		RFC=1;;
+	-s|--strict)	STRICT=1;;
+	--)				shift
+					break;;
+	-*)				echo "error: unrecognized switch '$1'"
+					usage 1;;
+	*)				break;;
 	esac
 	shift
 done
@@ -109,30 +112,38 @@ fi
 test $# -lt 1 && \
 	usage 1
 
-TMP="/tmp/${0##*/}.tmp"
-HEADERS="/tmp/${0##*/}.headers.tmp"
-BODY="/tmp/${0##*/}.body.tmp"
+TMP="/tmp/${0##*/}.$$.tmp"
+HEADERS="/tmp/${0##*/}.$$.headers.tmp"
+BODY="/tmp/${0##*/}.$$.body.tmp"
 
-DATE_REGEXP='( (Mon|Tue|Wed|Thu|Fri|Sat|Sun),)? [0-9]+ (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [0-9]+ [0-9]+:[0-9]+:[0-9]+ [-+]?[0-9]+'
-DATE_REGEXP_STRICT='(Mon|Tue|Wed|Thu|Fri|Sat|Sun), [0-9]+ (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [0-9]+ [0-9]+:[0-9]+:[0-9]+ [-+]?[0-9]+'
+DATE_REGEXP='( (Mon|Tue|Wed|Thu|Fri|Sat|Sun),)? [0-9]+ (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [0-9]+ [0-9]+:[0-9]+:[0-9]+ [+-]?[0-9]+'
+DATE_REGEXP_STRICT='(Mon|Tue|Wed|Thu|Fri|Sat|Sun), [0-9]+ (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [0-9]+ [0-9]+:[0-9]+:[0-9]+ [+-]?[0-9]+'
 
 while [ -n "$1" ]
 do
 	# skip if file is empty or doesn't exist
 	if [ ! -s "$1" ]
 	then
+		test $DEBUG -eq 1 && \
+			echo "$1: no found or empty, skipping"
 		shift
 		continue
 	fi
 	SKIP=0
 
 	# split headers and body
-	# get the empty line (separation between headers and body)
-	SEP=`grep -nEm1 "^$" "$1" 2>/dev/null | cut -d ':' -f 1`
-	if [ -z "$SEP" -o "$SEP" = "0" ]
+	# find the empty line that separates body (if any) from headers,
+	# work on a temporary dos2unix'ed copy because body might
+	# contain DOS CRLF and grep '^$' won't work
+	head -$MAX_HEADER_LINES "$1" | dos2unix > "$TMP"
+	SEP=`grep -nEm1 "^$" "$TMP" 2>/dev/null | cut -d ':' -f 1`
+	rm -f "$TMP"
+	if [ -z "$SEP" -o "$SEP" = "0" -o $? -ne 0 ]
 	then
 		cp -f "$1" "$HEADERS"
 		:> "$BODY"
+		test $DEBUG -eq 1 && \
+			echo "$1: no body part could be found before line $MAX_HEADER_LINES"
 	else
 		sed -n '1,'`expr $SEP - 1`'p' "$1" > "$HEADERS"
 		sed '1,'`expr $SEP - 1`'d' "$1" > "$BODY"
@@ -150,7 +161,7 @@ do
 	test -n "$DATE" && \
 		sed -i '/^Date:/,/^[^\t]/d' "$HEADERS"
 
-	# found a replacement date in Fetchinfo headers
+	# find a replacement date in Fetchinfo: header
 	FETCH_DATE=`grep -im1 'X-FETCH-TIME: ' "$HEADERS" | cut -d ' ' -f 2-`
 	
 	# or in Received: headers ..
@@ -159,7 +170,7 @@ do
 		REGEXP="$DATE_REGEXP_STRICT"
 	RECEIVED_DATE=`sed -n '/^Received:/,/^[^\t]/p' "$HEADERS" | head -n -1 | grep -Eoim 1 "$REGEXP"`
 
-	# .. or from FS
+	# .. or from file properties
 	FILE_DATE=`LC_ALL=POSIX LANG=POSIX ls -l --time-style="+%a, %d %b %Y %X %z" "$1" | tr -s ' ' | cut -d ' ' -f 6-11`
 	# we could also use the system date as a possible replacement
 	SYSTEM_DATE="`date -R`"

-----------------------------------------------------------------------


hooks/post-receive
-- 
Claws Mail


More information about the Commits mailing list