| @@ -1,204 +1,727 @@ | ||
| 1 | -<?php | |
| 2 | -// add hidden input to our form to identify that is a profile builder form | |
| 3 | -function wppb_login_form_bottom( $form_part, $args ){ | |
| 4 | - // we set this id in the wp_login_form() function | |
| 5 | - if( $args['id_submit'] == 'wppb-submit' ){ | |
| 6 | - if( in_the_loop() ) | |
| 7 | - $form_location = 'page'; | |
| 8 | - else | |
| 9 | - $form_location = 'widget'; | |
| 10 | - | |
| 11 | - $form_part = '<input type="hidden" name="wppb_login" value="true"/>'; | |
| 12 | - $form_part .= '<input type="hidden" name="wppb_form_location" value="'. $form_location .'"/>'; | |
| 13 | - $form_part .= '<input type="hidden" name="wppb_request_url" value="'.wppb_curpageurl().'"/>'; | |
| 14 | - $form_part .= '<input type="hidden" name="wppb_lostpassword_url" value="'.$args['lostpassword_url'].'"/>'; | |
| 15 | - } | |
| 16 | - | |
| 17 | - return $form_part; | |
| 18 | -} | |
| 19 | -add_filter( 'login_form_bottom', 'wppb_login_form_bottom', 10, 2 ); | |
| 20 | - | |
| 21 | -// when email login is enabled we need to change the post data for the username | |
| 22 | -function wppb_change_login_with_email(){ | |
| 23 | - if( !empty( $_POST['log'] ) ){ | |
| 24 | - // only do this for our form | |
| 25 | - if( isset( $_POST['wppb_login'] ) ){ | |
| 26 | - global $wpdb, $_POST; | |
| 27 | - | |
| 28 | - $wppb_generalSettings = get_option( 'wppb_general_settings' ); | |
| 29 | - | |
| 30 | - // if this setting is active, the posted username is, in fact the user's email | |
| 31 | - if( isset( $wppb_generalSettings['loginWith'] ) && ( $wppb_generalSettings['loginWith'] == 'email' ) ){ | |
| 32 | - $username = $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM $wpdb->users WHERE user_email= %s LIMIT 1", trim( $_POST['log'] ) ) ); | |
| 33 | - | |
| 34 | - if( !empty( $username ) ) | |
| 35 | - $_POST['log'] = $username; | |
| 36 | - | |
| 37 | - else{ | |
| 38 | - // if we don't have a username for the email entered we can't have an empty username because we will receive a field empty error | |
| 39 | - $_POST['log'] = 'this_is_an_invalid_email'.time(); | |
| 40 | - } | |
| 41 | - } | |
| 42 | - } | |
| 43 | - } | |
| 44 | -} | |
| 45 | -add_action( 'login_init', 'wppb_change_login_with_email' ); | |
| 46 | - | |
| 47 | -// login redirect filter. used to redirect from wp-login.php if it errors out | |
| 48 | -function wppb_login_redirect( $redirect_to, $redirect_url, $user ){ | |
| 49 | - // if login action initialized by our form | |
| 50 | - if( isset( $_POST['wppb_login'] ) ){ | |
| 51 | - if( is_wp_error( $user ) ) { | |
| 52 | - // if we don't have a successful login we must redirect to the url of the form, so make sure this happens | |
| 53 | - $redirect_to = $_POST['wppb_request_url']; | |
| 54 | - $request_form_location = $_POST['wppb_form_location']; | |
| 55 | - $error_string = $user->get_error_message(); | |
| 56 | - | |
| 57 | - $wppb_generalSettings = get_option('wppb_general_settings'); | |
| 58 | - | |
| 59 | - if (isset($wppb_generalSettings['loginWith'])) { | |
| 60 | - $LostPassURL = home_url('/wp-login.php?action=lostpassword'); | |
| 61 | - | |
| 62 | - // if the Login shortcode has a lostpassword argument set, give the lost password error link that value | |
| 63 | - if (!empty($_POST['wppb_lostpassword_url'])) { | |
| 64 | - if ( wppb_check_missing_http( $_POST['wppb_lostpassword_url'] ) ) $LostPassURL = "http://" . $_POST['wppb_lostpassword_url']; | |
| 65 | - else $LostPassURL = $_POST['wppb_lostpassword_url']; | |
| 66 | - } | |
| 67 | - | |
| 68 | - //apply filter to allow changing Lost your Password link | |
| 69 | - $LostPassURL = apply_filters('wppb_pre_login_url_filter', $LostPassURL); | |
| 70 | - | |
| 71 | - if ($user->get_error_code() == 'incorrect_password') { | |
| 72 | - $error_string = '<strong>' . __('ERROR', 'profilebuilder') . '</strong>: ' . __('The password you entered is incorrect.', 'profilebuilder') . ' '; | |
| 73 | - $error_string .= '<a href="' . $LostPassURL . '" title="' . __('Password Lost and Found.', 'profilebuilder') . '">' . __('Lost your password', 'profilebuilder') . '</a>?'; | |
| 74 | - | |
| 75 | - // change the recover password link | |
| 76 | - $error_string = str_replace(home_url('/wp-login.php?action=lostpassword'), $LostPassURL, $error_string); | |
| 77 | - } | |
| 78 | - if ($user->get_error_code() == 'invalid_username') { | |
| 79 | - $error_string = '<strong>' . __('ERROR', 'profilebuilder') . '</strong>: ' . __('Invalid username.', 'profilebuilder') . ' '; | |
| 80 | - $error_string .= '<a href="' . $LostPassURL . '" title="' . __('Password Lost and Found.', 'profilebuilder') . '">' . __('Lost your password', 'profilebuilder') . '</a>?'; | |
| 81 | - } | |
| 82 | - // if login with email is enabled change the word username with email | |
| 83 | - if ($wppb_generalSettings['loginWith'] == 'email') | |
| 84 | - $error_string = str_replace( __('username','profilebuilder'), __('email','profilebuilder'), $error_string); | |
| 85 | - | |
| 86 | - } | |
| 87 | - // if the error string is empty it means that none of the fields were completed | |
| 88 | - if (empty($error_string)) { | |
| 89 | - $error_string = '<strong>' . __('ERROR', 'profilebuilder') . '</strong>: ' . __('Both fields are empty.', 'profilebuilder') . ' '; | |
| 90 | - $error_string = apply_filters('wppb_login_empty_fields_error_message', $error_string); | |
| 91 | - } | |
| 92 | - | |
| 93 | - $error_string = apply_filters('wppb_login_wp_error_message', $error_string, $user); | |
| 94 | - | |
| 95 | - // encode the error string and send it as a GET parameter | |
| 96 | - $arr_params = array('loginerror' => urlencode(base64_encode($error_string)), 'request_form_location' => $request_form_location); | |
| 97 | - $redirect_to = add_query_arg($arr_params, $redirect_to); | |
| 98 | - wp_safe_redirect($redirect_to); | |
| 99 | - } | |
| 100 | - else{ | |
| 101 | - // we don't have an error make sure to remove the error from the query arg | |
| 102 | - $redirect_to = remove_query_arg( 'loginerror', $redirect_to ); | |
| 103 | - } | |
| 104 | - } | |
| 105 | - | |
| 106 | - return $redirect_to; | |
| 107 | -} | |
| 108 | -add_filter( 'login_redirect', 'wppb_login_redirect', 10, 3 ); | |
| 109 | - | |
| 110 | - | |
| 111 | -/* shortcode function */ | |
| 112 | -function wppb_front_end_login( $atts ){ | |
| 113 | - | |
| 114 | - extract( shortcode_atts( array( 'display' => true, 'redirect' =>'', 'register_url'=>'', 'lostpassword_url'=>'' ), $atts ) ); | |
| 115 | - | |
| 116 | - $wppb_generalSettings = get_option('wppb_general_settings'); | |
| 117 | - | |
| 118 | - if( !is_user_logged_in() ){ | |
| 119 | - // set up the form arguments | |
| 120 | - $form_args = array( 'echo' => false, 'id_submit' => 'wppb-submit' ); | |
| 121 | - | |
| 122 | - // maybe set up the redirect argument | |
| 123 | - if( empty( $redirect ) ){ | |
| 124 | - $wppb_module_settings = get_option( 'wppb_module_settings' ); | |
| 125 | - if( $wppb_module_settings['wppb_customRedirect'] == 'show' ){ | |
| 126 | - //check to see if the redirect location is not an empty string and is activated | |
| 127 | - $login_redirect_settings = get_option( 'customRedirectSettings' ); | |
| 128 | - | |
| 129 | - // set up the redirect argument to our redirect page | |
| 130 | - if( ( trim( $login_redirect_settings['afterLoginTarget'] ) != '' ) && ( $login_redirect_settings['afterLogin'] == 'yes' ) ){ | |
| 131 | - $redirect_to = trim( $login_redirect_settings['afterLoginTarget'] ); | |
| 132 | - if( wppb_check_missing_http( $redirect_to ) ) | |
| 133 | - $redirect_to = 'http://'. $redirect_to; | |
| 134 | - | |
| 135 | - $form_args['redirect'] = $redirect_to; | |
| 136 | - } | |
| 137 | - } | |
| 138 | - } | |
| 139 | - else | |
| 140 | - $form_args['redirect'] = trim( $redirect ); | |
| 141 | - | |
| 142 | - // change the label argument for username is login with email is enabled | |
| 143 | - if ( isset( $wppb_generalSettings['loginWith'] ) && ( $wppb_generalSettings['loginWith'] == 'email' ) ) | |
| 144 | - $form_args['label_username'] = __( 'Email', 'profilebuilder' ); | |
| 145 | - | |
| 146 | - // initialize our form variable | |
| 147 | - $login_form = ''; | |
| 148 | - | |
| 149 | - // display our login errors | |
| 150 | - if( isset( $_GET['loginerror'] ) || isset( $_POST['loginerror'] ) ){ | |
| 151 | - $loginerror = isset( $_GET['loginerror'] ) ? $_GET['loginerror'] : $_POST['loginerror']; | |
| 152 | - $loginerror = '<p class="wppb-error">'.urldecode( base64_decode( $loginerror ) ).'</p><!-- .error -->'; | |
| 153 | - if( isset( $_GET['request_form_location'] ) ){ | |
| 154 | - if( $_GET['request_form_location'] == 'widget' && !in_the_loop() ){ | |
| 155 | - $login_form .= $loginerror; | |
| 156 | - } | |
| 157 | - elseif( $_GET['request_form_location'] == 'page' && in_the_loop() ){ | |
| 158 | - $login_form .= $loginerror; | |
| 159 | - } | |
| 160 | - } | |
| 161 | - } | |
| 162 | - // build our form | |
| 163 | - $login_form .= '<div id="wppb-login-wrap" class="wppb-user-forms">'; | |
| 164 | - $form_args['lostpassword_url'] = $lostpassword_url; | |
| 165 | - $login_form .= wp_login_form( $form_args ); | |
| 166 | - | |
| 167 | - if ((!empty($register_url)) || (!empty($lostpassword_url))) { | |
| 168 | - $login_form .= '<p class="login-register-lost-password">'; | |
| 169 | - $i = 0; | |
| 170 | - if (!empty($register_url)) { | |
| 171 | - if ( wppb_check_missing_http( $register_url ) ) $register_url = "http://" . $register_url; | |
| 172 | - $login_form .= '<a href="' . esc_url($register_url) . '">'. apply_filters('wppb_login_register_text', __('Register','profilebuilder')) .'</a>'; | |
| 173 | - $i++; | |
| 174 | - } | |
| 175 | - if (!empty($lostpassword_url)) { | |
| 176 | - if ($i != 0) $login_form .= ' | '; | |
| 177 | - if ( wppb_check_missing_http( $lostpassword_url ) ) $lostpassword_url = "http://" . $lostpassword_url; | |
| 178 | - $login_form .= '<a href="'. esc_url($lostpassword_url) .'">'. apply_filters('wppb_login_lostpass_text', __('Lost your password?','profilebuilder')) .'</a>'; | |
| 179 | - } | |
| 180 | - $login_form .= '</p>'; | |
| 181 | - } | |
| 182 | - | |
| 183 | - $login_form .= '</div>'; | |
| 184 | - return $login_form; | |
| 185 | - | |
| 186 | - }else{ | |
| 187 | - $user_ID = get_current_user_id(); | |
| 188 | - $wppb_user = get_userdata( $user_ID ); | |
| 189 | - | |
| 190 | - if( isset( $wppb_generalSettings['loginWith'] ) && ( $wppb_generalSettings['loginWith'] == 'email' ) ) | |
| 191 | - $display_name = $wppb_user->user_email; | |
| 192 | - | |
| 193 | - elseif($wppb_user->display_name !== '') | |
| 194 | - $display_name = $wppb_user->user_login; | |
| 195 | - | |
| 196 | - else | |
| 197 | - $display_name = $wppb_user->display_name; | |
| 198 | - | |
| 199 | - $loged_in_message = '<p class="wppb-alert">'.sprintf(__( 'You are currently logged in as %1$s. %2$s', 'profilebuilder' ), '<a href="'.$authorPostsUrl = get_author_posts_url( $wppb_user->ID ).'" title="'.$display_name.'">'.$display_name.'</a>', '<a href="'.wp_logout_url( $redirectTo = wppb_curpageurl() ).'" title="'.__( 'Log out of this account', 'profilebuilder' ).'">'. __( 'Log out', 'profilebuilder').' »</a>' ) . '</p><!-- .alert-->'; | |
| 200 | - | |
| 201 | - return apply_filters( 'wppb_login_message', $loged_in_message, $wppb_user->ID, $display_name ); | |
| 202 | - | |
| 203 | - } | |
| 204 | -} | |
| 1 | +<?php | |
| 2 | +if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly | |
| 3 | + | |
| 4 | +add_action( 'init', 'wppb_process_login' ); | |
| 5 | +function wppb_process_login(){ | |
| 6 | + | |
| 7 | + if( !isset($_REQUEST['wppb_login']) ) | |
| 8 | + return; | |
| 9 | + | |
| 10 | + do_action( 'login_init' ); | |
| 11 | + do_action( "login_form_login" ); | |
| 12 | + do_action( 'wppb_process_login_start' ); | |
| 13 | + | |
| 14 | + if( !isset( $_POST['CSRFToken-wppb'] ) || ! wp_verify_nonce( sanitize_text_field( $_POST['CSRFToken-wppb'] ), 'wppb_login' ) ) | |
| 15 | + return; | |
| 16 | + | |
| 17 | + $secure_cookie = ''; | |
| 18 | + // If the user wants ssl but the session is not ssl, force a secure cookie. | |
| 19 | + if ( !empty($_POST['log']) && !force_ssl_admin() ) { | |
| 20 | + $user_name = sanitize_user($_POST['log']); | |
| 21 | + $user = get_user_by( 'login', $user_name ); | |
| 22 | + | |
| 23 | + if ( ! $user && strpos( $user_name, '@' ) ) { | |
| 24 | + $user = get_user_by( 'email', $user_name ); | |
| 25 | + } | |
| 26 | + | |
| 27 | + if ( $user ) { | |
| 28 | + if ( get_user_option('use_ssl', $user->ID) ) { | |
| 29 | + $secure_cookie = true; | |
| 30 | + force_ssl_admin(true); | |
| 31 | + } | |
| 32 | + } | |
| 33 | + } | |
| 34 | + | |
| 35 | + $redirect_to = ''; | |
| 36 | + if ( isset( $_REQUEST['redirect_to'] ) ) { | |
| 37 | + $redirect_to = wppb_sanitize_request_url( $_REQUEST['redirect_to'] ); | |
| 38 | + } | |
| 39 | + | |
| 40 | + $user = wp_signon( array(), $secure_cookie ); | |
| 41 | + | |
| 42 | + if ( empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) { | |
| 43 | + if ( headers_sent() ) { | |
| 44 | + /* translators: 1: Browser cookie documentation URL, 2: Support forums URL */ | |
| 45 | + $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>.', 'profile-builder' ), | |
| 46 | + 'https://codex.wordpress.org/Cookies', 'https://wordpress.org/support/' ) ); | |
| 47 | + } | |
| 48 | + } | |
| 49 | + | |
| 50 | + $requested_redirect_to = isset( $_REQUEST['redirect_to'] ) ? wppb_sanitize_request_url( $_REQUEST['redirect_to'] ) : ''; | |
| 51 | + /** | |
| 52 | + * Filters the login redirect URL. | |
| 53 | + */ | |
| 54 | + $redirect_to = apply_filters( 'login_redirect', $redirect_to, $requested_redirect_to, $user ); | |
| 55 | + | |
| 56 | + do_action( 'wppb_process_login_end' ); | |
| 57 | + | |
| 58 | + if ( !is_wp_error($user) ) { | |
| 59 | + if ( $redirect_to == 'wp-admin/' || $redirect_to == admin_url() ) { | |
| 60 | + // 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. | |
| 61 | + if ( is_multisite() && !get_active_blog_for_user($user->ID) && !is_super_admin( $user->ID ) ) | |
| 62 | + $redirect_to = user_admin_url(); | |
| 63 | + elseif ( is_multisite() && !$user->has_cap('read') ) | |
| 64 | + $redirect_to = get_dashboard_url( $user->ID ); | |
| 65 | + elseif ( !$user->has_cap('edit_posts') ) | |
| 66 | + $redirect_to = $user->has_cap( 'read' ) ? admin_url( 'profile.php' ) : home_url(); | |
| 67 | + | |
| 68 | + wp_redirect( $redirect_to ); | |
| 69 | + exit(); | |
| 70 | + } | |
| 71 | + wp_safe_redirect($redirect_to); | |
| 72 | + exit(); | |
| 73 | + } | |
| 74 | + else{ | |
| 75 | + wp_safe_redirect($redirect_to); | |
| 76 | + exit(); | |
| 77 | + } | |
| 78 | +} | |
| 79 | +/** | |
| 80 | + * Provides a simple login form | |
| 81 | + * | |
| 82 | + * The login format HTML is echoed by default. Pass a false value for `$echo` to return it instead. | |
| 83 | + * | |
| 84 | + * @param array $args { | |
| 85 | + * Optional. Array of options to control the form output. Default empty array. | |
| 86 | + * | |
| 87 | + * @type bool $echo Whether to display the login form or return the form HTML code. | |
| 88 | + * Default true (echo). | |
| 89 | + * @type string $redirect URL to redirect to. Must be absolute, as in "https://example.com/mypage/". | |
| 90 | + * Default is to redirect back to the request URI. | |
| 91 | + * @type string $form_id ID attribute value for the form. Default 'loginform'. | |
| 92 | + * @type string $label_username Label for the username or email address field. Default 'Username or Email Address'. | |
| 93 | + * @type string $label_username Label for the username or email address field. Default 'Username or Email Address'. | |
| 94 | + * @type string $login_username_input_type Type of input field for the username or email address. | |
| 95 | + * @type string $label_remember Label for the remember field. Default 'Remember Me'. | |
| 96 | + * @type string $label_log_in Label for the submit button. Default 'Log In'. | |
| 97 | + * @type string $id_username ID attribute value for the username field. Default 'user_login'. | |
| 98 | + * @type string $id_password ID attribute value for the password field. Default 'user_pass'. | |
| 99 | + * @type string $id_remember ID attribute value for the remember field. Default 'rememberme'. | |
| 100 | + * @type string $id_submit ID attribute value for the submit button. Default 'wp-submit'. | |
| 101 | + * @type bool $remember Whether to display the "rememberme" checkbox in the form. | |
| 102 | + * @type string $value_username Default value for the username field. Default empty. | |
| 103 | + * @type bool $value_remember Whether the "Remember Me" checkbox should be checked by default. | |
| 104 | + * Default false (unchecked). | |
| 105 | + * | |
| 106 | + * } | |
| 107 | + * @return string|void String when retrieving. | |
| 108 | + */ | |
| 109 | +function wppb_login_form( $args = array() ) { | |
| 110 | + | |
| 111 | + $default_redirect = ''; | |
| 112 | + if( isset( $_SERVER['HTTP_HOST'] ) && isset( $_SERVER['REQUEST_URI'] ) ) | |
| 113 | + $default_redirect = esc_url_raw( ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ); | |
| 114 | + | |
| 115 | + $defaults = array( | |
| 116 | + 'echo' => true, | |
| 117 | + // Default 'redirect' value takes the user back to the request URI. | |
| 118 | + 'redirect' => $default_redirect, | |
| 119 | + 'form_id' => 'wppb-loginform', | |
| 120 | + 'form_classes' => array(), | |
| 121 | + 'label_username' => __( 'Username or Email Address', 'profile-builder' ), | |
| 122 | + 'login_username_input_type' => 'text', | |
| 123 | + 'label_password' => __( 'Password', 'profile-builder' ), | |
| 124 | + 'label_remember' => __( 'Remember Me', 'profile-builder' ), | |
| 125 | + 'label_log_in' => __( 'Log In', 'profile-builder' ), | |
| 126 | + 'id_username' => 'wppb_user_login', | |
| 127 | + 'id_password' => 'wppb_user_pass', | |
| 128 | + 'id_remember' => 'rememberme', | |
| 129 | + 'id_submit' => 'wp-submit', | |
| 130 | + 'remember' => true, | |
| 131 | + 'value_username' => '', | |
| 132 | + // Set 'value_remember' to true to default the "Remember me" checkbox to checked. | |
| 133 | + 'value_remember' => false, | |
| 134 | + 'is_ajax_form' => false, | |
| 135 | + ); | |
| 136 | + | |
| 137 | + /** | |
| 138 | + * Filters the default login form output arguments. | |
| 139 | + */ | |
| 140 | + $args = wp_parse_args( $args, apply_filters( 'login_form_defaults', $defaults ) ); | |
| 141 | + | |
| 142 | + /** | |
| 143 | + * Filters content to display at the top of the login form. | |
| 144 | + */ | |
| 145 | + $login_form_top = apply_filters( 'login_form_top', '', $args ); | |
| 146 | + | |
| 147 | + /** | |
| 148 | + * Filters content to display in the middle of the login form. | |
| 149 | + */ | |
| 150 | + $login_form_middle = apply_filters( 'login_form_middle', '', $args ); | |
| 151 | + | |
| 152 | + /** | |
| 153 | + * Filters content to display at the bottom of the login form. | |
| 154 | + */ | |
| 155 | + $login_form_bottom = apply_filters( 'login_form_bottom', '', $args ); | |
| 156 | + | |
| 157 | + if( !empty( $args['is_ajax_form'] ) ){ | |
| 158 | + $args['form_classes'][] = 'wppb-ajax-form'; | |
| 159 | + } | |
| 160 | + | |
| 161 | + $args['form_classes'] = implode( ' ', $args['form_classes'] ); | |
| 162 | + | |
| 163 | + if( in_the_loop() ) | |
| 164 | + $form_location = 'page'; | |
| 165 | + else | |
| 166 | + $form_location = 'widget'; | |
| 167 | + | |
| 168 | + // if an error is being shown pass the original referer forward | |
| 169 | + if( isset( $_GET['wppb_referer_url'] ) ){ | |
| 170 | + $wppb_referer_url = wppb_sanitize_request_url( $_GET['wppb_referer_url'] ); | |
| 171 | + } else { | |
| 172 | + $wppb_referer_url = wppb_sanitize_request_url( isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : '' ); | |
| 173 | + } | |
| 174 | + | |
| 175 | + $form = ' | |
| 176 | + <form name="' . esc_attr( $args['form_id'] ) . '" id="' . esc_attr( $args['form_id'] ) . '" class="' . esc_attr( $args['form_classes'] ) . '" action="'. esc_url( wppb_curpageurl() ) .'" method="post"> | |
| 177 | + ' . $login_form_top . ' | |
| 178 | + <p class="wppb-form-field login-username'. apply_filters( 'wppb_login_field_extra_css_class', '', $args['id_username']) .'"> | |
| 179 | + <label for="' . esc_attr( $args['id_username'] ) . '">' . esc_html( $args['label_username'] ) . '</label> | |
| 180 | + <input type="' . esc_attr( $args['login_username_input_type'] ) . '" name="log" id="' . esc_attr( $args['id_username'] ) . '" class="input" value="' . esc_attr( $args['value_username'] ) . '" size="20" /> | |
| 181 | + </p> | |
| 182 | + <p class="wppb-form-field login-password'. apply_filters( 'wppb_login_field_extra_css_class', '', $args['id_password']) .'"> | |
| 183 | + <label for="' . esc_attr( $args['id_password'] ) . '">' . esc_html( $args['label_password'] ) . '</label> | |
| 184 | + <span class="wppb-password-field-container"> | |
| 185 | + <input type="password" name="pwd" id="' . esc_attr( $args['id_password'] ) . '" class="input" value="" size="20" '. apply_filters( 'wppb_login_password_extra_attributes', '' ) .'/> | |
| 186 | + '. wppb_password_visibility_toggle_html() .' <!-- add the HTML for the visibility toggle --> | |
| 187 | + </span> | |
| 188 | + </p>'; | |
| 189 | + | |
| 190 | + $form .=' | |
| 191 | + | |
| 192 | + ' . $login_form_middle . ' | |
| 193 | + ' . ( $args['remember'] ? '<p class="wppb-form-field login-remember"><input name="rememberme" type="checkbox" id="' . esc_attr( $args['id_remember'] ) . '" value="forever"' . ( $args['value_remember'] ? ' checked="checked"' : '' ) . ' /><label for="' . esc_attr( $args['id_remember'] ) . '">' . esc_html( $args['label_remember'] ) . '</label></p>' : '' ) . ' | |
| 194 | + <p class="login-submit form-submit"> | |
| 195 | + <input type="submit" name="wp-submit" id="' . esc_attr( $args['id_submit'] ) . '" class="'. esc_attr( apply_filters( 'wppb_login_submit_class', "button button-primary" ) ) . '" value="' . esc_attr( $args['label_log_in'] ) . '"' . apply_filters( 'wppb_login_submit_button_extra_attributes', '' ) . ' /> | |
| 196 | + <input type="hidden" name="redirect_to" value="' . esc_url( $args['redirect'] ) . '" /> | |
| 197 | + </p> | |
| 198 | + <input type="hidden" name="wppb_login" value="true"/> | |
| 199 | + <input type="hidden" name="wppb_form_location" value="'. esc_attr( $form_location ) .'"/> | |
| 200 | + <input type="hidden" name="wppb_request_url" value="'. esc_url( wppb_curpageurl() ).'"/> | |
| 201 | + <input type="hidden" name="wppb_lostpassword_url" value="'.esc_url( $args['lostpassword_url'] ).'"/> | |
| 202 | + <input type="hidden" name="wppb_redirect_priority" value="'. esc_attr( isset( $args['redirect_priority'] ) ? $args['redirect_priority'] : '' ) .'"/> | |
| 203 | + <input type="hidden" name="wppb_referer_url" value="'. esc_url( $wppb_referer_url ) .'"/> | |
| 204 | + '. wp_nonce_field( 'wppb_login', 'CSRFToken-wppb', true, false ) .' | |
| 205 | + <input type="hidden" name="wppb_redirect_check" value="true"/> | |
| 206 | + ' . $login_form_bottom . ' | |
| 207 | + </form>'; | |
| 208 | + | |
| 209 | + // Remove whitespace if login_username_input_type is set to email | |
| 210 | + if ( $args['login_username_input_type'] == 'email' ) { | |
| 211 | + $form .= '<script>window.onload = function() { jQuery(document).ready(function($) { $("input[name=\"log\"]").on("keyup", function() { $(this).val( $.trim($(this).val()) ); }); }); }</script>'; | |
| 212 | + } | |
| 213 | + | |
| 214 | + if ( $args['echo'] ) | |
| 215 | + echo $form; /* phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped */ /* escaped above */ | |
| 216 | + else | |
| 217 | + return $form; | |
| 218 | +} | |
| 219 | + | |
| 220 | +// when email login is enabled we need to change the post data for the username | |
| 221 | +function wppb_change_login_with_email(){ | |
| 222 | + if( !empty( $_POST['log'] ) ){ | |
| 223 | + // only do this for our form | |
| 224 | + if( isset( $_POST['wppb_login'] ) ){ | |
| 225 | + global $wpdb, $_POST, $wp_version; | |
| 226 | + // apply filter to allow stripping slashes if necessary | |
| 227 | + $_POST['log'] = apply_filters( 'wppb_before_processing_email_from_forms', sanitize_text_field( $_POST['log'] ) ); | |
| 228 | + | |
| 229 | + /* since version 4.5 there is in the core the option to login with email so we don't need the bellow code but for backward compatibility we will keep it */ | |
| 230 | + if( version_compare( $wp_version, '4.5.0' ) >= 0 && apply_filters( 'wppb_allow_login_with_username_when_is_set_to_email', false ) ) | |
| 231 | + return; | |
| 232 | + | |
| 233 | + $wppb_generalSettings = get_option( 'wppb_general_settings' ); | |
| 234 | + | |
| 235 | + // if this setting is active, the posted username is, in fact the user's email | |
| 236 | + if( isset( $wppb_generalSettings['loginWith'] ) && ( $wppb_generalSettings['loginWith'] == 'email' ) ){ | |
| 237 | + if( !is_email( $_POST['log'] ) && !apply_filters( 'wppb_allow_login_with_username_when_is_set_to_email', false ) ){ | |
| 238 | + $_POST['log'] = 'this_is_an_invalid_email' . time(); | |
| 239 | + } | |
| 240 | + else { | |
| 241 | + $username = $wpdb->get_var($wpdb->prepare("SELECT user_login FROM $wpdb->users WHERE user_email= %s LIMIT 1", sanitize_email($_POST['log']))); | |
| 242 | + | |
| 243 | + if (!empty($username)) | |
| 244 | + $_POST['log'] = $username; | |
| 245 | + | |
| 246 | + else { | |
| 247 | + // if we don't have a username for the email entered we can't have an empty username because we will receive a field empty error | |
| 248 | + $_POST['log'] = 'this_is_an_invalid_email' . time(); | |
| 249 | + } | |
| 250 | + } | |
| 251 | + } | |
| 252 | + | |
| 253 | + // if this setting is active, the posted username is, in fact the user's email or username | |
| 254 | + if( isset( $wppb_generalSettings['loginWith'] ) && ( $wppb_generalSettings['loginWith'] == 'usernameemail' ) ) { | |
| 255 | + if( is_email( $_POST['log'] ) ) { | |
| 256 | + | |
| 257 | + $username = $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM $wpdb->users WHERE user_email= %s LIMIT 1", sanitize_email( $_POST['log'] ) ) ); | |
| 258 | + | |
| 259 | + // the username can have the format of an email address, so if we can't find a user that has an account with the detected email, we set the username as that email | |
| 260 | + if( empty( $username ) ) | |
| 261 | + $username = sanitize_user( $_POST['log'] ); | |
| 262 | + | |
| 263 | + } else { | |
| 264 | + $username = sanitize_user( $_POST['log'] ); | |
| 265 | + } | |
| 266 | + | |
| 267 | + if( !empty( $username ) ) | |
| 268 | + $_POST['log'] = $username; | |
| 269 | + else { | |
| 270 | + // if we don't have a username for the email entered we can't have an empty username because we will receive a field empty error | |
| 271 | + $_POST['log'] = 'this_is_an_invalid_email'.time(); | |
| 272 | + } | |
| 273 | + } | |
| 274 | + } | |
| 275 | + } | |
| 276 | +} | |
| 277 | +add_action( 'login_init', 'wppb_change_login_with_email' ); | |
| 278 | + | |
| 279 | +function wppb_resend_confirmation_email() { | |
| 280 | + if( !isset( $_GET['wppb-action'] ) || $_GET['wppb-action'] != 'resend_email_confirmation' || !isset( $_GET['email'] )) | |
| 281 | + return; | |
| 282 | + | |
| 283 | + $user_email = base64_decode( sanitize_text_field( $_GET['email'] )); | |
| 284 | + | |
| 285 | + $transient_check_key = Wordpress_Creation_Kit_PB::wck_generate_slug( $user_email ); | |
| 286 | + $transient_check = get_transient('wppb_confirmation_email_already_sent_'.$transient_check_key); | |
| 287 | + | |
| 288 | + if ( $transient_check === false ) { | |
| 289 | + | |
| 290 | + if ( !isset( $_GET['_wpnonce'] ) || !wp_verify_nonce(sanitize_text_field( $_GET['_wpnonce'] ), 'wppb_confirmation_url_nonce' )) | |
| 291 | + return; | |
| 292 | + | |
| 293 | + include_once(plugin_dir_path(__FILE__) . '../features/email-confirmation/email-confirmation.php'); | |
| 294 | + | |
| 295 | + if ( file_exists( WPPB_PLUGIN_DIR . '/assets/lib/class-mustache-templates/class-mustache-templates.php' ) ) | |
| 296 | + include_once( WPPB_PLUGIN_DIR . '/assets/lib/class-mustache-templates/class-mustache-templates.php' ); | |
| 297 | + | |
| 298 | + global $wpdb; | |
| 299 | + $sql_result = $wpdb->get_row( $wpdb->prepare("SELECT * FROM " . $wpdb->base_prefix . "signups WHERE user_email = %s", $user_email ), ARRAY_A ); | |
| 300 | + | |
| 301 | + // if the email address exists in wp_signups table, resend Confirmation Email and redirect to display notification | |
| 302 | + if ( $sql_result ) { | |
| 303 | + wppb_signup_user_notification( sanitize_text_field( $sql_result['user_login'] ), sanitize_email( $sql_result['user_email'] ), $sql_result['activation_key'], $sql_result['meta'] ); | |
| 304 | + $transient_key = Wordpress_Creation_Kit_PB::wck_generate_slug( $user_email ); | |
| 305 | + set_transient('wppb_confirmation_email_already_sent_' . $transient_key, true, 900 ); | |
| 306 | + $error_string = '<strong>' . __( 'SUCCESS: ', 'profile-builder') . '</strong>' . sprintf( __( 'Activation email sent to %s', 'profile-builder' ), $user_email ); | |
| 307 | + $wppb_success_message_nonce = wp_create_nonce( 'wppb_login_error_'.$error_string); | |
| 308 | + $current_url = wppb_curpageurl(); | |
| 309 | + $arr_params = array('loginerror' => urlencode(base64_encode($error_string)), '_wpnonce' => $wppb_success_message_nonce, 'request_form_location' => 'page', 'wppb_message_type' => 'success'); | |
| 310 | + $redirect_to = add_query_arg($arr_params, $current_url); | |
| 311 | + wp_safe_redirect($redirect_to); | |
| 312 | + exit(); | |
| 313 | + } | |
| 314 | + | |
| 315 | + } | |
| 316 | +} | |
| 317 | +add_action('init', 'wppb_resend_confirmation_email'); | |
| 318 | + | |
| 319 | +function wppb_change_error_message($error_message) { | |
| 320 | + | |
| 321 | + $wppb_generalSettings = get_option( 'wppb_general_settings' ); | |
| 322 | + | |
| 323 | + if (empty( $wppb_generalSettings['emailConfirmation'] ) || $wppb_generalSettings['emailConfirmation'] !== 'yes') | |
| 324 | + return $error_message; | |
| 325 | + | |
| 326 | + if( isset( $_REQUEST['log'] ) ){ | |
| 327 | + global $wpdb; | |
| 328 | + $check_user = sanitize_text_field( $_REQUEST['log'] ); | |
| 329 | + | |
| 330 | + if ( is_email( $check_user )) | |
| 331 | + $sql_result = $wpdb->get_row( $wpdb->prepare("SELECT * FROM " . $wpdb->base_prefix . "signups WHERE user_email = %s", sanitize_email( $check_user )), ARRAY_A ); | |
| 332 | + else { | |
| 333 | + $sql_result = $wpdb->get_row( $wpdb->prepare("SELECT * FROM " . $wpdb->base_prefix . "signups WHERE user_login = %s", sanitize_user( $check_user )), ARRAY_A ); | |
| 334 | + if ( $sql_result ) | |
| 335 | + $check_user = $sql_result['user_email']; | |
| 336 | + } | |
| 337 | + | |
| 338 | + // if the email address exists in wp_signups table, display message and link to resend Confirmation Email | |
| 339 | + if ( isset($sql_result) ) { | |
| 340 | + $confirmation_url_nonce = wp_create_nonce( 'wppb_confirmation_url_nonce' ); | |
| 341 | + $current_url = strtok( wppb_curpageurl(), '?' ); | |
| 342 | + $arr_params = array('email' => base64_encode( $check_user ), 'wppb-action' => 'resend_email_confirmation', '_wpnonce' => $confirmation_url_nonce); | |
| 343 | + $confirmation_url = add_query_arg($arr_params, $current_url); | |
| 344 | + $error_message = '<strong>' . __('ERROR: ', 'profile-builder') . '</strong>' . sprintf( __( 'You need to confirm your Email Address before logging in! </br>To resend the Confirmation Email %1$sclick here%2$s.', 'profile-builder' ), '<a href="' . esc_url( $confirmation_url ) . '" title="Resend Confirmation Email">', '</a>' ); | |
| 345 | + } | |
| 346 | + } | |
| 347 | + | |
| 348 | + return $error_message; | |
| 349 | + | |
| 350 | +} | |
| 351 | +add_filter('wppb_login_invalid_username_error_message', 'wppb_change_error_message'); | |
| 352 | + | |
| 353 | +/** | |
| 354 | + * Remove email login when username login is selected | |
| 355 | + * inspiration from https://wordpress.org/plugins/no-login-by-email-address/ | |
| 356 | + */ | |
| 357 | +$wppb_generalSettings = get_option( 'wppb_general_settings' ); | |
| 358 | +if( isset( $wppb_generalSettings['loginWith'] ) && ( $wppb_generalSettings['loginWith'] == 'username' ) ) { | |
| 359 | + function wppb_login_username_label() | |
| 360 | + { | |
| 361 | + add_filter('gettext', 'wppb_login_username_label_change', 20, 3); | |
| 362 | + function wppb_login_username_label_change($translated_text, $text, $domain) | |
| 363 | + { | |
| 364 | + if ($text === 'Username or Email') { | |
| 365 | + $translated_text = __( 'Username', 'profile-builder' ); | |
| 366 | + } | |
| 367 | + return $translated_text; | |
| 368 | + } | |
| 369 | + } | |
| 370 | + | |
| 371 | + add_action('login_head', 'wppb_login_username_label'); | |
| 372 | + | |
| 373 | + /** | |
| 374 | + * Filter wp_login_form username default | |
| 375 | + * | |
| 376 | + */ | |
| 377 | + function wppb_change_login_username_label($defaults) | |
| 378 | + { | |
| 379 | + $defaults['label_username'] = __( 'Username', 'profile-builder' ); | |
| 380 | + return $defaults; | |
| 381 | + } | |
| 382 | + | |
| 383 | + add_filter('login_form_defaults', 'wppb_change_login_username_label'); | |
| 384 | + | |
| 385 | + /** | |
| 386 | + * Remove email/password authentication | |
| 387 | + * | |
| 388 | + */ | |
| 389 | + remove_filter('authenticate', 'wp_authenticate_email_password', 20); | |
| 390 | +} | |
| 391 | + | |
| 392 | +// login redirect filter. used to redirect from wp-login.php if it errors out | |
| 393 | +function wppb_login_redirect( $redirect_to, $requested_redirect_to, $user ){ | |
| 394 | + // custom redirect after login on default wp login form | |
| 395 | + if( ! isset( $_POST['wppb_login'] ) && ! is_wp_error( $user ) ) { | |
| 396 | + $original_redirect_to = $redirect_to; | |
| 397 | + | |
| 398 | + // we don't have an error make sure to remove the error from the query arg | |
| 399 | + $redirect_to = remove_query_arg( 'loginerror', $redirect_to ); | |
| 400 | + | |
| 401 | + // CHECK FOR REDIRECT | |
| 402 | + $redirect_to = wppb_get_redirect_url( 'normal', 'after_login', $redirect_to, $user ); | |
| 403 | + $redirect_to = apply_filters( 'wppb_after_login_redirect_url', $redirect_to ); | |
| 404 | + | |
| 405 | + if ( $redirect_to === '' ){ | |
| 406 | + $redirect_to = $original_redirect_to; | |
| 407 | + } | |
| 408 | + } | |
| 409 | + | |
| 410 | + // if login action initialized by our form | |
| 411 | + if( isset( $_POST['wppb_login'] ) ){ | |
| 412 | + if( is_wp_error( $user ) ) { | |
| 413 | + // if we don't have a successful login we must redirect to the url of the form, so make sure this happens | |
| 414 | + if( isset( $_POST['wppb_request_url'] ) ) | |
| 415 | + $redirect_to = wppb_sanitize_request_url( $_POST['wppb_request_url'] ); | |
| 416 | + if( isset( $_POST['wppb_form_location'] ) ) | |
| 417 | + $request_form_location = sanitize_text_field( $_POST['wppb_form_location'] ); | |
| 418 | + $error_string = $user->get_error_message(); | |
| 419 | + | |
| 420 | + $wppb_generalSettings = get_option('wppb_general_settings'); | |
| 421 | + | |
| 422 | + if (isset($wppb_generalSettings['loginWith'])) { | |
| 423 | + | |
| 424 | + $lost_pass_url = site_url('/wp-login.php?action=lostpassword'); | |
| 425 | + // if the Login shortcode has a lostpassword argument set, give the lost password error link that value | |
| 426 | + $lost_pass_url_input = wppb_sanitize_request_url( $_POST['wppb_lostpassword_url'] ?? '' ); | |
| 427 | + if ( $lost_pass_url_input !== '' ) { | |
| 428 | + $lost_pass_url = $lost_pass_url_input; | |
| 429 | + if ( wppb_check_missing_http( $lost_pass_url ) ) | |
| 430 | + $lost_pass_url = "http://" . $lost_pass_url; | |
| 431 | + } | |
| 432 | + //apply filter to allow changing Lost your Password link | |
| 433 | + $lost_pass_url = apply_filters('wppb_pre_login_url_filter', $lost_pass_url); | |
| 434 | + | |
| 435 | + /* start building the error string */ | |
| 436 | + if( in_array( $user->get_error_code(), array( 'empty_username', 'empty_password', 'invalid_username', 'incorrect_password' ) ) ) | |
| 437 | + $error_string = '<strong>' . __('ERROR: ', 'profile-builder') . '</strong>'; | |
| 438 | + | |
| 439 | + if ( $user->get_error_code() == 'empty_password' ) { | |
| 440 | + $error_string .= __( 'The password field is empty.', 'profile-builder' ) . ' '; | |
| 441 | + } | |
| 442 | + | |
| 443 | + if ( $user->get_error_code() == 'empty_username' ) { | |
| 444 | + if ($wppb_generalSettings['loginWith'] == 'email')// if login with email is enabled change the word username with email | |
| 445 | + $error_string .= __('The email field is empty.', 'profile-builder') . ' '; | |
| 446 | + else if( $wppb_generalSettings['loginWith'] == 'usernameemail' )// if login with username and email is enabled change the word username with username or email | |
| 447 | + $error_string .= __('The username/email field is empty', 'profile-builder') . ' '; | |
| 448 | + else | |
| 449 | + $error_string .= __('The username field is empty', 'profile-builder') . ' '; | |
| 450 | + } | |
| 451 | + | |
| 452 | + if( apply_filters( 'wppb_login_use_old_error_messages', false ) ) { | |
| 453 | + | |
| 454 | + if ( $user->get_error_code() == 'incorrect_password' ) { | |
| 455 | + $error_string .= __('The password you entered is incorrect.', 'profile-builder') . ' '; | |
| 456 | + } | |
| 457 | + | |
| 458 | + if ( $user->get_error_code() == 'invalid_username' ) { | |
| 459 | + if ($wppb_generalSettings['loginWith'] == 'email')// if login with email is enabled change the word username with email | |
| 460 | + $error_string .= __('Invalid email.', 'profile-builder') . ' '; | |
| 461 | + else if( $wppb_generalSettings['loginWith'] == 'usernameemail' )// if login with username and email is enabled change the word username with username or email | |
| 462 | + $error_string .= __('Invalid username or email.', 'profile-builder') . ' '; | |
| 463 | + else | |
| 464 | + $error_string .= __('Invalid username.', 'profile-builder') . ' '; | |
| 465 | + | |
| 466 | + $error_string = apply_filters('wppb_login_invalid_username_error_message', $error_string); | |
| 467 | + } | |
| 468 | + | |
| 469 | + } else if( in_array( $user->get_error_code(), array( 'incorrect_password', 'invalid_username' ) ) ) { | |
| 470 | + $error_string .= __( 'The credentials you entered are incorrect.', 'profile-builder' ) . ' '; | |
| 471 | + } | |
| 472 | + | |
| 473 | + if( $user->get_error_code() == 'incorrect_password' || $user->get_error_code() == 'invalid_username' && empty( $message_check = apply_filters('wppb_login_invalid_username_error_message', '' ))) | |
| 474 | + $error_string .= '<a href="' . esc_url( $lost_pass_url ) . '" title="' . __('Password Lost and Found.', 'profile-builder') . '">' . __('Lost your password?', 'profile-builder') . '</a>'; | |
| 475 | + | |
| 476 | + } | |
| 477 | + | |
| 478 | + // if the error string is empty it means that none of the fields were completed | |
| 479 | + if (empty($error_string) || ( in_array( 'empty_username', $user->get_error_codes() ) && in_array( 'empty_password', $user->get_error_codes() ) ) ) { | |
| 480 | + $error_string = '<strong>' . __('ERROR: ', 'profile-builder') . '</strong>' . __('Both fields are empty.', 'profile-builder') . ' '; | |
| 481 | + $error_string = apply_filters('wppb_login_empty_fields_error_message', $error_string); | |
| 482 | + } | |
| 483 | + | |
| 484 | + $error_string = apply_filters('wppb_login_wp_error_message', $error_string, $user); | |
| 485 | + $wppb_error_string_nonce = wp_create_nonce( 'wppb_login_error_'.$error_string ); | |
| 486 | + | |
| 487 | + // encode the error string and send it as a GET parameter | |
| 488 | + $referer_url = wppb_sanitize_request_url( $_POST['wppb_referer_url'] ?? '' ); | |
| 489 | + if ( $referer_url !== '' ) { | |
| 490 | + $arr_params = array('loginerror' => urlencode(base64_encode($error_string)), '_wpnonce' => $wppb_error_string_nonce, 'request_form_location' => $request_form_location, 'wppb_referer_url' => urlencode( $referer_url )); | |
| 491 | + } else { | |
| 492 | + $arr_params = array('loginerror' => urlencode(base64_encode($error_string)), '_wpnonce' => $wppb_error_string_nonce, 'request_form_location' => $request_form_location); | |
| 493 | + } | |
| 494 | + | |
| 495 | + if ($user->get_error_code() == 'wppb_login_auth') { | |
| 496 | + $arr_params['login_auth'] = 'true'; | |
| 497 | + } | |
| 498 | + | |
| 499 | + $redirect_to = add_query_arg($arr_params, $redirect_to); | |
| 500 | + } | |
| 501 | + else{ | |
| 502 | + // we don't have an error make sure to remove the error from the query arg | |
| 503 | + $redirect_to = remove_query_arg( 'loginerror', $redirect_to ); | |
| 504 | + | |
| 505 | + // CHECK FOR REDIRECT | |
| 506 | + if( isset( $_POST['wppb_redirect_priority'] ) ) | |
| 507 | + $redirect_to = wppb_get_redirect_url( sanitize_text_field( $_POST['wppb_redirect_priority'] ), 'after_login', $redirect_to, $user ); | |
| 508 | + | |
| 509 | + $redirect_to = apply_filters( 'wppb_after_login_redirect_url', $redirect_to ); | |
| 510 | + | |
| 511 | + // This should not be empty, if we don't have a redirect, set it to the current page URL | |
| 512 | + if( empty( $redirect_to ) ) | |
| 513 | + $redirect_to = wppb_curpageurl(); | |
| 514 | + } | |
| 515 | + } | |
| 516 | + | |
| 517 | + // if "wppb_message_type = success" is present the message will show up in a green box instead of red | |
| 518 | + if ( isset( $_GET['wppb_message_type'] ) && $_GET['wppb_message_type'] == 'success' ) | |
| 519 | + $redirect_to = remove_query_arg( 'wppb_message_type', $redirect_to ); | |
| 520 | + | |
| 521 | + return $redirect_to; | |
| 522 | +} | |
| 523 | +add_filter( 'login_redirect', 'wppb_login_redirect', 20, 3 ); | |
| 524 | + | |
| 525 | + | |
| 526 | +/* shortcode function */ | |
| 527 | +function wppb_front_end_login( $atts ){ | |
| 528 | + global $wppb_shortcode_on_front; | |
| 529 | + $wppb_shortcode_on_front = true; | |
| 530 | + global $wppb_login_shortcode_on_front; | |
| 531 | + $wppb_login_shortcode_on_front = true; | |
| 532 | + /* define a global so we now we have the shortcode login present */ | |
| 533 | + global $wppb_login_shortcode; | |
| 534 | + $wppb_login_shortcode = true; | |
| 535 | + | |
| 536 | + $atts = shortcode_atts( array( | |
| 537 | + 'display' => true, | |
| 538 | + 'redirect' => '', | |
| 539 | + 'redirect_url' => '', | |
| 540 | + 'logout_redirect_url' => wppb_curpageurl(), | |
| 541 | + 'redirect_priority' => 'normal', | |
| 542 | + 'register_url' => '', | |
| 543 | + 'lostpassword_url' => '', | |
| 544 | + 'show_2fa_field' => '', | |
| 545 | + 'block' => false, | |
| 546 | + 'ajax' => false, | |
| 547 | + ), $atts, 'wppb-login' ); | |
| 548 | + | |
| 549 | + $display = $atts['display']; | |
| 550 | + $redirect = $atts['redirect']; | |
| 551 | + $redirect_url = $atts['redirect_url']; | |
| 552 | + $logout_redirect_url = $atts['logout_redirect_url']; | |
| 553 | + $redirect_priority = $atts['redirect_priority']; | |
| 554 | + $register_url = $atts['register_url']; | |
| 555 | + $lostpassword_url = $atts['lostpassword_url']; | |
| 556 | + $show_2fa_field = $atts['show_2fa_field']; | |
| 557 | + $block = $atts['block']; | |
| 558 | + $ajax = $atts['ajax']; | |
| 559 | + | |
| 560 | + $is_ajax_form = false; | |
| 561 | + if( defined( 'WPPB_PAID_PLUGIN_DIR' ) && $ajax === 'true' && file_exists( WPPB_PAID_PLUGIN_DIR . '/features/ajax/assets/forms-ajax-validation.js' ) ) { | |
| 562 | + wp_enqueue_script( 'wppb-forms-ajax-validation-script', WPPB_PAID_PLUGIN_URL . 'features/ajax/assets/forms-ajax-validation.js', array( 'jquery' ), PROFILE_BUILDER_VERSION, true ); | |
| 563 | + wp_localize_script( 'wppb-forms-ajax-validation-script', 'submitButtonData', array( 'processingText' => __('Processing...', 'profile-builder') ) ); | |
| 564 | + $is_ajax_form = true; | |
| 565 | + } | |
| 566 | + | |
| 567 | + $wppb_generalSettings = get_option('wppb_general_settings'); | |
| 568 | + | |
| 569 | + // check if the form is being displayed in the Elementor editor | |
| 570 | + $is_elementor_edit_mode_or_divi_ajax = false; | |
| 571 | + if( class_exists ( '\Elementor\Plugin' ) ){ | |
| 572 | + $is_elementor_edit_mode_or_divi_ajax = \Elementor\Plugin::$instance->editor->is_edit_mode(); | |
| 573 | + } | |
| 574 | + | |
| 575 | + if ( is_array( $_POST ) && array_key_exists( 'action', $_POST ) && $_POST['action'] === 'wppb_divi_extension_ajax' ) { | |
| 576 | + $is_elementor_edit_mode_or_divi_ajax = true; | |
| 577 | + } | |
| 578 | + | |
| 579 | + if( !is_user_logged_in() || $is_elementor_edit_mode_or_divi_ajax || $block === 'true' ){ | |
| 580 | + // set up the form arguments | |
| 581 | + $form_args = array( 'echo' => false, 'id_submit' => 'wppb-submit', 'is_ajax_form' => $is_ajax_form ); | |
| 582 | + | |
| 583 | + // maybe set up the redirect argument | |
| 584 | + if( ! empty( $redirect ) ) { | |
| 585 | + $redirect_url = $redirect; | |
| 586 | + } | |
| 587 | + | |
| 588 | + if ( ! empty( $redirect_url ) ) { | |
| 589 | + if( $redirect_priority == 'top' ) { | |
| 590 | + $form_args['redirect_priority'] = 'top'; | |
| 591 | + } else { | |
| 592 | + $form_args['redirect_priority'] = 'normal'; | |
| 593 | + } | |
| 594 | + | |
| 595 | + $form_args['redirect'] = trim( $redirect_url ); | |
| 596 | + } | |
| 597 | + | |
| 598 | + $form_args['login_username_input_type'] = 'text'; | |
| 599 | + | |
| 600 | + // change the label argument for username is login with email is enabled | |
| 601 | + if ( isset( $wppb_generalSettings['loginWith'] ) && ( $wppb_generalSettings['loginWith'] == 'email' ) ) { | |
| 602 | + $form_args['label_username'] = __('Email', 'profile-builder'); | |
| 603 | + $form_args['login_username_input_type'] = 'email'; | |
| 604 | + } | |
| 605 | + | |
| 606 | + if ( isset( $wppb_generalSettings['loginWith'] ) && ( $wppb_generalSettings['loginWith'] == 'username' ) ) { | |
| 607 | + $form_args['label_username'] = __('Username', 'profile-builder'); | |
| 608 | + } | |
| 609 | + | |
| 610 | + // change the label argument for username on login with username or email when Username and Email is enabled | |
| 611 | + if ( isset( $wppb_generalSettings['loginWith'] ) && ( $wppb_generalSettings['loginWith'] == 'usernameemail' ) ) | |
| 612 | + $form_args['label_username'] = __( 'Username or Email', 'profile-builder' ); | |
| 613 | + | |
| 614 | + // Check if 2fa is required | |
| 615 | + if( class_exists( 'WPPB_Two_Factor_Authenticator' ) ){ | |
| 616 | + $wppb_auth = new WPPB_Two_Factor_Authenticator; | |
| 617 | + $wppb_two_factor_authentication_settings = get_option( 'wppb_two_factor_authentication_settings', 'not_found' ); | |
| 618 | + if ( ( isset( $_GET['login_auth'] ) && $_GET['login_auth'] === 'true' ) || | |
| 619 | + ( ( isset($wppb_two_factor_authentication_settings['enabled']) && $wppb_two_factor_authentication_settings['enabled'] === 'yes' ) && $show_2fa_field === 'yes' ) ){ | |
| 620 | + add_action( 'login_form_middle', array( $wppb_auth, 'auth_code_field') ); | |
| 621 | + } | |
| 622 | + } | |
| 623 | + | |
| 624 | + // initialize our form variable | |
| 625 | + $login_form = ''; | |
| 626 | + | |
| 627 | + // display our login errors | |
| 628 | + if( ( isset( $_GET['loginerror'] ) || isset( $_POST['loginerror'] ) ) && isset( $_GET['_wpnonce'] ) ){ | |
| 629 | + $error_string = urldecode( base64_decode( isset( $_GET['loginerror'] ) ? sanitize_text_field( $_GET['loginerror'] ) : sanitize_text_field( $_POST['loginerror'] ) ) ); | |
| 630 | + if( wp_verify_nonce( sanitize_text_field( $_GET['_wpnonce'] ), 'wppb_login_error_'. $error_string ) ) { | |
| 631 | + if ( isset( $_GET['wppb_message_type'] ) && $_GET['wppb_message_type'] == 'success' ) | |
| 632 | + $message_type = 'wppb-success'; | |
| 633 | + else $message_type = 'wppb-error'; | |
| 634 | + $loginerror = '<p class="'. $message_type .'" role="alert">' . wp_kses_post(str_replace( '-wppb-plus-', '+', $error_string)) . '</p><!-- .error -->'; | |
| 635 | + if (isset($_GET['request_form_location'])) { | |
| 636 | + if ($_GET['request_form_location'] === 'widget' && !in_the_loop()) { | |
| 637 | + $login_form .= $loginerror; | |
| 638 | + } elseif ($_GET['request_form_location'] === 'page' && in_the_loop()) { | |
| 639 | + $login_form .= $loginerror; | |
| 640 | + } | |
| 641 | + } | |
| 642 | + } | |
| 643 | + } | |
| 644 | + // build our form | |
| 645 | + $login_form .= '<div id="wppb-login-wrap" class="wppb-user-forms">'; | |
| 646 | + | |
| 647 | + if ( empty( $lostpassword_url ) ) | |
| 648 | + $lostpassword_url = ( !empty( $wppb_generalSettings['lost_password_page'] ) ) ? $wppb_generalSettings['lost_password_page'] : ''; | |
| 649 | + | |
| 650 | + $form_args['lostpassword_url'] = $lostpassword_url; | |
| 651 | + $login_form .= wppb_login_form( apply_filters( 'wppb_login_form_args', $form_args ) ); | |
| 652 | + | |
| 653 | + if ((!empty($register_url)) || (!empty($lostpassword_url))) { | |
| 654 | + $login_form .= '<p class="login-register-lost-password">'; | |
| 655 | + $i = 0; | |
| 656 | + if (!empty($register_url)) { | |
| 657 | + if ( wppb_check_missing_http( $register_url ) ) $register_url = "http://" . $register_url; | |
| 658 | + $login_form .= '<a class="login-register" href="' . esc_url($register_url) . '">'. apply_filters('wppb_login_register_text', __('Register','profile-builder')) .'</a>'; | |
| 659 | + $i++; | |
| 660 | + } | |
| 661 | + if (!empty($lostpassword_url)) { | |
| 662 | + if ($i != 0) $login_form .= '<span class="login-separator"> | </span>'; | |
| 663 | + if ( wppb_check_missing_http( $lostpassword_url ) ) $lostpassword_url = "http://" . $lostpassword_url; | |
| 664 | + $login_form .= '<a class="login-lost-password" href="'. esc_url($lostpassword_url) .'">'. apply_filters('wppb_login_lostpass_text', __('Lost your password?','profile-builder')) .'</a>'; | |
| 665 | + } | |
| 666 | + $login_form .= '</p>'; | |
| 667 | + } | |
| 668 | + | |
| 669 | + $login_form .= apply_filters( 'wppb_login_form_bottom', '', $form_args ); | |
| 670 | + | |
| 671 | + $login_form .= '</div>'; | |
| 672 | + return apply_filters('wppb_login_form_before_content_output', $login_form, $form_args); | |
| 673 | + | |
| 674 | + }else{ | |
| 675 | + $user_ID = get_current_user_id(); | |
| 676 | + $wppb_user = get_userdata( $user_ID ); | |
| 677 | + | |
| 678 | + $login_with = isset( $wppb_generalSettings['loginWith'] ) ? $wppb_generalSettings['loginWith'] : ''; | |
| 679 | + | |
| 680 | + // Email login: always show the email. Username+email: show email when the login is the auto-generated slug from that email. | |
| 681 | + if ( $login_with === 'email' ) { | |
| 682 | + $display_name = $wppb_user->user_email; | |
| 683 | + } elseif ( $login_with === 'usernameemail' | |
| 684 | + && $wppb_user->user_login === Wordpress_Creation_Kit_PB::wck_generate_slug( trim( $wppb_user->user_email ) ) ) { | |
| 685 | + $display_name = $wppb_user->user_email; | |
| 686 | + } elseif ( $wppb_user->display_name !== '' ) { | |
| 687 | + $display_name = $wppb_user->display_name; | |
| 688 | + } else { | |
| 689 | + $display_name = $wppb_user->user_login; | |
| 690 | + } | |
| 691 | + | |
| 692 | + $logged_in_message = '<p class="wppb-alert" role="alert">'; | |
| 693 | + | |
| 694 | + // CHECK FOR REDIRECT | |
| 695 | + $logout_redirect_url = wppb_get_redirect_url( $redirect_priority, 'after_logout', $logout_redirect_url, $wppb_user ); | |
| 696 | + $logout_redirect_url = apply_filters( 'wppb_after_logout_redirect_url', $logout_redirect_url ); | |
| 697 | + | |
| 698 | + $logout_url = '<a href="'.wp_logout_url( $logout_redirect_url ).'" class="wppb-logout-url" title="'.__( 'Log out of this account', 'profile-builder' ).'">'. __('Log out »','profile-builder').'</a>'; | |
| 699 | + $logged_in_message .= sprintf(__( 'You are currently logged in as %1$s. %2$s', 'profile-builder' ), $display_name, $logout_url ); | |
| 700 | + | |
| 701 | + $logged_in_message .= '</p><!-- .wppb-alert-->'; | |
| 702 | + | |
| 703 | + return apply_filters( 'wppb_login_message', $logged_in_message, $wppb_user->ID, $display_name ); | |
| 704 | + } | |
| 705 | +} | |
| 706 | + | |
| 707 | +function wppb_login_security_check( $user, $password ) { | |
| 708 | + if( apply_filters( 'wppb_enable_csrf_token_login_form', false ) ){ | |
| 709 | + if (isset($_POST['wppb_login'])) { | |
| 710 | + if (!isset($_POST['CSRFToken-wppb']) || !wp_verify_nonce( sanitize_text_field( $_POST['CSRFToken-wppb'] ), 'wppb_login')) { | |
| 711 | + $errorMessage = __('You are not allowed to do this.', 'profile-builder'); | |
| 712 | + return new WP_Error('wppb_login_csrf_token_error', $errorMessage); | |
| 713 | + } | |
| 714 | + } | |
| 715 | + } | |
| 716 | + | |
| 717 | + return $user; | |
| 718 | +} | |
| 719 | +add_filter( 'wp_authenticate_user', 'wppb_login_security_check', 10, 2 ); | |
| 720 | + | |
| 721 | + | |
| 722 | +// include missing scripts needed on Elementor Pages (Form inside an Elementor Popup) | |
| 723 | +function wppb_login_scripts_and_styles() { | |
| 724 | + if ( is_plugin_active('elementor-pro/elementor-pro.php') && defined( 'WPPB_PAID_PLUGIN_URL' ) ) | |
| 725 | + wp_enqueue_script( 'wppb_elementor_popup_script', WPPB_PAID_PLUGIN_URL . 'features/elementor-pro/assets/js/elementor-popup.js', array('jquery') ); | |
| 726 | +} | |
| 727 | +add_action( 'elementor/frontend/after_enqueue_scripts', 'wppb_login_scripts_and_styles' ); | |