2012-04-30 07:29:14 -04:00
|
|
|
#!/bin/bash
|
|
|
|
#
|
|
|
|
# GPLv2
|
2012-08-04 19:25:23 -04:00
|
|
|
# GPG Encrypt a Maildir using gpgit.pl, removing any S= or W= virtual flags.
|
|
|
|
# Aug 4, 2012
|
2012-04-30 07:29:14 -04:00
|
|
|
#
|
|
|
|
# Change log:
|
2012-08-04 19:25:23 -04:00
|
|
|
# Aug 4, 2012 (Etienne Perot)
|
|
|
|
# - Remove third argument
|
|
|
|
# - Changed default encryption mode to PGP/MIME (gpgit default)
|
|
|
|
# - No need to specify path to gpgit.pl (assumes it is next to this script)
|
|
|
|
# - No full paths to binaries
|
|
|
|
# - Harmonize indentation
|
|
|
|
# - Rename variables to better names
|
|
|
|
# - Don't use a temporary file to keep track of program state
|
|
|
|
# - Remove security vulnerability during which the (encrypted) message could be read by anyone able to read /tmp for a short while
|
2012-04-30 07:29:14 -04:00
|
|
|
# Sep 03, 2011
|
|
|
|
# - Temporary file is based on file_owner to avoid issues with permission differences.
|
|
|
|
# - Temporary file is removed after run.
|
|
|
|
# - Optional arguments passed to 'find'.
|
|
|
|
# - Full paths to binaries.
|
|
|
|
# - Removed unneccessary need of 'cat', 'grep', etc.
|
|
|
|
# Sep 04, 2011
|
|
|
|
# - Don't remove Dovecot index/uid unless messages have been GPG encrypted.
|
|
|
|
# - Adjust file tests to not just use -e
|
|
|
|
# - Quote all file operations
|
|
|
|
# Sep 05, 2011
|
|
|
|
# - Don't arbitrarily copy files, only overwrite the file in ~/Maildir if it differs after calling gpgencmail.pl
|
|
|
|
# - Only rebuild the index if we have modified ~/Maildir
|
|
|
|
|
2012-08-04 19:25:23 -04:00
|
|
|
# Original source : http://www.dslreports.com/forum/remark,26270484 (retrieved throug google's cache)
|
|
|
|
# Slightly modified by olivier.berger@it-sudparis.eu (https://github.com/olberger/gpgit/commit/2c32d4ec201e8a3f17a9f4eff83d2514f93433e3)
|
|
|
|
# Modified by Etienne Perot
|
2012-04-30 07:29:14 -04:00
|
|
|
|
2012-08-04 20:13:55 -04:00
|
|
|
gpgit="`dirname "$0"`/gpgit"
|
2012-08-04 19:25:23 -04:00
|
|
|
|
|
|
|
if [[ -z "$1" || -z "$2" ]]; then
|
|
|
|
echo "Usage is ./encmaildir.sh /path/to/Maildir certificate_user@domain.com [optional arguments passed to 'find' for messages such as '-mtime 0']"
|
|
|
|
exit 0
|
2012-04-30 07:29:14 -04:00
|
|
|
fi
|
2012-08-04 19:25:23 -04:00
|
|
|
|
2012-04-30 07:29:14 -04:00
|
|
|
if [ ! -d "$1" ]; then
|
2012-08-04 19:25:23 -04:00
|
|
|
echo "The directory of '$1' does not exist!"
|
|
|
|
exit 0
|
2012-04-30 07:29:14 -04:00
|
|
|
fi
|
2012-08-04 19:25:23 -04:00
|
|
|
|
|
|
|
# Does this key exist?
|
|
|
|
gpg --list-keys "$2" > /dev/null 2>&1
|
2012-04-30 07:29:14 -04:00
|
|
|
if [ $? -gt 0 ]; then
|
2012-08-04 19:25:23 -04:00
|
|
|
echo "A GPG key for '$2' could not be found!"
|
|
|
|
exit 0
|
2012-04-30 07:29:14 -04:00
|
|
|
fi
|
|
|
|
|
2012-08-04 19:25:23 -04:00
|
|
|
rebuild_index=0
|
|
|
|
tempmsg="/tmp/msg_`whoami`"
|
|
|
|
|
|
|
|
# Find all files in the Maildir specified.
|
|
|
|
echo "Calling /usr/bin/find \"$1\" -type f -regex '.*/\(cur\|new\)/.*' $3"
|
|
|
|
while IFS= read -d $'\0' -r mail; do
|
|
|
|
# Create file unreadable except by ourselves
|
|
|
|
touch "$tempmsg"
|
|
|
|
chmod 600 "$tempmsg"
|
|
|
|
|
|
|
|
# This is where the magic happens
|
|
|
|
"$gpgit" "$2" < "$mail" >> "$tempmsg"
|
|
|
|
|
|
|
|
# Check to see if there are differences between the existing Maildir file and what was created by gpit.pl
|
|
|
|
diff -qa "$mail" "$tempmsg" > /dev/null 2>&1;
|
|
|
|
if [ $? -gt 0 ]; then
|
|
|
|
# Preserve timestamps, set ownership.
|
|
|
|
chmod "$tempmsg" --reference="$mail"
|
|
|
|
touch "$tempmsg" --reference="$mail"
|
|
|
|
chown "$tempmsg" --reference="$mail"
|
|
|
|
|
|
|
|
# Remove the original Maildir message
|
|
|
|
rm "$mail"
|
|
|
|
|
|
|
|
# Strip message sizes, retain experimental flags and status flags, and copy the file over.
|
|
|
|
strip_size=$(echo "$mail" | sed -e 's/W=[[:digit:]]*//' -e 's/S=[[:digit:]]*//' -e 's/,,//' -e 's/,:2/:2/')
|
|
|
|
cp -av "$tempmsg" "$strip_size"
|
|
|
|
|
|
|
|
# Indexes must be rebuilt, we've modified Maildir.
|
|
|
|
rebuild_index=1
|
|
|
|
else
|
|
|
|
echo "Not copying, no differences between '$tempmsg' and '$mail'"
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Remove the temporary file
|
|
|
|
rm "$tempmsg"
|
|
|
|
done < <(find "$1" -type f -regex '.*/\(cur\|new\)/.*' $3 -print0)
|
2012-04-30 07:29:14 -04:00
|
|
|
|
2012-08-04 19:25:23 -04:00
|
|
|
# Remove Dovecot index and uids for regeneration.
|
|
|
|
if [ "$rebuild_index" -eq 1 ]; then
|
|
|
|
echo "Removing Dovecot indexes and uids"
|
|
|
|
find "$1" -type f -regex '.*\(dovecot-\|dovecot\.\|\.uidvalidity\).*' -delete
|
2012-04-30 07:29:14 -04:00
|
|
|
else
|
2012-08-04 19:25:23 -04:00
|
|
|
echo "No messages found needing GPG encryption, not removing Dovecot indexes and UIDs."
|
2012-04-30 07:29:14 -04:00
|
|
|
fi
|