Changeset 1879


Ignore:
Timestamp:
02/16/2011 10:27:00 AM (15 months ago)
Author:
Xiping.Wang
Message:

[trunk] upgrade wordpress plugin akismet to 2.5.3

Location:
trunk/blogs/wp-content/plugins/akismet
Files:
3 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/blogs/wp-content/plugins/akismet/admin.php

    r1877 r1879  
    88     
    99    // all admin functions are disabled in old versions 
    10     if ( version_compare( $wp_version, '3.0', '<' ) ) { 
     10    if ( !function_exists('is_multisite') && version_compare( $wp_version, '3.0', '<' ) ) { 
    1111         
    1212        function akismet_version_warning() { 
    1313            echo " 
    14             <div id='akismet-warning' class='updated fade'><p><strong>".sprintf(__('Akismet %s required 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> 
     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> 
    1515            "; 
    1616        } 
     
    2525        $hook = 'dashboard_page_akismet-stats-display'; 
    2626    add_action('admin_head-'.$hook, 'akismet_stats_script'); 
    27     add_meta_box('akismet-status', __('Akismet Status'), 'akismet_comment_status_meta_box', 'comment', 'normal'); 
     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'); 
    2832} 
    2933add_action('admin_init', 'akismet_admin_init'); 
     
    3539        if ( function_exists('add_submenu_page') ) 
    3640                add_submenu_page('plugins.php', __('Akismet Configuration'), __('Akismet Configuration'), 'manage_options', 'akismet-key-config', 'akismet_conf'); 
    37  
    38 } 
     41} 
     42 
     43function 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 
     51add_filter( 'plugin_action_links', 'akismet_plugin_action_links', 10, 2 ); 
    3952 
    4053function akismet_conf() { 
     
    4760                check_admin_referer( $akismet_nonce ); 
    4861                $key = preg_replace( '/[^a-h0-9]/i', '', $_POST['key'] ); 
     62                $home_url = parse_url( get_bloginfo('url') ); 
    4963 
    5064                if ( empty($key) ) { 
     
    5266                        $ms[] = 'new_key_empty'; 
    5367                        delete_option('wordpress_api_key'); 
     68                } elseif ( empty($home_url['host']) ) { 
     69                        $key_status = 'empty'; 
     70                        $ms[] = 'bad_home_url'; 
    5471                } else { 
    5572                        $key_status = akismet_verify_key( $key ); 
     
    6986                else 
    7087                        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                else 
     92                        update_option( 'akismet_show_user_comments_approved', 'false' ); 
     93 
    7194        } elseif ( isset($_POST['check']) ) { 
    7295                akismet_get_server_connectivity(0); 
     
    98121        $messages = array( 
    99122                'new_key_empty' => array('color' => 'aa0', 'text' => __('Your key has been cleared.')), 
    100                 'new_key_valid' => array('color' => '2d2', 'text' => __('Your key has been verified. Happy blogging!')), 
    101                 'new_key_invalid' => array('color' => 'd22', 'text' => __('The key you entered is invalid. Please double-check it.')), 
    102                 'new_key_failed' => array('color' => 'd22', 'text' => __('The key you entered could not be verified because a connection to akismet.com could not be established. Please check your server configuration.')), 
    103                 'no_connection' => array('color' => 'd22', 'text' => __('There was a problem connecting to the Akismet server. Please check your server configuration.')), 
     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.')), 
    104127                '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/')), 
    105                 'key_valid' => array('color' => '2d2', 'text' => __('This key is valid.')), 
    106                 '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.'))); 
     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        ); 
    107132?> 
    108133<?php if ( !empty($_POST['submit'] ) ) : ?> 
     
    111136<div class="wrap"> 
    112137<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 } ?> 
    113141<div class="narrow"> 
    114142<form action="" method="post" id="akismet-conf" style="margin: auto; width: 400px; "> 
     
    127155<?php } ?> 
    128156<?php akismet_nonce_field($akismet_nonce) ?> 
    129 <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('Automatically discard spam comments on posts older than a month.'); ?></label></p> 
     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> 
    130159        <p class="submit"><input type="submit" name="submit" value="<?php _e('Update options &raquo;'); ?>" /></p> 
    131160</form> 
     
    137166        if ( !function_exists('fsockopen') || !function_exists('gethostbynamel') ) { 
    138167                ?> 
    139                         <p style="padding: .5em; background-color: #d22; color: #fff; font-weight:bold;"><?php _e('Network functions are disabled.'); ?></p> 
     168                        <p style="padding: .5em; background-color: #888; color: #fff; font-weight:bold;"><?php _e('Network functions are disabled.'); ?></p> 
    140169                        <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> 
    141170                <?php 
     
    151180                        // all connections fail 
    152181                        } elseif ( $fail_count > 0 ) { ?> 
    153                                 <p style="padding: .5em; background-color: #d22; color: #fff; font-weight:bold;"><?php _e('Unable to reach any Akismet servers.'); ?></p> 
     182                                <p style="padding: .5em; background-color: #888; color: #fff; font-weight:bold;"><?php _e('Unable to reach any Akismet servers.'); ?></p> 
    154183                                <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> 
    155184                        <?php 
    156185                        // all connections work 
    157186                        } else { ?> 
    158                                 <p style="padding: .5em; background-color: #2d2; color: #fff; font-weight:bold;"><?php  _e('All Akismet servers are available.'); ?></p> 
     187                                <p style="padding: .5em; background-color: #4AB915; color: #fff; font-weight:bold;"><?php  _e('All Akismet servers are available.'); ?></p> 
    159188                                <p><?php _e('Akismet is working correctly.  All servers are accessible.'); ?></p> 
    160189                        <?php 
     
    162191                } else { 
    163192                        ?> 
    164                                 <p style="padding: .5em; background-color: #d22; color: #fff; font-weight:bold;"><?php _e('Unable to find Akismet servers.'); ?></p> 
     193                                <p style="padding: .5em; background-color: #888; color: #fff; font-weight:bold;"><?php _e('Unable to find Akismet servers.'); ?></p> 
    165194                                <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> 
    166195                        <?php 
     
    176205                asort($servers); 
    177206                foreach ( $servers as $ip => $status ) { 
    178                         $color = ( $status ? '#2d2' : '#d22'); 
     207                        $color = ( $status ? '#4AB915' : '#888'); 
    179208        ?> 
    180209                <tr> 
    181210                <td><?php echo htmlspecialchars($ip); ?></td> 
    182                 <td style="padding: 0 .5em; font-weight:bold; color: #fff; background-color: <?php echo $color; ?>"><?php echo ($status ? __('No problems') : __('Obstructed') ); ?></td> 
     211                <td style="padding: 0 .5em; font-weight:bold; color: #fff; background-color: <?php echo $color; ?>"><?php echo ($status ? __('Accessible') : __('Re-trying') ); ?></td> 
    183212                 
    184213        <?php 
     
    190219        <p><?php if ( get_option('akismet_connectivity_time') ) echo sprintf( __('Last checked %s ago.'), human_time_diff( get_option('akismet_connectivity_time') ) ); ?></p> 
    191220        <p class="submit"><input type="submit" name="check" value="<?php _e('Check network status &raquo;'); ?>" /></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> 
    192222</form> 
    193223 
     
    207237<script type="text/javascript"> 
    208238function resizeIframe() { 
    209     var height = document.documentElement.clientHeight; 
    210     height -= document.getElementById('akismet-stats-frame').offsetTop; 
    211     height += 100; // magic padding 
    212      
    213     document.getElementById('akismet-stats-frame').style.height = height +"px"; 
     239   
     240    document.getElementById('akismet-stats-frame').style.height = "2500px"; 
    214241     
    215242}; 
     
    225252function akismet_stats_display() { 
    226253        global $akismet_api_host, $akismet_api_port, $wpcom_api_key; 
    227         $blog = urlencode( get_option('home') ); 
     254        $blog = urlencode( get_bloginfo('url') ); 
    228255 
    229256        $url = 'http://'; 
     
    246273                return; 
    247274        $path = plugin_basename(__FILE__); 
    248         echo '<h3>'.__('Spam').'</h3>'; 
     275        echo '<h3>' . _x( 'Spam', 'comments' ) . '</h3>'; 
    249276        global $submenu; 
    250277        if ( isset( $submenu['edit-comments.php'] ) ) 
     
    252279        else 
    253280                $link = 'edit.php'; 
    254         echo '<p>'.sprintf(__('<a href="%1$s">Akismet</a> has protected your site from <a href="%2$s">%3$s spam comments</a>.'), 'http://akismet.com/', clean_url("$link?page=akismet-admin"), number_format_i18n($count) ).'</p>'; 
     281        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>'; 
    255282} 
    256283add_action('activity_box_end', 'akismet_stats'); 
     
    266293                add_action('admin_notices', 'akismet_warning'); 
    267294                return; 
    268         } elseif ( get_option('akismet_connectivity_time') && empty($_POST) && is_admin() && !akismet_server_connectivity_ok() ) { 
     295        } elseif ( ( empty($_SERVER['SCRIPT_FILENAME']) || basename($_SERVER['SCRIPT_FILENAME']) == 'edit-comments.php' ) &&  wp_next_scheduled('akismet_schedule_cron_recheck') ) { 
    269296                function akismet_warning() { 
    270                         echo " 
    271                         <div id='akismet-warning' class='updated fade'><p><strong>".__('Akismet has detected a problem.')."</strong> ".sprintf(__('A server or network problem is preventing Akismet from working correctly.  <a href="%1$s">Click here for more information</a> about how to fix the problem.'), "plugins.php?page=akismet-key-config")."</p></div> 
     297                        global $wpdb; 
     298                                $waiting = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->commentmeta WHERE meta_key = 'akismet_error'" ) ); 
     299                                $next_check = human_time_diff( wp_next_scheduled('akismet_schedule_cron_recheck') ); 
     300                                if ( $waiting > 0 ) 
     301                                        echo " 
     302                        <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> 
    272303                        "; 
    273304                } 
     
    280311 
    281312function akismet_comment_row_action( $a, $comment ) { 
    282          
    283          
     313 
     314        // failsafe for old WP versions 
     315        if ( !function_exists('add_comment_meta') ) 
     316                return $a; 
     317 
    284318        $akismet_result = get_comment_meta( $comment->comment_ID, 'akismet_result', true ); 
    285319        $user_result = get_comment_meta( $comment->comment_ID, 'akismet_user_result', true); 
     320        $comment_status = wp_get_comment_status( $comment->comment_ID ); 
    286321        $desc = null; 
    287322        if ( !$user_result || $user_result == $akismet_result ) { 
    288323                // Show the original Akismet result if the user hasn't overridden it, or if their decision was the same 
    289                 if ( $akismet_result == 'true' ) 
    290                         $desc = 'Flagged as spam by Akismet'; 
    291                 elseif ( $akismet_result == 'false' ) 
    292                         $desc = 'Cleared by Akismet'; 
     324                if ( $akismet_result == 'true' && $comment_status != 'spam' && $comment_status != 'trash' ) 
     325                        $desc = __( 'Flagged as spam by Akismet' ); 
     326                elseif ( $akismet_result == 'false' && $comment_status == 'spam' ) 
     327                        $desc = __( 'Cleared by Akismet' ); 
    293328        } else { 
    294329                $who = get_comment_meta( $comment->comment_ID, 'akismet_user', true ); 
     
    298333                        $desc = sprintf( __('Un-spammed by %s'), $who ); 
    299334        } 
    300          
     335 
     336        // add a History item to the hover links, just after Edit 
     337        if ( $akismet_result ) { 
     338                $b = array(); 
     339                foreach ( $a as $k => $item ) { 
     340                        $b[ $k ] = $item; 
     341                        if ( $k == 'edit' ) 
     342                                $b['history'] = '<a href="comment.php?action=editcomment&amp;c='.$comment->comment_ID.'#akismet-status" title="'. esc_attr__( 'View comment history' ) . '"> '. __('History') . '</a>'; 
     343                } 
     344                 
     345                $a = $b; 
     346        } 
     347                 
    301348        if ( $desc ) 
    302                 echo '<span style="background: #EEE; border: 1px solid #E4E4E4; margin-top: 3px; color: #999; padding: 1px 8px 2px 8px; -moz-border-radius:6px; border-radius:6px; -webkit-border-radius:6px; float: right; line-height: 1.2em;"><a href="comment.php?action=editcomment&amp;c='.$comment->comment_ID.'#akismet-status" title="' . esc_attr__( 'View comment history' ) . '">'.htmlspecialchars($desc).'</a></span>'; 
     349                echo '<span class="akismet-status" commentid="'.$comment->comment_ID.'"><a href="comment.php?action=editcomment&amp;c='.$comment->comment_ID.'#akismet-status" title="' . esc_attr__( 'View comment history' ) . '">'.htmlspecialchars($desc).'</a></span>'; 
     350                 
     351        if ( apply_filters( 'akismet_show_user_comments_approved', get_option('akismet_show_user_comments_approved') ) == 'true' ) { 
     352                $comment_count = akismet_get_user_comments_approved( $comment->user_id, $comment->comment_author_email, $comment->comment_author, $comment->comment_author_url ); 
     353                $comment_count = intval( $comment_count ); 
     354                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 ), number_format_i18n( $comment_count ) ) . '</span></span>'; 
     355        } 
    303356         
    304357        return $a; 
     
    306359 
    307360add_filter( 'comment_row_actions', 'akismet_comment_row_action', 10, 2 ); 
    308  
    309361 
    310362function akismet_comment_status_meta_box($comment) { 
     
    355407// END FIXME 
    356408 
     409// call out URLS in comments 
     410function akismet_text_add_link_callback( $m ) { 
     411         
     412                // bare link? 
     413        if ( $m[4] == $m[2] ) 
     414                return '<a '.$m[1].' href="'.$m[2].'" '.$m[3].' class="comment-link">'.$m[4].'</a>'; 
     415        else 
     416                return '<span title="'.$m[2].'" class="comment-link"><a '.$m[1].' href="'.$m[2].'" '.$m[3].' class="comment-link">'.$m[4].'</a></span>'; 
     417} 
     418 
     419function akismet_text_add_link_class( $comment_text ) { 
     420 
     421        return preg_replace_callback( '#<a ([^>]*)href="([^"]+)"([^>]*)>(.*?)</a>#i', 'akismet_text_add_link_callback', $comment_text ); 
     422} 
     423 
     424add_filter('comment_text', 'akismet_text_add_link_class'); 
     425 
     426 
    357427// WP 2.5+ 
    358428function akismet_rightnow() { 
    359429        global $submenu, $wp_db_version; 
    360  
    361         $plural_func = '__ngettext'; 
    362         if ( function_exists( '_n' ) ) 
    363                 $plural_func = '_n'; 
    364430 
    365431        // clean_url was deprecated in WP 3.0 
     
    376442 
    377443        if ( $count = get_option('akismet_spam_count') ) { 
    378                 $intro = sprintf( $plural_func( 
    379                         '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comment already,', 
    380                         '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comments already,', 
     444                $intro = sprintf( _n( 
     445                        '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comment already. ', 
     446                        '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comments already. ', 
    381447                        $count 
    382448                ), 'http://akismet.com/', number_format_i18n( $count ) ); 
    383449        } else { 
    384                 $intro = sprintf( __('<a href="%1$s">Akismet</a> blocks spam from getting to your blog,'), 'http://akismet.com/' ); 
     450                $intro = sprintf( __('<a href="%1$s">Akismet</a> blocks spam from getting to your blog. '), 'http://akismet.com/' ); 
    385451        } 
    386452 
    387453        if ( $queue_count = akismet_spam_count() ) { 
    388                 $queue_text = sprintf( $plural_func( 
    389                         'and there\'s <a href="%2$s">%1$s comment</a> in your spam queue right now.', 
    390                         'and there are <a href="%2$s">%1$s comments</a> in your spam queue right now.', 
     454                $queue_text = sprintf( _n( 
     455                        'There\'s <a href="%2$s">%1$s comment</a> in your spam queue right now.', 
     456                        'There are <a href="%2$s">%1$s comments</a> in your spam queue right now.', 
    391457                        $queue_count 
    392458                ), number_format_i18n( $queue_count ), $esc_url($link) ); 
    393459        } else { 
    394                 $queue_text = sprintf( __( " but there's nothing in your <a href='%1\$s'>spam queue</a> at the moment." ), $esc_url($link) ); 
    395         } 
    396  
    397         // _c was deprecated in WP 2.9.0 
    398         if ( function_exists( '_x' ) ) 
    399                 $text = sprintf( _x( '%1$s%2$s', 'akismet_rightnow' ), $intro, $queue_text ); 
    400         else  
    401                 $text = sprintf( _c( '%1$s%2$s|akismet_rightnow' ), $intro, $queue_text ); 
    402  
     460                $queue_text = sprintf( __( "There's nothing in your <a href='%1\$s'>spam queue</a> at the moment." ), $esc_url($link) ); 
     461        } 
     462 
     463        $text = $intro . '<br />' . $queue_text; 
    403464        echo "<p class='akismet-right-now'>$text</p>\n"; 
    404465} 
     
    426487        if ( !$comment ) // it was deleted 
    427488                return; 
    428         $comment->blog = get_option('home'); 
     489                 
     490        // use the original version stored in comment_meta if available  
     491        $as_submitted = get_comment_meta( $comment_id, 'akismet_as_submitted', true); 
     492        if ( $as_submitted && is_array($as_submitted) && isset($as_submitted['comment_content']) ) { 
     493                $comment = (object) array_merge( (array)$comment, $as_submitted ); 
     494        } 
     495         
     496        $comment->blog = get_bloginfo('url'); 
    429497        $comment->blog_lang = get_locale(); 
    430498        $comment->blog_charset = get_option('blog_charset'); 
    431499        $comment->permalink = get_permalink($comment->comment_post_ID); 
     500        $comment->reporter_ip = $_SERVER['REMOTE_ADDR']; 
    432501        if ( is_object($current_user) ) { 
    433502            $comment->reporter = $current_user->user_login; 
     
    441510                $comment->user_role = akismet_get_user_roles($comment->user_ID); 
    442511 
     512        if ( akismet_test_mode() ) 
     513                $comment->is_test = 'true'; 
     514 
    443515        $query_string = ''; 
    444516        foreach ( $comment as $key => $data ) 
     
    447519        $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-ham", $akismet_api_port); 
    448520        if ( $comment->reporter ) { 
    449                 akismet_update_comment_history( $comment_id, sprintf( __('%s un-spammed this comment'), $comment->reporter ), 'report-ham' ); 
     521                akismet_update_comment_history( $comment_id, sprintf( __('%s reported this comment as not spam'), $comment->reporter ), 'report-ham' ); 
    450522                update_comment_meta( $comment_id, 'akismet_user_result', 'false' ); 
    451523                update_comment_meta( $comment_id, 'akismet_user', $comment->reporter ); 
    452         } else { 
    453                 akismet_update_comment_history( $comment_id, 'A plugin un-spammed this comment', 'report-ham' ); 
    454524        } 
    455525         
     
    466536        if ( 'spam' != $comment->comment_approved ) 
    467537                return; 
    468         $comment->blog = get_option('home'); 
     538         
     539        // use the original version stored in comment_meta if available  
     540        $as_submitted = get_comment_meta( $comment_id, 'akismet_as_submitted', true); 
     541        if ( $as_submitted && is_array($as_submitted) && isset($as_submitted['comment_content']) ) { 
     542                $comment = (object) array_merge( (array)$comment, $as_submitted ); 
     543        } 
     544         
     545        $comment->blog = get_bloginfo('url'); 
    469546        $comment->blog_lang = get_locale(); 
    470547        $comment->blog_charset = get_option('blog_charset'); 
    471548        $comment->permalink = get_permalink($comment->comment_post_ID); 
     549        $comment->reporter_ip = $_SERVER['REMOTE_ADDR']; 
    472550        if ( is_object($current_user) ) { 
    473551            $comment->reporter = $current_user->user_login; 
     
    478556 
    479557        $comment->user_role = ''; 
    480         if ( !isset( $comment->user_id ) ) 
     558        if ( isset( $comment->user_ID ) ) 
    481559                $comment->user_role = akismet_get_user_roles($comment->user_ID); 
     560 
     561        if ( akismet_test_mode() ) 
     562                $comment->is_test = 'true'; 
    482563 
    483564        $query_string = ''; 
     
    487568        $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-spam", $akismet_api_port); 
    488569        if ( $comment->reporter ) { 
    489                 akismet_update_comment_history( $comment_id, sprintf( __('%s spammed this comment'), $comment->reporter ), 'report-spam' ); 
     570                akismet_update_comment_history( $comment_id, sprintf( __('%s reported this comment as spam'), $comment->reporter ), 'report-spam' ); 
    490571                update_comment_meta( $comment_id, 'akismet_user_result', 'true' ); 
    491572                update_comment_meta( $comment_id, 'akismet_user', $comment->reporter ); 
    492         } else 
    493                 akismet_update_comment_history( $comment_id, 'A plugin spammed this comment', 'report-ham' ); 
     573        } 
    494574        do_action('akismet_submit_spam_comment', $comment_id, $response[1]); 
    495575} 
     
    499579        if ( $new_status == $old_status ) 
    500580                return; 
    501                  
    502         if ( $new_status == 'spam' ) { 
    503                 akismet_submit_spam_comment( $comment->comment_ID ); 
    504         } elseif ( $old_status == 'spam' && ( $new_status == 'approved' || $new_status == 'unapproved' ) ) { 
    505                 akismet_submit_nonspam_comment( $comment->comment_ID ); 
    506         } 
     581 
     582        # we don't need to record a history item for deleted comments 
     583        if ( $new_status == 'delete' ) 
     584                return; 
     585                 
     586        if ( !is_admin() ) 
     587                return; 
     588                 
     589        if ( !current_user_can( 'edit_post', $comment->comment_post_ID ) && !current_user_can( 'moderate_comments' ) ) 
     590                return; 
     591 
     592        if ( defined('WP_IMPORTING') && WP_IMPORTING == true ) 
     593                return; 
     594                 
     595        global $current_user; 
     596        $reporter = ''; 
     597        if ( is_object( $current_user ) ) 
     598                $reporter = $current_user->user_login; 
     599         
     600        // Assumption alert: 
     601        // We want to submit comments to Akismet only when a moderator explicitly spams or approves it - not if the status 
     602        // is changed automatically by another plugin.  Unfortunately WordPress doesn't provide an unambiguous way to 
     603        // determine why the transition_comment_status action was triggered.  And there are several different ways by which 
     604        // to spam and unspam comments: bulk actions, ajax, links in moderation emails, the dashboard, and perhaps others. 
     605        // We'll assume that this is an explicit user action if POST or GET has an 'action' key. 
     606        if ( isset($_POST['action']) || isset($_GET['action']) ) { 
     607                if ( $new_status == 'spam' && ( $old_status == 'approved' || $old_status == 'unapproved' || !$old_status ) ) { 
     608                                return akismet_submit_spam_comment( $comment->comment_ID ); 
     609                } elseif ( $old_status == 'spam' && ( $new_status == 'approved' || $new_status == 'unapproved' ) ) { 
     610                                return akismet_submit_nonspam_comment( $comment->comment_ID ); 
     611                } 
     612        } 
     613         
     614        if ( !get_comment_meta( $comment->comment_ID, 'akismet_rechecking' ) ) 
     615                akismet_update_comment_history( $comment->comment_ID, sprintf( __('%s changed the comment status to %s'), $reporter, $new_status ), 'status-' . $new_status ); 
    507616} 
    508617 
     
    547656                $c['user_agent'] = $c['comment_agent']; 
    548657                $c['referrer']   = ''; 
    549                 $c['blog']       = get_option('home'); 
     658                $c['blog']       = get_bloginfo('url'); 
    550659                $c['blog_lang']  = get_locale(); 
    551660                $c['blog_charset'] = get_option('blog_charset'); 
     
    555664                if ( isset( $c['user_ID'] ) ) 
    556665                        $c['user_role']  = akismet_get_user_roles($c['user_ID']); 
     666 
     667                if ( akismet_test_mode() ) 
     668                        $c['is_test'] = 'true'; 
    557669 
    558670                $id = (int) $c['comment_ID']; 
     
    583695 
    584696add_action('admin_action_akismet_recheck_queue', 'akismet_recheck_queue'); 
     697 
     698// Check connectivity between the WordPress blog and Akismet's servers. 
     699// 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). 
     700function akismet_check_server_connectivity() { 
     701        global $akismet_api_host, $akismet_api_port, $wpcom_api_key; 
     702         
     703        $test_host = 'rest.akismet.com'; 
     704         
     705        // Some web hosts may disable one or both functions 
     706        if ( !function_exists('fsockopen') || !function_exists('gethostbynamel') ) 
     707                return array(); 
     708         
     709        $ips = gethostbynamel($test_host); 
     710        if ( !$ips || !is_array($ips) || !count($ips) ) 
     711                return array(); 
     712                 
     713        $servers = array(); 
     714        foreach ( $ips as $ip ) { 
     715                $response = akismet_verify_key( akismet_get_key(), $ip ); 
     716                // even if the key is invalid, at least we know we have connectivity 
     717                if ( $response == 'valid' || $response == 'invalid' ) 
     718                        $servers[$ip] = true; 
     719                else 
     720                        $servers[$ip] = false; 
     721        } 
     722 
     723        return $servers; 
     724} 
     725 
     726// Check the server connectivity and store the results in an option. 
     727// Cached results will be used if not older than the specified timeout in seconds; use $cache_timeout = 0 to force an update. 
     728// Returns the same associative array as akismet_check_server_connectivity() 
     729function akismet_get_server_connectivity( $cache_timeout = 86400 ) { 
     730        $servers = get_option('akismet_available_servers'); 
     731        if ( (time() - get_option('akismet_connectivity_time') < $cache_timeout) && $servers !== false ) 
     732                return $servers; 
     733         
     734        // There's a race condition here but the effect is harmless. 
     735        $servers = akismet_check_server_connectivity(); 
     736        update_option('akismet_available_servers', $servers); 
     737        update_option('akismet_connectivity_time', time()); 
     738        return $servers; 
     739} 
     740 
     741// Returns true if server connectivity was OK at the last check, false if there was a problem that needs to be fixed. 
     742function akismet_server_connectivity_ok() { 
     743        // skip the check on WPMU because the status page is hidden 
     744        global $wpcom_api_key; 
     745        if ( $wpcom_api_key ) 
     746                return true; 
     747        $servers = akismet_get_server_connectivity(); 
     748        return !( empty($servers) || !count($servers) || count( array_filter($servers) ) < count($servers) ); 
     749} 
     750 
  • trunk/blogs/wp-content/plugins/akismet/akismet.php

    r1877 r1879  
    66Plugin Name: Akismet 
    77Plugin URI: http://akismet.com/ 
    8 Description: Akismet checks your comments against the Akismet web service to see if they look like spam or not. You need an <a href="http://akismet.com/get/">API key</a> to use it. You can review the spam it catches under "Comments." To show off your Akismet stats just put <code>&lt;?php akismet_counter(); ?&gt;</code> in your template. See also: <a href="http://wordpress.org/extend/plugins/stats/">WP Stats plugin</a>. 
    9 Version: 2.4.0 
     8Description: Used by millions, Akismet is quite possibly the best way in the world to <strong>protect your blog from comment and trackback 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. 
     9Version: 2.5.3 
    1010Author: Automattic 
    1111Author URI: http://automattic.com/wordpress-plugins/ 
    12 License: GPLv2 
     12License: GPLv2 or later 
    1313*/ 
    1414 
    1515/* 
    16 This program is free software; you can redistribute it and/or modify  
    17 it under the terms of the GNU General Public License as published by  
    18 the Free Software Foundation; version 2 of the License. 
    19  
    20 This program is distributed in the hope that it will be useful,  
    21 but WITHOUT ANY WARRANTY; without even the implied warranty of  
    22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
    23 GNU General Public License for more details.  
    24  
    25 You should have received a copy of the GNU General Public License  
    26 along with this program; if not, write to the Free Software  
    27 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA  
     16This program is free software; you can redistribute it and/or 
     17modify it under the terms of the GNU General Public License 
     18as published by the Free Software Foundation; either version 2 
     19of the License, or (at your option) any later version. 
     20 
     21This program is distributed in the hope that it will be useful, 
     22but WITHOUT ANY WARRANTY; without even the implied warranty of 
     23MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
     24GNU General Public License for more details. 
     25 
     26You should have received a copy of the GNU General Public License 
     27along with this program; if not, write to the Free Software 
     28Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. 
    2829*/ 
    2930 
    30 define('AKISMET_VERSION', '2.4.0'); 
     31define('AKISMET_VERSION', '2.5.3'); 
     32define('AKISMET_PLUGIN_URL', plugin_dir_url( __FILE__ )); 
    3133 
    3234/** If you hardcode a WP.com API key here, all key config screens will be hidden */ 
     
    4244} 
    4345 
    44 if ( $wp_db_version <= 9872 ) 
    45         include_once( dirname(__FILE__) . '/legacy.php' ); 
     46if ( isset($wp_db_version) && $wp_db_version <= 9872 ) 
     47        include_once dirname( __FILE__ ) . '/legacy.php'; 
     48 
     49include_once dirname( __FILE__ ) . '/widget.php'; 
     50 
     51if ( is_admin() ) 
     52        require_once dirname( __FILE__ ) . '/admin.php'; 
    4653 
    4754function akismet_init() { 
     
    5461 
    5562        $akismet_api_port = 80; 
    56         add_action('admin_menu', 'akismet_config_page'); 
    57         add_action('admin_menu', 'akismet_stats_page'); 
    58         akismet_admin_warnings(); 
    5963} 
    6064add_action('init', 'akismet_init'); 
    61  
    62 function akismet_admin_init() { 
    63         if ( function_exists( 'get_plugin_page_hook' ) ) 
    64                 $hook = get_plugin_page_hook( 'akismet-stats-display', 'index.php' ); 
    65         else 
    66                 $hook = 'dashboard_page_akismet-stats-display'; 
    67         add_action('admin_head-'.$hook, 'akismet_stats_script'); 
    68 } 
    69 add_action('admin_init', 'akismet_admin_init'); 
    70  
    71 if ( !function_exists('wp_nonce_field') ) { 
    72         function akismet_nonce_field($action = -1) { return; } 
    73         $akismet_nonce = -1; 
    74 } else { 
    75         function akismet_nonce_field($action = -1) { return wp_nonce_field($action); } 
    76         $akismet_nonce = 'akismet-update-key'; 
    77 } 
    78  
    79 if ( !function_exists('number_format_i18n') ) { 
    80         function number_format_i18n( $number, $decimals = null ) { return number_format( $number, $decimals ); } 
    81 } 
    82  
    83 function akismet_config_page() { 
    84         if ( function_exists('add_submenu_page') ) 
    85                 add_submenu_page('plugins.php', __('Akismet Configuration'), __('Akismet Configuration'), 'manage_options', 'akismet-key-config', 'akismet_conf'); 
    86  
    87 } 
    88  
    89 function akismet_conf() { 
    90         global $akismet_nonce, $wpcom_api_key; 
    91  
    92         if ( isset($_POST['submit']) ) { 
    93                 if ( function_exists('current_user_can') && !current_user_can('manage_options') ) 
    94                         die(__('Cheatin&#8217; uh?')); 
    95  
    96                 check_admin_referer( $akismet_nonce ); 
    97                 $key = preg_replace( '/[^a-h0-9]/i', '', $_POST['key'] ); 
    98  
    99                 if ( empty($key) ) { 
    100                         $key_status = 'empty'; 
    101                         $ms[] = 'new_key_empty'; 
    102                         delete_option('wordpress_api_key'); 
    103                 } else { 
    104                         $key_status = akismet_verify_key( $key ); 
    105                 } 
    106  
    107                 if ( $key_status == 'valid' ) { 
    108                         update_option('wordpress_api_key', $key); 
    109                         $ms[] = 'new_key_valid'; 
    110                 } else if ( $key_status == 'invalid' ) { 
    111                         $ms[] = 'new_key_invalid'; 
    112                 } else if ( $key_status == 'failed' ) { 
    113                         $ms[] = 'new_key_failed'; 
    114                 } 
    115  
    116                 if ( isset( $_POST['akismet_discard_month'] ) ) 
    117                         update_option( 'akismet_discard_month', 'true' ); 
    118                 else 
    119                         update_option( 'akismet_discard_month', 'false' ); 
    120         } elseif ( isset($_POST['check']) ) { 
    121                 akismet_get_server_connectivity(0); 
    122         } 
    123  
    124         if ( empty( $key_status) ||  $key_status != 'valid' ) { 
    125                 $key = get_option('wordpress_api_key'); 
    126                 if ( empty( $key ) ) { 
    127                         if ( empty( $key_status ) || $key_status != 'failed' ) { 
    128                                 if ( akismet_verify_key( '1234567890ab' ) == 'failed' ) 
    129                                         $ms[] = 'no_connection'; 
    130                                 else 
    131                                         $ms[] = 'key_empty'; 
    132                         } 
    133                         $key_status = 'empty'; 
    134                 } else { 
    135                         $key_status = akismet_verify_key( $key ); 
    136                 } 
    137                 if ( $key_status == 'valid' ) { 
    138                         $ms[] = 'key_valid'; 
    139                 } else if ( $key_status == 'invalid' ) { 
    140                         delete_option('wordpress_api_key'); 
    141                         $ms[] = 'key_empty'; 
    142                 } else if ( !empty($key) && $key_status == 'failed' ) { 
    143                         $ms[] = 'key_failed'; 
    144                 } 
    145         } 
    146  
    147         $messages = array( 
    148                 'new_key_empty' => array('color' => 'aa0', 'text' => __('Your key has been cleared.')), 
    149                 'new_key_valid' => array('color' => '2d2', 'text' => __('Your key has been verified. Happy blogging!')), 
    150                 'new_key_invalid' => array('color' => 'd22', 'text' => __('The key you entered is invalid. Please double-check it.')), 
    151                 'new_key_failed' => array('color' => 'd22', 'text' => __('The key you entered could not be verified because a connection to akismet.com could not be established. Please check your server configuration.')), 
    152                 'no_connection' => array('color' => 'd22', 'text' => __('There was a problem connecting to the Akismet server. Please check your server configuration.')), 
    153                 '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/')), 
    154                 'key_valid' => array('color' => '2d2', 'text' => __('This key is valid.')), 
    155                 '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.'))); 
    156 ?> 
    157 <?php if ( !empty($_POST['submit'] ) ) : ?> 
    158 <div id="message" class="updated fade"><p><strong><?php _e('Options saved.') ?></strong></p></div> 
    159 <?php endif; ?> 
    160 <div class="wrap"> 
    161 <h2><?php _e('Akismet Configuration'); ?></h2> 
    162 <div class="narrow"> 
    163 <form action="" method="post" id="akismet-conf" style="margin: auto; width: 400px; "> 
    164 <?php if ( !$wpcom_api_key ) { ?> 
    165         <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> 
    166  
    167 <h3><label for="key"><?php _e('Akismet API Key'); ?></label></h3> 
    168 <?php foreach ( $ms as $m ) : ?> 
    169         <p style="padding: .5em; background-color: #<?php echo $messages[$m]['color']; ?>; color: #fff; font-weight: bold;"><?php echo $messages[$m]['text']; ?></p> 
    170 <?php endforeach; ?> 
    171 <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> 
    172 <?php if ( isset( $invalid_key) && $invalid_key ) { ?> 
    173 <h3><?php _e('Why might my key be invalid?'); ?></h3> 
    174 <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> 
    175 <?php } ?> 
    176 <?php } ?> 
    177 <?php akismet_nonce_field($akismet_nonce) ?> 
    178 <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('Automatically discard spam comments on posts older than a month.'); ?></label></p> 
    179         <p class="submit"><input type="submit" name="submit" value="<?php _e('Update options &raquo;'); ?>" /></p> 
    180 </form> 
    181  
    182 <form action="" method="post" id="akismet-connectivity" style="margin: auto; width: 400px; "> 
    183  
    184 <h3><?php _e('Server Connectivity'); ?></h3> 
    185 <?php 
    186         if ( !function_exists('fsockopen') || !function_exists('gethostbynamel') ) { 
    187                 ?> 
    188                         <p style="padding: .5em; background-color: #d22; color: #fff; font-weight:bold;"><?php _e('Network functions are disabled.'); ?></p> 
    189                         <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> 
    190                 <?php 
    191         } else { 
    192                 $servers = akismet_get_server_connectivity(); 
    193                 $fail_count = count($servers) - count( array_filter($servers) ); 
    194                 if ( is_array($servers) && count($servers) > 0 ) { 
    195                         // some connections work, some fail 
    196                         if ( $fail_count > 0 && $fail_count < count($servers) ) { ?> 
    197                                 <p style="padding: .5em; background-color: #aa0; color: #fff; font-weight:bold;"><?php _e('Unable to reach some Akismet servers.'); ?></p> 
    198                                 <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> 
    199                         <?php 
    200                         // all connections fail 
    201                         } elseif ( $fail_count > 0 ) { ?> 
    202                                 <p style="padding: .5em; background-color: #d22; color: #fff; font-weight:bold;"><?php _e('Unable to reach any Akismet servers.'); ?></p> 
    203                                 <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> 
    204                         <?php 
    205                         // all connections work 
    206                         } else { ?> 
    207                                 <p style="padding: .5em; background-color: #2d2; color: #fff; font-weight:bold;"><?php  _e('All Akismet servers are available.'); ?></p> 
    208                                 <p><?php _e('Akismet is working correctly.  All servers are accessible.'); ?></p> 
    209                         <?php 
    210                         } 
    211                 } else { 
    212                         ?> 
    213                                 <p style="padding: .5em; background-color: #d22; color: #fff; font-weight:bold;"><?php _e('Unable to find Akismet servers.'); ?></p> 
    214                                 <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> 
    215                         <?php 
    216                 } 
    217         } 
    218          
    219         if ( !empty($servers) ) { 
    220 ?> 
    221 <table style="width: 100%;"> 
    222 <thead><th><?php _e('Akismet server'); ?></th><th><?php _e('Network Status'); ?></th></thead> 
    223 <tbody> 
    224 <?php 
    225                 asort($servers); 
    226                 foreach ( $servers as $ip => $status ) { 
    227                         $color = ( $status ? '#2d2' : '#d22'); 
    228         ?> 
    229                 <tr> 
    230                 <td><?php echo htmlspecialchars($ip); ?></td> 
    231                 <td style="padding: 0 .5em; font-weight:bold; color: #fff; background-color: <?php echo $color; ?>"><?php echo ($status ? __('No problems') : __('Obstructed') ); ?></td> 
    232                  
    233         <?php 
    234                 } 
    235         } 
    236 ?> 
    237 </tbody> 
    238 </table> 
    239         <p><?php if ( get_option('akismet_connectivity_time') ) echo sprintf( __('Last checked %s ago.'), human_time_diff( get_option('akismet_connectivity_time') ) ); ?></p> 
    240         <p class="submit"><input type="submit" name="check" value="<?php _e('Check network status &raquo;'); ?>" /></p> 
    241 </form> 
    242  
    243 </div> 
    244 </div> 
    245 <?php 
    246 } 
    247  
    248 function akismet_stats_page() { 
    249         if ( function_exists('add_submenu_page') ) 
    250                 add_submenu_page('index.php', __('Akismet Stats'), __('Akismet Stats'), 'manage_options', 'akismet-stats-display', 'akismet_stats_display'); 
    251  
    252 } 
    253  
    254 function akismet_stats_script() { 
    255         ?> 
    256 <script type="text/javascript"> 
    257 function resizeIframe() { 
    258     var height = document.documentElement.clientHeight; 
    259     height -= document.getElementById('akismet-stats-frame').offsetTop; 
    260     height += 100; // magic padding 
    261      
    262     document.getElementById('akismet-stats-frame').style.height = height +"px"; 
    263      
    264 }; 
    265 function resizeIframeInit() { 
    266         document.getElementById('akismet-stats-frame').onload = resizeIframe; 
    267         window.onresize = resizeIframe; 
    268 } 
    269 addLoadEvent(resizeIframeInit); 
    270 </script><?php 
    271 } 
    272  
    273  
    274 function akismet_stats_display() { 
    275         global $akismet_api_host, $akismet_api_port, $wpcom_api_key; 
    276         $blog = urlencode( get_option('home') ); 
    277         $url = "http://".akismet_get_key().".web.akismet.com/1.0/user-stats.php?blog={$blog}"; 
    278         ?> 
    279         <div class="wrap"> 
    280         <iframe src="<?php echo $url; ?>" width="100%" height="100%" frameborder="0" id="akismet-stats-frame"></iframe> 
    281         </div> 
    282         <?php 
    283 } 
    284  
    285 function akismet_stats() { 
    286         if ( !function_exists('did_action') || did_action( 'rightnow_end' ) ) // We already displayed this info in the "Right Now" section 
    287                 return; 
    288         if ( !$count = get_option('akismet_spam_count') ) 
    289                 return; 
    290         $path = plugin_basename(__FILE__); 
    291         echo '<h3>'.__('Spam').'</h3>'; 
    292         global $submenu; 
    293         if ( isset( $submenu['edit-comments.php'] ) ) 
    294                 $link = 'edit-comments.php'; 
    295         else 
    296                 $link = 'edit.php'; 
    297         echo '<p>'.sprintf(__('<a href="%1$s">Akismet</a> has protected your site from <a href="%2$s">%3$s spam comments</a>.'), 'http://akismet.com/', clean_url("$link?page=akismet-admin"), number_format_i18n($count) ).'</p>'; 
    298 } 
    299 add_action('activity_box_end', 'akismet_stats'); 
    30065 
    30166function akismet_get_key() { 
     
    31782} 
    31883 
    319 // Check connectivity between the WordPress blog and Akismet's servers. 
    320 // 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). 
    321 function akismet_check_server_connectivity() { 
    322         global $akismet_api_host, $akismet_api_port, $wpcom_api_key; 
    323          
    324         $test_host = 'rest.akismet.com'; 
    325          
    326         // Some web hosts may disable one or both functions 
    327         if ( !function_exists('fsockopen') || !function_exists('gethostbynamel') ) 
    328                 return array(); 
    329          
    330         $ips = gethostbynamel($test_host); 
    331         if ( !$ips || !is_array($ips) || !count($ips) ) 
    332                 return array(); 
    333                  
    334         $servers = array(); 
    335         foreach ( $ips as $ip ) { 
    336                 $response = akismet_verify_key( akismet_get_key(), $ip ); 
    337                 // even if the key is invalid, at least we know we have connectivity 
    338                 if ( $response == 'valid' || $response == 'invalid' ) 
    339                         $servers[$ip] = true; 
    340                 else 
    341                         $servers[$ip] = false; 
    342         } 
    343  
    344         return $servers; 
    345 } 
    346  
    347 // Check the server connectivity and store the results in an option. 
    348 // Cached results will be used if not older than the specified timeout in seconds; use $cache_timeout = 0 to force an update. 
    349 // Returns the same associative array as akismet_check_server_connectivity() 
    350 function akismet_get_server_connectivity( $cache_timeout = 86400 ) { 
    351         $servers = get_option('akismet_available_servers'); 
    352         if ( (time() - get_option('akismet_connectivity_time') < $cache_timeout) && $servers !== false ) 
    353                 return $servers; 
    354          
    355         // There's a race condition here but the effect is harmless. 
    356         $servers = akismet_check_server_connectivity(); 
    357         update_option('akismet_available_servers', $servers); 
    358         update_option('akismet_connectivity_time', time()); 
    359         return $servers; 
    360 } 
    361  
    362 // Returns true if server connectivity was OK at the last check, false if there was a problem that needs to be fixed. 
    363 function akismet_server_connectivity_ok() { 
    364         // skip the check on WPMU because the status page is hidden 
    365         global $wpcom_api_key; 
    366         if ( $wpcom_api_key ) 
     84// if we're in debug or test modes, use a reduced service level so as not to polute training or stats data 
     85function akismet_test_mode() { 
     86        if ( defined('AKISMET_TEST_MODE') && AKISMET_TEST_MODE ) 
    36787                return true; 
    368         $servers = akismet_get_server_connectivity(); 
    369         return !( empty($servers) || !count($servers) || count( array_filter($servers) ) < count($servers) ); 
    370 } 
    371  
    372 function akismet_admin_warnings() { 
    373         global $wpcom_api_key; 
    374         if ( !get_option('wordpress_api_key') && !$wpcom_api_key && !isset($_POST['submit']) ) { 
    375                 function akismet_warning() { 
    376                         echo " 
    377                         <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> 
    378                         "; 
    379                 } 
    380                 add_action('admin_notices', 'akismet_warning'); 
    381                 return; 
    382         } elseif ( get_option('akismet_connectivity_time') && empty($_POST) && is_admin() && !akismet_server_connectivity_ok() ) { 
    383                 function akismet_warning() { 
    384                         echo " 
    385                         <div id='akismet-warning' class='updated fade'><p><strong>".__('Akismet has detected a problem.')."</strong> ".sprintf(__('A server or network problem is preventing Akismet from working correctly.  <a href="%1$s">Click here for more information</a> about how to fix the problem.'), "plugins.php?page=akismet-key-config")."</p></div> 
    386                         "; 
    387                 } 
    388                 add_action('admin_notices', 'akismet_warning'); 
    389                 return; 
    390         } 
    391 } 
    392  
    393 function akismet_get_host($host) { 
    394         // if all servers are accessible, just return the host name. 
    395         // if not, return an IP that was known to be accessible at the last check. 
    396         if ( akismet_server_connectivity_ok() ) { 
    397                 return $host; 
    398         } else { 
    399                 $ips = akismet_get_server_connectivity(); 
    400                 // a firewall may be blocking access to some Akismet IPs 
    401                 if ( count($ips) > 0 && count(array_filter($ips)) < count($ips) ) { 
    402                         // use DNS to get current IPs, but exclude any known to be unreachable 
    403                         $dns = (array)gethostbynamel( rtrim($host, '.') . '.' ); 
    404                         $dns = array_filter($dns); 
    405                         foreach ( $dns as $ip ) { 
    406                                 if ( array_key_exists( $ip, $ips ) && empty( $ips[$ip] ) ) 
    407                                         unset($dns[$ip]); 
    408                         } 
    409                         // return a random IP from those available 
    410                         if ( count($dns) ) 
    411                                 return $dns[ array_rand($dns) ]; 
    412                          
    413                 } 
    414         } 
    415         // if all else fails try the host name 
    416         return $host; 
     88        return false; 
    41789} 
    41890 
     
    429101                        $roles = join(',', $comment_user->roles); 
    430102        } 
    431          
     103 
     104        if ( is_multisite() && is_super_admin( $user_id ) ) { 
     105                if ( empty( $roles ) ) { 
     106                        $roles = 'super_admin'; 
     107                } else { 
     108                        $comment_user->roles[] = 'super_admin'; 
     109                        $roles = join( ',', $comment_user->roles ); 
     110                } 
     111        } 
     112 
    432113        return $roles; 
    433114} 
     
    436117function akismet_http_post($request, $host, $path, $port = 80, $ip=null) { 
    437118        global $wp_version; 
    438          
    439         $akismet_version = constant('AKISMET_VERSION'); 
    440  
    441         $http_request  = "POST $path HTTP/1.0\r\n"; 
    442         $http_request .= "Host: $host\r\n"; 
    443         $http_request .= "Content-Type: application/x-www-form-urlencoded; charset=" . get_option('blog_charset') . "\r\n"; 
    444         $http_request .= "Content-Length: " . strlen($request) . "\r\n"; 
    445         $http_request .= "User-Agent: WordPress/$wp_version | Akismet/$akismet_version\r\n"; 
    446         $http_request .= "\r\n"; 
    447         $http_request .= $request; 
    448          
     119 
     120        $akismet_ua = "WordPress/{$wp_version} | "; 
     121        $akismet_ua .= 'Akismet/' . constant( 'AKISMET_VERSION' ); 
     122 
     123        $content_length = strlen( $request ); 
     124 
    449125        $http_host = $host; 
    450         // use a specific IP if provided - needed by akismet_check_server_connectivity() 
    451         if ( $ip && long2ip(ip2long($ip)) ) { 
     126        // use a specific IP if provided 
     127        // needed by akismet_check_server_connectivity() 
     128        if ( $ip && long2ip( ip2long( $ip ) ) ) { 
    452129                $http_host = $ip; 
    453130        } else { 
    454                 $http_host = akismet_get_host($host); 
    455         } 
    456  
    457         $response = ''; 
    458         if( false != ( $fs = @fsockopen($http_host, $port, $errno, $errstr, 10) ) ) { 
    459                 fwrite($fs, $http_request); 
    460  
    461                 while ( !feof($fs) ) 
    462                         $response .= fgets($fs, 1160); // One TCP-IP packet 
    463                 fclose($fs); 
    464                 $response = explode("\r\n\r\n", $response, 2); 
    465         } 
    466         return $response; 
     131                $http_host = $host; 
     132        } 
     133         
     134        // use the WP HTTP class if it is available 
     135        if ( function_exists( 'wp_remote_post' ) ) { 
     136                $http_args = array( 
     137                        'body'                  => $request, 
     138                        'headers'               => array( 
     139                                'Content-Type'  => 'application/x-www-form-urlencoded; ' . 
     140                                                                        'charset=' . get_option( 'blog_charset' ), 
     141                                'Host'                  => $host, 
     142                                'User-Agent'    => $akismet_ua 
     143                        ), 
     144                        'httpversion'   => '1.0', 
     145                        'timeout'               => 15 
     146                ); 
     147                $akismet_url = "http://{$http_host}{$path}"; 
     148                $response = wp_remote_post( $akismet_url, $http_args ); 
     149                if ( is_wp_error( $response ) ) 
     150                        return ''; 
     151 
     152                return array( $response['headers'], $response['body'] ); 
     153        } else { 
     154                $http_request  = "POST $path HTTP/1.0\r\n"; 
     155                $http_request .= "Host: $host\r\n"; 
     156                $http_request .= 'Content-Type: application/x-www-form-urlencoded; charset=' . get_option('blog_charset') . "\r\n"; 
     157                $http_request .= "Content-Length: {$content_length}\r\n"; 
     158                $http_request .= "User-Agent: {$akismet_ua}\r\n"; 
     159                $http_request .= "\r\n"; 
     160                $http_request .= $request; 
     161                 
     162                $response = ''; 
     163                if( false != ( $fs = @fsockopen( $http_host, $port, $errno, $errstr, 10 ) ) ) { 
     164                        fwrite( $fs, $http_request ); 
     165 
     166                        while ( !feof( $fs ) ) 
     167                                $response .= fgets( $fs, 1160 ); // One TCP-IP packet 
     168                        fclose( $fs ); 
     169                        $response = explode( "\r\n\r\n", $response, 2 ); 
     170                } 
     171                return $response; 
     172        } 
    467173} 
    468174 
     
    472178        if ( $incr = apply_filters('akismet_spam_count_incr', 1) ) 
    473179                update_option( 'akismet_spam_count', get_option('akismet_spam_count') + $incr ); 
     180        // this is a one-shot deal 
     181        remove_filter( 'pre_comment_approved', 'akismet_result_spam' ); 
    474182        return 'spam'; 
    475183} 
    476184 
     185function akismet_result_hold( $approved ) { 
     186        // once only 
     187        remove_filter( 'pre_comment_approved', 'akismet_result_hold' ); 
     188        return '0'; 
     189} 
     190 
     191// how many approved comments does this author have? 
     192function akismet_get_user_comments_approved( $user_id, $comment_author_email, $comment_author, $comment_author_url ) { 
     193        global $wpdb; 
     194         
     195        if ( !empty($user_id) ) 
     196                return $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->comments WHERE user_id = %d AND comment_approved = 1", $user_id ) ); 
     197                 
     198        if ( !empty($comment_author_email) ) 
     199                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 ) ); 
     200                 
     201        return 0; 
     202} 
     203 
     204function akismet_microtime() { 
     205        $mtime = explode( ' ', microtime() ); 
     206        return $mtime[1] + $mtime[0]; 
     207} 
     208 
     209// log an event for a given comment, storing it in comment_meta 
     210function akismet_update_comment_history( $comment_id, $message, $event=null ) { 
     211        global $current_user; 
     212 
     213        // failsafe for old WP versions 
     214        if ( !function_exists('add_comment_meta') ) 
     215                return false; 
     216         
     217        $user = ''; 
     218        if ( is_object($current_user) && isset($current_user->user_login) ) 
     219                $user = $current_user->user_login; 
     220 
     221        $event = array( 
     222                'time' => akismet_microtime(), 
     223                'message' => $message, 
     224                'event' => $event, 
     225                'user' => $user, 
     226        ); 
     227 
     228        // $unique = false so as to allow multiple values per comment 
     229        $r = add_comment_meta( $comment_id, 'akismet_history', $event, false ); 
     230} 
     231 
     232// get the full comment history for a given comment, as an array in reverse chronological order 
     233function akismet_get_comment_history( $comment_id ) { 
     234         
     235        // failsafe for old WP versions 
     236        if ( !function_exists('add_comment_meta') ) 
     237                return false; 
     238 
     239        $history = get_comment_meta( $comment_id, 'akismet_history', false ); 
     240        usort( $history, 'akismet_cmp_time' ); 
     241        return $history; 
     242} 
     243 
     244function akismet_cmp_time( $a, $b ) { 
     245        return $a['time'] > $b['time'] ? -1 : 1; 
     246} 
     247 
     248// this fires on wp_insert_comment.  we can't update comment_meta when akismet_auto_check_comment() runs 
     249// because we don't know the comment ID at that point. 
     250function akismet_auto_check_update_meta( $id, $comment ) { 
     251        global $akismet_last_comment; 
     252 
     253        // failsafe for old WP versions 
     254        if ( !function_exists('add_comment_meta') ) 
     255                return false; 
     256 
     257        // wp_insert_comment() might be called in other contexts, so make sure this is the same comment 
     258        // as was checked by akismet_auto_check_comment 
     259        if ( is_object($comment) && !empty($akismet_last_comment) && is_array($akismet_last_comment) ) { 
     260                if ( intval($akismet_last_comment['comment_post_ID']) == intval($comment->comment_post_ID) 
     261                        && $akismet_last_comment['comment_author'] == $comment->comment_author 
     262                        && $akismet_last_comment['comment_author_email'] == $comment->comment_author_email ) { 
     263                                // normal result: true or false 
     264                                if ( $akismet_last_comment['akismet_result'] == 'true' ) { 
     265                                        update_comment_meta( $comment->comment_ID, 'akismet_result', 'true' ); 
     266                                        akismet_update_comment_history( $comment->comment_ID, __('Akismet caught this comment as spam'), 'check-spam' ); 
     267                                        if ( $comment->comment_approved != 'spam' ) 
     268                                                akismet_update_comment_history( $comment->comment_ID, sprintf( __('Comment status was changed to %s'), $comment->comment_approved), 'status-changed'.$comment->comment_approved ); 
     269                                } elseif ( $akismet_last_comment['akismet_result'] == 'false' ) { 
     270                                        update_comment_meta( $comment->comment_ID, 'akismet_result', 'false' ); 
     271                                        akismet_update_comment_history( $comment->comment_ID, __('Akismet cleared this comment'), 'check-ham' ); 
     272                                        if ( $comment->comment_approved == 'spam' ) { 
     273                                                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) ) 
     274                                                        akismet_update_comment_history( $comment->comment_ID, __('Comment was caught by wp_blacklist_check'), 'wp-blacklisted' ); 
     275                                                else 
     276                                                        akismet_update_comment_history( $comment->comment_ID, sprintf( __('Comment status was changed to %s'), $comment->comment_approved), 'status-changed-'.$comment->comment_approved ); 
     277                                        } 
     278                                // abnormal result: error 
     279                                } else { 
     280                                        update_comment_meta( $comment->comment_ID, 'akismet_error', time() ); 
     281                                        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' ); 
     282                                } 
     283                                 
     284                                // record the complete original data as submitted for checking 
     285                                if ( isset($akismet_last_comment['comment_as_submitted']) ) 
     286                                        update_comment_meta( $comment->comment_ID, 'akismet_as_submitted', $akismet_last_comment['comment_as_submitted'] ); 
     287                } 
     288        } 
     289} 
     290 
     291add_action( 'wp_insert_comment', 'akismet_auto_check_update_meta', 10, 2 ); 
     292 
     293 
    477294function akismet_auto_check_comment( $commentdata ) { 
    478         global $akismet_api_host, $akismet_api_port; 
     295        global $akismet_api_host, $akismet_api_port, $akismet_last_comment; 
    479296 
    480297        $comment = $commentdata; 
     
    489306        $comment['user_role'] = akismet_get_user_roles($comment['user_ID']); 
    490307 
     308        $akismet_nonce_option = apply_filters( 'akismet_comment_nonce', get_option( 'akismet_comment_nonce' ) ); 
     309        $comment['akismet_comment_nonce'] = 'inactive'; 
     310        if ( $akismet_nonce_option == 'true' || $akismet_nonce_option == '' ) { 
     311                $comment['akismet_comment_nonce'] = 'failed'; 
     312                if ( isset( $_POST['akismet_comment_nonce'] ) && wp_verify_nonce( $_POST['akismet_comment_nonce'], 'akismet_comment_nonce_' . $comment['comment_post_ID'] ) ) 
     313                        $comment['akismet_comment_nonce'] = 'passed'; 
     314 
     315                // comment reply in wp-admin 
     316                if ( isset( $_POST['_ajax_nonce-replyto-comment'] ) && check_ajax_referer( 'replyto-comment', '_ajax_nonce-replyto-comment' ) ) 
     317                        $comment['akismet_comment_nonce'] = 'passed'; 
     318 
     319        } 
     320 
     321        if ( akismet_test_mode() ) 
     322                $comment['is_test'] = 'true'; 
     323                 
     324        foreach ($_POST as $key => $value ) { 
     325                if ( is_string($value) ) 
     326                        $comment["POST_{$key}"] = $value; 
     327        } 
     328 
    491329        $ignore = array( 'HTTP_COOKIE', 'HTTP_COOKIE2', 'PHP_AUTH_PW' ); 
    492330 
    493         foreach ( $_SERVER as $key => $value ) 
     331        foreach ( $_SERVER as $key => $value ) { 
    494332                if ( !in_array( $key, $ignore ) && is_string($value) ) 
    495333                        $comment["$key"] = $value; 
    496334                else 
    497335                        $comment["$key"] = ''; 
     336        } 
    498337 
    499338        $query_string = ''; 
    500339        foreach ( $comment as $key => $data ) 
    501340                $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; 
     341                 
     342        $commentdata['comment_as_submitted'] = $comment; 
    502343 
    503344        $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port); 
     
    518359                        if ( $incr = apply_filters('akismet_spam_count_incr', 1) ) 
    519360                                update_option( 'akismet_spam_count', get_option('akismet_spam_count') + $incr ); 
    520                         die; 
    521                 } 
     361                        wp_redirect( $_SERVER['HTTP_REFERER'] ); 
     362                        die(); 
     363                } 
     364        } 
     365         
     366        // if the response is neither true nor false, hold the comment for moderation and schedule a recheck 
     367        if ( 'true' != $response[1] && 'false' != $response[1] ) { 
     368                add_filter('pre_comment_approved', 'akismet_result_hold'); 
     369                wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' ); 
    522370        } 
    523371         
     
    530378                akismet_delete_old(); 
    531379        } 
     380        $akismet_last_comment = $commentdata; 
    532381        return $commentdata; 
    533382} 
     383 
     384add_action('preprocess_comment', 'akismet_auto_check_comment', 1); 
    534385 
    535386function akismet_delete_old() { 
     
    539390        if ( empty( $comment_ids ) ) 
    540391                return; 
     392                 
     393        $comma_comment_ids = implode( ', ', array_map('intval', $comment_ids) ); 
    541394 
    542395        do_action( 'delete_comment', $comment_ids ); 
    543         $wpdb->query("DELETE FROM $wpdb->comments WHERE comment_id IN ( " . implode( ', ', $comment_ids ) . " )"); 
     396        $wpdb->query("DELETE FROM $wpdb->comments WHERE comment_id IN ( $comma_comment_ids )"); 
     397        $wpdb->query("DELETE FROM $wpdb->commentmeta WHERE comment_id IN ( $comma_comment_ids )"); 
     398        clean_comment_cache( $comment_ids ); 
    544399        $n = mt_rand(1, 5000); 
    545400        if ( apply_filters('akismet_optimize_table', ($n == 11)) ) // lucky number 
     
    550405add_action('akismet_scheduled_delete', 'akismet_delete_old'); 
    551406 
    552 function akismet_submit_nonspam_comment ( $comment_id ) { 
    553         global $wpdb, $akismet_api_host, $akismet_api_port, $current_user, $current_site; 
    554         $comment_id = (int) $comment_id; 
    555  
    556         $comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'"); 
    557         if ( !$comment ) // it was deleted 
    558                 return; 
    559         $comment->blog = get_option('home'); 
    560         $comment->blog_lang = get_locale(); 
    561         $comment->blog_charset = get_option('blog_charset'); 
    562         $comment->permalink = get_permalink($comment->comment_post_ID); 
    563         if ( is_object($current_user) ) { 
    564             $comment->reporter = $current_user->user_login; 
    565         } 
    566         if ( is_object($current_site) ) { 
    567                 $comment->site_domain = $current_site->domain; 
    568         } 
    569  
    570         $comment->user_role = ''; 
    571         if ( isset( $comment->user_ID ) ) 
    572                 $comment->user_role = akismet_get_user_roles($comment->user_ID); 
    573  
    574         $query_string = ''; 
    575         foreach ( $comment as $key => $data ) 
    576                 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; 
    577  
    578         $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-ham", $akismet_api_port); 
    579         do_action('akismet_submit_nonspam_comment', $comment_id, $response[1]); 
    580 } 
    581  
    582 function akismet_submit_spam_comment ( $comment_id ) { 
    583         global $wpdb, $akismet_api_host, $akismet_api_port, $current_user, $current_site; 
    584         $comment_id = (int) $comment_id; 
    585  
    586         $comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'"); 
    587         if ( !$comment ) // it was deleted 
    588                 return; 
    589         if ( 'spam' != $comment->comment_approved ) 
    590                 return; 
    591         $comment->blog = get_option('home'); 
    592         $comment->blog_lang = get_locale(); 
    593         $comment->blog_charset = get_option('blog_charset'); 
    594         $comment->permalink = get_permalink($comment->comment_post_ID); 
    595         if ( is_object($current_user) ) { 
    596             $comment->reporter = $current_user->user_login; 
    597         } 
    598         if ( is_object($current_site) ) { 
    599                 $comment->site_domain = $current_site->domain; 
    600         } 
    601  
    602         $comment->user_role = ''; 
    603         if ( !isset( $comment->user_id ) ) 
    604                 $comment->user_role = akismet_get_user_roles($comment->user_ID); 
    605  
    606         $query_string = ''; 
    607         foreach ( $comment as $key => $data ) 
    608                 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; 
    609  
    610         $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-spam", $akismet_api_port); 
    611         do_action('akismet_submit_spam_comment', $comment_id, $response[1]); 
    612 } 
    613  
    614 add_action('preprocess_comment', 'akismet_auto_check_comment', 1); 
    615  
    616 // For old versions of WP only 
    617 function akismet_set_comment_status( $comment_id, $status ) { 
    618         if ( $status == 'spam' ) { 
    619                 akismet_submit_spam_comment( $comment_id ); 
    620         } elseif ( $status == 'approve' ) { 
    621                 akismet_submit_nonspam_comment( $comment_id ); 
    622         } 
    623 } 
    624  
    625 // For WP 2.7+ 
    626 function akismet_transition_comment_status( $new_status, $old_status, $comment ) { 
    627         if ( $new_status == $old_status ) 
    628                 return; 
    629  
    630         if ( $new_status == 'spam' ) { 
    631                 akismet_submit_spam_comment( $comment->comment_ID ); 
    632         } elseif ( $old_status == 'spam' && ( $new_status == 'approved' || $new_status == 'unapproved' ) ) { 
    633                 akismet_submit_nonspam_comment( $comment->comment_ID ); 
    634         } 
    635 } 
    636  
    637 function akismet_spamtoham( $comment ) { akismet_submit_nonspam_comment( $comment->comment_ID ); } 
    638  
    639 if ( function_exists( 'wp_transition_comment_status' ) ) { 
    640         add_action( 'transition_comment_status', 'akismet_transition_comment_status', 10, 3 ); 
    641 } else { 
    642         add_action('wp_set_comment_status', 'akismet_set_comment_status', 10, 2); 
    643         add_action('edit_comment', 'akismet_submit_spam_comment'); 
    644         add_filter( 'comment_spam_to_approved', 'akismet_spamtoham' ); 
    645         add_filter( 'comment_spam_to_unapproved', 'akismet_spamtoham' ); 
    646 } 
    647 // Total spam in queue 
    648 // get_option( 'akismet_spam_count' ) is the total caught ever 
    649 function akismet_spam_count( $type = false ) { 
     407function akismet_check_db_comment( $id, $recheck_reason = 'recheck_queue' ) { 
     408    global $wpdb, $akismet_api_host, $akismet_api_port; 
     409 
     410    $id = (int) $id; 
     411    $c = $wpdb->get_row( "SELECT * FROM $wpdb->comments WHERE comment_ID = '$id'", ARRAY_A ); 
     412    if ( !$c ) 
     413        return; 
     414 
     415    $c['user_ip']    = $c['comment_author_IP']; 
     416    $c['user_agent'] = $c['comment_agent']; 
     417    $c['referrer']   = ''; 
     418    $c['blog']       = get_option('home'); 
     419    $c['blog_lang']  = get_locale(); 
     420    $c['blog_charset'] = get_option('blog_charset'); 
     421    $c['permalink']  = get_permalink($c['comment_post_ID']); 
     422    $id = $c['comment_ID']; 
     423        if ( akismet_test_mode() ) 
     424                $c['is_test'] = 'true'; 
     425        $c['recheck_reason'] = $recheck_reason; 
     426 
     427    $query_string = ''; 
     428    foreach ( $c as $key => $data ) 
     429    $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; 
     430 
     431    $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port); 
     432    return $response[1]; 
     433} 
     434 
     435function akismet_cron_recheck() { 
    650436        global $wpdb; 
    651437 
    652         if ( !$type ) { // total 
    653                 $count = wp_cache_get( 'akismet_spam_count', 'widget' ); 
    654                 if ( false === $count ) { 
    655                         if ( function_exists('wp_count_comments') ) { 
    656                                 $count = wp_count_comments(); 
    657                                 $count = $count->spam; 
    658                         } else { 
    659                                 $count = (int) $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam'"); 
     438        delete_option('akismet_available_servers'); 
     439 
     440        $comment_errors = $wpdb->get_col( " 
     441                SELECT comment_id 
     442                FROM {$wpdb->prefix}commentmeta 
     443                WHERE meta_key = 'akismet_error' 
     444                LIMIT 100 
     445        " ); 
     446         
     447        foreach ( (array) $comment_errors as $comment_id ) { 
     448                // if the comment no longer exists, remove the meta entry from the queue to avoid getting stuck 
     449                if ( !get_comment( $comment_id ) ) { 
     450                        delete_comment_meta( $comment_id, 'akismet_error' ); 
     451                        continue; 
     452                } 
     453                 
     454                add_comment_meta( $comment_id, 'akismet_rechecking', true ); 
     455                $status = akismet_check_db_comment( $comment_id, 'retry' ); 
     456 
     457                $msg = ''; 
     458                if ( $status == 'true' ) { 
     459                        $msg = __( 'Akismet caught this comment as spam during an automatic retry.' ); 
     460                } elseif ( $status == 'false' ) { 
     461                        $msg = __( 'Akismet cleared this comment during an automatic retry.' ); 
     462                } 
     463                 
     464                // If we got back a legit response then update the comment history 
     465                // other wise just bail now and try again later.  No point in 
     466                // re-trying all the comments once we hit one failure. 
     467                if ( !empty( $msg ) ) { 
     468                        delete_comment_meta( $comment_id, 'akismet_error' ); 
     469                        akismet_update_comment_history( $comment_id, $msg, 'cron-retry' ); 
     470                        update_comment_meta( $comment_id, 'akismet_result', $status ); 
     471                        // make sure the comment status is still pending.  if it isn't, that means the user has already moved it elsewhere. 
     472                        $comment = get_comment( $comment_id ); 
     473                        if ( $comment && 'unapproved' == wp_get_comment_status( $comment_id ) ) { 
     474                                if ( $status == 'true' ) { 
     475                                        wp_spam_comment( $comment_id ); 
     476                                } elseif ( $status == 'false' ) { 
     477                                        // comment is good, but it's still in the pending queue.  depending on the moderation settings 
     478                                        // we may need to change it to approved. 
     479                                        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) ) 
     480                                                wp_set_comment_status( $comment_id, 1 ); 
     481                                } 
    660482                        } 
    661                         wp_cache_set( 'akismet_spam_count', $count, 'widget', 3600 ); 
    662                 } 
    663                 return $count; 
    664         } elseif ( 'comments' == $type || 'comment' == $type ) { // comments 
    665                 $type = ''; 
    666         } else { // pingback, trackback, ... 
    667                 $type  = $wpdb->escape( $type ); 
    668         } 
    669  
    670         return (int) $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam' AND comment_type='$type'"); 
    671 } 
    672  
    673  
    674 // WP 2.5+ 
    675 function akismet_rightnow() { 
    676         global $submenu, $wp_db_version; 
    677  
    678         // clean_url was deprecated in WP 3.0 
    679         $esc_url = 'clean_url'; 
    680         if ( function_exists( 'esc_url' ) ) 
    681                 $esc_url = 'esc_url'; 
    682  
    683         if ( 8645 < $wp_db_version  ) // 2.7 
    684                 $link = 'edit-comments.php?comment_status=spam'; 
    685         elseif ( isset( $submenu['edit-comments.php'] ) ) 
    686                 $link = 'edit-comments.php?page=akismet-admin'; 
    687         else 
    688                 $link = 'edit.php?page=akismet-admin'; 
    689  
    690         if ( $count = get_option('akismet_spam_count') ) { 
    691                 $intro = sprintf( __ngettext( 
    692                         '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comment already,', 
    693                         '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comments already,', 
    694                         $count 
    695                 ), 'http://akismet.com/', number_format_i18n( $count ) ); 
    696         } else { 
    697                 $intro = sprintf( __('<a href="%1$s">Akismet</a> blocks spam from getting to your blog,'), 'http://akismet.com/' ); 
    698         } 
    699  
    700         if ( $queue_count = akismet_spam_count() ) { 
    701                 $queue_text = sprintf( __ngettext( 
    702                         'and there\'s <a href="%2$s">%1$s comment</a> in your spam queue right now.', 
    703                         'and there are <a href="%2$s">%1$s comments</a> in your spam queue right now.', 
    704                         $queue_count 
    705                 ), number_format_i18n( $queue_count ), clean_url($link) ); 
    706         } else { 
    707                 $queue_text = sprintf( __( "but there's nothing in your <a href='%1\$s'>spam queue</a> at the moment." ), $esc_url($link) ); 
    708         } 
    709  
    710         // _c was deprecated in WP 2.9.0 
    711         if ( function_exists( '_x' ) ) 
    712                 $text = sprintf( _x( '%1$s %2$s', 'akismet_rightnow' ), $intro, $queue_text ); 
    713         else  
    714                 $text = sprintf( _c( '%1$s %2$s|akismet_rightnow' ), $intro, $queue_text ); 
    715  
    716         echo "<p class='akismet-right-now'>$text</p>\n"; 
    717 } 
    718          
    719 add_action('rightnow_end', 'akismet_rightnow'); 
    720  
    721  
    722 // For WP >= 2.5 
    723 function akismet_check_for_spam_button($comment_status) { 
    724         if ( 'approved' == $comment_status ) 
    725                 return; 
    726         if ( function_exists('plugins_url') ) 
    727                 $link = 'admin.php?action=akismet_recheck_queue'; 
    728         else 
    729                 $link = 'edit-comments.php?page=akismet-admin&amp;recheckqueue=true&amp;noheader=true'; 
    730         echo "</div><div class='alignleft'><a class='button-secondary checkforspam' href='$link'>" . __('Check for Spam') . "</a>"; 
    731 } 
    732 add_action('manage_comments_nav', 'akismet_check_for_spam_button'); 
    733  
    734 function akismet_recheck_queue() { 
    735         global $wpdb, $akismet_api_host, $akismet_api_port; 
    736  
    737         if ( ! ( isset( $_GET['recheckqueue'] ) || ( isset( $_REQUEST['action'] ) && 'akismet_recheck_queue' == $_REQUEST['action'] ) ) ) 
    738                 return; 
    739  
    740         $moderation = $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = '0'", ARRAY_A ); 
    741         foreach ( (array) $moderation as $c ) { 
    742                 $c['user_ip']    = $c['comment_author_IP']; 
    743                 $c['user_agent'] = $c['comment_agent']; 
    744                 $c['referrer']   = ''; 
    745                 $c['blog']       = get_option('home'); 
    746                 $c['blog_lang']  = get_locale(); 
    747                 $c['blog_charset'] = get_option('blog_charset'); 
    748                 $c['permalink']  = get_permalink($c['comment_post_ID']); 
    749  
    750                 $c['user_role'] = ''; 
    751                 if ( isset( $c['user_ID'] ) ) 
    752                         $c['user_role']  = akismet_get_user_roles($c['user_ID']); 
    753  
    754                 $id = (int) $c['comment_ID']; 
    755  
    756                 $query_string = ''; 
    757                 foreach ( $c as $key => $data ) 
    758                 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; 
    759  
    760                 $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port); 
    761                 if ( 'true' == $response[1] ) { 
    762                         if ( function_exists('wp_set_comment_status') ) 
    763                                 wp_set_comment_status($id, 'spam'); 
    764                         else 
    765                                 $wpdb->query("UPDATE $wpdb->comments SET comment_approved = 'spam' WHERE comment_ID = $id"); 
    766  
    767                 } 
    768         } 
    769         wp_redirect( $_SERVER['HTTP_REFERER'] ); 
    770         exit; 
    771 } 
    772  
    773 add_action('admin_action_akismet_recheck_queue', 'akismet_recheck_queue'); 
    774  
    775 function akismet_check_db_comment( $id ) { 
    776         global $wpdb, $akismet_api_host, $akismet_api_port; 
    777  
    778         $id = (int) $id; 
    779         $c = $wpdb->get_row( "SELECT * FROM $wpdb->comments WHERE comment_ID = '$id'", ARRAY_A ); 
    780         if ( !$c ) 
    781                 return; 
    782  
    783         $c['user_ip']    = $c['comment_author_IP']; 
    784         $c['user_agent'] = $c['comment_agent']; 
    785         $c['referrer']   = ''; 
    786         $c['blog']       = get_option('home'); 
    787         $c['blog_lang']  = get_locale(); 
    788         $c['blog_charset'] = get_option('blog_charset'); 
    789         $c['permalink']  = get_permalink($c['comment_post_ID']); 
    790         $id = $c['comment_ID']; 
    791  
    792         $query_string = ''; 
    793         foreach ( $c as $key => $data ) 
    794         $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; 
    795  
    796         $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port); 
    797         return $response[1]; 
    798 } 
    799  
    800 // Widget stuff 
    801 function widget_akismet_register() { 
    802         if ( function_exists('register_sidebar_widget') ) : 
    803         function widget_akismet($args) { 
    804                 extract($args); 
    805                 $options = get_option('widget_akismet'); 
    806                 $count = number_format_i18n(get_option('akismet_spam_count')); 
    807                 ?> 
    808                         <?php echo $before_widget; ?> 
    809                                 <?php echo $before_title . $options['title'] . $after_title; ?> 
    810                                 <div id="akismetwrap"><div id="akismetstats"><a id="aka" href="http://akismet.com" title=""><?php printf( __( '%1$s %2$sspam comments%3$s %4$sblocked by%5$s<br />%6$sAkismet%7$s' ), '<span id="akismet1"><span id="akismetcount">' . $count . '</span>', '<span id="akismetsc">', '</span></span>', '<span id="akismet2"><span id="akismetbb">', '</span>', '<span id="akismeta">', '</span></span>' ); ?></a></div></div> 
    811                         <?php echo $after_widget; ?> 
    812         <?php 
    813         } 
    814  
    815         function widget_akismet_style() { 
    816                 $plugin_dir = '/wp-content/plugins'; 
    817                 if ( defined( 'PLUGINDIR' ) ) 
    818                         $plugin_dir = '/' . PLUGINDIR; 
    819  
    820                 ?> 
    821 <style type="text/css"> 
    822 #aka,#aka:link,#aka:hover,#aka:visited,#aka:active{color:#fff;text-decoration:none} 
    823 #aka:hover{border:none;text-decoration:none} 
    824 #aka:hover #akismet1{display:none} 
    825 #aka:hover #akismet2,#akismet1{display:block} 
    826 #akismet2{display:none;padding-top:2px} 
    827 #akismeta{font-size:16px;font-weight:bold;line-height:18px;text-decoration:none} 
    828 #akismetcount{display:block;font:15px Verdana,Arial,Sans-Serif;font-weight:bold;text-decoration:none} 
    829 #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} 
    830 </style> 
    831                 <?php 
    832         } 
    833  
    834         function widget_akismet_control() { 
    835                 $options = $newoptions = get_option('widget_akismet'); 
    836                 if ( isset( $_POST['akismet-submit'] ) && $_POST["akismet-submit"] ) { 
    837                         $newoptions['title'] = strip_tags(stripslashes($_POST["akismet-title"])); 
    838                         if ( empty($newoptions['title']) ) $newoptions['title'] = __('Spam Blocked'); 
    839                 } 
    840                 if ( $options != $newoptions ) { 
    841                         $options = $newoptions; 
    842                         update_option('widget_akismet', $options); 
    843                 } 
    844                 $title = htmlspecialchars($options['title'], ENT_QUOTES); 
    845         ?> 
    846                                 <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> 
    847                                 <input type="hidden" id="akismet-submit" name="akismet-submit" value="1" /> 
    848         <?php 
    849         } 
    850  
    851         if ( function_exists( 'wp_register_sidebar_widget' ) ) { 
    852                 wp_register_sidebar_widget( 'akismet', 'Akismet', 'widget_akismet', null, 'akismet'); 
    853                 wp_register_widget_control( 'akismet', 'Akismet', 'widget_akismet_control', null, 75, 'akismet'); 
    854         } else { 
    855                 register_sidebar_widget('Akismet', 'widget_akismet', null, 'akismet'); 
    856                 register_widget_control('Akismet', 'widget_akismet_control', null, 75, 'akismet'); 
    857         } 
    858         if ( is_active_widget('widget_akismet') ) 
    859                 add_action('wp_head', 'widget_akismet_style'); 
    860         endif; 
    861 } 
    862  
    863 add_action('init', 'widget_akismet_register'); 
    864  
    865 // Counter for non-widget users 
    866 function akismet_counter() { 
    867         $plugin_dir = '/wp-content/plugins'; 
    868         if ( defined( 'PLUGINDIR' ) ) 
    869                 $plugin_dir = '/' . PLUGINDIR; 
    870  
    871 ?> 
    872 <style type="text/css"> 
    873 #akismetwrap #aka,#aka:link,#aka:hover,#aka:visited,#aka:active{color:#fff;text-decoration:none} 
    874 #aka:hover{border:none;text-decoration:none} 
    875 #aka:hover #akismet1{display:none} 
    876 #aka:hover #akismet2,#akismet1{display:block} 
    877 #akismet2{display:none;padding-top:2px} 
    878 #akismeta{font-size:16px;font-weight:bold;line-height:18px;text-decoration:none} 
    879 #akismetcount{display:block;font:15px Verdana,Arial,Sans-Serif;font-weight:bold;text-decoration:none} 
    880 #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} 
    881 </style> 
    882 <?php 
    883 $count = number_format_i18n(get_option('akismet_spam_count')); 
    884 ?> 
    885 <div id="akismetwrap"><div id="akismetstats"><a id="aka" href="http://akismet.com" title=""><div id="akismet1"><span id="akismetcount"><?php echo $count; ?></span> <span id="akismetsc"><?php _e('spam comments') ?></span></div> <div id="akismet2"><span id="akismetbb"><?php _e('blocked by') ?></span><br /><span id="akismeta">Akismet</span></div></a></div></div> 
    886 <?php 
    887 } 
    888  
    889 ?> 
     483                } else { 
     484                        delete_comment_meta( $comment_id, 'akismet_rechecking' ); 
     485                        wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' ); 
     486                        return; 
     487                } 
     488        } 
     489         
     490        $remaining = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->commentmeta WHERE meta_key = 'akismet_error'" ) ); 
     491        if ( $remaining && !wp_next_scheduled('akismet_schedule_cron_recheck') ) { 
     492                wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' ); 
     493        } 
     494} 
     495add_action( 'akismet_schedule_cron_recheck', 'akismet_cron_recheck' ); 
     496 
     497function akismet_add_comment_nonce( $post_id ) { 
     498        echo '<p style="display: none;">'; 
     499        wp_nonce_field( 'akismet_comment_nonce_' . $post_id, 'akismet_comment_nonce', FALSE ); 
     500        echo '</p>'; 
     501} 
     502 
     503$akismet_comment_nonce_option = apply_filters( 'akismet_comment_nonce', get_option( 'akismet_comment_nonce' ) ); 
     504 
     505if ( $akismet_comment_nonce_option == 'true' || $akismet_comment_nonce_option == '' ) 
     506        add_action( 'comment_form', 'akismet_add_comment_nonce' ); 
     507 
     508if ( '3.0.5' == $wp_version ) {  
     509        remove_filter( 'comment_text', 'wp_kses_data' );  
     510        if ( is_admin() )  
     511                add_filter( 'comment_text', 'wp_kses_post' );  
     512} 
  • trunk/blogs/wp-content/plugins/akismet/readme.txt

    r1877 r1879  
    11=== Akismet === 
    2 Contributors: matt, ryan, andy, mdawaffe, tellyworth, automattic 
     2Contributors: matt, ryan, andy, mdawaffe, tellyworth, josephscott, lessbloat, automattic 
    33Tags: akismet, comments, spam 
    4 Requires at least: 2.0 
    5 Tested up to: 3.0 
    6 Stable tag: 2.4.0 
    7 License: GPLv2 
     4Requires at least: 3.0 
     5Tested up to: 3.1 
     6Stable tag: 2.5.3 
     7License: GPLv2 or later 
    88 
    99Akismet checks your comments against the Akismet web service to see if they look like spam or not. 
     
    1414review the spam it catches under your blog's "Comments" admin screen. 
    1515 
    16 Want to show off how much spam Akismet has caught for you? Just put `<?php akismet_counter(); ?>` in your template. 
     16Major new features in Akismet 2.5 include: 
    1717 
    18 See also: [WP Stats plugin](http://wordpress.org/extend/plugins/stats/). 
     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 moderator 
     19* Links are highlighted in the comment body, to reveal hidden or misleading links 
     20* If your web host is unable to reach Akismet's servers, the plugin will automatically retry when your connection is back up 
     21* Moderators can see the number of approved comments for each user 
     22* Spam and Unspam reports now include more information, to help improve accuracy 
    1923 
    20 PS: You'll need an [Akismet.com API key](http://akismet.com/get/) to use it. 
     24PS: 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. 
    2125 
    2226== Installation == 
     
    2731 
    2832== Changelog == 
     33 
     34= 2.5.3 =  
     35* Specify the license is GPL v2 or later 
     36* Fix a bug that could result in orphaned commentmeta entries 
     37* Include hotfix for WordPress 3.0.5 filter issue 
     38 
     39= 2.5.2 = 
     40 
     41* Properly format the comment count for author counts 
     42* Look for super admins on multisite installs when looking up user roles 
     43* Increase the HTTP request timeout 
     44* Removed padding for author approved count 
     45* Fix typo in function name 
     46* Set Akismet stats iframe height to fixed 2500px.  Better to have one tall scroll bar than two side by side. 
     47 
     48= 2.5.1 = 
     49 
     50* Fix a bug that caused the "Auto delete" option to fail to discard comments correctly 
     51* Remove the comment nonce form field from the 'Akismet Configuration' page in favor of using a filter, akismet_comment_nonce 
     52* Fixed padding bug in "author" column of posts screen 
     53* Added margin-top to "cleared by ..." badges on dashboard 
     54* Fix possible error when calling akismet_cron_recheck() 
     55* Fix more PHP warnings 
     56* Clean up XHTML warnings for comment nonce 
     57* Fix for possible condition where scheduled comment re-checks could get stuck 
     58* Clean up the comment meta details after deleting a comment 
     59* Only show the status badge if the comment status has been changed by someone/something other than Akismet 
     60* Show a 'History' link in the row-actions 
     61* Translation fixes 
     62* Reduced font-size on author name 
     63* Moved "flagged by..." notification to top right corner of comment container and removed heavy styling 
     64* Hid "flagged by..." notification while on dashboard 
     65 
     66= 2.5.0 = 
     67 
     68* Track comment actions under 'Akismet Status' on the edit comment screen 
     69* Fix a few remaining deprecated function calls ( props Mike Glendinning )  
     70* Use HTTPS for the stats IFRAME when wp-admin is using HTTPS 
     71* Use the WordPress HTTP class if available 
     72* Move the admin UI code to a separate file, only loaded when needed 
     73* Add cron retry feature, to replace the old connectivity check 
     74* Display Akismet status badge beside each comment 
     75* Record history for each comment, and display it on the edit page 
     76* Record the complete comment as originally submitted in comment_meta, to use when reporting spam and ham 
     77* Highlight links in comment content 
     78* New option, "Show the number of comments you've approved beside each comment author." 
     79* New option, "Use a nonce on the comment form." 
    2980 
    3081= 2.4.0 = 
Note: See TracChangeset for help on using the changeset viewer.