diff --git a/.ddev/php/xdebug.ini b/.ddev/php/xdebug.ini new file mode 100644 index 0000000..324203b --- /dev/null +++ b/.ddev/php/xdebug.ini @@ -0,0 +1,2 @@ +[xdebug] +xdebug.client_port = 9009 diff --git a/app/Enums/ApplicationTypeEnum.php b/app/Enums/ApplicationTypeEnum.php new file mode 100644 index 0000000..7b4cde0 --- /dev/null +++ b/app/Enums/ApplicationTypeEnum.php @@ -0,0 +1,41 @@ + [ + 'name' => $enum->toLabel(), + 'value' => $enum->value, + 'hint' => $enum->toHint(), + ], self::cases()); + } + + public function toLabel(): string + { + return match ($this) { + self::Web => 'Web Applications', + self::SPA => 'Single Page Applications', + self::Machine => 'Microservices', + }; + } + + public function toHint(): string + { + return match ($this) { + self::Web => 'Server-side rendered web application, where authentication is handled by the server.', + self::SPA => 'Single Page Application where client side framework e.g. React, Vue, Angular is used, and gets the authentication token from the server.', + self::Machine => 'Application that runs on a machine, e.g. a serverless function, or a container.', + }; + } +} diff --git a/app/Enums/ConnectionProtocolEnum.php b/app/Enums/ConnectionProtocolEnum.php index beac291..a600457 100644 --- a/app/Enums/ConnectionProtocolEnum.php +++ b/app/Enums/ConnectionProtocolEnum.php @@ -5,13 +5,40 @@ namespace App\Enums; use App\Concerns\EnumValuesAsArray; +use App\Contracts\EnumMorphsToOptionsContract; -enum ConnectionProtocolEnum: string +enum ConnectionProtocolEnum: string implements EnumMorphsToOptionsContract { use EnumValuesAsArray; case OIDC = 'oidc'; case SAML = 'saml'; - case OAUTH2 = 'oauth2'; case URL = 'url'; + + public static function asOptions(): array + { + return array_map(fn (self $enum) => [ + 'name' => $enum->toLabel(), + 'value' => mb_strtolower($enum->name), + 'hint' => $enum->toHint(), + ], self::cases()); + } + + public function toLabel(): string + { + return match ($this) { + self::OIDC => 'OIDC - OpenID Connect', + self::SAML => 'SAML 2.0', + self::URL => 'Redirect URL', + }; + } + + public function toHint(): string + { + return match ($this) { + self::OIDC => 'Modern authentication protocol built on OAuth 2.0 for secure user sign-in across web, mobile, and API-based applications.', + self::SAML => 'XML-based Single Sign-On (SSO) protocol commonly used by enterprise applications and identity providers', + self::URL => 'Simple URL that will redirect the user to the authentication page.', + }; + } } diff --git a/app/Livewire/Forms/CreateAppSelectionForm.php b/app/Livewire/Forms/CreateAppSelectionForm.php new file mode 100644 index 0000000..0f8dbd1 --- /dev/null +++ b/app/Livewire/Forms/CreateAppSelectionForm.php @@ -0,0 +1,30 @@ +value; + + public string $applicationType = ApplicationTypeEnum::Web->value; + + protected function rules(): array + { + return [ + 'connectionProtocol' => [ + 'required', + Rule::enum(ConnectionProtocolEnum::class), + ], + 'applicationType' => [ + 'required', + Rule::enum(ApplicationTypeEnum::class), + ], + ]; + } +} diff --git a/resources/views/pages/connected-apps/⚡index.blade.php b/resources/views/pages/connected-apps/⚡index.blade.php index 286aea1..85920cb 100644 --- a/resources/views/pages/connected-apps/⚡index.blade.php +++ b/resources/views/pages/connected-apps/⚡index.blade.php @@ -4,6 +4,9 @@ use App\Concerns\HandlesOperations; use App\Data\Ui\ConnectedApps\ConnectedAppData; use App\Data\Ui\TableHeader; +use App\Enums\ApplicationTypeEnum; +use App\Enums\ConnectionProtocolEnum; +use App\Livewire\Forms\CreateAppSelectionForm; use App\Services\ConnectedAppService; use Livewire\Attributes\Computed; use Livewire\Attributes\Title; @@ -19,6 +22,8 @@ class extends Component { use WithPagination, HandlesOperations, Confirmation; protected ConnectedAppService $service; + public bool $showAppCreationModal = false; + public CreateAppSelectionForm $appSelectionForm; #[DataCollectionOf(TableHeader::class)] public DataCollection $headers; @@ -64,13 +69,22 @@ public function delete(int $appId): void successMessage: 'The app has been deleted !' ); } + + public function createApp(): void + { + $this->appSelectionForm->validate(); + $this->redirectRoute('apps.create', [ + 'protocol' => $this->appSelectionForm->connectionProtocol, + 'type' => $this->appSelectionForm->applicationType + ], navigate: true); + } }; ?>
- Add App + Add App @endscope + @scope('actions', $row)
@endscope + + + +
+
+

Protocol

+
+
+ +
+
+ +
+ +
+

Application Type

+

+ Choose what type of application you are trying to connect. This helps to properly generate + responses. +

+
+
+ +
+
+ + + Cancel + + Create + +
+
diff --git a/routes/apps.php b/routes/apps.php new file mode 100644 index 0000000..9ee3ea1 --- /dev/null +++ b/routes/apps.php @@ -0,0 +1,26 @@ +name('apps.')->group(function (): void { + Route::livewire('microsoft-federation', 'pages::connecton-providers.microsoft-federation') + ->middleware(PermissionMiddleware::using(ConnectionProviderPermissionEnum::Access)) + ->name('microsoft-federation'); + + Route::middleware(PermissionMiddleware::using(AppPermissionEnum::Access))->group(function (): void { + Route::livewire('create', 'pages::connected-apps.create')->name('create'); + Route::livewire('{id}/edit', 'pages::connected-apps.edit')->name('edit'); + Route::livewire('/', 'pages::connected-apps.index')->name('index'); + }); + + Route::prefix('connection-providers')->name('connectionProviders.') + ->middleware(PermissionMiddleware::using(ConnectionProviderPermissionEnum::Access)) + ->group(function (): void { + Route::livewire('create', 'pages::connecton-providers.create')->name('create'); + Route::livewire('{slug}/edit', 'pages::connecton-providers.edit')->name('edit'); + Route::livewire('index', 'pages::connecton-providers.index')->name('index'); + }); +}); diff --git a/routes/web.php b/routes/web.php index aa134bb..ab96df2 100644 --- a/routes/web.php +++ b/routes/web.php @@ -3,11 +3,7 @@ declare(strict_types=1); use App\Enums\DefaultUserRole; -use App\Enums\Permissions\{AppPermissionEnum, - ConnectionProviderPermissionEnum, - PermissionPermissionEnum, - RoleAndAppsPermissionEnum, - UserPermissionEnum}; +use App\Enums\Permissions\{PermissionPermissionEnum, RoleAndAppsPermissionEnum, UserPermissionEnum}; use App\Http\Controllers\{EntraController, KekaController}; use App\Http\Controllers\KekaOutlookController; use App\Http\Controllers\{ResolveDashboardRouteController, SamlIdpController}; @@ -62,25 +58,7 @@ }); }); - Route::prefix('apps')->name('apps.')->group(function (): void { - Route::livewire('microsoft-federation', 'pages::connecton-providers.microsoft-federation') - ->middleware(PermissionMiddleware::using(ConnectionProviderPermissionEnum::Access)) - ->name('microsoft-federation'); - - Route::middleware(PermissionMiddleware::using(AppPermissionEnum::Access))->group(function (): void { - Route::livewire('create', 'pages::connected-apps.create')->name('create'); - Route::livewire('{id}/edit', 'pages::connected-apps.edit')->name('edit'); - Route::livewire('/', 'pages::connected-apps.index')->name('index'); - }); - - Route::prefix('connection-providers')->name('connectionProviders.') - ->middleware(PermissionMiddleware::using(ConnectionProviderPermissionEnum::Access)) - ->group(function (): void { - Route::livewire('create', 'pages::connecton-providers.create')->name('create'); - Route::livewire('{slug}/edit', 'pages::connecton-providers.edit')->name('edit'); - Route::livewire('index', 'pages::connecton-providers.index')->name('index'); - }); - }); + require __DIR__.'/apps.php'; }); Route::middleware(['auth', 'verified'])->prefix('entra')->name('entra.')->group(function (): void {