From 6907ef64f2bfe2c2a72fe403f2a626e714ecf98f Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Tue, 3 May 2016 15:20:26 +0200 Subject: Makefile, manpage neu, neue Version --- .gitignore | 2 + Makefile | 47 +++++++++++++ sendmailadvanced | 186 ------------------------------------------------- sendmailadvanced.8.in | 37 ++++++++++ sendmailadvanced.in | 188 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 274 insertions(+), 186 deletions(-) create mode 100644 .gitignore create mode 100644 Makefile delete mode 100755 sendmailadvanced create mode 100644 sendmailadvanced.8.in create mode 100755 sendmailadvanced.in diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5432e49 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +sendmailadvanced +sendmailadvanced.8 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..be9bc04 --- /dev/null +++ b/Makefile @@ -0,0 +1,47 @@ +# +# sendmailadvanced - wrapper for sendmail which encrypts and generates stamps +# +# Copyright (c) 2013-2016 Erich Eckner +# +# This program 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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# + +DESTDIR = +ETCDIR = /etc +BINDIR = /usr/bin +MANDIR = /usr/share/man + +VERSION = 1.0.6 + +all: sendmailadvanced sendmailadvanced.8 + +%: %.in + sed "s/#VERSION#/$(VERSION)/; s@#BINDIR#@$(BINDIR)@; s@#ETCDIR#@$(ETCDIR)@" $< > $@ + +.PHONY: install dist clean + +install: all + install -D -m0755 sendmailadvanced $(DESTDIR)$(BINDIR)/sendmailadvanced + install -D -m0644 sendmailadvanced.8 $(DESTDIR)$(MANDIR)/man8/sendmailadvanced.8 + install -D -m0644 sendmailadvanced.conf $(DESTDIR)$(ETCDIR)/sendmailadvanced.conf + +dist: clean + (cd .. && tar czvf sendmailadvanced-$(VERSION).tar.gz sendmailadvanced-$(VERSION)) + +clean: + rm -f sendmailadvanced{,.8} + +# End of file diff --git a/sendmailadvanced b/sendmailadvanced deleted file mode 100755 index c1a6ef0..0000000 --- a/sendmailadvanced +++ /dev/null @@ -1,186 +0,0 @@ -#!/bin/bash - -verwendung() { - >&2 echo 'sendmailadvanced [(-h|--hook) hook] [(-i|--inline) file | -t|--no-inline] [-e|--[no-]encrypt] [-s|--[no-]stamp]' - >&2 echo ' -h|--hook: activate hook' - >&2 echo ' -i|--inline: enhance email file in situ' - >&2 echo ' "--inline -" has the same effect as "-t"' - >&2 echo ' conflicts with -t|--no-inline' - >&2 echo ' -t|--no-inline: enhance email from stdin to stdout' - >&2 echo ' conflicts with -i|--inline' - >&2 echo ' -e|--[no-]encrypt: do (not) encrypt' - >&2 echo ' -s|--[no-]stamp: do (not) stamp' - exit 1 -} - -stempeln() { - oldIFS="${IFS}" - - IFS=',' - for adressat in ${adressatenString} - do - if [[ "${adressat}" == *"<"*">"* ]] - then - adressat="${adressat#*<}" - adressat="${adressat%>*}" - fi - adressat="$( - echo "${adressat}" | \ - tr -d "[:space:]" - )" - echo "${adressat}" | grep -q "\S" || continue - hashcash -b ${hashcash_bits} -Xm "${adressat}" - done - - adressatenString="" - - IFS="${oldIFS}" -} - -datei="" -encrypt=true -stamp=true - -dForced=false -eForced=false -sForced=false - -if [ -x /etc/sendmailadvanced.conf ] -then - . /etc/sendmailadvanced.conf -else - for konfig in $(readlink -f "$0").conf $(find . -name sendmailadvanced.conf 2> /dev/null) - do - [ -x "${konfig}" ] || continue - . "${konfig}" - break - done -fi - -gpg --list-keys "${gpg_recipient}" &> /dev/null || encrypt=false -which hashcash &> /dev/null || stamp=false - -eval set -- "$(getopt -o eh:i:st --long encrypt,no-encrypt,hook:,inline:,no-inline,stamp,no-stamp -n "$(basename "$0")" -- "$@" || echo verwendung)" - -while true -do - case "$1" in - -h|--hook) - shift - hooks[${#hooks[@]}]="$1" - ;; - -i|--inline) - ${dForced} && verwendung - shift - datei="$1" - [ "${datei}" == "-" ] && datei="" - dForced=true - ;; - -t|--no-inline) - ${dForced} && verwendung - datei="" - dForced=true - ;; - -e|--encrypt) - ${eForced} && verwendung - encrypt=true - eForced=true - ;; - --no-encrypt) - ${eForced} && verwendung - encrypt=false - eForced=true - ;; - -s|--stamp) - ${sForced} && verwendung - stamp=true - sForced=true - ;; - --no-stamp) - ${sForced} && verwendung - stamp=false - sForced=true - ;; - --) - shift - break - ;; - *) - >&2 echo "FEHLER: Verstehe Option \"$1\" doch nicht! Ich beende." - verwendung - ;; - esac - shift -done - -[ $# -ne 0 ] && verwendung - -MAILER="cantfind" -for executable in sendmail msmtp -do - for prefix in /usr/bin /usr/sbin /bin /sbin - do - [ "${MAILER}" == "cantfind" ] && [ -x ${prefix}/${executable} ] && MAILER="${prefix}/${executable}" - done -done - -if [ -z "${datei}" ] && [ "${MAILER}" == "cantfind" ] -then - >&2 echo "ERROR: Can't find suitable mailer." - exit 1 -fi - -( - [ -z "${datei}" ] && cat || cat "${datei}" -) | \ -( - IFS='' - adressatenString="" - adressatenSammeln=false - while read -r zeile - do - echo "${zeile}" | grep -q "\S" || break - s="${zeile}" - if [ "${s:0:3}" == "To:" ] || [ "${s:0:3}" == "Cc:" ] - then - adressatenSammeln=true - s=" ,${s:4}" - fi - if [ ! "${s:0:1}" == " " ] - then - ${adressatenSammeln} && ${stamp} && stempeln - adressatenSammeln=false - fi - ${adressatenSammeln} && adressatenString="${adressatenString}${s}" - echo "${zeile}" - done - - ${stamp} && stempeln - echo "${zeile}" - - ( - for hookParam in "${hooks[@]}" - do - body_header_hook "${hookParam}" - done - cat - for hookParam in "${hooks[@]}" - do - body_footer_hook "${hookParam}" - done - ) | \ - ( - ${encrypt} && gpg -e -a -s -r ${gpg_recipient} || cat - ) -) | \ -( - if [ -z "${datei}" ] - then - ${MAILER} -t - else - tmpFile="$(mktemp)" - cat > "${tmpFile}" - cat "${tmpFile}" > "${datei}" - rm -f "${tmpFile}" - fi -) diff --git a/sendmailadvanced.8.in b/sendmailadvanced.8.in new file mode 100644 index 0000000..bf7f475 --- /dev/null +++ b/sendmailadvanced.8.in @@ -0,0 +1,37 @@ +.TH sendmailadvanced 8 "" "sendmailadvanced #VERSION#" "" +.SH NAME +sendmailadvanced \- wrapper for sendmail which encrypts and generates stamps +.SH SYNOPSIS +\fBsendmailadvanced [options]\fP +.SH DESCRIPTION +\fBsendmailadvanced\fP encrypts emails and generates stamps either in situ or in a pipe. For that it uses \fBhashcash\fP and \fBgnupg\fP. +.SH OPTIONS +.TP +.B "\-h, \-\-hook" +Activate specified hook. +.TP +.B "\-i, \-\-inline" +Enhance email file in situ. +\fB\-\-inline \-\fP has the same effect as option \fB\-t\fP. +Conflicts with \fB\-t, \-\-no\-inline\fP. +.TP +.B "\-t, \-\-no\-inline" +Enhance email from stdin to stdout. +Conflicts with \fB\-i, \-\-inline\fP. +.TP +.B "\-e, \-\-[no\-]encrypt" +Do (not) encrypt. +.TP +.B "\-s, \-\-[no\-]stamp" +Do (not) stamp. +.SH FILES +.TP +.B "#BINDIR#/sendmailadvanced" +program file +.TP +.B "#ETCDIR#/sendmailadvanced.conf" +contains configuration +.SH AUTHOR +.nf +Erich Eckner +.fi diff --git a/sendmailadvanced.in b/sendmailadvanced.in new file mode 100755 index 0000000..e5a7f3e --- /dev/null +++ b/sendmailadvanced.in @@ -0,0 +1,188 @@ +#!/bin/bash + +verwendung() { + >&2 echo 'This is sendmailadvanced version #VERSION#' + >&2 echo '' + >&2 echo 'usage: sendmailadvanced [(-h|--hook) hook] [(-i|--inline) file | -t|--no-inline] [-e|--[no-]encrypt] [-s|--[no-]stamp]' + >&2 echo ' -h|--hook: activate hook' + >&2 echo ' -i|--inline: enhance email file in situ' + >&2 echo ' "--inline -" has the same effect as "-t"' + >&2 echo ' conflicts with -t|--no-inline' + >&2 echo ' -t|--no-inline: enhance email from stdin to stdout' + >&2 echo ' conflicts with -i|--inline' + >&2 echo ' -e|--[no-]encrypt: do (not) encrypt' + >&2 echo ' -s|--[no-]stamp: do (not) stamp' + exit 1 +} + +stempeln() { + oldIFS="${IFS}" + + IFS=',' + for adressat in ${adressatenString} + do + if [[ "${adressat}" == *"<"*">"* ]] + then + adressat="${adressat#*<}" + adressat="${adressat%>*}" + fi + adressat="$( + echo "${adressat}" | \ + tr -d "[:space:]" + )" + echo "${adressat}" | grep -q "\S" || continue + hashcash -b ${hashcash_bits} -Xm "${adressat}" + done + + adressatenString="" + + IFS="${oldIFS}" +} + +datei="" +encrypt=true +stamp=true + +dForced=false +eForced=false +sForced=false + +if [ -x #ETCDIR#/sendmailadvanced.conf ] +then + . #ETCDIR#/sendmailadvanced.conf +else + for konfig in $(readlink -f "$0").conf $(find . -name sendmailadvanced.conf 2> /dev/null) + do + [ -x "${konfig}" ] || continue + . "${konfig}" + break + done +fi + +gpg --list-keys "${gpg_recipient}" &> /dev/null || encrypt=false +which hashcash &> /dev/null || stamp=false + +eval set -- "$(getopt -o eh:i:st --long encrypt,no-encrypt,hook:,inline:,no-inline,stamp,no-stamp -n "$(basename "$0")" -- "$@" || echo verwendung)" + +while true +do + case "$1" in + -h|--hook) + shift + hooks[${#hooks[@]}]="$1" + ;; + -i|--inline) + ${dForced} && verwendung + shift + datei="$1" + [ "${datei}" == "-" ] && datei="" + dForced=true + ;; + -t|--no-inline) + ${dForced} && verwendung + datei="" + dForced=true + ;; + -e|--encrypt) + ${eForced} && verwendung + encrypt=true + eForced=true + ;; + --no-encrypt) + ${eForced} && verwendung + encrypt=false + eForced=true + ;; + -s|--stamp) + ${sForced} && verwendung + stamp=true + sForced=true + ;; + --no-stamp) + ${sForced} && verwendung + stamp=false + sForced=true + ;; + --) + shift + break + ;; + *) + >&2 echo "FEHLER: Verstehe Option \"$1\" doch nicht! Ich beende." + verwendung + ;; + esac + shift +done + +[ $# -ne 0 ] && verwendung + +MAILER="cantfind" +for executable in sendmail msmtp +do + for prefix in #BINDIR# /usr/bin /usr/sbin /bin /sbin + do + [ "${MAILER}" == "cantfind" ] && [ -x ${prefix}/${executable} ] && MAILER="${prefix}/${executable}" + done +done + +if [ -z "${datei}" ] && [ "${MAILER}" == "cantfind" ] +then + >&2 echo "ERROR: Can't find suitable mailer." + exit 1 +fi + +( + [ -z "${datei}" ] && cat || cat "${datei}" +) | \ +( + IFS='' + adressatenString="" + adressatenSammeln=false + while read -r zeile + do + echo "${zeile}" | grep -q "\S" || break + s="${zeile}" + if [ "${s:0:3}" == "To:" ] || [ "${s:0:3}" == "Cc:" ] + then + adressatenSammeln=true + s=" ,${s:4}" + fi + if [ ! "${s:0:1}" == " " ] + then + ${adressatenSammeln} && ${stamp} && stempeln + adressatenSammeln=false + fi + ${adressatenSammeln} && adressatenString="${adressatenString}${s}" + echo "${zeile}" + done + + ${stamp} && stempeln + echo "${zeile}" + + ( + for hookParam in "${hooks[@]}" + do + body_header_hook "${hookParam}" + done + cat + for hookParam in "${hooks[@]}" + do + body_footer_hook "${hookParam}" + done + ) | \ + ( + ${encrypt} && gpg -e -a -s -r ${gpg_recipient} || cat + ) +) | \ +( + if [ -z "${datei}" ] + then + ${MAILER} -t + else + tmpFile="$(mktemp)" + cat > "${tmpFile}" + cat "${tmpFile}" > "${datei}" + rm -f "${tmpFile}" + fi +) -- cgit v1.2.3-54-g00ecf