diff --git a/backend/src/main/java/ru/micord/ervu/error_handling/ErvuUnknownExceptionHandler.java b/backend/src/main/java/ru/micord/ervu/error_handling/ErvuUnknownExceptionHandler.java deleted file mode 100644 index f3323d9..0000000 --- a/backend/src/main/java/ru/micord/ervu/error_handling/ErvuUnknownExceptionHandler.java +++ /dev/null @@ -1,61 +0,0 @@ -package ru.micord.ervu.error_handling; - -import java.util.Arrays; - -import org.springframework.context.annotation.Primary; -import org.springframework.context.support.MessageSourceAccessor; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; - -import ru.cg.webbpm.modules.core.app_info.api.mode.AppMode; -import ru.cg.webbpm.modules.core.error_handling.api.ProcessedWebException; -import ru.cg.webbpm.modules.core.error_handling.api.impl.UnknownExceptionHandler; -import ru.cg.webbpm.modules.core.runtime.api.MessageBundleUtils; - -@Component -@Primary -public class ErvuUnknownExceptionHandler extends UnknownExceptionHandler { - protected static final MessageSourceAccessor ERVU_MESSAGE_SOURCE = MessageBundleUtils.createAccessor("exception_handler_messages"); - - @Override - public ProcessedWebException process(Throwable throwable) { - if (AppMode.mode() == AppMode.Mode.PROD) { - return new ProcessedWebException() - .addMessage(unknownErrorMessage()); - } - else { - Throwable lastThrowable = findLastCause(throwable); - String lastThrowableStackTrace = Arrays.toString(lastThrowable.getStackTrace()); - String limitLastThrowableStackTrace = lastThrowableStackTrace.length() > MAX_STACK_TRACE_LENGTH - ? lastThrowableStackTrace.substring(0, MAX_STACK_TRACE_LENGTH) + " ..." - : lastThrowableStackTrace; - return new ProcessedWebException() - .addMessage(findLastNotEmptyMessage(throwable)) - .setCauseStackTrace(limitLastThrowableStackTrace); - } - } - - private String unknownErrorMessage() { - return ERVU_MESSAGE_SOURCE.getMessage("ervu.error.unknown", new Object[] {}); - } - - private Throwable findLastCause(Throwable throwable) { - if (throwable.getCause() != null) { - return findLastCause(throwable.getCause()); - } - return throwable; - } - - private String findLastNotEmptyMessage(Throwable throwable) { - String message = throwable.getMessage(); - if(throwable.getCause() != null) { - String nextMessage = findLastNotEmptyMessage(throwable.getCause()); - if(!StringUtils.isEmpty(nextMessage)) { - message = nextMessage; - } - } - return message; - } - - -} diff --git a/backend/src/main/resources/exception_handler_messages.properties b/backend/src/main/resources/exception_handler_messages.properties deleted file mode 100644 index c612a89..0000000 --- a/backend/src/main/resources/exception_handler_messages.properties +++ /dev/null @@ -1 +0,0 @@ -ervu.error.unknown=??????? ???????? ??????????. ??????????, ????????? ??????? ?????. diff --git a/backend/src/main/resources/exception_handler_messages_en_US.properties b/backend/src/main/resources/exception_handler_messages_en_US.properties deleted file mode 100644 index c5431af..0000000 --- a/backend/src/main/resources/exception_handler_messages_en_US.properties +++ /dev/null @@ -1 +0,0 @@ -ervu.error.unknown=The system is temporarily unavailable. Please try again later. diff --git a/backend/src/main/resources/i18n/exception_handler_messages.properties b/backend/src/main/resources/i18n/exception_handler_messages.properties new file mode 100644 index 0000000..d7091e8 --- /dev/null +++ b/backend/src/main/resources/i18n/exception_handler_messages.properties @@ -0,0 +1 @@ +error.unknown=Система временно недоступна. Пожалуйста, повторите попытку позже. diff --git a/backend/src/main/resources/i18n/exception_handler_messages_en_US.properties b/backend/src/main/resources/i18n/exception_handler_messages_en_US.properties new file mode 100644 index 0000000..878998f --- /dev/null +++ b/backend/src/main/resources/i18n/exception_handler_messages_en_US.properties @@ -0,0 +1 @@ +error.unknown=The system is temporarily unavailable. Please try again later. diff --git a/frontend/src/ts/modules/security/authentication.service.ts b/frontend/src/ts/modules/security/authentication.service.ts index 0db276c..ec5d5a4 100644 --- a/frontend/src/ts/modules/security/authentication.service.ts +++ b/frontend/src/ts/modules/security/authentication.service.ts @@ -22,4 +22,13 @@ export class AuthenticationService { public isAuthenticated(): boolean { return this.cookieService.get('webbpm.ervu-lkrp-fl') != null; } + + public redirectToEsia() { + return this.http.get("esia/url") + .toPromise() + .then(url => { + window.open(url, "_self"); + return true; + }); + } } diff --git a/frontend/src/ts/modules/security/guard/auth.guard.ts b/frontend/src/ts/modules/security/guard/auth.guard.ts index 045946d..0e8300a 100644 --- a/frontend/src/ts/modules/security/guard/auth.guard.ts +++ b/frontend/src/ts/modules/security/guard/auth.guard.ts @@ -65,15 +65,10 @@ export abstract class AuthGuard implements CanActivate { return false; } else { - return this.httpClient.get("esia/url") - .toPromise() - .then(url => { - window.open(url, "_self"); - return true; - }).catch((reason)=> { - console.error(reason); - return false; - }); + return this.authenticationService.redirectToEsia().catch((reason) => { + console.error(reason); + return false; + }); } }).catch((reason) => { console.error(reason); diff --git a/frontend/src/ts/modules/webbpm/interceptor/ervu-http-security-error-interceptor.ts b/frontend/src/ts/modules/webbpm/interceptor/ervu-http-security-error-interceptor.ts index eb01584..de16017 100644 --- a/frontend/src/ts/modules/webbpm/interceptor/ervu-http-security-error-interceptor.ts +++ b/frontend/src/ts/modules/webbpm/interceptor/ervu-http-security-error-interceptor.ts @@ -13,76 +13,42 @@ import { } from "@webbpm/base-package"; import {Injectable} from "@angular/core"; import {Router} from "@angular/router"; -import {Observable, throwError} from "rxjs"; -import {catchError} from "rxjs/operators"; +import {from, Observable, throwError} from "rxjs"; +import {catchError, map} from "rxjs/operators"; import {ErvuHttpInterceptorUtils} from "../../../util/ErvuHttpInterceptorUtils"; +import {AuthenticationService} from "../../security/authentication.service"; @Injectable() export class ErvuHttpSecurityErrorInterceptor extends HttpSecurityErrorInterceptor implements HttpInterceptor { - private router: Router; - private _userService: UserService; - private _messagesService: MessagesService; + private authService: AuthenticationService; - constructor(router: Router, messagesService: MessagesService, userService: UserService) { + constructor(router: Router, messagesService: MessagesService, userService: UserService, + authService: AuthenticationService) { super(router, messagesService, userService); - this.router = router; - this._userService = userService; - this._messagesService = messagesService; + this.authService = authService; } - intercept(req: HttpRequest, next: HttpHandler): Observable> { - - if (req.headers.has("Error-intercept-skip")) { - let isSkipped: string = req.headers.get("Error-intercept-skip"); - req.headers.delete("Error-intercept-skip"); - if (isSkipped == "true") { - return next.handle(req); - } - } - - return next.handle(req).pipe(catchError(error => { - switch (error.status) { - case 401: { - window.location.reload(); - break; - } - case 419: - case 440: { - console.log( - "Logout redirect applied due to response status " + error.status + - " received by HTTP Interceptor" - ); - this._userService.clearSessionStore(); - return throwError(error); - } - case 403: { - console.log( - "Access-Denied redirect applied due to response status " + error.status - + " received by HTTP Interceptor" - ); - this.router.navigateByUrl('/access-denied'); - return throwError(error); - } - case 422: { - console.log("Error " + error.status + " server response received by HTTP Interceptor"); - return throwError(error); - } - default: { - this._userService.hideProgressBar(); - console.log("Error " + error.status + " server response received by HTTP Interceptor"); - this.processErrorResponseDataErvu(error); - return throwError(error); - } - } - })); - } - - private processErrorResponseDataErvu(error: HttpErrorResponse) { + protected processErrorResponseData(error: HttpErrorResponse) { let errorResponse: ErrorResponse = ErvuHttpInterceptorUtils.getErrorResponseFromResponse(error); errorResponse.messages.forEach((errorMessage) => { - this._messagesService.error(errorMessage, errorResponse); + this.messagesService.error(errorMessage, errorResponse); }); } + + protected processAuthError(req: HttpRequest, next: HttpHandler, + error: any): Observable> { + if (this.authService.isAuthenticated()) { + return super.processAuthError(req, next, error); + } + else { + return from(this.authService.redirectToEsia()).pipe( + map(() => null), + catchError((err) => { + throw err; + }) + ); + } + } }