]> scripts.mit.edu Git - autoinstalls/wordpress.git/blobdiff - wp-content/plugins/akismet/admin.php
WordPress 3.4
[autoinstalls/wordpress.git] / wp-content / plugins / akismet / admin.php
index 91cedb29db083bfb2455fc99b8c4c3597bbfe811..aa30cde7590c9a1a7dffde73d229d7f8c3bcc22e 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 <?php
-add_action( 'admin_menu', 'akismet_config_page' );
-add_action( 'admin_menu', 'akismet_stats_page' );
+add_action( 'admin_menu', 'akismet_admin_menu' );
+       
 akismet_admin_warnings();
 
 function akismet_admin_init() {
 akismet_admin_warnings();
 
 function akismet_admin_init() {
@@ -25,24 +25,38 @@ function akismet_admin_init() {
         $hook = 'dashboard_page_akismet-stats-display';
     add_action('admin_head-'.$hook, 'akismet_stats_script');
     add_meta_box('akismet-status', __('Comment History'), 'akismet_comment_status_meta_box', 'comment', 'normal');
         $hook = 'dashboard_page_akismet-stats-display';
     add_action('admin_head-'.$hook, 'akismet_stats_script');
     add_meta_box('akismet-status', __('Comment History'), 'akismet_comment_status_meta_box', 'comment', 'normal');
-       wp_register_style('akismet.css', AKISMET_PLUGIN_URL . 'akismet.css');
-       wp_enqueue_style('akismet.css');
-       wp_register_script('akismet.js', AKISMET_PLUGIN_URL . 'akismet.js', array('jquery'));
-       wp_enqueue_script('akismet.js');
 }
 add_action('admin_init', 'akismet_admin_init');
 
 }
 add_action('admin_init', 'akismet_admin_init');
 
+add_action( 'admin_enqueue_scripts', 'akismet_load_js_and_css' );
+function akismet_load_js_and_css() {
+       global $hook_suffix;
+
+       if (
+               $hook_suffix == 'index.php'     # dashboard
+               || $hook_suffix == 'edit-comments.php' 
+               || $hook_suffix == 'comment.php' 
+               || $hook_suffix == 'post.php' 
+               || $hook_suffix == 'plugins_page_akismet-key-config'
+       ) {
+               wp_register_style( 'akismet.css', AKISMET_PLUGIN_URL . 'akismet.css', array(), '2.5.4.4' );
+               wp_enqueue_style( 'akismet.css');
+       
+               wp_register_script( 'akismet.js', AKISMET_PLUGIN_URL . 'akismet.js', array('jquery'), '2.5.4.6' );
+               wp_enqueue_script( 'akismet.js' );
+               wp_localize_script( 'akismet.js', 'WPAkismet', array(
+                       'comment_author_url_nonce' => wp_create_nonce( 'comment_author_url_nonce' )
+               ) );
+       }
+}
+
+
 function akismet_nonce_field($action = -1) { return wp_nonce_field($action); }
 $akismet_nonce = 'akismet-update-key';
 
 function akismet_nonce_field($action = -1) { return wp_nonce_field($action); }
 $akismet_nonce = 'akismet-update-key';
 
-function akismet_config_page() {
-       if ( function_exists('add_submenu_page') )
-               add_submenu_page('plugins.php', __('Akismet Configuration'), __('Akismet Configuration'), 'manage_options', 'akismet-key-config', 'akismet_conf');
-}
-
 function akismet_plugin_action_links( $links, $file ) {
        if ( $file == plugin_basename( dirname(__FILE__).'/akismet.php' ) ) {
 function akismet_plugin_action_links( $links, $file ) {
        if ( $file == plugin_basename( dirname(__FILE__).'/akismet.php' ) ) {
-               $links[] = '<a href="plugins.php?page=akismet-key-config">'.__('Settings').'</a>';
+               $links[] = '<a href="admin.php?page=akismet-key-config">'.__('Settings').'</a>';
        }
 
        return $links;
        }
 
        return $links;
@@ -111,8 +125,7 @@ function akismet_conf() {
                if ( $key_status == 'valid' ) {
                        $ms[] = 'key_valid';
                } else if ( $key_status == 'invalid' ) {
                if ( $key_status == 'valid' ) {
                        $ms[] = 'key_valid';
                } else if ( $key_status == 'invalid' ) {
-                       delete_option('wordpress_api_key');
-                       $ms[] = 'key_empty';
+                       $ms[] = 'key_invalid';
                } else if ( !empty($key) && $key_status == 'failed' ) {
                        $ms[] = 'key_failed';
                }
                } else if ( !empty($key) && $key_status == 'failed' ) {
                        $ms[] = 'key_failed';
                }
@@ -124,8 +137,9 @@ function akismet_conf() {
                'new_key_invalid' => array('color' => '888', 'text' => __('The key you entered is invalid. Please double-check it.')),
                '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.')),
                'no_connection' => array('color' => '888', 'text' => __('There was a problem connecting to the Akismet server. Please check your server configuration.')),
                'new_key_invalid' => array('color' => '888', 'text' => __('The key you entered is invalid. Please double-check it.')),
                '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.')),
                'no_connection' => array('color' => '888', 'text' => __('There was a problem connecting to the Akismet server. Please check your server configuration.')),
-               '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/')),
+               '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/?return=true')),
                'key_valid' => array('color' => '4AB915', 'text' => __('This key is valid.')),
                'key_valid' => array('color' => '4AB915', 'text' => __('This key is valid.')),
+               'key_invalid' => array('color' => '888', 'text' => __('This key is invalid.')),
                '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.')),
                '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') ) ),
        );
                '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.')),
                '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') ) ),
        );
@@ -141,13 +155,13 @@ function akismet_conf() {
 <div class="narrow">
 <form action="" method="post" id="akismet-conf" style="margin: auto; width: 400px; ">
 <?php if ( !$wpcom_api_key ) { ?>
 <div class="narrow">
 <form action="" method="post" id="akismet-conf" style="margin: auto; width: 400px; ">
 <?php if ( !$wpcom_api_key ) { ?>
-       <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>
+       <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/?return=true', 'http://akismet.com/get/?return=true'); ?></p>
 
 <h3><label for="key"><?php _e('Akismet API Key'); ?></label></h3>
 <?php foreach ( $ms as $m ) : ?>
        <p style="padding: .5em; background-color: #<?php echo $messages[$m]['color']; ?>; color: #fff; font-weight: bold;"><?php echo $messages[$m]['text']; ?></p>
 <?php endforeach; ?>
 
 <h3><label for="key"><?php _e('Akismet API Key'); ?></label></h3>
 <?php foreach ( $ms as $m ) : ?>
        <p style="padding: .5em; background-color: #<?php echo $messages[$m]['color']; ?>; color: #fff; font-weight: bold;"><?php echo $messages[$m]['text']; ?></p>
 <?php endforeach; ?>
-<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>
+<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/?return=true">What is this?</a>'); ?>)</p>
 <?php if ( isset( $invalid_key) && $invalid_key ) { ?>
 <h3><?php _e('Why might my key be invalid?'); ?></h3>
 <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>
 <?php if ( isset( $invalid_key) && $invalid_key ) { ?>
 <h3><?php _e('Why might my key be invalid?'); ?></h3>
 <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>
@@ -226,12 +240,6 @@ function akismet_conf() {
 <?php
 }
 
 <?php
 }
 
-function akismet_stats_page() {
-       if ( function_exists('add_submenu_page') )
-               add_submenu_page('index.php', __('Akismet Stats'), __('Akismet Stats'), 'manage_options', 'akismet-stats-display', 'akismet_stats_display');
-
-}
-
 function akismet_stats_script() {
        ?>
 <script type="text/javascript">
 function akismet_stats_script() {
        ?>
 <script type="text/javascript">
@@ -278,16 +286,41 @@ function akismet_stats() {
                $link = 'edit-comments.php';
        else
                $link = 'edit.php';
                $link = 'edit-comments.php';
        else
                $link = 'edit.php';
-       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>';
+       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/?return=true', clean_url("$link?page=akismet-admin"), number_format_i18n($count) ).'</p>';
 }
 add_action('activity_box_end', 'akismet_stats');
 
 function akismet_admin_warnings() {
 }
 add_action('activity_box_end', 'akismet_stats');
 
 function akismet_admin_warnings() {
-       global $wpcom_api_key;
+       global $wpcom_api_key, $pagenow;
+
+       if (
+               $pagenow == 'edit-comments.php'
+               || ( !empty( $_GET['page'] ) && $_GET['page'] == 'akismet-key-config' )
+               || ( !empty( $_GET['page'] ) && $_GET['page'] == 'akismet-stats-display' )
+       ) {
+               if ( get_option( 'akismet_alert_code' ) ) {
+                       function akismet_alert() {
+                               $alert = array(
+                                       'code' => (int) get_option( 'akismet_alert_code' ),
+                                       'msg' => get_option( 'akismet_alert_msg' )
+                               );
+                       ?>
+                               <div class='error'>
+                                       <p><strong>Akismet Error Code: <?php echo $alert['code']; ?></strong></p>
+                                       <p><?php esc_html_e( $alert['msg'] ); ?></p>
+                                       <p>More information is available at <a href="https://akismet.com/errors/<?php echo $alert['code']; ?>">https://akismet.com/errors/<?php echo $alert['code']; ?></a></p>
+                               </div>
+                       <?php
+                       }
+
+                       add_action( 'admin_notices', 'akismet_alert' );
+               }
+       }
+
        if ( !get_option('wordpress_api_key') && !$wpcom_api_key && !isset($_POST['submit']) ) {
                function akismet_warning() {
                        echo "
        if ( !get_option('wordpress_api_key') && !$wpcom_api_key && !isset($_POST['submit']) ) {
                function akismet_warning() {
                        echo "
-                       <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>
+                       <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.'), "admin.php?page=akismet-key-config")."</p></div>
                        ";
                }
                add_action('admin_notices', 'akismet_warning');
                        ";
                }
                add_action('admin_notices', 'akismet_warning');
@@ -295,11 +328,12 @@ function akismet_admin_warnings() {
        } elseif ( ( empty($_SERVER['SCRIPT_FILENAME']) || basename($_SERVER['SCRIPT_FILENAME']) == 'edit-comments.php' ) &&  wp_next_scheduled('akismet_schedule_cron_recheck') ) {
                function akismet_warning() {
                        global $wpdb;
        } elseif ( ( empty($_SERVER['SCRIPT_FILENAME']) || basename($_SERVER['SCRIPT_FILENAME']) == 'edit-comments.php' ) &&  wp_next_scheduled('akismet_schedule_cron_recheck') ) {
                function akismet_warning() {
                        global $wpdb;
+                               akismet_fix_scheduled_recheck();
                                $waiting = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->commentmeta WHERE meta_key = 'akismet_error'" ) );
                                $waiting = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->commentmeta WHERE meta_key = 'akismet_error'" ) );
-                               $next_check = human_time_diff( wp_next_scheduled('akismet_schedule_cron_recheck') );
-                               if ( $waiting > 0 )
+                               $next_check = wp_next_scheduled('akismet_schedule_cron_recheck');
+                               if ( $waiting > 0 && $next_check > time() )
                                        echo "
                                        echo "
-                       <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>
+                       <div id='akismet-warning' class='updated fade'><p><strong>".__('Akismet has detected a problem.')."</strong> ".sprintf(__('Some comments have not yet been checked for spam by Akismet. They have been temporarily held for moderation. Please check your <a href="%s">Akismet configuration</a> and contact your web host if problems persist.'), 'admin.php?page=akismet-key-config')."</p></div>
                        ";
                }
                add_action('admin_notices', 'akismet_warning');
                        ";
                }
                add_action('admin_notices', 'akismet_warning');
@@ -316,10 +350,13 @@ function akismet_comment_row_action( $a, $comment ) {
                return $a;
 
        $akismet_result = get_comment_meta( $comment->comment_ID, 'akismet_result', true );
                return $a;
 
        $akismet_result = get_comment_meta( $comment->comment_ID, 'akismet_result', true );
+       $akismet_error = get_comment_meta( $comment->comment_ID, 'akismet_error', true );
        $user_result = get_comment_meta( $comment->comment_ID, 'akismet_user_result', true);
        $comment_status = wp_get_comment_status( $comment->comment_ID );
        $desc = null;
        $user_result = get_comment_meta( $comment->comment_ID, 'akismet_user_result', true);
        $comment_status = wp_get_comment_status( $comment->comment_ID );
        $desc = null;
-       if ( !$user_result || $user_result == $akismet_result ) {
+       if ( $akismet_error ) {
+               $desc = __( 'Awaiting spam check' );
+       } elseif ( !$user_result || $user_result == $akismet_result ) {
                // Show the original Akismet result if the user hasn't overridden it, or if their decision was the same
                if ( $akismet_result == 'true' && $comment_status != 'spam' && $comment_status != 'trash' )
                        $desc = __( 'Flagged as spam by Akismet' );
                // Show the original Akismet result if the user hasn't overridden it, or if their decision was the same
                if ( $akismet_result == 'true' && $comment_status != 'spam' && $comment_status != 'trash' )
                        $desc = __( 'Flagged as spam by Akismet' );
@@ -338,8 +375,12 @@ function akismet_comment_row_action( $a, $comment ) {
                $b = array();
                foreach ( $a as $k => $item ) {
                        $b[ $k ] = $item;
                $b = array();
                foreach ( $a as $k => $item ) {
                        $b[ $k ] = $item;
-                       if ( $k == 'edit' )
+                       if (
+                               $k == 'edit'
+                               || ( $k == 'unspam' && $GLOBALS['wp_version'] >= 3.4 )
+                       ) {
                                $b['history'] = '<a href="comment.php?action=editcomment&amp;c='.$comment->comment_ID.'#akismet-status" title="'. esc_attr__( 'View comment history' ) . '"> '. __('History') . '</a>';
                                $b['history'] = '<a href="comment.php?action=editcomment&amp;c='.$comment->comment_ID.'#akismet-status" title="'. esc_attr__( 'View comment history' ) . '"> '. __('History') . '</a>';
+                       }
                }
                
                $a = $b;
                }
                
                $a = $b;
@@ -428,11 +469,6 @@ add_filter('comment_text', 'akismet_text_add_link_class');
 function akismet_rightnow() {
        global $submenu, $wp_db_version;
 
 function akismet_rightnow() {
        global $submenu, $wp_db_version;
 
-       // clean_url was deprecated in WP 3.0
-       $esc_url = 'clean_url';
-       if ( function_exists( 'esc_url' ) )
-               $esc_url = 'esc_url';
-
        if ( 8645 < $wp_db_version  ) // 2.7
                $link = 'edit-comments.php?comment_status=spam';
        elseif ( isset( $submenu['edit-comments.php'] ) )
        if ( 8645 < $wp_db_version  ) // 2.7
                $link = 'edit-comments.php?comment_status=spam';
        elseif ( isset( $submenu['edit-comments.php'] ) )
@@ -445,19 +481,20 @@ function akismet_rightnow() {
                        '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comment already. ',
                        '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comments already. ',
                        $count
                        '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comment already. ',
                        '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comments already. ',
                        $count
-               ), 'http://akismet.com/', number_format_i18n( $count ) );
+               ), 'http://akismet.com/?return=true', number_format_i18n( $count ) );
        } else {
        } else {
-               $intro = sprintf( __('<a href="%1$s">Akismet</a> blocks spam from getting to your blog. '), 'http://akismet.com/' );
+               $intro = sprintf( __('<a href="%1$s">Akismet</a> blocks spam from getting to your blog. '), 'http://akismet.com/?return=true' );
        }
 
        }
 
+       $link = function_exists( 'esc_url' ) ? esc_url( $link ) : clean_url( $link );
        if ( $queue_count = akismet_spam_count() ) {
                $queue_text = sprintf( _n(
                        'There\'s <a href="%2$s">%1$s comment</a> in your spam queue right now.',
                        'There are <a href="%2$s">%1$s comments</a> in your spam queue right now.',
                        $queue_count
        if ( $queue_count = akismet_spam_count() ) {
                $queue_text = sprintf( _n(
                        'There\'s <a href="%2$s">%1$s comment</a> in your spam queue right now.',
                        'There are <a href="%2$s">%1$s comments</a> in your spam queue right now.',
                        $queue_count
-               ), number_format_i18n( $queue_count ), $esc_url($link) );
+               ), number_format_i18n( $queue_count ), $link );
        } else {
        } else {
-               $queue_text = sprintf( __( "There's nothing in your <a href='%1\$s'>spam queue</a> at the moment." ), $esc_url($link) );
+               $queue_text = sprintf( __( "There's nothing in your <a href='%1\$s'>spam queue</a> at the moment." ), $link );
        }
 
        $text = $intro . '<br />' . $queue_text;
        }
 
        $text = $intro . '<br />' . $queue_text;
@@ -512,6 +549,9 @@ function akismet_submit_nonspam_comment ( $comment_id ) {
        if ( akismet_test_mode() )
                $comment->is_test = 'true';
 
        if ( akismet_test_mode() )
                $comment->is_test = 'true';
 
+       $post = get_post( $comment->comment_post_ID );
+       $comment->comment_post_modified_gmt = $post->post_modified_gmt;
+
        $query_string = '';
        foreach ( $comment as $key => $data )
                $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
        $query_string = '';
        foreach ( $comment as $key => $data )
                $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
@@ -561,6 +601,9 @@ function akismet_submit_spam_comment ( $comment_id ) {
        if ( akismet_test_mode() )
                $comment->is_test = 'true';
 
        if ( akismet_test_mode() )
                $comment->is_test = 'true';
 
+       $post = get_post( $comment->comment_post_ID );
+       $comment->comment_post_modified_gmt = $post->post_modified_gmt;
+
        $query_string = '';
        foreach ( $comment as $key => $data )
                $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
        $query_string = '';
        foreach ( $comment as $key => $data )
                $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
@@ -591,6 +634,10 @@ function akismet_transition_comment_status( $new_status, $old_status, $comment )
 
        if ( defined('WP_IMPORTING') && WP_IMPORTING == true )
                return;
 
        if ( defined('WP_IMPORTING') && WP_IMPORTING == true )
                return;
+
+       // if this is present, it means the status has been changed by a re-check, not an explicit user action
+       if ( get_comment_meta( $comment->comment_ID, 'akismet_rechecking' ) )
+               return;
                
        global $current_user;
        $reporter = '';
                
        global $current_user;
        $reporter = '';
@@ -611,8 +658,7 @@ function akismet_transition_comment_status( $new_status, $old_status, $comment )
                }
        }
        
                }
        }
        
-       if ( !get_comment_meta( $comment->comment_ID, 'akismet_rechecking' ) )
-               akismet_update_comment_history( $comment->comment_ID, sprintf( __('%s changed the comment status to %s'), $reporter, $new_status ), 'status-' . $new_status );
+       akismet_update_comment_history( $comment->comment_ID, sprintf( __('%s changed the comment status to %s'), $reporter, $new_status ), 'status-' . $new_status );
 }
 
 add_action( 'transition_comment_status', 'akismet_transition_comment_status', 10, 3 );
 }
 
 add_action( 'transition_comment_status', 'akismet_transition_comment_status', 10, 3 );
@@ -647,6 +693,8 @@ function akismet_spam_count( $type = false ) {
 function akismet_recheck_queue() {
        global $wpdb, $akismet_api_host, $akismet_api_port;
 
 function akismet_recheck_queue() {
        global $wpdb, $akismet_api_host, $akismet_api_port;
 
+       akismet_fix_scheduled_recheck();
+
        if ( ! ( isset( $_GET['recheckqueue'] ) || ( isset( $_REQUEST['action'] ) && 'akismet_recheck_queue' == $_REQUEST['action'] ) ) )
                return;
                
        if ( ! ( isset( $_GET['recheckqueue'] ) || ( isset( $_REQUEST['action'] ) && 'akismet_recheck_queue' == $_REQUEST['action'] ) ) )
                return;
                
@@ -673,28 +721,63 @@ function akismet_recheck_queue() {
                foreach ( $c as $key => $data )
                $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
 
                foreach ( $c as $key => $data )
                $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
 
+               add_comment_meta( $c['comment_ID'], 'akismet_rechecking', true );
                $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port);
                if ( 'true' == $response[1] ) {
                        wp_set_comment_status($c['comment_ID'], 'spam');
                        update_comment_meta( $c['comment_ID'], 'akismet_result', 'true' );
                $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port);
                if ( 'true' == $response[1] ) {
                        wp_set_comment_status($c['comment_ID'], 'spam');
                        update_comment_meta( $c['comment_ID'], 'akismet_result', 'true' );
+                       delete_comment_meta( $c['comment_ID'], 'akismet_error' );
                        akismet_update_comment_history( $c['comment_ID'], __('Akismet re-checked and caught this comment as spam'), 'check-spam' );
                
                } elseif ( 'false' == $response[1] ) {
                        update_comment_meta( $c['comment_ID'], 'akismet_result', 'false' );
                        akismet_update_comment_history( $c['comment_ID'], __('Akismet re-checked and caught this comment as spam'), 'check-spam' );
                
                } elseif ( 'false' == $response[1] ) {
                        update_comment_meta( $c['comment_ID'], 'akismet_result', 'false' );
+                       delete_comment_meta( $c['comment_ID'], 'akismet_error' );
                        akismet_update_comment_history( $c['comment_ID'], __('Akismet re-checked and cleared this comment'), 'check-ham' );
                // abnormal result: error
                } else {
                        update_comment_meta( $c['comment_ID'], 'akismet_result', 'error' );
                        akismet_update_comment_history( $c['comment_ID'], __('Akismet re-checked and cleared this comment'), 'check-ham' );
                // abnormal result: error
                } else {
                        update_comment_meta( $c['comment_ID'], 'akismet_result', 'error' );
-                       akismet_update_comment_history( $c['comment_ID'], sprintf( __('Akismet was unable to re-check this comment (response: %s)'), $response[1]), 'check-error' );
+                       akismet_update_comment_history( $c['comment_ID'], sprintf( __('Akismet was unable to re-check this comment (response: %s)'), substr($response[1], 0, 50)), 'check-error' );
                }
 
                }
 
+               delete_comment_meta( $c['comment_ID'], 'akismet_rechecking' );
        }
        }
-       wp_redirect( $_SERVER['HTTP_REFERER'] );
+       wp_safe_redirect( $_SERVER['HTTP_REFERER'] );
        exit;
 }
 
 add_action('admin_action_akismet_recheck_queue', 'akismet_recheck_queue');
 
        exit;
 }
 
 add_action('admin_action_akismet_recheck_queue', 'akismet_recheck_queue');
 
+// Adds an 'x' link next to author URLs, clicking will remove the author URL and show an undo link
+function akismet_remove_comment_author_url() {
+    if ( !empty($_POST['id'] ) && check_admin_referer( 'comment_author_url_nonce' ) ) {
+        global $wpdb;
+        $comment = get_comment( intval($_POST['id']), ARRAY_A );
+        if (current_user_can('edit_comment', $comment['comment_ID'])) {
+            $comment['comment_author_url'] = '';
+            do_action( 'comment_remove_author_url' );
+            print(wp_update_comment( $comment ));
+            die();
+        }
+    }
+}
+
+add_action('wp_ajax_comment_author_deurl', 'akismet_remove_comment_author_url');
+
+function akismet_add_comment_author_url() {
+    if ( !empty( $_POST['id'] ) && !empty( $_POST['url'] ) && check_admin_referer( 'comment_author_url_nonce' ) ) {
+        global $wpdb;
+        $comment = get_comment( intval($_POST['id']), ARRAY_A );
+        if (current_user_can('edit_comment', $comment['comment_ID'])) {
+            $comment['comment_author_url'] = esc_url($_POST['url']);
+            do_action( 'comment_add_author_url' );
+            print(wp_update_comment( $comment ));
+            die();
+        }
+    }
+}
+
+add_action('wp_ajax_comment_author_reurl', 'akismet_add_comment_author_url');
+
 // Check connectivity between the WordPress blog and Akismet's servers.
 // 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).
 function akismet_check_server_connectivity() {
 // Check connectivity between the WordPress blog and Akismet's servers.
 // 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).
 function akismet_check_server_connectivity() {
@@ -748,3 +831,20 @@ function akismet_server_connectivity_ok() {
        return !( empty($servers) || !count($servers) || count( array_filter($servers) ) < count($servers) );
 }
 
        return !( empty($servers) || !count($servers) || count( array_filter($servers) ) < count($servers) );
 }
 
+function akismet_admin_menu() {
+       if ( class_exists( 'Jetpack' ) ) {
+               add_action( 'jetpack_admin_menu', 'akismet_load_menu' );
+       } else {
+               akismet_load_menu();
+       }
+}
+
+function akismet_load_menu() {
+       if ( class_exists( 'Jetpack' ) ) {
+               add_submenu_page( 'jetpack', __( 'Akismet Configuration' ), __( 'Akismet Configuration' ), 'manage_options', 'akismet-key-config', 'akismet_conf' );
+               add_submenu_page( 'jetpack', __( 'Akismet Stats' ), __( 'Akismet Stats' ), 'manage_options', 'akismet-stats-display', 'akismet_stats_display' );
+       } else {
+               add_submenu_page('plugins.php', __('Akismet Configuration'), __('Akismet Configuration'), 'manage_options', 'akismet-key-config', 'akismet_conf');
+               add_submenu_page('index.php', __('Akismet Stats'), __('Akismet Stats'), 'manage_options', 'akismet-stats-display', 'akismet_stats_display');
+       }
+}