This file is indexed.

/usr/share/doc/claws-mail/tools/fix_date.sh is in claws-mail-tools 3.11.1-3+deb8u1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
#!/bin/sh

#  * Copyright 2004 Tristan Chabredier <wwp@claws-mail.org>
#  *
#  * This file is free software; you can redistribute it and/or modify it
#  * under the terms of the GNU General Public License as published by
#  * the Free Software Foundation; either version 3 of the License, or
#  * (at your option) any later version.
#  *
#  * This program is distributed in the hope that it will be useful, but
#  * WITHOUT ANY WARRANTY; without even the implied warranty of
#  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#  * General Public License for more details.
#  *
#  * You should have received a copy of the GNU General Public License
#  * along with this program; if not, write to the Free Software
#  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# fix_date.sh		helper script to fix non-standard date or add missing
#					date header to emails

# 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).
# Any already existing X-Original-Date is kept, if missing we're adding it
# if the Date: was set (even if set w/ non conform value)

# TODO: fallback to X-OriginalArrivalTime: ?

VERSION="0.1.2"


version()
{
	echo "$VERSION"
	exit 0
}

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 -)"
	exit $1
}

date_valid()
{
	test $STRICT -eq 1 && \
		REGEXP="$DATE_REGEXP_STRICT" || \
		REGEXP="$DATE_REGEXP"
		
	echo "$1" | grep -qEim 1 "$REGEXP"
	DATE_VALID=$?
}

dump_date_fields()
{
	test -z "$X_ORIGINAL_DATE" -a -n "$DATE" && \
		echo "X-Original-Date:$DATE" >> "$TMP"
	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
# use --rfc to (re-)write the Date header when it's not RFC-compliant
# otherwise, the Date header will be written if only it doesn't exist
RFC=0
# use --debug to display more information about what's performed
DEBUG=0
# use --strict to use strict matching patterns for date validation
STRICT=0
# 0 = valid, always valid until --strict is used, then date_valid overrides this value
DATE_VALID=0

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;;
	esac
	shift
done

if [ $FORCE -eq 1 -a $RFC -eq 1 ]
then
	echo "error: use either --force or --rfc, but not both at the same time"
	usage 1
fi

test $# -lt 1 && \
	usage 1

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]+'

while [ -n "$1" ]
do
	# skip if file is empty or doesn't exist
	if [ ! -s "$1" ]
	then
		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" ]
	then
		cp -f "$1" "$HEADERS"
		:> "$BODY"
	else
		sed -n '1,'`expr $SEP - 1`'p' "$1" > "$HEADERS"
		sed '1,'`expr $SEP - 1`'d' "$1" > "$BODY"
	fi

	# work on headers only

	# get the Date and X-Original-Date
	X_ORIGINAL_DATE=`sed -n '/^X-Original-Date:/,/^[^\t]/p' "$HEADERS" | head -n -1 | cut -d ':' -f 2-`
	DATE=`sed -n '/^Date:/,/^[^\t]/p' "$HEADERS" | head -n -1 | cut -d ':' -f 2-`

	# work on headers, minus Date and X-Original-Date
	test -n "$X_ORIGINAL_DATE" && \
		sed -i '/^X-Original-Date:/,/^[^\t]/d' "$HEADERS"
	test -n "$DATE" && \
		sed -i '/^Date:/,/^[^\t]/d' "$HEADERS"

	# found a replacement date in Fetchinfo headers
	FETCH_DATE=`grep -im1 'X-FETCH-TIME: ' "$HEADERS" | cut -d ' ' -f 2-`
	
	# or in Received: headers ..
	test $STRICT -eq 1 && \
		REGEXP="$DATE_REGEXP" || \
		REGEXP="$DATE_REGEXP_STRICT"
	RECEIVED_DATE=`sed -n '/^Received:/,/^[^\t]/p' "$HEADERS" | head -n -1 | grep -Eoim 1 "$REGEXP"`

	# .. or from FS
	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`"

	# determine which replacement date to use
	if [ -z "$FETCH_DATE" ]
	then
		if [ -z "$RECEIVED_DATE" ]
		then
			# don't forget the leading whitespace here
			REPLACEMENT_DATE=" $FILE_DATE"
			REPLACEMENT="file date"
#			REPLACEMENT_DATE=" $SYSTEM_DATE"
#			REPLACEMENT="system date"
		else
			REPLACEMENT_DATE="$RECEIVED_DATE"
			REPLACEMENT="received date"
		fi
	else
		# don't forget the leading whitespace here
		REPLACEMENT_DATE=" $FETCH_DATE"
		REPLACEMENT="Fetchinfo time header"
	fi

	# ensure that the original X-Original-Date is kept
	:> "$TMP"
	if [ -n "$X_ORIGINAL_DATE" ]
	then
		echo "X-Original-Date:$X_ORIGINAL_DATE" >> "$TMP"
	fi

	# replace/set the date and write all lines
	test $RFC -eq 1 && \
		date_valid "$DATE"
	if [ -z "$DATE" ]
	then
		test $DEBUG -eq 1 && \
			echo "$1: date not found, using $REPLACEMENT now"
		dump_date_fields
	else
		if [ $FORCE -eq 1 ]
		then
			test $DEBUG -eq 1 && \
				echo "$1: date already found, replacing with $REPLACEMENT"
			dump_date_fields
		else
			if [ $RFC -eq 1 ]
			then
				if [ $DATE_VALID -ne 0 ]
				then
					test $DEBUG -eq 1 && \
						echo "$1: date already found but not RFC-compliant, replacing with $REPLACEMENT"
					dump_date_fields
				else
					test $DEBUG -eq 1 && \
						echo "$1: date already found and RFC-compliant, skipping"
					SKIP=1
				fi
			else
				test $DEBUG -eq 1 && \
					echo "$1: date already found, skipping"
				SKIP=1
			fi
		fi
	fi

	if [ $SKIP -eq 0 ]
	then
		# uncomment the following line to backup the original file
		#mv -f "$1" "$1.bak"

		cat "$HEADERS" >> "$TMP"
		cat "$BODY" >> "$TMP"
		mv -f "$TMP" "$1"
		if [ $? -ne 0 ]
		then
			echo "error while moving '$TMP' to '$1'"
			exit 1
		fi
	fi
	rm -f "$HEADERS" "$BODY" "$TMP" >/dev/null 2>&1

	shift
done
exit 0