Mercurial > notdcc
diff cgi-bin/list-msg.in @ 0:c7f6b056b673
First import of vendor version
author | Peter Gervai <grin@grin.hu> |
---|---|
date | Tue, 10 Mar 2009 13:49:58 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cgi-bin/list-msg.in Tue Mar 10 13:49:58 2009 +0100 @@ -0,0 +1,288 @@ +#! @PERL@ -wT + +# Display a message in a user's log directory + +# Copyright (c) 2008 by Rhyolite Software, LLC +# +# This agreement is not applicable to any entity which sells anti-spam +# solutions to others or provides an anti-spam solution as part of a +# security solution sold to other entities, or to a private network +# which employs the DCC or uses data provided by operation of the DCC +# but does not provide corresponding data to other users. +# +# Permission to use, copy, modify, and distribute this software without +# changes for any purpose with or without fee is hereby granted, provided +# that the above copyright notice and this permission notice appear in all +# copies and any distributed versions or copies are either unchanged +# or not called anything similar to "DCC" or "Distributed Checksum +# Clearinghouse". +# +# Parties not eligible to receive a license under this agreement can +# obtain a commercial license to use DCC by contacting Rhyolite Software +# at sales@rhyolite.com. +# +# A commercial license would be for Distributed Checksum and Reputation +# Clearinghouse software. That software includes additional features. This +# free license for Distributed ChecksumClearinghouse Software does not in any +# way grant permision to use Distributed Checksum and Reputation Clearinghouse +# software +# +# THE SOFTWARE IS PROVIDED "AS IS" AND RHYOLITE SOFTWARE, LLC DISCLAIMS ALL +# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RHYOLITE SOFTWARE, LLC +# BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +# OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +# SOFTWARE. +# Rhyolite Software DCC 1.3.103-1.33 $Revision$ +# @configure_input@ + +# This file must protected with an equivalent to httpd.conf lines +# in the README file. + + +use strict 'subs'; + + +# get DCC parameters +local(%msgs_cache, @msgs_num, $msg_first); +do('@cgibin@/common') || die("could not get DCC configuration: $!\n"); + + + +# display the message literally if asked +if ($query{literal}) { + my($buf, $msg, $path); + + # punt to directory listing if no message specified + punt2("no message specified for listing", $list_log_url) + if (!$query{msg}); + punt2("bad message $query{msg} specified for listing", $list_log_url) + if ($query{msg} !~ /^([a-zA-Z\d][a-zA-Z\d]{5}[a-zA-Z\d.]{0,4})$/); + $msg = $1; + + $path = msg2path($msg); + if (!open(MSG, $path)) { + html_head("Message $msg for $user"); + print "<P class=warn>Cannot open $path: $!\n"; + html_footer(); + print "</BODY>\n</HTML>"; + exit; + } + print "Content-type: text/plain\n"; + print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n"; + print "pragma: no-cache\n\n"; + print $buf + while (read(MSG, $buf, 4*1024)); + exit; +} + + +# find the previous and next messages +my($msg) = $query{msg}; +get_log_msgs($msg, 0, 1); +$msg = $msgs_num[$#msgs_num] if (!$msg && $#msgs_num >= 0); +my($path) = msg2path($msg, ""); + +if (!$msg || !$msgs_cache{$msg}) { + punt2("message $msg has disappeared", $list_log_url) +} else { + my($msg_num, $older_msg, $oldest_msg, $newer_msg, $newest_msg); + + $newest_msg = ""; + if ($#msgs_num < 0) { + $oldest_msg = ""; + } else { + $oldest_msg = $msgs_num[0]; + } + if (!defined($msg_first) || $msgs_num[$msg_first] ne $msg) { + $msg_num = ""; + $newer_msg = $newest_msg; + $older_msg = $oldest_msg; + } else { + $msg_num = "#" . ($msg_first+1); + if ($msg_first < $#msgs_num) { + $newer_msg = $msgs_num[$msg_first+1] + } else { + $newer_msg = $newest_msg; + } + if ($msg_first > 0) { + $older_msg = $msgs_num[$msg_first-1]; + } else { + $older_msg = $oldest_msg; + } + } + + $oldest_link = "$list_msg_link${url_ques}msg=$oldest_msg\">Oldest</A>"; + $older_link = "$list_msg_link${url_ques}msg=$older_msg\">Older</A>"; + $newer_link = "$list_msg_link${url_ques}msg=$newer_msg\">Newer</A>"; + $newest_link = "$list_msg_link${url_ques}msg=$newest_msg\">Newest</A>"; + html_head("Message $msg_num for $user"); + common_buttons(); + print <<EOF; +<TR><TD>$newest_link + <TD>$newer_link + <TD>$older_link + <TD>$oldest_link +</TABLE> + +<H3>Message $msg_num for $user</H3> +<P> +$list_msg_link${url_ques}msg=$msg&literal=yes" + TARGET="DCC literal log file">Literal log file</A> $path +contents for reporting or analysis. +EOF +} + +# pass a greylist triple +if ($query{greywhite}) { + my($cksum, $sight); + + html_whine("bogus greywhite checksum \"$query{greywhite}\"") + if ($query{greywhite} !~ /^([a-z0-9 ]+)$/); + $cksum = $1; + $sight = `@libexecdir@/dccsight -G '$cksum' 2>&1`; + if ($sight =~ /^(Pass|Embargo Ended)\s*$/i){ + print "\n<P>\ngreylist embargo ended"; + } else { + print "\n<P class=warn>\n@libexecdir@/dccsight -G '$cksum': $sight"; + } +} + + + +local($msg_date, $msg_helo, $msg_env_from, @msg_env_to, + $msg_client_name, $msg_ip, $msg_mail_host, + $msg_hdrs, $msg_body, $msg_cksums); +@error = parse_log_msg($msg); +if (defined $error[0]) { + print "<P class=warn><STRONG>$error[0]:</STRONG> $error[1]\n"; + html_footer(); + print "</BODY>\n</HTML>\n"; + exit; +} + + +print <<EOF; +<P> +<HR> +<H4>Envelope</H4> +<TABLE border=0 cellspacing=0 cellpadding=0> +EOF + +print "<TR><TD> \n <TD>$msg_date\n"; +print_envelope_link(1, "IP address", "IP", $msg_client_name, $msg_ip); +print_envelope_link(scalar "helo" =~ /^($sub_hdrs)$/i, + "HELO", "substitute HELO", "", $msg_helo); +print_envelope_link(1, "env_From", "env_From", "", $msg_env_from); +print_envelope_link(scalar "mail_host" =~ /^($sub_hdrs)$/i, + "mail_host", "substitute mail_host", "", $msg_mail_host); +map print_envelope_link(1, "env_To", "env_To", "", html_str_encode($_)), + @msg_env_to; + + +# make links for whitelisting the body checksusm +$msg_cksums =~ s/(Body|Fuz1|Fuz2):\s+(\S{8}\s\S{8}\s\S{8}\s\S{8}\s)/make_hex_link($1,$2)/eig; + +# make whitelisting links for greylist checksums with active embargos +while ($msg_cksums =~ /^\s+([a-z0-9]{8}(?: [a-z0-9]{8}){3}) Embargo[\s#0-9]*$/mi) { + my($sum, $sight, $link, $text); + + $sum = $1; + $sight = `@libexecdir@/dccsight -QG "$sum" 2>&1`; + if ($sight =~ /Embargo.*/) { + $link = make_greywhite_link($sum); + $text = " <STRONG>select checksum to end greylist embargo of sender</STRONG>\n"; + } else { + $link = "$sum<!--inactive-->"; + $text = " current value: " . html_str_encode($sight); + } + $msg_cksums =~ s/(^\s+)$sum(.*$)\n/$1$link$2\n$1$text/m; +} + +print <<EOF; +</TABLE> +<P> +<HR> +<H4>Headers</H4> +<PRE> +$msg_hdrs +</PRE> + +<HR> +<H4>Body</H4> +$msg_body + +<HR> +<H4>Checksums</H4> +<PRE>$msg_cksums</PRE> + +EOF +html_footer(); +print "</BODY>\n</HTML>\n"; + +exit; + +############################################################################# + + +sub print_envelope_link { + my($enable, $label, $type, $text, $value) = @_; + + # skip the row if the value is absent + return if (! $value); + + print "<TR><TD>"; + print html_str_encode($label) if ($label); + print ": \n <TD>"; + if (! $enable) { + print html_str_encode($text . $value); + print "\n"; + return; + } + + if ($text) { + print $text; + print " "; + } + print $edit_link; + print "${url_ques}type="; + print url_encode($type); + print "&val="; + print url_encode($value); + print "&msg=$query{msg}" if ($query{msg}); + print "&auto=1#cur_key\">"; + print html_str_encode($value); + print "</A>\n"; +} + + + +sub make_hex_link { + my($type, $sum) = @_; + my($str); + + # cannot whitelist missing fuz2 place keepers + return "$type: $sum" if ($sum =~ /^[ 0]+$/); + + $str = "$edit_link${url_ques}type="; + $str .= url_encode("hex $type"); + $str .= "&val="; + $str .= url_encode($sum); + $str .= "&msg=$msg&auto=1#cur_key\">$type: $sum</A>"; + + return $str; +} + + +sub make_greywhite_link { + my($sum) = @_; + my($str); + + $str = "$list_msg_link${url_ques}msg=$msg&greywhite="; + $str .= url_encode($sum); + $str .= "\">$sum</A>"; + + return $str; +}