- Made workable with external instances, was previously too contrained to allow for such events

This commit is contained in:
Dave Mc Nicoll 2021-10-19 12:41:52 +00:00
parent fed3bc7f85
commit 374b056754
1 changed files with 30 additions and 20 deletions

View File

@ -30,15 +30,13 @@ class Authenticate {
) { ) {
$this->session = $session; $this->session = $session;
$this->cookie = $cookie; $this->cookie = $cookie;
$this->authenticationEvent = $authenticationEvent ?: function(bool $authenticated, string $message, ? User $user, array $data = []) : bool {return false;} ; $this->authenticationEvent = $authenticationEvent ?: function(bool $authenticated, string $message, ? User $user, array $data = []) : ? bool {return null;} ;
} }
public function rememberMe(\Ulmus\Repository $repository) : ? User public function rememberMe(\Ulmus\Repository $repository) : ? User
{ {
$logUser = function(int $id) use ($repository) { $logUser = function(int $id) use ($repository) {
if ( null === ( $user = $repository->loadFromPk($id) ) ) { if ( null === ( $user = $repository->loadFromPk($id) ) ) {
$this->logout();
throw new \Exception("User not found."); throw new \Exception("User not found.");
} }
@ -63,7 +61,7 @@ class Authenticate {
$this->session->destroy(); $this->session->destroy();
} }
public function authenticate(\Ulmus\Repository $repository, array $userLogin, ? string $password) : User public function authenticate(\Ulmus\Repository $repository, array $userLogin, string $password) : User
{ {
foreach($userLogin as $field => $value) { foreach($userLogin as $field => $value) {
$repository->or($field, $value); $repository->or($field, $value);
@ -78,7 +76,14 @@ class Authenticate {
} }
} }
if ( $this->user->isLoaded() && ( call_user_func_array($this->authenticationEvent, [ false, 'verifyPassword', $this->user, [ 'password' => $password ] ]) || $this->user->verifyPassword($password) ) ) { if ( ! $this->user->isLoaded() ) {
call_user_func_array($this->authenticationEvent, [ false, 'userNotFound', $this->user, [ 'user_login' => $userLogin, 'password' => $password ] ]);
}
if ($this->user->isLoaded()) {
$response = call_user_func_array($this->authenticationEvent, [ false, 'verifyPassword', $this->user, [ 'password' => $password ] ]);
if ( $response !== null ? $response : $this->user->verifyPassword($password) ) {
$this->user->logged = true; $this->user->logged = true;
if ( $this->session ) { if ( $this->session ) {
@ -96,6 +101,11 @@ class Authenticate {
call_user_func_array($this->authenticationEvent, [ false, 'invalidPassword', $this->user ]); call_user_func_array($this->authenticationEvent, [ false, 'invalidPassword', $this->user ]);
} }
}
if ( ! $this->user->isLoaded() ) {
call_user_func_array($this->authenticationEvent, [ false, 'authenticationFailed', $this->user, [ 'user_login' => $userLogin, 'password' => $password ] ]);
}
return $this->user; return $this->user;
} }
@ -113,7 +123,7 @@ class Authenticate {
$this->cookie->delete('user.id'); $this->cookie->delete('user.id');
} }
$this->user && $this->user->logged = false; $this->user->logged = false;
return $this; return $this;
} }