call_pro('check_captcha', 'login'); // Nonce is checked, get the POST data and sign user on $info = array(); $info['user_login'] = sanitize_text_field(trim($_POST['username'])); $info['user_password'] = sanitize_text_field(trim($_POST['password'])); $info['remember'] = isset($_POST['remember-me']) ? true : false; if ( !$info['user_login'] ) { wp_send_json_error(array('message' => LRM_Settings::get()->setting('messages/login/no_login'), 'for'=>'username')); } if ( !$info['user_password'] ) { wp_send_json_error(array('message' => LRM_Settings::get()->setting('messages/login/no_pass'), 'for'=>'password')); } $secure_cookie = is_ssl(); // If the user wants ssl but the session is not ssl, force a secure cookie. if ( !$secure_cookie && !empty($info['user_login']) && !force_ssl_admin() ) { $user_name = sanitize_user($info['user_login']); $user = get_user_by( 'login', $user_name ); if ( ! $user && strpos( $user_name, '@' ) ) { $user = get_user_by( 'email', $user_name ); } if ( $user ) { if ( get_user_option('use_ssl', $user->ID) ) { $secure_cookie = true; force_ssl_admin(true); } } } $user_signon = wp_signon( $info, $secure_cookie ); if ( !is_wp_error($user_signon) && empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) { if ( headers_sent() ) { /* translators: 1: Browser cookie documentation URL, 2: Support forums URL */ $user_signon = new WP_Error( 'test_cookie', sprintf( __( 'ERROR: Cookies are blocked due to unexpected output. For help, please see this documentation or try the support forums.' ), __( 'https://codex.wordpress.org/Cookies' ), __( 'https://wordpress.org/support/' ) ) ); } } if ( is_wp_error($user_signon) ){ do_action('lrm/login_fail', $user_signon); wp_send_json_error(array('message'=>implode('
', $user_signon->get_error_messages()))); } else { do_action('lrm/login_successful', $user_signon); $message = LRM_Settings::get()->setting('general/registration/reload_after_login') ? LRM_Settings::get()->setting('messages/login/success') : LRM_Settings::get()->setting('messages/login/success_no_reload'); $action = lrm_setting('redirects/login/action'); $redirect_url = LRM_Redirects_Manager::get_redirect( 'login', $user_signon->ID ); wp_send_json_success(array( 'logged_in' => true, 'user_id' => $user_signon->ID, 'message' => $message, 'action' => $redirect_url ? 'redirect' : $action, 'redirect_url'=> $redirect_url, )); } } public static function signup() { // Verify nonce self::_verify_nonce( 'security-signup', 'ajax-signup-nonce' ); LRM_Core::get()->call_pro('check_captcha', 'signup' ); if ( !apply_filters('lrm/users_can_register', get_option("users_can_register") ) ) : wp_send_json_error(array('message' => LRM_Settings::get()->setting('messages/registration/disabled'))); endif; $email = sanitize_email($_POST['email']); // Post values if ( ! LRM_Settings::get()->setting('general_pro/all/hide_username') ) { $user_login = sanitize_user(trim($_POST['username'])); } else { $email_arr = explode('@', $email); $user_login = sanitize_user(trim($email_arr[0]), true); $user_exists = get_user_by( 'login', $user_login ); if ( $user_exists ) { $user_login .= '_' . rand(99, 999); } } $display_first_and_last_name = LRM_Settings::get()->setting('general/registration/display_first_and_last_name'); $first_name = ''; $last_name = ''; if ( $display_first_and_last_name ) { $first_name = sanitize_text_field( $_POST['first-name'] ); $last_name = ! empty($_POST['last-name']) ? sanitize_text_field( $_POST['last-name'] ) : ''; } if ( !empty( $_POST['password'] ) && LRM_Settings::get()->setting('general_pro/all/allow_user_set_password') ) { $password = sanitize_text_field($_POST['password']); // Defined in: "\wp-includes\default-filters.php" remove_action( 'register_new_user', 'wp_send_new_user_notifications' ); } else { $password = wp_generate_password(10, true); } if ( !$user_login ) { wp_send_json_error(array('message' => LRM_Settings::get()->setting('messages/registration/no_username'), 'for'=>'username')); } if ( $display_first_and_last_name && !$first_name ) { wp_send_json_error(array('message' => LRM_Settings::get()->setting('messages/registration/no_name'), 'for'=>'first-name')); } if ( !$email || !is_email($email) ) { wp_send_json_error(array('message' => LRM_Settings::get()->setting('messages/registration/wrong_email'), 'for'=>'email')); } // $user_login = sanitize_user( sanitize_title_with_dashes($first_name . '_' . $last_name) ); // // $user_login = rtrim($user_login, '_-'); // !! Disable system Emails // TODO - allow change this in settings // For "wp_update_user" remove_action( 'register_new_user', 'wp_send_new_user_notifications' ); // For "wp_update_user" add_filter( 'send_password_change_email', '__return_false' ); $user_id = register_new_user( $user_login, $email ); if ( is_wp_error($user_id) ) { wp_send_json_error(array( 'message' => implode('
' ,$user_id->get_error_messages()), 'from' => 'register_new_user' )); } /** * IMPORTANT: You should make server side validation here! */ $userdata = array( 'ID' => $user_id, 'user_pass' => $password, 'user_email' => $email, ); if ( $display_first_and_last_name ) { $userdata['first_name'] = $first_name; $userdata['last_name'] = $last_name; $userdata['nickname'] = $first_name . ' ' . $last_name; } else { $userdata['nickname'] = $user_login; } $user_id = wp_update_user( $userdata ); // Return if( !is_wp_error($user_id) ) { do_action('lrm/registration_successful', $user_id); /** * Tweak in case other plugins has changed user login during insert to DB * @since 1.41 */ $user = get_user_by( 'ID', $user_id ); // Is user logged in? $user_signon = false; //if ( ! LRM_Settings::get()->setting('general/registration/user_must_confirm_email') ) { // TODO - migrate setting?? if ( in_array( lrm_setting('redirects/registration/action'), ['auto-login', 'reload', 'redirect'] ) ) { $info = array(); $info['user_login'] = $user->user_login; $info['user_password'] = $userdata['user_pass']; $info['remember'] = true; $user_signon = wp_signon( $info ); } if ( apply_filters( "lrm/mails/registration/is_need_send", true, $user_id, $userdata, $user_signon) ) { $subject = LRM_Settings::get()->setting('mails/registration/subject'); $mail_body = str_replace( array( '{{FIRST_NAME}}', '{{LAST_NAME}}', '{{USERNAME}}', '{{PASSWORD}}', '{{LOGIN_URL}}', ), array( $user->first_name, $user->last_name, $user->user_login, $userdata['user_pass'], wp_login_url(), ), LRM_Settings::get()->setting('mails/registration/body') ); $mail_body = apply_filters("lrm/mails/registration/body", $mail_body, $user->user_login, $userdata); $mail_sent = LRM_Mailer::send($email, $subject, $mail_body, 'registration'); } if ( LRM_Settings::get()->setting('mails/admin_new_user/on') ) { // Admin Notification $switched_locale = switch_to_locale(get_locale()); $mail_body = str_replace( array( '{{FIRST_NAME}}', '{{LAST_NAME}}', '{{USERNAME}}', '{{EMAIL}}', '{{USER_ADMIN_URL}}', ), array( $user->first_name, $user->last_name, $user->user_login, $email, admin_url( 'user-edit.php?user_id=' . $user_id ), ), LRM_Settings::get()->setting('mails/admin_new_user/body') ); $wp_new_user_notification_email_admin = array( 'to' => get_option('admin_email'), /* translators: Password change notification email subject. %s: Site title */ 'subject' => LRM_Settings::get()->setting('mails/admin_new_user/subject'), 'message' => $mail_body, 'headers' => '', ); /** * Filters the contents of the new user notification email sent to the site admin. * * @since 4.9.0 * * @param array $wp_new_user_notification_email { * Used to build wp_mail(). * * @type string $to The intended recipient - site admin email address. * @type string $subject The subject of the email. * @type string $message The body of the email. * @type string $headers The headers of the email. * } * @param WP_User $user User object for new user. * @param string $blogname The site title. */ $wp_new_user_notification_email_admin = apply_filters('wp_new_user_notification_email_admin', $wp_new_user_notification_email_admin, $user_id, $blogname); LRM_Mailer::send( $wp_new_user_notification_email_admin['to'], wp_specialchars_decode($wp_new_user_notification_email_admin['subject']), $wp_new_user_notification_email_admin['message'], 'registration_admin', $wp_new_user_notification_email_admin['headers'] ); if ($switched_locale) { restore_previous_locale(); } } if ( class_exists( 'WCVendors_Pro' ) ) { /** * Tweaks for WC Vendors plugin * @since 1.38 */ do_action('woocommerce_created_customer', $user_id, $userdata, $userdata['user_pass']); } if ( is_wp_error($user_signon) ) { wp_send_json_success( array( 'logged_in' => false, 'message' => $user_signon->get_error_message(), ) ); } $action = lrm_setting('redirects/registration/action'); $redirect_url = $user_signon ? LRM_Redirects_Manager::get_redirect( 'registration', $user_signon->ID ) : ''; wp_send_json_success( array( 'logged_in' => $user_signon ? true : false, 'user_id' => $user_id ? $user_id : false, 'message' => $user_signon ? lrm_setting( 'messages/registration/success' ) : lrm_setting( 'messages/registration/success_please_login' ), 'redirect_url' => $redirect_url, 'action' => $action, ) ); } else { do_action('lrm/registration_fail', $user_id); wp_send_json_error(array( 'message'=> implode('
', $user_id->get_error_messages()) )); } } public static function lostpassword() { // First check the nonce, if it fails the function will break self::_verify_nonce( 'security-lostpassword', 'ajax-forgot-nonce' ); $errors = new WP_Error(); $account = sanitize_text_field( trim($_POST['user_login']) ); LRM_Core::get()->call_pro('check_captcha', 'lostpassword'); if( empty( $account ) ) { $errors->add('invalid_email', LRM_Settings::get()->setting('messages/lost_password/invalid_email')); } else { if(is_email( $account )) { if( email_exists($account) ) $get_by = 'email'; else $errors->add('email_not_exists', LRM_Settings::get()->setting('messages/lost_password/email_not_exists')); } else if (validate_username( $account )) { if( username_exists($account) ) $get_by = 'login'; else $errors->add('user_not_exists', LRM_Settings::get()->setting('messages/lost_password/user_not_exists')); } else $errors->add('invalid_email_or_username', LRM_Settings::get()->setting('messages/lost_password/invalid_email_or_username')); } /** * Fires before errors are returned from a password reset request. * * @since 2.1.0 * @since 4.4.0 Added the `$errors` parameter. * * @param WP_Error $errors A WP_Error object containing any errors generated * by using invalid credentials. */ do_action( 'lostpassword_post', $errors ); if( !$errors->get_error_messages() ) { // For "wp_update_user" add_filter( 'send_password_change_email', '__return_false' ); // lets generate our new password // Get user data by field and data, fields are id, slug, email and login $user = get_user_by( $get_by, $account ); $password_reset_key = get_password_reset_key( $user ); // if update user return true then lets send user an email containing the new password if( $password_reset_key && ! is_wp_error($password_reset_key) ) { $to = $user->user_email; $subject = LRM_Settings::get()->setting('mails/lost_password/subject'); $reset_pass_url = LRM_Pages_Manager::get_password_reset_url($password_reset_key, $user); // The blogname option is escaped with esc_html on the way into the database in sanitize_option // we want to reverse this for the plain text arena of emails. $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); $mail_body = str_replace( array( '{{USERNAME}}', '{{CHANGE_PASSWORD_URL}}', '{{LOGIN_URL}}', ), array( $user->user_login, $reset_pass_url, wp_login_url(), ), LRM_Settings::get()->setting('mails/lost_password/body') ); $mail_sent = LRM_Mailer::send( $to, $subject, $mail_body, 'lost_password' ); if( !$mail_sent ) { $errors->add('unable_send', LRM_Settings::get()->setting('messages/lost_password/unable_send')); } } else { $err_msg = LRM_Settings::get()->setting('messages/lost_password/something_wrong'); if ( is_wp_error($password_reset_key) ) { $err_msg .= ' ' . $password_reset_key->get_error_message(); } $errors->add('something_wrong', $err_msg); } } // Return if( $errors->get_error_messages() ) { do_action('lrm/lost_password_fail', $errors); wp_send_json_error(array( 'message'=> implode('
', $errors->get_error_messages()) )); } else { do_action('lrm/lost_password_successful', false); wp_send_json_success(array( 'message'=>LRM_Settings::get()->setting('messages/lost_password/success') )); } } /** * AJAX call */ public static function password_reset() { self::_verify_nonce('security-password-reset2', 'ajax-password-reset-nonce' ); if ( ! isset( $_POST['password1'] ) || empty( trim($_POST['password1']) ) ) { wp_send_json_error(array('message' => lrm_setting('messages/password/password_is_missing'), 'for'=>'password1')); } $errors = new WP_Error(); $rp_data = self::_validate_password_reset($errors); if ( $errors->get_error_code() ) { wp_send_json_error(array( 'message'=> implode('
', $errors->get_error_messages()) )); } $new_pass = wp_unslash( trim($_POST['password1']) ); list($rp_key, $rp_login, $rp_path, $user) = $rp_data; $rp_cookie = 'wp-resetpass-' . COOKIEHASH; /** * Fires before the password reset procedure is validated. * * @since 3.5.0 * * @param object $errors WP Error object. * @param WP_User|WP_Error $user WP_User object if the login and reset key match. WP_Error object otherwise. */ do_action( 'validate_password_reset', $errors, $user ); if ( ( ! $errors->get_error_code() ) && $new_pass ) { reset_password($user, $new_pass); setcookie( $rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true ); wp_send_json_success(array( 'message'=> __( 'Your password has been reset.' ) . ' ' . __( 'Log in' ) . '' )); } wp_send_json_error(array( 'message'=> implode('
', $errors->get_error_messages()) )); } /** * @param WP_Error $errors * @return array */ public static function _validate_password_reset($errors ) { if ( ! isset( $_REQUEST['key'] ) || empty( $_REQUEST['key'] ) ) { $errors->add( 'empty_key', __( 'Your password reset link key is missing.' ) ); } if ( ! isset( $_REQUEST['login'] ) || empty( $_REQUEST['login'] ) ) { $errors->add( 'empty_login', __( 'Your password reset link login is missing.' ) ); } if ( $errors->get_error_code() ) { return []; } list( $rp_path ) = explode( '?', wp_unslash( $_SERVER['REQUEST_URI'] ) ); $rp_key = wp_unslash( $_REQUEST['key'] ); $rp_login = wp_unslash( $_REQUEST['login'] ); // // if ( isset( $_GET['key'] ) ) { // $value = sprintf( '%s:%s', wp_unslash( $_GET['login'] ), wp_unslash( $_GET['key'] ) ); // setcookie( $rp_cookie, $value, 0, $rp_path, COOKIE_DOMAIN, is_ssl(), true ); // wp_safe_redirect( remove_query_arg( array( 'key', 'login' ) ) ); // exit; // } $user = false; if ( $rp_key && $rp_login ) { $user = check_password_reset_key( $rp_key, $rp_login ); if ( $user && ! hash_equals( $rp_key, $rp_key ) ) { $user = false; } } else { $user = false; } if ( ! $user || is_wp_error( $user ) ) { $request_msg = ' ' . sprintf( __( 'Please request a new link.'), site_url('wp-login.php?action=lostpassword') ); //setcookie( $rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true ); if ( $user && $user->get_error_code() === 'expired_key' ) { $errors->add('invalidkey', __('Your password reset link appears to be invalid.') . $request_msg); //wp_redirect( site_url( 'wp-login.php?action=lostpassword&error=expiredkey' ) ); } else { $errors->add('expiredkey', __('Your password reset link has expired.') . $request_msg); //wp_redirect( site_url( 'wp-login.php?action=lostpassword&error=invalidkey' ) ); } } return [$rp_key, $rp_login, $rp_path, $user]; } public static function _verify_nonce( $post_key, $nonce_key ) { if ( defined("WP_CACHE") ) { return true; } if ( !isset($_POST[$post_key]) || !wp_verify_nonce($_POST[$post_key], $nonce_key) ) { wp_send_json_error(array('message' => LRM_Settings::get()->setting('messages/other/invalid_nonce'))); } } }