PluginProbe
User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor / 3.15.9
User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor v3.15.9
4.0.2 4.0.1 4.0.0 3.16.6 3.16.5 3.16.4 3.16.3 3.16.2 3.16.1 3.16.0 3.15.9 3.9.9 3.9.5 3.9.6 3.9.7 3.9.8 1.1.7 1.1.8 1.1.9 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 All 340 releases
profile-builder / front-end / login.php

login.php in User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor 3.15.9, at front-end/login.php

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