ยท
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;
}
}