--- 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) {