From c9d50753f6796d99910c1bdca4d880b1c1fcfa66 Mon Sep 17 00:00:00 2001 From: Trevor Slaton Date: Fri, 21 Jun 2019 15:20:02 -0700 Subject: [PATCH] Fix downloads in Chrome with xsrf token --- packages/filebrowser/src/model.ts | 23 ++++++++++++----------- packages/services/src/contents/index.ts | 9 ++++++--- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/packages/filebrowser/src/model.ts b/packages/filebrowser/src/model.ts index 88caf46913ed..8f458a0c9555 100644 --- a/packages/filebrowser/src/model.ts +++ b/packages/filebrowser/src/model.ts @@ -312,17 +312,18 @@ export class FileBrowserModel implements IDisposable { * @returns A promise which resolves when the file has begun * downloading. */ - download(path: string): Promise { - return this.manager.services.contents.getDownloadUrl(path).then(url => { - let element = document.createElement('a'); - document.body.appendChild(element); - element.setAttribute('href', url); - element.setAttribute('target', '_blank'); - element.setAttribute('download', ''); - element.click(); - document.body.removeChild(element); - return void 0; - }); + async download(path: string): Promise { + const url = await this.manager.services.contents.getDownloadUrl(path); + let element = document.createElement('a'); + document.body.appendChild(element); + element.setAttribute('href', url); + // Chrome doesn't get the right name automatically + const parts = path.split('/'); + const name = parts[parts.length - 1]; + element.setAttribute('download', name); + element.click(); + document.body.removeChild(element); + return void 0; } /** diff --git a/packages/services/src/contents/index.ts b/packages/services/src/contents/index.ts index 22ecd3cb300c..0b67d874c6dd 100644 --- a/packages/services/src/contents/index.ts +++ b/packages/services/src/contents/index.ts @@ -1016,9 +1016,12 @@ export class Drive implements Contents.IDrive { */ getDownloadUrl(localPath: string): Promise { let baseUrl = this.serverSettings.baseUrl; - return Promise.resolve( - URLExt.join(baseUrl, FILES_URL, URLExt.encodeParts(localPath)) - ); + let url = URLExt.join(baseUrl, FILES_URL, URLExt.encodeParts(localPath)); + const xsrfTokenMatch = document.cookie.match('\\b_xsrf=([^;]*)\\b'); + if (xsrfTokenMatch) { + url = URLExt.join(url, `?_xsrf=${xsrfTokenMatch[1]}`); + } + return Promise.resolve(url); } /**