gpgit/encmaildir.sh

99 lines
3.7 KiB
Bash
Raw Permalink Normal View History

#!/bin/bash
#
# GPLv2
# GPG Encrypt a Maildir using gpgit.pl, removing any S= or W= virtual flags.
# Aug 4, 2012
#
# Change log:
# 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
# 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
# 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-08-04 20:13:55 -04:00
gpgit="`dirname "$0"`/gpgit"
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
fi
if [ ! -d "$1" ]; then
echo "The directory of '$1' does not exist!"
exit 0
fi
# Does this key exist?
gpg --list-keys "$2" > /dev/null 2>&1
if [ $? -gt 0 ]; then
echo "A GPG key for '$2' could not be found!"
exit 0
fi
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)
# 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
else
echo "No messages found needing GPG encryption, not removing Dovecot indexes and UIDs."
fi