You've already forked joplin
							
							
				mirror of
				https://github.com/laurent22/joplin.git
				synced 2025-10-31 00:07:48 +02:00 
			
		
		
		
	Clipper: Fixes #1462: Allow importing images from local file with file:// URLs
This commit is contained in:
		
							
								
								
									
										64
									
								
								ElectronClient/app/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										64
									
								
								ElectronClient/app/package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -450,15 +450,13 @@ | |||||||
|           "version": "1.0.0", |           "version": "1.0.0", | ||||||
|           "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", |           "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", | ||||||
|           "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", |           "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", | ||||||
|           "dev": true, |           "dev": true | ||||||
|           "optional": true |  | ||||||
|         }, |         }, | ||||||
|         "is-glob": { |         "is-glob": { | ||||||
|           "version": "2.0.1", |           "version": "2.0.1", | ||||||
|           "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", |           "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", | ||||||
|           "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", |           "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", | ||||||
|           "dev": true, |           "dev": true, | ||||||
|           "optional": true, |  | ||||||
|           "requires": { |           "requires": { | ||||||
|             "is-extglob": "^1.0.0" |             "is-extglob": "^1.0.0" | ||||||
|           } |           } | ||||||
| @@ -2206,6 +2204,11 @@ | |||||||
|       "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", |       "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", | ||||||
|       "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=" |       "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=" | ||||||
|     }, |     }, | ||||||
|  |     "file-uri-to-path": { | ||||||
|  |       "version": "1.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", | ||||||
|  |       "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" | ||||||
|  |     }, | ||||||
|     "filename-regex": { |     "filename-regex": { | ||||||
|       "version": "2.0.1", |       "version": "2.0.1", | ||||||
|       "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", |       "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", | ||||||
| @@ -2371,8 +2374,7 @@ | |||||||
|           "version": "2.1.1", |           "version": "2.1.1", | ||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", |           "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", | ||||||
|           "dev": true, |           "dev": true | ||||||
|           "optional": true |  | ||||||
|         }, |         }, | ||||||
|         "aproba": { |         "aproba": { | ||||||
|           "version": "1.2.0", |           "version": "1.2.0", | ||||||
| @@ -2396,15 +2398,13 @@ | |||||||
|           "version": "1.0.0", |           "version": "1.0.0", | ||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", |           "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", | ||||||
|           "dev": true, |           "dev": true | ||||||
|           "optional": true |  | ||||||
|         }, |         }, | ||||||
|         "brace-expansion": { |         "brace-expansion": { | ||||||
|           "version": "1.1.11", |           "version": "1.1.11", | ||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", |           "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", | ||||||
|           "dev": true, |           "dev": true, | ||||||
|           "optional": true, |  | ||||||
|           "requires": { |           "requires": { | ||||||
|             "balanced-match": "^1.0.0", |             "balanced-match": "^1.0.0", | ||||||
|             "concat-map": "0.0.1" |             "concat-map": "0.0.1" | ||||||
| @@ -2421,22 +2421,19 @@ | |||||||
|           "version": "1.1.0", |           "version": "1.1.0", | ||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", |           "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", | ||||||
|           "dev": true, |           "dev": true | ||||||
|           "optional": true |  | ||||||
|         }, |         }, | ||||||
|         "concat-map": { |         "concat-map": { | ||||||
|           "version": "0.0.1", |           "version": "0.0.1", | ||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", |           "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", | ||||||
|           "dev": true, |           "dev": true | ||||||
|           "optional": true |  | ||||||
|         }, |         }, | ||||||
|         "console-control-strings": { |         "console-control-strings": { | ||||||
|           "version": "1.1.0", |           "version": "1.1.0", | ||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", |           "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", | ||||||
|           "dev": true, |           "dev": true | ||||||
|           "optional": true |  | ||||||
|         }, |         }, | ||||||
|         "core-util-is": { |         "core-util-is": { | ||||||
|           "version": "1.0.2", |           "version": "1.0.2", | ||||||
| @@ -2567,8 +2564,7 @@ | |||||||
|           "version": "2.0.3", |           "version": "2.0.3", | ||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", |           "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", | ||||||
|           "dev": true, |           "dev": true | ||||||
|           "optional": true |  | ||||||
|         }, |         }, | ||||||
|         "ini": { |         "ini": { | ||||||
|           "version": "1.3.5", |           "version": "1.3.5", | ||||||
| @@ -2582,7 +2578,6 @@ | |||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", |           "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", | ||||||
|           "dev": true, |           "dev": true, | ||||||
|           "optional": true, |  | ||||||
|           "requires": { |           "requires": { | ||||||
|             "number-is-nan": "^1.0.0" |             "number-is-nan": "^1.0.0" | ||||||
|           } |           } | ||||||
| @@ -2599,7 +2594,6 @@ | |||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", |           "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", | ||||||
|           "dev": true, |           "dev": true, | ||||||
|           "optional": true, |  | ||||||
|           "requires": { |           "requires": { | ||||||
|             "brace-expansion": "^1.1.7" |             "brace-expansion": "^1.1.7" | ||||||
|           } |           } | ||||||
| @@ -2608,15 +2602,13 @@ | |||||||
|           "version": "0.0.8", |           "version": "0.0.8", | ||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", |           "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", | ||||||
|           "dev": true, |           "dev": true | ||||||
|           "optional": true |  | ||||||
|         }, |         }, | ||||||
|         "minipass": { |         "minipass": { | ||||||
|           "version": "2.2.4", |           "version": "2.2.4", | ||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", |           "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", | ||||||
|           "dev": true, |           "dev": true, | ||||||
|           "optional": true, |  | ||||||
|           "requires": { |           "requires": { | ||||||
|             "safe-buffer": "^5.1.1", |             "safe-buffer": "^5.1.1", | ||||||
|             "yallist": "^3.0.0" |             "yallist": "^3.0.0" | ||||||
| @@ -2637,7 +2629,6 @@ | |||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", |           "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", | ||||||
|           "dev": true, |           "dev": true, | ||||||
|           "optional": true, |  | ||||||
|           "requires": { |           "requires": { | ||||||
|             "minimist": "0.0.8" |             "minimist": "0.0.8" | ||||||
|           } |           } | ||||||
| @@ -2726,8 +2717,7 @@ | |||||||
|           "version": "1.0.1", |           "version": "1.0.1", | ||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", |           "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", | ||||||
|           "dev": true, |           "dev": true | ||||||
|           "optional": true |  | ||||||
|         }, |         }, | ||||||
|         "object-assign": { |         "object-assign": { | ||||||
|           "version": "4.1.1", |           "version": "4.1.1", | ||||||
| @@ -2741,7 +2731,6 @@ | |||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", |           "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", | ||||||
|           "dev": true, |           "dev": true, | ||||||
|           "optional": true, |  | ||||||
|           "requires": { |           "requires": { | ||||||
|             "wrappy": "1" |             "wrappy": "1" | ||||||
|           } |           } | ||||||
| @@ -2837,8 +2826,7 @@ | |||||||
|           "version": "5.1.1", |           "version": "5.1.1", | ||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", |           "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", | ||||||
|           "dev": true, |           "dev": true | ||||||
|           "optional": true |  | ||||||
|         }, |         }, | ||||||
|         "safer-buffer": { |         "safer-buffer": { | ||||||
|           "version": "2.1.2", |           "version": "2.1.2", | ||||||
| @@ -2880,7 +2868,6 @@ | |||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", |           "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", | ||||||
|           "dev": true, |           "dev": true, | ||||||
|           "optional": true, |  | ||||||
|           "requires": { |           "requires": { | ||||||
|             "code-point-at": "^1.0.0", |             "code-point-at": "^1.0.0", | ||||||
|             "is-fullwidth-code-point": "^1.0.0", |             "is-fullwidth-code-point": "^1.0.0", | ||||||
| @@ -2902,7 +2889,6 @@ | |||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", |           "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", | ||||||
|           "dev": true, |           "dev": true, | ||||||
|           "optional": true, |  | ||||||
|           "requires": { |           "requires": { | ||||||
|             "ansi-regex": "^2.0.0" |             "ansi-regex": "^2.0.0" | ||||||
|           } |           } | ||||||
| @@ -2951,15 +2937,13 @@ | |||||||
|           "version": "1.0.2", |           "version": "1.0.2", | ||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", |           "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", | ||||||
|           "dev": true, |           "dev": true | ||||||
|           "optional": true |  | ||||||
|         }, |         }, | ||||||
|         "yallist": { |         "yallist": { | ||||||
|           "version": "3.0.2", |           "version": "3.0.2", | ||||||
|           "resolved": false, |           "resolved": false, | ||||||
|           "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", |           "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", | ||||||
|           "dev": true, |           "dev": true | ||||||
|           "optional": true |  | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
| @@ -3060,15 +3044,13 @@ | |||||||
|           "version": "1.0.0", |           "version": "1.0.0", | ||||||
|           "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", |           "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", | ||||||
|           "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", |           "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", | ||||||
|           "dev": true, |           "dev": true | ||||||
|           "optional": true |  | ||||||
|         }, |         }, | ||||||
|         "is-glob": { |         "is-glob": { | ||||||
|           "version": "2.0.1", |           "version": "2.0.1", | ||||||
|           "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", |           "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", | ||||||
|           "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", |           "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", | ||||||
|           "dev": true, |           "dev": true, | ||||||
|           "optional": true, |  | ||||||
|           "requires": { |           "requires": { | ||||||
|             "is-extglob": "^1.0.0" |             "is-extglob": "^1.0.0" | ||||||
|           } |           } | ||||||
| @@ -4322,7 +4304,6 @@ | |||||||
|       "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", |       "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", | ||||||
|       "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", |       "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "optional": true, |  | ||||||
|       "requires": { |       "requires": { | ||||||
|         "remove-trailing-separator": "^1.0.1" |         "remove-trailing-separator": "^1.0.1" | ||||||
|       } |       } | ||||||
| @@ -4686,8 +4667,7 @@ | |||||||
|           "version": "1.0.0", |           "version": "1.0.0", | ||||||
|           "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", |           "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", | ||||||
|           "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", |           "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", | ||||||
|           "dev": true, |           "dev": true | ||||||
|           "optional": true |  | ||||||
|         }, |         }, | ||||||
|         "is-glob": { |         "is-glob": { | ||||||
|           "version": "2.0.1", |           "version": "2.0.1", | ||||||
| @@ -5256,15 +5236,13 @@ | |||||||
|       "version": "1.1.0", |       "version": "1.1.0", | ||||||
|       "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", |       "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", | ||||||
|       "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", |       "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", | ||||||
|       "dev": true, |       "dev": true | ||||||
|       "optional": true |  | ||||||
|     }, |     }, | ||||||
|     "repeat-element": { |     "repeat-element": { | ||||||
|       "version": "1.1.2", |       "version": "1.1.2", | ||||||
|       "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", |       "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", | ||||||
|       "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", |       "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", | ||||||
|       "dev": true, |       "dev": true | ||||||
|       "optional": true |  | ||||||
|     }, |     }, | ||||||
|     "repeat-string": { |     "repeat-string": { | ||||||
|       "version": "1.6.1", |       "version": "1.6.1", | ||||||
|   | |||||||
| @@ -93,6 +93,7 @@ | |||||||
|     "electron-is-dev": "^0.3.0", |     "electron-is-dev": "^0.3.0", | ||||||
|     "electron-window-state": "^4.1.1", |     "electron-window-state": "^4.1.1", | ||||||
|     "es6-promise-pool": "^2.5.0", |     "es6-promise-pool": "^2.5.0", | ||||||
|  |     "file-uri-to-path": "^1.0.0", | ||||||
|     "follow-redirects": "^1.5.0", |     "follow-redirects": "^1.5.0", | ||||||
|     "form-data": "^2.3.2", |     "form-data": "^2.3.2", | ||||||
|     "formatcoords": "^1.1.3", |     "formatcoords": "^1.1.3", | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| const stringPadding = require('string-padding'); | const stringPadding = require('string-padding'); | ||||||
| const urlUtils = require('lib/urlUtils'); | const urlUtils = require('lib/urlUtils'); | ||||||
| const MarkdownIt = require('markdown-it'); | const MarkdownIt = require('markdown-it'); | ||||||
|  | const setupLinkify = require('lib/MdToHtml/setupLinkify'); | ||||||
|  |  | ||||||
| const markdownUtils = { | const markdownUtils = { | ||||||
|  |  | ||||||
| @@ -23,6 +24,8 @@ const markdownUtils = { | |||||||
|  |  | ||||||
| 	extractImageUrls(md) { | 	extractImageUrls(md) { | ||||||
| 		const markdownIt = new MarkdownIt(); | 		const markdownIt = new MarkdownIt(); | ||||||
|  | 		setupLinkify(markdownIt); // Necessary to support file:/// links | ||||||
|  |  | ||||||
| 		const env = {}; | 		const env = {}; | ||||||
| 		const tokens = markdownIt.parse(md, env); | 		const tokens = markdownIt.parse(md, env); | ||||||
| 		const output = []; | 		const output = []; | ||||||
|   | |||||||
| @@ -11,10 +11,12 @@ const { Logger } = require('lib/logger.js'); | |||||||
| const md5 = require('md5'); | const md5 = require('md5'); | ||||||
| const { shim } = require('lib/shim'); | const { shim } = require('lib/shim'); | ||||||
| const HtmlToMd = require('lib/HtmlToMd'); | const HtmlToMd = require('lib/HtmlToMd'); | ||||||
|  | const urlUtils = require('lib/urlUtils.js'); | ||||||
| const { fileExtension, safeFileExtension, safeFilename, filename } = require('lib/path-utils'); | const { fileExtension, safeFileExtension, safeFilename, filename } = require('lib/path-utils'); | ||||||
| const ApiResponse = require('lib/services/rest/ApiResponse'); | const ApiResponse = require('lib/services/rest/ApiResponse'); | ||||||
| const SearchEngineUtils = require('lib/services/SearchEngineUtils'); | const SearchEngineUtils = require('lib/services/SearchEngineUtils'); | ||||||
| const { FoldersScreenUtils } = require('lib/folders-screen-utils.js'); | const { FoldersScreenUtils } = require('lib/folders-screen-utils.js'); | ||||||
|  | const uri2path = require('file-uri-to-path'); | ||||||
|  |  | ||||||
| class ApiError extends Error { | class ApiError extends Error { | ||||||
|  |  | ||||||
| @@ -349,6 +351,8 @@ class Api { | |||||||
| 			const requestId = Date.now(); | 			const requestId = Date.now(); | ||||||
| 			const requestNote = JSON.parse(request.body); | 			const requestNote = JSON.parse(request.body); | ||||||
|  |  | ||||||
|  | 			const allowFileProtocolImages = urlUtils.urlProtocol(requestNote.base_url).toLowerCase() === 'file:'; | ||||||
|  |  | ||||||
| 			const imageSizes = requestNote.image_sizes ? requestNote.image_sizes : {}; | 			const imageSizes = requestNote.image_sizes ? requestNote.image_sizes : {}; | ||||||
|  |  | ||||||
| 			let note = await this.requestNoteToNote(requestNote); | 			let note = await this.requestNoteToNote(requestNote); | ||||||
| @@ -357,7 +361,7 @@ class Api { | |||||||
|  |  | ||||||
| 			this.logger().info('Request (' + requestId + '): Downloading images: ' + imageUrls.length); | 			this.logger().info('Request (' + requestId + '): Downloading images: ' + imageUrls.length); | ||||||
|  |  | ||||||
| 			let result = await this.downloadImages_(imageUrls); | 			let result = await this.downloadImages_(imageUrls, allowFileProtocolImages); | ||||||
|  |  | ||||||
| 			this.logger().info('Request (' + requestId + '): Creating resources from paths: ' + Object.getOwnPropertyNames(result).length); | 			this.logger().info('Request (' + requestId + '): Creating resources from paths: ' + Object.getOwnPropertyNames(result).length); | ||||||
|  |  | ||||||
| @@ -445,7 +449,7 @@ class Api { | |||||||
| 		return await shim.attachFileToNote(note, tempFilePath); | 		return await shim.attachFileToNote(note, tempFilePath); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	async downloadImage_(url) { | 	async downloadImage_(url, allowFileProtocolImages) { | ||||||
| 		const tempDir = Setting.value('tempDir'); | 		const tempDir = Setting.value('tempDir'); | ||||||
|  |  | ||||||
| 		const isDataUrl = url && url.toLowerCase().indexOf('data:') === 0; | 		const isDataUrl = url && url.toLowerCase().indexOf('data:') === 0; | ||||||
| @@ -459,6 +463,11 @@ class Api { | |||||||
| 		try { | 		try { | ||||||
| 			if (isDataUrl) { | 			if (isDataUrl) { | ||||||
| 				await shim.imageFromDataUrl(url, imagePath); | 				await shim.imageFromDataUrl(url, imagePath); | ||||||
|  | 			} else if (urlUtils.urlProtocol(url).toLowerCase() === 'file:') { | ||||||
|  | 				// Can't think of any reason to disallow this at this point | ||||||
|  | 				// if (!allowFileProtocolImages) throw new Error('For security reasons, this URL with file:// protocol cannot be downloaded'); | ||||||
|  | 				const localPath = uri2path(url); | ||||||
|  | 				await shim.fsDriver().copy(localPath, imagePath); | ||||||
| 			} else { | 			} else { | ||||||
| 				await shim.fetchBlob(url, { path: imagePath }); | 				await shim.fetchBlob(url, { path: imagePath }); | ||||||
| 			} | 			} | ||||||
| @@ -469,7 +478,7 @@ class Api { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	async downloadImages_(urls) { | 	async downloadImages_(urls, allowFileProtocolImages) { | ||||||
| 		const PromisePool = require('es6-promise-pool') | 		const PromisePool = require('es6-promise-pool') | ||||||
|  |  | ||||||
| 		const output = {}; | 		const output = {}; | ||||||
| @@ -481,7 +490,7 @@ class Api { | |||||||
| 			const url = urls[urlIndex++]; | 			const url = urls[urlIndex++]; | ||||||
|  |  | ||||||
| 			return new Promise(async (resolve, reject) => { | 			return new Promise(async (resolve, reject) => { | ||||||
| 				const imagePath = await this.downloadImage_(url); | 				const imagePath = await this.downloadImage_(url, allowFileProtocolImages); | ||||||
| 				if (imagePath) output[url] = { path: imagePath, originalUrl: url }; | 				if (imagePath) output[url] = { path: imagePath, originalUrl: url }; | ||||||
| 				resolve(); | 				resolve(); | ||||||
| 			}); | 			}); | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ urlUtils.urlWithoutPath = function(url) { | |||||||
| } | } | ||||||
|  |  | ||||||
| urlUtils.urlProtocol = function(url) { | urlUtils.urlProtocol = function(url) { | ||||||
|  | 	if (!url) return ''; | ||||||
| 	const parsed = require('url').parse(url, true); | 	const parsed = require('url').parse(url, true); | ||||||
| 	return parsed.protocol; | 	return parsed.protocol; | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user