--- 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' => "$trackback->subject")), 'trackback', $trackback->trid);
}
- watchdog('spam', t('Deleted trackback %subject. 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 %subject', 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' => "$trackback->subject")), '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 %subject. 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 %subject', 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' => "$trackback->subject")), '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 %subject. 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' => "$trackback->subject")), '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) {