#!/usr/local/bin/bash # # CHANGELOG: # # 0.2.1 - pridano dekodovani 7bit transfer encoding (k base64) # 2005-10-26 # # 0.2.2 - minor changes to have server compatibility # 2005-10-27 # # 0.2.3 - minor corrections # 2005-10-27 # logger -p mail.info -t "$0" "executed" # CONFIG outdir="$1" # vystupni adresar, zadany je prvnim parametrem if [ -z "$outdir" ] then outdir="/var/spool/mimExplode" fi if [ "$0" == "/usr/local/bin/mimExplode.spam" ] then outdir="$outdir"/spam elif [ "$0" == "/usr/local/bin/mimExplode.nospam" ] then outdir="$outdir"/nospam else logger -p mail.warn -t "$0" "WARNING - default outdir used; $outdir" exit fi # MAKE TEMP FILENAME pid=$$.`date +%s` # todle je unikatni cislo, dle bash-e tempdir="/tmp" # adresar pro docasne soubory input="$tempdir/$pid-input.mimexplode" # vstup ulozime docasne sem, /tmp nebo /dev/shm (ramdisk) # STDIN -> TEMP FILE cat >"$input" # ulozim stdin do souboru ## FILE -> BOUNDARY STRING # function get_boundary_from_file() { # hledam prislusny content-type, boundary je na dalsim radku (-A 1) boundary=`grep "$1" -A 1 -e "multipart/"` # nasli jsme neco? if [ -n "$boundary" ] then # nalezeni oddelovace a jeho vyparsovani z radku echo "$boundary" \ | grep 'boundary' \ | head -n 1 \ | sed 's/^.*boundary[ ]*=[ ]*\"//' \ | sed 's/".*$//' fi # -n "$boundary" } ## OUTPUT # function deliver_part() { mv "$1" "$outdir/$pid.$2" } ## PROCESSING THE PART OF MAIL # function process_part() { # overeni jestli jde o mail isMail=1 # my variant # for header in "return-path" "received" "from" "subject" # do # count=`grep "$part" -ie "^$header:" | wc -l` # if [ $count -eq 0 ] # then # isMail=0 # break # fi # done # better variant if [ `file "$1" | grep -e "smtp mail text" | wc -l` -eq 0 ] then isMail=0 fi # # pokud jde o mail, posleme ho na vystup if [ $isMail -eq 1 ] then deliver_part "$1" "$2" fi } ## FRAGMENT PROCESSOR # function process_fragment() { # vstup part="$1" # zjistime hlavicku hdrlines=`grep "$part" -nEe '^$' | head -n 1 | cut -f1 -d:` header=`sed -n -e "1,$hdrlines p" "$part"` # TRANSPORT ENCODING transport=`echo "$header" | grep -Ee "^Content-Transfer-Encoding" | cut -f2 -d: | sed 's/ //'` newhead=1 # echo "-$transport-" # decode case "$transport" in base64) # dekodovani base64 logger -p mail.info -t "$0" "INFO - base64 attachment included" sed -e "1,$hdrlines s/.*//" "$part" | decode-base64 >"$part.decoded" # nahrazeni rm -f "$part" mv "$part.decoded" "$part" ;; 7bit) # dekodovani 7bit - jde o odstraneni hlavicek navic logger -p mail.info -t "$0" "INFO - 7bit attachment included" f=$(( $hdrlines + 1 )) t=`wc -l "$part" | sed 's/^ *//' | cut -f1 -d" "` sed -n -e "$f,$t p" "$part" >"$part.decoded" # nahrazeni rm -f "$part" mv "$part.decoded" "$part" ;; *) # nezname kodovani - TODO: zalogovat $transport newhead=0 logger -p mail.crit -t "$0" "CRITICAL - unknown transport encoding: $transport" ;; esac # prepocitani hlavicek if [ "$newhead" -eq 1 ] then hdrlines=`grep "$part" -nEe '^$' | head -n 1 | cut -f1 -d:` header=`sed -n -e "1,$hdrlines p" "$part"` fi # co s dekodovanym souborem? process_part $part "$2" } ## FILE + LINE NUMBERS -> PARTS # function split_file_on_lines() { # s cim pracujeme? input=$1 # prvni parametr je vstupni soubor output="$tempdir/$pid-part.mimexplode" # docasny soubor pro dekodovani shift # dalsi parametry jsou cisla radku, a prvni fragment nas nezajima n=1 from=$(( $1 + 1 )) shift while [ -n "$1" ] do # vyriznuti casti to=$(( $1 - 1 )) sed -n -e "$from,$to p" "$input" >"$output" # zpracovani process_fragment "$output" "$n" # dalsi prosim from=$(( $1 + 1 )) n=$(( $n + 1 )) shift done # uz to nepotrebujeme rm -f "$output" &>/dev/null } # GET BOUNDARY boundary=`get_boundary_from_file "$input"` # FOUND? if [ -n "$boundary" ] then # najdeme cisla radku (zajimave je ze bounary ted ma -- na zacatku) lines=`grep -n "$input" -Ee "^--$boundary" | cut -f1 -d:` # rozsekame vstupni soubor dle radku split_file_on_lines "$input" $lines fi # DELETE TEMP rm -f "$input" &>/dev/null # odstranim docasny soubor, bez zbytecnych kecu