X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/61343b82c4f0da4c68e4c6373daafff4a81efdd1..53a5df18dd17a11c18781e78349feb3e139096b4:/wp-includes/user.php diff --git a/wp-includes/user.php b/wp-includes/user.php index bc583a57..a0cb8d81 100644 --- a/wp-includes/user.php +++ b/wp-includes/user.php @@ -73,6 +73,9 @@ function wp_authenticate_username_password($user, $username, $password) { if ( is_a($user, 'WP_User') ) { return $user; } if ( empty($username) || empty($password) ) { + if ( is_wp_error( $user ) ) + return $user; + $error = new WP_Error(); if ( empty($username) ) @@ -89,19 +92,6 @@ function wp_authenticate_username_password($user, $username, $password) { if ( !$user ) return new WP_Error( 'invalid_username', sprintf( __( 'ERROR: Invalid username. Lost your password?' ), wp_lostpassword_url() ) ); - if ( is_multisite() ) { - // Is user marked as spam? - if ( 1 == $user->spam ) - return new WP_Error( 'spammer_account', __( 'ERROR: Your account has been marked as a spammer.' ) ); - - // Is a user's blog marked as spam? - if ( !is_super_admin( $user->ID ) && isset( $user->primary_blog ) ) { - $details = get_blog_details( $user->primary_blog ); - if ( is_object( $details ) && $details->spam == 1 ) - return new WP_Error( 'blog_suspended', __( 'Site Suspended.' ) ); - } - } - $user = apply_filters('wp_authenticate_user', $user, $password); if ( is_wp_error($user) ) return $user; @@ -140,6 +130,22 @@ function wp_authenticate_cookie($user, $username, $password) { return $user; } +/** + * For multisite blogs, check if the authenticated user has been marked as a + * spammer, or if the user's primary blog has been marked as spam. + * + * @since 3.7.0 + */ +function wp_authenticate_spam_check( $user ) { + if ( $user && is_a( $user, 'WP_User' ) && is_multisite() ) { + $spammed = apply_filters( 'check_is_user_spammed', is_user_spammy(), $user ); + + if ( $spammed ) + return new WP_Error( 'spammer_account', __( 'ERROR: Your account has been marked as a spammer.' ) ); + } + return $user; +} + /** * Number of posts user has written. * @@ -206,6 +212,8 @@ function count_many_users_posts( $users, $post_type = 'post', $public_only = fal * @return int The current user's ID */ function get_current_user_id() { + if ( ! function_exists( 'wp_get_current_user' ) ) + return 0; $user = wp_get_current_user(); return ( isset( $user->ID ) ? (int) $user->ID : 0 ); } @@ -242,8 +250,9 @@ function get_user_option( $option, $user = 0, $deprecated = '' ) { if ( ! $user = get_userdata( $user ) ) return false; - if ( $user->has_prop( $wpdb->prefix . $option ) ) // Blog specific - $result = $user->get( $wpdb->prefix . $option ); + $prefix = $wpdb->get_blog_prefix(); + if ( $user->has_prop( $prefix . $option ) ) // Blog specific + $result = $user->get( $prefix . $option ); elseif ( $user->has_prop( $option ) ) // User specific and cross-blog $result = $user->get( $option ); else @@ -274,7 +283,7 @@ function update_user_option( $user_id, $option_name, $newvalue, $global = false global $wpdb; if ( !$global ) - $option_name = $wpdb->prefix . $option_name; + $option_name = $wpdb->get_blog_prefix() . $option_name; return update_user_meta( $user_id, $option_name, $newvalue ); } @@ -298,7 +307,7 @@ function delete_user_option( $user_id, $option_name, $global = false ) { global $wpdb; if ( !$global ) - $option_name = $wpdb->prefix . $option_name; + $option_name = $wpdb->get_blog_prefix() . $option_name; return delete_user_meta( $user_id, $option_name ); } @@ -403,37 +412,44 @@ class WP_User_Query { $this->query_fields = "$wpdb->users.ID"; } - if ( $qv['count_total'] ) + if ( isset( $qv['count_total'] ) && $qv['count_total'] ) $this->query_fields = 'SQL_CALC_FOUND_ROWS ' . $this->query_fields; $this->query_from = "FROM $wpdb->users"; $this->query_where = "WHERE 1=1"; // sorting - if ( in_array( $qv['orderby'], array('nicename', 'email', 'url', 'registered') ) ) { - $orderby = 'user_' . $qv['orderby']; - } elseif ( in_array( $qv['orderby'], array('user_nicename', 'user_email', 'user_url', 'user_registered') ) ) { - $orderby = $qv['orderby']; - } elseif ( 'name' == $qv['orderby'] || 'display_name' == $qv['orderby'] ) { - $orderby = 'display_name'; - } elseif ( 'post_count' == $qv['orderby'] ) { - // todo: avoid the JOIN - $where = get_posts_by_author_sql('post'); - $this->query_from .= " LEFT OUTER JOIN ( - SELECT post_author, COUNT(*) as post_count - FROM $wpdb->posts - $where - GROUP BY post_author - ) p ON ({$wpdb->users}.ID = p.post_author) - "; - $orderby = 'post_count'; - } elseif ( 'ID' == $qv['orderby'] || 'id' == $qv['orderby'] ) { - $orderby = 'ID'; - } else { - $orderby = 'user_login'; + if ( isset( $qv['orderby'] ) ) { + if ( in_array( $qv['orderby'], array('nicename', 'email', 'url', 'registered') ) ) { + $orderby = 'user_' . $qv['orderby']; + } elseif ( in_array( $qv['orderby'], array('user_nicename', 'user_email', 'user_url', 'user_registered') ) ) { + $orderby = $qv['orderby']; + } elseif ( 'name' == $qv['orderby'] || 'display_name' == $qv['orderby'] ) { + $orderby = 'display_name'; + } elseif ( 'post_count' == $qv['orderby'] ) { + // todo: avoid the JOIN + $where = get_posts_by_author_sql('post'); + $this->query_from .= " LEFT OUTER JOIN ( + SELECT post_author, COUNT(*) as post_count + FROM $wpdb->posts + $where + GROUP BY post_author + ) p ON ({$wpdb->users}.ID = p.post_author) + "; + $orderby = 'post_count'; + } elseif ( 'ID' == $qv['orderby'] || 'id' == $qv['orderby'] ) { + $orderby = 'ID'; + } elseif ( 'meta_value' == $qv['orderby'] ) { + $orderby = "$wpdb->usermeta.meta_value"; + } else { + $orderby = 'user_login'; + } } - $qv['order'] = strtoupper( $qv['order'] ); + if ( empty( $orderby ) ) + $orderby = 'user_login'; + + $qv['order'] = isset( $qv['order'] ) ? strtoupper( $qv['order'] ) : ''; if ( 'ASC' == $qv['order'] ) $order = 'ASC'; else @@ -441,14 +457,17 @@ class WP_User_Query { $this->query_orderby = "ORDER BY $orderby $order"; // limit - if ( $qv['number'] ) { + if ( isset( $qv['number'] ) && $qv['number'] ) { if ( $qv['offset'] ) $this->query_limit = $wpdb->prepare("LIMIT %d, %d", $qv['offset'], $qv['number']); else $this->query_limit = $wpdb->prepare("LIMIT %d", $qv['number']); } - $search = trim( $qv['search'] ); + $search = ''; + if ( isset( $qv['search'] ) ) + $search = trim( $qv['search'] ); + if ( $search ) { $leading_wild = ( ltrim($search, '*') != $search ); $trailing_wild = ( rtrim($search, '*') != $search ); @@ -482,16 +501,20 @@ class WP_User_Query { $this->query_where .= $this->get_search_sql( $search, $search_columns, $wild ); } - $blog_id = absint( $qv['blog_id'] ); + $blog_id = 0; + if ( isset( $qv['blog_id'] ) ) + $blog_id = absint( $qv['blog_id'] ); - if ( 'authors' == $qv['who'] && $blog_id ) { + if ( isset( $qv['who'] ) && 'authors' == $qv['who'] && $blog_id ) { $qv['meta_key'] = $wpdb->get_blog_prefix( $blog_id ) . 'user_level'; $qv['meta_value'] = 0; $qv['meta_compare'] = '!='; $qv['blog_id'] = $blog_id = 0; // Prevent extra meta query } - $role = trim( $qv['role'] ); + $role = ''; + if ( isset( $qv['role'] ) ) + $role = trim( $qv['role'] ); if ( $blog_id && ( $role || is_multisite() ) ) { $cap_meta_query = array(); @@ -517,10 +540,10 @@ class WP_User_Query { $this->query_fields = 'DISTINCT ' . $this->query_fields; } - if ( !empty( $qv['include'] ) ) { + if ( ! empty( $qv['include'] ) ) { $ids = implode( ',', wp_parse_id_list( $qv['include'] ) ); $this->query_where .= " AND $wpdb->users.ID IN ($ids)"; - } elseif ( !empty($qv['exclude']) ) { + } elseif ( ! empty( $qv['exclude'] ) ) { $ids = implode( ',', wp_parse_id_list( $qv['exclude'] ) ); $this->query_where .= " AND $wpdb->users.ID NOT IN ($ids)"; } @@ -545,7 +568,7 @@ class WP_User_Query { $this->results = $wpdb->get_col("SELECT $this->query_fields $this->query_from $this->query_where $this->query_orderby $this->query_limit"); } - if ( $qv['count_total'] ) + if ( isset( $qv['count_total'] ) && $qv['count_total'] ) $this->total_users = $wpdb->get_var( apply_filters( 'found_users_query', 'SELECT FOUND_ROWS()' ) ); if ( !$this->results ) @@ -1519,28 +1542,172 @@ function wp_create_user($username, $password, $email = '') { */ function _get_additional_user_keys( $user ) { $keys = array( 'first_name', 'last_name', 'nickname', 'description', 'rich_editing', 'comment_shortcuts', 'admin_color', 'use_ssl', 'show_admin_bar_front' ); - return array_merge( $keys, array_keys( _wp_get_user_contactmethods( $user ) ) ); + return array_merge( $keys, array_keys( wp_get_user_contact_methods( $user ) ) ); } /** - * Set up the contact methods. + * Set up the user contact methods. * * Default contact methods were removed in 3.6. A filter dictates contact methods. * - * @since 2.9.0 - * @access private + * @since 3.7.0 * - * @param object $user User data object (optional). - * @return array $user_contactmethods Array of contact methods and their labels. + * @param WP_User $user Optional. WP_User object. + * @return array Array of contact methods and their labels. */ -function _wp_get_user_contactmethods( $user = null ) { - $user_contactmethods = array(); +function wp_get_user_contact_methods( $user = null ) { + $methods = array(); if ( get_site_option( 'initial_db_version' ) < 23588 ) { - $user_contactmethods = array( + $methods = array( 'aim' => __( 'AIM' ), 'yim' => __( 'Yahoo IM' ), 'jabber' => __( 'Jabber / Google Talk' ) ); } - return apply_filters( 'user_contactmethods', $user_contactmethods, $user ); + + /** + * Filter the user contact methods. + * + * @since 2.9.0 + * + * @param array $methods Array of contact methods and their labels. + * @param WP_User $user Optional. WP_User object. + */ + return apply_filters( 'user_contactmethods', $methods, $user ); +} + +/** + * The old private function for setting up user contact methods. + * + * @since 2.9.0 + * @access private + */ +function _wp_get_user_contactmethods( $user = null ) { + return wp_get_user_contact_methods( $user ); +} + +/** + * Retrieves a user row based on password reset key and login + * + * A key is considered 'expired' if it exactly matches the value of the + * user_activation_key field, rather than being matched after going through the + * hashing process. This field is now hashed; old values are no longer accepted + * but have a different WP_Error code so good user feedback can be provided. + * + * @uses $wpdb WordPress Database object + * + * @param string $key Hash to validate sending user's password. + * @param string $login The user login. + * @return WP_User|WP_Error WP_User object on success, WP_Error object for invalid or expired keys. + */ +function check_password_reset_key($key, $login) { + global $wpdb, $wp_hasher; + + $key = preg_replace('/[^a-z0-9]/i', '', $key); + + if ( empty( $key ) || !is_string( $key ) ) + return new WP_Error('invalid_key', __('Invalid key')); + + if ( empty($login) || !is_string($login) ) + return new WP_Error('invalid_key', __('Invalid key')); + + $row = $wpdb->get_row( $wpdb->prepare( "SELECT ID, user_activation_key FROM $wpdb->users WHERE user_login = %s", $login ) ); + if ( ! $row ) + return new WP_Error('invalid_key', __('Invalid key')); + + if ( empty( $wp_hasher ) ) { + require_once ABSPATH . 'wp-includes/class-phpass.php'; + $wp_hasher = new PasswordHash( 8, true ); + } + + if ( $wp_hasher->CheckPassword( $key, $row->user_activation_key ) ) + return get_userdata( $row->ID ); + + if ( $key === $row->user_activation_key ) { + $return = new WP_Error( 'expired_key', __( 'Invalid key' ) ); + $user_id = $row->ID; + + /** + * Filter the return value of check_password_reset_key() when an + * old-style key is used (plain-text key was stored in the database). + * + * @since 3.7.0 + * + * @param WP_Error $return A WP_Error object denoting an expired key. + * Return a WP_User object to validate the key. + * @param int $user_id The matched user ID. + */ + return apply_filters( 'password_reset_key_expired', $return, $user_id ); + } + + return new WP_Error( 'invalid_key', __( 'Invalid key' ) ); +} + +/** + * Handles resetting the user's password. + * + * @param object $user The user + * @param string $new_pass New password for the user in plaintext + */ +function reset_password( $user, $new_pass ) { + do_action( 'password_reset', $user, $new_pass ); + + wp_set_password( $new_pass, $user->ID ); + update_user_option( $user->ID, 'default_password_nag', false, true ); + + wp_password_change_notification( $user ); +} + +/** + * Handles registering a new user. + * + * @param string $user_login User's username for logging in + * @param string $user_email User's email address to send password and add + * @return int|WP_Error Either user's ID or error on failure. + */ +function register_new_user( $user_login, $user_email ) { + $errors = new WP_Error(); + + $sanitized_user_login = sanitize_user( $user_login ); + $user_email = apply_filters( 'user_registration_email', $user_email ); + + // Check the username + if ( $sanitized_user_login == '' ) { + $errors->add( 'empty_username', __( 'ERROR: Please enter a username.' ) ); + } elseif ( ! validate_username( $user_login ) ) { + $errors->add( 'invalid_username', __( 'ERROR: This username is invalid because it uses illegal characters. Please enter a valid username.' ) ); + $sanitized_user_login = ''; + } elseif ( username_exists( $sanitized_user_login ) ) { + $errors->add( 'username_exists', __( 'ERROR: This username is already registered. Please choose another one.' ) ); + } + + // Check the e-mail address + if ( $user_email == '' ) { + $errors->add( 'empty_email', __( 'ERROR: Please type your e-mail address.' ) ); + } elseif ( ! is_email( $user_email ) ) { + $errors->add( 'invalid_email', __( 'ERROR: The email address isn’t correct.' ) ); + $user_email = ''; + } elseif ( email_exists( $user_email ) ) { + $errors->add( 'email_exists', __( 'ERROR: This email is already registered, please choose another one.' ) ); + } + + do_action( 'register_post', $sanitized_user_login, $user_email, $errors ); + + $errors = apply_filters( 'registration_errors', $errors, $sanitized_user_login, $user_email ); + + if ( $errors->get_error_code() ) + return $errors; + + $user_pass = wp_generate_password( 12, false ); + $user_id = wp_create_user( $sanitized_user_login, $user_pass, $user_email ); + if ( ! $user_id || is_wp_error( $user_id ) ) { + $errors->add( 'registerfail', sprintf( __( 'ERROR: Couldn’t register you… please contact the webmaster !' ), get_option( 'admin_email' ) ) ); + return $errors; + } + + update_user_option( $user_id, 'default_password_nag', true, true ); //Set up the Password change nag. + + wp_new_user_notification( $user_id, $user_pass ); + + return $user_id; }