function wp_set_current_user($id, $name = '') {
global $current_user;
- if ( isset($current_user) && ($id == $current_user->ID) )
+ if ( isset( $current_user ) && ( $current_user instanceof WP_User ) && ( $id == $current_user->ID ) )
return $current_user;
- $current_user = new WP_User($id, $name);
+ $current_user = new WP_User( $id, $name );
- setup_userdata($current_user->ID);
+ setup_userdata( $current_user->ID );
do_action('set_current_user');
function get_currentuserinfo() {
global $current_user;
- if ( defined('XMLRPC_REQUEST') && XMLRPC_REQUEST )
+ if ( ! empty( $current_user ) ) {
+ if ( $current_user instanceof WP_User )
+ return;
+
+ // Upgrade stdClass to WP_User
+ if ( is_object( $current_user ) && isset( $current_user->ID ) ) {
+ $cur_id = $current_user->ID;
+ $current_user = null;
+ wp_set_current_user( $cur_id );
+ return;
+ }
+
+ // $current_user has a junk value. Force to WP_User with ID 0.
+ $current_user = null;
+ wp_set_current_user( 0 );
return false;
+ }
- if ( ! empty($current_user) )
- return;
+ if ( defined('XMLRPC_REQUEST') && XMLRPC_REQUEST ) {
+ wp_set_current_user( 0 );
+ return false;
+ }
if ( ! $user = wp_validate_auth_cookie() ) {
- if ( is_blog_admin() || is_network_admin() || empty($_COOKIE[LOGGED_IN_COOKIE]) || !$user = wp_validate_auth_cookie($_COOKIE[LOGGED_IN_COOKIE], 'logged_in') ) {
- wp_set_current_user(0);
+ if ( is_blog_admin() || is_network_admin() || empty( $_COOKIE[LOGGED_IN_COOKIE] ) || !$user = wp_validate_auth_cookie( $_COOKIE[LOGGED_IN_COOKIE], 'logged_in' ) ) {
+ wp_set_current_user( 0 );
return false;
}
}
- wp_set_current_user($user);
+ wp_set_current_user( $user );
}
endif;
* @since 0.71
*
* @param int $user_id User ID
- * @return bool|object False on failure, WP_User object on success
+ * @return WP_User|bool WP_User object on success, false on failure.
*/
function get_userdata( $user_id ) {
return get_user_by( 'id', $user_id );
*
* @since 2.8.0
*
- * @param string $field The field to retrieve the user with. id | slug | email | login
- * @param int|string $value A value for $field. A user ID, slug, email address, or login name.
- * @return bool|object False on failure, WP_User object on success
+ * @param string $field The field to retrieve the user with. id | slug | email | login
+ * @param int|string $value A value for $field. A user ID, slug, email address, or login name.
+ * @return WP_User|bool WP_User object on success, false on failure.
*/
function get_user_by( $field, $value ) {
$userdata = WP_User::get_data_by( $field, $value );
function cache_users( $user_ids ) {
global $wpdb;
- $clean = array();
- foreach ( $user_ids as $id ) {
- $id = (int) $id;
- if ( !wp_cache_get( $id, 'users' ) ) {
- $clean[] = $id;
- }
- }
+ $clean = _get_non_cached_ids( $user_ids, 'users' );
if ( empty( $clean ) )
return;
// Send!
try {
- $phpmailer->Send();
+ return $phpmailer->Send();
} catch ( phpmailerException $e ) {
return false;
}
-
- return true;
}
endif;
*
* @param string $username User's username
* @param string $password User's password
- * @return WP_Error|WP_User WP_User object if login successful, otherwise WP_Error object.
+ * @return WP_User|WP_Error WP_User object if login successful, otherwise WP_Error object.
*/
function wp_authenticate($username, $password) {
$username = sanitize_user($username);
// Allow a grace period for POST and AJAX requests
if ( defined('DOING_AJAX') || 'POST' == $_SERVER['REQUEST_METHOD'] )
- $expired += 3600;
+ $expired += HOUR_IN_SECONDS;
// Quick check to see if an honest cookie has expired
if ( $expired < time() ) {
$key = wp_hash($username . $pass_frag . '|' . $expiration, $scheme);
$hash = hash_hmac('md5', $username . '|' . $expiration, $key);
- if ( $hmac != $hash ) {
+ if ( hash_hmac( 'md5', $hmac, $key ) !== hash_hmac( 'md5', $hash, $key ) ) {
do_action('auth_cookie_bad_hash', $cookie_elements);
return false;
}
*/
function wp_set_auth_cookie($user_id, $remember = false, $secure = '') {
if ( $remember ) {
- $expiration = $expire = time() + apply_filters('auth_cookie_expiration', 1209600, $user_id, $remember);
+ $expiration = time() + apply_filters('auth_cookie_expiration', 14 * DAY_IN_SECONDS, $user_id, $remember);
+ // Ensure the browser will continue to send the cookie after the expiration time is reached.
+ // Needed for the login grace period in wp_validate_auth_cookie().
+ $expire = $expiration + ( 12 * HOUR_IN_SECONDS );
} else {
- $expiration = time() + apply_filters('auth_cookie_expiration', 172800, $user_id, $remember);
+ $expiration = time() + apply_filters('auth_cookie_expiration', 2 * DAY_IN_SECONDS, $user_id, $remember);
$expire = 0;
}
function wp_clear_auth_cookie() {
do_action('clear_auth_cookie');
- setcookie(AUTH_COOKIE, ' ', time() - 31536000, ADMIN_COOKIE_PATH, COOKIE_DOMAIN);
- setcookie(SECURE_AUTH_COOKIE, ' ', time() - 31536000, ADMIN_COOKIE_PATH, COOKIE_DOMAIN);
- setcookie(AUTH_COOKIE, ' ', time() - 31536000, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN);
- setcookie(SECURE_AUTH_COOKIE, ' ', time() - 31536000, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN);
- setcookie(LOGGED_IN_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN);
- setcookie(LOGGED_IN_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN);
+ setcookie( AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, ADMIN_COOKIE_PATH, COOKIE_DOMAIN );
+ setcookie( SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, ADMIN_COOKIE_PATH, COOKIE_DOMAIN );
+ setcookie( AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN );
+ setcookie( SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN );
+ setcookie( LOGGED_IN_COOKIE, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN );
+ setcookie( LOGGED_IN_COOKIE, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN );
// Old cookies
- setcookie(AUTH_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN);
- setcookie(AUTH_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN);
- setcookie(SECURE_AUTH_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN);
- setcookie(SECURE_AUTH_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN);
+ setcookie( AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN );
+ setcookie( AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN );
+ setcookie( SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN );
+ setcookie( SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN );
// Even older cookies
- setcookie(USER_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN);
- setcookie(PASS_COOKIE, ' ', time() - 31536000, COOKIEPATH, COOKIE_DOMAIN);
- setcookie(USER_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN);
- setcookie(PASS_COOKIE, ' ', time() - 31536000, SITECOOKIEPATH, COOKIE_DOMAIN);
+ setcookie( USER_COOKIE, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN );
+ setcookie( PASS_COOKIE, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN );
+ setcookie( USER_COOKIE, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN );
+ setcookie( PASS_COOKIE, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN );
}
endif;
function is_user_logged_in() {
$user = wp_get_current_user();
- if ( empty( $user->ID ) )
+ if ( ! $user->exists() )
return false;
return true;
// If https is required and request is http, redirect
if ( $secure && !is_ssl() && false !== strpos($_SERVER['REQUEST_URI'], 'wp-admin') ) {
- if ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) {
- wp_redirect(preg_replace('|^http://|', 'https://', $_SERVER['REQUEST_URI']));
+ if ( 0 === strpos( $_SERVER['REQUEST_URI'], 'http' ) ) {
+ wp_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ) );
exit();
} else {
- wp_redirect('https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
+ wp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
exit();
}
}
// If the user wants ssl but the session is not ssl, redirect.
if ( !$secure && get_user_option('use_ssl', $user_id) && false !== strpos($_SERVER['REQUEST_URI'], 'wp-admin') ) {
- if ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) {
- wp_redirect(preg_replace('|^http://|', 'https://', $_SERVER['REQUEST_URI']));
+ if ( 0 === strpos( $_SERVER['REQUEST_URI'], 'http' ) ) {
+ wp_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ) );
exit();
} else {
- wp_redirect('https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
+ wp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
exit();
}
}
// The cookie is no good so force login
nocache_headers();
- if ( is_ssl() )
- $proto = 'https://';
- else
- $proto = 'http://';
-
- $redirect = ( strpos($_SERVER['REQUEST_URI'], '/options.php') && wp_get_referer() ) ? wp_get_referer() : $proto . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
+ $redirect = ( strpos( $_SERVER['REQUEST_URI'], '/options.php' ) && wp_get_referer() ) ? wp_get_referer() : set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
$login_url = wp_login_url($redirect, true);
}
do_action('check_admin_referer', $action, $result);
return $result;
-}endif;
+}
+endif;
if ( !function_exists('check_ajax_referer') ) :
/**
* @param string $query_arg where to look for nonce in $_REQUEST (since 2.5)
*/
function check_ajax_referer( $action = -1, $query_arg = false, $die = true ) {
- if ( $query_arg )
- $nonce = $_REQUEST[$query_arg];
- else
- $nonce = isset($_REQUEST['_ajax_nonce']) ? $_REQUEST['_ajax_nonce'] : $_REQUEST['_wpnonce'];
+ $nonce = '';
+
+ if ( $query_arg && isset( $_REQUEST[ $query_arg ] ) )
+ $nonce = $_REQUEST[ $query_arg ];
+ elseif ( isset( $_REQUEST['_ajax_nonce'] ) )
+ $nonce = $_REQUEST['_ajax_nonce'];
+ elseif ( isset( $_REQUEST['_wpnonce'] ) )
+ $nonce = $_REQUEST['_wpnonce'];
$result = wp_verify_nonce( $nonce, $action );
- if ( $die && false == $result )
- die('-1');
+ if ( $die && false == $result ) {
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
+ wp_die( -1 );
+ else
+ die( '-1' );
+ }
do_action('check_ajax_referer', $action, $result);
* @since 1.5.1
* @uses apply_filters() Calls 'wp_redirect' hook on $location and $status.
*
- * @param string $location The path to redirect to
- * @param int $status Status code to use
- * @return bool False if $location is not set
+ * @param string $location The path to redirect to.
+ * @param int $status Status code to use.
+ * @return bool False if $location is not provided, true otherwise.
*/
function wp_redirect($location, $status = 302) {
global $is_IIS;
- $location = apply_filters('wp_redirect', $location, $status);
- $status = apply_filters('wp_redirect_status', $status, $location);
+ /**
+ * Filter the redirect location.
+ *
+ * @since 2.1.0
+ *
+ * @param string $location The path to redirect to.
+ * @param int $status Status code to use.
+ */
+ $location = apply_filters( 'wp_redirect', $location, $status );
+
+ /**
+ * Filter the redirect status code.
+ *
+ * @since 2.3.0
+ *
+ * @param int $status Status code to use.
+ * @param string $location The path to redirect to.
+ */
+ $status = apply_filters( 'wp_redirect_status', $status, $location );
- if ( !$location ) // allows the wp_redirect filter to cancel a redirect
+ if ( ! $location )
return false;
$location = wp_sanitize_redirect($location);
status_header($status); // This causes problems on IIS and some FastCGI setups
header("Location: $location", true, $status);
+
+ return true;
}
endif;
* WordPress host string and $location host string.
*
* @param string $location The redirect to validate
- * @param string $default The value to return is $location is not allowed
+ * @param string $default The value to return if $location is not allowed
* @return string redirect-sanitized URL
**/
function wp_validate_redirect($location, $default = '') {
+ $location = trim( $location );
// browsers will assume 'http' is your protocol, and will obey a redirect to a URL starting with '//'
if ( substr($location, 0, 2) == '//' )
$location = 'http:' . $location;
*/
function wp_notify_postauthor( $comment_id, $comment_type = '' ) {
$comment = get_comment( $comment_id );
+ if ( empty( $comment ) )
+ return false;
+
$post = get_post( $comment->comment_post_ID );
$author = get_userdata( $post->post_author );
if ( $post->post_author == get_current_user_id() )
return false;
+ // The post author is no longer a member of the blog
+ if ( ! user_can( $post->post_author, 'read_post', $post->ID ) )
+ return false;
+
// If there's no email to send the comment to
if ( '' == $author->user_email )
return false;
}
$notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
$notify_message .= sprintf( __('Permalink: %s'), get_permalink( $comment->comment_post_ID ) . '#comment-' . $comment_id ) . "\r\n";
- if ( EMPTY_TRASH_DAYS )
- $notify_message .= sprintf( __('Trash it: %s'), admin_url("comment.php?action=trash&c=$comment_id") ) . "\r\n";
- else
- $notify_message .= sprintf( __('Delete it: %s'), admin_url("comment.php?action=delete&c=$comment_id") ) . "\r\n";
- $notify_message .= sprintf( __('Spam it: %s'), admin_url("comment.php?action=spam&c=$comment_id") ) . "\r\n";
+
+ if ( user_can( $post->post_author, 'edit_comment', $comment_id ) ) {
+ if ( EMPTY_TRASH_DAYS )
+ $notify_message .= sprintf( __('Trash it: %s'), admin_url("comment.php?action=trash&c=$comment_id") ) . "\r\n";
+ else
+ $notify_message .= sprintf( __('Delete it: %s'), admin_url("comment.php?action=delete&c=$comment_id") ) . "\r\n";
+ $notify_message .= sprintf( __('Spam it: %s'), admin_url("comment.php?action=spam&c=$comment_id") ) . "\r\n";
+ }
$wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
if ( isset($reply_to) )
$message_headers .= $reply_to . "\n";
- $notify_message = apply_filters('comment_notification_text', $notify_message, $comment_id);
- $subject = apply_filters('comment_notification_subject', $subject, $comment_id);
- $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment_id);
+ $emails = array( $author->user_email );
- @wp_mail( $author->user_email, $subject, $notify_message, $message_headers );
+ $emails = apply_filters( 'comment_notification_recipients', $emails, $comment_id );
+ $notify_message = apply_filters( 'comment_notification_text', $notify_message, $comment_id );
+ $subject = apply_filters( 'comment_notification_subject', $subject, $comment_id );
+ $message_headers = apply_filters( 'comment_notification_headers', $message_headers, $comment_id );
+
+ foreach ( $emails as $email ) {
+ @wp_mail( $email, $subject, $notify_message, $message_headers );
+ }
return true;
}
$post = get_post($comment->comment_post_ID);
$user = get_userdata( $post->post_author );
// Send to the administration and to the post author if the author can modify the comment.
- $email_to = array( get_option('admin_email') );
+ $emails = array( get_option('admin_email') );
if ( user_can($user->ID, 'edit_comment', $comment_id) && !empty($user->user_email) && ( get_option('admin_email') != $user->user_email) )
- $email_to[] = $user->user_email;
+ $emails[] = $user->user_email;
$comment_author_domain = @gethostbyaddr($comment->comment_author_IP);
$comments_waiting = $wpdb->get_var("SELECT count(comment_ID) FROM $wpdb->comments WHERE comment_approved = '0'");
$subject = sprintf( __('[%1$s] Please moderate: "%2$s"'), $blogname, $post->post_title );
$message_headers = '';
- $notify_message = apply_filters('comment_moderation_text', $notify_message, $comment_id);
- $subject = apply_filters('comment_moderation_subject', $subject, $comment_id);
- $message_headers = apply_filters('comment_moderation_headers', $message_headers);
+ $emails = apply_filters( 'comment_moderation_recipients', $emails, $comment_id );
+ $notify_message = apply_filters( 'comment_moderation_text', $notify_message, $comment_id );
+ $subject = apply_filters( 'comment_moderation_subject', $subject, $comment_id );
+ $message_headers = apply_filters( 'comment_moderation_headers', $message_headers, $comment_id );
- foreach ( $email_to as $email )
- @wp_mail($email, $subject, $notify_message, $message_headers);
+ foreach ( $emails as $email ) {
+ @wp_mail( $email, $subject, $notify_message, $message_headers );
+ }
return true;
}
* @param string $plaintext_pass Optional. The user's plaintext password
*/
function wp_new_user_notification($user_id, $plaintext_pass = '') {
- $user = new WP_User($user_id);
-
- $user_login = stripslashes($user->user_login);
- $user_email = stripslashes($user->user_email);
+ $user = get_userdata( $user_id );
// The blogname option is escaped with esc_html on the way into the database in sanitize_option
// we want to reverse this for the plain text arena of emails.
$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
$message = sprintf(__('New user registration on your site %s:'), $blogname) . "\r\n\r\n";
- $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
- $message .= sprintf(__('E-mail: %s'), $user_email) . "\r\n";
+ $message .= sprintf(__('Username: %s'), $user->user_login) . "\r\n\r\n";
+ $message .= sprintf(__('E-mail: %s'), $user->user_email) . "\r\n";
@wp_mail(get_option('admin_email'), sprintf(__('[%s] New User Registration'), $blogname), $message);
if ( empty($plaintext_pass) )
return;
- $message = sprintf(__('Username: %s'), $user_login) . "\r\n";
+ $message = sprintf(__('Username: %s'), $user->user_login) . "\r\n";
$message .= sprintf(__('Password: %s'), $plaintext_pass) . "\r\n";
$message .= wp_login_url() . "\r\n";
- wp_mail($user_email, sprintf(__('[%s] Your username and password'), $blogname), $message);
+ wp_mail($user->user_email, sprintf(__('[%s] Your username and password'), $blogname), $message);
}
endif;
* @return int
*/
function wp_nonce_tick() {
- $nonce_life = apply_filters('nonce_life', 86400);
+ $nonce_life = apply_filters( 'nonce_life', DAY_IN_SECONDS );
return ceil(time() / ( $nonce_life / 2 ));
}
function wp_verify_nonce($nonce, $action = -1) {
$user = wp_get_current_user();
$uid = (int) $user->ID;
+ if ( ! $uid )
+ $uid = apply_filters( 'nonce_user_logged_out', $uid, $action );
$i = wp_nonce_tick();
// Nonce generated 0-12 hours ago
- if ( substr(wp_hash($i . $action . $uid, 'nonce'), -12, 10) == $nonce )
+ if ( substr(wp_hash($i . $action . $uid, 'nonce'), -12, 10) === $nonce )
return 1;
// Nonce generated 12-24 hours ago
- if ( substr(wp_hash(($i - 1) . $action . $uid, 'nonce'), -12, 10) == $nonce )
+ if ( substr(wp_hash(($i - 1) . $action . $uid, 'nonce'), -12, 10) === $nonce )
return 2;
// Invalid nonce
return false;
function wp_create_nonce($action = -1) {
$user = wp_get_current_user();
$uid = (int) $user->ID;
+ if ( ! $uid )
+ $uid = apply_filters( 'nonce_user_logged_out', $uid, $action );
$i = wp_nonce_tick();
if ( !function_exists('wp_salt') ) :
/**
- * Get salt to add to hashes to help prevent attacks.
+ * Get salt to add to hashes.
*
- * The secret key is located in two places: the database in case the secret key
- * isn't defined in the second place, which is in the wp-config.php file. If you
- * are going to set the secret key, then you must do so in the wp-config.php
- * file.
+ * Salts are created using secret keys. Secret keys are located in two places:
+ * in the database and in the wp-config.php file. The secret key in the database
+ * is randomly generated and will be appended to the secret keys in wp-config.php.
*
- * The secret key in the database is randomly generated and will be appended to
- * the secret key that is in wp-config.php file in some instances. It is
- * important to have the secret key defined or changed in wp-config.php.
- *
- * If you have installed WordPress 2.5 or later, then you will have the
- * SECRET_KEY defined in the wp-config.php already. You will want to change the
- * value in it because hackers will know what it is. If you have upgraded to
- * WordPress 2.5 or later version from a version before WordPress 2.5, then you
- * should add the constant to your wp-config.php file.
- *
- * Below is an example of how the SECRET_KEY constant is defined with a value.
- * You must not copy the below example and paste into your wp-config.php. If you
- * need an example, then you can have a
- * {@link https://api.wordpress.org/secret-key/1.1/ secret key created} for you.
+ * The secret keys in wp-config.php should be updated to strong, random keys to maximize
+ * security. Below is an example of how the secret key constants are defined.
+ * Do not paste this example directly into wp-config.php. Instead, have a
+ * {@link https://api.wordpress.org/secret-key/1.1/salt/ secret key created} just
+ * for you.
*
* <code>
- * define('SECRET_KEY', 'mAry1HadA15|\/|b17w55w1t3asSn09w');
+ * define('AUTH_KEY', ' Xakm<o xQy rw4EMsLKM-?!T+,PFF})H4lzcW57AF0U@N@< >M%G4Yt>f`z]MON');
+ * define('SECURE_AUTH_KEY', 'LzJ}op]mr|6+![P}Ak:uNdJCJZd>(Hx.-Mh#Tz)pCIU#uGEnfFz|f ;;eU%/U^O~');
+ * define('LOGGED_IN_KEY', '|i|Ux`9<p-h$aFf(qnT:sDO:D1P^wZ$$/Ra@miTJi9G;ddp_<q}6H1)o|a +&JCM');
+ * define('NONCE_KEY', '%:R{[P|,s.KuMltH5}cI;/k<Gx~j!f0I)m_sIyu+&NJZ)-iO>z7X>QYR0Z_XnZ@|');
+ * define('AUTH_SALT', 'eZyT)-Naw]F8CwA*VaW#q*|.)g@o}||wf~@C-YSt}(dh_r6EbI#A,y|nU2{B#JBW');
+ * define('SECURE_AUTH_SALT', '!=oLUTXh,QW=H `}`L|9/^4-3 STz},T(w}W<I`.JjPi)<Bmf1v,HpGe}T1:Xt7n');
+ * define('LOGGED_IN_SALT', '+XSqHc;@Q*K_b|Z?NC[3H!!EONbh.n<+=uKR:>*c(u`g~EJBf#8u#R{mUEZrozmm');
+ * define('NONCE_SALT', 'h`GXHhD>SLWVfg1(1(N{;.V!MoE(SfbA_ksP@&`+AycHcAV$+?@3q+rxV{%^VyKT');
* </code>
*
* Salting passwords helps against tools which has stored hashed values of
- * common dictionary strings. The added values makes it harder to crack if given
- * salt string is not weak.
+ * common dictionary strings. The added values makes it harder to crack.
*
* @since 2.5
- * @link https://api.wordpress.org/secret-key/1.1/ Create a Secret Key for wp-config.php
*
- * @param string $scheme Authentication scheme
+ * @link https://api.wordpress.org/secret-key/1.1/salt/ Create secrets for wp-config.php
+ *
+ * @param string $scheme Authentication scheme (auth, secure_auth, logged_in, nonce)
* @return string Salt value
*/
-function wp_salt($scheme = 'auth') {
- global $wp_default_secret_key;
- $secret_key = '';
- if ( defined('SECRET_KEY') && ('' != SECRET_KEY) && ( $wp_default_secret_key != SECRET_KEY) )
- $secret_key = SECRET_KEY;
-
- if ( 'auth' == $scheme ) {
- if ( defined('AUTH_KEY') && ('' != AUTH_KEY) && ( $wp_default_secret_key != AUTH_KEY) )
- $secret_key = AUTH_KEY;
-
- if ( defined('AUTH_SALT') && ('' != AUTH_SALT) && ( $wp_default_secret_key != AUTH_SALT) ) {
- $salt = AUTH_SALT;
- } elseif ( defined('SECRET_SALT') && ('' != SECRET_SALT) && ( $wp_default_secret_key != SECRET_SALT) ) {
- $salt = SECRET_SALT;
- } else {
- $salt = get_site_option('auth_salt');
- if ( empty($salt) ) {
- $salt = wp_generate_password( 64, true, true );
- update_site_option('auth_salt', $salt);
- }
- }
- } elseif ( 'secure_auth' == $scheme ) {
- if ( defined('SECURE_AUTH_KEY') && ('' != SECURE_AUTH_KEY) && ( $wp_default_secret_key != SECURE_AUTH_KEY) )
- $secret_key = SECURE_AUTH_KEY;
-
- if ( defined('SECURE_AUTH_SALT') && ('' != SECURE_AUTH_SALT) && ( $wp_default_secret_key != SECURE_AUTH_SALT) ) {
- $salt = SECURE_AUTH_SALT;
- } else {
- $salt = get_site_option('secure_auth_salt');
- if ( empty($salt) ) {
- $salt = wp_generate_password( 64, true, true );
- update_site_option('secure_auth_salt', $salt);
+function wp_salt( $scheme = 'auth' ) {
+ static $cached_salts = array();
+ if ( isset( $cached_salts[ $scheme ] ) )
+ return apply_filters( 'salt', $cached_salts[ $scheme ], $scheme );
+
+ static $duplicated_keys;
+ if ( null === $duplicated_keys ) {
+ $duplicated_keys = array( 'put your unique phrase here' => true );
+ foreach ( array( 'AUTH', 'SECURE_AUTH', 'LOGGED_IN', 'NONCE', 'SECRET' ) as $first ) {
+ foreach ( array( 'KEY', 'SALT' ) as $second ) {
+ if ( ! defined( "{$first}_{$second}" ) )
+ continue;
+ $value = constant( "{$first}_{$second}" );
+ $duplicated_keys[ $value ] = isset( $duplicated_keys[ $value ] );
}
}
- } elseif ( 'logged_in' == $scheme ) {
- if ( defined('LOGGED_IN_KEY') && ('' != LOGGED_IN_KEY) && ( $wp_default_secret_key != LOGGED_IN_KEY) )
- $secret_key = LOGGED_IN_KEY;
+ }
- if ( defined('LOGGED_IN_SALT') && ('' != LOGGED_IN_SALT) && ( $wp_default_secret_key != LOGGED_IN_SALT) ) {
- $salt = LOGGED_IN_SALT;
- } else {
- $salt = get_site_option('logged_in_salt');
- if ( empty($salt) ) {
- $salt = wp_generate_password( 64, true, true );
- update_site_option('logged_in_salt', $salt);
+ $key = $salt = '';
+ if ( defined( 'SECRET_KEY' ) && SECRET_KEY && empty( $duplicated_keys[ SECRET_KEY ] ) )
+ $key = SECRET_KEY;
+ if ( 'auth' == $scheme && defined( 'SECRET_SALT' ) && SECRET_SALT && empty( $duplicated_keys[ SECRET_SALT ] ) )
+ $salt = SECRET_SALT;
+
+ if ( in_array( $scheme, array( 'auth', 'secure_auth', 'logged_in', 'nonce' ) ) ) {
+ foreach ( array( 'key', 'salt' ) as $type ) {
+ $const = strtoupper( "{$scheme}_{$type}" );
+ if ( defined( $const ) && constant( $const ) && empty( $duplicated_keys[ constant( $const ) ] ) ) {
+ $$type = constant( $const );
+ } elseif ( ! $$type ) {
+ $$type = get_site_option( "{$scheme}_{$type}" );
+ if ( ! $$type ) {
+ $$type = wp_generate_password( 64, true, true );
+ update_site_option( "{$scheme}_{$type}", $$type );
+ }
}
}
- } elseif ( 'nonce' == $scheme ) {
- if ( defined('NONCE_KEY') && ('' != NONCE_KEY) && ( $wp_default_secret_key != NONCE_KEY) )
- $secret_key = NONCE_KEY;
-
- if ( defined('NONCE_SALT') && ('' != NONCE_SALT) && ( $wp_default_secret_key != NONCE_SALT) ) {
- $salt = NONCE_SALT;
- } else {
- $salt = get_site_option('nonce_salt');
- if ( empty($salt) ) {
- $salt = wp_generate_password( 64, true, true );
- update_site_option('nonce_salt', $salt);
+ } else {
+ if ( ! $key ) {
+ $key = get_site_option( 'secret_key' );
+ if ( ! $key ) {
+ $key = wp_generate_password( 64, true, true );
+ update_site_option( 'secret_key', $key );
}
}
- } else {
- // ensure each auth scheme has its own unique salt
- $salt = hash_hmac('md5', $scheme, $secret_key);
+ $salt = hash_hmac( 'md5', $scheme, $key );
}
- return apply_filters('salt', $secret_key . $salt, $scheme);
+ $cached_salts[ $scheme ] = $key . $salt;
+ return apply_filters( 'salt', $cached_salts[ $scheme ], $scheme );
}
endif;
if ( empty($wp_hasher) ) {
require_once( ABSPATH . 'wp-includes/class-phpass.php');
// By default, use the portable hash from phpass
- $wp_hasher = new PasswordHash(8, TRUE);
+ $wp_hasher = new PasswordHash(8, true);
}
- return $wp_hasher->HashPassword($password);
+ return $wp_hasher->HashPassword( trim( $password ) );
}
endif;
if ( empty($wp_hasher) ) {
require_once( ABSPATH . 'wp-includes/class-phpass.php');
// By default, use the portable hash from phpass
- $wp_hasher = new PasswordHash(8, TRUE);
+ $wp_hasher = new PasswordHash(8, true);
}
$check = $wp_hasher->CheckPassword($password, $hash);
endif;
if ( !function_exists('wp_rand') ) :
- /**
+/**
* Generates a random number
*
* @since 2.6.2
*
- * @param int $min Lower limit for the generated number (optional, default is 0)
- * @param int $max Upper limit for the generated number (optional, default is 4294967295)
+ * @param int $min Lower limit for the generated number
+ * @param int $max Upper limit for the generated number
* @return int A random number between min and max
*/
function wp_rand( $min = 0, $max = 0 ) {
$value = abs(hexdec($value));
+ // Some misconfigured 32bit environments (Entropy PHP, for example) truncate integers larger than PHP_INT_MAX to PHP_INT_MAX rather than overflowing them to floats.
+ $max_random_number = 3000000000 === 2147483647 ? (float) "4294967295" : 4294967295; // 4294967295 = 0xffffffff
+
// Reduce the value to be within the min - max range
- // 4294967295 = 0xffffffff = max random number
if ( $max != 0 )
- $value = $min + (($max - $min + 1) * ($value / (4294967295 + 1)));
+ $value = $min + ( $max - $min + 1 ) * $value / ( $max_random_number + 1 );
return abs(intval($value));
}
function wp_set_password( $password, $user_id ) {
global $wpdb;
- $hash = wp_hash_password($password);
+ $hash = wp_hash_password( $password );
$wpdb->update($wpdb->users, array('user_pass' => $hash, 'user_activation_key' => ''), array('ID' => $user_id) );
wp_cache_delete($user_id, 'users');
* @param int|string|object $id_or_email A user ID, email address, or comment object
* @param int $size Size of the avatar image
* @param string $default URL to a default image to use if no avatar is available
- * @param string $alt Alternate text to use in image tag. Defaults to blank
+ * @param string $alt Alternative text to use in image tag. Defaults to blank
* @return string <img> tag for the user's avatar
*/
function get_avatar( $id_or_email, $size = '96', $default = '', $alt = false ) {
}
if ( !empty($email) )
- $email_hash = md5( strtolower( $email ) );
+ $email_hash = md5( strtolower( trim( $email ) ) );
if ( is_ssl() ) {
$host = 'https://secure.gravatar.com';
if ( 'mystery' == $default )
$default = "$host/avatar/ad516503a11cd5ca435acc9bb6523536?s={$size}"; // ad516503a11cd5ca435acc9bb6523536 == md5('unknown@gravatar.com')
elseif ( 'blank' == $default )
- $default = includes_url('images/blank.gif');
+ $default = $email ? 'blank' : includes_url( 'images/blank.gif' );
elseif ( !empty($email) && 'gravatar_default' == $default )
$default = '';
elseif ( 'gravatar_default' == $default )
- $default = "$host/avatar/s={$size}";
+ $default = "$host/avatar/?s={$size}";
elseif ( empty($email) )
$default = "$host/avatar/?d=$default&s={$size}";
elseif ( strpos($default, 'http://') === 0 )
if ( !empty( $rating ) )
$out .= "&r={$rating}";
+ $out = str_replace( '&', '&', esc_url( $out ) );
$avatar = "<img alt='{$safe_alt}' src='{$out}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
} else {
$avatar = "<img alt='{$safe_alt}' src='{$default}' class='avatar avatar-{$size} photo avatar-default' height='{$size}' width='{$size}' />";
$left_string = normalize_whitespace($left_string);
$right_string = normalize_whitespace($right_string);
- $left_lines = split("\n", $left_string);
- $right_lines = split("\n", $right_string);
-
+ $left_lines = explode("\n", $left_string);
+ $right_lines = explode("\n", $right_string);
$text_diff = new Text_Diff($left_lines, $right_lines);
- $renderer = new WP_Text_Diff_Renderer_Table();
+ $renderer = new WP_Text_Diff_Renderer_Table( $args );
$diff = $renderer->render($text_diff);
if ( !$diff )
return '';
$r = "<table class='diff'>\n";
- $r .= "<col class='ltype' /><col class='content' /><col class='ltype' /><col class='content' />";
+
+ if ( ! empty( $args[ 'show_split_view' ] ) ) {
+ $r .= "<col class='content diffsplit left' /><col class='content diffsplit middle' /><col class='content diffsplit right' />";
+ } else {
+ $r .= "<col class='content' />";
+ }
if ( $args['title'] || $args['title_left'] || $args['title_right'] )
$r .= "<thead>";
return $r;
}
endif;
+