#!/bin/bash # # CHANGELOG: # # 0.2.1 - pridano dekodovani 7bit transfer encoding (k base64) # 2005-10-26 # # CONFIG outdir="$1" # vystupni adresar, zadany je prvnim parametrem if [ -z "$outdir" ] then outdir="./" fi # MAKE TEMP FILENAME pid=$$ # 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 sed -e "1,$hdrlines s/.*//" "$part" | base64 -d >"$part.decoded" # nahrazeni rm "$part" mv "$part.decoded" "$part" ;; 7bit) # dekodovani 7bit - jde o odstraneni hlavicek navic f=$(( $hdrlines + 1 )) t=`wc -l "$part" | cut -f1 -d" "` sed -n -e "$f,$t p" "$part" >"$part.decoded" # nahrazeni rm "$part" mv "$part.decoded" "$part" ;; *) # nezname kodovani - TODO: zalogovat $transport newhead=0 ;; 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