diff --git a/idp/src/application/client/appclient.service.ts b/idp/src/application/client/appclient.service.ts new file mode 100644 index 0000000..9d32138 --- /dev/null +++ b/idp/src/application/client/appclient.service.ts @@ -0,0 +1,10 @@ +import { Injectable } from '@nestjs/common'; +import { ClientRepository, RedirectRepository } from 'src/model'; +import { ClientBaseService } from 'src/shared/client/client.base.service'; + +@Injectable() +export class AppClientService extends ClientBaseService { + constructor(clientRepo: ClientRepository, uriRepo: RedirectRepository) { + super(clientRepo, uriRepo); + } +} diff --git a/idp/src/application/mail/mail.service.ts b/idp/src/application/mail/mail.service.ts index 52e41f0..3946509 100644 --- a/idp/src/application/mail/mail.service.ts +++ b/idp/src/application/mail/mail.service.ts @@ -1,18 +1,16 @@ import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { MailerService } from '@nestjs-modules/mailer'; -import { ResetPWMailConfig } from '../model/mailconfig.interface'; +import { IResetPWMailConfig } from 'src/model'; @Injectable() export class MailService { constructor( private mailerService: MailerService, private readonly configService: ConfigService, - ) { - // this.sendMail(); - } + ) {} - sendResetMail(config: ResetPWMailConfig) { + sendResetMail(config: IResetPWMailConfig) { let baseUrl = this.configService.get('CLIENT_URL'); if (baseUrl.endsWith('/')) baseUrl = baseUrl.substring(0, baseUrl.length - 1); @@ -20,7 +18,7 @@ export class MailService { baseUrl += '/' + config.url + '?resetcode=' + config.code; this.mailerService.sendMail({ - to: 'mail@bastian-wagner.de', + to: config.to, from: this.configService.get('MAILER_FROM'), subject: 'Passwort zurücksetzen', template: './pw-reset', diff --git a/idp/src/application/user/user.controller.ts b/idp/src/application/user/user.controller.ts index 18b3bf6..c132dd1 100644 --- a/idp/src/application/user/user.controller.ts +++ b/idp/src/application/user/user.controller.ts @@ -8,18 +8,19 @@ import { Req, UseGuards, } from '@nestjs/common'; -import { APPUserService } from './user.service'; + +import { AppUserService } from './user.service'; import { AuthGuard, Roles, RolesGuard } from 'src/shared/secure/guards'; import { IAuthenticatedRequest, Client, RedirectUri } from 'src/model'; import { CreateClientDto } from 'src/model/dto/create-client.dto'; -import { ClientService } from 'src/idp/client/client.service'; +import { AppClientService } from '../client/appclient.service'; @UseGuards(AuthGuard, RolesGuard) @Controller('app/user') export class UserController { constructor( - private userService: APPUserService, - private clientService: ClientService, + private userService: AppUserService, + private clientService: AppClientService, ) {} @Get() diff --git a/idp/src/application/user/user.module.ts b/idp/src/application/user/user.module.ts index b9e37cf..fe31b95 100644 --- a/idp/src/application/user/user.module.ts +++ b/idp/src/application/user/user.module.ts @@ -1,12 +1,13 @@ import { Module } from '@nestjs/common'; import { UserController } from './user.controller'; -import { APPUserService } from './user.service'; +import { AppUserService } from './user.service'; import { SharedModule } from 'src/shared/shared.module'; import { SecureModule } from 'src/shared/secure/secure.module'; +import { AppClientService } from '../client/appclient.service'; @Module({ controllers: [UserController], imports: [SecureModule, SharedModule], - providers: [APPUserService], + providers: [AppUserService, AppClientService], }) export class UserModule {} diff --git a/idp/src/application/user/user.service.ts b/idp/src/application/user/user.service.ts index 92eae66..e696442 100644 --- a/idp/src/application/user/user.service.ts +++ b/idp/src/application/user/user.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ClientRepository, LogRepository, User, Client } from 'src/model'; @Injectable() -export class APPUserService { +export class AppUserService { constructor( private clientRepository: ClientRepository, private logRepository: LogRepository, diff --git a/idp/src/model/entity/activity-log.entity.ts b/idp/src/model/entity/activity-log.entity.ts index d9e955e..9874458 100644 --- a/idp/src/model/entity/activity-log.entity.ts +++ b/idp/src/model/entity/activity-log.entity.ts @@ -19,6 +19,9 @@ export class ActivityLog { @Column({ default: 0, type: 'int' }) loginCounter: number; + @Column({ default: 0, type: 'int', name: 'session_login' }) + loginWithSessionCounter: number; + @Column({ default: 0, type: 'int' }) applicationLogin: number; @@ -47,6 +50,12 @@ export class ActivityLogRepository extends Repository { return this.save(entity); } + async logSavedLogin(): Promise { + const entity = await this.getTodaysActivityLog(); + entity.loginWithSessionCounter += 1; + return this.save(entity); + } + async logLogin(): Promise { const entity = await this.getTodaysActivityLog(); entity.loginCounter += 1; diff --git a/idp/src/model/interface/index.ts b/idp/src/model/interface/index.ts index 6e7e43e..644d822 100644 --- a/idp/src/model/interface/index.ts +++ b/idp/src/model/interface/index.ts @@ -1,2 +1,3 @@ export * from './authenticated.request'; export * from './logger.interface'; +export * from './mailconfig.interface'; diff --git a/idp/src/application/model/mailconfig.interface.ts b/idp/src/model/interface/mailconfig.interface.ts similarity index 62% rename from idp/src/application/model/mailconfig.interface.ts rename to idp/src/model/interface/mailconfig.interface.ts index d17572f..0773c06 100644 --- a/idp/src/application/model/mailconfig.interface.ts +++ b/idp/src/model/interface/mailconfig.interface.ts @@ -1,4 +1,4 @@ -export interface ResetPWMailConfig { +export interface IResetPWMailConfig { to: string; code: string; url: string; diff --git a/idp/src/shared/users.service.ts b/idp/src/shared/users.service.ts index 16b7ce5..8cc1b14 100644 --- a/idp/src/shared/users.service.ts +++ b/idp/src/shared/users.service.ts @@ -126,15 +126,12 @@ export class UsersService { if (getUserAccessToken) { user.accessToken = this.createAccessToken(user); user.refreshToken = this.createRefreshToken(user); - // this.logger.log( - // `User logged in with code on client ${clientId}`, - // 'systemlogin', - // ); return user; } const token = await this.createAuthToken(user, client); this.logger.log(`User logged in with code on client ${clientId}`, 'login'); + this.activityRepo.logSavedLogin(); return token; } diff --git a/idp_client/src/app/dashboard/components/client-redirect-uris/client-redirect-uris.component.html b/idp_client/src/app/dashboard/components/client-redirect-uris/client-redirect-uris.component.html index eeccfc2..9a1c830 100644 --- a/idp_client/src/app/dashboard/components/client-redirect-uris/client-redirect-uris.component.html +++ b/idp_client/src/app/dashboard/components/client-redirect-uris/client-redirect-uris.component.html @@ -1,10 +1,11 @@

Client Redirect-URIs

+
Trage hier alle Redirect URIS ein. Sie müssen mit dem gesendeten Parameter exakt überein stimmen.
@for (uri of client.redirectUris; track $index) {
{{ uri.uri }} @if(client.redirectUris.length > 1) { - + }
} diff --git a/idp_client/src/app/dashboard/components/client-redirect-uris/client-redirect-uris.component.scss b/idp_client/src/app/dashboard/components/client-redirect-uris/client-redirect-uris.component.scss index 0620adb..ffda43c 100644 --- a/idp_client/src/app/dashboard/components/client-redirect-uris/client-redirect-uris.component.scss +++ b/idp_client/src/app/dashboard/components/client-redirect-uris/client-redirect-uris.component.scss @@ -17,5 +17,5 @@ mat-icon { .remove_btn { min-width: 0; - padding: 0 14px; + padding: 0 12px; } \ No newline at end of file diff --git a/idp_client/src/app/dashboard/components/create-client/create-client.component.html b/idp_client/src/app/dashboard/components/create-client/create-client.component.html index 977bb9d..de6e395 100644 --- a/idp_client/src/app/dashboard/components/create-client/create-client.component.html +++ b/idp_client/src/app/dashboard/components/create-client/create-client.component.html @@ -34,7 +34,7 @@ @@ -44,6 +44,9 @@ @if (client && client.admins) { } +
diff --git a/idp_client/src/app/dashboard/components/create-client/create-client.component.scss b/idp_client/src/app/dashboard/components/create-client/create-client.component.scss index 0e77e84..36aea09 100644 --- a/idp_client/src/app/dashboard/components/create-client/create-client.component.scss +++ b/idp_client/src/app/dashboard/components/create-client/create-client.component.scss @@ -1,4 +1,4 @@ -form { +form, .admin_container { display: flex; flex-direction: column; gap: 24px; @@ -13,6 +13,7 @@ form { height: 100%; } -mat-dialog-content { +mat-dialog-content, app-client-admins { flex: 1 1 auto; -} \ No newline at end of file +} + diff --git a/idp_client/src/app/dashboard/components/create-client/create-client.component.ts b/idp_client/src/app/dashboard/components/create-client/create-client.component.ts index d4f9460..6a333f1 100644 --- a/idp_client/src/app/dashboard/components/create-client/create-client.component.ts +++ b/idp_client/src/app/dashboard/components/create-client/create-client.component.ts @@ -1,6 +1,6 @@ import { CommonModule } from '@angular/common'; import { HttpClient } from '@angular/common/http'; -import { Component, inject, ViewChild } from '@angular/core'; +import { Component, EventEmitter, inject, Output, ViewChild } from '@angular/core'; import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatDialogModule } from '@angular/material/dialog'; @@ -29,6 +29,8 @@ export class CreateClientComponent { @ViewChild('stepper') stepper: MatStepper; + @Output('oncreate') createdClient = new EventEmitter(); + createClient = new FormGroup({ clientName: new FormControl(null, [Validators.required, Validators.minLength(4), Validators.maxLength(200)]), clientSecret: new FormControl(null, [Validators.required, Validators.minLength(4), Validators.maxLength(200)]), @@ -55,11 +57,11 @@ export class CreateClientComponent { ) .subscribe({ next: data => { - console.log(this.stepper) this.client = data; this.createClient.enable(); this.stepper.next(); this.isSaving = false; + this.createdClient.emit(); } }) diff --git a/idp_client/src/app/dashboard/dashboard.component.scss b/idp_client/src/app/dashboard/dashboard.component.scss index 59cf08a..0729e6c 100644 --- a/idp_client/src/app/dashboard/dashboard.component.scss +++ b/idp_client/src/app/dashboard/dashboard.component.scss @@ -14,12 +14,13 @@ flex-direction: column; } .card-container__list{ - margin: 0 auto; + margin: -12px; display: flex; flex-direction: column; gap: 12px; width: 500px; overflow: auto; + padding: 12px; } .create-container{ @@ -70,10 +71,15 @@ background-position: center; background-size: 20px; background-repeat: no-repeat; - border-radius: 4px; + border-radius: 8px; transition: all 0.2s ease-in-out; &:hover { - background-color: #ccc; + background-color: #e0e0e0; } + +} + +.deleting { + box-shadow: 0px 2px 4px -1px rgb(255 0 0 / 20%), 0px 4px 5px 0px rgb(255 0 0 / 14%), 0px 1px 10px 0px rgb(255 0 0 / 12%); } \ No newline at end of file diff --git a/idp_client/src/app/dashboard/dashboard.component.ts b/idp_client/src/app/dashboard/dashboard.component.ts index 5b507e8..f97f47e 100644 --- a/idp_client/src/app/dashboard/dashboard.component.ts +++ b/idp_client/src/app/dashboard/dashboard.component.ts @@ -65,9 +65,12 @@ export class DashboardComponent implements OnInit { } createClient() { - this.dialog.open(CreateClientComponent, { + const ref = this.dialog.open(CreateClientComponent, { panelClass: 'create-client__dialog' }) + ref.componentInstance.createdClient.subscribe(() => { + this.load(); + }) } openDeleteDialog(client: Client) {