You can subscribe to this list here.
2003 |
Jan
|
Feb
(160) |
Mar
(119) |
Apr
(111) |
May
(118) |
Jun
(101) |
Jul
(304) |
Aug
(113) |
Sep
(140) |
Oct
(137) |
Nov
(87) |
Dec
(122) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
(78) |
Feb
(125) |
Mar
(131) |
Apr
(59) |
May
(121) |
Jun
(166) |
Jul
(150) |
Aug
(137) |
Sep
(73) |
Oct
(58) |
Nov
(27) |
Dec
(60) |
2005 |
Jan
(131) |
Feb
(84) |
Mar
(36) |
Apr
(8) |
May
(28) |
Jun
(20) |
Jul
(10) |
Aug
(72) |
Sep
(76) |
Oct
(34) |
Nov
(3) |
Dec
(29) |
2006 |
Jan
(13) |
Feb
(92) |
Mar
(7) |
Apr
(1) |
May
(1) |
Jun
(2) |
Jul
(4) |
Aug
(17) |
Sep
(5) |
Oct
(2) |
Nov
(8) |
Dec
(12) |
2007 |
Jan
(28) |
Feb
(15) |
Mar
|
Apr
|
May
(8) |
Jun
(4) |
Jul
(5) |
Aug
(8) |
Sep
(20) |
Oct
(38) |
Nov
(65) |
Dec
(92) |
2008 |
Jan
(21) |
Feb
(56) |
Mar
(27) |
Apr
(174) |
May
(25) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <jgr...@us...> - 2003-03-26 03:58:32
|
Update of /cvsroot/popfile/engine/Classifier In directory sc8-pr-cvs1:/tmp/cvs-serv5927/Classifier Modified Files: Bayes.pm MailParse.pm Log Message: Improve quarantine feature so that it shows first twenty words found in the email to make it easier to spot problems Index: Bayes.pm =================================================================== RCS file: /cvsroot/popfile/engine/Classifier/Bayes.pm,v retrieving revision 1.118 retrieving revision 1.119 diff -C2 -d -r1.118 -r1.119 *** Bayes.pm 25 Mar 2003 05:24:54 -0000 1.118 --- Bayes.pm 26 Mar 2003 03:58:29 -0000 1.119 *************** *** 871,875 **** print $client "Original Subject: " . $self->{parser__}->get_header('subject') . "$eol"; print $client "To examine the email open the attachment. To change this mail's classification go to $xpl$eol"; ! print $client "--$temp_file$eol"; print $client "Content-Type: message/rfc822$eol$eol"; } --- 871,877 ---- print $client "Original Subject: " . $self->{parser__}->get_header('subject') . "$eol"; print $client "To examine the email open the attachment. To change this mail's classification go to $xpl$eol"; ! print $client "The first 20 words found in the email are:$eol$eol"; ! print $client $self->{parser__}->first20(); ! print $client "$eol--$temp_file$eol"; print $client "Content-Type: message/rfc822$eol$eol"; } Index: MailParse.pm =================================================================== RCS file: /cvsroot/popfile/engine/Classifier/MailParse.pm,v retrieving revision 1.97 retrieving revision 1.98 diff -C2 -d -r1.97 -r1.98 *** MailParse.pm 14 Mar 2003 22:34:26 -0000 1.97 --- MailParse.pm 26 Mar 2003 03:58:29 -0000 1.98 *************** *** 78,81 **** --- 78,82 ---- $self->{html_arg__} = ''; $self->{in_headers__} = 0; + $self->{first20__} = ''; return bless $self, $type; *************** *** 276,279 **** --- 277,285 ---- while ( $line =~ s/([[:alpha:]][[:alpha:]\']{1,44})([_\-,\.\"\'\)\?!:;\/& \t\n\r]{0,5}|$)// ) { + if ( ( $self->{in_headers__} == 0 ) && ( $self->{first20count__} < 20 ) ) { + $self->{first20count__} += 1; + $self->{first20__} .= " $1"; + } + update_word($self,$1, $encoded, '', '[_\-,\.\"\'\)\?!:;\/ &\t\n\r]', $prefix) if (length $1 >= 3); } *************** *** 766,769 **** --- 772,778 ---- $self->{in_headers__} = 1; + $self->{first20__} = ''; + $self->{first20count__} = 0; + $colorized .= "<tt>" if ( $self->{color__} ); *************** *** 1158,1160 **** --- 1167,1177 ---- } + # GETTERS/SETTERS + + sub first20 + { + my ( $self ) = @_; + + return $self->{first20__}; + } 1; |
From: <jgr...@us...> - 2003-03-25 05:25:28
|
Update of /cvsroot/popfile/engine/Classifier In directory sc8-pr-cvs1:/tmp/cvs-serv20897/Classifier Modified Files: Bayes.pm Log Message: Make the UI pluggable; make SMTP, NNTP and POP3 modules register and handle their own configuration UI; factor the HTTP code out of the UI and into own class; implement XML-RPC interface; make test suite allow selection of tests to run; change the way POPFile reports its startup; make the version string work Index: Bayes.pm =================================================================== RCS file: /cvsroot/popfile/engine/Classifier/Bayes.pm,v retrieving revision 1.117 retrieving revision 1.118 diff -C2 -d -r1.117 -r1.118 *** Bayes.pm 21 Mar 2003 23:10:32 -0000 1.117 --- Bayes.pm 25 Mar 2003 05:24:54 -0000 1.118 *************** *** 832,837 **** $xpl .= "<http://"; ! $xpl .= $self->module_config_( 'pop3', 'local' )?"127.0.0.1":$self->{hostname__}; ! $xpl .= ":" . $self->module_config_( 'ui', 'port' ) . "/jump_to_message?view=$temp_file>$eol"; if ( $self->global_config_( 'xpl' ) && ( $self->{parameters__}{$classification}{quarantine} == 0 ) ) { --- 832,837 ---- $xpl .= "<http://"; ! $xpl .= $self->module_config_( 'html', 'local' )?"127.0.0.1":$self->{hostname__}; ! $xpl .= ":" . $self->module_config_( 'html', 'port' ) . "/jump_to_message?view=$temp_file>$eol"; if ( $self->global_config_( 'xpl' ) && ( $self->{parameters__}{$classification}{quarantine} == 0 ) ) { *************** *** 899,904 **** return $classification; } - - # GETTER/SETTERS # --------------------------------------------------------------------------------------------- --- 899,902 ---- |
From: <jgr...@us...> - 2003-03-25 05:25:28
|
Update of /cvsroot/popfile/engine/Platform In directory sc8-pr-cvs1:/tmp/cvs-serv20897/Platform Modified Files: MSWin32.pm Log Message: Make the UI pluggable; make SMTP, NNTP and POP3 modules register and handle their own configuration UI; factor the HTTP code out of the UI and into own class; implement XML-RPC interface; make test suite allow selection of tests to run; change the way POPFile reports its startup; make the version string work Index: MSWin32.pm =================================================================== RCS file: /cvsroot/popfile/engine/Platform/MSWin32.pm,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** MSWin32.pm 14 Mar 2003 23:12:50 -0000 1.1 --- MSWin32.pm 25 Mar 2003 05:24:55 -0000 1.2 *************** *** 71,75 **** $self->{icon__} = new Win32::GUI::Icon('popfile.ico'); $self->{notify__} = $self->{window__}->AddNotifyIcon( ! -name => "NI", -id => 1, -icon => $self->{icon__}, --- 71,75 ---- $self->{icon__} = new Win32::GUI::Icon('popfile.ico'); $self->{notify__} = $self->{window__}->AddNotifyIcon( ! -name => "Platform::MSWin32::POPFileIcon", -id => 1, -icon => $self->{icon__}, *************** *** 90,94 **** my ( $self ) = @_; ! $self->{window__}->NI->Delete( -id => 1 ); Win32::GUI::DoEvents(); } --- 90,94 ---- my ( $self ) = @_; ! # $self->{window__}->->Delete( -id => 1 ); Win32::GUI::DoEvents(); } *************** *** 101,107 **** # --------------------------------------------------------------------------------------------- ! sub NI_RightClick { ! 1; } --- 101,108 ---- # --------------------------------------------------------------------------------------------- ! sub POPFileIcon_RightClick { ! print "rc"; ! 1; } |
From: <jgr...@us...> - 2003-03-25 05:25:28
|
Update of /cvsroot/popfile/engine/POPFile In directory sc8-pr-cvs1:/tmp/cvs-serv20897/POPFile Modified Files: Configuration.pm Module.pm Log Message: Make the UI pluggable; make SMTP, NNTP and POP3 modules register and handle their own configuration UI; factor the HTTP code out of the UI and into own class; implement XML-RPC interface; make test suite allow selection of tests to run; change the way POPFile reports its startup; make the version string work Index: Configuration.pm =================================================================== RCS file: /cvsroot/popfile/engine/POPFile/Configuration.pm,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** Configuration.pm 8 Mar 2003 00:51:50 -0000 1.15 --- Configuration.pm 25 Mar 2003 05:24:54 -0000 1.16 *************** *** 235,252 **** # Parameters that are now handled by UI::HTML ! 'archive', 'ui_archive', ! 'archive_classes', 'ui_archive_classes', ! 'archive_dir', 'ui_archive_dir', ! 'history_days', 'ui_history_days', ! 'language', 'ui_language', ! 'last_reset', 'ui_last_reset', ! 'last_update_check', 'ui_last_update_check', ! 'localui', 'ui_local', ! 'page_size', 'ui_page_size', ! 'password', 'ui_password', ! 'send_stats', 'ui_send_stats', ! 'skin', 'ui_skin', ! 'test_language', 'ui_test_language', ! 'update_check', 'ui_update_check' ); --- 235,252 ---- # Parameters that are now handled by UI::HTML ! 'archive', 'html_archive', ! 'archive_classes', 'html_archive_classes', ! 'archive_dir', 'html_archive_dir', ! 'history_days', 'html_history_days', ! 'language', 'html_language', ! 'last_reset', 'html_last_reset', ! 'last_update_check', 'html_last_update_check', ! 'localui', 'html_local', ! 'page_size', 'html_page_size', ! 'password', 'html_password', ! 'send_stats', 'html_send_stats', ! 'skin', 'html_skin', ! 'test_language', 'html_test_language', ! 'update_check', 'html_update_check' ); Index: Module.pm =================================================================== RCS file: /cvsroot/popfile/engine/POPFile/Module.pm,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** Module.pm 5 Mar 2003 21:15:35 -0000 1.5 --- Module.pm 25 Mar 2003 05:24:54 -0000 1.6 *************** *** 374,376 **** --- 374,387 ---- } + sub version + { + my ( $self, $value ) = @_; + + if ( defined( $value ) ) { + $self->{version_} = $value; + } + + return $self->{version_}; + } + 1; |
From: <jgr...@us...> - 2003-03-25 05:25:27
|
Update of /cvsroot/popfile/engine In directory sc8-pr-cvs1:/tmp/cvs-serv20897 Modified Files: popfile.pl tests.pl Log Message: Make the UI pluggable; make SMTP, NNTP and POP3 modules register and handle their own configuration UI; factor the HTTP code out of the UI and into own class; implement XML-RPC interface; make test suite allow selection of tests to run; change the way POPFile reports its startup; make the version string work Index: popfile.pl =================================================================== RCS file: /cvsroot/popfile/engine/popfile.pl,v retrieving revision 1.207 retrieving revision 1.208 diff -C2 -d -r1.207 -r1.208 *** popfile.pl 14 Mar 2003 23:12:48 -0000 1.207 --- popfile.pl 25 Mar 2003 05:24:51 -0000 1.208 *************** *** 189,192 **** --- 189,194 ---- my ( $directory, $type ) = @_; + print "\n {$type:"; + # Look for all the .pm files in named directory and then see which of them # are POPFile modules indicated by the first line of the file being and *************** *** 212,219 **** $components{$type}{$name} = $mod; ! print " {$name}"; } } } } --- 214,223 ---- $components{$type}{$name} = $mod; ! print " $name"; } } } + + print '} '; } *************** *** 224,227 **** --- 228,236 ---- # + my ( $major_version, $minor_version, $build_version ) = ( 0, 19, 0 ); + my $version_string = "v$major_version.$minor_version.$build_version"; + + print "\nPOPFile Engine $version_string loading\n"; + $SIG{QUIT} = \&aborting; $SIG{ABRT} = \&aborting; *************** *** 239,243 **** # modules, the classifier, the UI (currently HTML based), and the POP3 proxy. ! print " Loading... "; # Look for a module called Platform::<platform> where <platform> is the value of $^O --- 248,252 ---- # modules, the classifier, the UI (currently HTML based), and the POP3 proxy. ! print "\n Loading... "; # Look for a module called Platform::<platform> where <platform> is the value of $^O *************** *** 254,272 **** my $name = $mod->name(); $components{core}{$name} = $mod; ! print " {$name}"; } load_modules( 'POPFile', 'core' ); load_modules( 'Classifier', 'classifier' ); ! load_modules( 'UI', 'ui' ); load_modules( 'Proxy', 'proxy' ); ! # The version number ! ! $components{core}{config}->{major_version} = 0; ! $components{core}{config}->{minor_version} = 19; ! $components{core}{config}->{build_version} = 0; ! ! print "\nPOPFile Engine v$components{core}{config}->{major_version}.$components{core}{config}->{minor_version}.$components{core}{config}->{build_version} starting"; # Link each of the main objects with the configuration object so that they can set their --- 263,275 ---- my $name = $mod->name(); $components{core}{$name} = $mod; ! print "\n {core: $name}"; } load_modules( 'POPFile', 'core' ); load_modules( 'Classifier', 'classifier' ); ! load_modules( 'UI', 'interface' ); load_modules( 'Proxy', 'proxy' ); ! print "\n\nPOPFile Engine $version_string starting"; # Link each of the main objects with the configuration object so that they can set their *************** *** 275,278 **** --- 278,282 ---- foreach my $type (keys %components) { foreach my $name (keys %{$components{$type}}) { + $components{$type}{$name}->version( $version_string ); $components{$type}{$name}->configuration( $components{core}{config} ); $components{$type}{$name}->logger( $components{core}{logger} ) if ( $name ne 'logger' ); *************** *** 280,303 **** } ! # All proxies need access to the classifier and the UI foreach my $name (keys %{$components{proxy}}) { $components{proxy}{$name}->classifier( $components{classifier}{bayes} ); ! $components{proxy}{$name}->ui( $components{ui}{ui} ); } ! # All UI components need access to the classifier ! foreach my $name (keys %{$components{ui}}) { ! $components{ui}{$name}->classifier( $components{classifier}{bayes} ); } ! print "\n Initializing... "; # Tell each module to initialize itself foreach my $type (keys %components) { foreach my $name (keys %{$components{$type}}) { ! print "{$name} "; flush STDOUT; if ( $components{$type}{$name}->initialize() == 0 ) { --- 284,309 ---- } ! # All proxies need access to the classifier and the interface foreach my $name (keys %{$components{proxy}}) { $components{proxy}{$name}->classifier( $components{classifier}{bayes} ); ! $components{proxy}{$name}->ui( $components{interface}{html} ); } ! # All interface components need access to the classifier and the UI ! foreach my $name (keys %{$components{interface}}) { ! $components{interface}{$name}->classifier( $components{classifier}{bayes} ); ! $components{interface}{$name}->ui( $components{interface}{html} ) if ( $name ne 'html' ); } ! print "\n\n Initializing... "; # Tell each module to initialize itself foreach my $type (keys %components) { + print "\n {$type:"; foreach my $name (keys %{$components{$type}}) { ! print " $name"; flush STDOUT; if ( $components{$type}{$name}->initialize() == 0 ) { *************** *** 309,312 **** --- 315,319 ---- $components{$type}{$name}->pipeready( \&pipeready ); } + print '} '; } *************** *** 317,327 **** $components{core}{config}->parse_command_line(); ! print "\n Starting... "; # Now that the configuration is set tell each module to begin operation foreach my $type (keys %components) { foreach my $name (keys %{$components{$type}}) { ! print "{$name} "; flush STDOUT; if ( $components{$type}{$name}->start() == 0 ) { --- 324,335 ---- $components{core}{config}->parse_command_line(); ! print "\n\n Starting... "; # Now that the configuration is set tell each module to begin operation foreach my $type (keys %components) { + print "\n {$type:"; foreach my $name (keys %{$components{$type}}) { ! print " $name"; flush STDOUT; if ( $components{$type}{$name}->start() == 0 ) { *************** *** 329,335 **** } } } ! print "\nPOPFile Engine v$components{core}{config}->{major_version}.$components{core}{config}->{minor_version}.$components{core}{config}->{build_version} running\n"; flush STDOUT; --- 337,344 ---- } } + print '} '; } ! print "\n\nPOPFile Engine $version_string running\n"; flush STDOUT; *************** *** 363,380 **** } ! print " Stopping... "; # Shutdown all the modules foreach my $type (keys %components) { foreach my $name (keys %{$components{$type}}) { ! print "{$name} "; flush STDOUT; $components{$type}{$name}->alive(0); $components{$type}{$name}->stop(); } } ! print "\n Saving configuration\n"; flush STDOUT; --- 372,395 ---- } ! print "\n\nPOPFile Engine $version_string stopping\n"; ! flush STDOUT; ! ! print "\n Stopping... "; # Shutdown all the modules foreach my $type (keys %components) { + print "\n {$type:"; foreach my $name (keys %{$components{$type}}) { ! print " $name"; flush STDOUT; $components{$type}{$name}->alive(0); $components{$type}{$name}->stop(); } + + print '} '; } ! print "\n\n Saving configuration\n"; flush STDOUT; *************** *** 383,387 **** $components{core}{config}->save_configuration(); ! print "POPFile Engine v$components{core}{config}->{major_version}.$components{core}{config}->{minor_version}.$components{core}{config}->{build_version} terminating\n"; # --------------------------------------------------------------------------------------------- --- 398,402 ---- $components{core}{config}->save_configuration(); ! print "\nPOPFile Engine $version_string terminated\n"; # --------------------------------------------------------------------------------------------- Index: tests.pl =================================================================== RCS file: /cvsroot/popfile/engine/tests.pl,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** tests.pl 25 Feb 2003 02:04:11 -0000 1.13 --- tests.pl 25 Mar 2003 05:24:52 -0000 1.14 *************** *** 110,115 **** --- 110,125 ---- my @tests = glob 'tests/*.tst'; + # Either match all the possible tests, or take the first argument + # on the command line and use it as a regular expression that must + # match the name of the TST file for the test suite in that file + # to be run + + my $pattern = '.*'; + $pattern = "$ARGV[0].*" if ( $#ARGV == 0 ); + foreach my $test (@tests) { + if ( $test =~ /$pattern/ ) { + # This works by reading the entire suite into the $suite variable # and then changing calls to test_assert_equal so that they include *************** *** 141,145 **** print "ok (" . ( $test_count - $current_test_count ) . " ok)"; } } ! print "\n\n$test_count tests, " . ( $test_count - $test_failures ) . " ok, $test_failures failed\n\n"; \ No newline at end of file --- 151,156 ---- print "ok (" . ( $test_count - $current_test_count ) . " ok)"; } + } } ! print "\n\n$test_count tests, " . ( $test_count - $test_failures ) . " ok, $test_failures failed\n\n"; |
From: <jgr...@us...> - 2003-03-25 05:25:04
|
Update of /cvsroot/popfile/engine/Proxy In directory sc8-pr-cvs1:/tmp/cvs-serv20897/Proxy Modified Files: NNTP.pm POP3.pm Proxy.pm SMTP.pm Log Message: Make the UI pluggable; make SMTP, NNTP and POP3 modules register and handle their own configuration UI; factor the HTTP code out of the UI and into own class; implement XML-RPC interface; make test suite allow selection of tests to run; change the way POPFile reports its startup; make the version string work Index: NNTP.pm =================================================================== RCS file: /cvsroot/popfile/engine/Proxy/NNTP.pm,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** NNTP.pm 19 Mar 2003 04:17:12 -0000 1.7 --- NNTP.pm 25 Mar 2003 05:24:55 -0000 1.8 *************** *** 67,70 **** --- 67,85 ---- $self->config_( 'separator', ':'); + # Tell the user interface module that we having a configuration + # item that needs a UI component + + $self->{ui__}->register_configuration_item( 'configuration', + 'nntp_port', + $self ); + + $self->{ui__}->register_configuration_item( 'configuration', + 'nntp_separator', + $self ); + + $self->{ui__}->register_configuration_item( 'security', + 'nntp_local', + $self ); + return 1; } *************** *** 122,126 **** if ($connection_state eq 'username needed') { ! # NOTE: This syntax is ambiguous if the NNTP username is a short (under 5 digit) string (eg, 32123). # If this is the case, run "perl popfile.pl -nntp_separator /" and change your kludged username --- 137,141 ---- if ($connection_state eq 'username needed') { ! # NOTE: This syntax is ambiguous if the NNTP username is a short (under 5 digit) string (eg, 32123). # If this is the case, run "perl popfile.pl -nntp_separator /" and change your kludged username *************** *** 128,132 **** my $user_command = '^ *AUTHINFO USER ([^:]+)(:([\d]{1,5}))?(\\' . $self->config_( 'separator' ) . '(.+))?'; ! if ( $command =~ /$user_command/i ) { my $server = $1; # hey, the port has to be in range at least --- 143,147 ---- my $user_command = '^ *AUTHINFO USER ([^:]+)(:([\d]{1,5}))?(\\' . $self->config_( 'separator' ) . '(.+))?'; ! if ( $command =~ /$user_command/i ) { my $server = $1; # hey, the port has to be in range at least *************** *** 295,296 **** --- 310,416 ---- $self->log_( "NNTP forked child done" ); } + + # --------------------------------------------------------------------------------------------- + # + # configure_item + # + # $name The name of the item being configured, was passed in by the call + # to register_configuration_item + # $language Reference to the hash holding the current language + # $session_key The current session key + # + # Must return the HTML for this item + # --------------------------------------------------------------------------------------------- + + sub configure_item + { + my ( $self, $name, $language, $session_key ) = @_; + + my $body; + + if ( $name eq 'nntp_port' ) { + $body .= "<form action=\"/configuration\">\n"; + $body .= "<label class=\"configurationLabel\" for=\"configPopPort\">$$language{Configuration_NNTPPort}:</label><br />\n"; + $body .= "<input name=\"nntp_port\" type=\"text\" id=\"configPopPort\" value=\"" . $self->config_( 'port' ) . "\" />\n"; + $body .= "<input type=\"submit\" class=\"submit\" name=\"update_nntp_port\" value=\"$$language{Apply}\" />\n"; + $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; + } + + # Separator Character widget + if ( $name eq 'nntp_separator' ) { + $body .= "\n<form action=\"/configuration\">\n"; + $body .= "<label class=\"configurationLabel\" for=\"configSeparator\">$$language{Configuration_NNTPSeparator}:</label><br />\n"; + $body .= "<input name=\"nntp_separator\" id=\"configSeparator\" type=\"text\" value=\"" . $self->config_( 'separator' ) . "\" />\n"; + $body .= "<input type=\"submit\" class=\"submit\" name=\"update_nntp_separator\" value=\"$$language{Apply}\" />\n"; + $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; + } + + if ( $name eq 'nntp_local' ) { + $body .= "<span class=\"securityLabel\">$$language{Security_NNTP}:</span><br />\n"; + + $body .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" summary=\"\"><tr><td nowrap=\"nowrap\">\n"; + if ( $self->config_( 'local' ) == 1 ) { + $body .= "<form class=\"securitySwitch\" action=\"/security\">\n"; + $body .= "<span class=\"securityWidgetStateOff\">$$language{Security_NoStealthMode}</span>\n"; + $body .= "<input type=\"submit\" class=\"toggleOn\" id=\"securityAcceptPOP3On\" name=\"toggle\" value=\"$$language{ChangeToYes}\" />\n"; + $body .= "<input type=\"hidden\" name=\"nntp_local\" value=\"1\" />\n"; + $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; + } else { + $body .= "<form class=\"securitySwitch\" action=\"/security\">\n"; + $body .= "<span class=\"securityWidgetStateOn\">$$language{Yes}</span>\n"; + $body .= "<input type=\"submit\" class=\"toggleOff\" id=\"securityAcceptPOP3Off\" name=\"toggle\" value=\"$$language{ChangeToNo} (Stealth Mode)\" />\n"; + $body .= "<input type=\"hidden\" name=\"nntp_local\" value=\"2\" />\n"; + $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; + } + $body .= "</td></tr></table>\n"; + } + + return $body; + } + + # --------------------------------------------------------------------------------------------- + # + # validate_item + # + # $name The name of the item being configured, was passed in by the call + # to register_configuration_item + # $language Reference to the hash holding the current language + # $form Hash containing all form items + # + # Must return the HTML for this item + # --------------------------------------------------------------------------------------------- + + sub validate_item + { + my ( $self, $name, $language, $form ) = @_; + + if ( $name eq 'nntp_port' ) { + if ( defined($$form{nntp_port}) ) { + if ( ( $$form{nntp_port} >= 1 ) && ( $$form{nntp_port} < 65536 ) ) { + $self->config_( 'port', $$form{nntp_port} ); + return '<blockquote>' . sprintf( $$language{Configuration_NNTPUpdate} . '</blockquote>' , $self->config_( 'port' ) ); + } else { + return "<blockquote><div class=\"error01\">$$language{Configuration_Error3}</div></blockquote>"; + } + } + } + + if ( $name eq 'nntp_separator' ) { + if ( defined($$form{nntp_separator}) ) { + if ( length($$form{nntp_separator}) == 1 ) { + $self->config_( 'separator', $$form{separator} ); + return '<blockquote>' . sprintf( $$language{Configuration_NNTPSepUpdate} . '</blockquote>' , $self->config_( 'separator' ) ); + } else { + return "<blockquote>\n<div class=\"error01\">\n$$language{Configuration_Error1}</div>\n</blockquote>\n"; + } + } + } + + if ( $name eq 'nntp_local' ) { + $self->config_( 'local', $$form{nntp_local}-1 ) if ( defined($$form{nntp_local}) ); + } + + return ''; + } + + 1; Index: POP3.pm =================================================================== RCS file: /cvsroot/popfile/engine/Proxy/POP3.pm,v retrieving revision 1.49 retrieving revision 1.50 diff -C2 -d -r1.49 -r1.50 *** POP3.pm 8 Mar 2003 00:51:50 -0000 1.49 --- POP3.pm 25 Mar 2003 05:24:55 -0000 1.50 *************** *** 71,74 **** --- 71,97 ---- $self->config_( 'separator', ':' ); + # Tell the user interface module that we having a configuration + # item that needs a UI component + + $self->{ui__}->register_configuration_item( 'configuration', + 'pop3_port', + $self ); + + $self->{ui__}->register_configuration_item( 'configuration', + 'pop3_separator', + $self ); + + $self->{ui__}->register_configuration_item( 'security', + 'pop3_local', + $self ); + + $self->{ui__}->register_configuration_item( 'chain', + 'pop3_secure_server', + $self ); + + $self->{ui__}->register_configuration_item( 'chain', + 'pop3_secure_server_port', + $self ); + return 1; } *************** *** 95,99 **** # Tell the client that we are ready for commands and identify our version number ! $self->tee_( $client, "+OK POP3 POPFile (vTODO.TODO.TODO) server ready$eol" ); # Retrieve commands from the client and process them until the client disconnects or --- 118,122 ---- # Tell the client that we are ready for commands and identify our version number ! $self->tee_( $client, "+OK POP3 POPFile ($self->{version_}) server ready$eol" ); # Retrieve commands from the client and process them until the client disconnects or *************** *** 345,348 **** --- 368,510 ---- $self->log_( "POP3 forked child done" ); + } + + # --------------------------------------------------------------------------------------------- + # + # configure_item + # + # $name The name of the item being configured, was passed in by the call + # to register_configuration_item + # $language Reference to the hash holding the current language + # $session_key The current session key + # + # Must return the HTML for this item + # --------------------------------------------------------------------------------------------- + + sub configure_item + { + my ( $self, $name, $language, $session_key ) = @_; + + my $body; + + # POP3 Listen Port widget + if ( $name eq 'pop3_port' ) { + $body .= "<form action=\"/configuration\">\n"; + $body .= "<label class=\"configurationLabel\" for=\"configPopPort\">$$language{Configuration_POP3Port}:</label><br />\n"; + $body .= "<input name=\"pop3_port\" type=\"text\" id=\"configPopPort\" value=\"" . $self->config_( 'port' ) . "\" />\n"; + $body .= "<input type=\"submit\" class=\"submit\" name=\"update_pop3_port\" value=\"$$language{Apply}\" />\n"; + $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; + } + + # Separator Character widget + if ( $name eq 'pop3_separator' ) { + $body .= "\n<form action=\"/configuration\">\n"; + $body .= "<label class=\"configurationLabel\" for=\"configSeparator\">$$language{Configuration_POP3Separator}:</label><br />\n"; + $body .= "<input name=\"pop3_separator\" id=\"configSeparator\" type=\"text\" value=\"" . $self->config_( 'separator' ) . "\" />\n"; + $body .= "<input type=\"submit\" class=\"submit\" name=\"update_pop3_separator\" value=\"$$language{Apply}\" />\n"; + $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; + } + + # Accept POP3 from Remote Machines widget + if ( $name eq 'pop3_local' ) { + $body .= "<span class=\"securityLabel\">$$language{Security_POP3}:</span><br />\n"; + + $body .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" summary=\"\"><tr><td nowrap=\"nowrap\">\n"; + if ( $self->config_( 'local' ) == 1 ) { + $body .= "<form class=\"securitySwitch\" action=\"/security\">\n"; + $body .= "<span class=\"securityWidgetStateOff\">$$language{Security_NoStealthMode}</span>\n"; + $body .= "<input type=\"submit\" class=\"toggleOn\" id=\"securityAcceptPOP3On\" name=\"toggle\" value=\"$$language{ChangeToYes}\" />\n"; + $body .= "<input type=\"hidden\" name=\"pop3_local\" value=\"1\" />\n"; + $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; + } else { + $body .= "<form class=\"securitySwitch\" action=\"/security\">\n"; + $body .= "<span class=\"securityWidgetStateOn\">$$language{Yes}</span>\n"; + $body .= "<input type=\"submit\" class=\"toggleOff\" id=\"securityAcceptPOP3Off\" name=\"toggle\" value=\"$$language{ChangeToNo} (Stealth Mode)\" />\n"; + $body .= "<input type=\"hidden\" name=\"pop3_local\" value=\"2\" />\n"; + $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; + } + $body .= "</td></tr></table>\n"; + } + + # Secure Server widget + if ( $name eq 'pop3_secure_server' ) { + $body .= "<form action=\"/security\">\n"; + $body .= "<label class=\"securityLabel\" for=\"securitySecureServer\">$$language{Security_SecureServer}:</label><br />\n"; + $body .= "<input type=\"text\" name=\"server\" id=\"securitySecureServer\" value=\"" . $self->config_( 'secure_server' ) . "\" />\n"; + $body .= "<input type=\"submit\" class=\"submit\" name=\"update_server\" value=\"$$language{Apply}\" />\n"; + $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; + } + + # Secure Port widget + if ( $name eq 'pop3_secure_server_port' ) { + $body .= "<form action=\"/security\">\n"; + $body .= "<label class=\"securityLabel\" for=\"securitySecurePort\">$$language{Security_SecurePort}:</label><br />\n"; + $body .= "<input type=\"text\" name=\"sport\" id=\"securitySecurePort\" value=\"" . $self->config_( 'secure_port' ) . "\" />\n"; + $body .= "<input type=\"submit\" class=\"submit\" name=\"update_sport\" value=\"$$language{Apply}\" />\n"; + $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; + } + + return $body; + } + + # --------------------------------------------------------------------------------------------- + # + # validate_item + # + # $name The name of the item being configured, was passed in by the call + # to register_configuration_item + # $language Reference to the hash holding the current language + # $form Hash containing all form items + # + # Must return the HTML for this item + # --------------------------------------------------------------------------------------------- + + sub validate_item + { + my ( $self, $name, $language, $form ) = @_; + + if ( $name eq 'pop3_port' ) { + if ( defined($$form{pop3_port}) ) { + if ( ( $$form{pop3_port} >= 1 ) && ( $$form{pop3_port} < 65536 ) ) { + $self->config_( 'port', $$form{pop3_port} ); + return '<blockquote>' . sprintf( $$language{Configuration_POP3Update} . '</blockquote>' , $self->config_( 'port' ) ); + } else { + return "<blockquote><div class=\"error01\">$$language{Configuration_Error3}</div></blockquote>"; + } + } + } + + if ( $name eq 'pop3_separator' ) { + if ( defined($$form{pop3_separator}) ) { + if ( length($$form{pop3_separator}) == 1 ) { + $self->config_( 'separator', $$form{separator} ); + return '<blockquote>' . sprintf( $$language{Configuration_POP3SepUpdate} . '</blockquote>' , $self->config_( 'separator' ) ); + } else { + return "<blockquote>\n<div class=\"error01\">\n$$language{Configuration_Error1}</div>\n</blockquote>\n"; + } + } + } + + if ( $name eq 'pop3_local' ) { + $self->config_( 'local', $$form{pop3_local}-1 ) if ( defined($$form{pop3_local}) ); + } + + if ( $name eq 'pop3_secure_server' ) { + $self->config_( 'secure_server', $$form{server} ) if ( defined($$form{server}) ); + return sprintf( "<blockquote>" . $$language{Security_SecureServerUpdate} . "</blockquote>", $self->config_( 'secure_server' ) ) if ( defined($$form{server}) ); + } + + if ( $name eq 'pop3_secure_server_port' ) { + if ( defined($$form{sport}) ) { + if ( ( $$form{sport} >= 1 ) && ( $$form{sport} < 65536 ) ) { + $self->config_( 'secure_port', $$form{sport} ); + return sprintf( "<blockquote>" . $$language{Security_SecurePortUpdate} . "</blockquote>", $self->config_( 'secure_port' ) ) if ( defined($$form{sport}) ); + } else { + return "<blockquote><div class=\"error01\">$$language{Security_Error1}</div></blockquote>"; + } + } + } + + return ''; } Index: Proxy.pm =================================================================== RCS file: /cvsroot/popfile/engine/Proxy/Proxy.pm,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** Proxy.pm 23 Mar 2003 04:04:53 -0000 1.11 --- Proxy.pm 25 Mar 2003 05:24:56 -0000 1.12 *************** *** 92,99 **** if ( !defined( $self->{server__} ) ) { print <<EOM; ! \nCouldn't start the $self->name() proxy because POPFile could not bind to the ! POP3 listen port $self->config_( 'port' ). This could be because there is another service using that port or because you do not have the right privileges on your system (On Unix systems this can happen if you are not root --- 92,101 ---- if ( !defined( $self->{server__} ) ) { + my $port = $self->config_( 'port' ); + my $name = $self->name(); print <<EOM; ! \nCouldn't start the $name proxy because POPFile could not bind to the ! listen port $port. This could be because there is another service using that port or because you do not have the right privileges on your system (On Unix systems this can happen if you are not root Index: SMTP.pm =================================================================== RCS file: /cvsroot/popfile/engine/Proxy/SMTP.pm,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** SMTP.pm 21 Mar 2003 05:33:12 -0000 1.8 --- SMTP.pm 25 Mar 2003 05:24:56 -0000 1.9 *************** *** 68,71 **** --- 68,90 ---- $self->config_( 'local', 1 ); + # Tell the user interface module that we having a configuration + # item that needs a UI component + + $self->{ui__}->register_configuration_item( 'configuration', + 'smtp_port', + $self ); + + $self->{ui__}->register_configuration_item( 'security', + 'smtp_local', + $self ); + + $self->{ui__}->register_configuration_item( 'chain', + 'smtp_server', + $self ); + + $self->{ui__}->register_configuration_item( 'chain', + 'smtp_server_port', + $self ); + return 1; } *************** *** 92,96 **** # Tell the client that we are ready for commands and identify our version number ! $self->tee_( $client, "220 SMTP POPFile (vTODO.TODO.TODO) server ready$eol" ); # Retrieve commands from the client and process them until the client disconnects or --- 111,115 ---- # Tell the client that we are ready for commands and identify our version number ! $self->tee_( $client, "220 SMTP POPFile ($self->{version_}) server ready$eol" ); # Retrieve commands from the client and process them until the client disconnects or *************** *** 109,116 **** if ( $self->config_( 'chain_server' ) ) { if ( $mail = $self->verify_connected_( $mail, $client, $self->config_( 'chain_server' ), $self->config_( 'chain_port' ) ) ) { ! $self->smtp_echo_response_( $mail, $client, $command ); ! } else { last; --- 128,135 ---- if ( $self->config_( 'chain_server' ) ) { if ( $mail = $self->verify_connected_( $mail, $client, $self->config_( 'chain_server' ), $self->config_( 'chain_port' ) ) ) { ! $self->smtp_echo_response_( $mail, $client, $command ); ! } else { last; *************** *** 200,211 **** # # --------------------------------------------------------------------------------------------- - - - sub smtp_echo_response_ { my ($self, $mail, $client, $command) = @_; my $response = $self->get_response_( $mail, $client, $command ); ! if ( $response =~ /^[23]\d\d-/ ) { $self->echo_to_regexp_($mail, $client, qr/^\d\d\d /, 1); --- 219,227 ---- # # --------------------------------------------------------------------------------------------- sub smtp_echo_response_ { my ($self, $mail, $client, $command) = @_; my $response = $self->get_response_( $mail, $client, $command ); ! if ( $response =~ /^[23]\d\d-/ ) { $self->echo_to_regexp_($mail, $client, qr/^\d\d\d /, 1); *************** *** 214,218 **** } ! 1; --- 230,347 ---- } ! # --------------------------------------------------------------------------------------------- ! # ! # configure_item ! # ! # $name The name of the item being configured, was passed in by the call ! # to register_configuration_item ! # $language Reference to the hash holding the current language ! # $session_key The current session key ! # ! # Must return the HTML for this item ! # --------------------------------------------------------------------------------------------- ! ! sub configure_item ! { ! my ( $self, $name, $language, $session_key ) = @_; ! ! my $body; ! ! if ( $name eq 'smtp_port' ) { ! $body .= "<form action=\"/configuration\">\n"; ! $body .= "<label class=\"configurationLabel\" for=\"configPopPort\">$$language{Configuration_SMTPPort}:</label><br />\n"; ! $body .= "<input name=\"smtp_port\" type=\"text\" id=\"configPopPort\" value=\"" . $self->config_( 'port' ) . "\" />\n"; ! $body .= "<input type=\"submit\" class=\"submit\" name=\"update_smtp_port\" value=\"$$language{Apply}\" />\n"; ! $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; ! } ! ! if ( $name eq 'smtp_local' ) { ! $body .= "<span class=\"securityLabel\">$$language{Security_SMTP}:</span><br />\n"; ! ! $body .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" summary=\"\"><tr><td nowrap=\"nowrap\">\n"; ! if ( $self->config_( 'local' ) == 1 ) { ! $body .= "<form class=\"securitySwitch\" action=\"/security\">\n"; ! $body .= "<span class=\"securityWidgetStateOff\">$$language{Security_NoStealthMode}</span>\n"; ! $body .= "<input type=\"submit\" class=\"toggleOn\" id=\"securityAcceptPOP3On\" name=\"toggle\" value=\"$$language{ChangeToYes}\" />\n"; ! $body .= "<input type=\"hidden\" name=\"smtp_local\" value=\"1\" />\n"; ! $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; ! } else { ! $body .= "<form class=\"securitySwitch\" action=\"/security\">\n"; ! $body .= "<span class=\"securityWidgetStateOn\">$$language{Yes}</span>\n"; ! $body .= "<input type=\"submit\" class=\"toggleOff\" id=\"securityAcceptPOP3Off\" name=\"toggle\" value=\"$$language{ChangeToNo} (Stealth Mode)\" />\n"; ! $body .= "<input type=\"hidden\" name=\"smtp_local\" value=\"2\" />\n"; ! $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; ! } ! $body .= "</td></tr></table>\n"; ! } ! ! if ( $name eq 'smtp_server' ) { ! $body .= "<form action=\"/security\">\n"; ! $body .= "<label class=\"securityLabel\" for=\"securitySecureServer\">$$language{Security_SMTPServer}:</label><br />\n"; ! $body .= "<input type=\"text\" name=\"smtp_chain_server\" id=\"securitySecureServer\" value=\"" . $self->config_( 'chain_server' ) . "\" />\n"; ! $body .= "<input type=\"submit\" class=\"submit\" name=\"update_smtp_server\" value=\"$$language{Apply}\" />\n"; ! $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; ! } ! ! if ( $name eq 'smtp_server_port' ) { ! $body .= "<form action=\"/security\">\n"; ! $body .= "<label class=\"securityLabel\" for=\"securitySecurePort\">$$language{Security_SMTPPort}:</label><br />\n"; ! $body .= "<input type=\"text\" name=\"smtp_chain_server_port\" id=\"securitySecurePort\" value=\"" . $self->config_( 'chain_port' ) . "\" />\n"; ! $body .= "<input type=\"submit\" class=\"submit\" name=\"update_smtp_server_port\" value=\"$$language{Apply}\" />\n"; ! $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; ! } ! ! return $body; ! } ! ! # --------------------------------------------------------------------------------------------- ! # ! # validate_item ! # ! # $name The name of the item being configured, was passed in by the call ! # to register_configuration_item ! # $language Reference to the hash holding the current language ! # $form Hash containing all form items ! # ! # Must return the HTML for this item ! # --------------------------------------------------------------------------------------------- ! ! sub validate_item ! { ! my ( $self, $name, $language, $form ) = @_; ! ! if ( $name eq 'smtp_port' ) { ! if ( defined($$form{smtp_port}) ) { ! if ( ( $$form{smtp_port} >= 1 ) && ( $$form{smtp_port} < 65536 ) ) { ! $self->config_( 'port', $$form{smtp_port} ); ! return '<blockquote>' . sprintf( $$language{Configuration_POP3Update} . '</blockquote>' , $self->config_( 'port' ) ); ! } else { ! return "<blockquote><div class=\"error01\">$$language{Configuration_Error3}</div></blockquote>"; ! } ! } ! } ! ! if ( $name eq 'smtp_local' ) { ! $self->config_( 'local', $$form{smtp_local}-1 ) if ( defined($$form{smtp_local}) ); ! } ! ! if ( $name eq 'smtp_server' ) { ! $self->config_( 'chain_server', $$form{smtp_chain_server} ) if ( defined($$form{smtp_chain_server}) ); ! return sprintf( "<blockquote>" . $$language{Security_SMTPServerUpdate} . "</blockquote>", $self->config_( 'chain_server' ) ) if ( defined($$form{smtp_chain_server}) ); ! } ! ! if ( $name eq 'smtp_server_port' ) { ! if ( defined($$form{smtp_chain_server_port}) ) { ! if ( ( $$form{smtp_chain_server_port} >= 1 ) && ( $$form{smtp_chain_server_port} < 65536 ) ) { ! $self->config_( 'chain_port', $$form{smtp_chain_server_port} ); ! return sprintf( "<blockquote>" . $$language{Security_SMTPPortUpdate} . "</blockquote>", $self->config_( 'chain_port' ) ) if ( defined($$form{smtp_chain_chain_port}) ); ! } else { ! return "<blockquote><div class=\"error01\">$$language{Security_Error1}</div></blockquote>"; ! } ! } ! } ! ! return ''; ! } 1; |
From: <jgr...@us...> - 2003-03-25 05:25:04
|
Update of /cvsroot/popfile/engine/UI In directory sc8-pr-cvs1:/tmp/cvs-serv20897/UI Modified Files: HTML.pm Added Files: HTTP.pm XMLRPC.pm Log Message: Make the UI pluggable; make SMTP, NNTP and POP3 modules register and handle their own configuration UI; factor the HTTP code out of the UI and into own class; implement XML-RPC interface; make test suite allow selection of tests to run; change the way POPFile reports its startup; make the version string work --- NEW FILE: HTTP.pm --- #---------------------------------------------------------------------------- # # This package contains an HTTP server used as a base class for other # modules that service requests over HTTP (e.g. the UI) # # Copyright (c) 2001-2003 John Graham-Cumming # #---------------------------------------------------------------------------- package UI::HTTP; use POPFile::Module; @ISA = ("POPFile::Module"); use strict; use warnings; use locale; use IO::Socket; use IO::Select; # A handy variable containing the value of an EOL for the network my $eol = "\015\012"; #---------------------------------------------------------------------------- # new # # Class new() function #---------------------------------------------------------------------------- sub new { my $type = shift; my $self = POPFile::Module->new(); return $self; } # --------------------------------------------------------------------------------------------- # # start # # Called to start the HTTP interface running # # --------------------------------------------------------------------------------------------- sub start { my ( $self ) = @_; $self->{server_} = IO::Socket::INET->new( Proto => 'tcp', $self->config_( 'local' ) == 1 ? (LocalAddr => 'localhost') : (), LocalPort => $self->config_( 'port' ), Listen => SOMAXCONN, Reuse => 1 ); if ( !defined( $self->{server_} ) ) { my $port = $self->config_( 'port' ); my $name = $self->name(); print <<EOM; \nCouldn't start the $name HTTP interface because POPFile could not bind to the HTTP port $port. This could be because there is another service using that port or because you do not have the right privileges on your system (On Unix systems this can happen if you are not root and the port you specified is less than 1024). EOM return 0; } $self->{selector_} = new IO::Select( $self->{server_} ); return 1; } # --------------------------------------------------------------------------------------------- # # stop # # Called when the interface must shutdown # # --------------------------------------------------------------------------------------------- sub stop { my ( $self ) = @_; close $self->{server_} if ( defined( $self->{server_} ) ); } # --------------------------------------------------------------------------------------------- # # service # # Called to handle interface requests # # --------------------------------------------------------------------------------------------- sub service { my ( $self ) = @_; my $code = 1; # See if there's a connection waiting for us, if there is we accept it handle a single # request and then exit my ( $ready ) = $self->{selector_}->can_read(0); # Handle HTTP requests for the UI if ( ( defined( $ready ) ) && ( $ready == $self->{server_} ) ) { if ( my $client = $self->{server_}->accept() ) { # Check that this is a connection from the local machine, if it's not then we drop it immediately # without any further processing. We don't want to allow remote users to admin POPFile my ( $remote_port, $remote_host ) = sockaddr_in( $client->peername() ); if ( ( $self->config_( 'local' ) == 0 ) || ( $remote_host eq inet_aton( "127.0.0.1" ) ) ) { # Read the request line (GET or POST) from the client and if we manage to do that # then read the rest of the HTTP headers grabbing the Content-Length and using # it to read any form POST content into $content if ( ( defined( $client ) ) && ( my $request = <$client> ) ) { my $content_length = 0; my $content; while ( <$client> ) { $content_length = $1 if ( /Content-Length: (\d+)/i ); last if ( !/[A-Z]/i ); } if ( $content_length > 0 ) { $content = ''; $client->read( $content, $content_length, length( $content ) ); } if ( $request =~ /^(GET|POST) (.*) HTTP\/1\./i ) { $client->autoflush(1); $code = $self->handle_url( $client, $2, $1, $content ); } else { http_error_( $self, $client, 500 ); } } } close $client; } } return $code; } # --------------------------------------------------------------------------------------------- # # forked # # Called when someone forks POPFile # # --------------------------------------------------------------------------------------------- sub forked { my ( $self ) = @_; close $self->{server_}; } # --------------------------------------------------------------------------------------------- # # handle_url - Handle a URL request # # $client The web browser to send the results to # $url URL to process # $command The HTTP command used (GET or POST) # $content Any non-header data in the HTTP command # # Takes a URL and splits it into the URL portion and form arguments specified in the command # filling out the %form hash with the form elements and their values. Checks the session # key and refuses access unless it matches. Serves up a small set of specific urls that are # the main UI pages and then any GIF file in the POPFile directory and CSS files in the skins # subdirectory # # --------------------------------------------------------------------------------------------- sub handle_url { my ( $self, $client, $url, $command, $content ) = @_; return $self->{url_handler_}( $self, $client, $url, $command, $content ); } # --------------------------------------------------------------------------------------------- # # parse_form__ - parse form data and fill in $self->{form_} # # $arguments The text of the form arguments (e.g. foo=bar&baz=fou) # # --------------------------------------------------------------------------------------------- sub parse_form__ { my ( $self, $arguments ) = @_; # Normally the browser should have done & to & translation on # URIs being passed onto us, but there was a report that someone # was having a problem with form arguments coming through with # something like http://127.0.0.1/history?session=foo&filter=bar # which would mess things up in the argument splitter so this code # just changes & to & for safety $arguments =~ s/&/&/g; while ( $arguments =~ m/\G(.*?)=(.*?)(&|\r|\n|$)/g ) { my $arg = $1; $self->{form_}{$arg} = $2; # Expand %7E (hex) escapes in the form data $self->{form_}{$arg} =~ s/%([0-9A-F][0-9A-F])/chr hex $1/gie; $self->{form_}{$arg} =~ s/\+/ /g; # Push the value onto an array to allow for multiple values of the same name push( @{ $self->{form_}{$arg . "_array"} }, $self->{form_}{$arg} ); } } # --------------------------------------------------------------------------------------------- # # url_encode_ # # $text Text to encode for URL safety # # Encode a URL so that it can be safely passed in a URL as per RFC2396 # # --------------------------------------------------------------------------------------------- sub url_encode_ { my ( $self, $text ) = @_; $text =~ s/ /\+/; $text =~ s/([^a-zA-Z0-9_\-.+])/sprintf("%%%02x",ord($1))/eg; return $text; } # --------------------------------------------------------------------------------------------- # # http_redirect_ - tell the browser to redirect to a url # # $client The web browser to send redirect to # $url Where to go # # Return a valid HTTP/1.0 header containing a 302 redirect message to the passed in URL # # --------------------------------------------------------------------------------------------- sub http_redirect_ { my ( $self, $client, $url ) = @_; my $header = "HTTP/1.0 302 Found\r\nLocation: "; $header .= $url; $header .= "$eol$eol"; print $client $header; } # --------------------------------------------------------------------------------------------- # # http_error_ - Output a standard HTTP error message # # $client The web browser to send the results to # $error The error number # # Return a simple HTTP error message in HTTP 1/0 format # # --------------------------------------------------------------------------------------------- sub http_error_ { my ( $self, $client, $error ) = @_; print $client "HTTP/1.0 $error Error$eol$eol"; } # --------------------------------------------------------------------------------------------- # # http_file_ - Read a file from disk and send it to the other end # # $client The web browser to send the results to # $file The file to read (always assumed to be a GIF right now) # $type Set this to the HTTP return type (e.g. text/html or image/gif) # # Returns the contents of a file formatted into an HTTP 200 message or an HTTP 404 if the # file does not exist # # --------------------------------------------------------------------------------------------- sub http_file_ { my ( $self, $client, $file, $type ) = @_; my $contents = ''; if ( open FILE, "<$file" ) { binmode FILE; while (<FILE>) { $contents .= $_; } close FILE; my $header = "HTTP/1.0 200 OK\r\nContent-Type: $type\r\nContent-Length: "; $header .= length($contents); $header .= "$eol$eol"; print $client $header . $contents; } else { http_error_( $self, $client, 404 ); } } --- NEW FILE: XMLRPC.pm --- # POPFILE LOADABLE MODULE package UI::XMLRPC; #---------------------------------------------------------------------------- # # This package contains the XML-RPC interface for POPFile, all the methods # in Classifier::Bayes can be accessed through the XMLRPC interface and # a typical method would be accessed as follows # # Classifier/Bayes.get_buckets # # Copyright (c) 2001-2003 John Graham-Cumming # #---------------------------------------------------------------------------- use POPFile::Module; @ISA = ("POPFile::Module"); use strict; use warnings; use locale; use IO::Socket; use IO::Select; require XMLRPC::Transport::HTTP; #---------------------------------------------------------------------------- # new # # Class new() function #---------------------------------------------------------------------------- sub new { my $type = shift; my $self = UI::HTTP->new(); bless $self, $type;; $self->name( 'xmlrpc' ); return $self; } # --------------------------------------------------------------------------------------------- # # initialize # # Called to initialize the interface # # --------------------------------------------------------------------------------------------- sub initialize { my ( $self ) = @_; # XML-RPC is available on port 8081 initially $self->config_( 'port', 8081 ); # Only accept connections from the local machine $self->config_( 'local', 1 ); # Tell the user interface module that we having a configuration # item that needs a UI component $self->{ui__}->register_configuration_item( 'configuration', 'xmlrpc_port', $self ); $self->{ui__}->register_configuration_item( 'security', 'xmlrpc_local', $self ); return 1; } # --------------------------------------------------------------------------------------------- # # start # # Called to start the HTTP interface running # # --------------------------------------------------------------------------------------------- sub start { my ( $self ) = @_; # We use a single XMLRPC::Lite object to handle requests for access to the # Classifier::Bayes object $self->{server__} = XMLRPC::Transport::HTTP::Daemon->new( Proto => 'tcp', $self->config_( 'local' ) == 1 ? (LocalAddr => 'localhost') : (), LocalPort => $self->config_( 'port' ), Listen => SOMAXCONN, Reuse => 1 ); if ( !defined( $self->{server__} ) ) { my $port = $self->config_( 'port' ); my $name = $self->name(); print <<EOM; \nCouldn't start the $name HTTP interface because POPFile could not bind to the HTTP port $port. This could be because there is another service using that port or because you do not have the right privileges on your system (On Unix systems this can happen if you are not root and the port you specified is less than 1024). EOM return 0; } # All requests will get dispatched to the main Classifier::Bayes object, for example # the get_bucket_color interface is accessed with the method name # # Classifier/Bayes.get_bucket_color $self->{server__}->dispatch_to( $self->{classifier__} ); # DANGER WILL ROBINSON! In order to make a polling XML-RPC server I am using # the XMLRPC::Transport::HTTP::Daemon class which uses blocking I/O. This would # be all very well but it seems to be totally ignorning signals on Windows and so # POPFile is unstoppable when the handle() method is called. Forking with this # blocking doesn't help much because then we get an unstoppable child. # # So the solution relies on knowing the internals of XMLRPC::Transport::HTTP::Daemon # which is actuall a SOAP::Transport::HTTP::Daemon which has a HTTP::Daemon (stored # in a private variable called _daemon. HTTP::Daemon is an IO::Socket::INET which means # we can create a selector on it, so here we access a PRIVATE variable on the XMLRPC # object. This is very bad behaviour, but it works until someone changes XMLRPC. $self->{selector__} = new IO::Select( $self->{server__}->{_daemon} ); return 1; } # --------------------------------------------------------------------------------------------- # # service # # Called to handle interface requests # # --------------------------------------------------------------------------------------------- sub service { my ( $self ) = @_; # See if there's a connection pending on the XMLRPC socket and handle # single request my ( $ready ) = $self->{selector__}->can_read(0); if ( defined( $ready ) ) { if ( my $client = $self->{server__}->accept() ) { # Check that this is a connection from the local machine, if it's not then we drop it immediately # without any further processing. We don't want to allow remote users to admin POPFile my ( $remote_port, $remote_host ) = sockaddr_in( $client->peername() ); if ( ( $self->config_( 'local' ) == 0 ) || ( $remote_host eq inet_aton( "127.0.0.1" ) ) ) { my $request = $client->get_request(); $self->{server__}->request( $request ); # Note the direct call to SOAP::Transport::HTTP::Server::handle() here, this is # because we have taken the code from XMLRPC::Transport::HTTP::Server::handle() # and reproduced a modification of it here, accepting a single request and handling # it. This call to the parent of XMLRPC::Transport::HTTP::Server will actually # deal with the request $self->{server__}->SOAP::Transport::HTTP::Server::handle(); $client->send_response( $self->{server__}->response ); $client->close(); } } } return 1; } # --------------------------------------------------------------------------------------------- # # configure_item # # $name The name of the item being configured, was passed in by the call # to register_configuration_item # $language Reference to the hash holding the current language # $session_key The current session key # # Must return the HTML for this item # --------------------------------------------------------------------------------------------- sub configure_item { my ( $self, $name, $language, $session_key ) = @_; my $body; if ( $name eq 'xmlrpc_port' ) { $body .= "<form action=\"/configuration\">\n"; $body .= "<label class=\"configurationLabel\" for=\"configPopPort\">". $$language{Configuration_XMLRPCPort} . ":</label><br />\n"; $body .= "<input name=\"xmlrpc_port\" type=\"text\" id=\"configPopPort\" value=\"" . $self->config_( 'port' ) . "\" />\n"; $body .= "<input type=\"submit\" class=\"submit\" name=\"update_xmlrpc_port\" value=\"" . $$language{Apply} . "\" />\n"; $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; } if ( $name eq 'xmlrpc_local' ) { $body .= "<span class=\"securityLabel\">$$language{Security_XMLRPC}:</span><br />\n"; $body .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" summary=\"\"><tr><td nowrap=\"nowrap\">\n"; if ( $self->config_( 'local' ) == 1 ) { $body .= "<form class=\"securitySwitch\" action=\"/security\">\n"; $body .= "<span class=\"securityWidgetStateOff\">$$language{Security_NoStealthMode}</span>\n"; $body .= "<input type=\"submit\" class=\"toggleOn\" id=\"securityAcceptPOP3On\" name=\"toggle\" value=\"$$language{ChangeToYes}\" />\n"; $body .= "<input type=\"hidden\" name=\"xmlrpc_local\" value=\"1\" />\n"; $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; } else { $body .= "<form class=\"securitySwitch\" action=\"/security\">\n"; $body .= "<span class=\"securityWidgetStateOn\">$$language{Yes}</span>\n"; $body .= "<input type=\"submit\" class=\"toggleOff\" id=\"securityAcceptPOP3Off\" name=\"toggle\" value=\"$$language{ChangeToNo} (Stealth Mode)\" />\n"; $body .= "<input type=\"hidden\" name=\"xmlrpc_local\" value=\"2\" />\n"; $body .= "<input type=\"hidden\" name=\"session\" value=\"$session_key\" />\n</form>\n"; } $body .= "</td></tr></table>\n"; } return $body; } # --------------------------------------------------------------------------------------------- # # validate_item # # $name The name of the item being configured, was passed in by the call # to register_configuration_item # $language Reference to the hash holding the current language # $form Hash containing all form items # # Must return the HTML for this item # --------------------------------------------------------------------------------------------- sub validate_item { my ( $self, $name, $language, $form ) = @_; # Just check to see if the XML rpc port was change and check its value if ( $name eq 'xmlrpc_port' ) { if ( defined($$form{xmlrpc_port}) ) { if ( ( $$form{xmlrpc_port} >= 1 ) && ( $$form{xmlrpc_port} < 65536 ) ) { $self->config_( 'port', $$form{xmlrpc_port} ); return '<blockquote>' . sprintf( $$language{Configuration_XMLRPCUpdate} . '</blockquote>' , $self->config_( 'port' ) ); } else { return "<blockquote><div class=\"error01\">$$language{Configuration_Error7}</div></blockquote>"; } } } if ( $name eq 'xmlrpc_local' ) { $self->config_( 'local', $$form{xmlrpc_local}-1 ) if ( defined($$form{xmlrpc_local}) ); } return ''; } # GETTERS/SETTERS sub classifier { my ( $self, $value ) = @_; if ( defined( $value ) ) { $self->{classifier__} = $value; } return $self->{classifier__}; } sub ui { my ( $self, $value ) = @_; if ( defined( $value ) ) { $self->{ui__} = $value; } return $self->{ui__}; } 1; Index: HTML.pm =================================================================== RCS file: /cvsroot/popfile/engine/UI/HTML.pm,v retrieving revision 1.118 retrieving revision 1.119 diff -C2 -d -r1.118 -r1.119 *** HTML.pm 21 Mar 2003 23:10:32 -0000 1.118 --- HTML.pm 25 Mar 2003 05:24:58 -0000 1.119 *************** *** 2,8 **** package UI::HTML; - use POPFile::Module; - @ISA = ("POPFile::Module"); - #---------------------------------------------------------------------------- # --- 2,5 ---- *************** *** 12,16 **** [...2157 lines suppressed...] + # + # and needs to return the HTML for the foo_bar item. Then it will may receive a call to its + # + # validate_item( 'foo_bar', language hash, form hash ) + # + # and needs to check the form for information from any form it created and returned from the + # call to configure_item and update its own state. It can optionally return HTML that + # will be displayed at the top of the page + # + # --------------------------------------------------------------------------------------------- + sub register_configuration_item + { + my ( $self, $type, $name, $object ) = @_; + + $self->{dynamic_ui__}{$type}{$name} = $object; + } + + # GETTERS/SETTERS sub classifier |
From: <jgr...@us...> - 2003-03-25 05:25:04
|
Update of /cvsroot/popfile/engine/languages In directory sc8-pr-cvs1:/tmp/cvs-serv20897/languages Modified Files: English.msg Log Message: Make the UI pluggable; make SMTP, NNTP and POP3 modules register and handle their own configuration UI; factor the HTTP code out of the UI and into own class; implement XML-RPC interface; make test suite allow selection of tests to run; change the way POPFile reports its startup; make the version string work Index: English.msg =================================================================== RCS file: /cvsroot/popfile/engine/languages/English.msg,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** English.msg 26 Feb 2003 17:37:11 -0000 1.22 --- English.msg 25 Mar 2003 05:24:58 -0000 1.23 *************** *** 65,76 **** Configuration_Error5 The number of days in the history must be a number between 1 and 366 Configuration_Error6 The TCP timeout must be a number between 10 and 300 Configuration_POP3Port POP3 listen port ! Configuration_POP3Update Updated port to %s; this change will not take affect until you restart POPFile ! Configuration_Separator Separator character ! Configuration_SepUpdate Updated separator to %s Configuration_UI User interface web port Configuration_UIUpdate Updated user interface web port to %s; this change will not take affect until you restart POPFile ! Configuration_History Number of emails per page ! Configuration_HistoryUpdate Updated number of emails per page to %s Configuration_Days Number of days of history to keep Configuration_DaysUpdate Updated number of days of history to %s --- 65,85 ---- Configuration_Error5 The number of days in the history must be a number between 1 and 366 Configuration_Error6 The TCP timeout must be a number between 10 and 300 + Configuration_Error7 The XML RPC listen port must be a number between 1 and 65535 Configuration_POP3Port POP3 listen port ! Configuration_POP3Update Updated POP3 port to %s; this change will not take affect until you restart POPFile ! Configuration_XMLRPCUpdate Updated XML-RPC port to %s; this change will not take affect until you restart POPFile ! Configuration_XMLRPCPort XML-RPC listen port ! Configuration_SMTPPort SMTP listen port ! Configuration_SMTPUpdate Updated SMTP port to %s; this change will not take affect until you restart POPFile ! Configuration_NNTPPort NNTP listen port ! Configuration_NNTPUpdate Updated NNTP port to %s; this change will not take affect until you restart POPFile ! Configuration_POP3Separator POP3 host:port:user separator character ! Configuration_NNTPSeparator NNTP host:port:user separator character ! Configuration_POP3SepUpdate Updated POP3 separator to %s ! Configuration_NNTPSepUpdate Updated NNTP separator to %s Configuration_UI User interface web port Configuration_UIUpdate Updated user interface web port to %s; this change will not take affect until you restart POPFile ! Configuration_History Number of messages per page ! Configuration_HistoryUpdate Updated number of messages per page to %s Configuration_Days Number of days of history to keep Configuration_DaysUpdate Updated number of days of history to %s *************** *** 80,89 **** Configuration_Language Language Configuration_LanguageChoose Choose language ! Configuration_ListenPorts Listen Ports Configuration_HistoryView History View ! Configuration_TCPTimeout TCP Connection Timeout ! Configuration_TCPTimeoutSecs TCP connection timeout in seconds ! Configuration_TCPTimeoutUpdate Updated TCP connection timeout to %s ! Configuration_ClassificationInsertion E-Mail Text Insertion Configuration_SubjectLine Subject line modification Configuration_XTCInsertion X-Text-Classification Header --- 89,98 ---- Configuration_Language Language Configuration_LanguageChoose Choose language ! Configuration_ListenPorts Module Options Configuration_HistoryView History View ! Configuration_TCPTimeout Connection Timeout ! Configuration_TCPTimeoutSecs Connection timeout in seconds ! Configuration_TCPTimeoutUpdate Updated connection timeout to %s ! Configuration_ClassificationInsertion Message Text Insertion Configuration_SubjectLine Subject line modification Configuration_XTCInsertion X-Text-Classification Header *************** *** 136,140 **** Password_Error1 Incorrect password ! Security_Error1 The secure port must be a number between 1 and 65535 Security_Stealth Stealth Mode/Server Operation Security_NoStealthMode No (Stealth Mode) --- 145,149 ---- Password_Error1 Incorrect password ! Security_Error1 The port must be a number between 1 and 65535 Security_Stealth Stealth Mode/Server Operation Security_NoStealthMode No (Stealth Mode) *************** *** 144,154 **** Security_Password Password Security_PasswordUpdate Updated password to %s ! Security_AUTHTitle Secure Password Authentication/AUTH ! Security_SecureServer Secure server ! Security_SecureServerUpdate Updated secure server to %s; this change will not take affect until you restart POPFile ! Security_SecurePort Secure port ! Security_SecurePortUpdate Updated port to %s; this change will not take affect until you restart POPFile Security_POP3 Accept POP3 connections from remote machines (requires POPFile restart) Security_UI Accept HTTP (User Interface) connections from remote machines (requires POPFile restart) Security_UpdateTitle Automatic Update Checking Security_Update Check daily for updates to POPFile --- 153,170 ---- Security_Password Password Security_PasswordUpdate Updated password to %s ! Security_AUTHTitle Remote Servers ! Security_SecureServer POP3 SPA/AUTH server ! Security_SecureServerUpdate Updated POP3 SPA/AUTH secure server to %s; this change will not take affect until you restart POPFile ! Security_SecurePort POP3 SPA/AUTH port ! Security_SecurePortUpdate Updated POP3 SPA/AUTH port to %s; this change will not take affect until you restart POPFile ! Security_SMTPServer SMTP chain server ! Security_SMTPServerUpdate Updated SMTP chain server to %s; this change will not take affect until you restart POPFile ! Security_SMTPPort SMTP chain port ! Security_SMTPPortUpdate Updated SMTP chain port to %s; this change will not take affect until you restart POPFile Security_POP3 Accept POP3 connections from remote machines (requires POPFile restart) + Security_SMTP Accept SMTP connections from remote machines (requires POPFile restart) + Security_NNTP Accept NNTP connections from remote machines (requires POPFile restart) Security_UI Accept HTTP (User Interface) connections from remote machines (requires POPFile restart) + Security_XMLRPC Accept XML-RPC connections from remote machines (requires POPFile restart) Security_UpdateTitle Automatic Update Checking Security_Update Check daily for updates to POPFile *************** *** 162,166 **** Magnet_Message1 The following magnets cause mail to always be classified into the specified bucket. Magnet_CreateNew Create New Magnet ! Magnet_Explanation Three types of magnets are available:</b> <ul><li><b>From address or name:</b> For example: jo...@co... to match a specific address, <br />company.com to match everyone who sends from company.com, <br />John Doe to match a specific person, John to match all Johns</li><li><b>To address or name:</b> Like a From: magnet but for the To: address in an email</li> <li><b>Subject words:</b> For example: hello to match all messages with hello in the subject</li></ul> Magnet_MagnetType Magnet type Magnet_Value Value --- 178,182 ---- Magnet_Message1 The following magnets cause mail to always be classified into the specified bucket. Magnet_CreateNew Create New Magnet ! Magnet_Explanation Three types of magnets are available:</b> <ul><li><b>From address or name:</b> For example: jo...@co... to match a specific address, <br />company.com to match everyone who sends from company.com, <br />John Doe to match a specific person, John to match all Johns</li><li><b>To address or name:</b> Like a From: magnet but for the To: address in a message</li> <li><b>Subject words:</b> For example: hello to match all messages with hello in the subject</li></ul> Magnet_MagnetType Magnet type Magnet_Value Value *************** *** 182,187 **** Bucket_NotEnoughData Not enough data Bucket_ClassificationAccuracy Classification Accuracy ! Bucket_EmailsClassified Emails classified ! Bucket_EmailsClassifiedUpper Emails Classified Bucket_ClassificationErrors Classification errors Bucket_Accuracy Accuracy --- 198,203 ---- Bucket_NotEnoughData Not enough data Bucket_ClassificationAccuracy Classification Accuracy ! Bucket_EmailsClassified Messages classified ! Bucket_EmailsClassifiedUpper Messages Classified Bucket_ClassificationErrors Classification errors Bucket_Accuracy Accuracy *************** *** 218,233 **** Header_MenuSummary This table is the navigation menu which allows access to each of the different pages of the control center. History_MainTableSummary This table shows the sender and subject of recently received messages and allows them to be reviewed and reclassified. Clicking on the subject line will show the full message text, along with information about why it was classified as it was. The 'Should be' column allows you to specify which bucket the message belongs in, or to undo that change. The 'Delete' column allows you to delete specific messages from the history if you don't need them anymore. ! History_OpenMessageSummary This table contains the full text of an email message, with the words that are used for classification highlighted according to the bucket that was most relevant for each. ! Bucket_MainTableSummary This table provides an overview of the classification buckets. Each row shows the bucket name, the word count total for that bucket, the actual number of individual words in each bucket, whether the email's subject line will be modified when it gets classified to that bucket, whether to quarantine the messages received in that bucket, and a table to pick the color used in displaying anything related to that bucket in the control center. ! Bucket_StatisticsTableSummary This table provides three sets of statistics on the overall performance of POPFile. The first is how accurate its classification is, the second is how many emails have been classified, and to which buckets, and the third is how many words are in each bucket, and what their relative percentages are. Bucket_MaintenanceTableSummary This table contains forms that allow you to create, delete or rename buckets, and to lookup a word in all of the buckets to see its relative probabilities. ! Bucket_AccuracyChartSummary This table graphically represents the accuracy of the email classification. ! Bucket_BarChartSummary This table graphically represents a percentage allocation for each of the different buckets. It is used for both number of emails classified, and total word counts. ! Bucket_LookupResultsSummary This table shows the probabilities associated with any given word of the corpus. For each bucket, it shows the frequency that that word occurs, the probability that it will occur in that bucket, and the overall effect on the score of the bucket if that word exists in an email. Bucket_WordListTableSummary This table provides a listing of all the words for a particular bucket, organized by common first letter for each row. ! Magnet_MainTableSummary This table shows the list of magnets that are used to automatically classify email according to fixed rules. Each row shows how the magnet is defined, what bucket it is intended for, and a button to delete the magnet. Configuration_MainTableSummary This table contains a number of forms to allow you to control the configuration of POPFile. ! Configuration_InsertionTableSummary This table contains buttons that determine whether or not certain modifications are made to the headers or subject line of the email before it is passed on to the email client. Security_MainTableSummary This table provides sets of controls that affect the security of the overall configuration of POPFile, whether it should automatically check for updates to the program, and whether statistics about POPFile's performance should be sent to the central datastore of the program's author for general information. ! Advanced_MainTableSummary This table provides a list of words that POPFile ignores when classifying email due to their relative frequency in email in general. They are organized per row according to the first letter of the words. --- 234,249 ---- Header_MenuSummary This table is the navigation menu which allows access to each of the different pages of the control center. History_MainTableSummary This table shows the sender and subject of recently received messages and allows them to be reviewed and reclassified. Clicking on the subject line will show the full message text, along with information about why it was classified as it was. The 'Should be' column allows you to specify which bucket the message belongs in, or to undo that change. The 'Delete' column allows you to delete specific messages from the history if you don't need them anymore. ! History_OpenMessageSummary This table contains the full text of a message message, with the words that are used for classification highlighted according to the bucket that was most relevant for each. ! Bucket_MainTableSummary This table provides an overview of the classification buckets. Each row shows the bucket name, the word count total for that bucket, the actual number of individual words in each bucket, whether the message's subject line will be modified when it gets classified to that bucket, whether to quarantine the messages received in that bucket, and a table to pick the color used in displaying anything related to that bucket in the control center. ! Bucket_StatisticsTableSummary This table provides three sets of statistics on the overall performance of POPFile. The first is how accurate its classification is, the second is how many messages have been classified, and to which buckets, and the third is how many words are in each bucket, and what their relative percentages are. Bucket_MaintenanceTableSummary This table contains forms that allow you to create, delete or rename buckets, and to lookup a word in all of the buckets to see its relative probabilities. ! Bucket_AccuracyChartSummary This table graphically represents the accuracy of the message classification. ! Bucket_BarChartSummary This table graphically represents a percentage allocation for each of the different buckets. It is used for both number of messages classified, and total word counts. ! Bucket_LookupResultsSummary This table shows the probabilities associated with any given word of the corpus. For each bucket, it shows the frequency that that word occurs, the probability that it will occur in that bucket, and the overall effect on the score of the bucket if that word exists in a message. Bucket_WordListTableSummary This table provides a listing of all the words for a particular bucket, organized by common first letter for each row. ! Magnet_MainTableSummary This table shows the list of magnets that are used to automatically classify message according to fixed rules. Each row shows how the magnet is defined, what bucket it is intended for, and a button to delete the magnet. Configuration_MainTableSummary This table contains a number of forms to allow you to control the configuration of POPFile. ! Configuration_InsertionTableSummary This table contains buttons that determine whether or not certain modifications are made to the headers or subject line of the message before it is passed on to the message client. Security_MainTableSummary This table provides sets of controls that affect the security of the overall configuration of POPFile, whether it should automatically check for updates to the program, and whether statistics about POPFile's performance should be sent to the central datastore of the program's author for general information. ! Advanced_MainTableSummary This table provides a list of words that POPFile ignores when classifying message due to their relative frequency in message in general. They are organized per row according to the first letter of the words. |
From: <jgr...@us...> - 2003-03-25 05:25:03
|
Update of /cvsroot/popfile/engine/tests In directory sc8-pr-cvs1:/tmp/cvs-serv20897/tests Modified Files: TestBayes.tst Log Message: Make the UI pluggable; make SMTP, NNTP and POP3 modules register and handle their own configuration UI; factor the HTTP code out of the UI and into own class; implement XML-RPC interface; make test suite allow selection of tests to run; change the way POPFile reports its startup; make the version string work Index: TestBayes.tst =================================================================== RCS file: /cvsroot/popfile/engine/tests/TestBayes.tst,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** TestBayes.tst 20 Feb 2003 21:36:42 -0000 1.4 --- TestBayes.tst 25 Mar 2003 05:24:58 -0000 1.5 *************** *** 13,29 **** my $c = new POPFile::Configuration; my $b = new Classifier::Bayes; ! $b->{configuration} = $c; $b->initialize(); ! $b->{configuration}->{configuration}{corpus} = 'tests/corpus'; $b->start(); # getting and setting values ! test_assert_equal( $b->get_value( 'personal', 'foo' ), log(1/103) ); ! $b->{total}{personal} = 100; ! $b->set_value( 'personal', 'foo', 100 ); ! test_assert_equal( $b->get_value( 'personal', 'foo' ), 0 ); ! $b->{total}{personal} = 1000; ! $b->set_value( 'personal', 'foo', 100 ); ! test_assert_equal( $b->get_value( 'personal', 'foo' ), -log(10) ); # glob the tests directory for files called TestMailParse\d+.msg which consist of messages --- 13,35 ---- my $c = new POPFile::Configuration; my $b = new Classifier::Bayes; ! $b->configuration( $c ); $b->initialize(); ! $b->config_( 'corpus', 'tests/corpus' ); $b->start(); # getting and setting values ! test_assert_equal( $b->get_value_( 'personal', 'foo' ), log(1/103) ); ! $b->{total__}{personal} = 100; ! $b->set_value_( 'personal', 'foo', 100 ); ! test_assert_equal( $b->get_value_( 'personal', 'foo' ), 0 ); ! $b->{total__}{personal} = 1000; ! $b->set_value_( 'personal', 'foo', 100 ); ! test_assert_equal( $b->get_value_( 'personal', 'foo' ), -log(10) ); ! ! # test the API functions ! my @buckets = $b->get_buckets(); ! test_assert_equal( $buckets[0], '' ); ! test_assert_equal( $buckets[1], '' ); ! test_assert_equal( $buckets[2], '' ); # glob the tests directory for files called TestMailParse\d+.msg which consist of messages *************** *** 49,59 **** # to be sent through classify_and_modify ! $b->{configuration}->{configuration}{msgdir} = 'tests/'; ! $b->{configuration}->{configuration}{ui_port} = '8080'; ! $b->{configuration}->{configuration}{xtc} = 1; ! $b->{configuration}->{configuration}{xpl} = 1; ! $b->{configuration}->{configuration}{localpop} = 1; ! $b->{configuration}->{configuration}{subject} = 1; ! $b->{parameters}{spam}{subject} = 1; my @modify_tests = sort glob 'tests/TestMailParse*.msg'; --- 55,65 ---- # to be sent through classify_and_modify ! $b->config_( 'msgdir', 'tests/' ); ! $b->module_config_( 'html', 'port', 8080 ); ! $b->config_( 'xtc', 1 ); ! $b->config_( 'xpl', 1 ); ! $b->module_config_( 'pop3', 'local', 1 ); ! $b->module_config_( 'subject', 1 ); ! $b->set_bucket_parameter( 'spam', 'subject', 1 ); my @modify_tests = sort glob 'tests/TestMailParse*.msg'; *************** *** 82,86 **** unlink( 'tests/popfile0=0.msg' ); unlink( 'tests/popfile0=0.cls' ); - # rename( 'tests/temp.out', $output_file ); unlink( 'tests/temp.out' ); } --- 88,91 ---- |
From: <ssc...@us...> - 2003-03-23 04:04:57
|
Update of /cvsroot/popfile/engine/Proxy In directory sc8-pr-cvs1:/tmp/cvs-serv8040 Modified Files: Proxy.pm Log Message: cleanup of echo_to_regexp_ Index: Proxy.pm =================================================================== RCS file: /cvsroot/popfile/engine/Proxy/Proxy.pm,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** Proxy.pm 21 Mar 2003 05:33:34 -0000 1.10 --- Proxy.pm 23 Mar 2003 04:04:53 -0000 1.11 *************** *** 340,349 **** $verbose = 0 if (!defined($verbose)); - # ASSERT: $regexp =~ /^\/.*\/$/ *shrug* - - #$regexp =~ s/^\/(.*)\/$/$1/; - while ( <$mail> ) { # Check for an abort last if ( $self->{alive_} == 0 ); --- 340,346 ---- $verbose = 0 if (!defined($verbose)); while ( <$mail> ) { # Check for an abort + last if ( $self->{alive_} == 0 ); *************** *** 352,362 **** } else { # This creates log output $self->tee_($client, $_); } ! ! my $done = ($_ =~ $regexp); ! ! print $regexp . "=~" . $_ . ($done?'1':'0') . "\n" ; ! last if ( $_ =~ $regexp ); } --- 349,356 ---- } else { # This creates log output + $self->tee_($client, $_); } ! last if ( $_ =~ $regexp ); } |
From: <jgr...@us...> - 2003-03-21 23:10:36
|
Update of /cvsroot/popfile/engine/Classifier In directory sc8-pr-cvs1:/tmp/cvs-serv13478/Classifier Modified Files: Bayes.pm Log Message: Major alteration to the top 20 words so that it shows the full matrix of words that were used to make a decision about an email; removed the old top 20 code and all the complex calculations it did and replaced with simple dump of the matrix for that message Index: Bayes.pm =================================================================== RCS file: /cvsroot/popfile/engine/Classifier/Bayes.pm,v retrieving revision 1.116 retrieving revision 1.117 diff -C2 -d -r1.116 -r1.117 *** Bayes.pm 6 Mar 2003 22:08:13 -0000 1.116 --- Bayes.pm 21 Mar 2003 23:10:32 -0000 1.117 *************** *** 533,539 **** my %score; - my %wordprob; - my %wtprob; - my %wbprob; for my $bucket (@buckets) { --- 533,536 ---- *************** *** 562,569 **** foreach my $word (keys %{$self->{parser__}->{words__}}) { my $wmax = -10000; - if ($self->{wordscores__}) { - $wtprob{$word} = 0; - $wbprob{$word} = {}; - } foreach my $bucket (@buckets) { --- 559,562 ---- *************** *** 577,584 **** $score{$bucket} += ( $probability * $self->{parser__}{words__}{$word} ); - if ($self->{wordscores__}) { - $wtprob{$word} += exp($probability); - $wbprob{$word}{$bucket} = exp($probability); - } } --- 570,573 ---- *************** *** 588,592 **** $correction += $wmax * $self->{parser__}{words__}{$word}; } - $wordprob{$word} = exp($wmax); } --- 577,580 ---- *************** *** 594,601 **** my @ranking = sort {$score{$b} <=> $score{$a}} keys %score; ! my @wordrank; ! if ($self->{wordscores__}) { ! @wordrank = sort {($wordprob{$b} / $wtprob{$b}) <=> ($wordprob{$a} / $wtprob{$a})} keys %wordprob; ! } my %raw_score; --- 582,586 ---- my @ranking = sort {$score{$b} <=> $score{$a}} keys %score; ! my %raw_score; *************** *** 619,622 **** --- 604,608 ---- my $prob = exp($score{$b})/$total; my $probstr; + if ($prob >= 0.1 || $prob == 0.0) { $probstr = sprintf("%12.6f", $prob); *************** *** 624,652 **** $probstr = sprintf("%17.6e", $prob); } $self->{scores__} .= "<tr>\n<td><font color=\"$self->{colors__}{$b}\"><b>$b</b></font></td>\n<td> </td>\n<td>$probstr</td>\n</tr>\n"; } $self->{scores__} .= "</table>"; if ($self->{wordscores__}) { $self->{scores__} .= "<table class=\"top20Words\">\n<tr><td colspan=\"4\"> </td></tr>\n"; ! $self->{scores__} .= "<tr>\n<th scope=\"col\">Word</th><th scope=\"col\">Prob</th>\n<th> </th>\n"; ! $self->{scores__} .= "<th scope=\"col\">\n<font color=\"$self->{colors__}{$ranking[0]}\">$ranking[0]</font>\n</th>\n</tr>\n"; ! my $wi = 0; ! foreach my $word (@wordrank) { ! if ( $wi < 20 && $wordprob{$word} / $wtprob{$word} >= 0.25 ) { ! my $wordstr = $word; ! my $long = $wordstr; ! if ( length($wordstr)>14 ) { ! $wordstr =~ /(.{12})/; ! $wordstr = "$1..."; } - my $wordcolor = get_color($self, $word); - my $wordprobstr = sprintf("%12.4f", $wordprob{$word} / $wtprob{$word}); - my $otherprobstr = sprintf("%12.4f", $wbprob{$word}{$ranking[0]} / $wtprob{$word}); - $self->{scores__} .= "<tr>\n<td><font color=\"$wordcolor\"><a title=\"$long\">$wordstr</a></font></td>\n"; - $self->{scores__} .= "<td><font color=\"$wordcolor\">$wordprobstr</font></td>\n<td> </td>\n"; - $self->{scores__} .= "<td><font color=\"$self->{colors__}{$ranking[0]}\">$otherprobstr</font></td>\n</tr>\n"; } ! $wi += 1; } --- 610,669 ---- $probstr = sprintf("%17.6e", $prob); } + $self->{scores__} .= "<tr>\n<td><font color=\"$self->{colors__}{$b}\"><b>$b</b></font></td>\n<td> </td>\n<td>$probstr</td>\n</tr>\n"; } + $self->{scores__} .= "</table>"; if ($self->{wordscores__}) { $self->{scores__} .= "<table class=\"top20Words\">\n<tr><td colspan=\"4\"> </td></tr>\n"; ! $self->{scores__} .= "<tr>\n<th scope=\"col\">Word</th><th> </th><th scope=\"col\">Count</th><th> </th>\n"; ! ! foreach my $bucket (@buckets) { ! my $bucketcolor = $self->get_bucket_color( $bucket ); ! $self->{scores__} .= "<th><font color=\"$bucketcolor\">$bucket</font></th><th> </th>"; ! } ! ! $self->{scores__} .= "</tr>"; ! ! my @ranked_words = sort {$self->get_value_( $ranking[0], $b ) <=> $self->get_value_( $ranking[0], $a )} keys %{$self->{parser__}->{words__}}; ! ! foreach my $word (@ranked_words) { ! my $known = 0; ! ! foreach my $bucket (@buckets) { ! if ( $self->get_value_( $bucket, $word ) != 0 ) { ! $known = 1; ! last; } } ! ! if ( $known == 1 ) { ! my $wordcolor = $self->get_color( $word ); ! my $count = $self->{parser__}->{words__}{$word}; ! ! $self->{scores__} .= "<tr>\n<td><font color=\"$wordcolor\">$word</font></td><td> </td><td>$count</td><td> </td>\n"; ! ! my $base_probability = $self->get_value_( $ranking[0], $word ); ! ! foreach my $bucket (@buckets) { ! my $probability = get_value_( $self, $bucket, $word ); ! my $color = 'black'; ! ! if ( $probability >= $base_probability ) { ! $color = $self->get_bucket_color( $bucket ); ! } ! ! if ( $probability != 0 ) { ! my $wordprobstr = sprintf("%12.4f", exp($probability) ); ! ! $self->{scores__} .= "<td><font color=\"$color\">$wordprobstr</font></td>\n<td> </td>\n"; ! } else { ! $self->{scores__} .= "<td> </td>\n<td> </td>\n"; ! } ! } ! } ! ! $self->{scores__} .= "</tr>"; } *************** *** 661,668 **** } - if ( $self->{wordscores__} ) { - $self->{scores__} .= "<p>(<b>$class</b>)</p>"; - } - return $class; } --- 678,681 ---- *************** *** 1042,1046 **** $self->{parser__}->{bayes__} = bless $self; my $result = $self->{parser__}->parse_stream($file); ! $self->{parser__}->{color__} = 0; return $result; --- 1055,1059 ---- $self->{parser__}->{bayes__} = bless $self; my $result = $self->{parser__}->parse_stream($file); ! $self->{parser__}->{color__} = 0; return $result; *************** *** 1065,1070 **** if ( open NEW, '>' . $self->config_( 'corpus' ) . "/$bucket/table" ) { ! print NEW "\n"; ! close NEW; } --- 1078,1083 ---- if ( open NEW, '>' . $self->config_( 'corpus' ) . "/$bucket/table" ) { ! print NEW "\n"; ! close NEW; } |
From: <jgr...@us...> - 2003-03-21 23:10:36
|
Update of /cvsroot/popfile/engine/UI In directory sc8-pr-cvs1:/tmp/cvs-serv13478/UI Modified Files: HTML.pm Log Message: Major alteration to the top 20 words so that it shows the full matrix of words that were used to make a decision about an email; removed the old top 20 code and all the complex calculations it did and replaced with simple dump of the matrix for that message Index: HTML.pm =================================================================== RCS file: /cvsroot/popfile/engine/UI/HTML.pm,v retrieving revision 1.117 retrieving revision 1.118 diff -C2 -d -r1.117 -r1.118 *** HTML.pm 20 Mar 2003 08:52:39 -0000 1.117 --- HTML.pm 21 Mar 2003 23:10:32 -0000 1.118 *************** *** 2844,2848 **** # Check to see if we want to view a message if ( ( defined($self->{form__}{view}) ) && ( $self->{form__}{view} eq $mail_file ) ) { ! $body .= "<tr>\n<td></td>\n<td colspan=\"3\" valign=\"top\">\n"; $body .= "<table class=\"openMessageTable\" cellpadding=\"10%\" cellspacing=\"0\" width=\"100%\" summary=\"$self->{language__}{History_OpenMessageSummary}\">\n"; --- 2844,2848 ---- # Check to see if we want to view a message if ( ( defined($self->{form__}{view}) ) && ( $self->{form__}{view} eq $mail_file ) ) { ! $body .= "<tr>\n<td></td>\n<td colspan=\"5\" valign=\"top\">\n"; $body .= "<table class=\"openMessageTable\" cellpadding=\"10%\" cellspacing=\"0\" width=\"100%\" summary=\"$self->{language__}{History_OpenMessageSummary}\">\n"; *************** *** 2899,2908 **** $body .= "<a class=\"messageLink\" href=\"/history?start_message=$start_message&session=$self->{session_key__}&sort=$self->{form__}{sort}&search=$self->{form__}{search}&filter=$self->{form__}{filter}\">\n"; $body .= "<span class=\"historyLabel\">$self->{language__}{Close}</span>\n</a>\n"; ! $body .= "</td>\n</tr>\n</table>\n</td>\n"; ! $body .= "<td class=\"top20\" valign=\"top\">\n"; $self->{classifier__}->classify_file($self->global_config_( 'msgdir' ) . "$self->{form__}{view}"); $body .= $self->{classifier__}->{scores__}; ! $body .= "</td>\n</tr>\n"; } --- 2899,2908 ---- $body .= "<a class=\"messageLink\" href=\"/history?start_message=$start_message&session=$self->{session_key__}&sort=$self->{form__}{sort}&search=$self->{form__}{search}&filter=$self->{form__}{filter}\">\n"; $body .= "<span class=\"historyLabel\">$self->{language__}{Close}</span>\n</a>\n"; ! $body .= "</td>\n</tr>\n</table>\n"; ! $body .= "<table><tr><td class=\"top20\" valign=\"top\">\n"; $self->{classifier__}->classify_file($self->global_config_( 'msgdir' ) . "$self->{form__}{view}"); $body .= $self->{classifier__}->{scores__}; ! $body .= "</tr></table></td>\n</tr>\n"; } |
From: <ssc...@us...> - 2003-03-21 05:33:38
|
Update of /cvsroot/popfile/engine/Proxy In directory sc8-pr-cvs1:/tmp/cvs-serv9422 Modified Files: Proxy.pm Log Message: added echo_to_regexp_ subroutine Index: Proxy.pm =================================================================== RCS file: /cvsroot/popfile/engine/Proxy/Proxy.pm,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** Proxy.pm 18 Mar 2003 15:28:45 -0000 1.9 --- Proxy.pm 21 Mar 2003 05:33:34 -0000 1.10 *************** *** 321,337 **** } # --------------------------------------------------------------------------------------------- # ! # echo_to_dot_ # # $mail The stream (created with IO::) to send the message to (the remote mail server) # $client The local mail client (created with IO::) that needs the response # ! # echo all information from the $mail server until a single line with a . is seen # # --------------------------------------------------------------------------------------------- ! sub echo_to_dot_ { ! my ( $self, $mail, $client ) = @_; while ( <$mail> ) { --- 321,346 ---- } + # --------------------------------------------------------------------------------------------- # ! # echo_to_regexp_ # # $mail The stream (created with IO::) to send the message to (the remote mail server) # $client The local mail client (created with IO::) that needs the response + # $regexp The pattern match to terminate echoing, compile using qr/pattern/ + # $verbose (OPTIONAL) log output if 1, defaults to 0 if unset # ! # echo all information from the $mail server until a single line matching $regexp is seen # # --------------------------------------------------------------------------------------------- ! sub echo_to_regexp_ { ! my ( $self, $mail, $client, $regexp, $verbose ) = @_; ! ! $verbose = 0 if (!defined($verbose)); ! ! # ASSERT: $regexp =~ /^\/.*\/$/ *shrug* ! ! #$regexp =~ s/^\/(.*)\/$/$1/; while ( <$mail> ) { *************** *** 339,352 **** last if ( $self->{alive_} == 0 ); ! print $client $_; ! #$self->tee_($client, $_); ! ! # The termination has to be a single line with exactly a dot on it and nothing ! # else other than line termination characters. This is vital so that we do ! # not mistake a line beginning with . as the end of the block ! last if ( /^\.(\r\n|\r|\n)$/ ); } } # --------------------------------------------------------------------------------------------- # --- 348,388 ---- last if ( $self->{alive_} == 0 ); ! if (!$verbose) { ! print $client $_; ! } else { ! # This creates log output ! $self->tee_($client, $_); ! } ! ! my $done = ($_ =~ $regexp); ! ! print $regexp . "=~" . $_ . ($done?'1':'0') . "\n" ; ! ! last if ( $_ =~ $regexp ); } } + + # --------------------------------------------------------------------------------------------- + # + # echo_to_dot_ + # + # $mail The stream (created with IO::) to send the message to (the remote mail server) + # $client The local mail client (created with IO::) that needs the response + # + # echo all information from the $mail server until a single line with a . is seen + # + # --------------------------------------------------------------------------------------------- + sub echo_to_dot_ + { + my ( $self, $mail, $client ) = @_; + + # The termination has to be a single line with exactly a dot on it and nothing + # else other than line termination characters. This is vital so that we do + # not mistake a line beginning with . as the end of the block + + $self->echo_to_regexp_( $mail, $client, qr/^\.(\r\n|\r|\n)$/); + } + # --------------------------------------------------------------------------------------------- # *************** *** 427,435 **** if ( $response ) { # Echo the response up to the mail client ! $self->tee_( $client, $response ); return $response; } } ! if (!null_resp) { # An error has occurred reading from the mail server --- 463,471 ---- if ( $response ) { # Echo the response up to the mail client ! $self->tee_( $client, $response ); return $response; } } ! if (!null_resp) { # An error has occurred reading from the mail server *************** *** 439,443 **** $self->tee_($client, ""); return ""; ! } } --- 475,479 ---- $self->tee_($client, ""); return ""; ! } } |
From: <ssc...@us...> - 2003-03-21 05:33:15
|
Update of /cvsroot/popfile/engine/Proxy In directory sc8-pr-cvs1:/tmp/cvs-serv9297 Modified Files: SMTP.pm Log Message: implemented ideas suggested in patch 706596 Index: SMTP.pm =================================================================== RCS file: /cvsroot/popfile/engine/Proxy/SMTP.pm,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** SMTP.pm 6 Mar 2003 23:10:20 -0000 1.7 --- SMTP.pm 21 Mar 2003 05:33:12 -0000 1.8 *************** *** 106,113 **** $self->log_( "Command: --$command--" ); ! if ( $command =~ /HELO/ ) { if ( $self->config_( 'chain_server' ) ) { if ( $mail = $self->verify_connected_( $mail, $client, $self->config_( 'chain_server' ), $self->config_( 'chain_port' ) ) ) { ! $self->echo_response_( $mail, $client, $command ); } else { last; --- 106,116 ---- $self->log_( "Command: --$command--" ); ! if ( $command =~ /HELO|EHLO/i ) { if ( $self->config_( 'chain_server' ) ) { if ( $mail = $self->verify_connected_( $mail, $client, $self->config_( 'chain_server' ), $self->config_( 'chain_port' ) ) ) { ! ! $self->smtp_echo_response_( $mail, $client, $command ); ! ! } else { last; *************** *** 125,133 **** ( $command =~ /RCPT TO:/i ) || ( $command =~ /VRFY/i ) || ! ( $command =~ /EXPN/i ) || ( $command =~ /NOOP/i ) || ( $command =~ /HELP/i ) || ( $command =~ /RSET/i ) ) { ! $self->echo_response_( $mail, $client, $command ); $self->flush_extra_( $mail, $client, 0 ); next; --- 128,136 ---- ( $command =~ /RCPT TO:/i ) || ( $command =~ /VRFY/i ) || ! ( $command =~ /EXPN/i ) || ( $command =~ /NOOP/i ) || ( $command =~ /HELP/i ) || ( $command =~ /RSET/i ) ) { ! $self->smtp_echo_response_( $mail, $client, $command ); $self->flush_extra_( $mail, $client, 0 ); next; *************** *** 137,141 **** # Get the message from the remote server, if there's an error then we're done, but if not then # we echo each line of the message until we hit the . at the end ! if ( $self->echo_response_( $mail, $client, $command ) ) { $count += 1; --- 140,144 ---- # Get the message from the remote server, if there's an error then we're done, but if not then # we echo each line of the message until we hit the . at the end ! if ( $self->smtp_echo_response_( $mail, $client, $command ) ) { $count += 1; *************** *** 157,161 **** if ( $command =~ /QUIT/i ) { if ( $mail ) { ! $self->echo_response_( $mail, $client, $command ); close $mail; } else { --- 160,164 ---- if ( $command =~ /QUIT/i ) { if ( $mail ) { ! $self->smtp_echo_response_( $mail, $client, $command ); close $mail; } else { *************** *** 167,171 **** # Don't know what this is so let's just pass it through and hope for the best if ( $mail && $mail->connected ) { ! $self->echo_response_( $mail, $client, $command ); $self->flush_extra_( $mail, $client, 0 ); next; --- 170,174 ---- # Don't know what this is so let's just pass it through and hope for the best if ( $mail && $mail->connected ) { ! $self->smtp_echo_response_( $mail, $client, $command ); $self->flush_extra_( $mail, $client, 0 ); next; *************** *** 179,182 **** --- 182,218 ---- close $client; } + + # --------------------------------------------------------------------------------------------- + # + # smtp_echo_response_ + # + # $mail The stream (created with IO::) to send the message to (the remote mail server) + # $client The local mail client (created with IO::) that needs the response + # $command The text of the command to send (we add an EOL) + # + # Send $command to $mail, receives the response and echoes it to the $client and the debug + # output. + # + # This subroutine returns responses from the server as defined in appendix E of + # RFC 821, allowing multi-line SMTP responses. + # + # Returns true if the initial response is a 2xx or 3xx series (as defined by {good_response_} + # + # --------------------------------------------------------------------------------------------- + + + + sub smtp_echo_response_ + { + my ($self, $mail, $client, $command) = @_; + my $response = $self->get_response_( $mail, $client, $command ); + + if ( $response =~ /^[23]\d\d-/ ) { + $self->echo_to_regexp_($mail, $client, qr/^\d\d\d /, 1); + } + return ( $response =~ /$self->{good_response_}/ ); + } + + 1; |
Update of /cvsroot/popfile/engine/tests In directory sc8-pr-cvs1:/tmp/cvs-serv11217 Added Files: Tag: v0/18/1 TestMailParse001.col TestMailParse002.col TestMailParse003.col TestMailParse004.col TestMailParse005.col TestMailParse006.col TestMailParse007.col TestMailParse008.col TestMailParse009.col TestMailParse010.col TestMailParse011.col TestMailParse012.col TestMailParse013.col TestMailParse014.col TestMailParse015.col TestMailParse016.col TestMailParse017.col TestMailParse018.col TestMailParse019.col TestMailParse020.col TestMailParse021.col TestMailParse022.col Log Message: re-commit of colorized tests, last try didn't work --- NEW FILE: TestMailParse001.col --- <tt>From: <b><font color="black">blank</font></b><br /> <br /> <b><font color="black">Testing</font></b> S P A C E D out <b><font color="black">words</font></b> <b><font color="black">spaced</font></b> out in a <b><font color="black">document</font></b>.<br /> .<br /> </tt> --- NEW FILE: TestMailParse002.col --- <tt>From: <b><font color="black">blank</font></b><br /> <br /> <b><font color="black">who</font></b> <b><font color="black">wants</font></b> to be a <b><font color="black">millionaire</font></b> milli<!---->onaire mi<!-- testing -->llionaire millionair<!-- -->e<br /> </tt> --- NEW FILE: TestMailParse003.col --- <tt>Subject: from: <b><font color="black">Leandro</font></b><br /> To: <b><font color="black">jI775QsT823y17g@<b><font color="black">aol.com</font></b></font></b><br /> Message-ID: <200...@8S...><br /> From: "<b><font color="black">serafina</font></b> <b><font color="black">venter</font></b>"<<b><font color="black">j239o114@<b><font color="black">earthlink.net</font></b></font></b>><br /> Date: Sun, 12 Jan 2003 19:49:36 -0400<br /> X-Priority: 3 (<b><font color="black">Normal</font></b>)<br /> Importance: <b><font color="black">Normal</font></b><br /> X-Accept-Language: en<br /> Errors-To: <<b><font color="black">j23...@ea...</font></b>><br /> MIME-Version: 1.0<br /> Content-Type: multipart/alternative;<br /> Content-Transfer-Encoding: 7bit<br /> Return-Path: j239o114@<b><font color="black">earthlink.net</font></b><br /> X-OriginalArrivalTime: 13 Jan 2003 00:49:31.0608 (<b><font color="black">UTC</font></b>)<br /> FILETIME=[A257A580:01C2BA9D]<br /> --=gs6mlah1knva3tk5nbs4422k3570q7m3k==<br /> Content-Transfer-Encoding: base64<br /> Content-Type: text/html; charset="<b><font color="black">US-ASCII</font></b>"<br /> PGh0bWw+DQo8YSBocmVmPSJodHRwOi8vJTc3JTc3dy5wJTYxJTczJTczNCU2NiU3MmUlNjUlMkVuZXQvcGIzLyIgVDhJPjxGT05UIFNJWkU9NT48Qj4mIzg3<br /> <br /> OyYjOTc7PCFLND50PCE0YTQ1PmMmIzEwNDs8IVBKMHV1PiAmIzY4OzwhT1UxMGRRPm88IWgzMj5nPCFOWDc4PnM8IUY0NzZ0PiAmIzExNTsmIzEwODs8IXkw<br /> <br /> eDY+dSYjMTE0OzwhV1ZRPnAmIzMyOzwhMW0+eTwhS1NrUD5vPCFvMzVBZT51JiMxMTA7JiMxMDM7PCE0N2ViVTM+ICYjMTAzOyYjMTA1OyYjMTE0OyYjMTA4<br /> <br /> OyYjMTE1OyYjMzI7PCF5MjU+cCYjMTE3OzwhOFljPnMmIzExNTsmIzEyMTs8ITVSaTQ+JzwhcEdTNj5zJiMzMjsmIzk3OzwhQWgxPnMmIzMyOyYjMTE2OyYj<br /> <br /> MTA0OzwhMXJKM1JIPmU8IW84V1h1PnkmIzMyOzwhMzU+czwhMFE3ND5jJiMxMTQ7PCFSZnA+ZTwhUGw+YTwhSzQ+bTwhNGE0NT4gJiMxMDI7PCFQSjB1dT5v<br /> <br /> JiMxMTQ7PCFPVTEwZFE+IDwhaDMyPm08IU5YNzg+bzwhRjQ3NnQ+ciYjMTAxOyYjMzM7PC9mb250PjwvYT48QlI+DQo8QlIgck0wc1JhUHE+PGEgaHJlZj0i<br /> <br /> aHR0cDovL3d3dyUyRSU3MCU2MSU3MyU3MyUzNGZyZWUlMkUlNkUlNjV0L3BiMy8iIDFySjNSSEJvOFcgdW5TVlQ3PjxGT05UIFNJWkU9ND48Qj48IXkweDY+<br /> <br /> QyYjMTA4OzwhV1ZRPmkmIzk5OzwhMW0+azwhS1NrUD4gPCFvMzVBZT5IJiMxMDE7JiMxMTQ7PCE0N2ViVTM+ZTwvZm9udD48L2E+PEJSPjxCUj48QlI+PEJS<br /> <br /> PjxCUj48QlI+PEJSPiYjMTM7JiMxMDsmIzY5OyYjMTA5OyYjOTc7JiMxMDU7PCF5MjU+bCYjMzI7PCE4WWM+QiYjOTc7JiMxMDA7PCE1Umk0Pj88QlIgUlIg<br /> <br /> Mk1PZHZjTT4NCm5vIG1vcmUgPGEgaHJlZj0iaHR0cDovL3JlbW92ZSUyRSU2RGUlNzMlNzNhJTY3JTY1bSU2NW4lNkYlNzcuJTZFZXQvIiBSZnBOUD5DbGlj<br /> <br /> ayBIZXJlPC9hPjxCUj4NCjxCUj48L2h0bWw+DQoNCmFQcTgyTU9kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjTUo=<br /> <b>Found in encoded data:</b> <font color="black">www.pass4free.net</font> <font color="black">pass4free.net</font> <font color="black">Watch</font> <font color="black">Dogs</font> <font color="black">slurp</font> <font color="black">young</font> <font color="black">girls</font> <font color="black">pussy's</font> <font color="black">they</font> <font color="black">scream</font> <font color="black">more</font> <font color="black">www.pass4free.net</font> <font color="black">pass4free.net</font> <font color="black">Click</font> <font color="black">Here</font> <font color="black">Email</font> <font color="black">Bad</font> <font color="black">more</font> <font color="black">remove.messagemenow.net</font> <font color="black">messagemenow.net</font> <font color="black">Click</font> <font color="black">Here</font> <font color="black">aPq</font> <font color="black">MOd</font> <font color="black">cMJ</font> </tt> --- NEW FILE: TestMailParse004.col --- <tt>Return-Path: <<b><font color="black">hot...@ya...</font></b>><br /> From: <b><font color="black">hottest_girls_online6653@<b><font color="black">yahoo.com</font></b></font></b><br /> Message-ID: <000048874f7b$00000e95$000...@mx...><br /> To: <<b><font color="black">Undisclosed.Recipients@<b><font color="black">vanyel.<b><font color="black">herald.<b><font color="black">co.uk</font></b></font></b></font></b></font></b>><br /> Subject: <br /> Date: Sat, 18 Jan 2003 19:50:57 01900<br /> MIME-Version: 1.0<br /> Content-Type: multipart/mixed;<br /> X-UIDL: B<E!!^8S!!0'="!J;6"!<br /> <br /> ------=_NextPart_000_60BF_00005753.000048CC<br /> Content-Type: text/html;<br /> charset="iso-8859-1"<br /> Content-Transfer-Encoding: base64<br /> <br /> PEhUTUw+PEJPRFkgQkdDT0xPUj0iIzAwMDAwMCI+PC9QPjxQIEFMSUdOPUNFTlRFUj48Rk9OVCAgQ09MT1I9IiNmZjAwMDAiIEJBQ0s9IiMwMDAwMDAiIHN0<br /> eWxlPSJCQUNLR1JPVU5ELUNPTE9SOiAjMDAwMDAwIiBTSVpFPTYgUFRTSVpFPTI0PlRoZSBob3R0ZXN0IEdpcmxzIE9ubGluZSE8QlI+DQpTdG9wIHdhc3Rp<br /> bmcgeW91ciB0aW1lIHdpdGggNSBzZWM8QlI+DQp2aWRlbyBjbGlwcyEgQ29tZSB0byBvdXIgc2l0ZSBmb3I8QlI+DQpGcmVlIEZ1bGwgTGVuZ3RoIE1vdmll<br /> cyE8QlI+DQo8QSBIUkVGPSJodHRwOi8vd2NhbWF0ZXVycy5jb20vbC9ibCI+V2h5IHdhaXQsIHNlZSBmb3IgRnJlZTwvQT48L0ZPTlQ+PEZPTlQgIENPTE9S<br /> PSIjZmYwMDAwIiBCQUNLPSIjMDAwMDAwIiBzdHlsZT0iQkFDS0dST1VORC1DT0xPUjogIzAwMDAwMCIgU0laRT02IFBUU0laRT0yNCBGQU1JTFk9IlNBTlNT<br /> RVJJRiIgRkFDRT0iQXJpYWwiIExBTkc9IjAiPjxCUj4NCjwvUD48UCBBTElHTj1MRUZUPjwvRk9OVD48Rk9OVCAgQ09MT1I9IiNmZjAwMDAiIEJBQ0s9IiMw<br /> MDAwMDAiIHN0eWxlPSJCQUNLR1JPVU5ELUNPTE9SOiAjMDAwMDAwIiBTSVpFPTMgUFRTSVpFPTExIEZBTUlMWT0iU0FOU1NFUklGIiBGQUNFPSJBcmlhbCIg<br /> TEFORz0iMCI+PEJSPg0KPC9GT05UPjxGT05UICBDT0xPUj0iIzAwMDBmZiIgQkFDSz0iIzAwMDAwMCIgc3R5bGU9IkJBQ0tHUk9VTkQtQ09MT1I6ICMwMDAw<br /> MDAiIFNJWkU9NiBQVFNJWkU9MjQgR!<br /> kFNSUxZPSJTQU5TU0VSSUYiIEZBQ0U9IkFyaWFsIiBMQU5HPSIwIj48QSBIUkVGPSJodHRwOi8vd2NhbWF0ZXVycy5jb20vbC9yIj5ObyBtb3JlIG1haWwga<br /> GVyZTwvQT48L0ZPTlQ+PC9IVE1MPg0K<br /> <br /> ------=_NextPart_000_60BF_00005753.000048CC--<br /> <b>Found in encoded data:</b> <font color="black">#000000</font> <font color="black">#ff0000</font> <font color="black">#000000</font> <font color="black">hottest</font> <font color="black">Girls</font> <font color="black">Online</font> <font color="black">Stop</font> <font color="black">wasting</font> <font color="black">time</font> <font color="black">sec</font> <font color="black">video</font> <font color="black">clips</font> <font color="black">Come</font> <font color="black">site</font> <font color="black">Free</font> <font color="black">Full</font> <font color="black">Length</font> <font color="black">Movies</font> <font color="black">wcamateurs.com</font> <font color="black">Why</font> <font color="black">wait</font> <font color="black">see</font> <font color="black">Free</font> <font color="black">#ff0000</font> <font color="black">#000000</font> <font color="black">#ff0000</font> <font color="black">#000000</font> <font color="black">#0000ff</font> <font color="black">#000000</font> <font color="black">wcamateurs.com</font> <font color="black">more</font> <font color="black">here</font> </tt> --- NEW FILE: TestMailParse005.col --- <tt>Return-Path: <<b><font color="black">anonymous@ns.<b><font color="black">englishmaster.<b><font color="black">co.kr</font></b></font></b></font></b>><br /> Date: 19 Jan 2003 15:13:43 -0000<br /> Message-ID: <200...@ns...><br /> From: <b><font color="black">XoSeXyGoDdEsSm@<b><font color="black">hotmail.com</font></b></font></b> (<b><font color="black">XoSeXyGoDdEsSm@<b><font color="black">hotmail.com</font></b></font></b>)<br /> Subject: Re: <b><font color="black">screename</font></b> <b><font color="black">change</font></b> <b><font color="black">again</font></b> <b><font color="black">lol</font></b><br /> X-UIDL: ll'"!$DC!!7ld"!85K!!<br /> <br /> <b><font color="black">Below</font></b> is the <b><font color="black">result</font></b> of your <b><font color="black">feedback</font></b> form. It was <b><font color="black">submitted</font></b> by<br /> <b><font color="black">XoS...@ho...</font></b> (XoS...@ho...) on <b><font color="black">Monday</font></b>, <b><font color="black">January</font></b> 20, 2003 at 00:13:42<br /> ---------------------------------------------------------------------------<br /> <br /> ze: <br /> <br /> <b><font color="black">Hey</font></b>!! <b><font color="black">What's</font></b> Up? <b><font color="black">I'm</font></b> *Jenny* 20/F/<b><font color="black">San</font></b> <b><font color="black">Diego</font></b>/<b><font color="black">Webcam</font></b> & <b><font color="black">Pics</font></b>. <b><font color="black">I'm</font></b> *LIVE* on my *FREE* <b><font color="black">Webcam</font></b> <b><font color="black">mostly</font></b> 24/7 so if you <b><font color="black">wanna</font></b> <br /> <b><font color="black">come</font></b> in and <b><font color="black">chat</font></b> or <b><font color="black">see</font></b> me go to my <b><font color="black">Personal</font></b> <b><font color="black">Homepage</font></b> at http://<b><font color="black">www.<b><font color="black">freelivecamgirls.net</font></b></font></b> and <b><font color="black">i'll</font></b> <b><font color="black">talk</font></b> to you in a <b><font color="black">bit</font></b> <br /> <b><font color="black">hun</font></b>! If you <b><font color="black">join</font></b> and the <b><font color="black">webchat</font></b> is <b><font color="black">already</font></b> <b><font color="black">full</font></b> im <b><font color="black">sorry</font></b>, <b><font color="black">just</font></b> <b><font color="black">wait</font></b> <b><font color="black">like</font></b> 5 <b><font color="black">minutes</font></b> and <b><font color="black">then</font></b> <b><font color="black">you'll</font></b> be <b><font color="black">able</font></b> to <b><font color="black">see</font></b> me <br /> <b><font color="black">LIVE</font></b>!! *Remember* this is my <b><font color="black">Personal</font></b> <b><font color="black">Homepage</font></b> so of <b><font color="black">course</font></b> its *FREE* =)<br /> <333 *Jenny* <333<br /> <br /> PS.Remember my <b><font color="black">Personal</font></b> <b><font color="black">Homepage</font></b> is http://<b><font color="black">www.<b><font color="black">freelivecamgirls.net</font></b></font></b> and <b><font color="black">hopefully</font></b> I can <b><font color="black">chat</font></b> with you <b><font color="black">soon</font></b>!! oh <b><font color="black">yah</font></b>!! If <br /> you <b><font color="black">don't</font></b> have a <b><font color="black">webcam</font></b> of your <b><font color="black">own</font></b> its ok!! You can <b><font color="black">still</font></b> <b><font color="black">watch</font></b> and <b><font color="black">chat</font></b> with me <b><font color="black">then</font></b>!! ok!! <b><font color="black">ByE</font></b>!!<br /> <333 *Jenny* <333<br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> 3e<br /> <br /> ---------------------------------------------------------------------------<br /> </tt> --- NEW FILE: TestMailParse006.col --- <tt>From: <b><font color="black">blank</font></b><br /> <br /> <b><font color="black">We're</font></b> so <b><font color="black">sure</font></b> <b><font color="black">about</font></b> the <b><font color="black">quality</font></b> and <b><font color="black">effectiveness</font></b> of our p.<b><font color="black">roducts</font></b>, we<br /> <b><font color="black">offer</font></b> a <b><font color="black">full</font></b> 90 <b><font color="black">day</font></b> m.oney b.ack g.<b><font color="black">uarantee</font></b>. If any <b><font color="black">customer</font></b> is not<br /> <b><font color="black">satisfied</font></b> with our <b><font color="black">products</font></b>, for any <b><font color="black">reason</font></b> <b><font color="black">whatsoever</font></b>, <b><font color="black">simply</font></b> return the<br /> u.<b><font color="black">nused</font></b> p.ortion <b><font color="black">within</font></b> 90 <b><font color="black">days</font></b> for a 100% r.<b><font color="black">efund</font></b>. NO <b><font color="black">QUESTIONS</font></b> <b><font color="black">ASKED</font></b>. <br /> <br /> Our <b><font color="black">goal</font></b> is to <b><font color="black">educate</font></b> you and <b><font color="black">make</font></b> you <b><font color="black">aware</font></b> of our <b><font color="black">new</font></b> and <b><font color="black">absolutely</font></b><br /> <b><font color="black">miraculous</font></b> <b><font color="black">Internationally</font></b> <b><font color="black">Patented</font></b> <b><font color="black">Nobel</font></b> <b><font color="black">Prize</font></b> <b><font color="black">Validated</font></b> <b><font color="black">Biotechnology</font></b>.<br /> <br /> C.<b><font color="black">lick</font></b> b.elow f.or m.ore i.<b><font color="black">nformation</font></b>, it's f.r.e.e.<br /> </tt> --- NEW FILE: TestMailParse007.col --- <tt>Return-Path: <<b><font color="black">mov...@ea...</font></b>><br /> Received: from <b><font color="black">mail126.<b><font color="black">ninodw.com</font></b></font></b> ([<b><font color="black">204.117.162.126</font></b>])<br /> by priv-edtnes62.telusplanet.net (InterMail vM.5.01.05.17 201-253-122-126-117-20021021) with SMTP<br /> id <200...@ma...> for <jo...@te...>; Sat, 11 Jan <br /> 2003 06:04:06 -0700<br /> To: <b><font color="black">jopat@<b><font color="black">telusplanet.net</font></b></font></b><br /> Date: Sat, 11 Jan 2003 07:05:44 -0500<br /> Message-ID: <104...@ma...><br /> X-Mailer: <b><font color="black">Gnus</font></b>/5.090001 (<b><font color="black">Oort</font></b> <b><font color="black">Gnus</font></b> v0.01) <b><font color="black">XEmacs</font></b>/21.2 (<b><font color="black">Terspichore</font></b>)<br /> From: <b><font color="black">movietqmugapo@<b><font color="black">easynet.be</font></b></font></b><br /> Reply-To: <<b><font color="black">movienfsjorbt@<b><font color="black">easynet.be</font></b></font></b>><br /> Subject: <b><font color="black">Think</font></b> <b><font color="black">you've</font></b> <b><font color="black">seen</font></b> <b><font color="black">porn</font></b>? <b><font color="black">How</font></b> <b><font color="black">about</font></b> a <b><font color="black">dog</font></b> <b><font color="black">giving</font></b> 5+ <b><font color="black">girls</font></b> <b><font color="black">oral</font></b> <b><font color="black">sex</font></b> <b><font color="black">till</font></b> <b><font color="black">they</font></b> <b><font color="black">cum</font></b>?<br /> <br /> So you <b><font color="black">think</font></b> <b><font color="black">you've</font></b> <b><font color="black">seen</font></b> <b><font color="black">some</font></b> <b><font color="black">crazy</font></b> <b><font color="black">porn</font></b>? <br /> <b><font color="black">Think</font></b> <b><font color="black">you've</font></b> <b><font color="black">seen</font></b> all the <b><font color="black">crazy</font></b> <b><font color="black">stuff</font></b> out <b><font color="black">there</font></b>? <br /> YOU <b><font color="black">HAVEN'T</font></b> <b><font color="black">SEEN</font></b> <b><font color="black">SHIT</font></b>!!! I <b><font color="black">saw</font></b> the <b><font color="black">most</font></b> un <b><font color="black">fuckin</font></b> <br /> <b><font color="black">believable</font></b> <b><font color="black">video</font></b> <b><font color="black">clip</font></b> <b><font color="black">thats</font></b> <b><font color="black">ever</font></b> been on our <b><font color="black">sick</font></b> <br /> and <b><font color="black">twisted</font></b> <b><font color="black">internet</font></b>! <b><font color="black">Know</font></b> this <b><font color="black">I've</font></b> been <b><font color="black">surfing</font></b> <br /> <b><font color="black">porn</font></b> and the <b><font color="black">internet</font></b> <b><font color="black">since</font></b> it <b><font color="black">began</font></b>! I have <b><font color="black">seen</font></b> <br /> it all..and this <b><font color="black">shocked</font></b> the <b><font color="black">shit</font></b> out of me <b><font color="black">even</font></b>!!! <br /> <b><font color="black">READ</font></b> <b><font color="black">BELOW</font></b> <b><font color="black">ABOUT</font></b> THIS <b><font color="black">CLIP</font></b>!<br /> THE <b><font color="black">FOOTAGE</font></b> OF <b><font color="black">HARVEY</font></b> THE <b><font color="black">PUSSY</font></b> <b><font color="black">EATING</font></b> <b><font color="black">WONDER</font></b> <b><font color="black">DOG</font></b>!<br /> It <b><font color="black">takes</font></b> <b><font color="black">place</font></b> on a <b><font color="black">farm</font></b> <b><font color="black">somewhere</font></b> <b><font color="black">within</font></b> the u.s. <br /> I would <b><font color="black">say</font></b> the <b><font color="black">clip</font></b> is <b><font color="black">just</font></b> <b><font color="black">shy</font></b> of 9 <b><font color="black">minutes</font></b> <b><font color="black">long</font></b> <br /> and <b><font color="black">seems</font></b> to be <b><font color="black">shot</font></b> by a <b><font color="black">home</font></b> <b><font color="black">cam</font></b> <b><font color="black">recorder</font></b>. In <br /> this <b><font color="black">nine</font></b> <b><font color="black">minutes</font></b> you <b><font color="black">see</font></b> a <b><font color="black">group</font></b> of 5+ <b><font color="black">girls</font></b> in <br /> a <b><font color="black">barn</font></b> <b><font color="black">looking</font></b> <b><font color="black">building</font></b>..at <b><font color="black">first</font></b> <b><font color="black">they</font></b> are having <br /> <b><font color="black">light</font></b> <b><font color="black">sex</font></b> with <b><font color="black">each</font></b> <b><font color="black">other</font></b>..this is <b><font color="black">nothing</font></b>..<b><font color="black">then</font></b> <br /> <b><font color="black">jackpot</font></b>. <b><font color="black">Another</font></b> <b><font color="black">girl</font></b> <b><font color="black">comes</font></b> in with a <b><font color="black">dog</font></b> that we <br /> <b><font color="black">now</font></b> <b><font color="black">know</font></b> is <b><font color="black">named</font></b> <b><font color="black">harvey</font></b>. She <b><font color="black">brings</font></b> the <b><font color="black">dog</font></b> in <br /> and <b><font color="black">leads</font></b> him to <b><font color="black">one</font></b> of her <b><font color="black">friends</font></b> <b><font color="black">who</font></b> is <b><font color="black">already</font></b> <br /> <b><font color="black">naked</font></b> and <b><font color="black">spreading</font></b> her <b><font color="black">legs</font></b>. The <b><font color="black">dog</font></b> goes <b><font color="black">right</font></b> <br /> to <b><font color="black">work</font></b>..<b><font color="black">eats</font></b> her <b><font color="black">pussy</font></b> <b><font color="black">like</font></b> <b><font color="black">he's</font></b> done it a <b><font color="black">hundred</font></b> <br /> <b><font color="black">times</font></b> <b><font color="black">before</font></b>..and <b><font color="black">folks</font></b> he has. <br /> http://<b><font color="black">www.<b><font color="black">nfogroup.net</font></b></font></b>/<b><font color="black">ral</font></b>/<br /> She <b><font color="black">takes</font></b> him to her <b><font color="black">next</font></b> <b><font color="black">friend</font></b> and the <b><font color="black">next</font></b> and <br /> the <b><font color="black">friend</font></b> <b><font color="black">after</font></b> that. By this <b><font color="black">point</font></b> we <b><font color="black">got</font></b> <b><font color="black">why</font></b> <br /> this <b><font color="black">clip</font></b> of was being <b><font color="black">taken</font></b>..<b><font color="black">these</font></b> <b><font color="black">farm</font></b> <b><font color="black">girl</font></b> <b><font color="black">sluts</font></b> <br /> have been doing this <b><font color="black">regularly</font></b>. <b><font color="black">They</font></b> <b><font color="black">get</font></b> <b><font color="black">together</font></b> <br /> and this <b><font color="black">dog</font></b>, <b><font color="black">harvey</font></b>, <b><font color="black">gives</font></b> <b><font color="black">them</font></b> all head..<b><font color="black">i'm</font></b> <br /> <b><font color="black">talking</font></b> <b><font color="black">like</font></b> a <b><font color="black">pro</font></b> <b><font color="black">here</font></b>..if you or I could <b><font color="black">satisfy</font></b> <br /> <b><font color="black">half</font></b> the <b><font color="black">women</font></b> this <b><font color="black">dog</font></b> can we would have it <b><font color="black">made</font></b>. <br /> This <b><font color="black">dog</font></b> is <b><font color="black">amazing</font></b>..<b><font color="black">hes</font></b> <b><font color="black">just</font></b> <b><font color="black">pussy</font></b> <b><font color="black">eating</font></b> <b><font color="black">machine</font></b>..<br /> and <b><font color="black">these</font></b> <b><font color="black">slutty</font></b> <b><font color="black">farm</font></b> <b><font color="black">girls</font></b> <b><font color="black">love</font></b> it to <b><font color="black">death</font></b>. <b><font color="black">I've</font></b> <br /> <b><font color="black">seen</font></b> <b><font color="black">animal</font></b> <b><font color="black">sites</font></b> and so on but <b><font color="black">i've</font></b> <b><font color="black">never</font></b> <b><font color="black">seen</font></b> <b><font color="black">actual</font></b> <br /> <b><font color="black">amature</font></b> <b><font color="black">footage</font></b> <b><font color="black">like</font></b> this in my <b><font color="black">life</font></b>. <br /> <b><font color="black">HOW</font></b> AND <b><font color="black">WHY</font></b> THE <b><font color="black">FOOTAGE</font></b> WAS <b><font color="black">FILMED</font></b>?<br /> It was the <b><font color="black">little</font></b> <b><font color="black">brother</font></b> of <b><font color="black">one</font></b> of the <b><font color="black">girls</font></b>..<b><font color="black">whichever</font></b> <br /> <b><font color="black">girl</font></b> <b><font color="black">actually</font></b> <b><font color="black">lived</font></b> at this <b><font color="black">place</font></b>. This <b><font color="black">little</font></b> <b><font color="black">brother</font></b> <br /> <b><font color="black">sneaks</font></b> <b><font color="black">into</font></b> the <b><font color="black">barn</font></b> and <b><font color="black">films</font></b> his <b><font color="black">slutty</font></b> <b><font color="black">sister</font></b> and <br /> all her <b><font color="black">friends</font></b> doing this ..<b><font color="black">then</font></b> <b><font color="black">puts</font></b> in on the <b><font color="black">internet</font></b>!!!! <br /> <b><font color="black">How</font></b> <b><font color="black">hilarious</font></b> is that..I <b><font color="black">can't</font></b> <b><font color="black">imagine</font></b> <b><font color="black">how</font></b> <b><font color="black">those</font></b> <b><font color="black">girls</font></b> <b><font color="black">feel</font></b> <br /> <b><font color="black">now</font></b>..<b><font color="black">there</font></b> will be <b><font color="black">definite</font></b> <b><font color="black">lawsuits</font></b> <b><font color="black">over</font></b> this <b><font color="black">one</font></b>. <b><font color="black">Maybe</font></b> <br /> he <b><font color="black">didn't</font></b> <b><font color="black">like</font></b> <b><font color="black">what</font></b> <b><font color="black">they</font></b> were doing to his <b><font color="black">dog</font></b> or <b><font color="black">maybe</font></b> <br /> he <b><font color="black">just</font></b> <b><font color="black">hated</font></b> his <b><font color="black">sister</font></b> <b><font color="black">like</font></b> all <b><font color="black">siblings</font></b> but <b><font color="black">either</font></b> <br /> <b><font color="black">way</font></b> the <b><font color="black">little</font></b> <b><font color="black">bastard</font></b> <b><font color="black">filmed</font></b> it <b><font color="black">then</font></b> <b><font color="black">put</font></b> it on the net! <br /> http://<b><font color="black">www.<b><font color="black">nfogroup.net</font></b></font></b>/<b><font color="black">ral</font></b>/<br /> <b><font color="black">HERE'S</font></b> THE <b><font color="black">GOOD</font></b> <b><font color="black">PART</font></b><br /> The <b><font color="black">guys</font></b> that <b><font color="black">now</font></b> have this <b><font color="black">footage</font></b> <b><font color="black">aren't</font></b> <b><font color="black">normal</font></b> <b><font color="black">porn</font></b> <b><font color="black">site</font></b> <b><font color="black">guys</font></b>..<br /> <b><font color="black">they</font></b> are <b><font color="black">just</font></b> <b><font color="black">guys</font></b> that <b><font color="black">get</font></b> off on <b><font color="black">posting</font></b> <b><font color="black">extreme</font></b> <b><font color="black">shit</font></b> to the <br /> <b><font color="black">public</font></b>. That <b><font color="black">means</font></b> <b><font color="black">they</font></b> <b><font color="black">don't</font></b> <b><font color="black">want</font></b> any <b><font color="black">money</font></b> from us <b><font color="black">surfers</font></b> <br /> to <b><font color="black">watch</font></b> the <b><font color="black">show</font></b>. <b><font color="black">What</font></b> <b><font color="black">they</font></b> do <b><font color="black">instead</font></b> is <b><font color="black">make</font></b> you <b><font color="black">play</font></b> this <br /> <b><font color="black">little</font></b> <b><font color="black">game</font></b> that <b><font color="black">asks</font></b> <b><font color="black">how</font></b> <b><font color="black">many</font></b> <b><font color="black">girls</font></b> did <b><font color="black">harvey</font></b> <b><font color="black">give</font></b> an <br /> <b><font color="black">orgasm</font></b> to in <b><font color="black">one</font></b> <b><font color="black">session</font></b> and you have to <b><font color="black">pick</font></b> <b><font color="black">one</font></b> of <b><font color="black">three</font></b> <br /> <b><font color="black">answers</font></b>. IF you <b><font color="black">win</font></b> <b><font color="black">you're</font></b> in and <b><font color="black">get</font></b> to <b><font color="black">watch</font></b>..if you <br /> <b><font color="black">lose</font></b> <b><font color="black">you're</font></b> out. The <b><font color="black">reason</font></b> <b><font color="black">they</font></b> do this is I <b><font color="black">guess</font></b> if we <br /> <b><font color="black">play</font></b> the <b><font color="black">game</font></b> we <b><font color="black">willingly</font></b> went and <b><font color="black">tried</font></b> to <b><font color="black">watch</font></b> it..we <br /> are not <b><font color="black">some</font></b> <b><font color="black">government</font></b> <b><font color="black">agent</font></b> <b><font color="black">who</font></b> is <b><font color="black">trying</font></b> to <b><font color="black">get</font></b> <b><font color="black">them</font></b> in <br /> <b><font color="black">trouble</font></b>. I <b><font color="black">think</font></b> <b><font color="black">because</font></b> of <b><font color="black">nature</font></b> of <b><font color="black">they</font></b> <b><font color="black">content</font></b> <b><font color="black">they</font></b> <b><font color="black">just</font></b> <br /> <b><font color="black">wanna</font></b> <b><font color="black">make</font></b> <b><font color="black">sure</font></b> you are <b><font color="black">into</font></b> this <b><font color="black">stuff</font></b>..but <b><font color="black">hell</font></b> if <b><font color="black">you're</font></b> <br /> <b><font color="black">like</font></b> me and <b><font color="black">don't</font></b> <b><font color="black">know</font></b> <b><font color="black">dick</font></b> <b><font color="black">about</font></b> this <b><font color="black">stuff</font></b> <b><font color="black">then</font></b> <b><font color="black">just</font></b> <b><font color="black">guess</font></b>..<br /> <b><font color="black">thats</font></b> <b><font color="black">what</font></b> I did and it <b><font color="black">resulted</font></b> in the <b><font color="black">most</font></b> <b><font color="black">shocking</font></b> <b><font color="black">movie</font></b> <br /> <b><font color="black">clip</font></b> of <b><font color="black">i've</font></b> <b><font color="black">seen</font></b> to date!<br /> MY <b><font color="black">STRONGEST</font></b> <b><font color="black">RECOMMENDATION</font></b><br /> If <b><font color="black">you're</font></b> <b><font color="black">like</font></b> me and <b><font color="black">like</font></b> <b><font color="black">seeing</font></b> this <b><font color="black">kind</font></b> if <b><font color="black">bizarre</font></b> <b><font color="black">stuff</font></b>..<br /> <b><font color="black">get</font></b> in <b><font color="black">there</font></b> and <b><font color="black">see</font></b> it <b><font color="black">now</font></b> <b><font color="black">while</font></b> its <b><font color="black">still</font></b> up. <b><font color="black">Before</font></b> <b><font color="black">somebody</font></b><br /> <b><font color="black">gets</font></b> it <b><font color="black">taken</font></b> <b><font color="black">offline</font></b>...but <b><font color="black">even</font></b> <b><font color="black">more</font></b> <b><font color="black">important</font></b> that that, <br /> DO NOT <b><font color="black">FUCKING</font></b> <b><font color="black">FORGET</font></b> TO <b><font color="black">SAVE</font></b> IT TO <b><font color="black">DISK</font></b>!<b><font color="black">YOU'RE</font></b> <b><font color="black">FRIENDS</font></b> WILL NOT <br /> <b><font color="black">BELIEVE</font></b> YOU <b><font color="black">WITHOUT</font></b> <b><font color="black">PROOF</font></b>..<b><font color="black">TRUST</font></b> ME ON THIS. <b><font color="black">SAVE</font></b> IT SO THAT <br /> <b><font color="black">WHEN</font></b> YOU <b><font color="black">TELL</font></b> <b><font color="black">THEM</font></b> YOU CAN ALSO <b><font color="black">SHOW</font></b> <b><font color="black">THEM</font></b>.<br /> http://<b><font color="black">www.<b><font color="black">nfogroup.net</font></b></font></b>/<b><font color="black">ral</font></b>/<br /> <b><font color="black">CLICK</font></b> <b><font color="black">HERE</font></b> TO <b><font color="black">WATCH</font></b> <b><font color="black">HARVEY</font></b> <b><font color="black">GIVE</font></b> HEAD TO <b><font color="black">GROUP</font></b> OF 18 <b><font color="black">year</font></b> <b><font color="black">old</font></b> <b><font color="black">FARM</font></b> <b><font color="black">SLUTS</font></b>!!!!}<br /> wbcng^gryhfcynarg(<b><font color="black">arg</font></b><br /> </tt> --- NEW FILE: TestMailParse008.col --- <tt>Return-Path: <<b><font color="black">sy...@ya...</font></b>><br /> Received: from N1N ([<b><font color="black">218.0.119.123</font></b>]) by <b><font color="black">priv-edtnes27.<b><font color="black">telusplanet.net</font></b></font></b><br /> (InterMail vM.5.01.05.17 201-253-122-126-117-20021021) with ESMTP<br /> id <20030112013444.RTJR4607.priv-edtnes27.telusplanet.net@N1N><br /> for <jo...@te...>; Sat, 11 Jan 2003 18:34:44 -0700<br /> From: "<b><font color="black">Alice</font></b>" <<b><font color="black">syjet@<b><font color="black">yahu.com</font></b></font></b>><br /> Subject: <b><font color="black">Hello</font></b>,<b><font color="black">Let</font></b> us <b><font color="black">enjoy</font></b> <b><font color="black">life</font></b>!<br /> To: <b><font color="black">jopat@<b><font color="black">telusplanet.net</font></b></font></b><br /> Content-Type: text/html;<br /> charset="us-ascii"<br /> Date: Sun, 12 Jan 2003 09:34:46 +0800<br /> X-Priority: 3<br /> X-Mailer: <b><font color="black">jpfree</font></b> <b><font color="black">Group</font></b> Mail <b><font color="black">Express</font></b> V1.0<br /> Message-Id: <20030112013444.RTJR4607.priv-edtnes27.telusplanet.net@N1N><br /> <br /> <HTML><HEAD><TITLE></TITLE><br /> <META content="Microsoft FrontPage 4.0" name=GENERATOR></HEAD> <br /> <BODY text=<b><font color="black">#000000</font></b> bgColor=<b><font color="black">#EFEBE7</font></b>><br /> <table border="0" width="500" cellspacing="0" cellpadding="5"><br /> <tr><br /> <td valign="top"><br /> <h1 align=left><FONT size=4><B><b><font color="black">Hello</font></b> <b><font color="black">friends</font></b>.</B></FONT></h1> <br /> <h1 align=left><B><FONT size=4 face="Arial Narrow">I <b><font color="black">bet</font></b> you would <b><font color="black">just</font></b> <b><font color="black">love</font></b><br /> to<a href="http://<b><font color="black">www.<b><font color="black">apple999.com</font></b></font></b>/xy1.htm"><br /> <b><font color="black">see</font></b> me <b><font color="black">naked</font></b></a>, <b><font color="black">spreading</font></b> my <b><font color="black">candy</font></b> for ya. I can not <b><font color="black">even</font></b> <b><font color="black">tell</font></b> <br /> you <b><font color="black">how</font></b> <b><font color="black">much</font></b> it <b><font color="black">turns</font></b> me on to have <b><font color="black">people</font></b> <a<br /> href="http://<b><font color="black">www.<b><font color="black">apple999.com</font></b></font></b>/xy1.htm"><b><font color="black">get</font></b><br /> off to my <b><font color="black">naked</font></b> <b><font color="black">sexy</font></b> body</a>. <b><font color="black">I've</font></b> <b><font color="black">left</font></b> you a <b><font color="black">tiny</font></b> <b><font color="black">sample</font></b> of <br /> my <b><font color="black">gorgeousness</font></b> <b><font color="black">just</font></b> to <b><font color="black">give</font></b> you a <b><font color="black">itty</font></b>- <b><font color="black">bitty</font></b> <b><font color="black">taste</font></b> of <b><font color="black">what's</font></b> <br /> <b><font color="black">inside</font></b> if you <b><font color="black">join</font></b>. So <b><font color="black">when</font></b> you are done <b><font color="black">checking</font></b> out my <b><font color="black">different</font></b> <br /> <b><font color="black">pics</font></b>- it's <b><font color="black">time</font></b> for you to <b><font color="black">join</font></b>!!</FONT></B></h1><br /> <P align=left><B><FONT size=4 face="Arial"><a<br /> href="http://<b><font color="black">www.<b><font color="black">apple999.com</font></b></font></b>/xy1.htm"><b><font color="black">See</font></b><br /> you <b><font color="black">inside</font></b>...</a></FONT></B></P><br /> <P align=left><B><FONT size=4 face="Arial"><a<br /> href="http://<b><font color="black">www.<b><font color="black">apple999.com</font></b></font></b>/xy1.htm"><b><font color="black">Hugs</font></b><br /> & <b><font color="black">Kisses</font></b>,</a><BR><br /> <b><font color="black">Kurious</font></b></FONT></B></P><br /> </td><br /> <td><a href="http://<b><font color="black">www.<b><font color="black">apple999.com</font></b></font></b>/xy1.htm"><br /> </tr><br /> </table><br /> </BODY></HTML><br /> </tt> --- NEW FILE: TestMailParse009.col --- <tt>Return-Path: <<b><font color="black">bri...@po...</font></b>><br /> Received: from <b><font color="black"><b><font color="black">200.204.91.79</font></b></font></b> (200.204.91.79)<br /> by mta564.mail.yahoo.com with SMTP; 09 Jan 2003 05:15:37 -0800 (PST)<br /> From: "<b><font color="black">Luke</font></b> <b><font color="black">Perry</font></b>" <<b><font color="black">brienne66@<b><font color="black">poetic.com</font></b></font></b>><br /> Reply-To: "<b><font color="black">Luke</font></b> <b><font color="black">Perry</font></b>" <<b><font color="black">brienne66@<b><font color="black">poetic.com</font></b></font></b>><br /> CC: <b><font color="black">big_bake01@<b><font color="black">yahoo.com</font></b></font></b>, <b><font color="black">star4403@<b><font color="black">yahoo.com</font></b></font></b><br /> Date: Thu, 9 Jan 2003 05:14:46 -0800<br /> Subject: [spam] <b><font color="black">FánTástìç</font></b>!! ^ comman6853 ^ »»» <b><font color="black">Eárn</font></b> <b><font color="black">Mõnéy</font></b> <b><font color="black">thrôuGh</font></b> <b><font color="black">UnçõLLeçted</font></b> <b><font color="black">Judgments</font></b>! «««<br /> X-Priority: 1<br /> MIME-Version: 1.0<br /> X-Mailer: <b><font color="black">Microsoft</font></b> <b><font color="black">Outlook</font></b> <b><font color="black">Express</font></b> 6.00.2600.0000<br /> X-<b><font color="black">MimeOLE</font></b>: <b><font color="black">Produced</font></b> By <b><font color="black">Microsoft</font></b> MimeOLE V6.00.2600.0000<br /> Content-Type: text/html; charset=<b><font color="black">us-ascii</font></b><br /> Content-Transfer-Encoding: 7bit<br /> Content-Length: 1094<br /> Message-ID: <avj...@FQ...valid><br /> <br /> <font color=<b><font color="black">white</font></b>>*-*-**-*-*-*-*-*-*-*-*-*-*-*--*-*-*-*-*-*-*-*-*--*-*-*-*-*-*-*<br /> *-*-*-*-*-*-*-*-*-*-*-*-*--*-*-*-*-*-*-*****-----*-**-*-*-*--*-*--*-*-*-*-*-***-<br /> <BR>¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤<BR> comman6853<br /> *--*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**</font><br><br /> <br /> <HTML><br /> <font color=white<br /> size=1>comman6853YHERKHSDKJFHSDKJFHKSJDFHKJSDHFIUWEYRKHSDKFJHSDKJFHSRHFKSDJHFKJS<br /> DHFKSHDFKJSDHFUIWEYRIHWSFKJSDHKFJWIEURYKSJDHFKJSDHFKJSDHFKSHDFIWUEYRWHSFKJSDHFKH<br /> WEKRHKSJDFHWEYHFK^#$*#^^!*^*^$*^!^%^*^*^$&%^%(!@</font><br><!-- <REM: <URL2#####>><br /> --><br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <HEAD></HEAD><br /> <body><br /> <P align=left><br /> <IMG<br /> src="http://<b><font color="black">202.108.221.16</font></b>/HTTP/ben/MBTY.jpg" border=0> <img<br /> src="http://<b><font color="black">202.108.221.16</font></b>/HTTP/ben/EmailOffersOndemand.jpg" border="0"><br /> <BR><BR><br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <IMG src="http://<b><font color="black">202.108.221.16</font></b>/HTTP/ben/sinko.gif" border=0><br /> <BR><BR><br /> <a href="mailto:<b><font color="black">28...@28...</font></b>"><img<br /> src="http://<b><font color="black">202.108.221.16</font></b>/HTTP/ben/clhere.gif" border="0"<br /> onMouseOver="window.status='283245'; return true"<br /> onMouseOut="window.status='283245'"></a><br /> </P><br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <BR><BR><BR><BR><BR><BR><BR><br /> 283245<br /> </body><br /> <BR><br /> <BR><br /> <BR><br /> <BR><br /> <BR><font color=<b><font color="black">fuchsia</font></b> face="tempus sans itc" ><b><b><font color="black">LYK</font></b> 01'08''03 C24<br /> <BR><BR><BR><BR>00066©<BR><BR><br /> <BR><br /> <BR><br /> <BR><font color=<b><font color="black">white</font></b> size=1>Current alternatives for recovering judgments<br /> inadequate-learn moreSecure Your Future Tod...@ya...Work at home-<br /> unlimited potentialHave you heard about this?com...@ya...Thriving Business<br /> needs your help!!!!We have the most advanced asset tracking services in the<br /> world!com...@ya...New career in legal profession gives you fresh outlook<br /> on your lifeHere's your chance for the American Dre...@ya...New<br /> methods for recovering judicial judgmentsRead Thi...@ya...Feel the<br /> need to succeedHave you heard about this?com...@ya...Everyone needs<br /> a Home-Based BusinessTraining in the Judgment business -A great new business<br /> idea!com...@ya...Feel the need to succeedHelp people who are awarded<br /> judgments - work from your hom...@ya...Love your job- work from<br /> homeSeeking Justice-Minded People for Business Opp...@ya...Work<br /> at home- unlimited potentialSuccessful judgment recovery<br /> bus...@ya...Enjoy the fruits of your laborDedicated, Hard-Working<br /> People Nee...@ya...</FONT><br /> <BR><br /> <BR></HTML><br /> <br /> [@^*#@*%_#%*#_$%*_#_]<br /> </tt> --- NEW FILE: TestMailParse010.col --- <tt>X-Auth-No: <br /> Return-Path: <<b><font color="black">cs...@my...</font></b>><br /> Received: from <b><font color="black">digitalme.com</font></b> not <b><font color="black">authenticated</font></b> [<b><font color="black">193.97.97.75</font></b>]<br /> by smtp-send.myrealbox.com with NetMail SMTP Agent $Revision: 1.1.4.1 $ on Novell NetWare;<br /> Sat, 11 Jan 2003 22:03:10 -0700<br /> Received: from <b><font color="black"><b><font color="black">65.100.247.142</font></b></font></b> not <b><font color="black">authenticated</font></b> [65.100.247.142]<br /> by digitalme.com with Novell NIMS $Revision: 1.1.4.1 $ on Novell NetWare;<br /> Sat, 11 Jan 2003 21:03:05 -0800<br /> Message-ID: <44747.22535@><br /> From: U'S'A L'o't't'e'r'y L'T'D <iplvwq@><br /> Subject: Re[4]: <b><font color="black">Regarding</font></b> your <b><font color="black">activation</font></b><br /> To: <b><font color="black">are10@<b><font color="black">myrealbox.com</font></b></font></b><br /> Date: Sun, 12 Jan 2003 07:03:25 <br /> MIME-Version: 1.0<br /> Content-Type: text/plain;<br /> charset="windows-1252"<br /> Content-Transfer-Encoding: base64<br /> <br /> Q29uZ3JhdHVsYXRpb25zIQ0KDQpZb3UgaGF2ZSBiZWVuIHNlbGVjdGVkIHRvIHJlY2lldmUgbWVt<br /> YmVyc2hpcCB0byB0aGUgYmVzdCBBYERgVWBMYFQgc2l0ZSBvZg0KeW91ciBjaG9pY2UgZm9yIEZe<br /> Ul5FXkUhDQoNCiogV2UgaGF2ZSBldmVyeSBuaWNoZSB5b3UgY2FuIGltYWdpbmUhDQoqIEFsbCBv<br /> ZiBvdXIgc2l0ZXMgaGFzIGhpZ2ggcXVhbGl0eSBjb250YW50IQ0KKiBZb3UgY2FuIGJlIGluIG1l<br /> bWJlciBzZWN0aW9uIGluIGxlc3MgdGhhbiAxIG1pbiENCiogQW5kIGJlc3Qgb2YgYWxsOiBOYE9g<br /> IENgUmBFYERgSWBUYCBDYEFgUmBEYCBOYEVgRWBEYEVgRGANCg0KKiAqICogKiBDYExgSWBDYEsg<br /> SGBFYFJgRSAqICogKiAqDQpodHRwOi8vYmVzdHBvcm5ob3N0LmNvbS92YXN5YS8/aW5zdGFudGhv<br /> bWUNCg0KSWYgeW91IGhhdmUgcmVjZWl2ZWQgdGhpcyBtYWlsaW5nIGluIGVycm9yLCBvciBkbyBu<br /> b3Qgd2lzaCB0byByZWNlaXZlIGFueQ0KZnVydGhlciBvZmZlcnMgb3Igbm90aWNlcyBmcm9tIHVz<br /> <b>Found in encoded data:</b> <font color="black">rm_...@ma...</font> <font color="black">mail.com</font> <font color="black">bestpornhost.com</font> <font color="black">FREE</font> <font color="black">ADULT</font> <font color="black">CREDIT</font> <font color="black">CARD</font> <font color="black">NEEDED</font> <font color="black">CLICK</font> <font color="black">HERE</font> <font color="black">Congratulations</font> <font color="black">selected</font> <font color="black">recieve</font> <font color="black">membership</font> <font color="black">best</font> <font color="black">site</font> <font color="black">choice</font> <font color="black">every</font> <font color="black">niche</font> <font color="black">imagine</font> <font color="black">sites</font> <font color="black">high</font> <font color="black">quality</font> <font color="black">contant</font> <font color="black">member</font> <font color="black">section</font> <font color="black">less</font> <font color="black">than</font> <font color="black">min</font> <font color="black">best</font> <font color="black">vasya</font> <font color="black">instanthome</font> <font color="black">mailing</font> <font color="black">error</font> <font color="black">wish</font> <font color="black">receive</font> <font color="black">further</font> <font color="black">offers</font> <font color="black">notices</font> <font color="black">simply</font> <font color="black">here</font> </tt> --- NEW FILE: TestMailParse011.col --- <tt>Return-Path: <<b><font color="black">hor...@fr...</font></b>><br /> Delivered-To: myrealemailaddress@<b><font color="black">domain</font></b><br /> Received: (<b><font color="black">qmail</font></b> 26261 <b><font color="black">invoked</font></b> by <b><font color="black">uid</font></b> 609); 18 Jan 2003 06:22:49 -0000<br /> Delivered-To: <b><font color="black">spam</font></b>-address-ccbill@<b><font color="black">domain</font></b><br /> Received: (<b><font color="black">qmail</font></b> 26258 <b><font color="black">invoked</font></b> by <b><font color="black">uid</font></b> 421); 18 Jan 2003 06:22:49 -0000 <b><font color="black">blah</font></b> <b><font color="black">blah</font></b><br /> by <b><font color="black">ekardia</font></b> with <b><font color="black">Microsoft</font></b> SMTPSVC(5.0.2122.2262);<br /> Sat, 18 Jan 2003 15:26:39 +0900<br /> Date: Sat, 18 Jan 2003 06:25:35 GMT<br /> From: "<b><font color="black">Acaynya</font></b>"<<b><font color="black">hornydarla3553qqoe1@<b><font color="black">free.fr</font></b></font></b>><br /> X-Priority: 3<br /> To: <b><font color="black">spamaddy@domain</font></b><br /> Subject: <b><font color="black">spamaddy</font></b>,<b><font color="black">what</font></b> ?<br /> Mime-Version: 1.0<br /> Content-Type: text/plain; charset=<b><font color="black">us-ascii</font></b><br /> Content-Transfer-Encoding: 7bit<br /> Message-ID: <EKARDIAX6Mmasdf78970016@ekardia><br /> X-OriginalArrivalTime: 18 Jan 2003 06:26:40.0656 (<b><font color="black">UTC</font></b>)<br /> FILETIME=[8FDC2900:01BAAAABA]<br /> <br /> I <b><font color="black">think</font></b> you <b><font color="black">answered</font></b> my ad <b><font color="black">longtime</font></b> <b><font color="black">ago</font></b> if it was not you I am <b><font color="black">sorry</font></b>.<br /> If it was I could not <b><font color="black">answer</font></b><br /> you <b><font color="black">because</font></b> my <b><font color="black">Eudora</font></b> <b><font color="black">died</font></b> and I could not <b><font color="black">get</font></b> it to <b><font color="black">work</font></b> but my <b><font color="black">friend</font></b> <b><font color="black">got</font></b><br /> the <b><font color="black">emails</font></b> address out for me ..:)<br /> I <b><font color="black">hope</font></b> it was you and you are <b><font color="black">still</font></b> <b><font color="black">interested</font></b>,<br /> as I <b><font color="black">realize</font></b> <b><font color="black">lots</font></b> of <b><font color="black">time</font></b> has <b><font color="black">past</font></b>.<br /> I <b><font color="black">really</font></b> <b><font color="black">don't</font></b> <b><font color="black">know</font></b> <b><font color="black">where</font></b> to <b><font color="black">start</font></b> ....<br /> <b><font color="black">Maybe</font></b> you can <b><font color="black">tell</font></b> me <b><font color="black">little</font></b> <b><font color="black">more</font></b> <b><font color="black">about</font></b> <b><font color="black">yourself</font></b> <b><font color="black">since</font></b> I <b><font color="black">lost</font></b> your <b><font color="black">first</font></b> <b><font color="black">email</font></b><br /> ,<br /> <b><font color="black">what</font></b> you <b><font color="black">look</font></b> <b><font color="black">like</font></b>,<b><font color="black">age</font></b>,and are you <b><font color="black">still</font></b> <b><font color="black">looking</font></b> ?<br /> If you are <b><font color="black">interested</font></b> <b><font color="black">learning</font></b> <b><font color="black">more</font></b> <b><font color="black">about</font></b> me, I have a <b><font color="black">profile</font></b> at :<br /> <br /> http://<b><font color="black">www.<b><font color="black">hiddenmatch.com</font></b></font></b><br /> <br /> I am NOT a <b><font color="black">Porn</font></b> <b><font color="black">Chick</font></b> ..:-)<br /> I <b><font color="black">just</font></b> <b><font color="black">chose</font></b> it <b><font color="black">because</font></b> you <b><font color="black">don't</font></b> have to <b><font color="black">pay</font></b>,<br /> And <b><font color="black">they</font></b> <b><font color="black">allow</font></b> any <b><font color="black">pictures</font></b> I <b><font color="black">want</font></b> .:).<br /> Oh <b><font color="black">yea</font></b> , My <b><font color="black">username</font></b> is darla1792 .<br /> <b><font color="black">Don't</font></b> <b><font color="black">really</font></b> <b><font color="black">know</font></b> <b><font color="black">what</font></b> <b><font color="black">else</font></b> to <b><font color="black">say</font></b> for <b><font color="black">now</font></b> I <b><font color="black">hope</font></b> this is the <b><font color="black">right</font></b> address .<br /> <b><font color="black">Let</font></b> me <b><font color="black">know</font></b> if you are <b><font color="black">interested</font></b>, And I <b><font color="black">hope</font></b><br /> you <b><font color="black">don't</font></b> <b><font color="black">run</font></b> <b><font color="black">when</font></b> you <b><font color="black">see</font></b> my <b><font color="black">picture</font></b> :-)<br /> <br /> <b><font color="black">Bye</font></b> ..... D<br /> </tt> --- NEW FILE: TestMailParse012.col --- <tt>Return-Path: <<b><font color="black">Bri...@ao...</font></b>><br /> Received: from <b><font color="black">sunsinger</font></b>.<b><font color="black">herald</font></b>.co.uk (<b><font color="black">sunsinger</font></b>.<b><font color="black">herald</font></b>.co.uk [<b><font color="black">213.38.80.4</font></b>]) by <b><font color="black">walnut.<b><font color="black">he.net</font></b></font></b> (8.8.6/8.8.2) with ESMTP <br /> id RAA04728 for <<b><font color="black">jg...@ex...</font></b>>; Mon, 20 Jan 2003 17:08:29 -0800<br /> Received: from <b><font color="black">mailin-03.<b><font color="black">mx.<b><font color="black">aol.com</font></b></font></b></font></b> (CacheFlowServer@[<b><font color="black">200.215.97.82</font></b>])<br /> by sunsinger.herald.co.uk (8.9.3/8.9.3/Debian/GNU) with SMTP id BAA08887<br /> for <web...@jg...>; Tue, 21 Jan 2003 01:08:19 GMT<br /> Date: Tue, 21 Jan 2003 01:08:19 GMT<br /> Message-Id: <200...@su...><br /> X-Authentication-Warning: <b><font color="black">sunsinger</font></b>.<b><font color="black">herald</font></b>.co.uk: <b><font color="black">Host</font></b> CacheFlowServer@[<b><font color="black">200.215.97.82</font></b>] <b><font color="black">claimed</font></b> to be <br /> <b><font color="black">mailin-03.<b><font color="black">mx.<b><font color="black">aol.com</font></b></font></b></font></b><br /> From: Brianna121 <<b><font color="black">Brianna121@<b><font color="black">aol.com</font></b></font></b>><br /> To: <<b><font color="black">webmaster@<b><font color="black">jgc.org</font></b></font></b>><br /> Subject: [spam] <b><font color="black">Want</font></b> to <b><font color="black">see</font></b> a <b><font color="black">huge</font></b> <b><font color="black">horse</font></b> c*ck in a <b><font color="black">tiny</font></b> <b><font color="black">teen</font></b> c*nt?<br /> MIME-Version: 1.0<br /> Content-Type: text/html; charset="<b><font color="black">US-ASCII</font></b>"<br /> Content-transfer-encoding: 7bit<br /> X-UIDL: M-$"!c:b"!57:!!i#1!!<br /> X-Text-Classification: spam<br /> X-POPFile-Link: <http://<b><font color="black">127.0.0.1</font></b>:9090/<b><font color="black">jump</font></b>_to_message?view=popfile2146=1.<b><font color="black">msg</font></b>><br /> <br /> <html><br /> <br /> <head><br /> <title><b><font color="black">get</font></b> it <b><font color="black">now</font></b></title><br /> <base target="_blank"><br /> </head><br /> <body alink="Blue" link="Blue" vlink="Blue"><br /> <a href="http://<b><font color="black">pc.<b><font color="black">x-x-xfreehosting.com</font></b></font></b>/pc"><br /> You <b><font color="black">think</font></b> you have <b><font color="black">seen</font></b> <b><font color="black">some</font></b> <b><font color="black">pretty</font></b> <b><font color="black">crazy</font></b> <b><font color="black">porn</font></b> on the <b><font color="black">internet</font></b>? YOU <b><font color="black">HAVEN'T</font></b> <b><font color="black">SEEN</font></b> <b><font color="black">SHIT</font></b>! I <b><font color="black">saw</font></b> the <b><font color="black">most</font></b> <b><font color="black">unbelievable</font></b> <b><font color="black">movie</font></b> <br /> <b><font color="black">clip</font></b> <b><font color="black">ever</font></b> to <b><font color="black">grace</font></b> the <b><font color="black">internet</font></b>! <b><font color="black">These</font></b> <b><font color="black">guys</font></b> <b><font color="black">put</font></b> up a <b><font color="black">clip</font></b> of a <b><font color="black">beautiful</font></b> <b><font color="black">teen</font></b> <b><font color="black">farm</font></b> <b><font color="black">girl</font></b> <b><font color="black">who</font></b> <b><font color="black">actually</font></b> <b><font color="black">fucks</font></b> her <br /> <b><font color="black">horse</font></b>!<br /> <br><br /> NO <b><font color="black">BULLSHIT</font></b>, SHE <b><font color="black">ACTUALLY</font></b> <b><font color="black">FUCKS</font></b> A <b><font color="black">HORSE</font></b> WITH A 25 <b><font color="black">INCH</font></b> <b><font color="black">COCK</font></b>! <br /> THE <b><font color="black">MOVIE</font></b> <b><font color="black">QUALITY</font></b> IS <b><font color="black">GREAT</font></b> AND HAS <b><font color="black">SOUND</font></b> <b><font color="black">TOO</font></b>! IT IS <b><font color="black">UNBELIEVABLE</font></b>!<br /> <br><br><br /> THIS <b><font color="black">LITTLE</font></b> <b><font color="black">SLUTS</font></b> CAN <b><font color="black">REALLY</font></b> <b><font color="black">HANDLE</font></b> A <b><font color="black">GIANT</font></b> <b><font color="black">HORSE</font></b> <b><font color="black">COCK</font></b> IN HER <b><font color="black">TIGHT</font></b> <b><font color="black">LITTLE</font></b> <b><font color="black">TEEN</font></b> <b><font color="black">PUSSY</font></b> <b><font color="black">LIKE</font></b> YOU WOULD NOT <b><font color="black">BELIEVE</font></b>! YOU <br /> <b><font color="black">HAV</font></b> TO <b><font color="black">WATCH</font></b> THIS <b><font color="black">CLIP</font></b> <b><font color="black">BEFORE</font></b> <b><font color="black">SOMEONE</font></b> <b><font color="black">FINDS</font></b> IT AND <b><font color="black">TAKE</font></b> IT OFF.<br /> <br><br><br /> <b><font color="black">HERES</font></b> THE <b><font color="black">GOOD</font></b> <b><font color="black">PART</font></b>. <b><font color="black">THESE</font></b> <b><font color="black">GUYS</font></b> <b><font color="black">AREN'T</font></b> A <b><font color="black">NORMAL</font></b> <b><font color="black">PORN</font></b> <b><font color="black">SITE</font></b> SO <b><font color="black">THEY</font></b> <b><font color="black">DON'T</font></b> <b><font color="black">WANT</font></b> <b><font color="black">MONEY</font></b> TO <b><font color="black">LET</font></b> US <b><font color="black">WATCH</font></b> SO ITS <b><font color="black">FREE</font></b>. BUT <b><font color="black">WHAT</font></b> <br /> <b><font color="black">THEY</font></b> DO IS <b><font color="black">MAKE</font></b> YOU <b><font color="black">TAKE</font></b> THIS <b><font color="black">TEST</font></b> THAT <b><font color="black">ASKS</font></b> <b><font color="black">HOW</font></b> BIG A <b><font color="black">HORSE</font></b> <b><font color="black">DICK</font></b> IS. <b><font color="black">THAT'S</font></b> <b><font color="black">SOMETHING</font></b> THAT <b><font color="black">ONLY</font></b> <b><font color="black">PEOPLE</font></b> <b><font color="black">INTO</font></b> <b><font color="black">ANIMAL</font></b> <b><font color="black">SEX</font></b> <br /> WOULD <b><font color="black">KNOW</font></b>. SO I <b><font color="black">THINK</font></b> <b><font color="black">THEY</font></b> ARE <b><font color="black">JUST</font></b> <b><font color="black">TRYING</font></b> TO <b><font color="black">MAKE</font></b> <b><font color="black">SURE</font></b> YOU ARE <b><font color="black">SOMEONE</font></b> <b><font color="black">WHOS</font></b> <b><font color="black">INTO</font></b> THIS <b><font color="black">STUFF</font></b>..NOT <b><font color="black">SOMEONE</font></b> <b><font color="black">WHO</font></b> <b><font color="black">WANTS</font></b> TO <br /> <b><font color="black">BUST</font></b> <b><font color="black">THEM</font></b>. SO IF <b><font color="black">YOU'RE</font></b> <b><font color="black">LIKE</font></b> ME AND <b><font color="black">DON'T</font></b> <b><font color="black">KNOW</font></b> <b><font color="black">ANYTHING</font></b> <b><font color="black">ABOUT</font></b> <b><font color="black">ANIMALS</font></b> <b><font color="black">JUST</font></b> <b><font color="black">GUESS</font></b> THE <b><font color="black">SIZE</font></b>. <b><font color="black">THERE</font></b> ARE <b><font colo... [truncated message content] |
From: <ssc...@us...> - 2003-03-20 11:06:28
|
Update of /cvsroot/popfile/engine/tests In directory sc8-pr-cvs1:/tmp/cvs-serv7526 Removed Files: Tag: v0 TestMailParse022.col Log Message: removing color tests to re-commit --- TestMailParse022.col DELETED --- |
Update of /cvsroot/popfile/engine/tests In directory sc8-pr-cvs1:/tmp/cvs-serv6900 Removed Files: Tag: v0 TestMailParse002.col TestMailParse003.col TestMailParse004.col TestMailParse005.col TestMailParse006.col TestMailParse007.col TestMailParse008.col TestMailParse009.col TestMailParse010.col TestMailParse011.col TestMailParse012.col TestMailParse013.col TestMailParse014.col TestMailParse015.col TestMailParse016.col TestMailParse017.col TestMailParse018.col TestMailParse019.col TestMailParse020.col TestMailParse021.col Log Message: removing color tests to re-commit --- TestMailParse002.col DELETED --- --- TestMailParse003.col DELETED --- --- TestMailParse004.col DELETED --- --- TestMailParse005.col DELETED --- --- TestMailParse006.col DELETED --- --- TestMailParse007.col DELETED --- --- TestMailParse008.col DELETED --- --- TestMailParse009.col DELETED --- --- TestMailParse010.col DELETED --- --- TestMailParse011.col DELETED --- --- TestMailParse012.col DELETED --- --- TestMailParse013.col DELETED --- --- TestMailParse014.col DELETED --- --- TestMailParse015.col DELETED --- --- TestMailParse016.col DELETED --- --- TestMailParse017.col DELETED --- --- TestMailParse018.col DELETED --- --- TestMailParse019.col DELETED --- --- TestMailParse020.col DELETED --- --- TestMailParse021.col DELETED --- |
From: <ssc...@us...> - 2003-03-20 09:07:13
|
Update of /cvsroot/popfile/engine/UI In directory sc8-pr-cvs1:/tmp/cvs-serv12156 Modified Files: Tag: v0/18/1 HTML.pm Log Message: Fixed submit button search failure in IE (bug 695646) Index: HTML.pm =================================================================== RCS file: /cvsroot/popfile/engine/UI/HTML.pm,v retrieving revision 1.98.2.2 retrieving revision 1.98.2.3 diff -C2 -d -r1.98.2.2 -r1.98.2.3 *** HTML.pm 11 Mar 2003 08:49:12 -0000 1.98.2.2 --- HTML.pm 20 Mar 2003 09:07:05 -0000 1.98.2.3 *************** *** 2698,2701 **** --- 2698,2716 ---- $self->{form}{search} = '' if ( !defined( $self->{form}{search} ) ); $self->{form}{filter} = '' if ( !defined( $self->{form}{filter} ) ); + + # Information from submit buttons isn't always preserved if the buttons aren't + # pressed. This compares values in some fields and sets the button-values as + # though they had been pressed + + + # Information from submit buttons isn't always preserved if the buttons aren't + # pressed. This compares values in some fields and sets the button-values as + # though they had been pressed + + # Set setsearch if search changed and setsearch is undefined + $self->{form}{setsearch} = 'on' if ( ( ( !defined($self->{old_search}) && ($self->{form}{search} ne '') ) || ( defined($self->{old_search}) && ( $self->{old_search} ne $self->{form}{search} ) ) ) && !defined($self->{form}{setsearch} ) ); + $self->{old_search} = $self->{form}{search}; + + # If the user is asking for a new sort option then it needs to get |
From: <ssc...@us...> - 2003-03-20 08:52:44
|
Update of /cvsroot/popfile/engine/UI In directory sc8-pr-cvs1:/tmp/cvs-serv3759 Modified Files: HTML.pm Log Message: better handling of which variables will be defined for bugfix 695646 Index: HTML.pm =================================================================== RCS file: /cvsroot/popfile/engine/UI/HTML.pm,v retrieving revision 1.116 retrieving revision 1.117 diff -C2 -d -r1.116 -r1.117 *** HTML.pm 20 Mar 2003 08:44:07 -0000 1.116 --- HTML.pm 20 Mar 2003 08:52:39 -0000 1.117 *************** *** 2575,2580 **** # Set setsearch if search changed and setsearch is undefined ! $self->{form__}{setsearch} = 'on' if ( ( ( !defined($self->{old_search__}) && defined $self->{form__}{search} ) || ( defined($self->{old_search__}) && ( $self->{old_search__} ne $self->{form__}{search} ) ) ) && !defined($self->{form__}{setsearch} ) ); ! $self->{old_search__} = $self->{form__}{search} if ( defined($self->{form__}{search}) ); --- 2575,2580 ---- # Set setsearch if search changed and setsearch is undefined ! $self->{form__}{setsearch} = 'on' if ( ( ( !defined($self->{old_search__}) && ($self->{form__}{search} ne '') ) || ( defined($self->{old_search__}) && ( $self->{old_search__} ne $self->{form__}{search} ) ) ) && !defined($self->{form__}{setsearch} ) ); ! $self->{old_search__} = $self->{form__}{search}; |
From: <ssc...@us...> - 2003-03-20 08:44:12
|
Update of /cvsroot/popfile/engine/UI In directory sc8-pr-cvs1:/tmp/cvs-serv31566 Modified Files: HTML.pm Log Message: made previous fix take scope into account Index: HTML.pm =================================================================== RCS file: /cvsroot/popfile/engine/UI/HTML.pm,v retrieving revision 1.115 retrieving revision 1.116 diff -C2 -d -r1.115 -r1.116 *** HTML.pm 20 Mar 2003 07:46:35 -0000 1.115 --- HTML.pm 20 Mar 2003 08:44:07 -0000 1.116 *************** *** 45,49 **** # Hash used to store form parameters ! $self->{form__} = {}; # Session key to make the UI safer --- 45,49 ---- # Hash used to store form parameters ! $self->{form__} = {}; # Session key to make the UI safer *************** *** 2574,2581 **** # though they had been pressed ! # Set setsearch if search changed and setsearch is undefined ! my $old_search; ! $self->{form__}{setsearch} = 'on' if ( ( ( !defined($old_search) && defined $self->{form__}{search} ) || ( defined($old_search) && ( $old_search ne $self->{form__}{search} ) ) ) && !defined($self->{form__}{setsearch} ) ); ! $old_search = $self->{form__}{search} if ( defined($self->{form__}{search}) ); --- 2574,2580 ---- # though they had been pressed ! # Set setsearch if search changed and setsearch is undefined ! $self->{form__}{setsearch} = 'on' if ( ( ( !defined($self->{old_search__}) && defined $self->{form__}{search} ) || ( defined($self->{old_search__}) && ( $self->{old_search__} ne $self->{form__}{search} ) ) ) && !defined($self->{form__}{setsearch} ) ); ! $self->{old_search__} = $self->{form__}{search} if ( defined($self->{form__}{search}) ); |
From: <ssc...@us...> - 2003-03-20 07:46:48
|
Update of /cvsroot/popfile/engine/UI In directory sc8-pr-cvs1:/tmp/cvs-serv1944 Modified Files: HTML.pm Log Message: Fixed submit button search failure in IE (bug 695646) Index: HTML.pm =================================================================== RCS file: /cvsroot/popfile/engine/UI/HTML.pm,v retrieving revision 1.114 retrieving revision 1.115 diff -C2 -d -r1.114 -r1.115 *** HTML.pm 16 Mar 2003 00:52:33 -0000 1.114 --- HTML.pm 20 Mar 2003 07:46:35 -0000 1.115 *************** *** 2569,2572 **** --- 2569,2582 ---- $self->{form__}{search} = '' if ( !defined( $self->{form__}{search} ) ); $self->{form__}{filter} = '' if ( !defined( $self->{form__}{filter} ) ); + + # Information from submit buttons isn't always preserved if the buttons aren't + # pressed. This compares values in some fields and sets the button-values as + # though they had been pressed + + # Set setsearch if search changed and setsearch is undefined + my $old_search; + $self->{form__}{setsearch} = 'on' if ( ( ( !defined($old_search) && defined $self->{form__}{search} ) || ( defined($old_search) && ( $old_search ne $self->{form__}{search} ) ) ) && !defined($self->{form__}{setsearch} ) ); + $old_search = $self->{form__}{search} if ( defined($self->{form__}{search}) ); + # If the user is asking for a new sort option then it needs to get |
From: <ssc...@us...> - 2003-03-19 04:17:15
|
Update of /cvsroot/popfile/engine/Proxy In directory sc8-pr-cvs1:/tmp/cvs-serv19715 Modified Files: NNTP.pm Log Message: restore POP3-style server[:port][:username] syntax Index: NNTP.pm =================================================================== RCS file: /cvsroot/popfile/engine/Proxy/NNTP.pm,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** NNTP.pm 19 Mar 2003 04:03:31 -0000 1.6 --- NNTP.pm 19 Mar 2003 04:17:12 -0000 1.7 *************** *** 65,69 **** # The separator within the NNTP user name is : ! $self->config_( 'separator', '@'); return 1; --- 65,69 ---- # The separator within the NNTP user name is : ! $self->config_( 'separator', ':'); return 1; *************** *** 122,131 **** if ($connection_state eq 'username needed') { ! my $user_command = '^ *AUTHINFO USER ((.+)\\' . $self->config_('separator') . ')?([^\:]+)(:(.*))?'; ! if ( $command =~ /$user_command/i ) { ! my $username = $2; ! my $server = $3; ! my $port = $5; if ( $server ne '' ) { --- 122,136 ---- if ($connection_state eq 'username needed') { ! ! # NOTE: This syntax is ambiguous if the NNTP username is a short (under 5 digit) string (eg, 32123). ! # If this is the case, run "perl popfile.pl -nntp_separator /" and change your kludged username ! # appropriately (syntax would then be server[:port][/username]) ! my $user_command = '^ *AUTHINFO USER ([^:]+)(:([\d]{1,5}))?(\\' . $self->config_( 'separator' ) . '(.+))?'; ! if ( $command =~ /$user_command/i ) { ! my $server = $1; ! # hey, the port has to be in range at least ! my $port = $3 if ( defined($3) && ($3 > 0) && ($3 < 65536) ); ! my $username = $5; if ( $server ne '' ) { *************** *** 133,137 **** if (defined $username) { ! # Pass through the AUTHINFO command with the actual user name for this server, # if one is defined, and send the reply straight to the client --- 138,142 ---- if (defined $username) { ! # Pass through the AUTHINFO command with the actual user name for this server, # if one is defined, and send the reply straight to the client |
From: <ssc...@us...> - 2003-03-19 04:03:34
|
Update of /cvsroot/popfile/engine/Proxy In directory sc8-pr-cvs1:/tmp/cvs-serv15633 Modified Files: NNTP.pm Log Message: remove last vestiges of POP3 syntax and comments Index: NNTP.pm =================================================================== RCS file: /cvsroot/popfile/engine/Proxy/NNTP.pm,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** NNTP.pm 18 Mar 2003 15:28:45 -0000 1.5 --- NNTP.pm 19 Mar 2003 04:03:31 -0000 1.6 *************** *** 48,52 **** # initialize # ! # Called to initialize the POP3 proxy module # # --------------------------------------------------------------------------------------------- --- 48,52 ---- # initialize # ! # Called to initialize the NNTP proxy module # # --------------------------------------------------------------------------------------------- *************** *** 55,59 **** my ( $self ) = @_; ! # Default ports for POP3 service and the user interface $self->config_( 'port', 119 ); --- 55,59 ---- my ( $self ) = @_; ! # Default ports for NNTP service and the user interface $self->config_( 'port', 119 ); *************** *** 76,80 **** # The worker method that is called when we get a good connection from a client # ! # $client - an open stream to a POP3 client # $download_count - The unique download count for this session # --- 76,80 ---- # The worker method that is called when we get a good connection from a client # ! # $client - an open stream to a NNTP client # $download_count - The unique download count for this session # *************** *** 109,113 **** # The news client wants to stop using the server, so send that message through to the ! # real mail server, echo the response back up to the client and exit the while. We will # close the connection immediately if ( $command =~ /^ *QUIT/i ) { --- 109,113 ---- # The news client wants to stop using the server, so send that message through to the ! # real news server, echo the response back up to the client and exit the while. We will # close the connection immediately if ( $command =~ /^ *QUIT/i ) { *************** *** 279,283 **** next; } else { ! $self->tee_( $client, "-ERR unknown command or bad syntax$eol" ); last; } --- 279,283 ---- next; } else { ! $self->tee_( $client, "500 unknown command or bad syntax$eol" ); last; } *************** *** 290,294 **** $self->log_( "NNTP forked child done" ); } - - # TODO echo_response_ that calls echo_response_ with the extra parameters - # required et al. --- 290,291 ---- |
From: <jgr...@us...> - 2003-03-18 15:28:52
|
Update of /cvsroot/popfile/engine/Proxy In directory sc8-pr-cvs1:/tmp/cvs-serv22676/Proxy Modified Files: NNTP.pm Proxy.pm Log Message: Clean up a little NNTP module Index: NNTP.pm =================================================================== RCS file: /cvsroot/popfile/engine/Proxy/NNTP.pm,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** NNTP.pm 18 Mar 2003 01:55:19 -0000 1.4 --- NNTP.pm 18 Mar 2003 15:28:45 -0000 1.5 *************** *** 56,65 **** # Default ports for POP3 service and the user interface $self->config_( 'port', 119 ); # Only accept connections from the local machine for NNTP $self->config_( 'local', 1 ); ! # The separator within the NNTP user name is : $self->config_( 'separator', '@'); --- 56,68 ---- # Default ports for POP3 service and the user interface + $self->config_( 'port', 119 ); # Only accept connections from the local machine for NNTP + $self->config_( 'local', 1 ); ! # The separator within the NNTP user name is : + $self->config_( 'separator', '@'); *************** *** 86,90 **** # The handle to the real news server gets stored here my $news; ! # The state of the connection (username needed, password needed, authenticated/connected) my $connection_state = 'username needed'; --- 89,93 ---- # The handle to the real news server gets stored here my $news; ! # The state of the connection (username needed, password needed, authenticated/connected) my $connection_state = 'username needed'; *************** *** 104,110 **** $self->log_( "Command: --$command--" ); ! #$self->log_( "State: --$connection_state--" ); ! ! # The news client wants to stop using the server, so send that message through to the # real mail server, echo the response back up to the client and exit the while. We will --- 107,111 ---- $self->log_( "Command: --$command--" ); ! # The news client wants to stop using the server, so send that message through to the # real mail server, echo the response back up to the client and exit the while. We will *************** *** 118,146 **** } last; ! } ! if ($connection_state eq 'username needed') { - my $user_command = '^ *AUTHINFO USER ((.+)\\' . $self->config_('separator') . ')?([^\:]+)(:(.*))?'; ! if ( $command =~ /$user_command/i ) { ! my $username = $2; ! my $server = $3; ! my $port = $5; ! if ( $server ne '' ) { if ( $news = $self->verify_connected_( $news, $client, $server, $port || 119 ) ) { - if (defined $username) { ! # Pass through the AUTHINFO command with the actual user name for this server, # if one is defined, and send the reply straight to the client $self->get_response_($news, $client, 'AUTHINFO USER ' . $username ); $connection_state = "password needed"; } else { # Signal to the client to send the password ! $self->tee_($client, "381 password$eol"); $connection_state = "ignore password"; ! } ! } else { last; --- 119,148 ---- } last; ! } ! if ($connection_state eq 'username needed') { my $user_command = '^ *AUTHINFO USER ((.+)\\' . $self->config_('separator') . ')?([^\:]+)(:(.*))?'; ! ! if ( $command =~ /$user_command/i ) { my $username = $2; ! my $server = $3; ! my $port = $5; ! if ( $server ne '' ) { if ( $news = $self->verify_connected_( $news, $client, $server, $port || 119 ) ) { if (defined $username) { ! ! # Pass through the AUTHINFO command with the actual user name for this server, # if one is defined, and send the reply straight to the client + $self->get_response_($news, $client, 'AUTHINFO USER ' . $username ); $connection_state = "password needed"; } else { + # Signal to the client to send the password ! ! $self->tee_($client, "381 password$eol"); $connection_state = "ignore password"; ! } } else { last; *************** *** 150,238 **** last; } ! $self->flush_extra_( $news, $client, 0 ); next; } else { # Issue a 480 authentication required response ! $self->tee_( $client, "480 Authorization required for this command$eol" ); next; } - } elsif ( $connection_state eq "password needed" ) { - if ($command =~ /^ *AUTHINFO PASS (.*)/i) { ! ! my $response = $self->get_response_($news, $client, $command); ! if ($response =~ /^281 .*/) { ! $connection_state = "connected" } ! ! next; } else { ! # Issue a 381 more authentication required response ! $self->tee_( $client, "381 more authentication required for this command$eol" ); next; ! } } elsif ($connection_state eq "ignore password") { if ($command =~ /^ *AUTHINFO PASS (.*)/i) { - $self->tee_($client, "281 authentication accepted$eol"); $connection_state = "connected"; ! next; } else { ! # Issue a 480 authentication required response ! $self->tee_( $client, "381 more authentication required for this command$eol" ); next; } } elsif ( $connection_state eq "connected" ) { ! # COMMANDS USED DIRECTLY WITH THE REMOTE NNTP SERVER GO HERE ! # The client wants to retrieve an article. We oblige, and insert classification headers. if ( $command =~ /^ *ARTICLE (.*)/i ) { my $response = $self->get_response_( $news, $client, $command); if ( $response =~ /^220 (.*) (.*)$/i) { - $count += 1; my $class = $self->{classifier__}->classify_and_modify( $news, $client, $download_count, $count, 0, '' ); ! # Tell the parent that we just handled a mail ! print $pipe "$class$eol"; } ! ! $self->flush_extra_( $news, $client, 0 ); next; } ! # Commands expecting a code + text response ! if ( $command =~ /^ *(LIST|HEAD|BODY|NEWSGROUPS|NEWNEWS|LISTGROUP|XGTITLE|XINDEX|XHDR|XOVER|XPAT|XROVER|XTHREAD)/i ) { my $response = $self->get_response_( $news, $client, $command); ! # 2xx (200) series response indicates multi-line text follows to .crlf ! ! $self->echo_to_dot_( $news, $client, 0 ) if ($response =~ /^2\d\d/ ); ! $self->flush_extra_( $news, $client, 0 ); next; } ! # Exceptions to 200 code above if ( $ command =~ /^ *(HELP)/i ) { my $response = $self->get_response_( $news, $client, $command); - $self->echo_to_dot_( $news, $client, 0 ) if ( $response =~ /^1\d\d/ ); - $self->flush_extra_( $news, $client, 0 ); next; } ! ! # Commands expecting a single-line response if ( $command =~ /^ *(GROUP|STAT|IHAVE|LAST|NEXT|SLAVE|MODE|XPATH)/i ) { $self->get_response_( $news, $client, $command ); --- 152,237 ---- last; } ! $self->flush_extra_( $news, $client, 0 ); next; } else { + # Issue a 480 authentication required response ! $self->tee_( $client, "480 Authorization required for this command$eol" ); next; } } elsif ( $connection_state eq "password needed" ) { if ($command =~ /^ *AUTHINFO PASS (.*)/i) { ! my $response = $self->get_response_($news, $client, $command); ! if ($response =~ /^281 .*/) { ! $connection_state = "connected"; } ! next; } else { ! # Issue a 381 more authentication required response ! $self->tee_( $client, "381 more authentication required for this command$eol" ); next; ! } } elsif ($connection_state eq "ignore password") { if ($command =~ /^ *AUTHINFO PASS (.*)/i) { $self->tee_($client, "281 authentication accepted$eol"); $connection_state = "connected"; ! next; } else { ! # Issue a 480 authentication required response ! $self->tee_( $client, "381 more authentication required for this command$eol" ); next; } } elsif ( $connection_state eq "connected" ) { ! # COMMANDS USED DIRECTLY WITH THE REMOTE NNTP SERVER GO HERE ! # The client wants to retrieve an article. We oblige, and insert classification headers. + if ( $command =~ /^ *ARTICLE (.*)/i ) { my $response = $self->get_response_( $news, $client, $command); if ( $response =~ /^220 (.*) (.*)$/i) { $count += 1; + my $class = $self->{classifier__}->classify_and_modify( $news, $client, $download_count, $count, 0, '' ); ! # Tell the parent that we just handled a mail ! ! print $pipe "$class$eol"; } ! ! $self->flush_extra_( $news, $client, 0 ); next; } ! # Commands expecting a code + text response ! ! if ( $command =~ /^ *(LIST|HEAD|BODY|NEWSGROUPS|NEWNEWS|LISTGROUP|XGTITLE|XINDEX|XHDR|XOVER|XPAT|XROVER|XTHREAD)/i ) { my $response = $self->get_response_( $news, $client, $command); ! # 2xx (200) series response indicates multi-line text follows to .crlf ! ! $self->echo_to_dot_( $news, $client, 0 ) if ( $response =~ /^2\d\d/ ); $self->flush_extra_( $news, $client, 0 ); next; } ! # Exceptions to 200 code above + if ( $ command =~ /^ *(HELP)/i ) { my $response = $self->get_response_( $news, $client, $command); $self->echo_to_dot_( $news, $client, 0 ) if ( $response =~ /^1\d\d/ ); $self->flush_extra_( $news, $client, 0 ); next; } ! # Commands expecting a single-line response + if ( $command =~ /^ *(GROUP|STAT|IHAVE|LAST|NEXT|SLAVE|MODE|XPATH)/i ) { $self->get_response_( $news, $client, $command ); *************** *** 240,280 **** next; } ! # Commands followed by multi-line client response if ( $command =~ /^ *(IHAVE|POST|XRELPIC)/i ) { my $response = $self->get_response_( $news, $client, $command); ! # 3xx (300) series response indicates multi-line text should be sent, up to .crlf if ($response =~ /^3\d\d/ ) { ! # Echo from the client to the server ! $self->echo_to_dot_( $client, $news, 0 ); ! # Echo to dot doesn't provoke a server response somehow, we add another CRLF ! $self->get_response_( $news, $client, "$eol" ); ! ! $self->flush_extra_( $news, $client, 0 ); } ! ! next; } - - } ! # Commands we expect no response to, such as the null command ! ! if ( $ command =~ /^ *$/ ) { if ( $news && $news->connected ) { $self->get_response_($news, $client, $command, '',1); $self->flush_extra_( $news, $client, 0 ); ! next; ! } } - # Don't know what this is so let's just pass it through and hope for the best if ( $news && $news->connected) { $self->echo_response_($news, $client, $command ); --- 239,277 ---- next; } ! # Commands followed by multi-line client response + if ( $command =~ /^ *(IHAVE|POST|XRELPIC)/i ) { my $response = $self->get_response_( $news, $client, $command); ! # 3xx (300) series response indicates multi-line text should be sent, up to .crlf + if ($response =~ /^3\d\d/ ) { ! # Echo from the client to the server ! $self->echo_to_dot_( $client, $news, 0 ); ! # Echo to dot doesn't provoke a server response somehow, we add another CRLF ! $self->get_response_( $news, $client, "$eol" ); ! $self->flush_extra_( $news, $client, 0 ); } ! next; } } ! # Commands we expect no response to, such as the null command ! ! if ( $ command =~ /^ *$/ ) { if ( $news && $news->connected ) { $self->get_response_($news, $client, $command, '',1); $self->flush_extra_( $news, $client, 0 ); ! next; ! } } # Don't know what this is so let's just pass it through and hope for the best + if ( $news && $news->connected) { $self->echo_response_($news, $client, $command ); Index: Proxy.pm =================================================================== RCS file: /cvsroot/popfile/engine/Proxy/Proxy.pm,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** Proxy.pm 18 Mar 2003 02:26:41 -0000 1.8 --- Proxy.pm 18 Mar 2003 15:28:45 -0000 1.9 *************** *** 341,345 **** print $client $_; #$self->tee_($client, $_); ! # The termination has to be a single line with exactly a dot on it and nothing # else other than line termination characters. This is vital so that we do --- 341,345 ---- print $client $_; #$self->tee_($client, $_); ! # The termination has to be a single line with exactly a dot on it and nothing # else other than line termination characters. This is vital so that we do *************** *** 427,435 **** if ( $response ) { # Echo the response up to the mail client ! $self->tee_( $client, $response ); return $response; } } ! if (!null_resp) { # An error has occurred reading from the mail server --- 427,435 ---- if ( $response ) { # Echo the response up to the mail client ! $self->tee_( $client, $response ); return $response; } } ! if (!null_resp) { # An error has occurred reading from the mail server *************** *** 439,443 **** $self->tee_($client, ""); return ""; ! } } --- 439,443 ---- $self->tee_($client, ""); return ""; ! } } |
From: <ssc...@us...> - 2003-03-18 02:26:46
|
Update of /cvsroot/popfile/engine/Proxy In directory sc8-pr-cvs1:/tmp/cvs-serv15847 Modified Files: Proxy.pm Log Message: backout unintended change in last commit (made echo_to_dot verbose -- woops) Index: Proxy.pm =================================================================== RCS file: /cvsroot/popfile/engine/Proxy/Proxy.pm,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** Proxy.pm 18 Mar 2003 02:24:26 -0000 1.7 --- Proxy.pm 18 Mar 2003 02:26:41 -0000 1.8 *************** *** 339,344 **** last if ( $self->{alive_} == 0 ); ! #print $client $_; ! $self->tee_($client, $_); # The termination has to be a single line with exactly a dot on it and nothing --- 339,344 ---- last if ( $self->{alive_} == 0 ); ! print $client $_; ! #$self->tee_($client, $_); # The termination has to be a single line with exactly a dot on it and nothing |