#!/bin/rc# validateattachment mboxfilerfork enupastmp=/mail/tmp## exit status matching:## *discard* - is really bad, refuse the message # *accept* - is really good, leave attachment alone# * - rewrite attachment to have .suspect extension# if(! ~ $#* 1){ echo usage: validateattachment mboxfile >[1=2] exit usage}echo validating >[1=2]fn save { d=`{date -n} cp body $upastmp/$d.$1 cp raw $upastmp/$d.$1.raw whatis x >$upastmp/$d.$1.file}fn sigexit { rm -f $upastmp/$d.$1^('' .raw .file)}upas/fs -f $1cd /mail/fs/mbox/1x=`{file body | sed s/body://}x=$"xswitch($x){case *Ascii* *text* *'c program'* *'rc executable'* save accept exit acceptcase *'zip archive'* # >[2=1] because sometimes we get zip files we can't parse # but the errors look like # unzip: reading data for philw.doc.scr failed: ... # so we can still catch these. if(unzip -tsf body >[2=1] | grep -si ' |\.(scr|exe|pif|bat|com)$'){ echo executables inside zip file! exit discard }case jpeg 'PNG image' bmp 'GIF image' *'plan 9 image'* save accept exit acceptcase *Microsoft* *Office* save wrap exit wrapcase *MSDOS* # no executables echo $x exit discard}save wrapexit wrap
#!/bin/rc
# validateattachment mboxfile
rfork en
upastmp=/mail/tmp
#
# exit status matching:
#
# *discard* - is really bad, refuse the message
# *accept* - is really good, leave attachment alone
# * - rewrite attachment to have .suspect extension
#
if(! ~ $#* 1){
echo usage: validateattachment mboxfile >[1=2]
exit usage
}
echo validating >[1=2]
fn save {
d=`{date -n}
cp body $upastmp/$d.$1
cp raw $upastmp/$d.$1.raw
whatis x >$upastmp/$d.$1.file
}
fn sigexit {
rm -f $upastmp/$d.$1^('' .raw .file)
}
upas/fs -f $1
cd /mail/fs/mbox/1
x=`{file body | sed s/body://}
x=$"x
switch($x){
case *Ascii* *text* *'c program'* *'rc executable'*
save accept
exit accept
case *'zip archive'*
# >[2=1] because sometimes we get zip files we can't parse
# but the errors look like
# unzip: reading data for philw.doc.scr failed: ...
# so we can still catch these.
if(unzip -tsf body >[2=1] | grep -si ' |\.(scr|exe|pif|bat|com)$'){
echo executables inside zip file!
exit discard
}
case jpeg 'PNG image' bmp 'GIF image' *'plan 9 image'*
save accept
exit accept
case *Microsoft* *Office*
save wrap
exit wrap
case *MSDOS*
# no executables
echo $x
exit discard
}
save wrap
exit wrap