Ticket #16100: 16100-remove-files.patch
| File 16100-remove-files.patch, 80.3 KB (added by , 15 years ago) |
|---|
-
wp-content/plugins/akismet/admin.php
1 <?php2 add_action( 'admin_menu', 'akismet_config_page' );3 add_action( 'admin_menu', 'akismet_stats_page' );4 akismet_admin_warnings();5 6 function akismet_admin_init() {7 global $wp_version;8 9 // all admin functions are disabled in old versions10 if ( !function_exists('is_multisite') && version_compare( $wp_version, '3.0', '<' ) ) {11 12 function akismet_version_warning() {13 echo "14 <div id='akismet-warning' class='updated fade'><p><strong>".sprintf(__('Akismet %s requires WordPress 3.0 or higher.'), AKISMET_VERSION) ."</strong> ".sprintf(__('Please <a href="%s">upgrade WordPress</a> to a current version, or <a href="%s">downgrade to version 2.4 of the Akismet plugin</a>.'), 'http://codex.wordpress.org/Upgrading_WordPress', 'http://wordpress.org/extend/plugins/akismet/download/'). "</p></div>15 ";16 }17 add_action('admin_notices', 'akismet_version_warning');18 19 return;20 }21 22 if ( function_exists( 'get_plugin_page_hook' ) )23 $hook = get_plugin_page_hook( 'akismet-stats-display', 'index.php' );24 else25 $hook = 'dashboard_page_akismet-stats-display';26 add_action('admin_head-'.$hook, 'akismet_stats_script');27 add_meta_box('akismet-status', __('Comment History'), 'akismet_comment_status_meta_box', 'comment', 'normal');28 wp_register_style('akismet.css', AKISMET_PLUGIN_URL . 'akismet.css');29 wp_enqueue_style('akismet.css');30 wp_register_script('akismet.js', AKISMET_PLUGIN_URL . 'akismet.js', array('jquery'));31 wp_enqueue_script('akismet.js');32 }33 add_action('admin_init', 'akismet_admin_init');34 35 function akismet_nonce_field($action = -1) { return wp_nonce_field($action); }36 $akismet_nonce = 'akismet-update-key';37 38 function akismet_config_page() {39 if ( function_exists('add_submenu_page') )40 add_submenu_page('plugins.php', __('Akismet Configuration'), __('Akismet Configuration'), 'manage_options', 'akismet-key-config', 'akismet_conf');41 }42 43 function akismet_plugin_action_links( $links, $file ) {44 if ( $file == plugin_basename( dirname(__FILE__).'/akismet.php' ) ) {45 $links[] = '<a href="plugins.php?page=akismet-key-config">'.__('Settings').'</a>';46 }47 48 return $links;49 }50 51 add_filter( 'plugin_action_links', 'akismet_plugin_action_links', 10, 2 );52 53 function akismet_conf() {54 global $akismet_nonce, $wpcom_api_key;55 56 if ( isset($_POST['submit']) ) {57 if ( function_exists('current_user_can') && !current_user_can('manage_options') )58 die(__('Cheatin’ uh?'));59 60 check_admin_referer( $akismet_nonce );61 $key = preg_replace( '/[^a-h0-9]/i', '', $_POST['key'] );62 $home_url = parse_url( get_bloginfo('url') );63 64 if ( empty($key) ) {65 $key_status = 'empty';66 $ms[] = 'new_key_empty';67 delete_option('wordpress_api_key');68 } elseif ( empty($home_url['host']) ) {69 $key_status = 'empty';70 $ms[] = 'bad_home_url';71 } else {72 $key_status = akismet_verify_key( $key );73 }74 75 if ( $key_status == 'valid' ) {76 update_option('wordpress_api_key', $key);77 $ms[] = 'new_key_valid';78 } else if ( $key_status == 'invalid' ) {79 $ms[] = 'new_key_invalid';80 } else if ( $key_status == 'failed' ) {81 $ms[] = 'new_key_failed';82 }83 84 if ( isset( $_POST['akismet_discard_month'] ) )85 update_option( 'akismet_discard_month', 'true' );86 else87 update_option( 'akismet_discard_month', 'false' );88 89 if ( isset( $_POST['akismet_show_user_comments_approved'] ) )90 update_option( 'akismet_show_user_comments_approved', 'true' );91 else92 update_option( 'akismet_show_user_comments_approved', 'false' );93 94 } elseif ( isset($_POST['check']) ) {95 akismet_get_server_connectivity(0);96 }97 98 if ( empty( $key_status) || $key_status != 'valid' ) {99 $key = get_option('wordpress_api_key');100 if ( empty( $key ) ) {101 if ( empty( $key_status ) || $key_status != 'failed' ) {102 if ( akismet_verify_key( '1234567890ab' ) == 'failed' )103 $ms[] = 'no_connection';104 else105 $ms[] = 'key_empty';106 }107 $key_status = 'empty';108 } else {109 $key_status = akismet_verify_key( $key );110 }111 if ( $key_status == 'valid' ) {112 $ms[] = 'key_valid';113 } else if ( $key_status == 'invalid' ) {114 delete_option('wordpress_api_key');115 $ms[] = 'key_empty';116 } else if ( !empty($key) && $key_status == 'failed' ) {117 $ms[] = 'key_failed';118 }119 }120 121 $messages = array(122 'new_key_empty' => array('color' => 'aa0', 'text' => __('Your key has been cleared.')),123 'new_key_valid' => array('color' => '4AB915', 'text' => __('Your key has been verified. Happy blogging!')),124 'new_key_invalid' => array('color' => '888', 'text' => __('The key you entered is invalid. Please double-check it.')),125 'new_key_failed' => array('color' => '888', 'text' => __('The key you entered could not be verified because a connection to akismet.com could not be established. Please check your server configuration.')),126 'no_connection' => array('color' => '888', 'text' => __('There was a problem connecting to the Akismet server. Please check your server configuration.')),127 'key_empty' => array('color' => 'aa0', 'text' => sprintf(__('Please enter an API key. (<a href="%s" style="color:#fff">Get your key.</a>)'), 'http://akismet.com/get/')),128 'key_valid' => array('color' => '4AB915', 'text' => __('This key is valid.')),129 'key_failed' => array('color' => 'aa0', 'text' => __('The key below was previously validated but a connection to akismet.com can not be established at this time. Please check your server configuration.')),130 'bad_home_url' => array('color' => '888', 'text' => sprintf( __('Your WordPress home URL %s is invalid. Please fix the <a href="%s">home option</a>.'), esc_html( get_bloginfo('url') ), admin_url('options.php#home') ) ),131 );132 ?>133 <?php if ( !empty($_POST['submit'] ) ) : ?>134 <div id="message" class="updated fade"><p><strong><?php _e('Options saved.') ?></strong></p></div>135 <?php endif; ?>136 <div class="wrap">137 <h2><?php _e('Akismet Configuration'); ?></h2>138 <?php if (isset($_GET['message']) && $_GET['message'] == 'success') { ?>139 <div class="updated below-h2" id="message"><p><?php _e( '<strong>Sign up success!</strong> Please check your email for your Akismet API Key and enter it below.' ); ?></p></div>140 <?php } ?>141 <div class="narrow">142 <form action="" method="post" id="akismet-conf" style="margin: auto; width: 400px; ">143 <?php if ( !$wpcom_api_key ) { ?>144 <p><?php printf(__('For many people, <a href="%1$s">Akismet</a> will greatly reduce or even completely eliminate the comment and trackback spam you get on your site. If one does happen to get through, simply mark it as "spam" on the moderation screen and Akismet will learn from the mistakes. If you don\'t have an API key yet, you can get one at <a href="%2$s">Akismet.com</a>.'), 'http://akismet.com/', 'http://akismet.com/get/'); ?></p>145 146 <h3><label for="key"><?php _e('Akismet API Key'); ?></label></h3>147 <?php foreach ( $ms as $m ) : ?>148 <p style="padding: .5em; background-color: #<?php echo $messages[$m]['color']; ?>; color: #fff; font-weight: bold;"><?php echo $messages[$m]['text']; ?></p>149 <?php endforeach; ?>150 <p><input id="key" name="key" type="text" size="15" maxlength="12" value="<?php echo get_option('wordpress_api_key'); ?>" style="font-family: 'Courier New', Courier, mono; font-size: 1.5em;" /> (<?php _e('<a href="http://akismet.com/get/">What is this?</a>'); ?>)</p>151 <?php if ( isset( $invalid_key) && $invalid_key ) { ?>152 <h3><?php _e('Why might my key be invalid?'); ?></h3>153 <p><?php _e('This can mean one of two things, either you copied the key wrong or that the plugin is unable to reach the Akismet servers, which is most often caused by an issue with your web host around firewalls or similar.'); ?></p>154 <?php } ?>155 <?php } ?>156 <?php akismet_nonce_field($akismet_nonce) ?>157 <p><label><input name="akismet_discard_month" id="akismet_discard_month" value="true" type="checkbox" <?php if ( get_option('akismet_discard_month') == 'true' ) echo ' checked="checked" '; ?> /> <?php _e('Auto-delete spam submitted on posts more than a month old.'); ?></label></p>158 <p><label><input name="akismet_show_user_comments_approved" id="akismet_show_user_comments_approved" value="true" type="checkbox" <?php if ( get_option('akismet_show_user_comments_approved') == 'true' ) echo ' checked="checked" '; ?> /> <?php _e('Show the number of comments you\'ve approved beside each comment author.'); ?></label></p>159 <p class="submit"><input type="submit" name="submit" value="<?php _e('Update options »'); ?>" /></p>160 </form>161 162 <form action="" method="post" id="akismet-connectivity" style="margin: auto; width: 400px; ">163 164 <h3><?php _e('Server Connectivity'); ?></h3>165 <?php166 if ( !function_exists('fsockopen') || !function_exists('gethostbynamel') ) {167 ?>168 <p style="padding: .5em; background-color: #888; color: #fff; font-weight:bold;"><?php _e('Network functions are disabled.'); ?></p>169 <p><?php echo sprintf( __('Your web host or server administrator has disabled PHP\'s <code>fsockopen</code> or <code>gethostbynamel</code> functions. <strong>Akismet cannot work correctly until this is fixed.</strong> Please contact your web host or firewall administrator and give them <a href="%s" target="_blank">this information about Akismet\'s system requirements</a>.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p>170 <?php171 } else {172 $servers = akismet_get_server_connectivity();173 $fail_count = count($servers) - count( array_filter($servers) );174 if ( is_array($servers) && count($servers) > 0 ) {175 // some connections work, some fail176 if ( $fail_count > 0 && $fail_count < count($servers) ) { ?>177 <p style="padding: .5em; background-color: #aa0; color: #fff; font-weight:bold;"><?php _e('Unable to reach some Akismet servers.'); ?></p>178 <p><?php echo sprintf( __('A network problem or firewall is blocking some connections from your web server to Akismet.com. Akismet is working but this may cause problems during times of network congestion. Please contact your web host or firewall administrator and give them <a href="%s" target="_blank">this information about Akismet and firewalls</a>.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p>179 <?php180 // all connections fail181 } elseif ( $fail_count > 0 ) { ?>182 <p style="padding: .5em; background-color: #888; color: #fff; font-weight:bold;"><?php _e('Unable to reach any Akismet servers.'); ?></p>183 <p><?php echo sprintf( __('A network problem or firewall is blocking all connections from your web server to Akismet.com. <strong>Akismet cannot work correctly until this is fixed.</strong> Please contact your web host or firewall administrator and give them <a href="%s" target="_blank">this information about Akismet and firewalls</a>.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p>184 <?php185 // all connections work186 } else { ?>187 <p style="padding: .5em; background-color: #4AB915; color: #fff; font-weight:bold;"><?php _e('All Akismet servers are available.'); ?></p>188 <p><?php _e('Akismet is working correctly. All servers are accessible.'); ?></p>189 <?php190 }191 } else {192 ?>193 <p style="padding: .5em; background-color: #888; color: #fff; font-weight:bold;"><?php _e('Unable to find Akismet servers.'); ?></p>194 <p><?php echo sprintf( __('A DNS problem or firewall is preventing all access from your web server to Akismet.com. <strong>Akismet cannot work correctly until this is fixed.</strong> Please contact your web host or firewall administrator and give them <a href="%s" target="_blank">this information about Akismet and firewalls</a>.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p>195 <?php196 }197 }198 199 if ( !empty($servers) ) {200 ?>201 <table style="width: 100%;">202 <thead><th><?php _e('Akismet server'); ?></th><th><?php _e('Network Status'); ?></th></thead>203 <tbody>204 <?php205 asort($servers);206 foreach ( $servers as $ip => $status ) {207 $color = ( $status ? '#4AB915' : '#888');208 ?>209 <tr>210 <td><?php echo htmlspecialchars($ip); ?></td>211 <td style="padding: 0 .5em; font-weight:bold; color: #fff; background-color: <?php echo $color; ?>"><?php echo ($status ? __('Accessible') : __('Re-trying') ); ?></td>212 213 <?php214 }215 }216 ?>217 </tbody>218 </table>219 <p><?php if ( get_option('akismet_connectivity_time') ) echo sprintf( __('Last checked %s ago.'), human_time_diff( get_option('akismet_connectivity_time') ) ); ?></p>220 <p class="submit"><input type="submit" name="check" value="<?php _e('Check network status »'); ?>" /></p>221 <p><?php printf( __('<a href="%s" target="_blank">Click here</a> to confirm that <a href="%s" target="_blank">Akismet.com is up</a>.'), 'http://status.automattic.com/9931/136079/Akismet-API', 'http://status.automattic.com/9931/136079/Akismet-API' ); ?></p>222 </form>223 224 </div>225 </div>226 <?php227 }228 229 function akismet_stats_page() {230 if ( function_exists('add_submenu_page') )231 add_submenu_page('index.php', __('Akismet Stats'), __('Akismet Stats'), 'manage_options', 'akismet-stats-display', 'akismet_stats_display');232 233 }234 235 function akismet_stats_script() {236 ?>237 <script type="text/javascript">238 function resizeIframe() {239 var height = document.documentElement.clientHeight;240 height -= document.getElementById('akismet-stats-frame').offsetTop;241 height += 100; // magic padding242 243 document.getElementById('akismet-stats-frame').style.height = height +"px";244 245 };246 function resizeIframeInit() {247 document.getElementById('akismet-stats-frame').onload = resizeIframe;248 window.onresize = resizeIframe;249 }250 addLoadEvent(resizeIframeInit);251 </script><?php252 }253 254 255 function akismet_stats_display() {256 global $akismet_api_host, $akismet_api_port, $wpcom_api_key;257 $blog = urlencode( get_bloginfo('url') );258 259 $url = 'http://';260 if ( is_ssl() )261 $url = 'https://';262 263 $url .= 'akismet.com/web/1.0/user-stats.php';264 $url .= "?blog={$blog}&api_key=" . akismet_get_key();265 ?>266 <div class="wrap">267 <iframe src="<?php echo $url; ?>" width="100%" height="100%" frameborder="0" id="akismet-stats-frame"></iframe>268 </div>269 <?php270 }271 272 function akismet_stats() {273 if ( !function_exists('did_action') || did_action( 'rightnow_end' ) ) // We already displayed this info in the "Right Now" section274 return;275 if ( !$count = get_option('akismet_spam_count') )276 return;277 $path = plugin_basename(__FILE__);278 echo '<h3>' . _x( 'Spam', 'comments' ) . '</h3>';279 global $submenu;280 if ( isset( $submenu['edit-comments.php'] ) )281 $link = 'edit-comments.php';282 else283 $link = 'edit.php';284 echo '<p>'.sprintf( _n( '<a href="%1$s">Akismet</a> has protected your site from <a href="%2$s">%3$s spam comments</a>.', '<a href="%1$s">Akismet</a> has protected your site from <a href="%2$s">%3$s spam comments</a>.', $count ), 'http://akismet.com/', clean_url("$link?page=akismet-admin"), number_format_i18n($count) ).'</p>';285 }286 add_action('activity_box_end', 'akismet_stats');287 288 function akismet_admin_warnings() {289 global $wpcom_api_key;290 if ( !get_option('wordpress_api_key') && !$wpcom_api_key && !isset($_POST['submit']) ) {291 function akismet_warning() {292 echo "293 <div id='akismet-warning' class='updated fade'><p><strong>".__('Akismet is almost ready.')."</strong> ".sprintf(__('You must <a href="%1$s">enter your Akismet API key</a> for it to work.'), "plugins.php?page=akismet-key-config")."</p></div>294 ";295 }296 add_action('admin_notices', 'akismet_warning');297 return;298 } elseif ( ( empty($_SERVER['SCRIPT_FILENAME']) || basename($_SERVER['SCRIPT_FILENAME']) == 'edit-comments.php' ) && wp_next_scheduled('akismet_schedule_cron_recheck') ) {299 function akismet_warning() {300 global $wpdb;301 $waiting = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->commentmeta WHERE meta_key = 'akismet_error'" ) );302 $next_check = human_time_diff( wp_next_scheduled('akismet_schedule_cron_recheck') );303 if ( $waiting > 0 )304 echo "305 <div id='akismet-warning' class='updated fade'><p><strong>".__('Akismet has detected a problem.')."</strong> ".sprintf(_n('A server or network problem prevented Akismet from checking %d comment. It has been temporarily held for moderation and will be automatically re-checked in %s.', 'A server or network problem prevented Akismet from checking %d comments. They have been temporarily held for moderation and will be automatically re-checked in %s.', $waiting), number_format_i18n( $waiting ), $next_check)."</p></div>306 ";307 }308 add_action('admin_notices', 'akismet_warning');309 return;310 }311 }312 313 // FIXME placeholder314 315 function akismet_comment_row_action( $a, $comment ) {316 317 // failsafe for old WP versions318 if ( !function_exists('add_comment_meta') )319 return $a;320 321 $akismet_result = get_comment_meta( $comment->comment_ID, 'akismet_result', true );322 $user_result = get_comment_meta( $comment->comment_ID, 'akismet_user_result', true);323 $comment_status = wp_get_comment_status( $comment->comment_ID );324 $desc = null;325 if ( !$user_result || $user_result == $akismet_result ) {326 // Show the original Akismet result if the user hasn't overridden it, or if their decision was the same327 if ( $akismet_result == 'true' && $comment_status != 'spam' && $comment_status != 'trash' )328 $desc = __( 'Flagged as spam by Akismet' );329 elseif ( $akismet_result == 'false' && $comment_status == 'spam' )330 $desc = __( 'Cleared by Akismet' );331 } else {332 $who = get_comment_meta( $comment->comment_ID, 'akismet_user', true );333 if ( $user_result == 'true' )334 $desc = sprintf( __('Flagged as spam by %s'), $who );335 else336 $desc = sprintf( __('Un-spammed by %s'), $who );337 }338 339 // add a History item to the hover links, just after Edit340 if ( $akismet_result ) {341 $b = array();342 foreach ( $a as $k => $item ) {343 $b[ $k ] = $item;344 if ( $k == 'edit' )345 $b['history'] = '<a href="comment.php?action=editcomment&c='.$comment->comment_ID.'#akismet-status" title="'. esc_attr__( 'View comment history' ) . '"> '. __('History') . '</a>';346 }347 348 $a = $b;349 }350 351 if ( $desc )352 echo '<span class="akismet-status" commentid="'.$comment->comment_ID.'"><a href="comment.php?action=editcomment&c='.$comment->comment_ID.'#akismet-status" title="' . esc_attr__( 'View comment history' ) . '">'.htmlspecialchars($desc).'</a></span>';353 354 if ( apply_filters( 'akismet_show_user_comments_approved', get_option('akismet_show_user_comments_approved') ) == 'true' ) {355 $comment_count = akimset_get_user_comments_approved( $comment->user_id, $comment->comment_author_email, $comment->comment_author, $comment->comment_author_url );356 echo '<span class="akismet-user-comment-count" commentid="'.$comment->comment_ID.'" style="display:none;"><br><span class="akismet-user-comment-counts">'.sprintf( _n( '%s approved', '%s approved', $comment_count ), intval($comment_count) ).'</span></span>';357 }358 359 return $a;360 }361 362 add_filter( 'comment_row_actions', 'akismet_comment_row_action', 10, 2 );363 364 function akismet_comment_status_meta_box($comment) {365 $history = akismet_get_comment_history( $comment->comment_ID );366 367 if ( $history ) {368 echo '<div class="akismet-history" style="margin: 13px;">';369 foreach ( $history as $row ) {370 $time = date( 'D d M Y @ h:i:m a', $row['time'] ) . ' GMT';371 echo '<div style="margin-bottom: 13px;"><span style="color: #999;" alt="' . $time . '" title="' . $time . '">' . sprintf( __('%s ago'), human_time_diff( $row['time'] ) ) . '</span> - ';372 echo htmlspecialchars( $row['message'] ) . '</div>';373 }374 375 echo '</div>';376 377 }378 }379 380 381 // add an extra column header to the comments screen382 function akismet_comments_columns( $columns ) {383 $columns[ 'akismet' ] = __( 'Akismet' );384 return $columns;385 }386 387 #add_filter( 'manage_edit-comments_columns', 'akismet_comments_columns' );388 389 // Show stuff in the extra column390 function akismet_comment_column_row( $column, $comment_id ) {391 if ( $column != 'akismet' )392 return;393 394 $history = akismet_get_comment_history( $comment_id );395 396 if ( $history ) {397 echo '<dl class="akismet-history">';398 foreach ( $history as $row ) {399 echo '<dt>' . sprintf( __('%s ago'), human_time_diff( $row['time'] ) ) . '</dt>';400 echo '<dd>' . htmlspecialchars( $row['message'] ) . '</dd>';401 }402 403 echo '</dl>';404 }405 }406 407 #add_action( 'manage_comments_custom_column', 'akismet_comment_column_row', 10, 2 );408 409 // END FIXME410 411 // call out URLS in comments412 function akismet_text_add_link_callback( $m ) {413 414 // bare link?415 if ( $m[4] == $m[2] )416 return '<a '.$m[1].' href="'.$m[2].'" '.$m[3].' class="comment-link">'.$m[4].'</a>';417 else418 return '<span title="'.$m[2].'" class="comment-link"><a '.$m[1].' href="'.$m[2].'" '.$m[3].' class="comment-link">'.$m[4].'</a></span>';419 }420 421 function akismet_text_add_link_class( $comment_text ) {422 423 return preg_replace_callback( '#<a ([^>]*)href="([^"]+)"([^>]*)>(.*?)</a>#i', 'akismet_text_add_link_callback', $comment_text );424 }425 426 add_filter('comment_text', 'akismet_text_add_link_class');427 428 429 // WP 2.5+430 function akismet_rightnow() {431 global $submenu, $wp_db_version;432 433 $plural_func = '__ngettext';434 if ( function_exists( '_n' ) )435 $plural_func = '_n';436 437 // clean_url was deprecated in WP 3.0438 $esc_url = 'clean_url';439 if ( function_exists( 'esc_url' ) )440 $esc_url = 'esc_url';441 442 if ( 8645 < $wp_db_version ) // 2.7443 $link = 'edit-comments.php?comment_status=spam';444 elseif ( isset( $submenu['edit-comments.php'] ) )445 $link = 'edit-comments.php?page=akismet-admin';446 else447 $link = 'edit.php?page=akismet-admin';448 449 if ( $count = get_option('akismet_spam_count') ) {450 $intro = sprintf( $plural_func(451 '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comment already. ',452 '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comments already. ',453 $count454 ), 'http://akismet.com/', number_format_i18n( $count ) );455 } else {456 $intro = sprintf( __('<a href="%1$s">Akismet</a> blocks spam from getting to your blog. '), 'http://akismet.com/' );457 }458 459 if ( $queue_count = akismet_spam_count() ) {460 $queue_text = sprintf( $plural_func(461 'There\'s <a href="%2$s">%1$s comment</a> in your spam queue right now.',462 'There are <a href="%2$s">%1$s comments</a> in your spam queue right now.',463 $queue_count464 ), number_format_i18n( $queue_count ), $esc_url($link) );465 } else {466 $queue_text = sprintf( __( "There's nothing in your <a href='%1\$s'>spam queue</a> at the moment." ), $esc_url($link) );467 }468 469 $text = $intro . '<br />' . $queue_text;470 echo "<p class='akismet-right-now'>$text</p>\n";471 }472 473 add_action('rightnow_end', 'akismet_rightnow');474 475 476 // For WP >= 2.5477 function akismet_check_for_spam_button($comment_status) {478 if ( 'approved' == $comment_status )479 return;480 if ( function_exists('plugins_url') )481 $link = 'admin.php?action=akismet_recheck_queue';482 else483 $link = 'edit-comments.php?page=akismet-admin&recheckqueue=true&noheader=true';484 echo "</div><div class='alignleft'><a class='button-secondary checkforspam' href='$link'>" . __('Check for Spam') . "</a>";485 }486 add_action('manage_comments_nav', 'akismet_check_for_spam_button');487 488 function akismet_submit_nonspam_comment ( $comment_id ) {489 global $wpdb, $akismet_api_host, $akismet_api_port, $current_user, $current_site;490 $comment_id = (int) $comment_id;491 492 $comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'");493 if ( !$comment ) // it was deleted494 return;495 496 // use the original version stored in comment_meta if available497 $as_submitted = get_comment_meta( $comment_id, 'akismet_as_submitted', true);498 if ( $as_submitted && is_array($as_submitted) && isset($as_submitted['comment_content']) ) {499 $comment = (object) array_merge( (array)$comment, $as_submitted );500 }501 502 $comment->blog = get_bloginfo('url');503 $comment->blog_lang = get_locale();504 $comment->blog_charset = get_option('blog_charset');505 $comment->permalink = get_permalink($comment->comment_post_ID);506 $comment->reporter_ip = $_SERVER['REMOTE_ADDR'];507 if ( is_object($current_user) ) {508 $comment->reporter = $current_user->user_login;509 }510 if ( is_object($current_site) ) {511 $comment->site_domain = $current_site->domain;512 }513 514 $comment->user_role = '';515 if ( isset( $comment->user_ID ) )516 $comment->user_role = akismet_get_user_roles($comment->user_ID);517 518 if ( akismet_test_mode() )519 $comment->is_test = 'true';520 521 $query_string = '';522 foreach ( $comment as $key => $data )523 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';524 525 $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-ham", $akismet_api_port);526 if ( $comment->reporter ) {527 akismet_update_comment_history( $comment_id, sprintf( __('%s reported this comment as not spam'), $comment->reporter ), 'report-ham' );528 update_comment_meta( $comment_id, 'akismet_user_result', 'false' );529 update_comment_meta( $comment_id, 'akismet_user', $comment->reporter );530 }531 532 do_action('akismet_submit_nonspam_comment', $comment_id, $response[1]);533 }534 535 function akismet_submit_spam_comment ( $comment_id ) {536 global $wpdb, $akismet_api_host, $akismet_api_port, $current_user, $current_site;537 $comment_id = (int) $comment_id;538 539 $comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'");540 if ( !$comment ) // it was deleted541 return;542 if ( 'spam' != $comment->comment_approved )543 return;544 545 // use the original version stored in comment_meta if available546 $as_submitted = get_comment_meta( $comment_id, 'akismet_as_submitted', true);547 if ( $as_submitted && is_array($as_submitted) && isset($as_submitted['comment_content']) ) {548 $comment = (object) array_merge( (array)$comment, $as_submitted );549 }550 551 $comment->blog = get_bloginfo('url');552 $comment->blog_lang = get_locale();553 $comment->blog_charset = get_option('blog_charset');554 $comment->permalink = get_permalink($comment->comment_post_ID);555 $comment->reporter_ip = $_SERVER['REMOTE_ADDR'];556 if ( is_object($current_user) ) {557 $comment->reporter = $current_user->user_login;558 }559 if ( is_object($current_site) ) {560 $comment->site_domain = $current_site->domain;561 }562 563 $comment->user_role = '';564 if ( isset( $comment->user_ID ) )565 $comment->user_role = akismet_get_user_roles($comment->user_ID);566 567 if ( akismet_test_mode() )568 $comment->is_test = 'true';569 570 $query_string = '';571 foreach ( $comment as $key => $data )572 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';573 574 $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-spam", $akismet_api_port);575 if ( $comment->reporter ) {576 akismet_update_comment_history( $comment_id, sprintf( __('%s reported this comment as spam'), $comment->reporter ), 'report-spam' );577 update_comment_meta( $comment_id, 'akismet_user_result', 'true' );578 update_comment_meta( $comment_id, 'akismet_user', $comment->reporter );579 }580 do_action('akismet_submit_spam_comment', $comment_id, $response[1]);581 }582 583 // For WP 2.7+584 function akismet_transition_comment_status( $new_status, $old_status, $comment ) {585 if ( $new_status == $old_status )586 return;587 588 if ( !is_admin() )589 return;590 591 if ( !current_user_can( 'edit_post', $comment->comment_post_ID ) && !current_user_can( 'moderate_comments' ) )592 return;593 594 if ( defined('WP_IMPORTING') && WP_IMPORTING == true )595 return;596 597 global $current_user;598 $reporter = '';599 if ( is_object( $current_user ) )600 $reporter = $current_user->user_login;601 602 // Assumption alert:603 // We want to submit comments to Akismet only when a moderator explicitly spams or approves it - not if the status604 // is changed automatically by another plugin. Unfortunately WordPress doesn't provide an unambiguous way to605 // determine why the transition_comment_status action was triggered. And there are several different ways by which606 // to spam and unspam comments: bulk actions, ajax, links in moderation emails, the dashboard, and perhaps others.607 // We'll assume that this is an explicit user action if POST or GET has an 'action' key.608 if ( isset($_POST['action']) || isset($_GET['action']) ) {609 if ( $new_status == 'spam' && ( $old_status == 'approved' || $old_status == 'unapproved' || !$old_status ) ) {610 return akismet_submit_spam_comment( $comment->comment_ID );611 } elseif ( $old_status == 'spam' && ( $new_status == 'approved' || $new_status == 'unapproved' ) ) {612 return akismet_submit_nonspam_comment( $comment->comment_ID );613 }614 }615 616 if ( !get_comment_meta( $comment->comment_ID, 'akismet_rechecking' ) )617 akismet_update_comment_history( $comment->comment_ID, sprintf( __('%s changed the comment status to %s'), $reporter, $new_status ), 'status-' . $new_status );618 }619 620 add_action( 'transition_comment_status', 'akismet_transition_comment_status', 10, 3 );621 622 // Total spam in queue623 // get_option( 'akismet_spam_count' ) is the total caught ever624 function akismet_spam_count( $type = false ) {625 global $wpdb;626 627 if ( !$type ) { // total628 $count = wp_cache_get( 'akismet_spam_count', 'widget' );629 if ( false === $count ) {630 if ( function_exists('wp_count_comments') ) {631 $count = wp_count_comments();632 $count = $count->spam;633 } else {634 $count = (int) $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam'");635 }636 wp_cache_set( 'akismet_spam_count', $count, 'widget', 3600 );637 }638 return $count;639 } elseif ( 'comments' == $type || 'comment' == $type ) { // comments640 $type = '';641 } else { // pingback, trackback, ...642 $type = $wpdb->escape( $type );643 }644 645 return (int) $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam' AND comment_type='$type'");646 }647 648 649 function akismet_recheck_queue() {650 global $wpdb, $akismet_api_host, $akismet_api_port;651 652 if ( ! ( isset( $_GET['recheckqueue'] ) || ( isset( $_REQUEST['action'] ) && 'akismet_recheck_queue' == $_REQUEST['action'] ) ) )653 return;654 655 $moderation = $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = '0'", ARRAY_A );656 foreach ( (array) $moderation as $c ) {657 $c['user_ip'] = $c['comment_author_IP'];658 $c['user_agent'] = $c['comment_agent'];659 $c['referrer'] = '';660 $c['blog'] = get_bloginfo('url');661 $c['blog_lang'] = get_locale();662 $c['blog_charset'] = get_option('blog_charset');663 $c['permalink'] = get_permalink($c['comment_post_ID']);664 665 $c['user_role'] = '';666 if ( isset( $c['user_ID'] ) )667 $c['user_role'] = akismet_get_user_roles($c['user_ID']);668 669 if ( akismet_test_mode() )670 $c['is_test'] = 'true';671 672 $id = (int) $c['comment_ID'];673 674 $query_string = '';675 foreach ( $c as $key => $data )676 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';677 678 $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port);679 if ( 'true' == $response[1] ) {680 wp_set_comment_status($c['comment_ID'], 'spam');681 update_comment_meta( $c['comment_ID'], 'akismet_result', 'true' );682 akismet_update_comment_history( $c['comment_ID'], __('Akismet re-checked and caught this comment as spam'), 'check-spam' );683 684 } elseif ( 'false' == $response[1] ) {685 update_comment_meta( $c['comment_ID'], 'akismet_result', 'false' );686 akismet_update_comment_history( $c['comment_ID'], __('Akismet re-checked and cleared this comment'), 'check-ham' );687 // abnormal result: error688 } else {689 update_comment_meta( $c['comment_ID'], 'akismet_result', 'error' );690 akismet_update_comment_history( $c['comment_ID'], sprintf( __('Akismet was unable to re-check this comment (response: %s)'), $response[1]), 'check-error' );691 }692 693 }694 wp_redirect( $_SERVER['HTTP_REFERER'] );695 exit;696 }697 698 add_action('admin_action_akismet_recheck_queue', 'akismet_recheck_queue');699 700 // Check connectivity between the WordPress blog and Akismet's servers.701 // Returns an associative array of server IP addresses, where the key is the IP address, and value is true (available) or false (unable to connect).702 function akismet_check_server_connectivity() {703 global $akismet_api_host, $akismet_api_port, $wpcom_api_key;704 705 $test_host = 'rest.akismet.com';706 707 // Some web hosts may disable one or both functions708 if ( !function_exists('fsockopen') || !function_exists('gethostbynamel') )709 return array();710 711 $ips = gethostbynamel($test_host);712 if ( !$ips || !is_array($ips) || !count($ips) )713 return array();714 715 $servers = array();716 foreach ( $ips as $ip ) {717 $response = akismet_verify_key( akismet_get_key(), $ip );718 // even if the key is invalid, at least we know we have connectivity719 if ( $response == 'valid' || $response == 'invalid' )720 $servers[$ip] = true;721 else722 $servers[$ip] = false;723 }724 725 return $servers;726 }727 728 // Check the server connectivity and store the results in an option.729 // Cached results will be used if not older than the specified timeout in seconds; use $cache_timeout = 0 to force an update.730 // Returns the same associative array as akismet_check_server_connectivity()731 function akismet_get_server_connectivity( $cache_timeout = 86400 ) {732 $servers = get_option('akismet_available_servers');733 if ( (time() - get_option('akismet_connectivity_time') < $cache_timeout) && $servers !== false )734 return $servers;735 736 // There's a race condition here but the effect is harmless.737 $servers = akismet_check_server_connectivity();738 update_option('akismet_available_servers', $servers);739 update_option('akismet_connectivity_time', time());740 return $servers;741 }742 743 // Returns true if server connectivity was OK at the last check, false if there was a problem that needs to be fixed.744 function akismet_server_connectivity_ok() {745 // skip the check on WPMU because the status page is hidden746 global $wpcom_api_key;747 if ( $wpcom_api_key )748 return true;749 $servers = akismet_get_server_connectivity();750 return !( empty($servers) || !count($servers) || count( array_filter($servers) ) < count($servers) );751 }752 -
wp-content/plugins/akismet/akismet.css
1 #submitted-on { position: relative; }2 #the-comment-list .author { padding-bottom: 5px !important; white-space: nowrap; }3 #the-comment-list .author a { padding-left: 42px !important; }4 #the-comment-list .author img { position: absolute; top: 0; left: 0; }5 #the-comment-list .author strong { padding-left: 42px; font-size: 12px; position: relative; }6 #the-comment-list .author .akismet-user-comment-count { display: inline; }7 #the-comment-list .author .akismet-user-comment-counts { padding-left: 42px; }8 #dashboard_recent_comments .akismet-status { display: none; } /* never show the flagged by text on the dashboard */9 .akismet-status { float: right; }10 .akismet-status a { color: #AAA; font-style: italic; }11 span.comment-link a { text-decoration: underline; }12 span.comment-link:after { content: " " attr(title) " "; color: #aaa; text-decoration: none; }13 No newline at end of file -
wp-content/plugins/akismet/akismet.js
Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
1 jQuery(document).ready(function () {2 jQuery('.akismet-status').each(function () {3 var thisId = jQuery(this).attr('commentid');4 jQuery(this).prependTo('#comment-' + thisId + ' .column-comment div:first-child');5 });6 jQuery('.akismet-user-comment-count').each(function () {7 var thisId = jQuery(this).attr('commentid');8 jQuery(this).insertAfter('#comment-' + thisId + ' .author strong:first').show();9 });10 }); -
wp-content/plugins/akismet/akismet.php
1 <?php2 /**3 * @package Akismet4 */5 /*6 Plugin Name: Akismet7 Plugin URI: http://akismet.com/8 Description: Used by millions, Akismet is quite possibly the best way in the world to <strong>protect your blog from comment and track-back spam</strong>. It keeps your site protected from spam even while you sleep. To get started: 1) Click the "Activate" link to the left of this description, 2) <a href="http://akismet.com/get/?return=true">Sign up for an Akismet API key</a>, and 3) Go to your <a href="plugins.php?page=akismet-key-config">Akismet configuration</a> page, and save your API key.9 Version: 2.5.110 Author: Automattic11 Author URI: http://automattic.com/wordpress-plugins/12 License: GPLv213 */14 15 /*16 This program is free software; you can redistribute it and/or17 modify it under the terms of the GNU General Public License18 as published by the Free Software Foundation; either version 219 of the License, or (at your option) any later version.20 21 This program is distributed in the hope that it will be useful,22 but WITHOUT ANY WARRANTY; without even the implied warranty of23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the24 GNU General Public License for more details.25 26 You should have received a copy of the GNU General Public License27 along with this program; if not, write to the Free Software28 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.29 */30 31 define('AKISMET_VERSION', '2.5.0');32 define('AKISMET_PLUGIN_URL', plugin_dir_url( __FILE__ ));33 34 /** If you hardcode a WP.com API key here, all key config screens will be hidden */35 if ( defined('WPCOM_API_KEY') )36 $wpcom_api_key = constant('WPCOM_API_KEY');37 else38 $wpcom_api_key = '';39 40 // Make sure we don't expose any info if called directly41 if ( !function_exists( 'add_action' ) ) {42 echo "Hi there! I'm just a plugin, not much I can do when called directly.";43 exit;44 }45 46 if ( isset($wp_db_version) && $wp_db_version <= 9872 )47 include_once dirname( __FILE__ ) . '/legacy.php';48 49 include_once dirname( __FILE__ ) . '/widget.php';50 51 if ( is_admin() )52 require_once dirname( __FILE__ ) . '/admin.php';53 54 function akismet_init() {55 global $wpcom_api_key, $akismet_api_host, $akismet_api_port;56 57 if ( $wpcom_api_key )58 $akismet_api_host = $wpcom_api_key . '.rest.akismet.com';59 else60 $akismet_api_host = get_option('wordpress_api_key') . '.rest.akismet.com';61 62 $akismet_api_port = 80;63 }64 add_action('init', 'akismet_init');65 66 function akismet_get_key() {67 global $wpcom_api_key;68 if ( !empty($wpcom_api_key) )69 return $wpcom_api_key;70 return get_option('wordpress_api_key');71 }72 73 function akismet_verify_key( $key, $ip = null ) {74 global $akismet_api_host, $akismet_api_port, $wpcom_api_key;75 $blog = urlencode( get_option('home') );76 if ( $wpcom_api_key )77 $key = $wpcom_api_key;78 $response = akismet_http_post("key=$key&blog=$blog", 'rest.akismet.com', '/1.1/verify-key', $akismet_api_port, $ip);79 if ( !is_array($response) || !isset($response[1]) || $response[1] != 'valid' && $response[1] != 'invalid' )80 return 'failed';81 return $response[1];82 }83 84 // if we're in debug or test modes, use a reduced service level so as not to polute training or stats data85 function akismet_test_mode() {86 if ( defined('AKISMET_TEST_MODE') && AKISMET_TEST_MODE )87 return true;88 return false;89 }90 91 // return a comma-separated list of role names for the given user92 function akismet_get_user_roles($user_id ) {93 $roles = false;94 95 if ( !class_exists('WP_User') )96 return false;97 98 if ( $user_id > 0 ) {99 $comment_user = new WP_User($user_id);100 if ( isset($comment_user->roles) )101 $roles = join(',', $comment_user->roles);102 }103 104 return $roles;105 }106 107 // Returns array with headers in $response[0] and body in $response[1]108 function akismet_http_post($request, $host, $path, $port = 80, $ip=null) {109 global $wp_version;110 111 $akismet_ua = "WordPress/{$wp_version} | ";112 $akismet_ua .= 'Akismet/' . constant( 'AKISMET_VERSION' );113 114 $content_length = strlen( $request );115 116 $http_host = $host;117 // use a specific IP if provided118 // needed by akismet_check_server_connectivity()119 if ( $ip && long2ip( ip2long( $ip ) ) ) {120 $http_host = $ip;121 } else {122 $http_host = $host;123 }124 125 // use the WP HTTP class if it is available126 if ( function_exists( 'wp_remote_post' ) ) {127 $http_args = array(128 'body' => $request,129 'headers' => array(130 'Content-Type' => 'application/x-www-form-urlencoded; ' .131 'charset=' . get_option( 'blog_charset' ),132 'Host' => $host,133 'User-Agent' => $akismet_ua134 ),135 'httpversion' => '1.0'136 );137 $akismet_url = "http://{$http_host}{$path}";138 $response = wp_remote_post( $akismet_url, $http_args );139 if ( is_wp_error( $response ) )140 return '';141 142 return array( $response['headers'], $response['body'] );143 } else {144 $http_request = "POST $path HTTP/1.0\r\n";145 $http_request .= "Host: $host\r\n";146 $http_request .= 'Content-Type: application/x-www-form-urlencoded; charset=' . get_option('blog_charset') . "\r\n";147 $http_request .= "Content-Length: {$content_length}\r\n";148 $http_request .= "User-Agent: {$akismet_ua}\r\n";149 $http_request .= "\r\n";150 $http_request .= $request;151 152 $response = '';153 if( false != ( $fs = @fsockopen( $http_host, $port, $errno, $errstr, 10 ) ) ) {154 fwrite( $fs, $http_request );155 156 while ( !feof( $fs ) )157 $response .= fgets( $fs, 1160 ); // One TCP-IP packet158 fclose( $fs );159 $response = explode( "\r\n\r\n", $response, 2 );160 }161 return $response;162 }163 }164 165 // filter handler used to return a spam result to pre_comment_approved166 function akismet_result_spam( $approved ) {167 // bump the counter here instead of when the filter is added to reduce the possibility of overcounting168 if ( $incr = apply_filters('akismet_spam_count_incr', 1) )169 update_option( 'akismet_spam_count', get_option('akismet_spam_count') + $incr );170 // this is a one-shot deal171 remove_filter( 'pre_comment_approved', 'akismet_result_spam' );172 return 'spam';173 }174 175 function akismet_result_hold( $approved ) {176 // once only177 remove_filter( 'pre_comment_approved', 'akismet_result_hold' );178 return '0';179 }180 181 // how many approved comments does this author have?182 function akimset_get_user_comments_approved( $user_id, $comment_author_email, $comment_author, $comment_author_url ) {183 global $wpdb;184 185 if ( !empty($user_id) )186 return $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->comments WHERE user_id = %d AND comment_approved = 1", $user_id ) );187 188 if ( !empty($comment_author_email) )189 return $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_author_email = %s AND comment_author = %s AND comment_author_url = %s AND comment_approved = 1", $comment_author_email, $comment_author, $comment_author_url ) );190 191 return 0;192 }193 194 function akismet_microtime() {195 $mtime = explode( ' ', microtime() );196 return $mtime[1] + $mtime[0];197 }198 199 // log an event for a given comment, storing it in comment_meta200 function akismet_update_comment_history( $comment_id, $message, $event=null ) {201 global $current_user;202 203 // failsafe for old WP versions204 if ( !function_exists('add_comment_meta') )205 return false;206 207 $user = '';208 if ( is_object($current_user) && isset($current_user->user_login) )209 $user = $current_user->user_login;210 211 $event = array(212 'time' => akismet_microtime(),213 'message' => $message,214 'event' => $event,215 'user' => $user,216 );217 218 // $unique = false so as to allow multiple values per comment219 $r = add_comment_meta( $comment_id, 'akismet_history', $event, false );220 }221 222 // get the full comment history for a given comment, as an array in reverse chronological order223 function akismet_get_comment_history( $comment_id ) {224 225 // failsafe for old WP versions226 if ( !function_exists('add_comment_meta') )227 return false;228 229 $history = get_comment_meta( $comment_id, 'akismet_history', false );230 usort( $history, 'akismet_cmp_time' );231 return $history;232 }233 234 function akismet_cmp_time( $a, $b ) {235 return $a['time'] > $b['time'] ? -1 : 1;236 }237 238 // this fires on wp_insert_comment. we can't update comment_meta when akismet_auto_check_comment() runs239 // because we don't know the comment ID at that point.240 function akismet_auto_check_update_meta( $id, $comment ) {241 global $akismet_last_comment;242 243 // failsafe for old WP versions244 if ( !function_exists('add_comment_meta') )245 return false;246 247 // wp_insert_comment() might be called in other contexts, so make sure this is the same comment248 // as was checked by akismet_auto_check_comment249 if ( is_object($comment) && !empty($akismet_last_comment) && is_array($akismet_last_comment) ) {250 if ( intval($akismet_last_comment['comment_post_ID']) == intval($comment->comment_post_ID)251 && $akismet_last_comment['comment_author'] == $comment->comment_author252 && $akismet_last_comment['comment_author_email'] == $comment->comment_author_email ) {253 // normal result: true or false254 if ( $akismet_last_comment['akismet_result'] == 'true' ) {255 update_comment_meta( $comment->comment_ID, 'akismet_result', 'true' );256 akismet_update_comment_history( $comment->comment_ID, __('Akismet caught this comment as spam'), 'check-spam' );257 if ( $comment->comment_approved != 'spam' )258 akismet_update_comment_history( $comment->comment_ID, sprintf( __('Comment status was changed to %s'), $comment->comment_approved), 'status-changed'.$comment->comment_approved );259 } elseif ( $akismet_last_comment['akismet_result'] == 'false' ) {260 update_comment_meta( $comment->comment_ID, 'akismet_result', 'false' );261 akismet_update_comment_history( $comment->comment_ID, __('Akismet cleared this comment'), 'check-ham' );262 if ( $comment->comment_approved == 'spam' ) {263 if ( wp_blacklist_check($comment->comment_author, $comment->comment_author_email, $comment->comment_author_url, $comment->comment_content, $comment->comment_author_IP, $comment->comment_agent) )264 akismet_update_comment_history( $comment->comment_ID, __('Comment was caught by wp_blacklist_check'), 'wp-blacklisted' );265 else266 akismet_update_comment_history( $comment->comment_ID, sprintf( __('Comment status was changed to %s'), $comment->comment_approved), 'status-changed-'.$comment->comment_approved );267 }268 // abnormal result: error269 } else {270 update_comment_meta( $comment->comment_ID, 'akismet_error', time() );271 akismet_update_comment_history( $comment->comment_ID, sprintf( __('Akismet was unable to check this comment (response: %s), will automatically retry again later.'), $akismet_last_comment['akismet_result']), 'check-error' );272 }273 274 // record the complete original data as submitted for checking275 if ( isset($akismet_last_comment['comment_as_submitted']) )276 update_comment_meta( $comment->comment_ID, 'akismet_as_submitted', $akismet_last_comment['comment_as_submitted'] );277 }278 }279 }280 281 add_action( 'wp_insert_comment', 'akismet_auto_check_update_meta', 10, 2 );282 283 284 function akismet_auto_check_comment( $commentdata ) {285 global $akismet_api_host, $akismet_api_port, $akismet_last_comment;286 287 $comment = $commentdata;288 $comment['user_ip'] = $_SERVER['REMOTE_ADDR'];289 $comment['user_agent'] = $_SERVER['HTTP_USER_AGENT'];290 $comment['referrer'] = $_SERVER['HTTP_REFERER'];291 $comment['blog'] = get_option('home');292 $comment['blog_lang'] = get_locale();293 $comment['blog_charset'] = get_option('blog_charset');294 $comment['permalink'] = get_permalink($comment['comment_post_ID']);295 296 $comment['user_role'] = akismet_get_user_roles($comment['user_ID']);297 298 $akismet_nonce_option = apply_filters( 'akismet_comment_nonce', get_option( 'akismet_comment_nonce' ) );299 $comment['akismet_comment_nonce'] = 'inactive';300 if ( $akismet_nonce_option == 'true' || $akismet_nonce_option == '' ) {301 $comment['akismet_comment_nonce'] = 'failed';302 if ( isset( $_POST['akismet_comment_nonce'] ) && wp_verify_nonce( $_POST['akismet_comment_nonce'], 'akismet_comment_nonce_' . $comment['comment_post_ID'] ) )303 $comment['akismet_comment_nonce'] = 'passed';304 305 // comment reply in wp-admin306 if ( isset( $_POST['_ajax_nonce-replyto-comment'] ) && check_ajax_referer( 'replyto-comment', '_ajax_nonce-replyto-comment' ) )307 $comment['akismet_comment_nonce'] = 'passed';308 309 }310 311 if ( akismet_test_mode() )312 $comment['is_test'] = 'true';313 314 foreach ($_POST as $key => $value ) {315 if ( is_string($value) )316 $comment["POST_{$key}"] = $value;317 }318 319 $ignore = array( 'HTTP_COOKIE', 'HTTP_COOKIE2', 'PHP_AUTH_PW' );320 321 foreach ( $_SERVER as $key => $value ) {322 if ( !in_array( $key, $ignore ) && is_string($value) )323 $comment["$key"] = $value;324 else325 $comment["$key"] = '';326 }327 328 $query_string = '';329 foreach ( $comment as $key => $data )330 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';331 332 $commentdata['comment_as_submitted'] = $comment;333 334 $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port);335 $commentdata['akismet_result'] = $response[1];336 if ( 'true' == $response[1] ) {337 // akismet_spam_count will be incremented later by akismet_result_spam()338 add_filter('pre_comment_approved', 'akismet_result_spam');339 340 do_action( 'akismet_spam_caught' );341 342 $post = get_post( $comment['comment_post_ID'] );343 $last_updated = strtotime( $post->post_modified_gmt );344 $diff = time() - $last_updated;345 $diff = $diff / 86400;346 347 if ( $post->post_type == 'post' && $diff > 30 && get_option( 'akismet_discard_month' ) == 'true' && empty($comment['user_ID']) ) {348 // akismet_result_spam() won't be called so bump the counter here349 if ( $incr = apply_filters('akismet_spam_count_incr', 1) )350 update_option( 'akismet_spam_count', get_option('akismet_spam_count') + $incr );351 wp_redirect( $_SERVER['HTTP_REFERER'] );352 die();353 }354 }355 356 // if the response is neither true nor false, hold the comment for moderation and schedule a recheck357 if ( 'true' != $response[1] && 'false' != $response[1] ) {358 add_filter('pre_comment_approved', 'akismet_result_hold');359 wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' );360 }361 362 if ( function_exists('wp_next_scheduled') && function_exists('wp_schedule_event') ) {363 // WP 2.1+: delete old comments daily364 if ( !wp_next_scheduled('akismet_scheduled_delete') )365 wp_schedule_event(time(), 'daily', 'akismet_scheduled_delete');366 } elseif ( (mt_rand(1, 10) == 3) ) {367 // WP 2.0: run this one time in ten368 akismet_delete_old();369 }370 $akismet_last_comment = $commentdata;371 return $commentdata;372 }373 374 add_action('preprocess_comment', 'akismet_auto_check_comment', 1);375 376 function akismet_delete_old() {377 global $wpdb;378 $now_gmt = current_time('mysql', 1);379 $comment_ids = $wpdb->get_col("SELECT comment_id FROM $wpdb->comments WHERE DATE_SUB('$now_gmt', INTERVAL 15 DAY) > comment_date_gmt AND comment_approved = 'spam'");380 if ( empty( $comment_ids ) )381 return;382 383 $comma_comment_ids = implode( ', ', array_map('intval', $comment_ids) );384 385 do_action( 'delete_comment', $comment_ids );386 $wpdb->query("DELETE FROM $wpdb->comments WHERE comment_id IN ( $comma_comment_ids )");387 $wpdb->query("DELETE FROM $wpdb->commentmeta WHERE comment_id IN ( $comma_comment_ids )");388 clean_comment_cache( $comment_ids );389 $n = mt_rand(1, 5000);390 if ( apply_filters('akismet_optimize_table', ($n == 11)) ) // lucky number391 $wpdb->query("OPTIMIZE TABLE $wpdb->comments");392 393 }394 395 add_action('akismet_scheduled_delete', 'akismet_delete_old');396 397 function akismet_check_db_comment( $id, $recheck_reason = 'recheck_queue' ) {398 global $wpdb, $akismet_api_host, $akismet_api_port;399 400 $id = (int) $id;401 $c = $wpdb->get_row( "SELECT * FROM $wpdb->comments WHERE comment_ID = '$id'", ARRAY_A );402 if ( !$c )403 return;404 405 $c['user_ip'] = $c['comment_author_IP'];406 $c['user_agent'] = $c['comment_agent'];407 $c['referrer'] = '';408 $c['blog'] = get_option('home');409 $c['blog_lang'] = get_locale();410 $c['blog_charset'] = get_option('blog_charset');411 $c['permalink'] = get_permalink($c['comment_post_ID']);412 $id = $c['comment_ID'];413 if ( akismet_test_mode() )414 $c['is_test'] = 'true';415 $c['recheck_reason'] = $recheck_reason;416 417 $query_string = '';418 foreach ( $c as $key => $data )419 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';420 421 $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port);422 return $response[1];423 }424 425 function akismet_cron_recheck() {426 global $wpdb;427 428 delete_option('akismet_available_servers');429 430 $comment_errors = $wpdb->get_col( "431 SELECT comment_id432 FROM {$wpdb->prefix}commentmeta433 WHERE meta_key = 'akismet_error'434 LIMIT 100435 " );436 437 foreach ( (array) $comment_errors as $comment_id ) {438 // if the comment no longer exists, remove the meta entry from the queue to avoid getting stuck439 if ( !get_comment( $comment_id ) ) {440 delete_comment_meta( $comment_id, 'akismet_error' );441 continue;442 }443 444 add_comment_meta( $comment_id, 'akismet_rechecking', true );445 $status = akismet_check_db_comment( $comment_id, 'retry' );446 447 $msg = '';448 if ( $status == 'true' ) {449 $msg = __( 'Akismet caught this comment as spam during an automatic retry.' );450 } elseif ( $status == 'false' ) {451 $msg = __( 'Akismet cleared this comment during an automatic retry.' );452 }453 454 // If we got back a legit response then update the comment history455 // other wise just bail now and try again later. No point in456 // re-trying all the comments once we hit one failure.457 if ( !empty( $msg ) ) {458 delete_comment_meta( $comment_id, 'akismet_error' );459 akismet_update_comment_history( $comment_id, $msg, 'cron-retry' );460 update_comment_meta( $comment_id, 'akismet_result', $status );461 // make sure the comment status is still pending. if it isn't, that means the user has already moved it elsewhere.462 $comment = get_comment( $comment_id );463 if ( $comment && 'unapproved' == wp_get_comment_status( $comment_id ) ) {464 if ( $status == 'true' ) {465 wp_spam_comment( $comment_id );466 } elseif ( $status == 'false' ) {467 // comment is good, but it's still in the pending queue. depending on the moderation settings468 // we may need to change it to approved.469 if ( check_comment($comment->comment_author, $comment->comment_author_email, $comment->comment_author_url, $comment->comment_content, $comment->comment_author_IP, $comment->comment_agent, $comment->comment_type) )470 wp_set_comment_status( $comment_id, 1 );471 }472 }473 } else {474 delete_comment_meta( $comment_id, 'akismet_rechecking' );475 wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' );476 return;477 }478 }479 480 $remaining = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->commentmeta WHERE meta_key = 'akismet_error'" ) );481 if ( $remaining && !wp_next_scheduled('akismet_schedule_cron_recheck') ) {482 wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' );483 }484 }485 add_action( 'akismet_schedule_cron_recheck', 'akismet_cron_recheck' );486 487 function akismet_add_comment_nonce( $post_id ) {488 echo '<p style="display: none;">';489 wp_nonce_field( 'akismet_comment_nonce_' . $post_id, 'akismet_comment_nonce', FALSE );490 echo '</p>';491 }492 493 $akismet_comment_nonce_option = apply_filters( 'akismet_comment_nonce', get_option( 'akismet_comment_nonce' ) );494 495 if ( $akismet_comment_nonce_option == 'true' || $akismet_comment_nonce_option == '' )496 add_action( 'comment_form', 'akismet_add_comment_nonce' ); -
wp-content/plugins/akismet/legacy.php
1 <?php2 3 function akismet_spam_comments( $type = false, $page = 1, $per_page = 50 ) {4 global $wpdb;5 6 $page = (int) $page;7 if ( $page < 2 )8 $page = 1;9 10 $per_page = (int) $per_page;11 if ( $per_page < 1 )12 $per_page = 50;13 14 $start = ( $page - 1 ) * $per_page;15 $end = $start + $per_page;16 17 if ( $type ) {18 if ( 'comments' == $type || 'comment' == $type )19 $type = '';20 else21 $type = $wpdb->escape( $type );22 return $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' AND comment_type='$type' ORDER BY comment_date DESC LIMIT $start, $end");23 }24 25 // All26 return $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_date DESC LIMIT $start, $end");27 }28 29 // Totals for each comment type30 // returns array( type => count, ... )31 function akismet_spam_totals() {32 global $wpdb;33 $totals = $wpdb->get_results( "SELECT comment_type, COUNT(*) AS cc FROM $wpdb->comments WHERE comment_approved = 'spam' GROUP BY comment_type" );34 $return = array();35 foreach ( $totals as $total )36 $return[$total->comment_type ? $total->comment_type : 'comment'] = $total->cc;37 return $return;38 }39 40 function akismet_manage_page() {41 global $wpdb, $submenu, $wp_db_version;42 43 // WP 2.7 has its own spam management page44 if ( 8645 <= $wp_db_version )45 return;46 47 $count = sprintf(__('Akismet Spam (%s)'), akismet_spam_count());48 if ( isset( $submenu['edit-comments.php'] ) )49 add_submenu_page('edit-comments.php', __('Akismet Spam'), $count, 'moderate_comments', 'akismet-admin', 'akismet_caught' );50 elseif ( function_exists('add_management_page') )51 add_management_page(__('Akismet Spam'), $count, 'moderate_comments', 'akismet-admin', 'akismet_caught');52 }53 54 function akismet_caught() {55 global $wpdb, $comment, $akismet_caught, $akismet_nonce;56 57 akismet_recheck_queue();58 if (isset($_POST['submit']) && 'recover' == $_POST['action'] && ! empty($_POST['not_spam'])) {59 check_admin_referer( $akismet_nonce );60 if ( function_exists('current_user_can') && !current_user_can('moderate_comments') )61 die(__('You do not have sufficient permission to moderate comments.'));62 63 $i = 0;64 foreach ($_POST['not_spam'] as $comment):65 $comment = (int) $comment;66 if ( function_exists('wp_set_comment_status') )67 wp_set_comment_status($comment, 'approve');68 else69 $wpdb->query("UPDATE $wpdb->comments SET comment_approved = '1' WHERE comment_ID = '$comment'");70 akismet_submit_nonspam_comment($comment);71 ++$i;72 endforeach;73 $to = add_query_arg( 'recovered', $i, $_SERVER['HTTP_REFERER'] );74 wp_redirect( $to );75 exit;76 }77 if ('delete' == $_POST['action']) {78 check_admin_referer( $akismet_nonce );79 if ( function_exists('current_user_can') && !current_user_can('moderate_comments') )80 die(__('You do not have sufficient permission to moderate comments.'));81 82 $delete_time = $wpdb->escape( $_POST['display_time'] );83 $comment_ids = $wpdb->get_col( "SELECT comment_id FROM $wpdb->comments WHERE comment_approved = 'spam' AND '$delete_time' > comment_date_gmt" );84 if ( !empty( $comment_ids ) ) {85 do_action( 'delete_comment', $comment_ids );86 $wpdb->query( "DELETE FROM $wpdb->comments WHERE comment_id IN ( " . implode( ', ', $comment_ids ) . " )");87 wp_cache_delete( 'akismet_spam_count', 'widget' );88 }89 $to = add_query_arg( 'deleted', 'all', $_SERVER['HTTP_REFERER'] );90 wp_redirect( $to );91 exit;92 }93 94 if ( isset( $_GET['recovered'] ) ) {95 $i = (int) $_GET['recovered'];96 echo '<div class="updated"><p>' . sprintf(__('%1$s comments recovered.'), $i) . "</p></div>";97 }98 99 if (isset( $_GET['deleted'] ) )100 echo '<div class="updated"><p>' . __('All spam deleted.') . '</p></div>';101 102 if ( isset( $GLOBALS['submenu']['edit-comments.php'] ) )103 $link = 'edit-comments.php';104 else105 $link = 'edit.php';106 ?>107 <style type="text/css">108 .akismet-tabs {109 list-style: none;110 margin: 0;111 padding: 0;112 clear: both;113 border-bottom: 1px solid #ccc;114 height: 31px;115 margin-bottom: 20px;116 background: #ddd;117 border-top: 1px solid #bdbdbd;118 }119 .akismet-tabs li {120 float: left;121 margin: 5px 0 0 20px;122 }123 .akismet-tabs a {124 display: block;125 padding: 4px .5em 3px;126 border-bottom: none;127 color: #036;128 }129 .akismet-tabs .active a {130 background: #fff;131 border: 1px solid #ccc;132 border-bottom: none;133 color: #000;134 font-weight: bold;135 padding-bottom: 4px;136 }137 #akismetsearch {138 float: right;139 margin-top: -.5em;140 }141 142 #akismetsearch p {143 margin: 0;144 padding: 0;145 }146 </style>147 <div class="wrap">148 <h2><?php _e('Caught Spam') ?></h2>149 <?php150 $count = get_option( 'akismet_spam_count' );151 if ( $count ) {152 ?>153 <p><?php printf(__('Akismet has caught <strong>%1$s spam</strong> for you since you first installed it.'), number_format_i18n($count) ); ?></p>154 <?php155 }156 157 $spam_count = akismet_spam_count();158 159 if ( 0 == $spam_count ) {160 echo '<p>'.__('You have no spam currently in the queue. Must be your lucky day. :)').'</p>';161 echo '</div>';162 } else {163 echo '<p>'.__('You can delete all of the spam from your database with a single click. This operation cannot be undone, so you may wish to check to ensure that no legitimate comments got through first. Spam is automatically deleted after 15 days, so don’t sweat it.').'</p>';164 ?>165 <?php if ( !isset( $_POST['s'] ) ) { ?>166 <form method="post" action="<?php echo attribute_escape( add_query_arg( 'noheader', 'true' ) ); ?>">167 <?php akismet_nonce_field($akismet_nonce) ?>168 <input type="hidden" name="action" value="delete" />169 <?php printf(__('There are currently %1$s comments identified as spam.'), $spam_count); ?> <input type="submit" class="button delete" name="Submit" value="<?php _e('Delete all'); ?>" />170 <input type="hidden" name="display_time" value="<?php echo current_time('mysql', 1); ?>" />171 </form>172 <?php } ?>173 </div>174 <div class="wrap">175 <?php if ( isset( $_POST['s'] ) ) { ?>176 <h2><?php _e('Search'); ?></h2>177 <?php } else { ?>178 <?php echo '<p>'.__('These are the latest comments identified as spam by Akismet. If you see any mistakes, simply mark the comment as "not spam" and Akismet will learn from the submission. If you wish to recover a comment from spam, simply select the comment, and click Not Spam. After 15 days we clean out the junk for you.').'</p>'; ?>179 <?php } ?>180 <?php181 if ( isset( $_POST['s'] ) ) {182 $s = $wpdb->escape($_POST['s']);183 $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE184 (comment_author LIKE '%$s%' OR185 comment_author_email LIKE '%$s%' OR186 comment_author_url LIKE ('%$s%') OR187 comment_author_IP LIKE ('%$s%') OR188 comment_content LIKE ('%$s%') ) AND189 comment_approved = 'spam'190 ORDER BY comment_date DESC");191 } else {192 if ( isset( $_GET['apage'] ) )193 $page = (int) $_GET['apage'];194 else195 $page = 1;196 197 if ( $page < 2 )198 $page = 1;199 200 $current_type = false;201 if ( isset( $_GET['ctype'] ) )202 $current_type = preg_replace( '|[^a-z]|', '', $_GET['ctype'] );203 204 $comments = akismet_spam_comments( $current_type, $page );205 $total = akismet_spam_count( $current_type );206 $totals = akismet_spam_totals();207 ?>208 <ul class="akismet-tabs">209 <li <?php if ( !isset( $_GET['ctype'] ) ) echo ' class="active"'; ?>><a href="edit-comments.php?page=akismet-admin"><?php _e('All'); ?></a></li>210 <?php211 foreach ( $totals as $type => $type_count ) {212 if ( 'comment' == $type ) {213 $type = 'comments';214 $show = __('Comments');215 } else {216 $show = ucwords( $type );217 }218 $type_count = number_format_i18n( $type_count );219 $extra = $current_type === $type ? ' class="active"' : '';220 echo "<li $extra><a href='edit-comments.php?page=akismet-admin&ctype=$type'>$show ($type_count)</a></li>";221 }222 do_action( 'akismet_tabs' ); // so plugins can add more tabs easily223 ?>224 </ul>225 <?php226 }227 228 if ($comments) {229 ?>230 <form method="post" action="<?php echo attribute_escape("$link?page=akismet-admin"); ?>" id="akismetsearch">231 <p> <input type="text" name="s" value="<?php if (isset($_POST['s'])) echo attribute_escape($_POST['s']); ?>" size="17" />232 <input type="submit" class="button" name="submit" value="<?php echo attribute_escape(__('Search Spam »')) ?>" /> </p>233 </form>234 <?php if ( $total > 50 ) {235 $total_pages = ceil( $total / 50 );236 $r = '';237 if ( 1 < $page ) {238 $args['apage'] = ( 1 == $page - 1 ) ? '' : $page - 1;239 $r .= '<a class="prev" href="' . clean_url(add_query_arg( $args )) . '">'. __('« Previous Page') .'</a>' . "\n";240 }241 if ( ( $total_pages = ceil( $total / 50 ) ) > 1 ) {242 for ( $page_num = 1; $page_num <= $total_pages; $page_num++ ) :243 if ( $page == $page_num ) :244 $r .= "<strong>$page_num</strong>\n";245 else :246 $p = false;247 if ( $page_num < 3 || ( $page_num >= $page - 3 && $page_num <= $page + 3 ) || $page_num > $total_pages - 3 ) :248 $args['apage'] = ( 1 == $page_num ) ? '' : $page_num;249 $r .= '<a class="page-numbers" href="' . clean_url(add_query_arg($args)) . '">' . ( $page_num ) . "</a>\n";250 $in = true;251 elseif ( $in == true ) :252 $r .= "...\n";253 $in = false;254 endif;255 endif;256 endfor;257 }258 if ( ( $page ) * 50 < $total || -1 == $total ) {259 $args['apage'] = $page + 1;260 $r .= '<a class="next" href="' . clean_url(add_query_arg($args)) . '">'. __('Next Page »') .'</a>' . "\n";261 }262 echo "<p>$r</p>";263 ?>264 265 <?php } ?>266 <form style="clear: both;" method="post" action="<?php echo attribute_escape( add_query_arg( 'noheader', 'true' ) ); ?>">267 <?php akismet_nonce_field($akismet_nonce) ?>268 <input type="hidden" name="action" value="recover" />269 <ul id="spam-list" class="commentlist" style="list-style: none; margin: 0; padding: 0;">270 <?php271 $i = 0;272 foreach($comments as $comment) {273 $i++;274 $comment_date = mysql2date(get_option("date_format") . " @ " . get_option("time_format"), $comment->comment_date);275 $post = get_post($comment->comment_post_ID);276 $post_title = $post->post_title;277 if ($i % 2) $class = 'class="alternate"';278 else $class = '';279 echo "\n\t<li id='comment-$comment->comment_ID' $class>";280 ?>281 282 <p><strong><?php comment_author() ?></strong> <?php if ($comment->comment_author_email) { ?>| <?php comment_author_email_link() ?> <?php } if ($comment->comment_author_url && 'http://' != $comment->comment_author_url) { ?> | <?php comment_author_url_link() ?> <?php } ?>| <?php _e('IP:') ?> <a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php comment_author_IP() ?>"><?php comment_author_IP() ?></a></p>283 284 <?php comment_text() ?>285 286 <p><label for="spam-<?php echo $comment->comment_ID; ?>">287 <input type="checkbox" id="spam-<?php echo $comment->comment_ID; ?>" name="not_spam[]" value="<?php echo $comment->comment_ID; ?>" />288 <?php _e('Not Spam') ?></label> — <?php comment_date('M j, g:i A'); ?> — [289 <?php290 $post = get_post($comment->comment_post_ID);291 $post_title = wp_specialchars( $post->post_title, 'double' );292 $post_title = ('' == $post_title) ? "# $comment->comment_post_ID" : $post_title;293 ?>294 <a href="<?php echo get_permalink($comment->comment_post_ID); ?>" title="<?php echo $post_title; ?>"><?php _e('View Post') ?></a> ] </p>295 296 297 <?php298 }299 ?>300 </ul>301 <?php if ( $total > 50 ) {302 $total_pages = ceil( $total / 50 );303 $r = '';304 if ( 1 < $page ) {305 $args['apage'] = ( 1 == $page - 1 ) ? '' : $page - 1;306 $r .= '<a class="prev" href="' . clean_url(add_query_arg( $args )) . '">'. __('« Previous Page') .'</a>' . "\n";307 }308 if ( ( $total_pages = ceil( $total / 50 ) ) > 1 ) {309 for ( $page_num = 1; $page_num <= $total_pages; $page_num++ ) :310 if ( $page == $page_num ) :311 $r .= "<strong>$page_num</strong>\n";312 else :313 $p = false;314 if ( $page_num < 3 || ( $page_num >= $page - 3 && $page_num <= $page + 3 ) || $page_num > $total_pages - 3 ) :315 $args['apage'] = ( 1 == $page_num ) ? '' : $page_num;316 $r .= '<a class="page-numbers" href="' . clean_url(add_query_arg($args)) . '">' . ( $page_num ) . "</a>\n";317 $in = true;318 elseif ( $in == true ) :319 $r .= "...\n";320 $in = false;321 endif;322 endif;323 endfor;324 }325 if ( ( $page ) * 50 < $total || -1 == $total ) {326 $args['apage'] = $page + 1;327 $r .= '<a class="next" href="' . clean_url(add_query_arg($args)) . '">'. __('Next Page »') .'</a>' . "\n";328 }329 echo "<p>$r</p>";330 }331 ?>332 <p class="submit">333 <input type="submit" name="submit" value="<?php echo attribute_escape(__('De-spam marked comments »')); ?>" />334 </p>335 <p><?php _e('Comments you de-spam will be submitted to Akismet as mistakes so it can learn and get better.'); ?></p>336 </form>337 <?php338 } else {339 ?>340 <p><?php _e('No results found.'); ?></p>341 <?php } ?>342 343 <?php if ( !isset( $_POST['s'] ) ) { ?>344 <form method="post" action="<?php echo attribute_escape( add_query_arg( 'noheader', 'true' ) ); ?>">345 <?php akismet_nonce_field($akismet_nonce) ?>346 <p><input type="hidden" name="action" value="delete" />347 <?php printf(__('There are currently %1$s comments identified as spam.'), $spam_count); ?> <input type="submit" name="Submit" class="button" value="<?php echo attribute_escape(__('Delete all')); ?>" />348 <input type="hidden" name="display_time" value="<?php echo current_time('mysql', 1); ?>" /></p>349 </form>350 <?php } ?>351 </div>352 <?php353 }354 }355 356 add_action('admin_menu', 'akismet_manage_page');357 358 function redirect_old_akismet_urls( ) {359 global $wp_db_version;360 $script_name = array_pop( split( '/', $_SERVER['PHP_SELF'] ) );361 362 $page = '';363 if ( !empty( $_GET['page'] ) )364 $page = $_GET['page'];365 366 // 2.7 redirect for people who might have bookmarked the old page367 if ( 8204 < $wp_db_version && ( 'edit-comments.php' == $script_name || 'edit.php' == $script_name ) && 'akismet-admin' == $page ) {368 $new_url = esc_url( 'edit-comments.php?comment_status=spam' );369 wp_redirect( $new_url, 301 );370 exit;371 }372 }373 add_action( 'admin_init', 'redirect_old_akismet_urls' );374 375 // For WP <= 2.3.x376 global $pagenow;377 378 if ( 'moderation.php' == $pagenow ) {379 function akismet_recheck_button( $page ) {380 global $submenu;381 if ( isset( $submenu['edit-comments.php'] ) )382 $link = 'edit-comments.php';383 else384 $link = 'edit.php';385 $button = "<a href='$link?page=akismet-admin&recheckqueue=true&noheader=true' style='display: block; width: 100px; position: absolute; right: 7%; padding: 5px; font-size: 14px; text-decoration: underline; background: #fff; border: 1px solid #ccc;'>" . __('Recheck Queue for Spam') . "</a>";386 $page = str_replace( '<div class="wrap">', '<div class="wrap">' . $button, $page );387 return $page;388 }389 390 if ( $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = '0'" ) )391 ob_start( 'akismet_recheck_button' );392 }393 394 // This option causes tons of FPs, was removed in 2.1395 function akismet_kill_proxy_check( $option ) { return 0; }396 add_filter('option_open_proxy_check', 'akismet_kill_proxy_check'); -
wp-content/plugins/akismet/readme.txt
1 === Akismet ===2 Contributors: matt, ryan, andy, mdawaffe, tellyworth, josephscott, lessbloat, automattic3 Tags: akismet, comments, spam4 Requires at least: 3.05 Tested up to: 3.16 Stable tag: 2.5.17 License: GPLv28 9 Akismet checks your comments against the Akismet web service to see if they look like spam or not.10 11 == Description ==12 13 Akismet checks your comments against the Akismet web service to see if they look like spam or not and lets you14 review the spam it catches under your blog's "Comments" admin screen.15 16 Major new features in Akismet 2.5 include:17 18 * A comment status history, so you can easily see which comments were caught or cleared by Akismet, and which were spammed or unspammed by a moderator19 * Links are highlighted in the comment body, to reveal hidden or misleading links20 * If your web host is unable to reach Akismet's servers, the plugin will automatically retry when your connection is back up21 * Moderators can see the number of approved comments for each user22 * Spam and Unspam reports now include more information, to help improve accuracy23 24 PS: You'll need an [Akismet.com API key](http://akismet.com/get/) to use it. Keys are free for personal blogs, with paid subscriptions available for businesses and commercial sites.25 26 == Installation ==27 28 Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.com API key](http://akismet.com/get/).29 30 1, 2, 3: You're done!31 32 == Changelog ==33 34 = 2.5.1 =35 36 * Fix a bug that caused the "Auto delete" option to fail to discard comments correctly37 * Remove the comment nonce form field from the 'Akismet Configuration' page in favor of using a filter, akismet_comment_nonce38 * Fixed padding bug in "author" column of posts screen39 * Added margin-top to "cleared by ..." badges on dashboard40 * Fix possible error when calling akismet_cron_recheck()41 * Fix more PHP warnings42 * Clean up XHTML warnings for comment nonce43 * Fix for possible condition where scheduled comment re-checks could get stuck44 * Clean up the comment meta details after deleting a comment45 * Only show the status badge if the comment status has been changed by someone/something other than Akismet46 * Show a 'History' link in the row-actions47 * Translation fixes48 * Reduced font-size on author name49 * Moved "flagged by..." notification to top right corner of comment container and removed heavy styling50 * Hid "flagged by..." notification while on dashboard51 52 = 2.5.0 =53 54 * Track comment actions under 'Akismet Status' on the edit comment screen55 * Fix a few remaining deprecated function calls ( props Mike Glendinning )56 * Use HTTPS for the stats IFRAME when wp-admin is using HTTPS57 * Use the WordPress HTTP class if available58 * Move the admin UI code to a separate file, only loaded when needed59 * Add cron retry feature, to replace the old connectivity check60 * Display Akismet status badge beside each comment61 * Record history for each comment, and display it on the edit page62 * Record the complete comment as originally submitted in comment_meta, to use when reporting spam and ham63 * Highlight links in comment content64 * New option, "Show the number of comments you've approved beside each comment author."65 * New option, "Use a nonce on the comment form."66 67 = 2.4.0 =68 69 * Spell out that the license is GPLv270 * Fix PHP warnings71 * Fix WordPress deprecated function calls72 * Fire the delete_comment action when deleting comments73 * Move code specific for older WP versions to legacy.php74 * General code clean up75 76 = 2.3.0 =77 78 * Fix "Are you sure" nonce message on config screen in WPMU79 * Fix XHTML compliance issue in sidebar widget80 * Change author link; remove some old references to WordPress.com accounts81 * Localize the widget title (core ticket #13879)82 83 = 2.2.9 =84 85 * Eliminate a potential conflict with some plugins that may cause spurious reports86 87 = 2.2.8 =88 89 * Fix bug in initial comment check for ipv6 addresses90 * Report comments as ham when they are moved from spam to moderation91 * Report comments as ham when clicking undo after spam92 * Use transition_comment_status action when available instead of older actions for spam/ham submissions93 * Better diagnostic messages when PHP network functions are unavailable94 * Better handling of comments by logged-in users95 96 = 2.2.7 =97 98 * Add a new AKISMET_VERSION constant99 * Reduce the possibility of over-counting spam when another spam filter plugin is in use100 * Disable the connectivity check when the API key is hard-coded for WPMU101 102 = 2.2.6 =103 104 * Fix a global warning introduced in 2.2.5105 * Add changelog and additional readme.txt tags106 * Fix an array conversion warning in some versions of PHP107 * Support a new WPCOM_API_KEY constant for easier use with WordPress MU108 109 = 2.2.5 =110 111 * Include a new Server Connectivity diagnostic check, to detect problems caused by firewalls112 113 = 2.2.4 =114 115 * Fixed a key problem affecting the stats feature in WordPress MU116 * Provide additional blog information in Akismet API calls -
wp-content/plugins/akismet/widget.php
1 <?php2 /**3 * @package Akismet4 */5 // Widget stuff6 function widget_akismet_register() {7 if ( function_exists('register_sidebar_widget') ) :8 function widget_akismet($args) {9 extract($args);10 $options = get_option('widget_akismet');11 $count = get_option('akismet_spam_count');12 ?>13 <?php echo $before_widget; ?>14 <?php echo $before_title . $options['title'] . $after_title; ?>15 <div id="akismetwrap"><div id="akismetstats"><a id="aka" href="http://akismet.com" title=""><?php printf( _n( '%1$s%2$s%3$s %4$sspam comment%5$s %6$sblocked by%7$s<br />%8$sAkismet%9$s', '%1$s%2$s%3$s %4$sspam comments%5$s %6$sblocked by%7$s<br />%8$sAkismet%9$s', $count ), '<span id="akismet1"><span id="akismetcount">', number_format_i18n( $count ), '</span>', '<span id="akismetsc">', '</span></span>', '<span id="akismet2"><span id="akismetbb">', '</span>', '<span id="akismeta">', '</span></span>' ); ?></a></div></div>16 <?php echo $after_widget; ?>17 <?php18 }19 20 function widget_akismet_style() {21 $plugin_dir = '/wp-content/plugins';22 if ( defined( 'PLUGINDIR' ) )23 $plugin_dir = '/' . PLUGINDIR;24 25 ?>26 <style type="text/css">27 #aka,#aka:link,#aka:hover,#aka:visited,#aka:active{color:#fff;text-decoration:none}28 #aka:hover{border:none;text-decoration:none}29 #aka:hover #akismet1{display:none}30 #aka:hover #akismet2,#akismet1{display:block}31 #akismet2{display:none;padding-top:2px}32 #akismeta{font-size:16px;font-weight:bold;line-height:18px;text-decoration:none}33 #akismetcount{display:block;font:15px Verdana,Arial,Sans-Serif;font-weight:bold;text-decoration:none}34 #akismetwrap #akismetstats{background:url(<?php echo get_option('siteurl'), $plugin_dir; ?>/akismet/akismet.gif) no-repeat top left;border:none;color:#fff;font:11px 'Trebuchet MS','Myriad Pro',sans-serif;height:40px;line-height:100%;overflow:hidden;padding:8px 0 0;text-align:center;width:120px}35 </style>36 <?php37 }38 39 function widget_akismet_control() {40 $options = $newoptions = get_option('widget_akismet');41 if ( isset( $_POST['akismet-submit'] ) && $_POST["akismet-submit"] ) {42 $newoptions['title'] = strip_tags(stripslashes($_POST["akismet-title"]));43 if ( empty($newoptions['title']) ) $newoptions['title'] = __('Spam Blocked');44 }45 if ( $options != $newoptions ) {46 $options = $newoptions;47 update_option('widget_akismet', $options);48 }49 $title = htmlspecialchars($options['title'], ENT_QUOTES);50 ?>51 <p><label for="akismet-title"><?php _e('Title:'); ?> <input style="width: 250px;" id="akismet-title" name="akismet-title" type="text" value="<?php echo $title; ?>" /></label></p>52 <input type="hidden" id="akismet-submit" name="akismet-submit" value="1" />53 <?php54 }55 56 if ( function_exists( 'wp_register_sidebar_widget' ) ) {57 wp_register_sidebar_widget( 'akismet', 'Akismet', 'widget_akismet', null, 'akismet');58 wp_register_widget_control( 'akismet', 'Akismet', 'widget_akismet_control', null, 75, 'akismet');59 } else {60 register_sidebar_widget('Akismet', 'widget_akismet', null, 'akismet');61 register_widget_control('Akismet', 'widget_akismet_control', null, 75, 'akismet');62 }63 if ( is_active_widget('widget_akismet') )64 add_action('wp_head', 'widget_akismet_style');65 endif;66 }67 68 add_action('init', 'widget_akismet_register');69 70 // Counter for non-widget users71 function akismet_counter() {72 $plugin_dir = '/wp-content/plugins';73 if ( defined( 'PLUGINDIR' ) )74 $plugin_dir = '/' . PLUGINDIR;75 76 ?>77 <style type="text/css">78 #akismetwrap #aka,#aka:link,#aka:hover,#aka:visited,#aka:active{color:#fff;text-decoration:none}79 #aka:hover{border:none;text-decoration:none}80 #aka:hover #akismet1{display:none}81 #aka:hover #akismet2,#akismet1{display:block}82 #akismet2{display:none;padding-top:2px}83 #akismeta{font-size:16px;font-weight:bold;line-height:18px;text-decoration:none}84 #akismetcount{display:block;font:15px Verdana,Arial,Sans-Serif;font-weight:bold;text-decoration:none}85 #akismetwrap #akismetstats{background:url(<?php echo get_option('siteurl'), $plugin_dir; ?>/akismet/akismet.gif) no-repeat top left;border:none;color:#fff;font:11px 'Trebuchet MS','Myriad Pro',sans-serif;height:40px;line-height:100%;overflow:hidden;padding:8px 0 0;text-align:center;width:120px}86 </style>87 <?php88 $count = get_option('akismet_spam_count');89 printf( _n( '<div id="akismetwrap"><div id="akismetstats"><a id="aka" href="http://akismet.com" title=""><div id="akismet1"><span id="akismetcount">%1$s</span> <span id="akismetsc">spam comment</span></div> <div id="akismet2"><span id="akismetbb">blocked by</span><br /><span id="akismeta">Akismet</span></div></a></div></div>', '<div id="akismetwrap"><div id="akismetstats"><a id="aka" href="http://akismet.com" title=""><div id="akismet1"><span id="akismetcount">%1$s</span> <span id="akismetsc">spam comments</span></div> <div id="akismet2"><span id="akismetbb">blocked by</span><br /><span id="akismeta">Akismet</span></div></a></div></div>', $count ), number_format_i18n( $count ) );90 }