user_login; } } $result = wp_signon( array( 'user_login' => $login, 'user_password' => $password, 'remember' => $remember, ), is_ssl() ); if ( is_wp_error( $result ) ) { self::fail( $result->get_error_message(), 'login' ); } self::succeed(); } /** * Create a subscriber and sign them in. */ private static function handle_register(): void { if ( ! self::can_register() ) { self::fail( __( 'Registration is disabled.', '4wp-account' ), 'login' ); } $email = isset( $_POST['forwp_account_email'] ) ? sanitize_email( wp_unslash( (string) $_POST['forwp_account_email'] ) ) : ''; $password = isset( $_POST['forwp_account_new_pwd'] ) ? (string) wp_unslash( $_POST['forwp_account_new_pwd'] ) : ''; if ( ! is_email( $email ) ) { self::fail( __( 'Enter a valid email address.', '4wp-account' ), 'register' ); } if ( strlen( $password ) < 8 ) { self::fail( __( 'Password must be at least 8 characters.', '4wp-account' ), 'register' ); } if ( email_exists( $email ) ) { self::fail( __( 'An account with this email already exists. Sign in instead.', '4wp-account' ), 'login' ); } $username = self::username_from_email( $email ); $user_id = wp_create_user( $username, $password, $email ); if ( is_wp_error( $user_id ) ) { self::fail( $user_id->get_error_message(), 'register' ); } $result = wp_signon( array( 'user_login' => $username, 'user_password' => $password, 'remember' => true, ), is_ssl() ); if ( is_wp_error( $result ) ) { self::fail( $result->get_error_message(), 'login' ); } self::succeed(); } /** * Send the core lost-password email. */ private static function handle_lost_password(): void { $login = isset( $_POST['forwp_account_lost'] ) ? sanitize_text_field( wp_unslash( (string) $_POST['forwp_account_lost'] ) ) : ''; if ( '' === $login ) { self::fail( __( 'Enter your email or username.', '4wp-account' ), 'lostpassword' ); } if ( is_email( $login ) ) { $user_by_email = get_user_by( 'email', $login ); if ( $user_by_email instanceof \WP_User ) { $login = $user_by_email->user_login; } } if ( function_exists( 'retrieve_password' ) ) { $result = retrieve_password( $login ); if ( is_wp_error( $result ) ) { self::fail( $result->get_error_message(), 'lostpassword' ); } } else { self::fail( __( 'Password reset is not available.', '4wp-account' ), 'lostpassword' ); } $url = add_query_arg( array( 'form' => 'login', 'forwp_account_notice' => rawurlencode( __( 'Check your email for the reset link.', '4wp-account' ) ), ), AccountMenu::get_account_page_url() ); wp_safe_redirect( $url ); exit; } /** * Unique username from the email local part. * * @param string $email Email address. */ private static function username_from_email( string $email ): string { $base = sanitize_user( strstr( $email, '@', true ), true ); if ( '' === $base ) { $base = 'user'; } $username = $base; $counter = 1; while ( username_exists( $username ) ) { $username = $base . $counter; ++$counter; } return $username; } /** * Redirect after successful login. */ private static function succeed(): void { $default = AccountMenu::get_account_page_url(); $target = OAuthRedirect::consume_cookie( $default ); wp_safe_redirect( OAuthRedirect::normalize( $target, $default ) ); exit; } /** * PRG error redirect. * * @param string $message Error message. * @param string $mode Form panel. */ private static function fail( string $message, string $mode = 'login' ): void { $args = array( 'forwp_account_error' => rawurlencode( $message ), ); if ( 'login' !== $mode ) { $args['form'] = $mode; } wp_safe_redirect( add_query_arg( $args, AccountMenu::get_account_page_url() ) ); exit; } }