rsc | 0e6fee1 | 2006-04-09 00:24:14 +0000 | [diff] [blame] | 1 | #!/usr/local/plan9/bin/rc |
| 2 | rfork n |
| 3 | |
| 4 | . 9.rc |
| 5 | |
| 6 | # exit status matching: |
| 7 | # |
rsc | fc46abd | 2006-04-12 13:10:08 +0000 | [diff] [blame] | 8 | # $discard - is really bad, refuse the message |
| 9 | # $accept - is really good, leave attachment alone |
| 10 | # anything else - rewrite attachment to have .suspect extension |
rsc | 0e6fee1 | 2006-04-09 00:24:14 +0000 | [diff] [blame] | 11 | # |
| 12 | |
| 13 | # magic exit statuses known to vf |
| 14 | accept=10 |
| 15 | discard=13 |
| 16 | |
| 17 | wrap=123 # anything but 10, 13 |
| 18 | |
| 19 | if(! ~ $#* 1){ |
| 20 | echo usage: validateattachment mboxfile >[1=2] |
| 21 | exit usage |
| 22 | } |
| 23 | |
rsc | fc46abd | 2006-04-12 13:10:08 +0000 | [diff] [blame] | 24 | # some idiot virus is sending around attachments marked as .zip |
| 25 | # that are completely bogus and just say %TS_ZIP_ATTACH% |
| 26 | # as the base64 encoding of the zip file. gmail rejects all zip |
| 27 | # attachments when we forward them, so nip this one here. |
| 28 | if(grep -s '^%TS_ZIP_ATTACH%$' $1 && ~ `{wc -l <$1} 1 2 3 4 5 6 7 8 9 10){ |
| 29 | echo bogus zip file! |
| 30 | exit $discard |
| 31 | } |
| 32 | |
rsc | 0e6fee1 | 2006-04-09 00:24:14 +0000 | [diff] [blame] | 33 | upas/unvf < $1 >$1.unvf |
| 34 | file=$1.unvf |
| 35 | fn sigexit { rm $file } |
| 36 | |
| 37 | fn save { |
| 38 | # d=`{date -n} |
| 39 | # cp $file /n/other/upas/tmp/$d.$1 |
| 40 | # cp raw /n/other/upas/tmp/$d.$1.raw |
| 41 | # whatis x >/n/other/upas/tmp/$d.$1.file |
| 42 | } |
| 43 | |
| 44 | x=`{file <$file | sed s/stdin://} |
| 45 | x=$"x |
| 46 | switch($x){ |
| 47 | case *Ascii* *text* *'c program'* *'rc executable'* |
| 48 | save accept |
| 49 | exit $accept |
| 50 | |
| 51 | case *'zip archive'* |
rsc | fc46abd | 2006-04-12 13:10:08 +0000 | [diff] [blame] | 52 | |
rsc | 0e6fee1 | 2006-04-09 00:24:14 +0000 | [diff] [blame] | 53 | # >[2=1] because sometimes we get zip files we can't parse |
| 54 | # but the errors look like |
| 55 | # unzip: reading data for philw.doc.scr failed: ... |
| 56 | # so we can still catch these. |
Russ Cox | 83ab7d8 | 2007-11-27 15:39:06 -0500 | [diff] [blame] | 57 | if(! unzip -tsf $file >[2=1] >/dev/null){ |
| 58 | echo corrupt zip file! |
| 59 | exit $discard |
| 60 | } |
rsc | 0e6fee1 | 2006-04-09 00:24:14 +0000 | [diff] [blame] | 61 | if(unzip -tsf $file >[2=1] | grep -si ' |\.(scr|exe|pif|bat|com)$'){ |
| 62 | echo executables inside zip file! |
| 63 | exit $discard |
| 64 | } |
| 65 | |
| 66 | case jpeg 'PNG image' bmp 'GIF image' *'plan 9 image' |
| 67 | save accept |
| 68 | exit $accept |
| 69 | |
| 70 | case *Microsoft* *Office* |
| 71 | save wrap |
| 72 | exit $wrap |
| 73 | |
| 74 | case *MSDOS* |
| 75 | # no executables |
| 76 | echo $x |
| 77 | exit $discard |
| 78 | } |
| 79 | |
| 80 | save wrap |
| 81 | exit $wrap |
| 82 | |
| 83 | |