PluginProbe
User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor / 4.0.2
User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor v4.0.2
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 4.0.2, at front-end/login.php

727 lines 35.7 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 $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 &raquo;','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' );