Merge pull request #14027 from mtsymbarov-del/fix/rule-chain-vulnerability
Fixed XSS vulnerabilities in the Rule node
This commit is contained in:
		
						commit
						6b4636ac48
					
				@ -30,6 +30,7 @@ import { DialogService } from '@core/services/dialog.service';
 | 
				
			|||||||
import { TranslateService } from '@ngx-translate/core';
 | 
					import { TranslateService } from '@ngx-translate/core';
 | 
				
			||||||
import { parseHttpErrorMessage } from '@core/utils';
 | 
					import { parseHttpErrorMessage } from '@core/utils';
 | 
				
			||||||
import { getInterceptorConfig } from './interceptor.util';
 | 
					import { getInterceptorConfig } from './interceptor.util';
 | 
				
			||||||
 | 
					import { DomSanitizer } from '@angular/platform-browser';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const tmpHeaders = {};
 | 
					const tmpHeaders = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -46,6 +47,7 @@ export class GlobalHttpInterceptor implements HttpInterceptor {
 | 
				
			|||||||
    private dialogService: DialogService,
 | 
					    private dialogService: DialogService,
 | 
				
			||||||
    private translate: TranslateService,
 | 
					    private translate: TranslateService,
 | 
				
			||||||
    private authService: AuthService,
 | 
					    private authService: AuthService,
 | 
				
			||||||
 | 
					    private sanitizer: DomSanitizer
 | 
				
			||||||
  ) {}
 | 
					  ) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
 | 
					  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
 | 
				
			||||||
@ -129,7 +131,7 @@ export class GlobalHttpInterceptor implements HttpInterceptor {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (unhandled && !ignoreErrors) {
 | 
					    if (unhandled && !ignoreErrors) {
 | 
				
			||||||
      const errorMessageWithTimeout = parseHttpErrorMessage(errorResponse, this.translate, req.responseType);
 | 
					      const errorMessageWithTimeout = parseHttpErrorMessage(errorResponse, this.translate, req.responseType, this.sanitizer);
 | 
				
			||||||
      this.showError(errorMessageWithTimeout.message, errorMessageWithTimeout.timeout);
 | 
					      this.showError(errorMessageWithTimeout.message, errorMessageWithTimeout.timeout);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return throwError(() => errorResponse);
 | 
					    return throwError(() => errorResponse);
 | 
				
			||||||
 | 
				
			|||||||
@ -31,6 +31,8 @@ import {
 | 
				
			|||||||
  isNotEmptyTbFunction,
 | 
					  isNotEmptyTbFunction,
 | 
				
			||||||
  TbFunction
 | 
					  TbFunction
 | 
				
			||||||
} from '@shared/models/js-function.models';
 | 
					} from '@shared/models/js-function.models';
 | 
				
			||||||
 | 
					import { DomSanitizer } from '@angular/platform-browser';
 | 
				
			||||||
 | 
					import { SecurityContext } from '@angular/core';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const varsRegex = /\${([^}]*)}/g;
 | 
					const varsRegex = /\${([^}]*)}/g;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -809,7 +811,7 @@ export function getEntityDetailsPageURL(id: string, entityType: EntityType): str
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function parseHttpErrorMessage(errorResponse: HttpErrorResponse,
 | 
					export function parseHttpErrorMessage(errorResponse: HttpErrorResponse,
 | 
				
			||||||
                                      translate: TranslateService, responseType?: string): {message: string; timeout: number} {
 | 
					                                      translate: TranslateService, responseType?: string, sanitizer?:DomSanitizer): {message: string; timeout: number} {
 | 
				
			||||||
  let error = null;
 | 
					  let error = null;
 | 
				
			||||||
  let errorMessage: string;
 | 
					  let errorMessage: string;
 | 
				
			||||||
  let timeout = 0;
 | 
					  let timeout = 0;
 | 
				
			||||||
@ -837,6 +839,9 @@ export function parseHttpErrorMessage(errorResponse: HttpErrorResponse,
 | 
				
			|||||||
    errorText += errorKey ? translate.instant(errorKey) : errorResponse.statusText;
 | 
					    errorText += errorKey ? translate.instant(errorKey) : errorResponse.statusText;
 | 
				
			||||||
    errorMessage = errorText;
 | 
					    errorMessage = errorText;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  if(sanitizer) {
 | 
				
			||||||
 | 
					    errorMessage = sanitizer.sanitize(SecurityContext.HTML,errorMessage);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  return {message: errorMessage, timeout};
 | 
					  return {message: errorMessage, timeout};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -26,6 +26,7 @@ import {
 | 
				
			|||||||
  OnInit,
 | 
					  OnInit,
 | 
				
			||||||
  QueryList,
 | 
					  QueryList,
 | 
				
			||||||
  Renderer2,
 | 
					  Renderer2,
 | 
				
			||||||
 | 
					  SecurityContext,
 | 
				
			||||||
  SkipSelf,
 | 
					  SkipSelf,
 | 
				
			||||||
  ViewChild,
 | 
					  ViewChild,
 | 
				
			||||||
  ViewChildren,
 | 
					  ViewChildren,
 | 
				
			||||||
@ -97,6 +98,7 @@ import { HttpStatusCode } from '@angular/common/http';
 | 
				
			|||||||
import { TbContextMenuEvent } from '@shared/models/jquery-event.models';
 | 
					import { TbContextMenuEvent } from '@shared/models/jquery-event.models';
 | 
				
			||||||
import { EntityDebugSettings } from '@shared/models/entity.models';
 | 
					import { EntityDebugSettings } from '@shared/models/entity.models';
 | 
				
			||||||
import Timeout = NodeJS.Timeout;
 | 
					import Timeout = NodeJS.Timeout;
 | 
				
			||||||
 | 
					import { DomSanitizer } from '@angular/platform-browser';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Component({
 | 
					@Component({
 | 
				
			||||||
  selector: 'tb-rulechain-page',
 | 
					  selector: 'tb-rulechain-page',
 | 
				
			||||||
@ -273,6 +275,7 @@ export class RuleChainPageComponent extends PageComponent
 | 
				
			|||||||
              private renderer: Renderer2,
 | 
					              private renderer: Renderer2,
 | 
				
			||||||
              private viewContainerRef: ViewContainerRef,
 | 
					              private viewContainerRef: ViewContainerRef,
 | 
				
			||||||
              private changeDetector: ChangeDetectorRef,
 | 
					              private changeDetector: ChangeDetectorRef,
 | 
				
			||||||
 | 
					              private sanitizer:DomSanitizer,
 | 
				
			||||||
              public dialog: MatDialog,
 | 
					              public dialog: MatDialog,
 | 
				
			||||||
              public dialogService: DialogService,
 | 
					              public dialogService: DialogService,
 | 
				
			||||||
              public fb: FormBuilder) {
 | 
					              public fb: FormBuilder) {
 | 
				
			||||||
@ -1360,9 +1363,13 @@ export class RuleChainPageComponent extends PageComponent
 | 
				
			|||||||
        name = node.name;
 | 
					        name = node.name;
 | 
				
			||||||
        desc = this.translate.instant(ruleNodeTypeDescriptors.get(node.component.type).name) + ' - ' + node.component.name;
 | 
					        desc = this.translate.instant(ruleNodeTypeDescriptors.get(node.component.type).name) + ' - ' + node.component.name;
 | 
				
			||||||
        if (node.additionalInfo) {
 | 
					        if (node.additionalInfo) {
 | 
				
			||||||
          details = node.additionalInfo.description;
 | 
					          details = this.sanitizer.sanitize(SecurityContext.HTML, node.additionalInfo.description);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      name = this.sanitizer.sanitize(SecurityContext.HTML, name);
 | 
				
			||||||
 | 
					      desc = this.sanitizer.sanitize(SecurityContext.HTML, desc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      let tooltipContent = '<div class="tb-rule-node-tooltip">' +
 | 
					      let tooltipContent = '<div class="tb-rule-node-tooltip">' +
 | 
				
			||||||
        '<div id="tb-node-content">' +
 | 
					        '<div id="tb-node-content">' +
 | 
				
			||||||
        '<div class="tb-node-title">' + name + '</div>' +
 | 
					        '<div class="tb-node-title">' + name + '</div>' +
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user