wp/wp-content/plugins/akismet/admin.php
changeset 0 d970ebf37754
equal deleted inserted replaced
-1:000000000000 0:d970ebf37754
       
     1 <?php
       
     2 add_action( 'admin_menu', 'akismet_admin_menu' );
       
     3 	
       
     4 akismet_admin_warnings();
       
     5 
       
     6 function akismet_admin_init() {
       
     7     global $wp_version;
       
     8     
       
     9     // all admin functions are disabled in old versions
       
    10     if ( !function_exists('is_multisite') && version_compare( $wp_version, '3.0', '<' ) ) {
       
    11         
       
    12         function akismet_version_warning() {
       
    13             echo '
       
    14             <div id="akismet-warning" class="updated fade"><p><strong>'.sprintf(__('Akismet %s requires WordPress 3.0 or higher.'), AKISMET_VERSION) .'</strong> '.sprintf(__('Please <a href="%s">upgrade WordPress</a> to a current version, or <a href="%s">downgrade to version 2.4 of the Akismet plugin</a>.'), 'http://codex.wordpress.org/Upgrading_WordPress', 'http://wordpress.org/extend/plugins/akismet/download/'). '</p></div>
       
    15             ';
       
    16         }
       
    17         add_action('admin_notices', 'akismet_version_warning'); 
       
    18         
       
    19         return; 
       
    20     }
       
    21 
       
    22     if ( function_exists( 'get_plugin_page_hook' ) )
       
    23         $hook = get_plugin_page_hook( 'akismet-stats-display', 'index.php' );
       
    24     else
       
    25         $hook = 'dashboard_page_akismet-stats-display';
       
    26     add_meta_box('akismet-status', __('Comment History'), 'akismet_comment_status_meta_box', 'comment', 'normal');
       
    27 }
       
    28 add_action('admin_init', 'akismet_admin_init');
       
    29 
       
    30 add_action( 'admin_enqueue_scripts', 'akismet_load_js_and_css' );
       
    31 function akismet_load_js_and_css() {
       
    32 	global $hook_suffix;
       
    33 
       
    34 	if ( in_array( $hook_suffix, array( 
       
    35 		'index.php', # dashboard
       
    36 		'edit-comments.php',
       
    37 		'comment.php',
       
    38 		'post.php',
       
    39 		'plugins_page_akismet-key-config', 
       
    40 		'jetpack_page_akismet-key-config',
       
    41 	) ) ) {
       
    42 		wp_register_style( 'akismet.css', AKISMET_PLUGIN_URL . 'akismet.css', array(), '2.5.9' );
       
    43 		wp_enqueue_style( 'akismet.css');
       
    44 	
       
    45 		wp_register_script( 'akismet.js', AKISMET_PLUGIN_URL . 'akismet.js', array('jquery'), '2.5.9' );
       
    46 		wp_enqueue_script( 'akismet.js' );
       
    47 		wp_localize_script( 'akismet.js', 'WPAkismet', array(
       
    48 			'comment_author_url_nonce' => wp_create_nonce( 'comment_author_url_nonce' )
       
    49 		) );
       
    50 	}
       
    51 }
       
    52 
       
    53 
       
    54 function akismet_nonce_field($action = -1) { return wp_nonce_field($action); }
       
    55 $akismet_nonce = 'akismet-update-key';
       
    56 
       
    57 function akismet_plugin_action_links( $links, $file ) {
       
    58 	if ( $file == plugin_basename( dirname(__FILE__).'/akismet.php' ) ) {
       
    59 		$links[] = '<a href="' . admin_url( 'admin.php?page=akismet-key-config' ) . '">'.__( 'Settings' ).'</a>';
       
    60 	}
       
    61 
       
    62 	return $links;
       
    63 }
       
    64 
       
    65 add_filter( 'plugin_action_links', 'akismet_plugin_action_links', 10, 2 );
       
    66 
       
    67 function akismet_conf() {
       
    68 	global $akismet_nonce, $current_user;
       
    69 	
       
    70 	$new_key_link    = 'https://akismet.com/get/';
       
    71 	$config_link     = esc_url( add_query_arg( array( 'page' => 'akismet-key-config', 'show' => 'enter-api-key' ), class_exists( 'Jetpack' ) ? admin_url( 'admin.php' ) : admin_url( 'plugins.php' ) ) );
       
    72 	$stats_link      = esc_url( add_query_arg( array( 'page' => 'akismet-stats-display' ), class_exists( 'Jetpack' ) ? admin_url( 'admin.php' ) : admin_url( 'index.php' ) ) );
       
    73 	$api_key         = akismet_get_key();
       
    74 	$show_key_form   = $api_key;
       
    75 	$key_status      = 'empty';
       
    76 	$saved_ok        = false;
       
    77 	$key_status_text = '';
       
    78 	
       
    79 	$ms = array();
       
    80 
       
    81 	if ( isset( $_POST['submit'] ) ) {
       
    82 		if ( function_exists('current_user_can') && !current_user_can('manage_options') )
       
    83 			die(__('Cheatin&#8217; uh?'));
       
    84 			
       
    85 		$show_key_form = true;
       
    86 
       
    87 		check_admin_referer( $akismet_nonce );
       
    88 		$key      = preg_replace( '/[^a-h0-9]/i', '', $_POST['key'] );
       
    89 		$home_url = parse_url( get_bloginfo('url') );
       
    90 		
       
    91 		if ( empty( $home_url['host'] ) )
       
    92 			$ms[] = 'bad_home_url';
       
    93 
       
    94 		if ( empty( $key ) ) {
       
    95 			if ( $api_key ) {
       
    96 				delete_option('wordpress_api_key');
       
    97 				$saved_ok = true;			
       
    98 				$ms[] = 'new_key_empty';
       
    99 			}
       
   100 			else
       
   101 				$ms[] = 'key_empty';
       
   102 		}  
       
   103 		else
       
   104 			$key_status = akismet_verify_key( $key );		
       
   105 		
       
   106 		if ( $key != $api_key && $key_status == 'valid' ) {
       
   107 			$ms[] = 'new_key_valid';
       
   108 			update_option('wordpress_api_key', $key);
       
   109 		}
       
   110 		elseif ( $key_status == 'invalid' )
       
   111 			$ms[] = 'new_key_invalid';
       
   112 		elseif ( $key_status == 'failed' )
       
   113 			$ms[] = 'new_key_failed';
       
   114 
       
   115 		$api_key = $key_status == 'valid' ? $key : false;
       
   116 
       
   117 		if ( isset( $_POST['akismet_discard_month'] ) )
       
   118 			update_option( 'akismet_discard_month', 'true' );
       
   119 		else
       
   120 			update_option( 'akismet_discard_month', 'false' );
       
   121 
       
   122 		if ( isset( $_POST['akismet_show_user_comments_approved'] ) )
       
   123 			update_option( 'akismet_show_user_comments_approved', 'true' );
       
   124 		else
       
   125 			update_option( 'akismet_show_user_comments_approved', 'false' );
       
   126 			
       
   127 		if ( empty( $ms ) )
       
   128 			$saved_ok = true;
       
   129 
       
   130 	} 
       
   131 	elseif ( isset( $_POST['check'] ) ) {
       
   132 		$show_key_form = true;
       
   133 		check_admin_referer( $akismet_nonce );
       
   134 		akismet_get_server_connectivity(0);
       
   135 	}
       
   136 	elseif ( isset( $_GET['show'] ) && $_GET['show'] == 'enter-api-key' ) {
       
   137 		$show_key_form = true;
       
   138 	}
       
   139 	
       
   140 	if ( $show_key_form ) {
       
   141 		//check current key status
       
   142 		//only get this if showing the key form otherwise takes longer for page to load for new user
       
   143 		//no need to get it if we already know it and its valid
       
   144 		if ( in_array( $key_status, array( 'invalid', 'failed', 'empty' ) ) ) {
       
   145 			$key = get_option('wordpress_api_key');
       
   146 			if ( empty( $key ) ) {
       
   147 				//no key saved yet - maybe connection to Akismet down?
       
   148 				if ( in_array( $key_status, array( 'invalid', 'empty' ) ) ) {
       
   149 					if ( akismet_verify_key( '1234567890ab' ) == 'failed' )
       
   150 						$ms[] = 'no_connection';
       
   151 				}
       
   152 			} 
       
   153 			else
       
   154 				$key_status = akismet_verify_key( $key );			
       
   155 		}
       
   156 		
       
   157 		if ( !isset( $_POST['submit'] ) ) {
       
   158 			if ( $key_status == 'invalid' )
       
   159 				$ms[] = 'key_invalid';
       
   160 			elseif ( !empty( $key ) && $key_status == 'failed' )
       
   161 				$ms[] = 'key_failed';
       
   162 		}
       
   163 	}	
       
   164 		
       
   165 	$key_status_strings = array( 
       
   166 	 	'empty'   => __( 'Empty' ), 
       
   167 		'valid'   => __( 'Valid' ), 
       
   168 		'invalid' => __( 'Invalid' ), 
       
   169 		'failed'  => __( 'Failed' ), 
       
   170  	);
       
   171 
       
   172 	$messages = array(
       
   173 		'new_key_empty'   => array( 'class' => 'updated fade', 'text' => __('Your key has been cleared.' ) ),
       
   174 		'new_key_valid'   => array( 'class' => 'updated fade', 'text' => __('Your Akismet account has been successfully set up and activated. Happy blogging!' ) ),
       
   175 		'new_key_invalid' => array( 'class' => 'error',        'text' => __('The key you entered is invalid. Please double-check it.' ) ),
       
   176 		'new_key_failed'  => array( 'class' => 'error',        'text' => __('The key you entered could not be verified because a connection to akismet.com could not be established. Please check your server configuration.' ) ),
       
   177 		'no_connection'   => array( 'class' => 'error',        'text' => __('There was a problem connecting to the Akismet server. Please check your server configuration.' ) ),
       
   178 		'key_empty'       => array( 'class' => 'updated fade', 'text' => __('Please enter an API key' ) ),
       
   179 		'key_invalid'     => array( 'class' => 'error',        'text' => __('This key is invalid.' ) ),
       
   180 		'key_failed'      => array( 'class' => 'error',        '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.' ) ),
       
   181 		'bad_home_url'    => array( 'class' => 'error',        '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') ) )
       
   182 	);
       
   183 ?>
       
   184 
       
   185 
       
   186 <div class="wrap">
       
   187 	<?php if ( !$api_key ) : ?>
       
   188 	<h2 class="ak-header"><?php _e('Akismet'); ?></h2>
       
   189 	<?php else: ?>
       
   190 	<h2 class="ak-header"><?php printf( __( 'Akismet <a href="%s" class="add-new-h2">Stats</a>' ), $stats_link ); ?></h2>
       
   191 	<?php endif; ?>
       
   192 	<div class="no-key <?php echo $show_key_form ? 'hidden' : '';?>">
       
   193 		<p><?php _e('Akismet eliminates the comment and trackback spam you get on your site. To use Akismet you may need to sign up for an API key. Click the button below to get started.'); ?></p>
       
   194 		<form name="akismet_activate" action="https://akismet.com/get/" method="POST"> 
       
   195 			<input type="hidden" name="return" value="1"/> 
       
   196 			<input type="hidden" name="jetpack" value="<?php echo (string) class_exists( 'Jetpack' );?>"/>
       
   197 			<input type="hidden" name="user" value="<?php echo esc_attr( $current_user->user_login );?>"/>
       
   198 			<input type="submit" class="button button-primary" value="<?php esc_attr_e( 'Create a new Akismet Key' ); ?>"/>
       
   199 		</form>
       
   200 		<br/>
       
   201 		<a href="<?php echo $config_link;?>"><?php _e('I already have a key'); ?></a>
       
   202 	</div>
       
   203 	<div class="have-key <?php echo $show_key_form ? '' : 'hidden';?>">
       
   204 		<?php if ( !empty($_POST['submit'] ) && $saved_ok ) : ?>
       
   205 		<div id="message" class="updated fade"><p><strong><?php _e('Settings saved.') ?></strong></p></div>
       
   206 		<?php endif; ?>
       
   207 		<?php if ( isset($_GET['message']) && $_GET['message'] == 'success' ) : ?>
       
   208 		<div id="message" class="updated fade"><p><?php _e('<strong>Sign up success!</strong> Please check your email for your Akismet API Key and enter it below.') ?></p></div>
       
   209 		<?php endif; ?>
       
   210 		<?php foreach( $ms as $m ) : ?>
       
   211 		<div class="<?php echo $messages[$m]['class']; ?>"><p><strong><?php echo $messages[$m]['text']; ?></strong></p></div>
       
   212 		<?php endforeach; ?>		
       
   213 		<form action="" method="post" id="akismet-conf">
       
   214 			<table class="form-table">
       
   215 				<tbody>
       
   216 					<tr>
       
   217 						<th><label for="key"><?php _e('Akismet API Key');?></label></th>
       
   218 						<td>
       
   219 							<input id="key" name="key" type="text" size="15" maxlength="12" value="<?php echo esc_attr( get_option('wordpress_api_key') ); ?>" class="regular-text code <?php echo $key_status;?>"><div class="under-input key-status <?php echo $key_status;?>"><?php echo isset( $key_status_strings[ $key_status ] ) ? $key_status_strings[ $key_status ] : '';?></div>
       
   220 							<p class="need-key description"><?php printf( __('You must enter a valid Akismet API key here. If you need an API key, you can <a href="%s">create one here</a>'), '#' );?></p>
       
   221 						</td>
       
   222 					</tr>
       
   223 					<?php if ( $api_key ):?>
       
   224 					<tr valign="top">
       
   225 						<th scope="row"><?php _e('Settings');?></th>
       
   226 						<td>
       
   227 							<fieldset><legend class="screen-reader-text"><span><?php _e('Settings');?></span></legend>
       
   228 							<label for="akismet_discard_month" title="<?php esc_attr_e( 'Auto-detete old spam' ); ?>"><input name="akismet_discard_month" id="akismet_discard_month" value="true" type="checkbox" <?php echo get_option('akismet_discard_month') == 'true' ? 'checked="checked"':''; ?>> <span><?php _e('Auto-delete spam submitted on posts more than a month old.'); ?></span></label><br>
       
   229 							<label for="akismet_show_user_comments_approved" title="<?php esc_attr_e( 'Show approved comments' ); ?>"><input name="akismet_show_user_comments_approved" id="akismet_show_user_comments_approved" value="true" type="checkbox" <?php echo get_option('akismet_show_user_comments_approved') == 'true' ? 'checked="checked"':''; ?>> <span><?php _e('Show the number of comments you\'ve approved beside each comment author.'); ?></span></label>
       
   230 							</fieldset>
       
   231 						</td>
       
   232 					</tr>
       
   233 					<?php endif; ?>
       
   234 				</tbody>
       
   235 			</table>
       
   236 			<?php akismet_nonce_field($akismet_nonce) ?>
       
   237 			<p class="submit">
       
   238 				<input type="submit" name="submit" id="submit" class="button button-primary" value="<?php _e('Save Changes');?>">
       
   239 			</p>
       
   240 		</form>	
       
   241 		
       
   242 		<?php if ( $api_key ) : ?>
       
   243 		<h3><?php _e('Server Connectivity'); ?></h3>
       
   244 		<form action="" method="post" id="akismet-connectivity">
       
   245 			<table class="form-table">
       
   246 				<tbody>
       
   247 					<tr>
       
   248 						<th><label for="key"><?php _e('Server Status');?></label></th>
       
   249 						<td>
       
   250 						<?php if ( !function_exists('fsockopen') || !function_exists('gethostbynamel') ) : ?>
       
   251 							<p class="key-status failed"><?php _e('Network functions are disabled.'); ?></p>
       
   252 							<p class="description"><?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>
       
   253 							<?php else :
       
   254 									$servers    = akismet_get_server_connectivity();
       
   255 									$fail_count = count( $servers ) - count( array_filter( $servers ) );
       
   256 									if ( is_array( $servers ) && count( $servers ) > 0 ) { 
       
   257 										if ( $fail_count > 0 && $fail_count < count( $servers ) ) { // some connections work, some fail ?>
       
   258 							<p class="key-status some"><?php _e('Unable to reach some Akismet servers.'); ?></p>
       
   259 							<p class="description"><?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>
       
   260 									<?php } elseif ( $fail_count > 0 ) { // all connections fail ?>
       
   261 							<p class="key-status failed"><?php _e('Unable to reach any Akismet servers.'); ?></p>
       
   262 							<p class="description"><?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>
       
   263 									<?php } else { // all connections work ?>
       
   264 							<p class="key-status valid"><?php  _e('All Akismet servers are available.'); ?></p>
       
   265 							<p class="description"><?php _e('Akismet is working correctly.  All servers are accessible.'); ?></p>
       
   266 									<?php }
       
   267 									} else { //can't connect to any server ?>
       
   268 							<p class="key-status failed"><?php _e('Unable to find Akismet servers.'); ?></p>
       
   269 							<p class="description"><?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>
       
   270 								<?php }
       
   271 							endif; ?>							
       
   272 						</td>
       
   273 					</tr>
       
   274 					<?php if ( !empty( $servers ) ) : ?>
       
   275 					<tr valign="top">
       
   276 						<th scope="row"><?php _e('Network Status');?></th>
       
   277 						<td>
       
   278 							<table class="network-status">
       
   279 								<thead>
       
   280 										<th><?php _e('Akismet server'); ?></th><th><?php _e('Network Status'); ?></th>
       
   281 								</thead>
       
   282 								<tbody>
       
   283 								<?php
       
   284 										asort($servers);
       
   285 										foreach ( $servers as $ip => $status ) : ?>
       
   286 										<tr>
       
   287 											<td align="center"><?php echo esc_html( $ip ); ?></td>
       
   288 											<td class="key-status <?php echo $status ? 'valid' : 'failed'; ?>"><?php echo $status ? __('Accessible') : __('Re-trying'); ?></td>
       
   289 										</tr>										
       
   290 									<?php endforeach; ?>
       
   291 								</tbody>
       
   292 							</table>
       
   293 							<br/>
       
   294 							<input type="submit" name="check" id="submit" class="button" style="margin-left: 13.3em;" value="<?php _e('Check Network Status');?>">
       
   295 						</td>
       
   296 					</tr>
       
   297 					<?php endif; ?>
       
   298 					<tr valign="top">
       
   299 						<th scope="row"><?php _e('Last Checked');?></th>
       
   300 						<td>
       
   301 							<p><strong><?php echo get_option('akismet_connectivity_time') ? sprintf( __('%s Ago'), ucwords( human_time_diff( get_option('akismet_connectivity_time') ) ) ) : __( 'Not yet' ); ?></strong></p>
       
   302 							<p class="description"><?php printf( __('You can confirm that Akismet.com is up by <a href="%s" target="_blank">clicking here</a>.'), 'http://status.automattic.com/9931/136079/Akismet-API' ); ?></p>
       
   303 						</td>
       
   304 				</tbody>
       
   305 			</table>
       
   306 			<?php akismet_nonce_field($akismet_nonce) ?>
       
   307 		</form>
       
   308 		<?php endif;?>
       
   309 	</div>
       
   310 </div>
       
   311 <?php
       
   312 }
       
   313 
       
   314 function akismet_stats_display() {
       
   315 	global $akismet_api_host, $akismet_api_port;
       
   316 	
       
   317 	$blog        = urlencode( get_bloginfo('url') );
       
   318 	$api_key     = akismet_get_key();
       
   319 	$config_link = esc_url( add_query_arg( array( 'page' => 'akismet-key-config' ), class_exists( 'Jetpack' ) ? admin_url( 'admin.php' ) : admin_url( 'plugins.php' ) ) );?>
       
   320 	
       
   321 <div class="wrap"><?php	
       
   322 	if ( !$api_key ) :?>
       
   323 	<div id="akismet-warning" class="updated fade"><p><strong><?php _e('Akismet is almost ready.');?></strong> <?php printf( __( 'You must <a href="%1$s">enter your Akismet API key</a> for it to work.' ), $config_link );?></p></div><?php
       
   324 	else :?>
       
   325 	<iframe src="<?php echo esc_url( sprintf( '%s://akismet.com/web/1.0/user-stats.php?blog=%s&api_key=%s', is_ssl()?'https':'http', $blog, $api_key ) ); ?>" width="100%" height="2500px" frameborder="0" id="akismet-stats-frame"></iframe><?php
       
   326 	endif;?>
       
   327 </div><?php
       
   328 }
       
   329 
       
   330 function akismet_stats() {
       
   331 	if ( !function_exists('did_action') || did_action( 'rightnow_end' ) ) // We already displayed this info in the "Right Now" section
       
   332 		return;
       
   333 	if ( !$count = get_option('akismet_spam_count') )
       
   334 		return;
       
   335 	$path = plugin_basename(__FILE__);
       
   336 	echo '<h3>' . _x( 'Spam', 'comments' ) . '</h3>';
       
   337 	global $submenu;
       
   338 	if ( isset( $submenu['edit-comments.php'] ) )
       
   339 		$link = 'edit-comments.php';
       
   340 	else
       
   341 		$link = 'edit.php';
       
   342 	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>';
       
   343 }
       
   344 add_action('activity_box_end', 'akismet_stats');
       
   345 
       
   346 function akismet_admin_warnings() {
       
   347 	global $wpcom_api_key, $pagenow;
       
   348 
       
   349 	if (
       
   350 		$pagenow == 'edit-comments.php'
       
   351 		|| ( !empty( $_GET['page'] ) && $_GET['page'] == 'akismet-key-config' )
       
   352 		|| ( !empty( $_GET['page'] ) && $_GET['page'] == 'akismet-stats-display' )
       
   353 	) {
       
   354 		if ( get_option( 'akismet_alert_code' ) ) {
       
   355 			function akismet_alert() {
       
   356 				$alert = array(
       
   357 					'code' => (int) get_option( 'akismet_alert_code' ),
       
   358 					'msg' => get_option( 'akismet_alert_msg' )
       
   359 				);
       
   360 			?>
       
   361 				<div class='error'>
       
   362 					<p><strong><?php _e( 'Akismet Error Code');?>: <?php echo $alert['code']; ?></strong></p>
       
   363 					<p><?php esc_html_e( $alert['msg'] ); ?></p>
       
   364 					<p><?php //FIXME: need to revert this to using __() in next version
       
   365 						printf( translate( 'For more information:' ) . ' <a href="%s">%s</a>' , 'https://akismet.com/errors/'.$alert['code'], 'https://akismet.com/errors/'.$alert['code'] );?>
       
   366 					</p>
       
   367 				</div>
       
   368 			<?php
       
   369 			}
       
   370 
       
   371 			add_action( 'admin_notices', 'akismet_alert' );
       
   372 		}
       
   373 	}
       
   374 
       
   375 	if ( !get_option('wordpress_api_key') && !$wpcom_api_key && !isset($_POST['submit']) ) {
       
   376 		function akismet_warning() {
       
   377 			global $hook_suffix, $current_user;
       
   378 				
       
   379 			if ( $hook_suffix == 'plugins.php' ) {              
       
   380                	echo '  
       
   381 				<div class="updated" style="padding: 0; margin: 0; border: none; background: none;">  
       
   382 					<style type="text/css">  
       
   383 .akismet_activate{min-width:825px;border:1px solid #4F800D;padding:5px;margin:15px 0;background:#83AF24;background-image:-webkit-gradient(linear,0% 0,80% 100%,from(#83AF24),to(#4F800D));background-image:-moz-linear-gradient(80% 100% 120deg,#4F800D,#83AF24);-moz-border-radius:3px;border-radius:3px;-webkit-border-radius:3px;position:relative;overflow:hidden}.akismet_activate .aa_a{position:absolute;top:-5px;right:10px;font-size:140px;color:#769F33;font-family:Georgia, "Times New Roman", Times, serif;z-index:1}.akismet_activate .aa_button{font-weight:bold;border:1px solid #029DD6;border-top:1px solid #06B9FD;font-size:15px;text-align:center;padding:9px 0 8px 0;color:#FFF;background:#029DD6;background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#029DD6),to(#0079B1));background-image:-moz-linear-gradient(0% 100% 90deg,#0079B1,#029DD6);-moz-border-radius:2px;border-radius:2px;-webkit-border-radius:2px}.akismet_activate .aa_button:hover{text-decoration:none !important;border:1px solid #029DD6;border-bottom:1px solid #00A8EF;font-size:15px;text-align:center;padding:9px 0 8px 0;color:#F0F8FB;background:#0079B1;background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#0079B1),to(#0092BF));background-image:-moz-linear-gradient(0% 100% 90deg,#0092BF,#0079B1);-moz-border-radius:2px;border-radius:2px;-webkit-border-radius:2px}.akismet_activate .aa_button_border{border:1px solid #006699;-moz-border-radius:2px;border-radius:2px;-webkit-border-radius:2px;background:#029DD6;background-image:-webkit-gradient(linear,0% 0,0% 100%,from(#029DD6),to(#0079B1));background-image:-moz-linear-gradient(0% 100% 90deg,#0079B1,#029DD6)}.akismet_activate .aa_button_container{cursor:pointer;display:inline-block;background:#DEF1B8;padding:5px;-moz-border-radius:2px;border-radius:2px;-webkit-border-radius:2px;width:266px}.akismet_activate .aa_description{position:absolute;top:22px;left:285px;margin-left:25px;color:#E5F2B1;font-size:15px;z-index:1000}.akismet_activate .aa_description strong{color:#FFF;font-weight:normal}
       
   384 					</style>                       
       
   385 					<form name="akismet_activate" action="'.esc_url( add_query_arg( array( 'page' => 'akismet-key-config' ), class_exists( 'Jetpack' ) ? admin_url( 'admin.php' ) : admin_url( 'plugins.php' ) ) ).'" method="POST"> 
       
   386 						<input type="hidden" name="return" value="1"/>
       
   387 						<input type="hidden" name="jetpack" value="'.(string) class_exists( 'Jetpack' ).'"/>
       
   388 						<input type="hidden" name="user" value="'.esc_attr( $current_user->user_login ).'"/>
       
   389 						<div class="akismet_activate">  
       
   390 							<div class="aa_a">A</div>     
       
   391 							<div class="aa_button_container" onclick="document.akismet_activate.submit();">  
       
   392 								<div class="aa_button_border">          
       
   393 									<div class="aa_button">'.__('Activate your Akismet account').'</div>  
       
   394 								</div>  
       
   395 							</div>  
       
   396 							<div class="aa_description">'.__('<strong>Almost done</strong> - activate your account and say goodbye to comment spam').'</div>  
       
   397 						</div>  
       
   398 					</form>  
       
   399 				</div>  
       
   400                ';      
       
   401    			}
       
   402 		}
       
   403 
       
   404 		add_action('admin_notices', 'akismet_warning');
       
   405 		return;
       
   406 	} elseif ( ( empty($_SERVER['SCRIPT_FILENAME']) || basename($_SERVER['SCRIPT_FILENAME']) == 'edit-comments.php' ) &&  wp_next_scheduled('akismet_schedule_cron_recheck') ) {
       
   407 		function akismet_warning() {
       
   408 			global $wpdb;
       
   409 				akismet_fix_scheduled_recheck();
       
   410 				$waiting = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->commentmeta WHERE meta_key = 'akismet_error'" );
       
   411 				$next_check = wp_next_scheduled('akismet_schedule_cron_recheck');
       
   412 				if ( $waiting > 0 && $next_check > time() )
       
   413 					echo '
       
   414 			<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>
       
   415 			';
       
   416 		}
       
   417 		add_action('admin_notices', 'akismet_warning');
       
   418 		return;
       
   419 	}
       
   420 }
       
   421 
       
   422 // FIXME placeholder
       
   423 
       
   424 function akismet_comment_row_action( $a, $comment ) {
       
   425 
       
   426 	// failsafe for old WP versions
       
   427 	if ( !function_exists('add_comment_meta') )
       
   428 		return $a;
       
   429 
       
   430 	$akismet_result = get_comment_meta( $comment->comment_ID, 'akismet_result', true );
       
   431 	$akismet_error  = get_comment_meta( $comment->comment_ID, 'akismet_error', true );
       
   432 	$user_result    = get_comment_meta( $comment->comment_ID, 'akismet_user_result', true);
       
   433 	$comment_status = wp_get_comment_status( $comment->comment_ID );
       
   434 	$desc = null;
       
   435 	if ( $akismet_error ) {
       
   436 		$desc = __( 'Awaiting spam check' );
       
   437 	} elseif ( !$user_result || $user_result == $akismet_result ) {
       
   438 		// Show the original Akismet result if the user hasn't overridden it, or if their decision was the same
       
   439 		if ( $akismet_result == 'true' && $comment_status != 'spam' && $comment_status != 'trash' )
       
   440 			$desc = __( 'Flagged as spam by Akismet' );
       
   441 		elseif ( $akismet_result == 'false' && $comment_status == 'spam' )
       
   442 			$desc = __( 'Cleared by Akismet' );
       
   443 	} else {
       
   444 		$who = get_comment_meta( $comment->comment_ID, 'akismet_user', true );
       
   445 		if ( $user_result == 'true' )
       
   446 			$desc = sprintf( __('Flagged as spam by %s'), $who );
       
   447 		else
       
   448 			$desc = sprintf( __('Un-spammed by %s'), $who );
       
   449 	}
       
   450 
       
   451 	// add a History item to the hover links, just after Edit
       
   452 	if ( $akismet_result ) {
       
   453 		$b = array();
       
   454 		foreach ( $a as $k => $item ) {
       
   455 			$b[ $k ] = $item;
       
   456 			if (
       
   457 				$k == 'edit'
       
   458 				|| ( $k == 'unspam' && $GLOBALS['wp_version'] >= 3.4 )
       
   459 			) {
       
   460 				$b['history'] = '<a href="comment.php?action=editcomment&amp;c='.$comment->comment_ID.'#akismet-status" title="'. esc_attr__( 'View comment history' ) . '"> '. __('History') . '</a>';
       
   461 			}
       
   462 		}
       
   463 		
       
   464 		$a = $b;
       
   465 	}
       
   466 		
       
   467 	if ( $desc )
       
   468 		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' ) . '">'.esc_html( $desc ).'</a></span>';
       
   469 		
       
   470 	if ( apply_filters( 'akismet_show_user_comments_approved', get_option('akismet_show_user_comments_approved') ) == 'true' ) {
       
   471 		$comment_count = akismet_get_user_comments_approved( $comment->user_id, $comment->comment_author_email, $comment->comment_author, $comment->comment_author_url );
       
   472 		$comment_count = intval( $comment_count );
       
   473 		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>';
       
   474 	}
       
   475 	
       
   476 	return $a;
       
   477 }
       
   478 
       
   479 add_filter( 'comment_row_actions', 'akismet_comment_row_action', 10, 2 );
       
   480 
       
   481 function akismet_comment_status_meta_box($comment) {
       
   482 	$history = akismet_get_comment_history( $comment->comment_ID );
       
   483 
       
   484 	if ( $history ) {
       
   485 		echo '<div class="akismet-history" style="margin: 13px;">';
       
   486 		foreach ( $history as $row ) {
       
   487 			$time = date( 'D d M Y @ h:i:m a', $row['time'] ) . ' GMT';
       
   488 			echo '<div style="margin-bottom: 13px;"><span style="color: #999;" alt="' . $time . '" title="' . $time . '">' . sprintf( __('%s ago'), human_time_diff( $row['time'] ) ) . '</span> - ';
       
   489 			echo esc_html( $row['message'] ) . '</div>';
       
   490 		}
       
   491 		
       
   492 		echo '</div>';
       
   493 
       
   494 	}
       
   495 }
       
   496 
       
   497 
       
   498 // add an extra column header to the comments screen
       
   499 function akismet_comments_columns( $columns ) {
       
   500 	$columns[ 'akismet' ] = __( 'Akismet' );
       
   501 	return $columns;
       
   502 }
       
   503 
       
   504 #add_filter( 'manage_edit-comments_columns', 'akismet_comments_columns' );
       
   505 
       
   506 // Show stuff in the extra column
       
   507 function akismet_comment_column_row( $column, $comment_id ) {
       
   508 	if ( $column != 'akismet' )
       
   509 		return;
       
   510 		
       
   511 	$history = akismet_get_comment_history( $comment_id );
       
   512 	
       
   513 	if ( $history ) {
       
   514 		echo '<dl class="akismet-history">';
       
   515 		foreach ( $history as $row ) {
       
   516 			echo '<dt>' . sprintf( __('%s ago'), human_time_diff( $row['time'] ) ) . '</dt>';
       
   517 			echo '<dd>' . esc_html( $row['message'] ) . '</dd>';
       
   518 		}
       
   519 		
       
   520 		echo '</dl>';
       
   521 	}
       
   522 }
       
   523 
       
   524 #add_action( 'manage_comments_custom_column', 'akismet_comment_column_row', 10, 2 );
       
   525 
       
   526 // END FIXME
       
   527 
       
   528 // call out URLS in comments
       
   529 function akismet_text_add_link_callback( $m ) {	
       
   530 	// bare link?
       
   531 	if ( $m[4] == $m[2] )
       
   532 		return '<a '.$m[1].' href="'.$m[2].'" '.$m[3].' class="comment-link">'.$m[4].'</a>';
       
   533 	else
       
   534 	    return '<span title="'.$m[2].'" class="comment-link"><a '.$m[1].' href="'.$m[2].'" '.$m[3].' class="comment-link">'.$m[4].'</a></span>';
       
   535 }
       
   536 
       
   537 function akismet_text_add_link_class( $comment_text ) {
       
   538 	return preg_replace_callback( '#<a ([^>]*)href="([^"]+)"([^>]*)>(.*?)</a>#i', 'akismet_text_add_link_callback', $comment_text );
       
   539 }
       
   540 
       
   541 add_filter('comment_text', 'akismet_text_add_link_class');
       
   542 
       
   543 
       
   544 // WP 2.5+
       
   545 function akismet_rightnow() {
       
   546 	global $submenu, $wp_db_version;
       
   547 
       
   548 	if ( 8645 < $wp_db_version  ) // 2.7
       
   549 		$link = 'edit-comments.php?comment_status=spam';
       
   550 	elseif ( isset( $submenu['edit-comments.php'] ) )
       
   551 		$link = 'edit-comments.php?page=akismet-admin';
       
   552 	else
       
   553 		$link = 'edit.php?page=akismet-admin';
       
   554 
       
   555 	if ( $count = get_option('akismet_spam_count') ) {
       
   556 		$intro = sprintf( _n(
       
   557 			'<a href="%1$s">Akismet</a> has protected your site from %2$s spam comment already. ',
       
   558 			'<a href="%1$s">Akismet</a> has protected your site from %2$s spam comments already. ',
       
   559 			$count
       
   560 		), 'http://akismet.com/?return=true', number_format_i18n( $count ) );
       
   561 	} else {
       
   562 		$intro = sprintf( __('<a href="%1$s">Akismet</a> blocks spam from getting to your blog. '), 'http://akismet.com/?return=true' );
       
   563 	}
       
   564 
       
   565 	$link = function_exists( 'esc_url' ) ? esc_url( $link ) : clean_url( $link );
       
   566 	if ( $queue_count = akismet_spam_count() ) {
       
   567 		$queue_text = sprintf( _n(
       
   568 			'There\'s <a href="%2$s">%1$s comment</a> in your spam queue right now.',
       
   569 			'There are <a href="%2$s">%1$s comments</a> in your spam queue right now.',
       
   570 			$queue_count
       
   571 		), number_format_i18n( $queue_count ), $link );
       
   572 	} else {
       
   573 		$queue_text = sprintf( __( "There's nothing in your <a href='%1\$s'>spam queue</a> at the moment." ), $link );
       
   574 	}
       
   575 
       
   576 	$text = $intro . '<br />' . $queue_text;
       
   577 	echo "<p class='akismet-right-now'>$text</p>\n";
       
   578 }
       
   579 	
       
   580 add_action('rightnow_end', 'akismet_rightnow');
       
   581 
       
   582 
       
   583 // For WP >= 2.5
       
   584 function akismet_check_for_spam_button($comment_status) {
       
   585 	if ( 'approved' == $comment_status )
       
   586 		return;
       
   587 	if ( function_exists('plugins_url') )
       
   588 		$link = 'admin.php?action=akismet_recheck_queue';
       
   589 	else
       
   590 		$link = 'edit-comments.php?page=akismet-admin&amp;recheckqueue=true&amp;noheader=true';
       
   591 	echo "</div><div class='alignleft'><a class='button-secondary checkforspam' href='$link'>" . __('Check for Spam') . "</a>";
       
   592 }
       
   593 add_action('manage_comments_nav', 'akismet_check_for_spam_button');
       
   594 
       
   595 function akismet_submit_nonspam_comment ( $comment_id ) {
       
   596 	global $wpdb, $akismet_api_host, $akismet_api_port, $current_user, $current_site;
       
   597 	$comment_id = (int) $comment_id;
       
   598 
       
   599 	$comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'");
       
   600 	if ( !$comment ) // it was deleted
       
   601 		return;
       
   602 		
       
   603 	// use the original version stored in comment_meta if available	
       
   604 	$as_submitted = get_comment_meta( $comment_id, 'akismet_as_submitted', true);
       
   605 	if ( $as_submitted && is_array($as_submitted) && isset($as_submitted['comment_content']) ) {
       
   606 		$comment = (object) array_merge( (array)$comment, $as_submitted );
       
   607 	}
       
   608 	
       
   609 	$comment->blog = get_bloginfo('url');
       
   610 	$comment->blog_lang = get_locale();
       
   611 	$comment->blog_charset = get_option('blog_charset');
       
   612 	$comment->permalink = get_permalink($comment->comment_post_ID);
       
   613 	if ( is_object($current_user) ) {
       
   614 	    $comment->reporter = $current_user->user_login;
       
   615 	}
       
   616 	if ( is_object($current_site) ) {
       
   617 		$comment->site_domain = $current_site->domain;
       
   618 	}
       
   619 
       
   620 	$comment->user_role = '';
       
   621 	if ( isset( $comment->user_ID ) )
       
   622 		$comment->user_role = akismet_get_user_roles($comment->user_ID);
       
   623 
       
   624 	if ( akismet_test_mode() )
       
   625 		$comment->is_test = 'true';
       
   626 
       
   627 	$post = get_post( $comment->comment_post_ID );
       
   628 	$comment->comment_post_modified_gmt = $post->post_modified_gmt;
       
   629 
       
   630 	$query_string = '';
       
   631 	foreach ( $comment as $key => $data )
       
   632 		$query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
       
   633 
       
   634 	$response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-ham", $akismet_api_port);
       
   635 	if ( $comment->reporter ) {
       
   636 		akismet_update_comment_history( $comment_id, sprintf( __('%s reported this comment as not spam'), $comment->reporter ), 'report-ham' );
       
   637 		update_comment_meta( $comment_id, 'akismet_user_result', 'false' );
       
   638 		update_comment_meta( $comment_id, 'akismet_user', $comment->reporter );
       
   639 	}
       
   640 	
       
   641 	do_action('akismet_submit_nonspam_comment', $comment_id, $response[1]);
       
   642 }
       
   643 
       
   644 function akismet_submit_spam_comment ( $comment_id ) {
       
   645 	global $wpdb, $akismet_api_host, $akismet_api_port, $current_user, $current_site;
       
   646 	$comment_id = (int) $comment_id;
       
   647 
       
   648 	$comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'");
       
   649 	if ( !$comment ) // it was deleted
       
   650 		return;
       
   651 	if ( 'spam' != $comment->comment_approved )
       
   652 		return;
       
   653 	
       
   654 	// use the original version stored in comment_meta if available	
       
   655 	$as_submitted = get_comment_meta( $comment_id, 'akismet_as_submitted', true);
       
   656 	if ( $as_submitted && is_array($as_submitted) && isset($as_submitted['comment_content']) ) {
       
   657 		$comment = (object) array_merge( (array)$comment, $as_submitted );
       
   658 	}
       
   659 	
       
   660 	$comment->blog = get_bloginfo('url');
       
   661 	$comment->blog_lang = get_locale();
       
   662 	$comment->blog_charset = get_option('blog_charset');
       
   663 	$comment->permalink = get_permalink($comment->comment_post_ID);
       
   664 	if ( is_object($current_user) ) {
       
   665 	    $comment->reporter = $current_user->user_login;
       
   666 	}
       
   667 	if ( is_object($current_site) ) {
       
   668 		$comment->site_domain = $current_site->domain;
       
   669 	}
       
   670 
       
   671 	$comment->user_role = '';
       
   672 	if ( isset( $comment->user_ID ) )
       
   673 		$comment->user_role = akismet_get_user_roles($comment->user_ID);
       
   674 
       
   675 	if ( akismet_test_mode() )
       
   676 		$comment->is_test = 'true';
       
   677 
       
   678 	$post = get_post( $comment->comment_post_ID );
       
   679 	$comment->comment_post_modified_gmt = $post->post_modified_gmt;
       
   680 
       
   681 	$query_string = '';
       
   682 	foreach ( $comment as $key => $data )
       
   683 		$query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
       
   684 
       
   685 	$response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-spam", $akismet_api_port);
       
   686 	if ( $comment->reporter ) {
       
   687 		akismet_update_comment_history( $comment_id, sprintf( __('%s reported this comment as spam'), $comment->reporter ), 'report-spam' );
       
   688 		update_comment_meta( $comment_id, 'akismet_user_result', 'true' );
       
   689 		update_comment_meta( $comment_id, 'akismet_user', $comment->reporter );
       
   690 	}
       
   691 	do_action('akismet_submit_spam_comment', $comment_id, $response[1]);
       
   692 }
       
   693 
       
   694 // For WP 2.7+
       
   695 function akismet_transition_comment_status( $new_status, $old_status, $comment ) {
       
   696 	if ( $new_status == $old_status )
       
   697 		return;
       
   698 
       
   699 	# we don't need to record a history item for deleted comments
       
   700 	if ( $new_status == 'delete' )
       
   701 		return;
       
   702 		
       
   703 	if ( !is_admin() )
       
   704 		return;
       
   705 		
       
   706 	if ( !current_user_can( 'edit_post', $comment->comment_post_ID ) && !current_user_can( 'moderate_comments' ) )
       
   707 		return;
       
   708 
       
   709 	if ( defined('WP_IMPORTING') && WP_IMPORTING == true )
       
   710 		return;
       
   711 
       
   712 	// if this is present, it means the status has been changed by a re-check, not an explicit user action
       
   713 	if ( get_comment_meta( $comment->comment_ID, 'akismet_rechecking' ) )
       
   714 		return;
       
   715 		
       
   716 	global $current_user;
       
   717 	$reporter = '';
       
   718 	if ( is_object( $current_user ) )
       
   719 		$reporter = $current_user->user_login;
       
   720 	
       
   721 	// Assumption alert:
       
   722 	// We want to submit comments to Akismet only when a moderator explicitly spams or approves it - not if the status
       
   723 	// is changed automatically by another plugin.  Unfortunately WordPress doesn't provide an unambiguous way to
       
   724 	// determine why the transition_comment_status action was triggered.  And there are several different ways by which
       
   725 	// to spam and unspam comments: bulk actions, ajax, links in moderation emails, the dashboard, and perhaps others.
       
   726 	// We'll assume that this is an explicit user action if POST or GET has an 'action' key.
       
   727 	if ( isset($_POST['action']) || isset($_GET['action']) ) {
       
   728 		if ( $new_status == 'spam' && ( $old_status == 'approved' || $old_status == 'unapproved' || !$old_status ) ) {
       
   729 				return akismet_submit_spam_comment( $comment->comment_ID );
       
   730 		} elseif ( $old_status == 'spam' && ( $new_status == 'approved' || $new_status == 'unapproved' ) ) {
       
   731 				return akismet_submit_nonspam_comment( $comment->comment_ID );
       
   732 		}
       
   733 	}
       
   734 	
       
   735 	akismet_update_comment_history( $comment->comment_ID, sprintf( __('%s changed the comment status to %s'), $reporter, $new_status ), 'status-' . $new_status );
       
   736 }
       
   737 
       
   738 add_action( 'transition_comment_status', 'akismet_transition_comment_status', 10, 3 );
       
   739 
       
   740 // Total spam in queue
       
   741 // get_option( 'akismet_spam_count' ) is the total caught ever
       
   742 function akismet_spam_count( $type = false ) {
       
   743 	global $wpdb;
       
   744 
       
   745 	if ( !$type ) { // total
       
   746 		$count = wp_cache_get( 'akismet_spam_count', 'widget' );
       
   747 		if ( false === $count ) {
       
   748 			if ( function_exists('wp_count_comments') ) {
       
   749 				$count = wp_count_comments();
       
   750 				$count = $count->spam;
       
   751 			} else {
       
   752 				$count = (int) $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam'");
       
   753 			}
       
   754 			wp_cache_set( 'akismet_spam_count', $count, 'widget', 3600 );
       
   755 		}
       
   756 		return $count;
       
   757 	} elseif ( 'comments' == $type || 'comment' == $type ) { // comments
       
   758 		$type = '';
       
   759 	} else { // pingback, trackback, ...
       
   760 		$type  = $wpdb->escape( $type );
       
   761 	}
       
   762 
       
   763 	return (int) $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam' AND comment_type='$type'");
       
   764 }
       
   765 
       
   766 
       
   767 function akismet_recheck_queue() {
       
   768 	global $wpdb, $akismet_api_host, $akismet_api_port;
       
   769 
       
   770 	akismet_fix_scheduled_recheck();
       
   771 
       
   772 	if ( ! ( isset( $_GET['recheckqueue'] ) || ( isset( $_REQUEST['action'] ) && 'akismet_recheck_queue' == $_REQUEST['action'] ) ) )
       
   773 		return;
       
   774 		
       
   775 	$moderation = $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = '0'", ARRAY_A );
       
   776 	foreach ( (array) $moderation as $c ) {
       
   777 		$c['user_ip']    = $c['comment_author_IP'];
       
   778 		$c['user_agent'] = $c['comment_agent'];
       
   779 		$c['referrer']   = '';
       
   780 		$c['blog']       = get_bloginfo('url');
       
   781 		$c['blog_lang']  = get_locale();
       
   782 		$c['blog_charset'] = get_option('blog_charset');
       
   783 		$c['permalink']  = get_permalink($c['comment_post_ID']);
       
   784 
       
   785 		$c['user_role'] = '';
       
   786 		if ( isset( $c['user_ID'] ) )
       
   787 			$c['user_role']  = akismet_get_user_roles($c['user_ID']);
       
   788 
       
   789 		if ( akismet_test_mode() )
       
   790 			$c['is_test'] = 'true';
       
   791 
       
   792 		$id = (int) $c['comment_ID'];
       
   793 
       
   794 		$query_string = '';
       
   795 		foreach ( $c as $key => $data )
       
   796 		$query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
       
   797 
       
   798 		add_comment_meta( $c['comment_ID'], 'akismet_rechecking', true );
       
   799 		$response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port);
       
   800 		if ( 'true' == $response[1] ) {
       
   801 			wp_set_comment_status($c['comment_ID'], 'spam');
       
   802 			update_comment_meta( $c['comment_ID'], 'akismet_result', 'true' );
       
   803 			delete_comment_meta( $c['comment_ID'], 'akismet_error' );
       
   804 			akismet_update_comment_history( $c['comment_ID'], __('Akismet re-checked and caught this comment as spam'), 'check-spam' );
       
   805 		
       
   806 		} elseif ( 'false' == $response[1] ) {
       
   807 			update_comment_meta( $c['comment_ID'], 'akismet_result', 'false' );
       
   808 			delete_comment_meta( $c['comment_ID'], 'akismet_error' );
       
   809 			akismet_update_comment_history( $c['comment_ID'], __('Akismet re-checked and cleared this comment'), 'check-ham' );
       
   810 		// abnormal result: error
       
   811 		} else {
       
   812 			update_comment_meta( $c['comment_ID'], 'akismet_result', 'error' );
       
   813 			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' );
       
   814 		}
       
   815 
       
   816 		delete_comment_meta( $c['comment_ID'], 'akismet_rechecking' );
       
   817 	}
       
   818 	$redirect_to = isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : admin_url( 'edit-comments.php' );
       
   819 	wp_safe_redirect( $redirect_to );
       
   820 	exit;
       
   821 }
       
   822 
       
   823 add_action('admin_action_akismet_recheck_queue', 'akismet_recheck_queue');
       
   824 
       
   825 // Adds an 'x' link next to author URLs, clicking will remove the author URL and show an undo link
       
   826 function akismet_remove_comment_author_url() {
       
   827     if ( !empty($_POST['id'] ) && check_admin_referer( 'comment_author_url_nonce' ) ) {
       
   828         global $wpdb;
       
   829         $comment = get_comment( intval($_POST['id']), ARRAY_A );
       
   830         if (current_user_can('edit_comment', $comment['comment_ID'])) {
       
   831             $comment['comment_author_url'] = '';
       
   832             do_action( 'comment_remove_author_url' );
       
   833             print(wp_update_comment( $comment ));
       
   834             die();
       
   835         }
       
   836     }
       
   837 }
       
   838 
       
   839 add_action('wp_ajax_comment_author_deurl', 'akismet_remove_comment_author_url');
       
   840 
       
   841 function akismet_add_comment_author_url() {
       
   842     if ( !empty( $_POST['id'] ) && !empty( $_POST['url'] ) && check_admin_referer( 'comment_author_url_nonce' ) ) {
       
   843         global $wpdb;
       
   844         $comment = get_comment( intval($_POST['id']), ARRAY_A );
       
   845         if (current_user_can('edit_comment', $comment['comment_ID'])) {
       
   846             $comment['comment_author_url'] = esc_url($_POST['url']);
       
   847             do_action( 'comment_add_author_url' );
       
   848             print(wp_update_comment( $comment ));
       
   849             die();
       
   850         }
       
   851     }
       
   852 }
       
   853 
       
   854 add_action('wp_ajax_comment_author_reurl', 'akismet_add_comment_author_url');
       
   855 
       
   856 // Check connectivity between the WordPress blog and Akismet's servers.
       
   857 // 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).
       
   858 function akismet_check_server_connectivity() {
       
   859 	global $akismet_api_host, $akismet_api_port, $wpcom_api_key;
       
   860 	
       
   861 	$test_host = 'rest.akismet.com';
       
   862 	
       
   863 	// Some web hosts may disable one or both functions
       
   864 	if ( !function_exists('fsockopen') || !function_exists('gethostbynamel') )
       
   865 		return array();
       
   866 	
       
   867 	$ips = gethostbynamel($test_host);
       
   868 	if ( !$ips || !is_array($ips) || !count($ips) )
       
   869 		return array();
       
   870 		
       
   871 	$servers = array();
       
   872 	foreach ( $ips as $ip ) {
       
   873 		$response = akismet_verify_key( akismet_get_key(), $ip );
       
   874 		// even if the key is invalid, at least we know we have connectivity
       
   875 		if ( $response == 'valid' || $response == 'invalid' )
       
   876 			$servers[$ip] = true;
       
   877 		else
       
   878 			$servers[$ip] = false;
       
   879 	}
       
   880 
       
   881 	return $servers;
       
   882 }
       
   883 
       
   884 // Check the server connectivity and store the results in an option.
       
   885 // Cached results will be used if not older than the specified timeout in seconds; use $cache_timeout = 0 to force an update.
       
   886 // Returns the same associative array as akismet_check_server_connectivity()
       
   887 function akismet_get_server_connectivity( $cache_timeout = 86400 ) {
       
   888 	$servers = get_option('akismet_available_servers');
       
   889 	if ( (time() - get_option('akismet_connectivity_time') < $cache_timeout) && $servers !== false )
       
   890 		return $servers;
       
   891 	
       
   892 	// There's a race condition here but the effect is harmless.
       
   893 	$servers = akismet_check_server_connectivity();
       
   894 	update_option('akismet_available_servers', $servers);
       
   895 	update_option('akismet_connectivity_time', time());
       
   896 	return $servers;
       
   897 }
       
   898 
       
   899 // Returns true if server connectivity was OK at the last check, false if there was a problem that needs to be fixed.
       
   900 function akismet_server_connectivity_ok() {
       
   901 	// skip the check on WPMU because the status page is hidden
       
   902 	global $wpcom_api_key;
       
   903 	if ( $wpcom_api_key )
       
   904 		return true;
       
   905 	$servers = akismet_get_server_connectivity();
       
   906 	return !( empty($servers) || !count($servers) || count( array_filter($servers) ) < count($servers) );
       
   907 }
       
   908 
       
   909 function akismet_admin_menu() {
       
   910 	if ( class_exists( 'Jetpack' ) ) {
       
   911 		add_action( 'jetpack_admin_menu', 'akismet_load_menu' );
       
   912 	} else {
       
   913 		akismet_load_menu();
       
   914 	}
       
   915 }
       
   916 
       
   917 function akismet_load_menu() {	
       
   918 	if ( class_exists( 'Jetpack' ) ) {
       
   919 		add_submenu_page( 'jetpack', __( 'Akismet' ), __( 'Akismet' ), 'manage_options', 'akismet-key-config', 'akismet_conf' );
       
   920 		add_submenu_page( 'jetpack', __( 'Akismet Stats' ), __( 'Akismet Stats' ), 'manage_options', 'akismet-stats-display', 'akismet_stats_display' );
       
   921 	} else {
       
   922 		add_submenu_page('plugins.php', __('Akismet'), __('Akismet'), 'manage_options', 'akismet-key-config', 'akismet_conf');
       
   923 		add_submenu_page('index.php', __('Akismet Stats'), __('Akismet Stats'), 'manage_options', 'akismet-stats-display', 'akismet_stats_display');
       
   924 	}
       
   925 }