Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

Skip to content
Snippets Groups Projects
Select Git revision
  • 871d78f2f164195ca63f062a1231d0a65c069803
  • development default
  • release/5.1.x
  • feature/EDELIVERY-15382-rest-api-jwt-authentication-for-dynamic-discovery-client
  • feature/EDELIVERY-13760-translate-server-side-error-messages
  • bugfix/EDELIVERY-14172-domismp-accepts-requests-with-wrong-domain-header-value
  • EDELIVERY-15372-upgrade-libraries-and-plugins-and-update-httpclient-to-httpclient5
  • EDELIVERY-15377-migrate-to-angular-20
  • bugfix/EDELIVERY-14196-select-domain-select-resource-dropdown-should-be-order-alphabetically
  • feature/EDELIVERY-12753-sml-integration-migration-to-different-smp
  • feature/EDELIVERY-13757-extend-session-dialog-should-have-an-active-counter
  • EDELIVERY-15144-sql-update
  • bugfix/EDELIVERY-14326-ui-edit-resource-filters
  • feature/EDELIVERY-15144-domismp-system-notification-generalize-time-expiration-alerts
  • bugfix/EDELIVERY-15102-alert-is-not-appearing-when-adding-duplicated-certificate
  • bugfix/EDELIVERY-15203-small-left-grid-shows-no-data-found-for-1-2-seconds-before-loading-the-data
  • EDELIVERY-15219-search-filter-with-understore-char-does-not-work
  • bugfix/EDELIVERY-15226-certificates-error-when-trying-to-delete-certificates
  • bugfix/EDELIVERY-15224-error-when-trying-to-update-info-from-profile-page
  • bugfix/EDELIVERY-15225-emails-are-not-sent-in-domismp
  • feature/EDELIVERY-12746-external-secret-sharing-services-as-vaults
  • 5.1.1
  • 5.1
  • 5.1-TEST
  • 5.1-RC1
  • 5.0.1
  • 5.0
  • 5.0-RC1
  • 4.2
  • 4.2-RC1
  • 4.1.2
  • 4.1.1
  • 4.1.0
  • 4.1.0-RC1
  • 4.0.0
  • 4.0.0-RC1
  • 3.0.2
  • 3.0.1
  • 3.0.0
39 results

user-details-dialog.component.ts

Blame
  • TINCU Sebastian-Ion's avatar
    Sebastian-Ion TINCU authored
    Rename roles to match those defined in the back-end.
    Fix wrong role binding when adding or editing users.
    Fix missing id and status properties.
    Improve user resource annotations.
    cfcfe0eb
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    user-details-dialog.component.ts 7.60 KiB
    import {Component, Inject, ViewChild} from '@angular/core';
    import {MAT_DIALOG_DATA, MatDialogRef, MatSlideToggleChange} from '@angular/material';
    import {FormBuilder, FormControl, FormGroup, ValidationErrors, ValidatorFn, Validators} from '@angular/forms';
    import {UserService} from '../user.service';
    import {Role} from '../../security/role.model';
    import {UserRo} from '../user-ro.model';
    import {SearchTableEntityStatus} from '../../common/search-table/search-table-entity-status.model';
    import {AlertService} from '../../alert/alert.service';
    import {CertificateService} from '../certificate.service';
    import {CertificateRo} from "../certificate-ro.model";
    import {DatePipe} from "../../custom-date/date.pipe";
    
    @Component({
      selector: 'user-details-dialog',
      templateUrl: './user-details-dialog.component.html',
      styleUrls: ['user-details-dialog.component.css']
    })
    export class UserDetailsDialogComponent {
    
      static readonly NEW_MODE = 'New User';
      static readonly EDIT_MODE = 'User Edit';
    
      // readonly emailPattern = '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}';
      readonly passwordPattern = '^(?=.*[A-Z])(?=.*[ !#$%&\'()*+,-./:;<=>?@\\[^_`{|}~\\\]"])(?=.*[0-9])(?=.*[a-z]).{8,32}$';
      readonly dateFormat: string = 'yyyy-MM-dd HH:mm:ssZ';
    
      id: number;
    
      editMode: boolean;
      formTitle: string;
      userRoles = [];
      existingRoles = [];
      userForm: FormGroup;
    
      @ViewChild('fileInput')
      private fileInput;
    
      private passwordConfirmationValidator: ValidatorFn = (control: FormGroup): ValidationErrors | null => {
        const userToggle = control.get('userToggle');
        const password = control.get('password');
        const confirmation = control.get('confirmation');
        return userToggle && password && confirmation && userToggle.value && password.value !== confirmation.value ? { confirmationMatch: true } : null;
      };
    
      private atLeastOneToggleCheckedValidator: ValidatorFn = (control: FormGroup): ValidationErrors | null => {
        const userToggle = control.get('userToggle');
        const certificateToggle = control.get('certificateToggle');
        return userToggle && certificateToggle && !userToggle.value && !certificateToggle.value ? { userDetailsOrCertificateRequired: true} : null;
      };
    
      private certificateValidator: ValidatorFn = (control: FormGroup): ValidationErrors | null => {
        const certificateToggle = control.get('certificateToggle');
        const subject = control.get('subject');
        const validFrom = control.get('validFrom');
        const validTo = control.get('validTo');
        const issuer = control.get('issuer');
        const serialNumber = control.get('serialNumber');
        return certificateToggle && subject && validFrom && validTo && issuer && serialNumber
            && certificateToggle.value && !(subject.value && validFrom.value && validTo.value && issuer.value && serialNumber.value) ? { certificateDetailsRequired: true} : null;
      };
    
      constructor(private dialogRef: MatDialogRef<UserDetailsDialogComponent>,
                  private userService: UserService,
                  private certificateService: CertificateService,
                  private alertService: AlertService,
                  private datePipe: DatePipe,
                  @Inject(MAT_DIALOG_DATA) public data: any,
                  private fb: FormBuilder) {
        this.editMode = data.edit;
        this.id = data.row && data.row.id;
    
        this.formTitle = this.editMode ? UserDetailsDialogComponent.EDIT_MODE: UserDetailsDialogComponent.NEW_MODE;
    
        const user: UserRo & { confirmation?: string } = this.editMode
          ? {
            ...data.row,
            password: '', // ensures the user password is cleared before editing
            confirmation: '',
            certificate: {
              subject: data.row.subject,
              validFrom: data.row.validFrom,
              validTo: data.row.validTo,
              issuer: data.row.issuer,
              serialNumber: data.row.serialNumber,
            },
          }: {
            username: '',
            email: '',
            password: '',
            confirmation: '',
            role: '',
            certificate: {},
          };
    
        const userDetailsToggled: boolean = user && !!user.username;
    
        this.userForm = fb.group({
          'userToggle': new FormControl(userDetailsToggled),
          'username': new FormControl({ value: user.username, disabled: this.editMode || !userDetailsToggled }, this.editMode ? Validators.nullValidator : null),
          'role': new FormControl({ value: Role[user.role], disabled: !userDetailsToggled }, Validators.required),
          'password': new FormControl({ value: user.password, disabled: !userDetailsToggled }, [Validators.required, Validators.pattern(this.passwordPattern)]),
          'confirmation': new FormControl({ value: user.password, disabled: !userDetailsToggled }, Validators.pattern(this.passwordPattern)),
    
          'certificateToggle': new FormControl(user && user.certificate && !!user.certificate.subject),
          'subject': new FormControl({ value: user.certificate.subject, disabled: true }, Validators.required),
          'validFrom': new FormControl({ value: user.certificate.validFrom, disabled: true }, Validators.required),
          'validTo': new FormControl({ value: user.certificate.validTo, disabled: true }, Validators.required),
          'issuer': new FormControl({ value: user.certificate.issuer, disabled: true }, Validators.required),
          'serialNumber': new FormControl({ value: user.certificate.serialNumber, disabled: true }, Validators.required),
        }, {
          validator: [this.passwordConfirmationValidator, this.atLeastOneToggleCheckedValidator, this.certificateValidator]
        });
    
        this.userService.getUserRoles$().subscribe(userRoles => {
          this.userRoles = userRoles.json();
          this.existingRoles = this.editMode
            ? this.getAllowedRoles(this.userRoles, user.role)
            : this.userRoles;
          console.log(this.userRoles, this.existingRoles);
        });
      }
    
      submitForm() {
        this.dialogRef.close(true);
      }
    
      uploadCertificate(event) {
        const file = event.target.files[0];
    
        const reader = new FileReader();
        reader.onload = (e) => {
          this.certificateService.uploadCertificate$(reader.result).subscribe((res: CertificateRo) => {
                this.userForm.patchValue({
                  'subject': res.subject,
                  'validFrom': this.datePipe.transform(res.validFrom.toString(), this.dateFormat),
                  'validTo': this.datePipe.transform(res.validTo.toString(), this.dateFormat),
                  'issuer': res.issuer,
                  'serialNumber': res.serialNumber
                });
              },
              err => {
                this.alertService.exception('Error uploading certificate file ' + file.name, err);
              }
            );
        };
        reader.onerror = (err) => {
          this.alertService.exception('Error reading certificate file ' + file.name, err);
        };
    
        reader.readAsBinaryString(file);
      }
    
      onUserToggleChanged({checked}: MatSlideToggleChange) {
        const action = checked ? 'enable' : 'disable';
        this.userForm.get('username')[action]();
        this.userForm.get('role')[action]();
        this.userForm.get('password')[action]();
        this.userForm.get('confirmation')[action]();
      }
    
      get current(): UserRo {
        const rawValue = this.userForm.getRawValue();
    
        return {
          ...rawValue,
          id: this.id,
          role: Object.keys(Role).find(k => Role[k] === rawValue.role), // ugly hack to find the corresponding enum key as a string
          status: this.id ? SearchTableEntityStatus.UPDATED: SearchTableEntityStatus.NEW,
        };
      }
    
      // filters out roles so that the user cannot change from system administrator to the other roles or vice-versa
      private getAllowedRoles(allRoles, userRole) {
        if (userRole === Role.SYSTEM_ADMIN) {
          return [Role.SYSTEM_ADMIN];
        } else {
          return allRoles.filter(role => role !== Role.SYSTEM_ADMIN);
        }
      }
    }