From 1e45f2d4e134d3ff5ced2b48f10dd2b4d7d76afa Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Fri, 15 Jan 2016 15:05:46 -0600 Subject: [PATCH] Wraps worker script if its cross-origin location is detected. --- src/display/api.js | 17 +++++++++++++++++ src/shared/util.js | 16 ++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/display/api.js b/src/display/api.js index 864a80ebe..74f0f87ed 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -48,6 +48,7 @@ var error = sharedUtil.error; var deprecated = sharedUtil.deprecated; var info = sharedUtil.info; var isArrayBuffer = sharedUtil.isArrayBuffer; +var isSameOrigin = sharedUtil.isSameOrigin; var loadJpegStream = sharedUtil.loadJpegStream; var stringToBytes = sharedUtil.stringToBytes; var warn = sharedUtil.warn; @@ -1226,6 +1227,14 @@ var PDFWorker = (function PDFWorkerClosure() { return PDFJS.fakeWorkerFilesLoadedCapability.promise; } + function createCDNWrapper(url) { + // We will rely on blob URL's property to specify origin. + // We want this function to fail in case if createObjectURL or Blob do not + // exist or fail for some reason -- our Worker creation will fail anyway. + var wrapper = 'importScripts(\'' + url + '\');'; + return URL.createObjectURL(new Blob([wrapper])); + } + function PDFWorker(name) { this.name = name; this.destroyed = false; @@ -1261,6 +1270,14 @@ var PDFWorker = (function PDFWorkerClosure() { var workerSrc = getWorkerSrc(); try { +//#if GENERIC +// // Wraps workerSrc path into blob URL, if the former does not belong +// // to the same origin. +// if (!isSameOrigin(window.location.href, workerSrc)) { +// workerSrc = createCDNWrapper( +// combineUrl(window.location.href, workerSrc)); +// } +//#endif // Some versions of FF can't create a worker on localhost, see: // https://bugzilla.mozilla.org/show_bug.cgi?id=683280 var worker = new Worker(workerSrc); diff --git a/src/shared/util.js b/src/shared/util.js index 286968881..ce7e79598 100644 --- a/src/shared/util.js +++ b/src/shared/util.js @@ -293,6 +293,21 @@ function combineUrl(baseUrl, url) { return new URL(url, baseUrl).href; } +// Checks if URLs have the same origin. For non-HTTP based URLs, returns false. +function isSameOrigin(baseUrl, otherUrl) { + try { + var base = new URL(baseUrl); + if (!base.origin || base.origin === 'null') { + return false; // non-HTTP url + } + } catch (e) { + return false; + } + + var other = new URL(otherUrl, base); + return base.origin === other.origin; +} + // Validates if URL is safe and allowed, e.g. to avoid XSS. function isValidUrl(url, allowRelative) { if (!url) { @@ -2291,6 +2306,7 @@ exports.isExternalLinkTargetSet = isExternalLinkTargetSet; exports.isInt = isInt; exports.isNum = isNum; exports.isString = isString; +exports.isSameOrigin = isSameOrigin; exports.isValidUrl = isValidUrl; exports.loadJpegStream = loadJpegStream; exports.log2 = log2;