/[Apache-SVN]/spamassassin/trunk/lib/Mail/SpamAssassin/Client.pm
ViewVC logotype

Diff of /spamassassin/trunk/lib/Mail/SpamAssassin/Client.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

--- spamassassin/trunk/lib/Mail/SpamAssassin/Client.pm	2005/05/18 12:19:41	170739
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Client.pm	2005/05/18 12:29:42	170740
@@ -219,10 +219,27 @@ sub learn {
 
   my $msgsize = length($msg.$EOL);
 
-  print $remote "LEARN $PROTOVERSION$EOL";
+  print $remote "TELL $PROTOVERSION$EOL";
   print $remote "Content-length: $msgsize$EOL";
   print $remote "User: $self->{username}$EOL" if ($self->{username});
-  print $remote "Learn-type: $learntype$EOL";
+
+  if ($learntype == 0) {
+    print $remote "Message-class: spam$EOL";
+    print $remote "Set: local$EOL";
+  }
+  elsif ($learntype == 1) {
+    print $remote "Message-class: ham$EOL";
+    print $remote "Set: local$EOL";
+  }
+  elsif ($learntype == 2) {
+    print $remote "Remove: local$EOL";
+  }
+  else { # bad learntype
+    $self->{resp_code} = 00;
+    $self->{resp_msg} = 'do not know';
+    return undef;
+  }
+
   print $remote "$EOL";
   print $remote $msg;
   print $remote "$EOL";
@@ -236,17 +253,19 @@ sub learn {
 
   return undef unless ($resp_code == 0);
 
-  my $learned_p = 0;
   my $found_blank_line_p = 0;
 
+  my $did_set;
+  my $did_remove;
+
   while (!$found_blank_line_p) {
     $line = <$remote>;
 
-    if ($line =~ /Learned: yes/i) {
-      $learned_p = 1;
+    if ($line =~ /DidSet: (.*)/i) {
+      $did_set = $1;
     }
-    elsif ($line =~ /Learned: no/i) {
-      $learned_p = 0;
+    elsif ($line =~ /DidRemove: (.*)/i) {
+      $did_remove = $1;
     }
     elsif ($line =~ /$EOL/) {
       $found_blank_line_p = 1;
@@ -255,7 +274,12 @@ sub learn {
 
   close $remote;
 
-  return $learned_p;
+  if ($learntype == 0 || $learntype == 1) {
+    return $did_set =~ /local/;
+  }
+  else { #safe since we've already checked the $learntype values
+    return $did_remove =~ /local/;
+  }
 }
 
 =head2 report
@@ -270,7 +294,49 @@ This method provides the report interfac
 sub report {
   my ($self, $msg) = @_;
 
-  return $self->_report_or_revoke($msg, 0);
+  $self->_clear_errors();
+
+  my $remote = $self->_create_connection();
+
+  return undef unless ($remote);
+
+  my $msgsize = length($msg.$EOL);
+
+  print $remote "TELL $PROTOVERSION$EOL";
+  print $remote "Content-length: $msgsize$EOL";
+  print $remote "User: $self->{username}$EOL" if ($self->{username});
+  print $remote "Message-class: spam$EOL";
+  print $remote "Set: local,remote$EOL";
+  print $remote "$EOL";
+  print $remote $msg;
+  print $remote "$EOL";
+
+  my $line = <$remote>;
+
+  my ($version, $resp_code, $resp_msg) = $self->_parse_response_line($line);
+
+  $self->{resp_code} = $resp_code;
+  $self->{resp_msg} = $resp_msg;
+
+  return undef unless ($resp_code == 0);
+
+  my $reported_p = 0;
+  my $found_blank_line_p = 0;
+
+  while (!$reported_p && !$found_blank_line_p) {
+    $line = <$remote>;
+
+    if ($line =~ /DidSet:\s+.*remote/i) {
+      $reported_p = 1;
+    }
+    elsif ($line =~ /^$EOL$/) {
+      $found_blank_line_p = 1;
+    }
+  }
+
+  close $remote;
+
+  return $reported_p;
 }
 
 =head2 revoke
@@ -285,7 +351,50 @@ This method provides the revoke interfac
 sub revoke {
   my ($self, $msg) = @_;
 
-  return $self->_report_or_revoke($msg, 1);
+  $self->_clear_errors();
+
+  my $remote = $self->_create_connection();
+
+  return undef unless ($remote);
+
+  my $msgsize = length($msg.$EOL);
+
+  print $remote "TELL $PROTOVERSION$EOL";
+  print $remote "Content-length: $msgsize$EOL";
+  print $remote "User: $self->{username}$EOL" if ($self->{username});
+  print $remote "Message-class: ham$EOL";
+  print $remote "Set: local$EOL";
+  print $remote "Remove: remote$EOL";
+  print $remote "$EOL";
+  print $remote $msg;
+  print $remote "$EOL";
+
+  my $line = <$remote>;
+
+  my ($version, $resp_code, $resp_msg) = $self->_parse_response_line($line);
+
+  $self->{resp_code} = $resp_code;
+  $self->{resp_msg} = $resp_msg;
+
+  return undef unless ($resp_code == 0);
+
+  my $revoked_p = 0;
+  my $found_blank_line_p = 0;
+
+  while (!$revoked_p && !$found_blank_line_p) {
+    $line = <$remote>;
+
+    if ($line =~ /DidRemove:\s+remote/i) {
+      $revoked_p = 1;
+    }
+    elsif ($line =~ /^$EOL$/) {
+      $found_blank_line_p = 1;
+    }
+  }
+
+  close $remote;
+
+  return $revoked_p;
 }
 
 
@@ -393,72 +502,5 @@ sub _clear_errors {
   $self->{resp_msg} = undef;
 }
 
-
-=head2 _report_or_revoke
-
-public instance (Boolean) report_or_revoke (String $msg, Integer $reporttype)
-
-Description:
-This method implements the report or revoke call.  C<$learntype> should
-be an integer, 0 for report or 1 for revoke.  The return value is a
-boolean indicating if the message was learned or not.
-
-An undef return value indicates that there was an error and you
-should check the resp_code/resp_error values to determine what
-the error was.
-
-=cut
-
-sub _report_or_revoke {
-  my ($self, $msg, $reporttype) = @_;
-
-  $self->_clear_errors();
-
-  my $remote = $self->_create_connection();
-
-  return undef unless ($remote);
-
-  my $msgsize = length($msg.$EOL);
-
-  print $remote "COLLABREPORT $PROTOVERSION$EOL";
-  print $remote "Content-length: $msgsize$EOL";
-  print $remote "User: $self->{username}$EOL" if ($self->{username});
-  print $remote "CollabReport-type: $reporttype$EOL";
-  print $remote "$EOL";
-  print $remote $msg;
-  print $remote "$EOL";
-
-  my $line = <$remote>;
-
-  my ($version, $resp_code, $resp_msg) = $self->_parse_response_line($line);
-
-  $self->{resp_code} = $resp_code;
-  $self->{resp_msg} = $resp_msg;
-
-  return undef unless ($resp_code == 0);
-
-  my $reported_p = 0;
-  my $found_blank_line_p = 0;
-
-  while (!$found_blank_line_p) {
-    $line = <$remote>;
-
-    if ($line =~ /Reported: yes/i) {
-      $reported_p = 1;
-    }
-    elsif ($line =~ /Reported: no/i) {
-      $reported_p = 0;
-    }
-    elsif ($line =~ /$EOL/) {
-      $found_blank_line_p = 1;
-    }
-  }
-
-  close $remote;
-
-  return $reported_p;
-}
-
-
 1;
 

 

infrastructure at apache.org
ViewVC Help
Powered by ViewVC 1.1.26