diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts
index acc814f..6fdf8f7 100644
--- a/src/app/app-routing.module.ts
+++ b/src/app/app-routing.module.ts
@@ -1,7 +1,7 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
-import { AuthGuard, AuthUpdateGuard, AuthenticatedGuard, AnonymousGuard } from './auth/auth.guard';
+import { AuthGuard, AuthUpdateGuard, AuthenticatedGuard, AnonymousGuard, AdminGuard } from './auth/auth.guard';
import { MainComponent } from './ui/main/main.component';
import { FormLoginComponent } from './pages/form-login/form-login.component';
import { FormLogin2FAComponent } from './pages/form-login-2fa/form-login-2fa.component';
@@ -35,6 +35,26 @@ import { InviteCodeComponent } from './pages/invites/code/code.component';
import { JukeboxComponent } from './pages/jukebox/jukebox.compontent';
import { FormLoginOidcComponent } from './pages/form-login-oidc/form-login-oidc.component';
import { DyndnsComponent } from './pages/account/dyndns/dyndns.component';
+import { AdminComponent } from './pages/admin/admin.component';
+import { AdminUsersComponent } from './pages/admin/users/users.component';
+import { AdminServicesComponent } from './pages/admin/services/services.component';
+import { AdminPermissionsComponent } from './pages/admin/permissions/permissions.component';
+import { AdminQuotasComponent } from './pages/admin/quotas/quotas.component';
+import { AdminJitsiRoomsComponent } from './pages/admin/jitsi-rooms/jitsi-rooms.component';
+import { AdminMinetestAccountsComponent } from './pages/admin/minetest-accounts/minetest-accounts.component';
+import { AdminShortenedUrlsComponent } from './pages/admin/shortened-urls/shortened-urls.component';
+import { AdminJukeboxComponent } from './pages/admin/jukebox/jukebox.component';
+import { AdminParteyMapsComponent } from './pages/admin/partey-maps/partey-maps.component';
+import { AdminParteyTagsComponent } from './pages/admin/partey-tags/partey-tags.component';
+import { AdminParteyReportsComponent } from './pages/admin/partey-reports/partey-reports.component';
+import { AdminTimeslotsComponent } from './pages/admin/timeslots/timeslots.component';
+import { AdminSystemPropertiesComponent } from './pages/admin/system-properties/system-properties.component';
+import { AdminPermissionMappingsComponent } from './pages/admin/permission-mappings/permission-mappings.component';
+import { AdminQuotaMappingsComponent } from './pages/admin/quota-mappings/quota-mappings.component';
+import { AdminVoucherMappingsComponent } from './pages/admin/voucher-mappings/voucher-mappings.component';
+import { AdminSystemProfileFieldsComponent } from './pages/admin/system-profile-fields/system-profile-fields.component';
+import { AdminUserAliasesComponent } from './pages/admin/user-aliases/user-aliases.component';
+import { AdminOidcClientsComponent } from './pages/admin/oidc-clients/oidc-clients.component';
const routes: Routes = [
{ path: 'profile/:username', component: UserComponent, canActivate: [AuthUpdateGuard] },
@@ -84,6 +104,30 @@ const routes: Routes = [
{ path: 'urlshortener/:code', component: UrlShortenerPasswordComponent, canActivate: [AuthUpdateGuard] },
{ path: 'invites/:quota', component: InvitesComponent, canActivate: [AuthenticatedGuard] },
{ path: 'invite/:code', component: InviteCodeComponent, canActivate: [AuthGuard] },
+ {
+ path: 'admin', component: AdminComponent, canActivate: [AdminGuard], children: [
+ { path: '', redirectTo: "/admin/users", pathMatch: 'full' },
+ { path: 'users', component: AdminUsersComponent, canActivate: [AdminGuard] },
+ { path: 'permissions', component: AdminPermissionsComponent, canActivate: [AdminGuard] },
+ { path: 'permission-mappings', component: AdminPermissionMappingsComponent, canActivate: [AdminGuard] },
+ { path: 'quotas', component: AdminQuotasComponent, canActivate: [AdminGuard] },
+ { path: 'quota-mappings', component: AdminQuotaMappingsComponent, canActivate: [AdminGuard] },
+ { path: 'voucher-mappings', component: AdminVoucherMappingsComponent, canActivate: [AdminGuard] },
+ { path: 'services', component: AdminServicesComponent, canActivate: [AdminGuard] },
+ { path: 'system-properties', component: AdminSystemPropertiesComponent, canActivate: [AdminGuard] },
+ { path: 'system-profile-fields', component: AdminSystemProfileFieldsComponent, canActivate: [AdminGuard] },
+ { path: 'user-aliases', component: AdminUserAliasesComponent, canActivate: [AdminGuard] },
+ { path: 'oidc-clients', component: AdminOidcClientsComponent, canActivate: [AdminGuard] },
+ { path: 'jitsi-rooms', component: AdminJitsiRoomsComponent, canActivate: [AdminGuard] },
+ { path: 'minetest-accounts', component: AdminMinetestAccountsComponent, canActivate: [AdminGuard] },
+ { path: 'shortened-urls', component: AdminShortenedUrlsComponent, canActivate: [AdminGuard] },
+ { path: 'jukebox', component: AdminJukeboxComponent, canActivate: [AdminGuard] },
+ { path: 'partey-maps', component: AdminParteyMapsComponent, canActivate: [AdminGuard] },
+ { path: 'partey-tags', component: AdminParteyTagsComponent, canActivate: [AdminGuard] },
+ { path: 'partey-reports', component: AdminParteyReportsComponent, canActivate: [AdminGuard] },
+ { path: 'timeslots', component: AdminTimeslotsComponent, canActivate: [AdminGuard] }
+ ]
+ },
{ path: 'unavailable', component: UnavailableComponent },
{ path: 'p/:username', component: UserComponent, canActivate: [AuthUpdateGuard] },
{ path: '**', component: NotfoundComponent, pathMatch: 'full', canActivate: [AuthUpdateGuard] },]
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index dd90195..e3bbb53 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -69,6 +69,39 @@ import { MatDatepickerModule } from '@angular/material/datepicker';
import { MomentDateModule } from '@angular/material-moment-adapter';
import { MAT_DATE_FORMATS } from '@angular/material/core';
import { DatetimepickerComponent } from './ui/datetimepicker/datetimepicker.component';
+import { AdminComponent } from './pages/admin/admin.component';
+import { AdminUsersComponent } from './pages/admin/users/users.component';
+import { AdminUserEditDialog } from './pages/admin/users/user.edit';
+import { AdminPermissionEditDialog } from './pages/admin/permissions/permission.edit';
+import { AdminQuotaEditDialog } from './pages/admin/quotas/quota.edit';
+import { AdminServiceEditDialog } from './pages/admin/services/service.edit';
+import { AdminPermissionMappingEditDialog } from './pages/admin/permission-mappings/permission-mapping.edit';
+import { AdminQuotaMappingEditDialog } from './pages/admin/quota-mappings/quota-mapping.edit';
+import { AdminServicesComponent } from './pages/admin/services/services.component';
+import { AdminPermissionsComponent } from './pages/admin/permissions/permissions.component';
+import { AdminQuotasComponent } from './pages/admin/quotas/quotas.component';
+import { AdminJitsiRoomsComponent } from './pages/admin/jitsi-rooms/jitsi-rooms.component';
+import { AdminMinetestAccountsComponent } from './pages/admin/minetest-accounts/minetest-accounts.component';
+import { AdminShortenedUrlsComponent } from './pages/admin/shortened-urls/shortened-urls.component';
+import { AdminShortenedUrlEditDialog } from './pages/admin/shortened-urls/shortened-url.edit';
+import { AdminJukeboxComponent } from './pages/admin/jukebox/jukebox.component';
+import { AdminParteyMapsComponent } from './pages/admin/partey-maps/partey-maps.component';
+import { AdminParteyTagsComponent } from './pages/admin/partey-tags/partey-tags.component';
+import { AdminParteyReportsComponent } from './pages/admin/partey-reports/partey-reports.component';
+import { AdminTimeslotsComponent } from './pages/admin/timeslots/timeslots.component';
+import { AdminSystemPropertiesComponent } from './pages/admin/system-properties/system-properties.component';
+import { AdminPermissionMappingsComponent } from './pages/admin/permission-mappings/permission-mappings.component';
+import { AdminQuotaMappingsComponent } from './pages/admin/quota-mappings/quota-mappings.component';
+import { AdminVoucherMappingsComponent } from './pages/admin/voucher-mappings/voucher-mappings.component';
+import { AdminSystemProfileFieldsComponent } from './pages/admin/system-profile-fields/system-profile-fields.component';
+import { AdminUserAliasesComponent } from './pages/admin/user-aliases/user-aliases.component';
+import { AdminOidcClientsComponent } from './pages/admin/oidc-clients/oidc-clients.component';
+import { AdminOidcClientEditDialog } from './pages/admin/oidc-clients/oidc-client.edit';
+import { AdminVoucherMappingEditDialog } from './pages/admin/voucher-mappings/voucher-mapping.edit';
+import { AdminSystemPropertyEditDialog } from './pages/admin/system-properties/system-property.edit';
+import { AdminSystemProfileFieldEditDialog } from './pages/admin/system-profile-fields/system-profile-field.edit';
+import { AdminUserAliasEditDialog } from './pages/admin/user-aliases/user-alias.edit';
+import { AdminJitsiRoomEditDialog } from './pages/admin/jitsi-rooms/jitsi-room.edit';
export function init_app(i18n: I18nService) {
@@ -132,7 +165,18 @@ export class XhrInterceptor implements HttpInterceptor {
DividerComponent, DividertestComponent,
DatetimepickerComponent,
DurationpickerComponent,
- JukeboxComponent
+ JukeboxComponent,
+ AdminComponent, AdminUsersComponent, AdminUserEditDialog, AdminPermissionEditDialog, AdminQuotaEditDialog,
+ AdminServiceEditDialog, AdminPermissionMappingEditDialog, AdminQuotaMappingEditDialog,
+ AdminOidcClientEditDialog, AdminVoucherMappingEditDialog, AdminSystemPropertyEditDialog,
+ AdminSystemProfileFieldEditDialog, AdminUserAliasEditDialog, AdminJitsiRoomEditDialog,
+ AdminServicesComponent, AdminPermissionsComponent,
+ AdminQuotasComponent, AdminJitsiRoomsComponent, AdminMinetestAccountsComponent,
+ AdminShortenedUrlsComponent, AdminShortenedUrlEditDialog, AdminJukeboxComponent, AdminParteyMapsComponent,
+ AdminParteyTagsComponent, AdminParteyReportsComponent, AdminTimeslotsComponent,
+ AdminSystemPropertiesComponent, AdminPermissionMappingsComponent, AdminQuotaMappingsComponent,
+ AdminVoucherMappingsComponent, AdminSystemProfileFieldsComponent, AdminUserAliasesComponent,
+ AdminOidcClientsComponent
],
imports: [
BrowserModule,
diff --git a/src/app/auth/auth.guard.ts b/src/app/auth/auth.guard.ts
index 0ba6b20..f759775 100644
--- a/src/app/auth/auth.guard.ts
+++ b/src/app/auth/auth.guard.ts
@@ -104,4 +104,30 @@ export class AnonymousGuard implements CanActivate {
});
}
+}
+
+@Injectable({
+ providedIn: 'root'
+})
+export class AdminGuard implements CanActivate {
+ constructor(private authService: AuthService, private router: Router) { }
+
+ canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
+ const that = this;
+ return this.authService.getAuth().then((data: any) => {
+ if (!data.authenticated) {
+ return that.router.navigateByUrl(that.router.parseUrl('/login?target=' + encodeURIComponent(state.url)), { skipLocationChange: true, replaceUrl: true });
+ }
+
+ // Check if user has ROLE_ADMIN
+ if (data.authorities && data.authorities.some((auth: any) => auth.authority === 'ROLE_ADMIN')) {
+ return true;
+ }
+
+ // User is authenticated but not an admin
+ return that.router.navigateByUrl('/account/info');
+ }).catch(function (error) {
+ return that.router.navigateByUrl(that.router.parseUrl('/unavailable?target=' + encodeURIComponent(state.url)), { skipLocationChange: true });
+ });
+ }
}
\ No newline at end of file
diff --git a/src/app/pages/account/account.component.html b/src/app/pages/account/account.component.html
index 560e39a..2d0f047 100644
--- a/src/app/pages/account/account.component.html
+++ b/src/app/pages/account/account.component.html
@@ -1,35 +1,35 @@
{{'greet' | i18n:auth.name}} sentiment_satisfied_alt
-