email, [$customer->first_name, $customer->last_name]); return self::registerNewUser( $userName, $customer->email, '', [ 'first_name' => $customer->first_name, 'last_name' => $customer->last_name, 'role' => $userRole ] ); } public static function registerNewUser($user_login, $user_email, $user_pass = '', $extraData = []) { $errors = new \WP_Error(); $sanitized_user_login = sanitize_user($user_login); // Check the username. if ('' === $sanitized_user_login) { $errors->add('empty_username', __('Error: Please enter a username.', 'fluent-cart')); } elseif (username_exists($sanitized_user_login)) { $errors->add('username_exists', __('Error: This username is already registered. Please choose another one.', 'fluent-cart')); } // Check the email address. if ('' === $user_email) { $errors->add('empty_email', __('Error: Please type your email address.', 'fluent-cart')); } elseif (!is_email($user_email)) { $errors->add('invalid_email', __('Error: The email address is not correct.', 'fluent-cart')); $user_email = ''; } elseif (email_exists($user_email)) { $errors->add( 'email_exists', __('Error: This email address is already registered. Please login or try resetting your password.', 'fluent-cart') ); } if ($errors->has_errors()) { return $errors; } $isGeneratedPassword = false; if (!$user_pass) { $isGeneratedPassword = true; $user_pass = wp_generate_password(8, false); } $data = [ 'user_login' => wp_slash($sanitized_user_login), 'user_email' => wp_slash($user_email), 'user_pass' => $user_pass ]; if (!empty($extraData['first_name'])) { $data['first_name'] = sanitize_text_field($extraData['first_name']); } if (!empty($extraData['last_name'])) { $data['last_name'] = sanitize_text_field($extraData['last_name']); } if (!empty($extraData['full_name']) && empty($extraData['first_name']) && empty($extraData['last_name'])) { $extraData['full_name'] = sanitize_text_field($extraData['full_name']); // extract the names $fullNameArray = explode(' ', $extraData['full_name']); $data['first_name'] = array_shift($fullNameArray); if ($fullNameArray) { $data['last_name'] = implode(' ', $fullNameArray); } else { $data['last_name'] = ''; } } if (!empty($extraData['description'])) { $data['description'] = sanitize_textarea_field($extraData['description']); } if (!empty($extraData['user_url']) && filter_var($extraData['user_url'], FILTER_VALIDATE_URL)) { $data['user_url'] = sanitize_url($extraData['user_url']); } if (!empty($extraData['role'])) { $data['role'] = $extraData['role']; } $user_id = wp_insert_user($data); if (!$user_id || is_wp_error($user_id)) { $errors->add('registerfail', __('Error: Could not register you. Please contact the site admin!', 'fluent-cart')); return $errors; } if (!empty($_COOKIE['wp_lang'])) { $wp_lang = sanitize_text_field(wp_unslash($_COOKIE['wp_lang'])); if (in_array($wp_lang, get_available_languages(), true)) { update_user_meta($user_id, 'locale', $wp_lang); // Set user locale if defined on registration. } } if ($isGeneratedPassword) { update_user_meta($user_id, 'default_password_nag', true); // Set up the password change nag. } do_action('fluent_cart/user/after_register', $user_id, [ 'user_id' => $user_id ]); if (apply_filters('fluent_cart/user/after_register/skip_hooks', false, $user_id)) { return $user_id; } do_action('register_new_user', $user_id); return $user_id; } public static function makeLogin($user) { wp_clear_auth_cookie(); wp_set_current_user($user->ID, $user->user_login); wp_set_auth_cookie($user->ID, true, is_ssl()); $user = get_user_by('ID', $user->ID); if ($user) { // do_action('wp_login', $user->user_login, $user); } return $user; } public static function createUserNameFromStrings($maybeEmail, $fallbacks = []) { $emailParts = explode('@', $maybeEmail); $userName = $emailParts[0]; $userName = self::sanitizeUserName($userName); if (self::isUsernameAvailable($userName)) { return $userName; } foreach ($fallbacks as $fallback) { // only take alphanumeric characters and _ - $fallback = preg_replace('/[^a-zA-Z0-9_-]/', '', $fallback); $userName = self::sanitizeUserName($fallback); if (self::isUsernameAvailable($userName)) { return $userName; } } $userName = strtolower($emailParts[0]); $finalUserName = $userName; // loop until we find a unique username $counter = 2; while (!self::isUsernameAvailable($userName)) { $userName = $finalUserName . $counter; $counter++; if ($counter % 100 === 0) { $finalUserName = $finalUserName . '-' . time(); } } return $userName; } private static function sanitizeUserName($username) { $username = strtolower($username); // check of @ symbol if (strpos($username, '@') !== false) { $username = explode('@', $username)[0]; } $username = sanitize_user($username); $username = preg_replace('/[^a-zA-Z0-9_]/', '', $username); return $username; } private static function isUsernameAvailable($userName) { $userName = strtolower($userName); if (strlen($userName) < 3) { return false; } $reservedUserNames = self::getReservedUserNames(); if (in_array($userName, $reservedUserNames)) { return false; } if (defined('FLUENT_COMMUNITY_PLUGIN_VERSION')) { $xProfile = \FluentCommunity\App\Models\XProfile::where('username', $userName) ->exists(); if ($xProfile) { return false; } } $illegal_user_logins = (array)apply_filters('illegal_user_logins', array()); if (in_array($userName, array_map('strtolower', $illegal_user_logins), true)) { return false; } if (username_exists($userName)) { return false; } return true; } private static function getReservedUserNames() { return apply_filters('fluent_community/reserved_usernames', [ 'admin', 'administrator', 'me', 'moderator', 'mod', 'superuser', 'root', 'system', 'official', 'staff', 'support', 'helpdesk', 'user', 'guest', 'anonymous', 'everyone', 'anybody', 'someone', 'webmaster', 'postmaster', 'hostmaster', 'abuse', 'security', 'ssl', 'firewall', 'no-reply', 'noreply', 'mail', 'email', 'mailer', 'smtp', 'pop', 'imap', 'ftp', 'sftp', 'ssh', 'ceo', 'cfo', 'cto', 'founder', 'cofounder', 'owner', 'president', 'vicepresident', 'director', 'manager', 'supervisor', 'executive', 'info', 'contact', 'sales', 'marketing', 'support', 'billing', 'accounting', 'finance', 'hr', 'humanresources', 'legal', 'compliance', 'it', 'itsupport', 'customerservice', 'customersupport', 'dev', 'developer', 'api', 'sdk', 'app', 'bot', 'chatbot', 'sysadmin', 'devops', 'infosec', 'security', 'test', 'testing', 'beta', 'alpha', 'staging', 'production', 'development', 'home', 'about', 'contact', 'faq', 'help', 'news', 'blog', 'forum', 'community', 'events', 'calendar', 'shop', 'store', 'cart', 'checkout', 'social', 'follow', 'like', 'share', 'tweet', 'post', 'status', 'privacy', 'terms', 'copyright', 'trademark', 'legal', 'policy', 'all', 'none', 'null', 'undefined', 'true', 'false', 'default', 'example', 'sample', 'demo', 'temporary', 'delete', 'remove', 'profanity', 'explicit', 'offensive', 'yourappname', 'yourbrandname', 'yourdomain', ]); } }