diff --git a/src/Auth.php b/src/Auth.php index e2774e9..33ad526 100644 --- a/src/Auth.php +++ b/src/Auth.php @@ -589,99 +589,6 @@ final class Auth extends UserManager { } } - /** - * Creates a new user - * - * If you want the user's account to be activated by default, pass `null` as the callback - * - * If you want to make the user verify their email address first, pass an anonymous function as the callback - * - * The callback function must have the following signature: - * - * `function ($selector, $token)` - * - * Both pieces of information must be sent to the user, usually embedded in a link - * - * When the user wants to verify their email address as a next step, both pieces will be required again - * - * @param bool $requireUniqueUsername whether it must be ensured that the username is unique - * @param string $email the email address to register - * @param string $password the password for the new account - * @param string|null $username (optional) the username that will be displayed - * @param callable|null $callback (optional) the function that sends the confirmation email to the user - * @return int the ID of the user that has been created (if any) - * @throws InvalidEmailException if the email address was invalid - * @throws InvalidPasswordException if the password was invalid - * @throws UserAlreadyExistsException if a user with the specified email address already exists - * @throws DuplicateUsernameException if it was specified that the username must be unique while it was *not* - * @throws AuthError if an internal problem occurred (do *not* catch) - */ - private function createUserInternal($requireUniqueUsername, $email, $password, $username = null, callable $callback = null) { - $this->throttle(self::THROTTLE_ACTION_REGISTER); - - ignore_user_abort(true); - - $email = self::validateEmailAddress($email); - $password = self::validatePassword($password); - - $username = isset($username) ? trim($username) : null; - - // if the supplied username is the empty string or has consisted of whitespace only - if ($username === '') { - // this actually means that there is no username - $username = null; - } - - // if the uniqueness of the username is to be ensured - if ($requireUniqueUsername) { - // if a username has actually been provided - if ($username !== null) { - // count the number of users who do already have that specified username - $occurrencesOfUsername = $this->db->selectValue( - 'SELECT COUNT(*) FROM users WHERE username = ?', - [ $username ] - ); - - // if any user with that username does already exist - if ($occurrencesOfUsername > 0) { - // cancel the operation and report the violation of this requirement - throw new DuplicateUsernameException(); - } - } - } - - $password = password_hash($password, PASSWORD_DEFAULT); - $verified = isset($callback) && is_callable($callback) ? 0 : 1; - - try { - $this->db->insert( - 'users', - [ - 'email' => $email, - 'password' => $password, - 'username' => $username, - 'verified' => $verified, - 'registered' => time() - ] - ); - } - catch (IntegrityConstraintViolationException $e) { - // if we have a duplicate entry - throw new UserAlreadyExistsException(); - } - catch (Error $e) { - throw new DatabaseError(); - } - - $newUserId = (int) $this->db->getLastInsertId(); - - if ($verified === 0) { - $this->createConfirmationRequest($email, $callback); - } - - return $newUserId; - } - /** * Authenticates an existing user * diff --git a/src/UserManager.php b/src/UserManager.php index 52bc566..dacbff7 100644 --- a/src/UserManager.php +++ b/src/UserManager.php @@ -67,6 +67,99 @@ abstract class UserManager { } } + /** + * Creates a new user + * + * If you want the user's account to be activated by default, pass `null` as the callback + * + * If you want to make the user verify their email address first, pass an anonymous function as the callback + * + * The callback function must have the following signature: + * + * `function ($selector, $token)` + * + * Both pieces of information must be sent to the user, usually embedded in a link + * + * When the user wants to verify their email address as a next step, both pieces will be required again + * + * @param bool $requireUniqueUsername whether it must be ensured that the username is unique + * @param string $email the email address to register + * @param string $password the password for the new account + * @param string|null $username (optional) the username that will be displayed + * @param callable|null $callback (optional) the function that sends the confirmation email to the user + * @return int the ID of the user that has been created (if any) + * @throws InvalidEmailException if the email address was invalid + * @throws InvalidPasswordException if the password was invalid + * @throws UserAlreadyExistsException if a user with the specified email address already exists + * @throws DuplicateUsernameException if it was specified that the username must be unique while it was *not* + * @throws AuthError if an internal problem occurred (do *not* catch) + */ + protected function createUserInternal($requireUniqueUsername, $email, $password, $username = null, callable $callback = null) { + $this->throttle(self::THROTTLE_ACTION_REGISTER); + + ignore_user_abort(true); + + $email = self::validateEmailAddress($email); + $password = self::validatePassword($password); + + $username = isset($username) ? trim($username) : null; + + // if the supplied username is the empty string or has consisted of whitespace only + if ($username === '') { + // this actually means that there is no username + $username = null; + } + + // if the uniqueness of the username is to be ensured + if ($requireUniqueUsername) { + // if a username has actually been provided + if ($username !== null) { + // count the number of users who do already have that specified username + $occurrencesOfUsername = $this->db->selectValue( + 'SELECT COUNT(*) FROM users WHERE username = ?', + [ $username ] + ); + + // if any user with that username does already exist + if ($occurrencesOfUsername > 0) { + // cancel the operation and report the violation of this requirement + throw new DuplicateUsernameException(); + } + } + } + + $password = password_hash($password, PASSWORD_DEFAULT); + $verified = isset($callback) && is_callable($callback) ? 0 : 1; + + try { + $this->db->insert( + 'users', + [ + 'email' => $email, + 'password' => $password, + 'username' => $username, + 'verified' => $verified, + 'registered' => time() + ] + ); + } + catch (IntegrityConstraintViolationException $e) { + // if we have a duplicate entry + throw new UserAlreadyExistsException(); + } + catch (Error $e) { + throw new DatabaseError(); + } + + $newUserId = (int) $this->db->getLastInsertId(); + + if ($verified === 0) { + $this->createConfirmationRequest($email, $callback); + } + + return $newUserId; + } + /** * Validates an email address *