get('_fsupport_signup_nonce'), 'fluent_support_signup_nonce')) {
return $this->sendError([
'message' => __('Security verification failed. Please try again', 'fluent-support')
]);
}
$fields = AuthHandler::getSignupFields();
$rules = $this->getRules($fields);
$messages = $this->getMessages($rules);
/*
* Filter user signup form data
*
* @since v1.0.0
* @param array $formData
*/
$formData = apply_filters('fluent_support/signup_form_data', $request->all());
/*
* Action before validate user signup
*
* @since v1.0.0
* @param array $formData
*/
do_action('fluent_support/before_signup_validation', $formData);
$this->validate($formData, $rules, $messages);
/*
* Action After validate user signup validation success
*
* @since v1.0.0
* @param array $formData
*/
do_action('fluent_support/after_signup_validation', $formData);
$userId = $this->createUser($formData);
if (is_wp_error($userId)) {
return $this->response(
apply_filters(
'fluent_support/signup_create_user_error',
['error' => $userId->get_error_message()]
), 423);
}
/*
* Action After creating WP user from ticket sign up form
*
* @since v1.0.0
* @param array $formData
*/
do_action('fluent_support/after_creating_user');
$this->maybeUpdateUser($userId, $formData);
$this->assignRole($userId);
$this->login($userId);
/*
* Filter for user signup complete message and redirect
*
* @since v1.0.0
* @param array $response
*/
$response = apply_filters('fluent_support/signup_complete_response', [
'message' => __('Successfully registered to the site.', 'fluent-support'),
'redirect' => Arr::get($formData, '__redirect_to', Helper::getPortalBaseUrl())
]);
return $this->response($response);
}
/**
* handleLogin method will perform login functionality and redirect
* @param Request $request
* @return \WP_REST_Response
*/
public function handleLogin(Request $request)
{
if (!wp_verify_nonce($request->get('_support_login_nonce'), 'fsupport_login_nonce')) {
return $this->response([
'message' => __('Security verification failed', 'fluent-support')
], 403);
}
$data = $request->all();
if (empty($data['pwd']) || empty($data['log'])) {
return $this->response([
'message' => __('Email and Password is required', 'fluent-support')
], 403);
}
$redirectUrl = Helper::getPortalBaseUrl();
if (get_current_user_id()) { // user already registered
return $this->sendSuccess([
'redirect' => $redirectUrl
]);
}
$email = $data['log'];
$password = $data['pwd'];
if (is_email($email)) {
$user = get_user_by('email', $email);
} else {
$user = get_user_by('login', $email);
}
if (!$user) {
return $this->response([
'message' => __('Email or Password is not valid. Please try again', 'fluent-support')
], 403);
}
$info = array(
'user_login' => sanitize_text_field(trim($_POST['log'])),
'user_password' => trim($_POST['pwd']),
'remember' => isset($_POST['rememberme']),
);
if (apply_filters('fluent_support_use_native_login', true)) {
return $this->nativeLoginHandler($user, $info, $redirectUrl);
}
if (wp_check_password($password, $user->user_pass, $user->ID)) {
$this->login($user->ID);
return $this->sendSuccess([
'redirect' => $redirectUrl
]);
}
return $this->response([
'message' => __('Email or Password is not valid. Please try again', 'fluent-support')
], 403);
}
private function nativeLoginHandler($user, $info, $redirectUrl = '')
{
if (!$redirectUrl) {
$redirectUrl = Helper::getPortalBaseUrl();
}
$secure_cookie = is_ssl();
if (!$secure_cookie && !force_ssl_admin()) {
if (get_user_option('use_ssl', $user->ID)) {
$secure_cookie = true;
force_ssl_admin(true);
}
}
if (class_exists('\Limit_Login_Attempts')) {
global $limit_login_attempts_obj;
$limit_login_attempts_try = $limit_login_attempts_obj->wp_authenticate_user($user, false);
if (is_wp_error($limit_login_attempts_try)) {
return $this->response([
'message' => implode('
', $limit_login_attempts_try->get_error_messages())
], 403);
}
}
$user_signon = wp_signon($info, $secure_cookie);
if (!is_wp_error($user_signon) && empty($_COOKIE[LOGGED_IN_COOKIE])) {
if (headers_sent()) {
return $this->response([
'message' => sprintf(__('ERROR: Cookies are blocked due to unexpected output. For help, please see this documentation or try the support forums.'),
__('https://codex.wordpress.org/Cookies'), __('https://wordpress.org/support/'))
], 403);
}
}
if (is_wp_error($user_signon)) {
$errorMessage = __('Email or Password is not valid. Please try again', 'fluent-support');
if (class_exists('Limit_Login_Attempts')) {
global $limit_login_attempts_obj;
if ($limit_login_attempts_obj) {
$limit_login_attempts_obj->limit_login_failed($user->user_login);
$msg = $limit_login_attempts_obj->get_message();
if ($msg) {
$errorMessage = $msg;
}
}
}
return $this->response([
'message' => $errorMessage
], 403);
}
// WP Last Login plugin compatibility
if (class_exists('\Obenland_Wp_Last_Login')) {
update_user_meta($user_signon->ID, 'wp-last-login', time());
}
return $this->sendSuccess([
'redirect' => $redirectUrl
]);
}
/**
* getRules method will prepare the rules for the input field
* @param array $fields
* @return mixed
*/
protected function getRules($fields = [])
{
$rules = [];
foreach ($fields as $fieldName => $field) {
if (array_key_exists('required', $field)) {
$rules[$fieldName] = 'required';
}
$pipe = array_key_exists($fieldName, $rules) ? '|' : '';
if ($field['type'] === 'email') {
$rules[$fieldName] = $rules[$fieldName] . $pipe . 'email';
} elseif ($field['type'] === 'password') {
$rules[$fieldName] = $rules[$fieldName] . $pipe . 'min:8';
}
}
/*
* Filter user signup validation rules
*
* @since v1.0.0
* @param array $rules
*/
return apply_filters('fluent_support/signup_validation_rules', $rules);
}
/**
* getMessages message will return the validation message regarding sign up or sign in
* @param array $rules
* @return mixed
*/
protected function getMessages($rules = [])
{
/*
* Filter user signup validation message
*
* @since v1.0.0
* @param array $arg
* @param array $rules
*/
return apply_filters('fluent_support/signup_validation_messages', [], $rules);
}
/**
* createUser method will create new user
* @param array $formData
* @return mixed
*/
public function createUser($formData = [])
{
/*
* Filter user signup email
*
* @since v1.0.0
* @param string $email
*/
$email = apply_filters('fluent_support/signup_email', Arr::get($formData, 'email'));
/*
* Filter user signup username
*
* @since v1.0.0
* @param string $username
*/
$userName = apply_filters('fluent_support/signup_username', Arr::get($formData, 'username'));
if (empty($formData['password'])) {
$password = wp_generate_password(8);
} else {
$password = $formData['password'];
}
/*
* Filter user signup password
*
* @since v1.0.0
* @param string $password
*/
$password = apply_filters('fluent_support/signup_password', $password);
/*
* Action before creating WP user using Fluent Support signup form
*
* @since v1.0.0
* @param string $userName
* @param string $password
* @param string $email
*/
do_action('fluent_support/before_creating_user', $userName, $password, $email);
return wp_create_user($userName, $password, $email);
}
/**
* maybeUpdateUser method will update user information if exists
* @param $userId
* @param $formData
*/
public function maybeUpdateUser($userId, $formData)
{
$name = trim(Arr::get($formData, 'first_name') . ' ' . Arr::get($formData, 'last_name'));
$data = array_filter([
'ID' => $userId,
'user_nicename' => $name,
'display_name' => $name,
'first_name' => Arr::get($formData, 'first_name'),
'last_name' => Arr::get($formData, 'last_name'),
]);
if ($name) {
/*
* Action before updating a customer/user
*
* @since v1.0.0
* @param array $data
*/
do_action('fluent_support/before_updating_user', $data);
/*
* Filter user updatable data
*
* @since v1.0.0
* @param $data
*/
$updateUserData = apply_filters('fluent_support/update_user_data', $data);
wp_update_user($updateUserData);
/*
* Action after updating a customer/user
*
* @since v1.0.0
* @param array $data
*/
do_action('fluent_support/after_updating_user', $data);
}
}
/**
* assignRole method will assign role to a given user id
* @param $userId
*/
protected function assignRole($userId)
{
$user = new \WP_User($userId);
/*
* Action before assigning role to registered user
*
* @since v1.0.0
* @param array $data
*/
do_action('fluent_support/before_assigning_role', $user);
/*
* Filter user assignable role after signup
*
* @since v1.0.0
* @param string $setRole WordPress user role key
*/
$setRole = apply_filters('fluent_support/user_role', 'subscriber');
$user->set_role($setRole);
/*
* Action after assigning role to registered user
*
* @since v1.0.0
* @param array $data
*/
do_action('fluent_support/after_assigning_role', $user);
}
/**
* login method will clear existing cookies and set new cookie for a given user id
* @param $userId
*/
protected function login($userId)
{
/*
* Action before login
*
* @since v1.0.0
* @param integer $userId
*/
do_action('fluent_support/before_logging_in_user', $userId);
wp_clear_auth_cookie();
wp_set_current_user($userId);
wp_set_auth_cookie($userId);
/*
* Action after login
*
* @since v1.0.0
* @param integer $userId
*/
do_action('fluent_support/after_logging_in_user', $userId);
}
}