mirror of
https://github.com/delight-im/PHP-Auth.git
synced 2025-07-31 13:20:11 +02:00
Implement method 'changeEmail' in class 'Auth'
This commit is contained in:
62
src/Auth.php
62
src/Auth.php
@@ -654,6 +654,68 @@ final class Auth extends UserManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to change the email address of the currently signed-in user (which requires confirmation)
|
||||
*
|
||||
* 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 string $newEmail the desired new email address
|
||||
* @param callable $callback the function that sends the confirmation email to the user
|
||||
* @throws InvalidEmailException if the desired new email address is invalid
|
||||
* @throws UserAlreadyExistsException if a user with the desired new email address already exists
|
||||
* @throws EmailNotVerifiedException if the current (old) email address has not been verified yet
|
||||
* @throws NotLoggedInException if the user is not currently signed in
|
||||
* @throws AuthError if an internal problem occurred (do *not* catch)
|
||||
*
|
||||
* @see confirmEmail
|
||||
* @see confirmEmailAndSignIn
|
||||
*/
|
||||
public function changeEmail($newEmail, callable $callback) {
|
||||
if ($this->isLoggedIn()) {
|
||||
$newEmail = self::validateEmailAddress($newEmail);
|
||||
|
||||
try {
|
||||
$existingUsersWithNewEmail = $this->db->selectValue(
|
||||
'SELECT COUNT(*) FROM ' . $this->dbTablePrefix . 'users WHERE email = ?',
|
||||
[ $newEmail ]
|
||||
);
|
||||
}
|
||||
catch (Error $e) {
|
||||
throw new DatabaseError();
|
||||
}
|
||||
|
||||
if ((int) $existingUsersWithNewEmail !== 0) {
|
||||
throw new UserAlreadyExistsException();
|
||||
}
|
||||
|
||||
try {
|
||||
$verified = $this->db->selectValue(
|
||||
'SELECT verified FROM ' . $this->dbTablePrefix . 'users WHERE id = ?',
|
||||
[ $this->getUserId() ]
|
||||
);
|
||||
}
|
||||
catch (Error $e) {
|
||||
throw new DatabaseError();
|
||||
}
|
||||
|
||||
// ensure that at least the current (old) email address has been verified before proceeding
|
||||
if ((int) $verified !== 1) {
|
||||
throw new EmailNotVerifiedException();
|
||||
}
|
||||
|
||||
$this->createConfirmationRequest($this->getUserId(), $newEmail, $callback);
|
||||
}
|
||||
else {
|
||||
throw new NotLoggedInException();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initiates a password reset request for the user with the specified email address
|
||||
*
|
||||
|
Reference in New Issue
Block a user