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
  • e89655e5d35914532a31137a962dc1858c4d07ab
  • tug-dev default
  • amdm3/develop
  • fix/scripts1
  • amdm2/develop
  • amdm2/main
  • playground
  • feat/changelog
  • fix/solution_tests
  • test/full_release_process
  • test/art10_test_execution
  • test/gitlab_files_api
  • test/multiplatform_david
  • trgbot
  • set-sast-config-3
  • set-sast-config-2
  • set-secret-detection-config-2
  • set-secret-detection-config-1
  • set-sast-config-1
  • test-linux-fixes
  • tug-stable
  • Release/v4.3.2
  • v1.0.1
  • v1.0.0
  • Build/v0.7.10.2996
  • v0.7.5b0+2524.multistep
  • Release/v3.3.14.2981-RC
  • Build/v0.7.9.2975
  • Release/v3.3.13.2924
  • Release/v3.3.13.2891-RC
  • Build/0.7.9.2890
  • Build/v0.7.9.2864
  • Build/v0.7.9.2849
  • Build/v0.7.9.2836
  • Release/TrailerTool_V0.9.0.2759
  • Release/TrailerTool_V0.9.0.2735
  • Release/TrailerTool_V0.9.0.2799
  • Release/v3.3.12.2800
  • Release/v3.3.12.2769-RC
  • Build/v0.7.9.2741
  • Build/v0.5.0.1812_VectoFF
41 results

settings.md

Blame
  • Forked from VECTO / VECTO Sim
    Source project has a limited visibility.
    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);
        }
      }
    }