WordPress.org

Make WordPress Core

Ticket #15384: 15384.patch

File 15384.patch, 79.7 KB (added by jfarthing84, 4 years ago)
  • wp-login.php

     
    1111/** Make sure that the WordPress bootstrap has run before continuing. */
    1212require( dirname(__FILE__) . '/wp-load.php' );
    1313
    14 // Redirect to https login if forced to use SSL
    15 if ( force_ssl_admin() && ! is_ssl() ) {
    16         if ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) {
    17                 wp_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ) );
    18                 exit();
    19         } else {
    20                 wp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
    21                 exit();
    22         }
    23 }
     14// Require WP_Login class
     15require( ABSPATH . WPINC . '/class-wp-login.php' );
    2416
     17// Instantiate a new WP_Login object
     18$wp_login = new WP_Login();
     19
     20// Process the request
     21$wp_login->process();
     22
     23// Enqueue wpLogin script
     24wp_enqueue_script( 'wp-login' );
     25
    2526/**
    26  * Output the login page header.
     27 * Add the mobile viewport meta tag.
    2728 *
    28  * @param string   $title    Optional. WordPress login Page title to display in the `<title>` element.
    29  *                           Default 'Log In'.
    30  * @param string   $message  Optional. Message to display in header. Default empty.
    31  * @param WP_Error $wp_error Optional. The error to pass. Default empty.
     29 * This should be placed somewhere else, just not sure where.
     30 *
     31 * @since 3.7.0
    3232 */
    33 function login_header( $title = 'Log In', $message = '', $wp_error = '' ) {
    34         global $error, $interim_login, $action;
     33function wp_login_viewport_meta() {
     34        if ( wp_is_mobile() ) {
     35        ?>
     36        <meta name="viewport" content="width=device-width" />
     37        <?php
     38        }
     39}
    3540
    36         // Don't index any of these forms
    37         add_action( 'login_head', 'wp_no_robots' );
     41?><!DOCTYPE html>
     42<!--[if IE 8]>
     43        <html xmlns="http://www.w3.org/1999/xhtml" class="ie8" <?php language_attributes(); ?>>
     44<![endif]-->
     45<!--[if !(IE 8) ]><!-->
     46        <html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
     47<!--<![endif]-->
     48<head>
     49        <meta http-equiv="Content-Type" content="<?php bloginfo( 'html_type' ); ?>; charset=<?php bloginfo( 'charset' ); ?>" />
    3850
    39         if ( wp_is_mobile() )
    40                 add_action( 'login_head', 'wp_login_viewport_meta' );
     51        <title><?php bloginfo( 'name' ); ?> &rsaquo; <?php echo $wp_login->title(); ?></title>
    4152
    42         if ( empty($wp_error) )
    43                 $wp_error = new WP_Error();
    44 
    45         // Shake it!
    46         $shake_error_codes = array( 'empty_password', 'empty_email', 'invalid_email', 'invalidcombo', 'empty_username', 'invalid_username', 'incorrect_password' );
    47         /**
    48          * Filter the error codes array for shaking the login form.
    49          *
    50          * @since 3.0.0
    51          *
    52          * @param array $shake_error_codes Error codes that shake the login form.
    53          */
    54         $shake_error_codes = apply_filters( 'shake_error_codes', $shake_error_codes );
    55 
    56         if ( $shake_error_codes && $wp_error->get_error_code() && in_array( $wp_error->get_error_code(), $shake_error_codes ) )
    57                 add_action( 'login_head', 'wp_shake_js', 12 );
    58 
    59         ?><!DOCTYPE html>
    60         <!--[if IE 8]>
    61                 <html xmlns="http://www.w3.org/1999/xhtml" class="ie8" <?php language_attributes(); ?>>
    62         <![endif]-->
    63         <!--[if !(IE 8) ]><!-->
    64                 <html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
    65         <!--<![endif]-->
    66         <head>
    67         <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php bloginfo('charset'); ?>" />
    68         <title><?php bloginfo('name'); ?> &rsaquo; <?php echo $title; ?></title>
    6953        <?php
    7054
     55        // Output admin styles
    7156        wp_admin_css( 'login', true );
    7257
    73         /*
    74          * Remove all stored post data on logging out.
    75          * This could be added by add_action('login_head'...) like wp_shake_js(),
    76          * but maybe better if it's not removable by plugins
    77          */
    78         if ( 'loggedout' == $wp_error->get_error_code() ) {
    79                 ?>
    80                 <script>if("sessionStorage" in window){try{for(var key in sessionStorage){if(key.indexOf("wp-autosave-")!=-1){sessionStorage.removeItem(key)}}}catch(e){}};</script>
    81                 <?php
    82         }
    83 
    8458        /**
    8559         * Enqueue scripts and styles for the login page.
    8660         *
     
    8761         * @since 3.1.0
    8862         */
    8963        do_action( 'login_enqueue_scripts' );
     64
    9065        /**
    9166         * Fires in the login page header after scripts are enqueued.
    9267         *
     
    9469         */
    9570        do_action( 'login_head' );
    9671
    97         if ( is_multisite() ) {
    98                 $login_header_url   = network_home_url();
    99                 $login_header_title = get_current_site()->site_name;
    100         } else {
    101                 $login_header_url   = __( 'https://wordpress.org/' );
    102                 $login_header_title = __( 'Powered by WordPress' );
    103         }
    104 
    105         /**
    106          * Filter link URL of the header logo above login form.
    107          *
    108          * @since 2.1.0
    109          *
    110          * @param string $login_header_url Login header logo URL.
    111          */
    112         $login_header_url = apply_filters( 'login_headerurl', $login_header_url );
    113         /**
    114          * Filter the title attribute of the header logo above login form.
    115          *
    116          * @since 2.1.0
    117          *
    118          * @param string $login_header_title Login header logo title attribute.
    119          */
    120         $login_header_title = apply_filters( 'login_headertitle', $login_header_title );
    121 
    122         $classes = array( 'login-action-' . $action, 'wp-core-ui' );
    123         if ( wp_is_mobile() )
    124                 $classes[] = 'mobile';
    125         if ( is_rtl() )
    126                 $classes[] = 'rtl';
    127         if ( $interim_login ) {
    128                 $classes[] = 'interim-login';
     72        // Make background transparent for interim login
     73        if ( $wp_login->is_interim_login() ) {
    12974                ?>
    13075                <style type="text/css">html{background-color: transparent;}</style>
    13176                <?php
    132 
    133                 if ( 'success' ===  $interim_login )
    134                         $classes[] = 'interim-login-success';
    13577        }
    136         $classes[] =' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );
    13778
    138         /**
    139          * Filter the login page body classes.
    140          *
    141          * @since 3.5.0
    142          *
    143          * @param array  $classes An array of body classes.
    144          * @param string $action  The action that brought the visitor to the login page.
    145          */
    146         $classes = apply_filters( 'login_body_class', $classes, $action );
    147 
    14879        ?>
    149         </head>
    150         <body class="login <?php echo esc_attr( implode( ' ', $classes ) ); ?>">
     80</head>
     81<body class="<?php $wp_login->body_class(); ?>">
    15182        <div id="login">
    152                 <h1><a href="<?php echo esc_url( $login_header_url ); ?>" title="<?php echo esc_attr( $login_header_title ); ?>" tabindex="-1"><?php bloginfo( 'name' ); ?></a></h1>
    153         <?php
    154 
    155         unset( $login_header_url, $login_header_title );
    156 
    157         /**
    158          * Filter the message to display above the login form.
    159          *
    160          * @since 2.1.0
    161          *
    162          * @param string $message Login message text.
    163          */
    164         $message = apply_filters( 'login_message', $message );
    165         if ( !empty( $message ) )
    166                 echo $message . "\n";
    167 
    168         // In case a plugin uses $error rather than the $wp_errors object
    169         if ( !empty( $error ) ) {
    170                 $wp_error->add('error', $error);
    171                 unset($error);
    172         }
    173 
    174         if ( $wp_error->get_error_code() ) {
    175                 $errors = '';
    176                 $messages = '';
    177                 foreach ( $wp_error->get_error_codes() as $code ) {
    178                         $severity = $wp_error->get_error_data( $code );
    179                         foreach ( $wp_error->get_error_messages( $code ) as $error_message ) {
    180                                 if ( 'message' == $severity )
    181                                         $messages .= '  ' . $error_message . "<br />\n";
    182                                 else
    183                                         $errors .= '    ' . $error_message . "<br />\n";
    184                         }
    185                 }
    186                 if ( ! empty( $errors ) ) {
    187                         /**
    188                          * Filter the error messages displayed above the login form.
    189                          *
    190                          * @since 2.1.0
    191                          *
    192                          * @param string $errors Login error message.
    193                          */
    194                         echo '<div id="login_error">' . apply_filters( 'login_errors', $errors ) . "</div>\n";
    195                 }
    196                 if ( ! empty( $messages ) ) {
    197                         /**
    198                          * Filter instructional messages displayed above the login form.
    199                          *
    200                          * @since 2.5.0
    201                          *
    202                          * @param string $messages Login messages.
    203                          */
    204                         echo '<p class="message">' . apply_filters( 'login_messages', $messages ) . "</p>\n";
    205                 }
    206         }
    207 } // End of login_header()
    208 
    209 /**
    210  * Outputs the footer for the login page.
    211  *
    212  * @param string $input_id Which input to auto-focus
    213  */
    214 function login_footer($input_id = '') {
    215         global $interim_login;
    216 
    217         // Don't allow interim logins to navigate away from the page.
    218         if ( ! $interim_login ): ?>
    219         <p id="backtoblog"><a href="<?php echo esc_url( home_url( '/' ) ); ?>" title="<?php esc_attr_e( 'Are you lost?' ); ?>"><?php printf( __( '&larr; Back to %s' ), get_bloginfo( 'title', 'display' ) ); ?></a></p>
    220         <?php endif; ?>
    221 
     83                <?php $wp_login->render(); ?>
    22284        </div>
    22385
    224         <?php if ( !empty($input_id) ) : ?>
    225         <script type="text/javascript">
    226         try{document.getElementById('<?php echo $input_id; ?>').focus();}catch(e){}
    227         if(typeof wpOnload=='function')wpOnload();
    228         </script>
    229         <?php endif; ?>
    230 
    23186        <?php
    23287        /**
    23388         * Fires in the login page footer.
     
    23590         * @since 3.1.0
    23691         */
    23792        do_action( 'login_footer' ); ?>
     93
    23894        <div class="clear"></div>
    239         </body>
    240         </html>
    241         <?php
    242 }
    243 
    244 /**
    245  * @since 3.0.0
    246  */
    247 function wp_shake_js() {
    248         if ( wp_is_mobile() )
    249                 return;
    250 ?>
    251 <script type="text/javascript">
    252 addLoadEvent = function(func){if(typeof jQuery!="undefined")jQuery(document).ready(func);else if(typeof wpOnload!='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};
    253 function s(id,pos){g(id).left=pos+'px';}
    254 function g(id){return document.getElementById(id).style;}
    255 function shake(id,a,d){c=a.shift();s(id,c);if(a.length>0){setTimeout(function(){shake(id,a,d);},d);}else{try{g(id).position='static';wp_attempt_focus();}catch(e){}}}
    256 addLoadEvent(function(){ var p=new Array(15,30,15,0,-15,-30,-15,0);p=p.concat(p.concat(p));var i=document.forms[0].id;g(i).position='relative';shake(i,p,20);});
    257 </script>
    258 <?php
    259 }
    260 
    261 /**
    262  * @since 3.7.0
    263  */
    264 function wp_login_viewport_meta() {
    265         ?>
    266         <meta name="viewport" content="width=device-width" />
    267         <?php
    268 }
    269 
    270 /**
    271  * Handles sending password retrieval email to user.
    272  *
    273  * @global wpdb         $wpdb      WordPress database abstraction object.
    274  * @global PasswordHash $wp_hasher Portable PHP password hashing framework.
    275  *
    276  * @return bool|WP_Error True: when finish. WP_Error on error
    277  */
    278 function retrieve_password() {
    279         global $wpdb, $wp_hasher;
    280 
    281         $errors = new WP_Error();
    282 
    283         if ( empty( $_POST['user_login'] ) ) {
    284                 $errors->add('empty_username', __('<strong>ERROR</strong>: Enter a username or email address.'));
    285         } elseif ( strpos( $_POST['user_login'], '@' ) ) {
    286                 $user_data = get_user_by( 'email', trim( $_POST['user_login'] ) );
    287                 if ( empty( $user_data ) )
    288                         $errors->add('invalid_email', __('<strong>ERROR</strong>: There is no user registered with that email address.'));
    289         } else {
    290                 $login = trim($_POST['user_login']);
    291                 $user_data = get_user_by('login', $login);
    292         }
    293 
    294         /**
    295          * Fires before errors are returned from a password reset request.
    296          *
    297          * @since 2.1.0
    298          */
    299         do_action( 'lostpassword_post' );
    300 
    301         if ( $errors->get_error_code() )
    302                 return $errors;
    303 
    304         if ( !$user_data ) {
    305                 $errors->add('invalidcombo', __('<strong>ERROR</strong>: Invalid username or email.'));
    306                 return $errors;
    307         }
    308 
    309         // Redefining user_login ensures we return the right case in the email.
    310         $user_login = $user_data->user_login;
    311         $user_email = $user_data->user_email;
    312 
    313         /**
    314          * Fires before a new password is retrieved.
    315          *
    316          * @since 1.5.0
    317          * @deprecated 1.5.1 Misspelled. Use 'retrieve_password' hook instead.
    318          *
    319          * @param string $user_login The user login name.
    320          */
    321         do_action( 'retreive_password', $user_login );
    322 
    323         /**
    324          * Fires before a new password is retrieved.
    325          *
    326          * @since 1.5.1
    327          *
    328          * @param string $user_login The user login name.
    329          */
    330         do_action( 'retrieve_password', $user_login );
    331 
    332         /**
    333          * Filter whether to allow a password to be reset.
    334          *
    335          * @since 2.7.0
    336          *
    337          * @param bool true           Whether to allow the password to be reset. Default true.
    338          * @param int  $user_data->ID The ID of the user attempting to reset a password.
    339          */
    340         $allow = apply_filters( 'allow_password_reset', true, $user_data->ID );
    341 
    342         if ( ! $allow ) {
    343                 return new WP_Error( 'no_password_reset', __('Password reset is not allowed for this user') );
    344         } elseif ( is_wp_error( $allow ) ) {
    345                 return $allow;
    346         }
    347 
    348         // Generate something random for a password reset key.
    349         $key = wp_generate_password( 20, false );
    350 
    351         /**
    352          * Fires when a password reset key is generated.
    353          *
    354          * @since 2.5.0
    355          *
    356          * @param string $user_login The username for the user.
    357          * @param string $key        The generated password reset key.
    358          */
    359         do_action( 'retrieve_password_key', $user_login, $key );
    360 
    361         // Now insert the key, hashed, into the DB.
    362         if ( empty( $wp_hasher ) ) {
    363                 require_once ABSPATH . WPINC . '/class-phpass.php';
    364                 $wp_hasher = new PasswordHash( 8, true );
    365         }
    366         $hashed = time() . ':' . $wp_hasher->HashPassword( $key );
    367         $wpdb->update( $wpdb->users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user_login ) );
    368 
    369         $message = __('Someone requested that the password be reset for the following account:') . "\r\n\r\n";
    370         $message .= network_home_url( '/' ) . "\r\n\r\n";
    371         $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
    372         $message .= __('If this was a mistake, just ignore this email and nothing will happen.') . "\r\n\r\n";
    373         $message .= __('To reset your password, visit the following address:') . "\r\n\r\n";
    374         $message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . ">\r\n";
    375 
    376         if ( is_multisite() )
    377                 $blogname = $GLOBALS['current_site']->site_name;
    378         else
    379                 /*
    380                  * The blogname option is escaped with esc_html on the way into the database
    381                  * in sanitize_option we want to reverse this for the plain text arena of emails.
    382                  */
    383                 $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    384 
    385         $title = sprintf( __('[%s] Password Reset'), $blogname );
    386 
    387         /**
    388          * Filter the subject of the password reset email.
    389          *
    390          * @since 2.8.0
    391          *
    392          * @param string $title Default email title.
    393          */
    394         $title = apply_filters( 'retrieve_password_title', $title );
    395 
    396         /**
    397          * Filter the message body of the password reset mail.
    398          *
    399          * @since 2.8.0
    400          * @since 4.1.0 Added `$user_login` and `$user_data` parameters.
    401          *
    402          * @param string  $message    Default mail message.
    403          * @param string  $key        The activation key.
    404          * @param string  $user_login The username for the user.
    405          * @param WP_User $user_data  WP_User object.
    406          */
    407         $message = apply_filters( 'retrieve_password_message', $message, $key, $user_login, $user_data );
    408 
    409         if ( $message && !wp_mail( $user_email, wp_specialchars_decode( $title ), $message ) )
    410                 wp_die( __('The email could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function.') );
    411 
    412         return true;
    413 }
    414 
    415 //
    416 // Main
    417 //
    418 
    419 $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'login';
    420 $errors = new WP_Error();
    421 
    422 if ( isset($_GET['key']) )
    423         $action = 'resetpass';
    424 
    425 // validate action so as to default to the login screen
    426 if ( !in_array( $action, array( 'postpass', 'logout', 'lostpassword', 'retrievepassword', 'resetpass', 'rp', 'register', 'login' ), true ) && false === has_filter( 'login_form_' . $action ) )
    427         $action = 'login';
    428 
    429 nocache_headers();
    430 
    431 header('Content-Type: '.get_bloginfo('html_type').'; charset='.get_bloginfo('charset'));
    432 
    433 if ( defined( 'RELOCATE' ) && RELOCATE ) { // Move flag is set
    434         if ( isset( $_SERVER['PATH_INFO'] ) && ($_SERVER['PATH_INFO'] != $_SERVER['PHP_SELF']) )
    435                 $_SERVER['PHP_SELF'] = str_replace( $_SERVER['PATH_INFO'], '', $_SERVER['PHP_SELF'] );
    436 
    437         $url = dirname( set_url_scheme( 'http://' .  $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] ) );
    438         if ( $url != get_option( 'siteurl' ) )
    439                 update_option( 'siteurl', $url );
    440 }
    441 
    442 //Set a cookie now to see if they are supported by the browser.
    443 $secure = ( 'https' === parse_url( site_url(), PHP_URL_SCHEME ) && 'https' === parse_url( home_url(), PHP_URL_SCHEME ) );
    444 setcookie( TEST_COOKIE, 'WP Cookie check', 0, COOKIEPATH, COOKIE_DOMAIN, $secure );
    445 if ( SITECOOKIEPATH != COOKIEPATH )
    446         setcookie( TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN, $secure );
    447 
    448 /**
    449  * Fires when the login form is initialized.
    450  *
    451  * @since 3.2.0
    452  */
    453 do_action( 'login_init' );
    454 /**
    455  * Fires before a specified login form action.
    456  *
    457  * The dynamic portion of the hook name, `$action`, refers to the action
    458  * that brought the visitor to the login form. Actions include 'postpass',
    459  * 'logout', 'lostpassword', etc.
    460  *
    461  * @since 2.8.0
    462  */
    463 do_action( 'login_form_' . $action );
    464 
    465 $http_post = ('POST' == $_SERVER['REQUEST_METHOD']);
    466 $interim_login = isset($_REQUEST['interim-login']);
    467 
    468 switch ($action) {
    469 
    470 case 'postpass' :
    471         require_once ABSPATH . WPINC . '/class-phpass.php';
    472         $hasher = new PasswordHash( 8, true );
    473 
    474         /**
    475          * Filter the life span of the post password cookie.
    476          *
    477          * By default, the cookie expires 10 days from creation. To turn this
    478          * into a session cookie, return 0.
    479          *
    480          * @since 3.7.0
    481          *
    482          * @param int $expires The expiry time, as passed to setcookie().
    483          */
    484         $expire = apply_filters( 'post_password_expires', time() + 10 * DAY_IN_SECONDS );
    485         $secure = ( 'https' === parse_url( home_url(), PHP_URL_SCHEME ) );
    486         setcookie( 'wp-postpass_' . COOKIEHASH, $hasher->HashPassword( wp_unslash( $_POST['post_password'] ) ), $expire, COOKIEPATH, COOKIE_DOMAIN, $secure );
    487 
    488         wp_safe_redirect( wp_get_referer() );
    489         exit();
    490 
    491 case 'logout' :
    492         check_admin_referer('log-out');
    493 
    494         $user = wp_get_current_user();
    495 
    496         wp_logout();
    497 
    498         if ( ! empty( $_REQUEST['redirect_to'] ) ) {
    499                 $redirect_to = $requested_redirect_to = $_REQUEST['redirect_to'];
    500         } else {
    501                 $redirect_to = 'wp-login.php?loggedout=true';
    502                 $requested_redirect_to = '';
    503         }
    504 
    505         /**
    506          * Filter the log out redirect URL.
    507          *
    508          * @since 4.2.0
    509          *
    510          * @param string  $redirect_to           The redirect destination URL.
    511          * @param string  $requested_redirect_to The requested redirect destination URL passed as a parameter.
    512          * @param WP_User $user                  The WP_User object for the user that's logging out.
    513          */
    514         $redirect_to = apply_filters( 'logout_redirect', $redirect_to, $requested_redirect_to, $user );
    515         wp_safe_redirect( $redirect_to );
    516         exit();
    517 
    518 case 'lostpassword' :
    519 case 'retrievepassword' :
    520 
    521         if ( $http_post ) {
    522                 $errors = retrieve_password();
    523                 if ( !is_wp_error($errors) ) {
    524                         $redirect_to = !empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : 'wp-login.php?checkemail=confirm';
    525                         wp_safe_redirect( $redirect_to );
    526                         exit();
    527                 }
    528         }
    529 
    530         if ( isset( $_GET['error'] ) ) {
    531                 if ( 'invalidkey' == $_GET['error'] ) {
    532                         $errors->add( 'invalidkey', __( 'Your password reset link appears to be invalid. Please request a new link below.' ) );
    533                 } elseif ( 'expiredkey' == $_GET['error'] ) {
    534                         $errors->add( 'expiredkey', __( 'Your password reset link has expired. Please request a new link below.' ) );
    535                 }
    536         }
    537 
    538         $lostpassword_redirect = ! empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
    539         /**
    540          * Filter the URL redirected to after submitting the lostpassword/retrievepassword form.
    541          *
    542          * @since 3.0.0
    543          *
    544          * @param string $lostpassword_redirect The redirect destination URL.
    545          */
    546         $redirect_to = apply_filters( 'lostpassword_redirect', $lostpassword_redirect );
    547 
    548         /**
    549          * Fires before the lost password form.
    550          *
    551          * @since 1.5.1
    552          */
    553         do_action( 'lost_password' );
    554 
    555         login_header(__('Lost Password'), '<p class="message">' . __('Please enter your username or email address. You will receive a link to create a new password via email.') . '</p>', $errors);
    556 
    557         $user_login = isset($_POST['user_login']) ? wp_unslash($_POST['user_login']) : '';
    558 
    559 ?>
    560 
    561 <form name="lostpasswordform" id="lostpasswordform" action="<?php echo esc_url( network_site_url( 'wp-login.php?action=lostpassword', 'login_post' ) ); ?>" method="post">
    562         <p>
    563                 <label for="user_login" ><?php _e('Username or Email:') ?><br />
    564                 <input type="text" name="user_login" id="user_login" class="input" value="<?php echo esc_attr($user_login); ?>" size="20" /></label>
    565         </p>
    566         <?php
    567         /**
    568          * Fires inside the lostpassword form tags, before the hidden fields.
    569          *
    570          * @since 2.1.0
    571          */
    572         do_action( 'lostpassword_form' ); ?>
    573         <input type="hidden" name="redirect_to" value="<?php echo esc_attr( $redirect_to ); ?>" />
    574         <p class="submit"><input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e('Get New Password'); ?>" /></p>
    575 </form>
    576 
    577 <p id="nav">
    578 <a href="<?php echo esc_url( wp_login_url() ); ?>"><?php _e('Log in') ?></a>
    579 <?php
    580 if ( get_option( 'users_can_register' ) ) :
    581         $registration_url = sprintf( '<a href="%s">%s</a>', esc_url( wp_registration_url() ), __( 'Register' ) );
    582 
    583         /** This filter is documented in wp-includes/general-template.php */
    584         echo ' | ' . apply_filters( 'register', $registration_url );
    585 endif;
    586 ?>
    587 </p>
    588 
    589 <?php
    590 login_footer('user_login');
    591 break;
    592 
    593 case 'resetpass' :
    594 case 'rp' :
    595         list( $rp_path ) = explode( '?', wp_unslash( $_SERVER['REQUEST_URI'] ) );
    596         $rp_cookie = 'wp-resetpass-' . COOKIEHASH;
    597         if ( isset( $_GET['key'] ) ) {
    598                 $value = sprintf( '%s:%s', wp_unslash( $_GET['login'] ), wp_unslash( $_GET['key'] ) );
    599                 setcookie( $rp_cookie, $value, 0, $rp_path, COOKIE_DOMAIN, is_ssl(), true );
    600                 wp_safe_redirect( remove_query_arg( array( 'key', 'login' ) ) );
    601                 exit;
    602         }
    603 
    604         if ( isset( $_COOKIE[ $rp_cookie ] ) && 0 < strpos( $_COOKIE[ $rp_cookie ], ':' ) ) {
    605                 list( $rp_login, $rp_key ) = explode( ':', wp_unslash( $_COOKIE[ $rp_cookie ] ), 2 );
    606                 $user = check_password_reset_key( $rp_key, $rp_login );
    607                 if ( isset( $_POST['pass1'] ) && ! hash_equals( $rp_key, $_POST['rp_key'] ) ) {
    608                         $user = false;
    609                 }
    610         } else {
    611                 $user = false;
    612         }
    613 
    614         if ( ! $user || is_wp_error( $user ) ) {
    615                 setcookie( $rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true );
    616                 if ( $user && $user->get_error_code() === 'expired_key' )
    617                         wp_redirect( site_url( 'wp-login.php?action=lostpassword&error=expiredkey' ) );
    618                 else
    619                         wp_redirect( site_url( 'wp-login.php?action=lostpassword&error=invalidkey' ) );
    620                 exit;
    621         }
    622 
    623         $errors = new WP_Error();
    624 
    625         if ( isset($_POST['pass1']) && $_POST['pass1'] != $_POST['pass2'] )
    626                 $errors->add( 'password_reset_mismatch', __( 'The passwords do not match.' ) );
    627 
    628         /**
    629          * Fires before the password reset procedure is validated.
    630          *
    631          * @since 3.5.0
    632          *
    633          * @param object           $errors WP Error object.
    634          * @param WP_User|WP_Error $user   WP_User object if the login and reset key match. WP_Error object otherwise.
    635          */
    636         do_action( 'validate_password_reset', $errors, $user );
    637 
    638         if ( ( ! $errors->get_error_code() ) && isset( $_POST['pass1'] ) && !empty( $_POST['pass1'] ) ) {
    639                 reset_password($user, $_POST['pass1']);
    640                 setcookie( $rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true );
    641                 login_header( __( 'Password Reset' ), '<p class="message reset-pass">' . __( 'Your password has been reset.' ) . ' <a href="' . esc_url( wp_login_url() ) . '">' . __( 'Log in' ) . '</a></p>' );
    642                 login_footer();
    643                 exit;
    644         }
    645 
    646         wp_enqueue_script('utils');
    647         wp_enqueue_script('user-profile');
    648 
    649         login_header(__('Reset Password'), '<p class="message reset-pass">' . __('Enter your new password below.') . '</p>', $errors );
    650 
    651 ?>
    652 <form name="resetpassform" id="resetpassform" action="<?php echo esc_url( network_site_url( 'wp-login.php?action=resetpass', 'login_post' ) ); ?>" method="post" autocomplete="off">
    653         <input type="hidden" id="user_login" value="<?php echo esc_attr( $rp_login ); ?>" autocomplete="off" />
    654 
    655         <div class="user-pass1-wrap">
    656                 <p>
    657                         <label for="pass1"><?php _e( 'New password' ) ?></label>
    658                 </p>
    659 
    660                 <div class="wp-pwd">
    661                         <span class="password-input-wrapper">
    662                                 <input type="password" data-reveal="1" data-pw="<?php echo esc_attr( wp_generate_password( 16 ) ); ?>" name="pass1" id="pass1" class="input" size="20" value="" autocomplete="off" aria-describedby="pass-strength-result" />
    663                         </span>
    664                         <div id="pass-strength-result" class="hide-if-no-js" aria-live="polite"><?php _e( 'Strength indicator' ); ?></div>
    665                 </div>
    666         </div>
    667 
    668         <p class="user-pass2-wrap">
    669                 <label for="pass2"><?php _e( 'Confirm new password' ) ?></label><br />
    670                 <input type="password" name="pass2" id="pass2" class="input" size="20" value="" autocomplete="off" />
    671         </p>
    672 
    673         <p class="description indicator-hint"><?php echo wp_get_password_hint(); ?></p>
    674         <br class="clear" />
    675 
    676         <?php
    677         /**
    678          * Fires following the 'Strength indicator' meter in the user password reset form.
    679          *
    680          * @since 3.9.0
    681          *
    682          * @param WP_User $user User object of the user whose password is being reset.
    683          */
    684         do_action( 'resetpass_form', $user );
    685         ?>
    686         <input type="hidden" name="rp_key" value="<?php echo esc_attr( $rp_key ); ?>" />
    687         <p class="submit"><input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e('Reset Password'); ?>" /></p>
    688 </form>
    689 
    690 <p id="nav">
    691 <a href="<?php echo esc_url( wp_login_url() ); ?>"><?php _e( 'Log in' ); ?></a>
    692 <?php
    693 if ( get_option( 'users_can_register' ) ) :
    694         $registration_url = sprintf( '<a href="%s">%s</a>', esc_url( wp_registration_url() ), __( 'Register' ) );
    695 
    696         /** This filter is documented in wp-includes/general-template.php */
    697         echo ' | ' . apply_filters( 'register', $registration_url );
    698 endif;
    699 ?>
    700 </p>
    701 
    702 <?php
    703 login_footer('user_pass');
    704 break;
    705 
    706 case 'register' :
    707         if ( is_multisite() ) {
    708                 /**
    709                  * Filter the Multisite sign up URL.
    710                  *
    711                  * @since 3.0.0
    712                  *
    713                  * @param string $sign_up_url The sign up URL.
    714                  */
    715                 wp_redirect( apply_filters( 'wp_signup_location', network_site_url( 'wp-signup.php' ) ) );
    716                 exit;
    717         }
    718 
    719         if ( !get_option('users_can_register') ) {
    720                 wp_redirect( site_url('wp-login.php?registration=disabled') );
    721                 exit();
    722         }
    723 
    724         $user_login = '';
    725         $user_email = '';
    726         if ( $http_post ) {
    727                 $user_login = $_POST['user_login'];
    728                 $user_email = $_POST['user_email'];
    729                 $errors = register_new_user($user_login, $user_email);
    730                 if ( !is_wp_error($errors) ) {
    731                         $redirect_to = !empty( $_POST['redirect_to'] ) ? $_POST['redirect_to'] : 'wp-login.php?checkemail=registered';
    732                         wp_safe_redirect( $redirect_to );
    733                         exit();
    734                 }
    735         }
    736 
    737         $registration_redirect = ! empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
    738         /**
    739          * Filter the registration redirect URL.
    740          *
    741          * @since 3.0.0
    742          *
    743          * @param string $registration_redirect The redirect destination URL.
    744          */
    745         $redirect_to = apply_filters( 'registration_redirect', $registration_redirect );
    746         login_header(__('Registration Form'), '<p class="message register">' . __('Register For This Site') . '</p>', $errors);
    747 ?>
    748 
    749 <form name="registerform" id="registerform" action="<?php echo esc_url( wp_registration_url() ); ?>" method="post" novalidate="novalidate">
    750         <p>
    751                 <label for="user_login"><?php _e('Username') ?><br />
    752                 <input type="text" name="user_login" id="user_login" class="input" value="<?php echo esc_attr(wp_unslash($user_login)); ?>" size="20" /></label>
    753         </p>
    754         <p>
    755                 <label for="user_email"><?php _e('Email') ?><br />
    756                 <input type="email" name="user_email" id="user_email" class="input" value="<?php echo esc_attr( wp_unslash( $user_email ) ); ?>" size="25" /></label>
    757         </p>
    758         <?php
    759         /**
    760          * Fires following the 'Email' field in the user registration form.
    761          *
    762          * @since 2.1.0
    763          */
    764         do_action( 'register_form' );
    765         ?>
    766         <p id="reg_passmail"><?php _e( 'Registration confirmation will be emailed to you.' ); ?></p>
    767         <br class="clear" />
    768         <input type="hidden" name="redirect_to" value="<?php echo esc_attr( $redirect_to ); ?>" />
    769         <p class="submit"><input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e('Register'); ?>" /></p>
    770 </form>
    771 
    772 <p id="nav">
    773 <a href="<?php echo esc_url( wp_login_url() ); ?>"><?php _e( 'Log in' ); ?></a> |
    774 <a href="<?php echo esc_url( wp_lostpassword_url() ); ?>" title="<?php esc_attr_e( 'Password Lost and Found' ) ?>"><?php _e( 'Lost your password?' ); ?></a>
    775 </p>
    776 
    777 <?php
    778 login_footer('user_login');
    779 break;
    780 
    781 case 'login' :
    782 default:
    783         $secure_cookie = '';
    784         $customize_login = isset( $_REQUEST['customize-login'] );
    785         if ( $customize_login )
    786                 wp_enqueue_script( 'customize-base' );
    787 
    788         // If the user wants ssl but the session is not ssl, force a secure cookie.
    789         if ( !empty($_POST['log']) && !force_ssl_admin() ) {
    790                 $user_name = sanitize_user($_POST['log']);
    791                 if ( $user = get_user_by('login', $user_name) ) {
    792                         if ( get_user_option('use_ssl', $user->ID) ) {
    793                                 $secure_cookie = true;
    794                                 force_ssl_admin(true);
    795                         }
    796                 }
    797         }
    798 
    799         if ( isset( $_REQUEST['redirect_to'] ) ) {
    800                 $redirect_to = $_REQUEST['redirect_to'];
    801                 // Redirect to https if user wants ssl
    802                 if ( $secure_cookie && false !== strpos($redirect_to, 'wp-admin') )
    803                         $redirect_to = preg_replace('|^http://|', 'https://', $redirect_to);
    804         } else {
    805                 $redirect_to = admin_url();
    806         }
    807 
    808         $reauth = empty($_REQUEST['reauth']) ? false : true;
    809 
    810         $user = wp_signon( '', $secure_cookie );
    811 
    812         if ( empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) {
    813                 if ( headers_sent() ) {
    814                         $user = new WP_Error( 'test_cookie', sprintf( __( '<strong>ERROR</strong>: Cookies are blocked due to unexpected output. For help, please see <a href="%1$s">this documentation</a> or try the <a href="%2$s">support forums</a>.' ),
    815                                 __( 'https://codex.wordpress.org/Cookies' ), __( 'https://wordpress.org/support/' ) ) );
    816                 } elseif ( isset( $_POST['testcookie'] ) && empty( $_COOKIE[ TEST_COOKIE ] ) ) {
    817                         // If cookies are disabled we can't log in even with a valid user+pass
    818                         $user = new WP_Error( 'test_cookie', sprintf( __( '<strong>ERROR</strong>: Cookies are blocked or not supported by your browser. You must <a href="%s">enable cookies</a> to use WordPress.' ),
    819                                 __( 'https://codex.wordpress.org/Cookies' ) ) );
    820                 }
    821         }
    822 
    823         $requested_redirect_to = isset( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
    824         /**
    825          * Filter the login redirect URL.
    826          *
    827          * @since 3.0.0
    828          *
    829          * @param string           $redirect_to           The redirect destination URL.
    830          * @param string           $requested_redirect_to The requested redirect destination URL passed as a parameter.
    831          * @param WP_User|WP_Error $user                  WP_User object if login was successful, WP_Error object otherwise.
    832          */
    833         $redirect_to = apply_filters( 'login_redirect', $redirect_to, $requested_redirect_to, $user );
    834 
    835         if ( !is_wp_error($user) && !$reauth ) {
    836                 if ( $interim_login ) {
    837                         $message = '<p class="message">' . __('You have logged in successfully.') . '</p>';
    838                         $interim_login = 'success';
    839                         login_header( '', $message ); ?>
    840                         </div>
    841                         <?php
    842                         /** This action is documented in wp-login.php */
    843                         do_action( 'login_footer' ); ?>
    844                         <?php if ( $customize_login ) : ?>
    845                                 <script type="text/javascript">setTimeout( function(){ new wp.customize.Messenger({ url: '<?php echo wp_customize_url(); ?>', channel: 'login' }).send('login') }, 1000 );</script>
    846                         <?php endif; ?>
    847                         </body></html>
    848 <?php           exit;
    849                 }
    850 
    851                 if ( ( empty( $redirect_to ) || $redirect_to == 'wp-admin/' || $redirect_to == admin_url() ) ) {
    852                         // If the user doesn't belong to a blog, send them to user admin. If the user can't edit posts, send them to their profile.
    853                         if ( is_multisite() && !get_active_blog_for_user($user->ID) && !is_super_admin( $user->ID ) )
    854                                 $redirect_to = user_admin_url();
    855                         elseif ( is_multisite() && !$user->has_cap('read') )
    856                                 $redirect_to = get_dashboard_url( $user->ID );
    857                         elseif ( !$user->has_cap('edit_posts') )
    858                                 $redirect_to = $user->has_cap( 'read' ) ? admin_url( 'profile.php' ) : home_url();
    859                 }
    860                 wp_safe_redirect($redirect_to);
    861                 exit();
    862         }
    863 
    864         $errors = $user;
    865         // Clear errors if loggedout is set.
    866         if ( !empty($_GET['loggedout']) || $reauth )
    867                 $errors = new WP_Error();
    868 
    869         if ( $interim_login ) {
    870                 if ( ! $errors->get_error_code() )
    871                         $errors->add('expired', __('Session expired. Please log in again. You will not move away from this page.'), 'message');
    872         } else {
    873                 // Some parts of this script use the main login form to display a message
    874                 if              ( isset($_GET['loggedout']) && true == $_GET['loggedout'] )
    875                         $errors->add('loggedout', __('You are now logged out.'), 'message');
    876                 elseif  ( isset($_GET['registration']) && 'disabled' == $_GET['registration'] )
    877                         $errors->add('registerdisabled', __('User registration is currently not allowed.'));
    878                 elseif  ( isset($_GET['checkemail']) && 'confirm' == $_GET['checkemail'] )
    879                         $errors->add('confirm', __('Check your email for the confirmation link.'), 'message');
    880                 elseif  ( isset($_GET['checkemail']) && 'newpass' == $_GET['checkemail'] )
    881                         $errors->add('newpass', __('Check your email for your new password.'), 'message');
    882                 elseif  ( isset($_GET['checkemail']) && 'registered' == $_GET['checkemail'] )
    883                         $errors->add('registered', __('Registration complete. Please check your email.'), 'message');
    884                 elseif ( strpos( $redirect_to, 'about.php?updated' ) )
    885                         $errors->add('updated', __( '<strong>You have successfully updated WordPress!</strong> Please log back in to see what&#8217;s new.' ), 'message' );
    886         }
    887 
    888         /**
    889          * Filter the login page errors.
    890          *
    891          * @since 3.6.0
    892          *
    893          * @param object $errors      WP Error object.
    894          * @param string $redirect_to Redirect destination URL.
    895          */
    896         $errors = apply_filters( 'wp_login_errors', $errors, $redirect_to );
    897 
    898         // Clear any stale cookies.
    899         if ( $reauth )
    900                 wp_clear_auth_cookie();
    901 
    902         login_header(__('Log In'), '', $errors);
    903 
    904         if ( isset($_POST['log']) )
    905                 $user_login = ( 'incorrect_password' == $errors->get_error_code() || 'empty_password' == $errors->get_error_code() ) ? esc_attr(wp_unslash($_POST['log'])) : '';
    906         $rememberme = ! empty( $_POST['rememberme'] );
    907 
    908         if ( ! empty( $errors->errors ) ) {
    909                 $aria_describedby_error = ' aria-describedby="login_error"';
    910         } else {
    911                 $aria_describedby_error = '';
    912         }
    913 ?>
    914 
    915 <form name="loginform" id="loginform" action="<?php echo esc_url( wp_login_url() ); ?>" method="post">
    916         <p>
    917                 <label for="user_login"><?php _e('Username') ?><br />
    918                 <input type="text" name="log" id="user_login"<?php echo $aria_describedby_error; ?> class="input" value="<?php echo esc_attr( $user_login ); ?>" size="20" /></label>
    919         </p>
    920         <p>
    921                 <label for="user_pass"><?php _e('Password') ?><br />
    922                 <input type="password" name="pwd" id="user_pass"<?php echo $aria_describedby_error; ?> class="input" value="" size="20" /></label>
    923         </p>
    924         <?php
    925         /**
    926          * Fires following the 'Password' field in the login form.
    927          *
    928          * @since 2.1.0
    929          */
    930         do_action( 'login_form' );
    931         ?>
    932         <p class="forgetmenot"><label for="rememberme"><input name="rememberme" type="checkbox" id="rememberme" value="forever" <?php checked( $rememberme ); ?> /> <?php esc_attr_e('Remember Me'); ?></label></p>
    933         <p class="submit">
    934                 <input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e('Log In'); ?>" />
    935 <?php   if ( $interim_login ) { ?>
    936                 <input type="hidden" name="interim-login" value="1" />
    937 <?php   } else { ?>
    938                 <input type="hidden" name="redirect_to" value="<?php echo esc_attr($redirect_to); ?>" />
    939 <?php   } ?>
    940 <?php   if ( $customize_login ) : ?>
    941                 <input type="hidden" name="customize-login" value="1" />
    942 <?php   endif; ?>
    943                 <input type="hidden" name="testcookie" value="1" />
    944         </p>
    945 </form>
    946 
    947 <?php if ( ! $interim_login ) { ?>
    948 <p id="nav">
    949 <?php if ( ! isset( $_GET['checkemail'] ) || ! in_array( $_GET['checkemail'], array( 'confirm', 'newpass' ) ) ) :
    950         if ( get_option( 'users_can_register' ) ) :
    951                 $registration_url = sprintf( '<a href="%s">%s</a>', esc_url( wp_registration_url() ), __( 'Register' ) );
    952 
    953                 /** This filter is documented in wp-includes/general-template.php */
    954                 echo apply_filters( 'register', $registration_url ) . ' | ';
    955         endif;
    956         ?>
    957         <a href="<?php echo esc_url( wp_lostpassword_url() ); ?>" title="<?php esc_attr_e( 'Password Lost and Found' ); ?>"><?php _e( 'Lost your password?' ); ?></a>
    958 <?php endif; ?>
    959 </p>
    960 <?php } ?>
    961 
    962 <script type="text/javascript">
    963 function wp_attempt_focus(){
    964 setTimeout( function(){ try{
    965 <?php if ( $user_login ) { ?>
    966 d = document.getElementById('user_pass');
    967 d.value = '';
    968 <?php } else { ?>
    969 d = document.getElementById('user_login');
    970 <?php if ( 'invalid_username' == $errors->get_error_code() ) { ?>
    971 if( d.value != '' )
    972 d.value = '';
    973 <?php
    974 }
    975 }?>
    976 d.focus();
    977 d.select();
    978 } catch(e){}
    979 }, 200);
    980 }
    981 
    982 <?php if ( !$error ) { ?>
    983 wp_attempt_focus();
    984 <?php } ?>
    985 if(typeof wpOnload=='function')wpOnload();
    986 <?php if ( $interim_login ) { ?>
    987 (function(){
    988 try {
    989         var i, links = document.getElementsByTagName('a');
    990         for ( i in links ) {
    991                 if ( links[i].href )
    992                         links[i].target = '_blank';
    993         }
    994 } catch(e){}
    995 }());
    996 <?php } ?>
    997 </script>
    998 
    999 <?php
    1000 login_footer();
    1001 break;
    1002 } // end action switch
     95</body>
     96</html>
  • wp-includes/user-functions.php

     
    18591859}
    18601860
    18611861/**
     1862 * Handles sending password retrieval email to user.
     1863 *
     1864 * @global wpdb $wpdb WordPress database abstraction object.
     1865 *
     1866 * @param string $user_login User login
     1867 * @return bool|WP_Error True on success, WP_Error on failure.
     1868 */
     1869function retrieve_password( $user_login = '' ) {
     1870        global $wpdb;
     1871
     1872        $errors = new WP_Error();
     1873
     1874        if ( empty( $user_login ) ) {
     1875                return new WP_Error( 'empty_username', __( '<strong>ERROR</strong>: Enter a username or email address.' ) );
     1876
     1877        } elseif ( strpos( $user_login, '@' ) ) {
     1878                $user_data = get_user_by( 'email', trim( $user_login ) );
     1879                if ( empty( $user_data ) )
     1880                        return new WP_Error( 'invalid_email', __( '<strong>ERROR</strong>: There is no user registered with that email address.' ) );
     1881
     1882        } else {
     1883                $login = trim( $user_login );
     1884                $user_data = get_user_by( 'login', $login );
     1885        }
     1886
     1887        if ( ! $user_data )
     1888                return new WP_Error( 'invalidcombo', __( '<strong>ERROR</strong>: Invalid username or email.' ) );
     1889
     1890        // Redefining user_login ensures we return the right case in the email.
     1891        $user_login = $user_data->user_login;
     1892        $user_email = $user_data->user_email;
     1893
     1894        /**
     1895         * Fires before a new password is retrieved.
     1896         *
     1897         * @since 1.5.0
     1898         * @deprecated 1.5.1 Misspelled. Use 'retrieve_password' hook instead.
     1899         *
     1900         * @param string $user_login The user login name.
     1901         */
     1902        do_action( 'retreive_password', $user_login );
     1903
     1904        /**
     1905         * Fires before a new password is retrieved.
     1906         *
     1907         * @since 1.5.1
     1908         *
     1909         * @param string $user_login The user login name.
     1910         */
     1911        do_action( 'retrieve_password', $user_login );
     1912
     1913        /**
     1914         * Filter whether to allow a password to be reset.
     1915         *
     1916         * @since 2.7.0
     1917         *
     1918         * @param bool true           Whether to allow the password to be reset. Default true.
     1919         * @param int  $user_data->ID The ID of the user attempting to reset a password.
     1920         */
     1921        $allow = apply_filters( 'allow_password_reset', true, $user_data->ID );
     1922
     1923        if ( ! $allow ) {
     1924                return new WP_Error( 'no_password_reset', __( 'Password reset is not allowed for this user' ) );
     1925        } elseif ( is_wp_error( $allow ) ) {
     1926                return $allow;
     1927        }
     1928
     1929        // Generate something random for a password reset key.
     1930        $key = wp_generate_password( 20, false );
     1931
     1932        /**
     1933         * Fires when a password reset key is generated.
     1934         *
     1935         * @since 2.5.0
     1936         *
     1937         * @param string $user_login The username for the user.
     1938         * @param string $key        The generated password reset key.
     1939         */
     1940        do_action( 'retrieve_password_key', $user_login, $key );
     1941
     1942        // Now insert the key, hashed, into the DB.
     1943        if ( empty( $wp_hasher ) ) {
     1944                require_once ABSPATH . WPINC . '/class-phpass.php';
     1945                $wp_hasher = new PasswordHash( 8, true );
     1946        }
     1947        $hashed = time() . ':' . $wp_hasher->HashPassword( $key );
     1948        $wpdb->update( $wpdb->users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user_login ) );
     1949
     1950        $message = __( 'Someone requested that the password be reset for the following account:' ) . "\r\n\r\n";
     1951        $message .= network_home_url( '/' ) . "\r\n\r\n";
     1952        $message .= sprintf( __( 'Username: %s' ), $user_login ) . "\r\n\r\n";
     1953        $message .= __( 'If this was a mistake, just ignore this email and nothing will happen.' ) . "\r\n\r\n";
     1954        $message .= __( 'To reset your password, visit the following address:' ) . "\r\n\r\n";
     1955        $message .= '<' . network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user_login ), 'login' ) . ">\r\n";
     1956
     1957        if ( is_multisite() )
     1958                $blogname = $GLOBALS['current_site']->site_name;
     1959        else
     1960                /*
     1961                 * The blogname option is escaped with esc_html on the way into the database
     1962                 * in sanitize_option we want to reverse this for the plain text arena of emails.
     1963                 */
     1964                $blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
     1965
     1966        $title = sprintf( __( '[%s] Password Reset' ), $blogname );
     1967
     1968        /**
     1969         * Filter the subject of the password reset email.
     1970         *
     1971         * @since 2.8.0
     1972         *
     1973         * @param string $title Default email title.
     1974         */
     1975        $title = apply_filters( 'retrieve_password_title', $title );
     1976
     1977        /**
     1978         * Filter the message body of the password reset mail.
     1979         *
     1980         * @since 2.8.0
     1981         * @since 4.1.0 Added `$user_login` and `$user_data` parameters.
     1982         *
     1983         * @param string  $message    Default mail message.
     1984         * @param string  $key        The activation key.
     1985         * @param string  $user_login The username for the user.
     1986         * @param WP_User $user_data  WP_User object.
     1987         */
     1988        $message = apply_filters( 'retrieve_password_message', $message, $key, $user_login, $user_data );
     1989
     1990        if ( $message && ! wp_mail( $user_email, wp_specialchars_decode( $title ), $message ) )
     1991                wp_die( __( 'The email could not be sent.' ) . "<br />\n" . __( 'Possible reason: your host may have disabled the mail() function.' ) );
     1992
     1993        return true;
     1994}
     1995
     1996/**
    18621997 * Retrieves a user row based on password reset key and login
    18631998 *
    18641999 * A key is considered 'expired' if it exactly matches the value of the
  • wp-includes/script-loader.php

     
    473473        $scripts->add( 'media-audiovideo', "/wp-includes/js/media-audiovideo$suffix.js", array( 'media-editor' ), false, 1 );
    474474        $scripts->add( 'mce-view', "/wp-includes/js/mce-view$suffix.js", array( 'shortcode', 'jquery', 'media-views', 'media-audiovideo' ), false, 1 );
    475475
     476        $scripts->add( 'wp-login', "/wp-includes/js/wp-login$suffix.js", array( 'jquery' ), false, 1 );
     477        did_action( 'init' ) && $scripts->localize( 'wp-login', 'wpLoginSettings', array(
     478                'customizeUrl' => wp_customize_url()
     479        ) );
     480
    476481        if ( is_admin() ) {
    477482                $scripts->add( 'admin-tags', "/wp-admin/js/tags$suffix.js", array( 'jquery', 'wp-ajax-response' ), false, 1 );
    478483                did_action( 'init' ) && $scripts->localize( 'admin-tags', 'tagsl10n', array(
  • wp-includes/js/wp-login.min.js

     
     1var wpLogin;!function(a){wpLogin={init:function(){var b=a("body");if(this.form=b.find("form").first(),b.hasClass("shake")){var c=[15,30,15,0,-15,-30,-15,0],d=20;c=c.concat(c.concat(c)),this.shakeForm(c,d)}b.hasClass("interim-login")&&b.find("a").each(function(a,b){b.href&&(b.target="_blank")}),b.hasClass("customize-login")&&setTimeout(function(){new wp.customize.Messenger({url:wpLoginSettings.customizeUrl,channel:"login"}).send("login")},1e3),b.hasClass("loggedout")&&this.clearSessionStorage(),this.attemptFocus()},clearSessionStorage:function(){if("sessionStorage"in window)try{for(var a in sessionStorage)-1!=a.indexOf("wp-autosave-")&&sessionStorage.removeItem(a)}catch(b){}},shakeForm:function(a,b){var c=this,d=a.shift();this.form.css({left:d+"px",position:"relative"}),a.length>0?setTimeout(function(){c.shakeForm(a,b)},b):this.form.css("position","static")},attemptFocus:function(){var b=this,c=a("#user_login"),d=a("#user_pass");setTimeout(function(){c.length&&d.length?c.val()?d.val("").focus():c.focus():b.form.find(":input").filter(":visible:first").focus()},200)}},a(document).ready(function(){wpLogin.init()})}(jQuery);
  • wp-includes/js/wp-login.js

     
     1var wpLogin;
     2
     3( function( $ ) {
     4
     5        wpLogin = {
     6
     7                init: function() {
     8                        var body = $( 'body' );
     9
     10                        this.form = body.find('form').first();
     11
     12                        if ( body.hasClass( 'shake' ) ) {
     13                                var coords = [15, 30, 15, 0, -15, -30, -15, 0],
     14                                        duration = 20;
     15
     16                                coords = coords.concat( coords.concat( coords ) );
     17
     18                                this.shakeForm( coords, duration );
     19                        }
     20
     21                        if ( body.hasClass( 'interim-login' ) ) {
     22                                body.find( 'a' ).each( function( index, link ) {
     23                                        if ( link.href )
     24                                                link.target = '_blank';
     25                                } );
     26                        }
     27
     28                        if ( body.hasClass( 'customize-login' ) ) {
     29                                setTimeout( function() {
     30                                        new wp.customize.Messenger( {
     31                                                url: wpLoginSettings.customizeUrl,
     32                                                channel: 'login'
     33                                        } ).send( 'login' );
     34                                }, 1000 );
     35                        }
     36
     37                        if ( body.hasClass( 'loggedout' ) ) {
     38                                this.clearSessionStorage();
     39                        }
     40
     41                        this.attemptFocus();
     42                },
     43
     44                clearSessionStorage: function() {
     45                        if ( 'sessionStorage' in window ) {
     46                                try {
     47                                        for ( var key in sessionStorage ) {
     48                                                if ( key.indexOf( 'wp-autosave-' ) != -1 ) {
     49                                                        sessionStorage.removeItem( key );
     50                                                }
     51                                        }
     52                                } catch (e) {
     53                                        // Do nothing
     54                                }
     55                        }
     56                },
     57
     58                shakeForm: function( coords, duration ) {
     59                        var t = this,
     60                                pos = coords.shift();
     61
     62                        this.form.css({
     63                                left: pos + 'px',
     64                                position: 'relative'
     65                        });
     66
     67                        if ( coords.length > 0 ) {
     68                                setTimeout( function(){
     69                                        t.shakeForm( coords, duration );
     70                                }, duration );
     71                        } else {
     72                                this.form.css( 'position', 'static' );
     73                        }
     74                },
     75
     76                attemptFocus: function() {
     77                        var t = this,
     78                                userLogin = $( '#user_login' ),
     79                                userPass = $( '#user_pass' );
     80
     81                        setTimeout( function() {
     82                                if ( userLogin.length && userPass.length ) {
     83                                        if ( userLogin.val() ) {
     84                                                userPass.val('').focus();
     85                                        } else {
     86                                                userLogin.focus();
     87                                        }
     88                                } else {
     89                                        t.form.find(':input').filter(':visible:first').focus();
     90                                }
     91                        }, 200 );
     92                }
     93        };
     94
     95        $( document ).ready( function() {
     96                wpLogin.init();
     97        });
     98
     99} )( jQuery );
  • wp-includes/default-filters.php

     
    233233
    234234// Login actions
    235235add_action( 'login_head',          'wp_print_head_scripts',         9     );
     236add_action( 'login_head',          'wp_no_robots',                  10    );
     237add_action( 'login_head',          'wp_login_viewport_meta',        10    );
    236238add_action( 'login_head',          'wp_site_icon',                  99    );
    237239add_action( 'login_footer',        'wp_print_footer_scripts',       20    );
    238240add_action( 'login_init',          'send_frame_options_header',     10, 0 );
  • wp-includes/class-wp-login.php

     
     1<?php
     2/**
     3 * WordPress Login API
     4 *
     5 * @package WordPress
     6 */
     7
     8/**
     9 * WordPress Login Class
     10 *
     11 * @package WordPress
     12 * @since unknown
     13 */
     14class WP_Login {
     15        /**
     16         * Stores the current action.
     17         *
     18         * @since unknown
     19         * @var string
     20         */
     21        public $action;
     22
     23        /**
     24         * Stores the available actions.
     25         *
     26         * @since unknown
     27         * @var array
     28         */
     29        public $actions = array(
     30                'postpass',
     31                'logout',
     32                'lostpassword',
     33                'retrievepassword',
     34                'resetpass',
     35                'rp',
     36                'register',
     37                'login'
     38        );
     39
     40        /**
     41         * Stores login errors and notices.
     42         *
     43         * @since unknown
     44         * @var WP_Error
     45         */
     46        public $errors;
     47
     48        /**
     49         * Stores user object once authenticated or found.
     50         *
     51         * @since unknown
     52         * @var WP_User
     53         */
     54        private $user;
     55
     56        /**
     57         * Stores the current redirect location.
     58         *
     59         * @since unknown
     60         * @var string
     61         */
     62        private $redirect_to = '';
     63
     64        /**
     65         * Construct the object.
     66         *
     67         * @since unknown
     68         */
     69        public function __construct() {
     70
     71                $this->action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : 'login';
     72                if ( isset( $_GET['key'] ) )
     73                        $this->action = 'resetpass';
     74
     75                // validate action so as to default to the login screen
     76                if ( ! in_array( $this->action, $this->actions, true ) && false === has_filter( 'login_form_' . $this->action ) )
     77                        $this->action = 'login';
     78
     79                $this->errors = new WP_Error();
     80        }
     81
     82        /**
     83         * Process the request.
     84         *
     85         * @since unknown
     86         */
     87        public function process() {
     88                $this->enforce_ssl();
     89                $this->headers();
     90                $this->maybe_relocate();
     91                $this->test_cookie();
     92
     93                switch ( $this->action ) {
     94                        case 'postpass' :
     95                                $this->post_password();
     96                                break;
     97
     98                        case 'lostpassword' :
     99                        case 'retrievepassword' :
     100                                $this->lost_password();
     101                                break;
     102
     103                        case 'resetpass' :
     104                        case 'rp' :
     105                                $this->reset_password();
     106                                break;
     107
     108                        case 'register' :
     109                                $this->register();
     110                                break;
     111
     112                        case 'login' :
     113                        default :
     114                                $this->login();
     115                                break;
     116                }
     117        }
     118
     119        /**
     120         * Render the form.
     121         *
     122         * @since unknown
     123         */
     124        public function render() {
     125                $this->header();
     126                $this->message();
     127                $this->errors();
     128                $this->form();
     129                $this->navigation();
     130        }
     131
     132        /**
     133         * Redirect to a secure URL if required.
     134         *
     135         * @since unknown
     136         */
     137        public function enforce_ssl() {
     138                // Redirect to https login if forced to use SSL
     139                if ( force_ssl_admin() && ! is_ssl() ) {
     140                        if ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) {
     141                                wp_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ) );
     142                                exit;
     143                        } else {
     144                                wp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
     145                                exit;
     146                        }
     147                }
     148        }
     149
     150        /**
     151         * Send headers.
     152         *
     153         * @since unknown
     154         */
     155        public function headers() {
     156                nocache_headers();
     157                header( 'Content-Type: ' . get_bloginfo( 'html_type' ) . '; charset=' . get_bloginfo( 'charset' ) );
     158        }
     159
     160        /**
     161         * Handle relocation.
     162         *
     163         * @since unknown
     164         */
     165        public function maybe_relocate() {
     166                if ( defined( 'RELOCATE' ) && RELOCATE ) {
     167                        if ( isset( $_SERVER['PATH_INFO'] ) && ($_SERVER['PATH_INFO'] != $_SERVER['PHP_SELF']) )
     168                                $_SERVER['PHP_SELF'] = str_replace( $_SERVER['PATH_INFO'], '', $_SERVER['PHP_SELF'] );
     169
     170                        $url = dirname( set_url_scheme( 'http://' .  $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] ) );
     171                        if ( $url != get_option( 'siteurl' ) )
     172                                update_option( 'siteurl', $url );
     173                }
     174        }
     175
     176        /**
     177         * Set a test cookie to see if they are supported by the browser.
     178         *
     179         * @since unknown
     180         */
     181        public function test_cookie() {
     182                $secure = ( 'https' === parse_url( site_url(), PHP_URL_SCHEME ) && 'https' === parse_url( home_url(), PHP_URL_SCHEME ) );
     183                setcookie( TEST_COOKIE, 'WP Cookie check', 0, COOKIEPATH, COOKIE_DOMAIN, $secure );
     184                if ( SITECOOKIEPATH != COOKIEPATH )
     185                        setcookie( TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN, $secure );
     186        }
     187
     188        /**
     189         * Process the post password request.
     190         *
     191         * @since unknown
     192         */
     193        public function post_password() {
     194                require_once( ABSPATH . WPINC . '/class-phpass.php' );
     195                $hasher = new PasswordHash( 8, true );
     196
     197                /**
     198                 * Filter the life span of the post password cookie.
     199                 *
     200                 * By default, the cookie expires 10 days from creation. To turn this
     201                 * into a session cookie, return 0.
     202                 *
     203                 * @since 3.7.0
     204                 *
     205                 * @param int $expires The expiry time, as passed to setcookie().
     206                 */
     207                $expire = apply_filters( 'post_password_expires', time() + 10 * DAY_IN_SECONDS );
     208                $secure = ( 'https' === parse_url( home_url(), PHP_URL_SCHEME ) );
     209                setcookie( 'wp-postpass_' . COOKIEHASH, $hasher->HashPassword( wp_unslash( $_POST['post_password'] ) ), $expire, COOKIEPATH, COOKIE_DOMAIN, $secure );
     210
     211                wp_safe_redirect( wp_get_referer() );
     212                exit;
     213        }
     214
     215        /**
     216         * Process the log out request.
     217         *
     218         * @since unknown
     219         */
     220        public function logout() {
     221                check_admin_referer( 'log-out' );
     222
     223                $user = wp_get_current_user();
     224
     225                wp_logout();
     226
     227                if ( ! empty( $_REQUEST['redirect_to'] ) ) {
     228                        $redirect_to = $requested_redirect_to = $_REQUEST['redirect_to'];
     229                } else {
     230                        $redirect_to = 'wp-login.php?loggedout=true';
     231                        $requested_redirect_to = '';
     232                }
     233
     234                /**
     235                 * Filter the log out redirect URL.
     236                 *
     237                 * @since 4.2.0
     238                 *
     239                 * @param string  $redirect_to           The redirect destination URL.
     240                 * @param string  $requested_redirect_to The requested redirect destination URL passed as a parameter.
     241                 * @param WP_User $user                  The WP_User object for the user that's logging out.
     242                 */
     243                $redirect_to = apply_filters( 'logout_redirect', $redirect_to, $requested_redirect_to, $user );
     244                wp_safe_redirect( $redirect_to );
     245                exit;
     246        }
     247
     248        /**
     249         * Process the lost password request.
     250         *
     251         * @since unknown
     252         */
     253        public function lost_password() {
     254                // Is this a POST request?
     255                if ( $this->is_post_request() ) {
     256
     257                        /**
     258                         * Fires before errors are returned from a password reset request.
     259                         *
     260                         * @since 2.1.0
     261                         */
     262                        do_action( 'lostpassword_post' );
     263
     264                        $user_login = isset( $_POST['user_login'] ) ? wp_unslash( $_POST['user_login'] ) : '';
     265
     266                        $errors = retrieve_password( $user_login );
     267                        if ( ! is_wp_error( $errors ) ) {
     268                                $redirect_to = ! empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : 'wp-login.php?checkemail=confirm';
     269                                wp_safe_redirect( $redirect_to );
     270                                exit;
     271                        } else {
     272                                $this->errors = $errors;
     273                        }
     274                }
     275
     276                if ( isset( $_GET['error'] ) ) {
     277                        if ( 'invalidkey' == $_GET['error'] ) {
     278                                $this->errors->add( 'invalidkey', __( 'Your password reset link appears to be invalid. Please request a new link below.' ) );
     279                        } elseif ( 'expiredkey' == $_GET['error'] ) {
     280                                $this->errors->add( 'expiredkey', __( 'Your password reset link has expired. Please request a new link below.' ) );
     281                        }
     282                }
     283        }
     284
     285        /**
     286         * Output the lost password form.
     287         *
     288         * @since unknown
     289         */
     290        public function lost_password_form() {
     291                $user_login = isset( $_POST['user_login'] ) ? wp_unslash( $_POST['user_login'] ) : '';
     292
     293                $lostpassword_redirect = ! empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
     294                /**
     295                 * Filter the URL redirected to after submitting the lostpassword/retrievepassword form.
     296                 *
     297                 * @since 3.0.0
     298                 *
     299                 * @param string $lostpassword_redirect The redirect destination URL.
     300                 */
     301                $redirect_to = apply_filters( 'lostpassword_redirect', $lostpassword_redirect );
     302
     303                /**
     304                 * Fires before the lost password form.
     305                 *
     306                 * @since 1.5.1
     307                 */
     308                do_action( 'lost_password' );
     309                ?>
     310
     311                <form name="lostpasswordform" id="lostpasswordform" action="<?php echo esc_url( network_site_url( 'wp-login.php?action=lostpassword', 'login_post' ) ); ?>" method="post">
     312                        <p>
     313                                <label for="user_login" ><?php _e( 'Username or Email:' ) ?><br />
     314                                <input type="text" name="user_login" id="user_login" class="input" value="<?php echo esc_attr( $user_login ); ?>" size="20" /></label>
     315                        </p>
     316                        <?php
     317                        /**
     318                         * Fires inside the lostpassword form tags, before the hidden fields.
     319                         *
     320                         * @since 2.1.0
     321                         */
     322                        do_action( 'lostpassword_form' ); ?>
     323
     324                        <p class="submit">
     325                                <input type="hidden" name="redirect_to" value="<?php echo esc_attr( $redirect_to ); ?>" />
     326                                <input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e( 'Get New Password' ); ?>" />
     327                        </p>
     328                </form>
     329
     330                <?php
     331        }
     332
     333        /**
     334         * Process the password reset request.
     335         *
     336         * @since unknown
     337         */
     338        public function reset_password() {
     339                list( $rp_path ) = explode( '?', wp_unslash( $_SERVER['REQUEST_URI'] ) );
     340                $rp_cookie = 'wp-resetpass-' . COOKIEHASH;
     341                if ( isset( $_GET['key'] ) ) {
     342                        $value = sprintf( '%s:%s', wp_unslash( $_GET['login'] ), wp_unslash( $_GET['key'] ) );
     343                        setcookie( $rp_cookie, $value, 0, $rp_path, COOKIE_DOMAIN, is_ssl(), true );
     344                        wp_safe_redirect( remove_query_arg( array( 'key', 'login' ) ) );
     345                        exit;
     346                }
     347
     348                if ( isset( $_COOKIE[ $rp_cookie ] ) && 0 < strpos( $_COOKIE[ $rp_cookie ], ':' ) ) {
     349                        list( $rp_login, $rp_key ) = explode( ':', wp_unslash( $_COOKIE[ $rp_cookie ] ), 2 );
     350                        $user = check_password_reset_key( $rp_key, $rp_login );
     351                        if ( isset( $_POST['pass1'] ) && ! hash_equals( $rp_key, $_POST['rp_key'] ) ) {
     352                                $user = false;
     353                        }
     354                } else {
     355                        $user = false;
     356                }
     357
     358                if ( ! $user || is_wp_error( $user ) ) {
     359                        setcookie( $rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true );
     360                        if ( $user && $user->get_error_code() === 'expired_key' )
     361                                wp_redirect( site_url( 'wp-login.php?action=lostpassword&error=expiredkey' ) );
     362                        else
     363                                wp_redirect( site_url( 'wp-login.php?action=lostpassword&error=invalidkey' ) );
     364                        exit;
     365                } else {
     366                        $this->user = $user;
     367                }
     368
     369                if ( isset( $_POST['pass1'] ) && $_POST['pass1'] != $_POST['pass2'] )
     370                        $this->errors->add( 'password_reset_mismatch', __( 'The passwords do not match.' ) );
     371
     372                /**
     373                 * Fires before the password reset procedure is validated.
     374                 *
     375                 * @since 3.5.0
     376                 *
     377                 * @param object           $errors WP Error object.
     378                 * @param WP_User|WP_Error $user   WP_User object if the login and reset key match. WP_Error object otherwise.
     379                 */
     380                do_action( 'validate_password_reset', $this->errors, $this->user );
     381
     382                if ( ( ! $this->errors->get_error_code() ) && isset( $_POST['pass1'] ) && ! empty( $_POST['pass1'] ) ) {
     383                        reset_password( $this->user, $_POST['pass1'] );
     384                        setcookie( $rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true );
     385                } else {
     386                        wp_enqueue_script('utils');
     387                        wp_enqueue_script('user-profile');
     388                }
     389        }
     390
     391        /**
     392         * Output the password reset form.
     393         *
     394         * @since unknown
     395         */
     396        public function reset_password_form() {
     397                // Don't show the form if the password has been successfully reset
     398                if ( did_action( 'password_reset' ) )
     399                        return;
     400
     401                list( $rp_login, $rp_key ) = explode( ':', wp_unslash( $_COOKIE[ 'wp-resetpass-' . COOKIEHASH ] ), 2 );
     402                ?>
     403
     404                <form name="resetpassform" id="resetpassform" action="<?php echo esc_url( network_site_url( 'wp-login.php?action=resetpass', 'login_post' ) ); ?>" method="post" autocomplete="off">
     405                        <div class="user-pass1-wrap">
     406                                <p>
     407                                        <label for="pass1"><?php _e( 'New password' ) ?></label>
     408                                </p>
     409
     410                                <div class="wp-pwd">
     411                                        <span class="password-input-wrapper">
     412                                                <input type="password" data-reveal="1" data-pw="<?php echo esc_attr( wp_generate_password( 16 ) ); ?>" name="pass1" id="pass1" class="input" size="20" value="" autocomplete="off" aria-describedby="pass-strength-result" />
     413                                        </span>
     414                                        <div id="pass-strength-result" class="hide-if-no-js" aria-live="polite"><?php _e( 'Strength indicator' ); ?></div>
     415                                </div>
     416                        </div>
     417
     418                        <p class="user-pass2-wrap">
     419                                <label for="pass2"><?php _e( 'Confirm new password' ) ?></label><br />
     420                                <input type="password" name="pass2" id="pass2" class="input" size="20" value="" autocomplete="off" />
     421                        </p>
     422
     423                        <p class="description indicator-hint"><?php echo wp_get_password_hint(); ?></p>
     424                        <br class="clear" />
     425
     426                        <?php
     427                        /**
     428                         * Fires following the 'Strength indicator' meter in the user password reset form.
     429                         *
     430                         * @since 3.9.0
     431                         *
     432                         * @param WP_User $user User object of the user whose password is being reset.
     433                         */
     434                        do_action( 'resetpass_form', $this->user ); ?>
     435
     436                        <p class="submit">
     437                                <input type="hidden" id="user_login" value="<?php echo esc_attr( $rp_login ); ?>" autocomplete="off" />
     438                                <input type="hidden" name="rp_key" value="<?php echo esc_attr( $rp_key ); ?>" />
     439                                <input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e('Reset Password'); ?>" />
     440                        </p>
     441                </form>
     442
     443                <?php
     444        }
     445
     446        /**
     447         * Process the register request.
     448         *
     449         * @since unknown
     450         */
     451        public function register() {
     452
     453                // Bail and redirect to wp-signup.php if multisite
     454                if ( is_multisite() ) {
     455                        /**
     456                         * Filter the Multisite sign up URL.
     457                         *
     458                         * @since 3.0.0
     459                         *
     460                         * @param string $sign_up_url The sign up URL.
     461                         */
     462                        wp_redirect( apply_filters( 'wp_signup_location', network_site_url( 'wp-signup.php' ) ) );
     463                        exit;
     464                }
     465
     466                // Bail if registration is disabled
     467                if ( ! get_option( 'users_can_register' ) ) {
     468                        wp_redirect( site_url( 'wp-login.php?registration=disabled' ) );
     469                        exit;
     470                }
     471
     472                // Is this a post request?
     473                if ( $this->is_post_request() ) {
     474
     475                        // Attempt to register the user
     476                        $errors = register_new_user($_POST['user_login'], $_POST['user_email']);
     477
     478                        // Registration succeeded
     479                        if ( ! is_wp_error( $errors ) ) {
     480                                $redirect_to = ! empty( $_POST['redirect_to'] ) ? $_POST['redirect_to'] : 'wp-login.php?checkemail=registered';
     481                                wp_safe_redirect( $redirect_to );
     482                                exit;
     483
     484                        // Registration failed
     485                        } else {
     486                                $this->errors = $errors;
     487                        }
     488                }
     489        }
     490
     491        /**
     492         * Output the register form.
     493         *
     494         * @since unknown
     495         */
     496        public function register_form() {
     497                $user_login = isset( $_POST['user_login'] ) ? $_POST['user_login'] : '';
     498                $user_email = isset( $_POST['user_email'] ) ? $_POST['user_email'] : '';
     499
     500                $registration_redirect = ! empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
     501                /**
     502                 * Filter the registration redirect URL.
     503                 *
     504                 * @since 3.0.0
     505                 *
     506                 * @param string $registration_redirect The redirect destination URL.
     507                 */
     508                $redirect_to = apply_filters( 'registration_redirect', $registration_redirect );
     509                ?>
     510
     511                <form name="registerform" id="registerform" action="<?php echo esc_url( wp_registration_url() ); ?>" method="post" novalidate="novalidate">
     512                        <p>
     513                                <label for="user_login"><?php _e( 'Username' ) ?><br />
     514                                <input type="text" name="user_login" id="user_login" class="input" value="<?php echo esc_attr( wp_unslash( $user_login ) ); ?>" size="20" /></label>
     515                        </p>
     516                        <p>
     517                                <label for="user_email"><?php _e( 'Email' ) ?><br />
     518                                <input type="email" name="user_email" id="user_email" class="input" value="<?php echo esc_attr( wp_unslash( $user_email ) ); ?>" size="25" /></label>
     519                        </p>
     520
     521                        <?php
     522                        /**
     523                         * Fires following the 'Email' field in the user registration form.
     524                         *
     525                         * @since 2.1.0
     526                         */
     527                        do_action( 'register_form' ); ?>
     528
     529                        <p id="reg_passmail"><?php _e( 'Registration confirmation will be emailed to you.' ); ?></p>
     530
     531                        <br class="clear" />
     532
     533                        <p class="submit">
     534                                <input type="hidden" name="redirect_to" value="<?php echo esc_attr( $redirect_to ); ?>" />
     535                                <input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e( 'Register' ); ?>" />
     536                        </p>
     537                </form>
     538                <?php
     539        }
     540
     541        /**
     542         * Process the login request.
     543         *
     544         * @since unknown
     545         */
     546        public function login() {
     547                $secure_cookie = '';
     548                if ( $this->is_customize_login() )
     549                        wp_enqueue_script( 'customize-base' );
     550
     551                // If the user wants ssl but the session is not ssl, force a secure cookie.
     552                if ( ! empty( $_POST['log'] ) && ! force_ssl_admin() ) {
     553                        $user_name = sanitize_user( $_POST['log'] );
     554                        if ( $user = get_user_by( 'login', $user_name ) ) {
     555                                if ( get_user_option( 'use_ssl', $user->ID ) ) {
     556                                        $secure_cookie = true;
     557                                        force_ssl_admin( true );
     558                                }
     559                        }
     560                }
     561
     562                if ( isset( $_REQUEST['redirect_to'] ) ) {
     563                        $redirect_to = $_REQUEST['redirect_to'];
     564                        // Redirect to https if user wants ssl
     565                        if ( $secure_cookie && false !== strpos( $redirect_to, 'wp-admin' ) )
     566                                $redirect_to = preg_replace( '|^http://|', 'https://', $redirect_to );
     567                } else {
     568                        $redirect_to = admin_url();
     569                }
     570
     571                $user = wp_signon( '', $secure_cookie );
     572
     573                if ( empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) {
     574                        if ( headers_sent() ) {
     575                                $user = new WP_Error( 'test_cookie', sprintf( __( '<strong>ERROR</strong>: Cookies are blocked due to unexpected output. For help, please see <a href="%1$s">this documentation</a> or try the <a href="%2$s">support forums</a>.' ),
     576                                        __( 'https://codex.wordpress.org/Cookies' ), __( 'https://wordpress.org/support/' ) ) );
     577                        } elseif ( isset( $_POST['testcookie'] ) && empty( $_COOKIE[ TEST_COOKIE ] ) ) {
     578                                // If cookies are disabled we can't log in even with a valid user+pass
     579                                $user = new WP_Error( 'test_cookie', sprintf( __( '<strong>ERROR</strong>: Cookies are blocked or not supported by your browser. You must <a href="%s">enable cookies</a> to use WordPress.' ),
     580                                        __( 'https://codex.wordpress.org/Cookies' ) ) );
     581                        }
     582                }
     583
     584                $requested_redirect_to = isset( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
     585                /**
     586                 * Filter the login redirect URL.
     587                 *
     588                 * @since 3.0.0
     589                 *
     590                 * @param string           $redirect_to           The redirect destination URL.
     591                 * @param string           $requested_redirect_to The requested redirect destination URL passed as a parameter.
     592                 * @param WP_User|WP_Error $user                  WP_User object if login was successful, WP_Error object otherwise.
     593                 */
     594                $redirect_to = apply_filters( 'login_redirect', $redirect_to, $requested_redirect_to, $user );
     595
     596                if ( ! is_wp_error( $user ) && ! $this->is_reauth_required() ) {
     597                        if ( $this->is_interim_login() ) {
     598                                $this->user = $user;
     599                        } else {
     600                                if ( ( empty( $redirect_to ) || $redirect_to == 'wp-admin/' || $redirect_to == admin_url() ) ) {
     601                                        // If the user doesn't belong to a blog, send them to user admin. If the user can't edit posts, send them to their profile.
     602                                        if ( is_multisite() && ! get_active_blog_for_user( $user->ID ) && ! is_super_admin( $user->ID ) )
     603                                                $redirect_to = user_admin_url();
     604                                        elseif ( is_multisite() && ! $user->has_cap( 'read' ) )
     605                                                $redirect_to = get_dashboard_url( $user->ID );
     606                                        elseif ( ! $user->has_cap( 'edit_posts' ) )
     607                                                $redirect_to = $user->has_cap( 'read' ) ? admin_url( 'profile.php' ) : home_url();
     608                                }
     609                                wp_safe_redirect( $redirect_to );
     610                                exit;
     611                        }
     612                }
     613
     614                $this->errors = $user;
     615                $this->redirect_to = $redirect_to;
     616
     617                // Clear errors if loggedout is set.
     618                if ( ! empty( $_GET['loggedout'] ) || $this->is_reauth_required() )
     619                        $this->errors = new WP_Error();
     620
     621                if ( $this->is_interim_login() ) {
     622                        if ( ! $this->errors->get_error_code() )
     623                                $this->errors->add( 'expired', __( 'Session expired. Please log in again. You will not move away from this page.' ), 'message' );
     624                } else {
     625                        // Some parts of this script use the main login form to display a message
     626                        if              ( isset($_GET['loggedout']) && true == $_GET['loggedout'] )
     627                                $this->errors->add('loggedout', __('You are now logged out.'), 'message');
     628                        elseif  ( isset($_GET['registration']) && 'disabled' == $_GET['registration'] )
     629                                $this->errors->add('registerdisabled', __('User registration is currently not allowed.'));
     630                        elseif  ( isset($_GET['checkemail']) && 'confirm' == $_GET['checkemail'] )
     631                                $this->errors->add('confirm', __('Check your email for the confirmation link.'), 'message');
     632                        elseif  ( isset($_GET['checkemail']) && 'newpass' == $_GET['checkemail'] )
     633                                $this->errors->add('newpass', __('Check your email for your new password.'), 'message');
     634                        elseif  ( isset($_GET['checkemail']) && 'registered' == $_GET['checkemail'] )
     635                                $this->errors->add('registered', __('Registration complete. Please check your email.'), 'message');
     636                        elseif ( strpos( $redirect_to, 'about.php?updated' ) )
     637                                $this->errors->add('updated', __( '<strong>You have successfully updated WordPress!</strong> Please log back in to see what&#8217;s new.' ), 'message' );
     638                }
     639
     640                /**
     641                 * Filter the login page errors.
     642                 *
     643                 * @since 3.6.0
     644                 *
     645                 * @param object $errors      WP Error object.
     646                 * @param string $redirect_to Redirect destination URL.
     647                 */
     648                $this->errors = apply_filters( 'wp_login_errors', $this->errors, $this->redirect_to );
     649
     650                // Clear any stale cookies.
     651                if ( $this->is_reauth_required() )
     652                        wp_clear_auth_cookie();
     653        }
     654
     655        /**
     656         * Output the login form.
     657         *
     658         * @since unknown
     659         */
     660        public function login_form() {
     661                // Don't show the form if this is a successful interim login
     662                if ( $this->is_interim_login() && ! empty( $this->user ) )
     663                        return;
     664
     665                $user_login = '';
     666                if ( isset( $_POST['log'] ) )
     667                        $user_login = ( 'incorrect_password' == $this->errors->get_error_code() || 'empty_password' == $this->errors->get_error_code() ) ? esc_attr( wp_unslash( $_POST['log'] ) ) : '';
     668                $rememberme = ! empty( $_POST['rememberme'] );
     669
     670                if ( ! empty( $errors->errors ) ) {
     671                        $aria_describedby_error = ' aria-describedby="login_error"';
     672                } else {
     673                        $aria_describedby_error = '';
     674                }
     675                ?>
     676
     677                <form name="loginform" id="loginform" action="<?php echo esc_url( wp_login_url() ); ?>" method="post">
     678                        <p>
     679                                <label for="user_login"><?php _e( 'Username' ) ?><br />
     680                                <input type="text" name="log" id="user_login"<?php echo $aria_describedby_error; ?> class="input" value="<?php echo esc_attr( $user_login ); ?>" size="20" /></label>
     681                        </p>
     682                        <p>
     683                                <label for="user_pass"><?php _e( 'Password' ) ?><br />
     684                                <input type="password" name="pwd" id="user_pass"<?php echo $aria_describedby_error; ?> class="input" value="" size="20" /></label>
     685                        </p>
     686
     687                        <?php
     688                        /**
     689                         * Fires following the 'Password' field in the login form.
     690                         *
     691                         * @since 2.1.0
     692                         */
     693                        do_action( 'login_form' ); ?>
     694
     695                        <p class="forgetmenot">
     696                                <label for="rememberme"><input name="rememberme" type="checkbox" id="rememberme" value="forever" <?php checked( $rememberme ); ?> /> <?php esc_attr_e( 'Remember Me' ); ?></label>
     697                        </p>
     698
     699                        <p class="submit">
     700                                <input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e( 'Log In' ); ?>" />
     701
     702                                <?php if ( $this->is_interim_login() ) : ?>
     703                                <input type="hidden" name="interim-login" value="1" />
     704                                <?php else : ?>
     705                                <input type="hidden" name="redirect_to" value="<?php echo esc_attr( $this->redirect_to ); ?>" />
     706                                <?php endif; ?>
     707
     708                                <?php if ( $this->is_customize_login() ) : ?>
     709                                <input type="hidden" name="customize-login" value="1" />
     710                                <?php endif; ?>
     711
     712                                <input type="hidden" name="testcookie" value="1" />
     713                        </p>
     714                </form>
     715                <?php
     716        }
     717
     718        /**
     719         * Output the page title.
     720         *
     721         * @since unknown
     722         */
     723        public function title() {
     724                switch ( $this->action ) {
     725                        case 'lostpassword' :
     726                        case 'retrievepassword' :
     727                                $title = __( 'Lost Password' );
     728                                break;
     729
     730                        case 'resetpass' :
     731                        case 'rp' :
     732                                $title = did_action( 'password_reset' ) ? __( 'Password Reset' ) : __( 'Reset Password' );
     733                                break;
     734
     735                        case 'register' :
     736                                $title = __( 'Registration Form' );
     737                                break;
     738
     739                        case 'login':
     740                        default:
     741                                $title = __( 'Log In' );
     742                }
     743
     744                echo $title;
     745        }
     746
     747        /**
     748         * Output the header.
     749         *
     750         * @since unknown
     751         */
     752        public function header() {
     753                if ( is_multisite() ) {
     754                        $login_header_url   = network_home_url();
     755                        $login_header_title = get_current_site()->site_name;
     756                } else {
     757                        $login_header_url   = __( 'https://wordpress.org/' );
     758                        $login_header_title = __( 'Powered by WordPress' );
     759                }
     760
     761                /**
     762                 * Filter link URL of the header logo above login form.
     763                 *
     764                 * @since 2.1.0
     765                 *
     766                 * @param string $login_header_url Login header logo URL.
     767                 */
     768                $login_header_url = apply_filters( 'login_headerurl', $login_header_url );
     769                /**
     770                 * Filter the title attribute of the header logo above login form.
     771                 *
     772                 * @since 2.1.0
     773                 *
     774                 * @param string $login_header_title Login header logo title attribute.
     775                 */
     776                $login_header_title = apply_filters( 'login_headertitle', $login_header_title );
     777                ?>
     778
     779                <h1><a href="<?php echo esc_url( $login_header_url ); ?>" title="<?php echo esc_attr( $login_header_title ); ?>" tabindex="-1"><?php bloginfo( 'name' ); ?></a></h1>
     780
     781                <?php
     782        }
     783
     784        /**
     785         * Output the message above the form.
     786         *
     787         * @since unknown
     788         */
     789        public function message() {
     790                switch ( $this->action ) {
     791                        case 'lostpassword' :
     792                        case 'retrievepassword' :
     793                                $message = __( 'Please enter your username or email address. You will receive a link to create a new password via email.' );
     794                                $class = 'message';
     795                                break;
     796
     797                        case 'resetpass' :
     798                        case 'rp' :
     799                                if ( did_action( 'password_reset' ) ) {
     800                                        $message = __( 'Your password has been reset.' ) . ' <a href="' . esc_url( wp_login_url() ) . '">' . __( 'Log in' ) . '</a>';
     801                                } else {
     802                                        $message = __( 'Enter your new password below.' );
     803                                }
     804                                $class = 'message reset-pass';
     805                                break;
     806
     807                        case 'register' :
     808                                $message =  __( 'Register For This Site' );
     809                                $class = 'message register';
     810                                break;
     811
     812                        case 'login' :
     813                        default :
     814                                $message = ( $this->is_interim_login() && ! empty( $this->user ) ) ? __( 'You have logged in successfully.' ) : '';
     815                                $class = 'message';
     816                }
     817
     818                /**
     819                 * Filter the message to display above the login form.
     820                 *
     821                 * @since 2.1.0
     822                 *
     823                 * @param string $message Login message text.
     824                 */
     825                $message = apply_filters( 'login_message', $message );
     826
     827                if ( ! empty( $message ) )
     828                        echo '<p class="' . $class . '">' . $message . "</p>\n";
     829        }
     830
     831        /**
     832         * Output the errors.
     833         *
     834         * @since unknown
     835         */
     836        public function errors() {
     837                global $error;
     838
     839                // In case a plugin uses $error rather than the $wp_errors object
     840                if ( ! empty( $error ) ) {
     841                        $this->errors->add( 'error', $error );
     842                        unset( $error );
     843                }
     844
     845                if ( $this->has_errors() ) {
     846                        $errors = '';
     847                        $messages = '';
     848                        foreach ( $this->errors->get_error_codes() as $code ) {
     849                                $severity = $this->errors->get_error_data( $code );
     850                                foreach ( $this->errors->get_error_messages( $code ) as $error_message ) {
     851                                        if ( 'message' == $severity )
     852                                                $messages .= '  ' . $error_message . "<br />\n";
     853                                        else
     854                                                $errors .= '    ' . $error_message . "<br />\n";
     855                                }
     856                        }
     857                        if ( ! empty( $errors ) ) {
     858                                /**
     859                                 * Filter the error messages displayed above the login form.
     860                                 *
     861                                 * @since 2.1.0
     862                                 *
     863                                 * @param string $errors Login error message.
     864                                 */
     865                                echo '<div id="login_error">' . apply_filters( 'login_errors', $errors ) . "</div>\n";
     866                        }
     867                        if ( ! empty( $messages ) ) {
     868                                /**
     869                                 * Filter instructional messages displayed above the login form.
     870                                 *
     871                                 * @since 2.5.0
     872                                 *
     873                                 * @param string $messages Login messages.
     874                                 */
     875                                echo '<p class="message">' . apply_filters( 'login_messages', $messages ) . "</p>\n";
     876                        }
     877                }
     878        }
     879
     880        /**
     881         * Output the form.
     882         *
     883         * @since unknown
     884         */
     885        public function form() {
     886                /**
     887                 * Fires when the login form is initialized.
     888                 *
     889                 * @since 3.2.0
     890                 */
     891                do_action( 'login_init' );
     892
     893                /**
     894                 * Fires before a specified login form action.
     895                 *
     896                 * The dynamic portion of the hook name, `$action`, refers to the action
     897                 * that brought the visitor to the login form. Actions include 'postpass',
     898                 * 'logout', 'lostpassword', etc.
     899                 *
     900                 * @since 2.8.0
     901                 */
     902                do_action( 'login_form_' . $this->action );
     903
     904                switch ( $this->action ) {
     905                        case 'lostpassword' :
     906                        case 'retrievepassword' :
     907                                $this->lost_password_form();
     908                                break;
     909
     910                        case 'resetpass' :
     911                        case 'rp' :
     912                                $this->reset_password_form();
     913                                break;
     914
     915                        case 'register' :
     916                                $this->register_form();
     917                                break;
     918
     919                        case 'login' :
     920                        default :
     921                                $this->login_form();
     922                                break;
     923                }
     924        }
     925
     926        /**
     927         * Output the nav links at the bottom of the form.
     928         *
     929         * @since unknown
     930         */
     931        public function navigation() {
     932                $links = array(
     933                        'login' => sprintf(
     934                                '<a href="%1$s">%2$s</a>',
     935                                esc_url( wp_login_url() ),
     936                                __( 'Log in' )
     937                        ),
     938
     939                        'register' => sprintf(
     940                                '<a href="%1$s">%2$s</a>',
     941                                esc_url( apply_filters( 'register', wp_registration_url() ) ),
     942                                __( 'Register' )
     943                        ),
     944
     945                        'lostpassword' => sprintf(
     946                                '<a href="%1$s" title="%2$s">%3$s</a>',
     947                                esc_url( wp_lostpassword_url() ),
     948                                esc_attr__( 'Password Lost and Found' ),
     949                                __( 'Lost your password?' )
     950                        )
     951                );
     952
     953                if ( ! get_option( 'users_can_register' ) )
     954                        unset( $links['register'] );
     955
     956                switch ( $this->action ) {
     957                        case 'lostpassword' :
     958                        case 'retrievepassword' :
     959                        case 'resetpass' :
     960                        case 'rp' :
     961                                unset( $links['lostpassword'] );
     962
     963                                if ( did_action( 'password_reset' ) )
     964                                        $links = array();
     965                                break;
     966
     967                        case 'register' :
     968                                unset( $links['register'] );
     969                                break;
     970
     971                        case 'login' :
     972                        default :
     973                                unset( $links['login'] );
     974
     975                                if ( isset( $_GET['checkemail'] ) && in_array( $_GET['checkemail'], array( 'confirm', 'newpass' ) ) )
     976                                        $links = array();
     977
     978                                if ( $this->is_interim_login() )
     979                                        $links = array();
     980                }
     981                ?>
     982
     983                <p id="nav">
     984                        <?php echo implode( ' | ', $links ); ?>
     985                </p>
     986
     987                <?php if ( ! $this->is_interim_login() ): ?>
     988                <p id="backtoblog">
     989                        <a href="<?php echo esc_url( home_url( '/' ) ); ?>" title="<?php esc_attr_e( 'Are you lost?' ); ?>"><?php printf( __( '&larr; Back to %s' ), get_bloginfo( 'title', 'display' ) ); ?></a>
     990                </p>
     991                <?php endif;
     992        }
     993
     994        /**
     995         * Output the body class.
     996         *
     997         * @since unknown
     998         */
     999        public function body_class() {
     1000                $classes = array(
     1001                        'login-action-' . $this->action,
     1002                        'wp-core-ui'
     1003                );
     1004
     1005                if ( wp_is_mobile() )
     1006                        $classes[] = 'mobile';
     1007
     1008                if ( is_rtl() )
     1009                        $classes[] = 'rtl';
     1010
     1011                if ( $this->is_interim_login() ) {
     1012                        $classes[] = 'interim-login';
     1013
     1014                        if ( $this->is_post_request() && ! empty( $this->user ) )
     1015                                $classes[] = 'interim-login-success';
     1016                }
     1017
     1018                if ( $this->is_customize_login() )
     1019                        $classes[] = 'customize-login';
     1020
     1021                $classes[] =' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );
     1022
     1023                if ( $this->has_errors() ) {
     1024
     1025                        if ( 'loggedout' == $this->errors->get_error_code() )
     1026                                $classes[] = 'loggedout';
     1027
     1028                        if ( ! wp_is_mobile() ) {
     1029                                // Shake it!
     1030                                $shake_error_codes = array(
     1031                                        'empty_password',
     1032                                        'empty_email',
     1033                                        'invalid_email',
     1034                                        'invalidcombo',
     1035                                        'empty_username',
     1036                                        'invalid_username',
     1037                                        'incorrect_password'
     1038                                );
     1039
     1040                                /**
     1041                                 * Filter the error codes array for shaking the login form.
     1042                                 *
     1043                                 * @since 3.0.0
     1044                                 *
     1045                                 * @param array $shake_error_codes Error codes that shake the login form.
     1046                                 */
     1047                                $shake_error_codes = apply_filters( 'shake_error_codes', $shake_error_codes );
     1048
     1049                                if ( $shake_error_codes && in_array( $this->errors->get_error_code(), $shake_error_codes ) )
     1050                                        $classes[] = 'shake';
     1051                        }
     1052                }
     1053
     1054                /**
     1055                 * Filter the login page body classes.
     1056                 *
     1057                 * @since 3.5.0
     1058                 *
     1059                 * @param array  $classes An array of body classes.
     1060                 * @param string $action  The action that brought the visitor to the login page.
     1061                 */
     1062                $classes = apply_filters( 'login_body_class', $classes, $this->action );
     1063
     1064                // Login cannot be removed
     1065                array_unshift( $classes, 'login' );
     1066
     1067                echo implode( ' ', $classes );
     1068        }
     1069
     1070        /**
     1071         * Output the header title.
     1072         *
     1073         * @since unknown
     1074         */
     1075        public function header_title() {
     1076                $header_title = is_multisite() ? get_current_site()->site_name : __( 'Powered by WordPress' );
     1077                /**
     1078                 * Filter the title attribute of the header logo above login form.
     1079                 *
     1080                 * @since 2.1.0
     1081                 *
     1082                 * @param string $header_title Login header logo title attribute.
     1083                 */
     1084                $header_title = apply_filters( 'login_headertitle', $header_title );
     1085
     1086                echo esc_attr( $header_title );
     1087        }
     1088
     1089        /**
     1090         * Output the header URL.
     1091         *
     1092         * @since unknown
     1093         */
     1094        public function header_url() {
     1095                $header_url = is_multisite() ? network_home_url() : __( 'https://wordpress.org/' );
     1096                /**
     1097                 * Filter link URL of the header logo above login form.
     1098                 *
     1099                 * @since 2.1.0
     1100                 *
     1101                 * @param string $header_url Login header logo URL.
     1102                 */
     1103                $header_url = apply_filters( 'login_headerurl', $header_url );
     1104
     1105                echo esc_url( $header_url );
     1106        }
     1107
     1108        /**
     1109         * Determine if there are any errors.
     1110         *
     1111         * @since unknown
     1112         *
     1113         * @return bool True if there are errors, false if not.
     1114         */
     1115        public function has_errors() {
     1116                return (bool) $this->errors->get_error_code();
     1117        }
     1118
     1119        /**
     1120         * Determine if the current request is a POST request.
     1121         *
     1122         * @since unknown
     1123         *
     1124         * @return bool True if this is a POST request, false if not.
     1125         */
     1126        public function is_post_request() {
     1127                return ( 'POST' == $_SERVER['REQUEST_METHOD'] );
     1128        }
     1129
     1130        /**
     1131         * Determine if reauthorizaiton is required.
     1132         *
     1133         * @since unknown
     1134         *
     1135         * @return bool True if reauthorization is required, false if not.
     1136         */
     1137        public function is_reauth_required() {
     1138                return isset( $_REQUEST['reauth'] );
     1139        }
     1140
     1141        /**
     1142         * Determine if the current request is an intermin login request.
     1143         *
     1144         * @since unknown
     1145         *
     1146         * @return bool True if this is an interim login, false if not.
     1147         */
     1148        public function is_interim_login() {
     1149                return isset( $_REQUEST['interim-login'] );
     1150        }
     1151
     1152        /**
     1153         * Determine if the current request is a customize login request.
     1154         *
     1155         * @since unknown
     1156         */
     1157        public function is_customize_login() {
     1158                return isset( $_REQUEST['customize-login'] );
     1159        }
     1160}