115 lines
3.2 KiB
Bash
Executable File
115 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Encrypt/Decrypt/Check emails with Dovecot's mail-crpyt-plugin
|
|
# This script will encrypt/decrypt emails in-place
|
|
# Please read: https://wiki.dovecot.org/Design/Dcrypt and https://wiki2.dovecot.org/Plugins/MailCrypt
|
|
#
|
|
# Update variables with your keys and patch otherwise you will loose data!
|
|
#
|
|
# I take no responsibility for data loos this script may cause
|
|
#
|
|
# IMPORTANT:
|
|
# BEFORE USE ADD THIS MAGIC(5) TO YOUR LOCAL MAGIC DATABASE:
|
|
#/etc/magic and /etc/magic.mime:
|
|
#0 string CRYPTED MailCrypt
|
|
#!:mime application/mail-crypt
|
|
|
|
count=0
|
|
processed=0
|
|
tempfile=$(mktemp)
|
|
|
|
uid=5000
|
|
gid=5000
|
|
maildir_path=$(pwd)
|
|
private_key_path=/etc/dovecot/ecprivkey.pem
|
|
public_key_path=/etc/dovecot/ecpubkey.pem
|
|
|
|
if [ "$1" == "" ]; then
|
|
echo "Missing user folder"
|
|
exit 1
|
|
fi
|
|
|
|
case $2 in
|
|
encrypt) mode=encrypt; text_d="Encrypting"
|
|
;;
|
|
decrypt) mode=decrypt; text_d="Decrypting"
|
|
;;
|
|
check) mode=check; text_d="Checking"
|
|
;;
|
|
*) echo "Unknown mode. Modes: [encrypt|decrypt|check]"; exit 1
|
|
esac
|
|
|
|
_encrypt(){
|
|
touch -r "$mailmessage" $tempfile
|
|
doveadm -o fs=compress,crypt,posix -o fs_compress_write_method=gz -o fs/compress/fs_driver=compress -o fs/crypt/fs_driver=crypt -o fs/posix/fs_driver=posix -o crypt_private_key_file=$private_key_path -o crypt_global_private_key=main -o crypt_global_private_key/main/crypt_private_key_file=$private_key_path fs put '' "$mailmessage" "$mailmessage"
|
|
touch -r $tempfile "$mailmessage"
|
|
chown $uid:$gid "$mailmessage"
|
|
}
|
|
|
|
_decrypt(){
|
|
touch -r "$mailmessage" $tempfile
|
|
doveadm -o fs=compress,crypt,posix -o fs/compress/fs_driver=compress -o fs/crypt/fs_driver=crypt -o fs/posix/fs_driver=posix -o crypt_private_key_file=$private_key_path -o crypt_global_private_key=main -o crypt_global_private_key/main/crypt_private_key_file=$private_key_path fs get '' "$mailmessage" > .tempdecrypted
|
|
mv .tempdecrypted "$mailmessage"
|
|
touch -r $tempfile "$mailmessage"
|
|
chmod 0600 "$mailmessage"
|
|
chown $uid:$gid "$mailmessage"
|
|
}
|
|
|
|
userdir="$1"
|
|
|
|
if [ ! -d $maildir_path/$userdir/ ];then
|
|
echo "Folder do not exist: $maildir_path/$userdir/"
|
|
exit 1
|
|
fi
|
|
|
|
totalfiles=$(find $maildir_path/$userdir/ -type f ! -iname 'dovecot*' ! -iname 'maildirfolder' ! -iname 'subscriptions' | wc -l | xargs)
|
|
echo
|
|
echo "$text_d mails in $maildir_path/$userdir/"
|
|
echo "Found $totalfiles, processing..."
|
|
echo ". plain text"
|
|
echo "+ gzipped "
|
|
echo "* encrypted "
|
|
echo "< encrypting"
|
|
echo "> decrypting"
|
|
echo
|
|
|
|
# operate in context
|
|
cd $maildir_path/$userdir/
|
|
for mailmessage in `find . -type f ! -iname 'dovecot*' ! -iname 'maildirfolder' ! -iname 'subscriptions'`; do
|
|
message=$(basename "$mailmessage")
|
|
if [ ! -f "$mailmessage" ];then
|
|
continue;
|
|
fi;
|
|
testfiletype=$(file -b --mime-type "$mailmessage")
|
|
if [ "$testfiletype" != "application/mail-crypt" ] ;then
|
|
if [ "$testfiletype" != "application/gzip" ] ;then
|
|
echo -n "."
|
|
else
|
|
echo -n "+"
|
|
fi
|
|
if [ "$mode" == "encrypt" ];then
|
|
_encrypt
|
|
echo -n "<"
|
|
fi
|
|
else
|
|
echo -n "*"
|
|
if [ "$mode" == "decrypt" ];then
|
|
_decrypt
|
|
echo -n ">"
|
|
fi
|
|
fi
|
|
count=$(($count + 1))
|
|
processed=$(($processed + 1))
|
|
if [ $count == 10 ];then
|
|
echo -n "$processed/$totalfiles"
|
|
echo -e
|
|
count=0
|
|
fi
|
|
|
|
|
|
done
|
|
|
|
rm -f $tempfile
|
|
|
|
echo -e "\n\nDone"
|