--- trackback.module	2006-06-14 00:00:12.000000000 +0800
+++ trackback_4.module	2007-01-08 16:32:14.003196389 +0800
@@ -46,16 +46,41 @@
       module_invoke('spam', 'ip_filter', 'trackback', $trackback->trid);
     }
 
-    watchdog('trackback', t('trackback: added \'%subject\'', array('%subject' => $trackback->subject)), WATCHDOG_NOTICE, l(t('view trackback'), 'node/'. $node->nid .'#trackback-'. $trackback->trid));
+    if (module_exist('akismet')) {
+      
+      $trackback->status = trackback_get_akismet_publish_status ( $trackback );
+
+      
+    }
+
+    if (-1 == $trackback->status ) {
+        //don't store, wait
+        sleep(20);
+        _trackback_nice_watchdog ('ignore spam trackback', $trackback );
+        
+
+        // If requested to, generate a delay so the spammer has to wait for a while.
+        if (($seconds = variable_get('akismet_antispambot_delay', 60)) > 0) {
+          sleep($seconds);
+        }
+    } else
+    {
+  //    watchdog('trackback', t('trackback: added \'%subject\'', array('%subject' => $trackback->subject)), WATCHDOG_NOTICE, l(t('view trackback'), 'node/'. $node->nid .'#trackback-'. $trackback->trid));
+  
+        _trackback_nice_watchdog ('added trackback', $trackback, true );
+    
+        db_query("INSERT INTO {trackback_received} (trid, nid, created, site, name, subject, url, excerpt, status) VALUES (%d, %d, %d, '%s', '%s', '%s', '%s', '%s', %d)", $trackback->trid, $trackback->nid, $trackback->created, $trackback->site, $trackback->name, $trackback->subject, $trackback->url, $trackback->excerpt, $trackback->status);
+        $error = 0;
+    
+        if (function_exists('spam_content_filter') && variable_get('trackback_spam_filter', 1)) {
+          // invoke spam.module's spam filter
+          $subject = "$trackback->subject $trackback->url";
+          module_invoke('spam', 'content_filter', 'trackback', $trackback->trid, $subject, $trackback->excerpt);
+        }
+      
+    }
 
-    db_query("INSERT INTO {trackback_received} (trid, nid, created, site, name, subject, url, excerpt, status) VALUES (%d, %d, %d, '%s', '%s', '%s', '%s', '%s', %d)", $trackback->trid, $trackback->nid, $trackback->created, $trackback->site, $trackback->name, $trackback->subject, $trackback->url, $trackback->excerpt, $trackback->status);
-    $error = 0;
 
-    if (function_exists('spam_content_filter') && variable_get('trackback_spam_filter', 1)) {
-      // invoke spam.module's spam filter
-      $subject = "$trackback->subject $trackback->url";
-      module_invoke('spam', 'content_filter', 'trackback', $trackback->trid, $subject, $trackback->excerpt);
-    }
   }
   else {
     $error = 1;
@@ -104,6 +129,15 @@
     $links = array();
     $links[] = l(t('edit'), 'admin/trackback/edit/'. $trackback->trid);
     $links[] = l(t('delete'), 'admin/trackback/delete/'. $trackback->trid);
+
+    $links[] = l(t('unpublish'), 'admin/trackback/unpublish/'. $trackback->trid);
+    if (module_exist('akismet')) {
+      if ($trackback->status==1) 
+          $links[] = l(t('submit spam'), 'admin/trackback/akismet-submit-spam/'. $trackback->trid);
+      if ($trackback->status==0) 
+          $links[] = l(t('submit ham'), 'admin/trackback/akismet-submit-ham/'. $trackback->trid);
+//      $links = array_merge($links, trackback_akismet_link($trackback));
+    }
     if (module_exist('spam')) {
       $links = array_merge($links, trackback_spam_link($trackback));
     }
@@ -143,6 +177,8 @@
   }
 }
 
+
+
 function trackback_form_alter($form_id, &$form) {
   if (isset($form['type']) && $form['type']['#value'] .'_node_settings' == $form_id) {
     $type = $form['type']['#value'];
@@ -344,9 +380,57 @@
     if (arg(0) == 'admin' && arg(1) == 'trackback' && arg(2) == 'delete' && is_numeric(arg(3))) {
       $trackback = db_fetch_object(db_query('SELECT * FROM {trackback_received} WHERE trid=%d', arg(3)));
       if (isset($trackback->nid)) {
-        $items[] = array('path' => 'admin/trackback/delete/'. arg(3), 'title' => t('delete trackback'), 'callback' => 'trackback_received_delete', 'access' => (user_access('administer trackbacks') || node_access('update', node_load($trackback->nid))), 'type' => MENU_CALLBACK);
+        $items[] = array('path' => 'admin/trackback/delete/'. arg(3), 'title' => t('delete trackback'), 'callback' => 'trackback_received_delete', 
+        'access' => (user_access('administer trackbacks') || node_access('update', node_load($trackback->nid))), 
+        'type' => MENU_CALLBACK);
       }
     }
+
+
+    // Paths may look like 'admin/trackback/akismet-submit-spam/content_id'
+    if ( arg(0) == 'admin' && arg(1) == 'trackback' && is_numeric(arg(3))) {
+      $content_type=arg(1);
+//      if ($content_type == 'node' || ($content_type == 'comment' && module_exist('comment'))) {
+
+      //code could also be used later when moved to akismet module
+      if ($content_type == 'trackback' ) {
+        $op = arg(2);
+        $id = arg(3);
+        if ($op == 'publish' || $op == 'unpublish') {
+          $callback = 'trackback_callback_set_published_status';
+        }
+        else if ($op == 'akismet-submit-spam' || $op == 'akismet-submit-ham') {
+          $callback = 'trackback_callback_set_spam_status';
+        }
+        if (isset($callback)) {
+//          $moderator_type = akismet_content_get_moderator_type($content_type, arg(2));
+       ##   if (!empty($moderator_type)) {
+            $items[] = array('path' => 'admin/trackback', 'title' => t('switch content status'),
+              'callback' => $callback,
+              'access' => (user_access('administer trackbacks') || node_access('update', node_load($trackback->nid))), 
+  //            'access' => akismet_is_spam_moderator($moderator_type),
+              'type' => MENU_CALLBACK);
+        ##  }
+        }
+      }
+    }
+
+
+/*    
+    elseif (arg(0) == 'admin' && arg(1) == 'trackback' && arg(2) == 'akismet-submit-spam' && is_numeric(arg(3))) {
+      $trackback = db_fetch_object(db_query('SELECT * FROM {trackback_received} WHERE trid=%d', arg(3)));
+      if (isset($trackback->nid)) {
+        trackback_submit_spam ( arg(3) );
+        $items[] = array('path' => 'admin/trackback/delete/'. arg(3), 'title' => t('delete trackback'), 'callback' => 'trackback_submit_spam', 'access' => (user_access('administer trackbacks') || node_access('update', node_load($trackback->nid))), 'type' => MENU_CALLBACK);
+      }
+    }
+    elseif (arg(0) == 'admin' && arg(1) == 'trackback' && arg(2) == 'akismet-submit-ham' && is_numeric(arg(3))) {
+      $trackback = db_fetch_object(db_query('SELECT * FROM {trackback_received} WHERE trid=%d', arg(3)));
+      if (isset($trackback->nid)) {
+        $items[] = array('path' => 'admin/trackback/delete/'. arg(3), 'title' => t('delete trackback'), 'callback' => 'trackback_submit_ham', 'access' => (user_access('administer trackbacks') || node_access('update', node_load($trackback->nid))), 'type' => MENU_CALLBACK);
+      }
+    }
+*/    
   }
   return $items;
 }
@@ -373,10 +457,20 @@
     $operations['spam_publish_trackback'] = t('Publish the selected trackbacks');
   }
   if (module_exist('spam')) {
-    $operations['spam_delete_trackback'] = t('Delete the selected trackbacks (no confirmation)');
+    $operations['spam_delete_trackback'] = t('Delete the selected trackbacks (via Spam, no confirmation)');
   }
   else {
-    $operations['trackback_delete'] = t('Delete the selected trackbacks (no confirmation)');
+    $operations['norm_delete_trackback'] = t('Delete the selected trackbacks (no confirmation)');
+  }
+
+  if (module_exist('akismet')) {
+    $operations['akismet_check_trackback'] = t('Check/unpublish the selected trackbacks via Akismet, no confirmation)');
+
+    $operations['trackback_akismet_submit_spam'] = t('Submit spam/delete for the selected trackbacks via Akismet, no confirmation)');
+
+    $operations['trackback_akismet_submit_ham'] = t('Submit ham for the selected trackbacks via Akismet, no confirmation)');
+
+    $operations['akismet_checkdel_trackback'] = t('Check/delete the selected trackbacks via Akismet, no confirmation)');
   }
 
   if ($op = $_POST['op']) {
@@ -401,7 +495,11 @@
     $sql = 'SELECT tr.* FROM {trackback_received} tr WHERE tr.status = '. db_escape_string($status);
   }
   $sql .= tablesort_sql(trackback_admin_table_header($spam_module_exists));
-  $result = pager_query($sql, 50);
+  // better use akismet_records_per_page settings instead of hardcoded 50 per page
+  $result = pager_query($sql, 
+#    variable_get('akismet_records_per_page', 50)
+1000
+  );
   
   $form = array();
   $form['trackbacks'] = array('#theme' => 'trackback_admin_table');
@@ -413,7 +511,8 @@
     $form['trackbacks'][$trackback->trid] = array();
     $form['trackbacks'][$trackback->trid][] = array('#type' => 'value', '#value' => l($trackback->subject, $trackback->status ? 'node/'. $trackback->nid : 'admin/trackback/edit/'. $trackback->trid, array('title' => truncate_utf8($trackback->excerpt, 128)), NULL, $trackback->status ? 'trackback-'. $trackback->trid : NULL) .' '. theme('mark', node_mark($trackback->nid, $trackback->created)));
     $form['trackbacks'][$trackback->trid][] = array('#type' => 'value', '#value' => theme('username', $trackback));
-    $form['trackbacks'][$trackback->trid][] = array('#type' => 'value', '#value' => $trackback->site);
+    $form['trackbacks'][$trackback->trid][] = array('#type' => 'value', '#value' => 
+      l( $trackback->site, url('http://www.dnsstuff.com/tools/whois.ch?ip='. $trackback->site)    ) );
     $form['trackbacks'][$trackback->trid][] = array('#type' => 'value', '#value' => $trackback->status != 0 ? t('Published') : t('Not published'));
     if ($spam_module_exists) {
       $form['trackbacks'][$trackback->trid][] = array('#type' => 'value', '#value' => $trackback->probability >= variable_get('spam_threshold', 80) ? t('Spam') : t('Not Spam'));
@@ -699,7 +798,7 @@
     db_query("DELETE FROM {spam_tracker} WHERE id = %d AND source = 'trackback'", $trackback->trid);
     spam_log(SPAM_LOG, t('spam_delete_trackback: deleted trackback "%subject".', array('%subject' => "<em>$trackback->subject</em>")), 'trackback', $trackback->trid);
   }
-  watchdog('spam', t('Deleted trackback <em>%subject</em>.  The trackback was posted to %link.', array('%subject' => "$trackback->subject", '%link' => l(url('node/'. $trackback->nid, NULL, NULL, TRUE), url('node/'. $trackback->nid)))));
+  _trackback_nice_watchdog ('deleted trackback', $trackback );
 }
 
 function trackback_admin_edit() {
@@ -758,11 +857,12 @@
     $operations['spam_notspam_trackback'] = t('Mark the selected trackbacks as not spam');
   }
   $operations['spam_publish_trackback'] = t('Publish the selected trackbacks');
+
   if (module_exist('spam')) {
     $operations['spam_delete_trackback'] = t('Delete the selected trackbacks (no confirmation)');
   }
   else {
-    $operations['trackback_delete'] = t('Delete the selected trackbacks (no confirmation)');
+    $operations['norm_delete_trackback'] = t('Delete the selected trackbacks (no confirmation)');
   }
 
   if ($op = $_POST['op']) {
@@ -897,6 +997,7 @@
   return $links;
 }
 
+
 function trackback_block($op = 'list', $delta = 0) {
   $num = variable_get('trackbacks_display_number', 10);
   if ($op == 'list') {
@@ -924,28 +1025,228 @@
   $trackback = trackback_load($trid);
   db_query('UPDATE {trackback_received} SET status = 1 WHERE trid = %d', $trackback->trid);
 	cache_clear_all();
-  watchdog('spam', t('Spam: published trackback <em>%subject</em>', array('%subject' => l("$trackback->subject", url("admin/trackback/edit/$trackback->trid")))), WATCHDOG_NOTICE, l(t('view trackback'), url("node/$trackback->nid#trackback-$trackback->trid")));
+
+  _trackback_nice_watchdog ('published trackback', $trackback, true );
+  
   if (module_exist('spam')) {
     spam_log(SPAM_LOG, t('spam_publish_trackback: published trackback "%subject".', array('%subject' => "<em>$trackback->subject</em>")), 'trackback', $trackback->trid);
   }
 }
 
+function _trackback_nice_watchdog ( $operation, $trackback, $addedit=false, $errorlevel=WATCHDOG_NOTICE ) {
+
+  if ($addedit) 
+    $addeditstr = 
+    /*l(t(' view trackback'), "node/$trackback->nid", NULL,NULL, "trackback-$trackback->trid")
+    .*/
+    l(t(' edit trackback'), "admin/trackback/edit/$trackback->trid" );
+  else
+    $addeditstr ='';
+    
+  watchdog('trackback', 
+  $operation.t(' %subj1 from %ipa <em>%subject</em>.  The trackback spam was posted to %link  by %ip.', 
+     array(
+      '%subject' => l("$trackback->subject", "admin/trackback/edit/$trackback->trid" ), 
+      '%link' => l(url('node/'. $trackback->nid, NULL, NULL, TRUE), 'node/'. $trackback->nid),
+      '%ip' => l( "$trackback->site", url('http://www.dnsstuff.com/tools/whois.ch?ip='. $trackback->site) ),
+      '%ipa' => $trackback->site,
+      '%subj1' => $trackback->subject
+    )
+  )  , $errorlevel, 
+  
+  l( " IPWHOIS ", url('http://www.dnsstuff.com/tools/whois.ch?ip='. $trackback->site) )
+  .$addeditstr
+  );
+
+
+}
+
 function spam_unpublish_trackback($trid) {
   $trackback = trackback_load($trid);
   db_query('UPDATE {trackback_received} SET status = 0 WHERE trid = %d', $trackback->trid);
 	cache_clear_all();
-  watchdog('spam', t('Spam: unpublished trackback <em>%subject</em>', array('%subject' => l("$trackback->subject", url("admin/trackback/edit/$trackback->trid")))), WATCHDOG_NOTICE, l(t('view trackback'), url("node/$trackback->nid#trackback-$trackback->trid")));
+  
+  _trackback_nice_watchdog ('unpublished trackback', $trackback );
+  
+
   if (module_exist('spam')) {
     spam_log(SPAM_LOG, t('spam_unpublish_trackback: unpublished trackback "%subject".', array('%subject' => "<em>$trackback->subject</em>")), 'trackback', $trackback->trid);
   }
 }
 
+
 function spam_delete_trackback($trid) {
-  $trackback = trackback_load($trid);
-  db_query('DELETE FROM {trackback_received} WHERE trid = %d', $trackback->trid);
-  db_query("DELETE FROM {spam_tracker} WHERE id = %d AND source = 'trackback'", $trackback->trid);
-  watchdog('spam', t('Spam: deleted trackback <em>%subject</em>.  The trackback spam was posted to %link.', array('%subject' => "$trackback->subject", '%link' => l(url('node/'. $trackback->nid, NULL, NULL, TRUE), url('node/'. $trackback->nid)))));
-  spam_log(SPAM_LOG, t('spam_delete_trackback: deleted trackback "%subject".', array('%subject' => "<em>$trackback->subject</em>")), 'trackback', $trackback->trid);
+ if ($trackback = trackback_load($trid)) {
+ trackback_delete($trackback);
+ }
+}
+
+function norm_delete_trackback($trid) {
+ if ($trackback = trackback_load($trid)) {
+ trackback_delete($trackback);
+ }
+}
+
+
+/**
+ * Menu callback; publish/unpublish content.
+ *
+ * @param string Content type; it can be 'node' or 'comment'.
+ * @param integer Content ID; can be either a nid or a cid.
+ * @param string Operation; it can be 'publish' or 'unpublish'.
+ */
+function trackback_callback_set_published_status($op, $content_id) {
+  // Load the content (existence has been checked in hook_menu).
+
+  $content = trackback_load($content_id);
+
+  $is_published = ($content->status == 1 ? TRUE : FALSE);
+
+  ##drupal_set_message ("in set publish: $op - $content_id -  $is_published");
+  
+  if ($op == 'publish' && !$is_published) {
+    spam_publish_trackback ($content_id);
+  }
+  else if ($op == 'unpublish' && $is_published) {
+    spam_unpublish_trackback ($content_id);
+    drupal_set_message ("trackback $content_id unpublished");
+  }
+
+  drupal_goto('node/'. $content->nid, NULL, 'trackback-'. $content_id);
+}
+
+
+function trackback_akismet_prepare_comment_data($content_type, $content) {
+  // Prepare data that is common to nodes/comments.
+  $comment_data = array(
+    // IP address of the comment submitter.
+    'user_ip' => (!empty($content->hostname) ? $content->hostname : $_SERVER['REMOTE_ADDR']),
+    // User agent information of the comment submitter.
+    'user_agent' => $_SERVER['HTTP_USER_AGENT'],
+    // The content of the HTTP_REFERER header should be sent here.
+    'referrer' => $_SERVER['HTTP_REFERER'],
+    // May be blank, comment, trackback, pingback, or a made up value like "registration".
+    'comment_type' => '',
+    // Submitted name with the comment.
+    'comment_author' => $content->name,
+  );
+
+  // Prepare data that varies depending on type of content.
+  if ($content_type == 'trackback') {
+    $comment_data['permalink'] = url('node/'. $content->nid, NULL, 'trackback-'. $content->trid, TRUE);
+    $comment_data['comment_author_email'] = ''; //no mail in tracktrack?
+    $comment_data['comment_author_url'] = $content->url;
+    $comment_data['comment_content'] = $content->excerpt;
+    $comment_data['comment_type'] = 'trackback';
+    $comment_data['user_ip'] = $content->site;
+  }
+  return $comment_data;
+}
+
+function trackback_get_akismet_publish_status ($trackback) {
+
+      $akismet_api_result = akismet_api_cmd_comment_check(
+             trackback_akismet_prepare_comment_data ('trackback',$trackback)
+            );
+
+      //preset with unpublished
+      $trackback->status = 0;
+
+      if ($akismet_api_result == AKISMET_API_RESULT_IS_HAM) {
+        //future: akismet_notify_moderators('trackback', $trackback, ($trackback->status == 1 ? TRUE : FALSE), FALSE);
+        $trackback->status = 1;
+      }
+      
+      if ($akismet_api_result == AKISMET_API_RESULT_IS_SPAM) {
+        $trackback->status = -1;
+        variable_set('akismet_counter_spam', akismet_get_spam_counter() + 1);
+        
+        //future: maybe even discard silently
+        
+      }
+
+      if ($akismet_api_result == AKISMET_API_RESULT_ERROR) {
+        $trackback->status = 0;
+      }
+
+
+  return $trackback->status;
+}
+
+
+function trackback_akismet_submit_spam ($trid) {
+
+  if ($trackback = trackback_load($trid)) {
+
+      $akismet_api_result = akismet_api_cmd_submit_spam(
+             trackback_akismet_prepare_comment_data ('trackback',$trackback)
+            );
+
+      if ($akismet_api_result == AKISMET_API_RESULT_ERROR) {
+        _trackback_err_watchdog ('failed to submit spam for trackback', $trackback, true, WATCHDOG_ERROR );
+      }
+      else {
+        trackback_delete ($trackback);
+        ///### no double watchdog logs _trackback_nice_watchdog ('submitted spam + deleted for trackback', $trackback );
+      }  
+
+  }
+  return $akismet_api_result;
+}
+
+function trackback_akismet_submit_ham ($trid) {
+
+  if ($trackback = trackback_load($trid)) {
+  
+      $akismet_api_result = akismet_api_cmd_submit_ham(
+             trackback_akismet_prepare_comment_data ('trackback',$trackback)
+            );
+
+      if ($akismet_api_result == AKISMET_API_RESULT_ERROR) {
+        _trackback_err_watchdog ('failed to submit ham for trackback', $trackback, true, WATCHDOG_ERROR );
+      }
+      else ;
+        ///### no double watchdog _trackback_nice_watchdog ('submitted ham for trackback', $trackback );
+
+  }
+  return $akismet_api_result;
+}
+
+
+
+
+function akismet_check_trackback($trid) {
+ if ($trackback = trackback_load($trid)) {
+    
+    $status = trackback_get_akismet_publish_status( $trackback );
+    
+    if (1 == $status ) {
+      spam_publish_trackback ($trid);
+    }
+    else
+      spam_unpublish_trackback ($trid);
+    
+#    drupal_set_message ( "Subject is : ".$trackback->subject );
+#    drupal_set_message ( "AKISMET result is : ".$status );
+ 
+ }
+}
+
+function akismet_checkdel_trackback($trid) {
+ if ($trackback = trackback_load($trid)) {
+    
+    $status = trackback_get_akismet_publish_status( $trackback );
+    
+    if (1 == $status ) {
+      spam_publish_trackback ($trid);
+    }
+    else
+      trackback_delete ($trackback);
+    
+#    drupal_set_message ( "Subject is : ".$trackback->subject );
+#    drupal_set_message ( "AKISMET result is : ".$status );
+ 
+ }
 }
 
 function spam_notspam_trackback($trid) {
