diff --git a/docker-compose.yml.example b/docker-compose.example.yml similarity index 100% rename from docker-compose.yml.example rename to docker-compose.example.yml diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 2310990162e8b82b69feba81d2828f614efc9983..e0c656f16f83aec0f9eab6090c19416d70dd71ee 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -88,7 +88,7 @@ services: networks: - doorcode dbadmin: - image: dpage/pgadmin4:4.29 + image: dpage/pgadmin4:4.30 volumes: - doorcode_pgadmin-data:/var/lib/pgadmin environment: diff --git a/nginx.Dockerfile b/nginx.Dockerfile index 5723d9f14a28262913983b5603c4303f3d8e93e8..db8a51009872bc2acbd5e5e4bc4604ceb3e3400f 100644 --- a/nginx.Dockerfile +++ b/nginx.Dockerfile @@ -1,6 +1,6 @@ ARG APP_IMAGE FROM ${APP_IMAGE} as source -FROM nginx:1.19.5-alpine +FROM nginx:1.19.6-alpine WORKDIR /var/www diff --git a/src/backend/app/Door.php b/src/backend/app/Door.php index 2245654d5fd465067afdaabc2222065f641cfa69..2e2ffb02133bd15bfaa26b5f28f1562835a5c7c5 100644 --- a/src/backend/app/Door.php +++ b/src/backend/app/Door.php @@ -54,19 +54,19 @@ class Door extends Authenticatable // Delete all entries /** @var \App\Entry $entry */ - foreach ($door->entries() as $entry) { + foreach ($door->entries()->get() as $entry) { $entry->delete(); } // Delete all attempts /** @var \App\Attempt $attempt */ - foreach ($door->attempts() as $attempt) { + foreach ($door->attempts()->get() as $attempt) { $attempt->delete(); } // Delete all overrides /** @var \App\Override $override */ - foreach ($door->overrides() as $override) { + foreach ($door->overrides()->get() as $override) { $override->delete(); } }); diff --git a/src/backend/app/Http/Controllers/Api/AuthController.php b/src/backend/app/Http/Controllers/Api/AuthController.php index 97939aece6517e7ee1c5b564b07ab899c3a921dd..766f1db2aa7c2f79d505aea73270b25b3fe4fe1d 100644 --- a/src/backend/app/Http/Controllers/Api/AuthController.php +++ b/src/backend/app/Http/Controllers/Api/AuthController.php @@ -134,7 +134,16 @@ class AuthController extends ApiController ); } - return redirect()->intended(url(config('saml.home_page')))->withCookie( + $response = redirect(); + + if ($presenter->isNewUser()) { + $response = $response->route('web.doorcode') + ->with('message', 'I see you are a new user! Please set your doorcode for door access.'); + } else { + $response = $response->intended(url(config('saml.home_page'))); + } + + return $response->withCookie( $this->cookieJar->make( 'api_token', $presenter->getViewModel()['token']['value'], diff --git a/src/backend/app/Http/Controllers/Web/Admin/LoginController.php b/src/backend/app/Http/Controllers/Web/Admin/LoginController.php index c41e70bcb940942d5585825f7d1142fa90120fe1..604b6968b9cee7d366a81e63d08f1db16ba1be04 100644 --- a/src/backend/app/Http/Controllers/Web/Admin/LoginController.php +++ b/src/backend/app/Http/Controllers/Web/Admin/LoginController.php @@ -29,11 +29,7 @@ class LoginController extends Controller try { $authenticateUseCase->attempt($presenter, $this->request->all()); - } catch (AuthenticationException $e) { - throw ValidationException::withMessages([ - 'email' => [trans('auth.failed')], - ]); - } catch (EntityNotFoundException $e) { + } catch (AuthenticationException | EntityNotFoundException $e) { throw ValidationException::withMessages([ 'email' => [trans('auth.failed')], ]); diff --git a/src/backend/app/User.php b/src/backend/app/User.php index c1faecc41d4f6328936c1f5add7b2daa04e5a45b..483191e2d34d2cdab02de854a2841838b2a204e0 100644 --- a/src/backend/app/User.php +++ b/src/backend/app/User.php @@ -64,22 +64,22 @@ class User extends Authenticatable // Delete all tokens /** @var \App\Token $token */ - foreach ($user->tokens() as $token) { + foreach ($user->tokens()->get() as $token) { $token->delete(); } /** @var \App\Entry $entry */ - foreach ($user->entries() as $entry) { + foreach ($user->entries()->get() as $entry) { $entry->delete(); } /** @var \App\Override $override */ - foreach ($user->overrides() as $override) { + foreach ($user->overrides()->get() as $override) { $override->delete(); } /** @var \App\Request $request */ - foreach ($user->requests() as $request) { + foreach ($user->requests()->get() as $request) { $request->delete(); } }); diff --git a/src/backend/src/UseCases/Users/Authenticate/APIPresenter.php b/src/backend/src/UseCases/Users/Authenticate/APIPresenter.php index 510ec587cc49c94b075d2a79b4f85bc08260bc47..3b82bb3b1ea4578b955d51dc6583bf126bb9282e 100644 --- a/src/backend/src/UseCases/Users/Authenticate/APIPresenter.php +++ b/src/backend/src/UseCases/Users/Authenticate/APIPresenter.php @@ -23,6 +23,7 @@ class APIPresenter extends BasePresenter implements Presenter } $this->viewModel['user'] = self::formatFullUser($user); + $this->viewModel['is_new'] = $responseModel->isNewUser(); $this->viewModel['token'] = [ 'value' => $responseModel->getRawToken(), 'expires_at' => self::formatDateTime($token->getExpiresAt()), @@ -35,4 +36,14 @@ class APIPresenter extends BasePresenter implements Presenter { return $this->viewModel; } + + /** + * Returns if the user was newly created + * + * @return bool + */ + public function isNewUser(): bool + { + return $this->viewModel['is_new']; + } } diff --git a/src/backend/src/UseCases/Users/Authenticate/Authenticate.php b/src/backend/src/UseCases/Users/Authenticate/Authenticate.php index bd83f4f3f10f752f681f78ffaf2894fce091aa53..0a33f2d2369e24999819968015cfe125e9fd4c3b 100644 --- a/src/backend/src/UseCases/Users/Authenticate/Authenticate.php +++ b/src/backend/src/UseCases/Users/Authenticate/Authenticate.php @@ -117,6 +117,7 @@ class Authenticate implements AuthenticateUseCase * - Emplid found, email not found * Update found emplid user */ + $newlyCreated = false; if (!$user) { if ($emailUser) { $user = $this->users->update($emailUser->getId(), new User( @@ -133,6 +134,8 @@ class Authenticate implements AuthenticateUseCase $emailUser->getUpdatedAt() )); } else { + // We want to direct new users to the + $newlyCreated = true; $user = $this->users->create(new User( 0, $samlUser->getFirstName(), @@ -177,7 +180,7 @@ class Authenticate implements AuthenticateUseCase $token = $this->tokens->createLoginToken($user->getId(), $this->salt); - $response = new ResponseModel($user, $token->getRaw(), $token->getToken()); + $response = new ResponseModel($user, $token->getRaw(), $token->getToken(), $newlyCreated); $presenter->present($response); } diff --git a/src/backend/src/UseCases/Users/Authenticate/ResponseModel.php b/src/backend/src/UseCases/Users/Authenticate/ResponseModel.php index 1c5ca524314c8daebc9ecd039528378ff4063a57..af5d933dd76bb7501aa50cf1932695b2f7ddbb2a 100644 --- a/src/backend/src/UseCases/Users/Authenticate/ResponseModel.php +++ b/src/backend/src/UseCases/Users/Authenticate/ResponseModel.php @@ -22,16 +22,23 @@ class ResponseModel */ protected string $tokenString; + /** + * @var bool + */ + protected bool $newUser; + /** * @param User $user * @param string $tokenString * @param Token $token + * @param bool $newUser */ - public function __construct(User $user, string $tokenString, Token $token) + public function __construct(User $user, string $tokenString, Token $token, bool $newUser = false) { $this->user = $user; $this->token = $token; $this->tokenString = $tokenString; + $this->newUser = $newUser; } /** @@ -57,4 +64,12 @@ class ResponseModel { return $this->tokenString; } + + /** + * @return bool + */ + public function isNewUser(): bool + { + return $this->newUser; + } }