From 1b499f111066a98a4819dbfcd28b13d64bbc6d97 Mon Sep 17 00:00:00 2001
From: Alex ORLUC <alex.orluc@maarch.org>
Date: Mon, 6 Apr 2020 12:34:30 +0200
Subject: [PATCH] FEAT #13670 TIME 1 fix safe url window open

---
 .../document-list/folder-document-list.component.ts |  9 ++++++++-
 .../followed-document-list.component.ts             |  9 ++++++++-
 src/frontend/app/home/home.component.ts             | 13 ++++++++++---
 src/frontend/app/list/basket-list.component.ts      |  9 ++++++++-
 4 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/src/frontend/app/folder/document-list/folder-document-list.component.ts b/src/frontend/app/folder/document-list/folder-document-list.component.ts
index 5ca8c4ec15a..0f14a49909e 100644
--- a/src/frontend/app/folder/document-list/folder-document-list.component.ts
+++ b/src/frontend/app/folder/document-list/folder-document-list.component.ts
@@ -407,7 +407,14 @@ export class FolderDocumentListComponent implements OnInit, OnDestroy {
     }
 
     viewDocument(row: any) {
-        window.open('../../rest/resources/' + row.resId + '/content?mode=view', '_blank');
+        this.http.get(`../../rest/resources/${row.resId}/content?mode=view`, { responseType: 'blob' })
+            .subscribe((data: any) => {
+                const file = new Blob([data], { type: 'application/pdf' });
+                const fileURL = URL.createObjectURL(file);
+                const newWindow = window.open();
+                newWindow.document.write(`<iframe style="width: 100%;height: 100%;margin: 0;padding: 0;" src="${fileURL}" frameborder="0" allowfullscreen></iframe>`);
+                newWindow.document.title = row.chrono;
+            });
     }
 }
 export interface BasketList {
diff --git a/src/frontend/app/home/followed-list/followed-document-list.component.ts b/src/frontend/app/home/followed-list/followed-document-list.component.ts
index b2425f6db67..1d29098018a 100644
--- a/src/frontend/app/home/followed-list/followed-document-list.component.ts
+++ b/src/frontend/app/home/followed-list/followed-document-list.component.ts
@@ -350,7 +350,14 @@ export class FollowedDocumentListComponent implements OnInit, OnDestroy {
     }
 
     viewDocument(row: any) {
-        window.open('../../rest/resources/' + row.resId + '/content?mode=view', '_blank');
+        this.http.get(`../../rest/resources/${row.resId}/content?mode=view`, { responseType: 'blob' })
+            .subscribe((data: any) => {
+                const file = new Blob([data], { type: 'application/pdf' });
+                const fileURL = URL.createObjectURL(file);
+                const newWindow = window.open();
+                newWindow.document.write(`<iframe style="width: 100%;height: 100%;margin: 0;padding: 0;" src="${fileURL}" frameborder="0" allowfullscreen></iframe>`);
+                newWindow.document.title = row.chrono;
+            });
     }
 }
 export interface BasketList {
diff --git a/src/frontend/app/home/home.component.ts b/src/frontend/app/home/home.component.ts
index c4364f60228..235555410c3 100644
--- a/src/frontend/app/home/home.component.ts
+++ b/src/frontend/app/home/home.component.ts
@@ -1,4 +1,4 @@
-import { Component, OnInit, QueryList, ViewChildren } from '@angular/core';
+import { Component, OnInit, QueryList, ViewChildren, AfterViewInit } from '@angular/core';
 import { HttpClient } from '@angular/common/http';
 import { LANG } from '../translate.component';
 import { MatDialog } from '@angular/material/dialog';
@@ -17,7 +17,7 @@ declare var $: any;
     styleUrls: ['home.component.scss'],
     providers: [AppService]
 })
-export class HomeComponent implements OnInit {
+export class HomeComponent implements OnInit, AfterViewInit {
 
     lang: any = LANG;
     loading: boolean = false;
@@ -78,7 +78,14 @@ export class HomeComponent implements OnInit {
     }
 
     viewDocument(row: any) {
-        window.open('../../rest/resources/' + row.res_id + '/content?mode=view', '_blank');
+        this.http.get(`../../rest/resources/${row.res_id}/content?mode=view`, { responseType: 'blob' })
+            .subscribe((data: any) => {
+                const file = new Blob([data], { type: 'application/pdf' });
+                const fileURL = URL.createObjectURL(file);
+                const newWindow = window.open();
+                newWindow.document.write(`<iframe style="width: 100%;height: 100%;margin: 0;padding: 0;" src="${fileURL}" frameborder="0" allowfullscreen></iframe>`);
+                newWindow.document.title = row.alt_identifier;
+            });
     }
 
     viewThumbnail(row: any) {
diff --git a/src/frontend/app/list/basket-list.component.ts b/src/frontend/app/list/basket-list.component.ts
index 413764f9f64..67ef4e6ce55 100755
--- a/src/frontend/app/list/basket-list.component.ts
+++ b/src/frontend/app/list/basket-list.component.ts
@@ -482,7 +482,14 @@ export class BasketListComponent implements OnInit, OnDestroy {
     }
 
     viewDocument(row: any) {
-        window.open('../../rest/resources/' + row.resId + '/content?mode=view', '_blank');
+        this.http.get(`../../rest/resources/${row.resId}/content?mode=view`, { responseType: 'blob' })
+            .subscribe((data: any) => {
+                const file = new Blob([data], { type: 'application/pdf' });
+                const fileURL = URL.createObjectURL(file);
+                const newWindow = window.open();
+                newWindow.document.write(`<iframe style="width: 100%;height: 100%;margin: 0;padding: 0;" src="${fileURL}" frameborder="0" allowfullscreen></iframe>`);
+                newWindow.document.title = row.chrono;
+            });
     }
 
     toggleMailTracking(row: any) {
-- 
GitLab