From 0952a5eb4aa17616c12dd232c9d03bfeec8db19e Mon Sep 17 00:00:00 2001
From: mechtelm <nicht@mehr.fragen>
Date: Wed, 13 May 2020 18:33:32 +0200
Subject: [PATCH] superuser: validate password length 7; login: errorhandling
 fix

---
 package.json                                  |  2 +-
 src/app/app-root/login/login.component.ts     |  3 ++
 src/app/app.interceptor.ts                    | 33 ++++++++++---------
 src/app/backend.service.ts                    |  2 +-
 src/app/superadmin/backend.service.ts         |  8 -----
 .../newpassword/newpassword.component.html    |  1 +
 .../newpassword/newpassword.component.ts      |  2 +-
 .../users/newuser/newuser.component.html      |  1 +
 .../users/newuser/newuser.component.ts        |  2 +-
 src/app/superadmin/users/users.component.ts   | 18 +++++++---
 src/environments/environment.build.ts         |  2 +-
 src/environments/environment.prod.ts          |  2 +-
 src/environments/environment.ts               |  2 +-
 13 files changed, 43 insertions(+), 35 deletions(-)

diff --git a/package.json b/package.json
index 9649b3e3..c02eff67 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "itc-ng",
-  "version": "2.0.0-beta.5",
+  "version": "2.0.1",
   "scripts": {
     "ng": "ng",
     "start": "ng serve",
diff --git a/src/app/app-root/login/login.component.ts b/src/app/app-root/login/login.component.ts
index f192d027..2c7d22b2 100644
--- a/src/app/app-root/login/login.component.ts
+++ b/src/app/app-root/login/login.component.ts
@@ -53,6 +53,9 @@ export class LoginComponent  implements OnInit, OnDestroy {
           const errCode = authData as number;
           if (errCode === 400) {
             this.problemText = 'Anmeldedaten sind nicht gültig. Bitte nocheinmal versuchen!';
+          } else if (errCode === 202 || errCode === 204) {
+            this.problemText = 'Anmeldedaten sind gültig, aber es sind keine Arbeitsbereiche oder Tests freigegeben.';
+
           } else {
             this.problemText = 'Problem bei der Anmeldung.';
             // app.interceptor will show error message
diff --git a/src/app/app.interceptor.ts b/src/app/app.interceptor.ts
index 371ac9e3..5c055816 100644
--- a/src/app/app.interceptor.ts
+++ b/src/app/app.interceptor.ts
@@ -49,39 +49,42 @@ export class AuthInterceptor implements HttpInterceptor {
               let goToLoginPage = false;
               let label = 'Unbekanntes Verbindungsproblem';
               switch (httpError.status) {
-                case 400: {
+                case 202:
+                case 204:
+                case 207:
+                case 400:
                   ignoreError = true;
-                  // apiError.info = ?? TODO - from request body
+                  // apiError.info contains error = body
                   break;
-                }
-                case 401: {
+
+                case 401:
                   goToLoginPage = true;
                   label = 'Bitte für diese Aktion erst anmelden!';
                   break;
-                }
-                case 403: {
+
+                case 403:
                   label = 'Für diese Funktion haben Sie keine Berechtigung.';
                   break;
-                }
-                case 404: {
+
+                case 404:
                   label = 'Daten/Objekt nicht gefunden.';
                   break;
-                }
-                case 410: {
+
+                case 410:
                   goToLoginPage = true;
                   label = 'Anmeldung abgelaufen. Bitte erneut anmelden!';
                   break;
-                }
-                case 422: {
+
+                case 422:
                   ignoreError = true;
                   // apiError.info = ?? TODO - from request body
                   label = 'Die übermittelten Objekte sind fehlerhaft!';
                   break;
-                }
-                case 500: {
+
+                case 500:
                   label = 'Allgemeines Server-Problem.';
                   break;
-                }
+
               }
               if (!ignoreError) {
                 if (goToLoginPage) {
diff --git a/src/app/backend.service.ts b/src/app/backend.service.ts
index 1ebe4326..aa0d408f 100644
--- a/src/app/backend.service.ts
+++ b/src/app/backend.service.ts
@@ -38,7 +38,7 @@ export class BackendService {
               if (errCode === 400) {
                 return this.http
                   .put<AuthData>(this.serverUrl + 'session/login', {name, password})
-                  .pipe(catchError(errCode => of(errCode)));
+                  .pipe(catchError((err: ApiError) => of(err.code)));
               } else {
                 return of(errCode);
               }
diff --git a/src/app/superadmin/backend.service.ts b/src/app/superadmin/backend.service.ts
index f00f7768..273b271c 100644
--- a/src/app/superadmin/backend.service.ts
+++ b/src/app/superadmin/backend.service.ts
@@ -29,19 +29,11 @@ export class BackendService {
   addUser(name: string, password: string): Observable<Boolean> {
     return this.http
       .put<Boolean>(this.serverUrl + 'user', {n: name, p: password})
-      .pipe(catchError((err: ApiError) => {
-        console.warn(`addUser Api-Error: ${err.code} ${err.info} `);
-        return of(false)
-      }));
   }
 
   changePassword(userId: number, password: string): Observable<Boolean> {
     return this.http
       .patch<Boolean>(this.serverUrl + `user/${userId}/password`, {p: password})
-      .pipe(catchError((err: ApiError) => {
-        console.warn(`changePassword Api-Error: ${err.code} ${err.info} `);
-        return of(false)
-      }));
   }
 
   setSuperUserStatus(userId: number, changeToSuperUser: boolean, password: string): Observable<number> {
diff --git a/src/app/superadmin/users/newpassword/newpassword.component.html b/src/app/superadmin/users/newpassword/newpassword.component.html
index 49bc44b8..2eec34cd 100644
--- a/src/app/superadmin/users/newpassword/newpassword.component.html
+++ b/src/app/superadmin/users/newpassword/newpassword.component.html
@@ -5,6 +5,7 @@
       <div class="infobox">
         <p>Ändern des Kennwortes für Nutzer/in "{{ data }}".</p>
       </div>
+      <p>Achtung: Mindestlänge für Kennwort 7 Zeichen</p>
       <p>
         <mat-form-field class="full-width">
           <input matInput type="password" formControlName="pw" placeholder="Kennwort">
diff --git a/src/app/superadmin/users/newpassword/newpassword.component.ts b/src/app/superadmin/users/newpassword/newpassword.component.ts
index c4b785f4..a3def06a 100644
--- a/src/app/superadmin/users/newpassword/newpassword.component.ts
+++ b/src/app/superadmin/users/newpassword/newpassword.component.ts
@@ -9,7 +9,7 @@ import {FormGroup, Validators, FormControl} from '@angular/forms';
 
 export class NewpasswordComponent {
   newpasswordform = new FormGroup({
-    pw: new FormControl('', [Validators.required, Validators.minLength(3)])
+    pw: new FormControl('', [Validators.required, Validators.minLength(7)])
   });
 
   constructor(
diff --git a/src/app/superadmin/users/newuser/newuser.component.html b/src/app/superadmin/users/newuser/newuser.component.html
index 8ac041c2..a4d1e535 100644
--- a/src/app/superadmin/users/newuser/newuser.component.html
+++ b/src/app/superadmin/users/newuser/newuser.component.html
@@ -7,6 +7,7 @@
         <input matInput formControlName="name" placeholder="Name" autocomplete="off">
       </mat-form-field>
     </p>
+    <p>Achtung: Mindestlänge für Kennwort 7 Zeichen</p>
     <p>
       <mat-form-field class="full-width">
         <input matInput type="password" formControlName="pw" placeholder="Kennwort" autocomplete="off">
diff --git a/src/app/superadmin/users/newuser/newuser.component.ts b/src/app/superadmin/users/newuser/newuser.component.ts
index 615a84f0..14643f9f 100644
--- a/src/app/superadmin/users/newuser/newuser.component.ts
+++ b/src/app/superadmin/users/newuser/newuser.component.ts
@@ -9,6 +9,6 @@ import {FormControl, FormGroup, Validators} from '@angular/forms';
 export class NewuserComponent {
   newuserform = new FormGroup({
     name: new FormControl('', [Validators.required, Validators.minLength(3)]),
-    pw: new FormControl('', [Validators.required, Validators.minLength(3)])
+    pw: new FormControl('', [Validators.required, Validators.minLength(7)])
   });
 }
diff --git a/src/app/superadmin/users/users.component.ts b/src/app/superadmin/users/users.component.ts
index deee5ea3..91241f9a 100644
--- a/src/app/superadmin/users/users.component.ts
+++ b/src/app/superadmin/users/users.component.ts
@@ -17,6 +17,9 @@ import {
 import { MainDataService } from 'src/app/maindata.service';
 import {IdRoleData, UserData} from "../superadmin.interfaces";
 import {SuperadminPasswordRequestComponent} from "../superadmin-password-request/superadmin-password-request.component";
+import {catchError} from "rxjs/operators";
+import {ApiError} from "../../app.interfaces";
+import {of} from "rxjs";
 
 
 @Component({
@@ -78,14 +81,17 @@ export class UsersComponent implements OnInit {
         if (result !== false) {
           this.mds.setSpinnerOn();
           this.bs.addUser((<FormGroup>result).get('name').value,
-              (<FormGroup>result).get('pw').value).subscribe(
+              (<FormGroup>result).get('pw').value)
+            .pipe(catchError((err: ApiError) => {
+              this.snackBar.open(`Konnte Nutzer nicht hinzufügen: ${err.code} ${err.info} `, 'Fehler', {duration: 5000});
+              return of(false)
+            })).subscribe(
                 respOk => {
                   if (respOk !== false) {
                     this.snackBar.open('Nutzer hinzugefügt', '', {duration: 1000});
                     this.updateObjectList();
                   } else {
                     this.mds.setSpinnerOff();
-                    this.snackBar.open('Konnte Nutzer nicht hinzufügen', 'Fehler', {duration: 1000});
                   }
                 });
         }
@@ -179,13 +185,15 @@ export class UsersComponent implements OnInit {
           if (result !== false) {
             this.mds.setSpinnerOn();
             this.bs.changePassword(selectedRows[0]['id'],
-                (<FormGroup>result).get('pw').value).subscribe(
+                (<FormGroup>result).get('pw').value)
+              .pipe(catchError((err: ApiError) => {
+                this.snackBar.open(`Konnte Kennwort nicht ändern: ${err.code} ${err.info} `, 'Fehler', {duration: 5000});
+                return of(false)
+              })).subscribe(
                   respOk => {
                     this.mds.setSpinnerOff();
                     if (respOk !== false) {
                       this.snackBar.open('Kennwort geändert', '', {duration: 1000});
-                    } else {
-                      this.snackBar.open('Konnte Kennwort nicht ändern', 'Fehler', {duration: 1000});
                     }
                   });
           }
diff --git a/src/environments/environment.build.ts b/src/environments/environment.build.ts
index d10f7106..e8398de8 100644
--- a/src/environments/environment.build.ts
+++ b/src/environments/environment.build.ts
@@ -5,6 +5,6 @@ export const environment = {
   testcenterUrl: '/',
   appName: 'IQB-Testcenter',
   appPublisher: 'IQB - Institut zur Qualitätsentwicklung im Bildungswesen',
-  appVersion: '2.0.0-beta.5 - 30.4.2020',
+  appVersion: '2.0.1 - 13.5.2020',
   apiVersionExpected: '3.0.1'
 };
diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts
index f7dde3de..ac78a5f4 100644
--- a/src/environments/environment.prod.ts
+++ b/src/environments/environment.prod.ts
@@ -5,6 +5,6 @@ export const environment = {
   testcenterUrl: '/api/',
   appName: 'IQB-Testcenter',
   appPublisher: 'IQB - Institut zur Qualitätsentwicklung im Bildungswesen',
-  appVersion: '2.0.0-beta.5 - 30.4.2020',
+  appVersion: '2.0.1 - 13.5.2020',
   apiVersionExpected: '3.0.1'
 };
diff --git a/src/environments/environment.ts b/src/environments/environment.ts
index ff36a883..8c1008fd 100644
--- a/src/environments/environment.ts
+++ b/src/environments/environment.ts
@@ -10,7 +10,7 @@ export const environment = {
   // testcenterUrl: 'http://localhost/api/',
   appName: 'IQB-Testcenter',
   appPublisher: 'IQB - Institut zur Qualitätsentwicklung im Bildungswesen',
-  appVersion: '2.0.0-beta.5 - 30.4.2020',
+  appVersion: '2.0.1 - 13.5.2020',
   apiVersionExpected: '3.0.1'
 };
 
-- 
GitLab