card-mod-script 0.13.3 → 0.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/assets/script/decko/components.js.coffee +3 -0
  3. data/assets/script/decko/decko.js.coffee +0 -15
  4. data/assets/script/decko/editor.js.coffee +3 -1
  5. data/assets/script/decko/filter.js.coffee +13 -6
  6. data/assets/script/decko/mod.js.coffee +2 -8
  7. data/assets/script/{script_pointer_config.js.coffee → decko/pointer_config.js.coffee} +1 -2
  8. data/assets/script/{script_pointer_list_editor.js.coffee → decko/pointer_list_editor.js.coffee} +0 -0
  9. data/assets/script/decko/slot.js.coffee +2 -2
  10. data/assets/script/decko/slot_ready.js.coffee +1 -0
  11. data/assets/script/decko/slotter.js.coffee +23 -31
  12. data/assets/script/decko/type_editor.js.coffee +21 -0
  13. data/assets/script/decko/upload.js.coffee +12 -5
  14. data/assets/script/manifest.yml +15 -2
  15. data/set/abstract/00_script.rb +30 -31
  16. data/set/abstract/01_asset_script.rb +0 -16
  17. data/set/abstract/{script_asset_list.rb → script_group.rb} +12 -13
  18. data/set/all/head_javascript.rb +4 -5
  19. data/set/right/script.rb +1 -14
  20. data/set/type/local_script_folder_group.rb +2 -2
  21. data/set/type/local_script_manifest_group.rb +1 -1
  22. data/set/type_plus_right/mod/script.rb +56 -0
  23. data/set/type_plus_right/set/script.rb +7 -0
  24. data/vendor/jquery_file_upload/LICENSE.txt +11 -12
  25. data/vendor/jquery_file_upload/README.md +189 -72
  26. data/vendor/jquery_file_upload/SECURITY.md +227 -0
  27. data/vendor/jquery_file_upload/VULNERABILITIES.md +118 -0
  28. data/vendor/jquery_file_upload/cors/postmessage.html +68 -58
  29. data/vendor/jquery_file_upload/cors/result.html +12 -10
  30. data/vendor/jquery_file_upload/css/jquery.fileupload-ui.css +24 -13
  31. data/vendor/jquery_file_upload/css/jquery.fileupload.css +3 -4
  32. data/vendor/jquery_file_upload/docker-compose.yml +55 -0
  33. data/vendor/jquery_file_upload/index.html +332 -230
  34. data/vendor/jquery_file_upload/js/cors/jquery.postmessage-transport.js +109 -109
  35. data/vendor/jquery_file_upload/js/cors/jquery.xdr-transport.js +81 -73
  36. data/vendor/jquery_file_upload/js/demo.js +75 -0
  37. data/vendor/jquery_file_upload/js/jquery.fileupload-audio.js +82 -94
  38. data/vendor/jquery_file_upload/js/jquery.fileupload-image.js +321 -300
  39. data/vendor/jquery_file_upload/js/jquery.fileupload-process.js +138 -146
  40. data/vendor/jquery_file_upload/js/jquery.fileupload-ui.js +737 -692
  41. data/vendor/jquery_file_upload/js/jquery.fileupload-validate.js +91 -97
  42. data/vendor/jquery_file_upload/js/jquery.fileupload-video.js +82 -94
  43. data/vendor/jquery_file_upload/js/jquery.fileupload.js +1569 -1451
  44. data/vendor/jquery_file_upload/js/jquery.iframe-transport.js +208 -205
  45. data/vendor/jquery_file_upload/js/vendor/jquery.ui.widget.js +397 -340
  46. data/vendor/jquery_file_upload/package-lock.json +6853 -0
  47. data/vendor/jquery_file_upload/package.json +71 -10
  48. data/vendor/jquery_file_upload/server/gae-python/app.yaml +11 -10
  49. data/vendor/jquery_file_upload/server/php/Dockerfile +23 -17
  50. data/vendor/jquery_file_upload/server/php/UploadHandler.php +206 -137
  51. data/vendor/jquery_file_upload/server/php/php.ini +5 -0
  52. data/vendor/jquery_file_upload/test/index.html +36 -159
  53. data/vendor/jquery_file_upload/test/unit.js +989 -0
  54. data/vendor/jquery_file_upload/test/vendor/chai.js +10854 -0
  55. data/vendor/jquery_file_upload/test/vendor/mocha.css +325 -0
  56. data/vendor/jquery_file_upload/test/vendor/mocha.js +18178 -0
  57. data/vendor/jquery_file_upload/wdio/LICENSE.txt +20 -0
  58. data/vendor/jquery_file_upload/wdio/assets/black+white-3x2.jpg +0 -0
  59. data/vendor/jquery_file_upload/wdio/assets/black+white-60x40.gif +0 -0
  60. data/vendor/jquery_file_upload/wdio/conf/chrome.js +40 -0
  61. data/vendor/jquery_file_upload/wdio/conf/firefox.js +25 -0
  62. data/vendor/jquery_file_upload/wdio/hooks/index.js +36 -0
  63. data/vendor/jquery_file_upload/wdio/test/pages/file-upload.js +79 -0
  64. data/vendor/jquery_file_upload/wdio/test/specs/01-file-upload.js +25 -0
  65. data/vendor/jquery_file_upload/wdio/wdio.conf.js +4 -0
  66. metadata +34 -52
  67. data/file/mod_script_script_decko_machine_output/file.js +0 -2685
  68. data/file/mod_script_script_jquery_machine_output/file.js +0 -12924
  69. data/lib/javascript/script_html5shiv_printshiv.js +0 -1
  70. data/set/self/script_html5shiv_printshiv.rb +0 -11
  71. data/set/self/script_mods.rb +0 -1
  72. data/set/type/mod_script_assets.rb +0 -21
  73. data/vendor/jquery_file_upload/CONTRIBUTING.md +0 -15
  74. data/vendor/jquery_file_upload/angularjs.html +0 -211
  75. data/vendor/jquery_file_upload/basic-plus.html +0 -226
  76. data/vendor/jquery_file_upload/basic.html +0 -136
  77. data/vendor/jquery_file_upload/bower-version-update.js +0 -16
  78. data/vendor/jquery_file_upload/bower.json +0 -64
  79. data/vendor/jquery_file_upload/css/jquery-ui-demo-ie8.css +0 -21
  80. data/vendor/jquery_file_upload/css/jquery-ui-demo.css +0 -67
  81. data/vendor/jquery_file_upload/css/style.css +0 -15
  82. data/vendor/jquery_file_upload/jquery-ui.html +0 -252
  83. data/vendor/jquery_file_upload/js/app.js +0 -101
  84. data/vendor/jquery_file_upload/js/jquery.fileupload-angular.js +0 -437
  85. data/vendor/jquery_file_upload/js/jquery.fileupload-jquery-ui.js +0 -161
  86. data/vendor/jquery_file_upload/js/main.js +0 -75
  87. data/vendor/jquery_file_upload/server/gae-go/app/main.go +0 -361
  88. data/vendor/jquery_file_upload/server/gae-go/app.yaml +0 -12
  89. data/vendor/jquery_file_upload/server/gae-go/static/favicon.ico +0 -0
  90. data/vendor/jquery_file_upload/server/gae-go/static/robots.txt +0 -2
  91. data/vendor/jquery_file_upload/server/php/docker-compose.yml +0 -9
  92. data/vendor/jquery_file_upload/test/test.js +0 -1292
@@ -1,107 +1,224 @@
1
- # jQuery File Upload Plugin
2
-
3
- ## Demo
4
- [Demo File Upload](https://blueimp.github.io/jQuery-File-Upload/)
1
+ # jQuery File Upload
2
+
3
+ ## Contents
4
+
5
+ - [Description](#description)
6
+ - [Demo](#demo)
7
+ - [Features](#features)
8
+ - [Security](#security)
9
+ - [Setup](#setup)
10
+ - [Requirements](#requirements)
11
+ - [Mandatory requirements](#mandatory-requirements)
12
+ - [Optional requirements](#optional-requirements)
13
+ - [Cross-domain requirements](#cross-domain-requirements)
14
+ - [Browsers](#browsers)
15
+ - [Desktop browsers](#desktop-browsers)
16
+ - [Mobile browsers](#mobile-browsers)
17
+ - [Extended browser support information](#extended-browser-support-information)
18
+ - [Testing](#testing)
19
+ - [Support](#support)
20
+ - [License](#license)
5
21
 
6
22
  ## Description
7
- File Upload widget with multiple file selection, drag&drop support, progress bars, validation and preview images, audio and video for jQuery.
8
- Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.
9
23
 
10
- ## Setup
11
- * [How to setup the plugin on your website](https://github.com/blueimp/jQuery-File-Upload/wiki/Setup)
12
- * [How to use only the basic plugin (minimal setup guide).](https://github.com/blueimp/jQuery-File-Upload/wiki/Basic-plugin)
24
+ > File Upload widget with multiple file selection, drag&drop support, progress
25
+ > bars, validation and preview images, audio and video for jQuery.
26
+ > Supports cross-domain, chunked and resumable file uploads and client-side
27
+ > image resizing.
28
+ > Works with any server-side platform (PHP, Python, Ruby on Rails, Java,
29
+ > Node.js, Go etc.) that supports standard HTML form file uploads.
30
+
31
+ ## Demo
32
+
33
+ [Demo File Upload](https://blueimp.github.io/jQuery-File-Upload/)
13
34
 
14
35
  ## Features
15
- * **Multiple file upload:**
36
+
37
+ - **Multiple file upload:**
16
38
  Allows to select multiple files at once and upload them simultaneously.
17
- * **Drag & Drop support:**
18
- Allows to upload files by dragging them from your desktop or filemanager and dropping them on your browser window.
19
- * **Upload progress bar:**
20
- Shows a progress bar indicating the upload progress for individual files and for all uploads combined.
21
- * **Cancelable uploads:**
39
+ - **Drag & Drop support:**
40
+ Allows to upload files by dragging them from your desktop or file manager and
41
+ dropping them on your browser window.
42
+ - **Upload progress bar:**
43
+ Shows a progress bar indicating the upload progress for individual files and
44
+ for all uploads combined.
45
+ - **Cancelable uploads:**
22
46
  Individual file uploads can be canceled to stop the upload progress.
23
- * **Resumable uploads:**
47
+ - **Resumable uploads:**
24
48
  Aborted uploads can be resumed with browsers supporting the Blob API.
25
- * **Chunked uploads:**
26
- Large files can be uploaded in smaller chunks with browsers supporting the Blob API.
27
- * **Client-side image resizing:**
28
- Images can be automatically resized on client-side with browsers supporting the required JS APIs.
29
- * **Preview images, audio and video:**
30
- A preview of image, audio and video files can be displayed before uploading with browsers supporting the required APIs.
31
- * **No browser plugins (e.g. Adobe Flash) required:**
32
- The implementation is based on open standards like HTML5 and JavaScript and requires no additional browser plugins.
33
- * **Graceful fallback for legacy browsers:**
34
- Uploads files via XMLHttpRequests if supported and uses iframes as fallback for legacy browsers.
35
- * **HTML file upload form fallback:**
36
- Allows progressive enhancement by using a standard HTML file upload form as widget element.
37
- * **Cross-site file uploads:**
38
- Supports uploading files to a different domain with cross-site XMLHttpRequests or iframe redirects.
39
- * **Multiple plugin instances:**
49
+ - **Chunked uploads:**
50
+ Large files can be uploaded in smaller chunks with browsers supporting the
51
+ Blob API.
52
+ - **Client-side image resizing:**
53
+ Images can be automatically resized on client-side with browsers supporting
54
+ the required JS APIs.
55
+ - **Preview images, audio and video:**
56
+ A preview of image, audio and video files can be displayed before uploading
57
+ with browsers supporting the required APIs.
58
+ - **No browser plugins (e.g. Adobe Flash) required:**
59
+ The implementation is based on open standards like HTML5 and JavaScript and
60
+ requires no additional browser plugins.
61
+ - **Graceful fallback for legacy browsers:**
62
+ Uploads files via XMLHttpRequests if supported and uses iframes as fallback
63
+ for legacy browsers.
64
+ - **HTML file upload form fallback:**
65
+ Allows progressive enhancement by using a standard HTML file upload form as
66
+ widget element.
67
+ - **Cross-site file uploads:**
68
+ Supports uploading files to a different domain with cross-site XMLHttpRequests
69
+ or iframe redirects.
70
+ - **Multiple plugin instances:**
40
71
  Allows to use multiple plugin instances on the same webpage.
41
- * **Customizable and extensible:**
42
- Provides an API to set individual options and define callback methods for various upload events.
43
- * **Multipart and file contents stream uploads:**
44
- Files can be uploaded as standard "multipart/form-data" or file contents stream (HTTP PUT file upload).
45
- * **Compatible with any server-side application platform:**
46
- Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.
72
+ - **Customizable and extensible:**
73
+ Provides an API to set individual options and define callback methods for
74
+ various upload events.
75
+ - **Multipart and file contents stream uploads:**
76
+ Files can be uploaded as standard "multipart/form-data" or file contents
77
+ stream (HTTP PUT file upload).
78
+ - **Compatible with any server-side application platform:**
79
+ Works with any server-side platform (PHP, Python, Ruby on Rails, Java,
80
+ Node.js, Go etc.) that supports standard HTML form file uploads.
81
+
82
+ ## Security
83
+
84
+ ⚠️ Please read the [VULNERABILITIES](VULNERABILITIES.md) document for a list of
85
+ fixed vulnerabilities
86
+
87
+ Please also read the [SECURITY](SECURITY.md) document for instructions on how to
88
+ securely configure your Web server for file uploads.
89
+
90
+ ## Setup
91
+
92
+ jQuery File Upload can be installed via [NPM](https://www.npmjs.com/):
93
+
94
+ ```sh
95
+ npm install blueimp-file-upload
96
+ ```
97
+
98
+ This allows you to include [jquery.fileupload.js](js/jquery.fileupload.js) and
99
+ its extensions via `node_modules`, e.g:
100
+
101
+ ```html
102
+ <script src="node_modules/blueimp-file-upload/js/jquery.fileupload.js"></script>
103
+ ```
104
+
105
+ The widget can then be initialized on a file upload form the following way:
106
+
107
+ ```js
108
+ $('#fileupload').fileupload();
109
+ ```
110
+
111
+ For further information, please refer to the following guides:
112
+
113
+ - [Main documentation page](https://github.com/blueimp/jQuery-File-Upload/wiki)
114
+ - [List of all available Options](https://github.com/blueimp/jQuery-File-Upload/wiki/Options)
115
+ - [The plugin API](https://github.com/blueimp/jQuery-File-Upload/wiki/API)
116
+ - [How to setup the plugin on your website](https://github.com/blueimp/jQuery-File-Upload/wiki/Setup)
117
+ - [How to use only the basic plugin.](https://github.com/blueimp/jQuery-File-Upload/wiki/Basic-plugin)
47
118
 
48
119
  ## Requirements
49
120
 
50
121
  ### Mandatory requirements
51
- * [jQuery](https://jquery.com/) v. 1.6+
52
- * [jQuery UI widget factory](https://api.jqueryui.com/jQuery.widget/) v. 1.9+ (included): Required for the basic File Upload plugin, but very lightweight without any other dependencies from the jQuery UI suite.
53
- * [jQuery Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js) (included): Required for [browsers without XHR file upload support](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).
122
+
123
+ - [jQuery](https://jquery.com/) v1.7+
124
+ - [jQuery UI widget factory](https://api.jqueryui.com/jQuery.widget/) v1.9+
125
+ (included): Required for the basic File Upload plugin, but very lightweight
126
+ without any other dependencies from the jQuery UI suite.
127
+ - [jQuery Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js)
128
+ (included): Required for
129
+ [browsers without XHR file upload support](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).
54
130
 
55
131
  ### Optional requirements
56
- * [JavaScript Templates engine](https://github.com/blueimp/JavaScript-Templates) v. 2.5.4+: Used to render the selected and uploaded files for the Basic Plus UI and jQuery UI versions.
57
- * [JavaScript Load Image library](https://github.com/blueimp/JavaScript-Load-Image) v. 1.13.0+: Required for the image previews and resizing functionality.
58
- * [JavaScript Canvas to Blob polyfill](https://github.com/blueimp/JavaScript-Canvas-to-Blob) v. 2.1.1+:Required for the image previews and resizing functionality.
59
- * [blueimp Gallery](https://github.com/blueimp/Gallery) v. 2.15.1+: Used to display the uploaded images in a lightbox.
60
- * [Bootstrap](http://getbootstrap.com/) v. 3.2.0+
61
- * [Glyphicons](http://glyphicons.com/)
62
132
 
63
- The user interface of all versions, except the jQuery UI version, is built with [Bootstrap](http://getbootstrap.com/) and icons from [Glyphicons](http://glyphicons.com/).
133
+ - [JavaScript Templates engine](https://github.com/blueimp/JavaScript-Templates)
134
+ v3+: Used to render the selected and uploaded files.
135
+ - [JavaScript Load Image library](https://github.com/blueimp/JavaScript-Load-Image)
136
+ v2+: Required for the image previews and resizing functionality.
137
+ - [JavaScript Canvas to Blob polyfill](https://github.com/blueimp/JavaScript-Canvas-to-Blob)
138
+ v3+:Required for the resizing functionality.
139
+ - [blueimp Gallery](https://github.com/blueimp/Gallery) v2+: Used to display the
140
+ uploaded images in a lightbox.
141
+ - [Bootstrap](https://getbootstrap.com/) v3+: Used for the demo design.
142
+ - [Glyphicons](https://glyphicons.com/) Icon set used by Bootstrap.
64
143
 
65
144
  ### Cross-domain requirements
66
- [Cross-domain File Uploads](https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads) using the [Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js) require a redirect back to the origin server to retrieve the upload results. The [example implementation](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/main.js) makes use of [result.html](https://github.com/blueimp/jQuery-File-Upload/blob/master/cors/result.html) as a static redirect page for the origin server.
67
-
68
- The repository also includes the [jQuery XDomainRequest Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/cors/jquery.xdr-transport.js), which enables limited cross-domain AJAX requests in Microsoft Internet Explorer 8 and 9 (IE 10 supports cross-domain XHR requests).
69
- The XDomainRequest object allows GET and POST requests only and doesn't support file uploads. It is used on the [Demo](https://blueimp.github.io/jQuery-File-Upload/) to delete uploaded files from the cross-domain demo file upload service.
70
145
 
71
- ### Custom Backends
72
-
73
- You can add support for various backends by adhering to the specification [outlined here](https://github.com/blueimp/jQuery-File-Upload/wiki/JSON-Response).
146
+ [Cross-domain File Uploads](https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads)
147
+ using the
148
+ [Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js)
149
+ require a redirect back to the origin server to retrieve the upload results. The
150
+ [example implementation](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/main.js)
151
+ makes use of
152
+ [result.html](https://github.com/blueimp/jQuery-File-Upload/blob/master/cors/result.html)
153
+ as a static redirect page for the origin server.
154
+
155
+ The repository also includes the
156
+ [jQuery XDomainRequest Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/cors/jquery.xdr-transport.js),
157
+ which enables limited cross-domain AJAX requests in Microsoft Internet Explorer
158
+ 8 and 9 (IE 10 supports cross-domain XHR requests).
159
+ The XDomainRequest object allows GET and POST requests only and doesn't support
160
+ file uploads. It is used on the
161
+ [Demo](https://blueimp.github.io/jQuery-File-Upload/) to delete uploaded files
162
+ from the cross-domain demo file upload service.
74
163
 
75
164
  ## Browsers
76
165
 
77
166
  ### Desktop browsers
78
- The File Upload plugin is regularly tested with the latest browser versions and supports the following minimal versions:
79
167
 
80
- * Google Chrome
81
- * Apple Safari 4.0+
82
- * Mozilla Firefox 3.0+
83
- * Opera 11.0+
84
- * Microsoft Internet Explorer 6.0+
168
+ The File Upload plugin is regularly tested with the latest browser versions and
169
+ supports the following minimal versions:
170
+
171
+ - Google Chrome
172
+ - Apple Safari 4.0+
173
+ - Mozilla Firefox 3.0+
174
+ - Opera 11.0+
175
+ - Microsoft Internet Explorer 6.0+
85
176
 
86
177
  ### Mobile browsers
87
- The File Upload plugin has been tested with and supports the following mobile browsers:
88
178
 
89
- * Apple Safari on iOS 6.0+
90
- * Google Chrome on iOS 6.0+
91
- * Google Chrome on Android 4.0+
92
- * Default Browser on Android 2.3+
93
- * Opera Mobile 12.0+
179
+ The File Upload plugin has been tested with and supports the following mobile
180
+ browsers:
94
181
 
95
- ### Supported features
96
- For a detailed overview of the features supported by each browser version, please have a look at the [Extended browser support information](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).
182
+ - Apple Safari on iOS 6.0+
183
+ - Google Chrome on iOS 6.0+
184
+ - Google Chrome on Android 4.0+
185
+ - Default Browser on Android 2.3+
186
+ - Opera Mobile 12.0+
97
187
 
98
- ## Contributing
99
- **Bug fixes** and **new features** can be proposed using [pull requests](https://github.com/blueimp/jQuery-File-Upload/pulls).
100
- Please read the [contribution guidelines](https://github.com/blueimp/jQuery-File-Upload/blob/master/CONTRIBUTING.md) before submitting a pull request.
188
+ ### Extended browser support information
189
+
190
+ For a detailed overview of the features supported by each browser version and
191
+ known operating system / browser bugs, please have a look at the
192
+ [Extended browser support information](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).
193
+
194
+ ## Testing
195
+
196
+ The project comes with three sets of tests:
197
+
198
+ 1. Code linting using [ESLint](https://eslint.org/).
199
+ 2. Unit tests using [Mocha](https://mochajs.org/).
200
+ 3. End-to-end tests using [blueimp/wdio](https://github.com/blueimp/wdio).
201
+
202
+ To run the tests, follow these steps:
203
+
204
+ 1. Start [Docker](https://docs.docker.com/).
205
+ 2. Install development dependencies:
206
+ ```sh
207
+ npm install
208
+ ```
209
+ 3. Run the tests:
210
+ ```sh
211
+ npm test
212
+ ```
101
213
 
102
214
  ## Support
215
+
103
216
  This project is actively maintained, but there is no official support channel.
104
- If you have a question that another developer might help you with, please post to [Stack Overflow](http://stackoverflow.com/questions/tagged/blueimp+jquery+file-upload) and tag your question with `blueimp jquery file upload`.
217
+ If you have a question that another developer might help you with, please post
218
+ to
219
+ [Stack Overflow](https://stackoverflow.com/questions/tagged/blueimp+jquery+file-upload)
220
+ and tag your question with `blueimp jquery file upload`.
105
221
 
106
222
  ## License
223
+
107
224
  Released under the [MIT license](https://opensource.org/licenses/MIT).
@@ -0,0 +1,227 @@
1
+ # File Upload Security
2
+
3
+ ## Contents
4
+
5
+ - [Introduction](#introduction)
6
+ - [Purpose of this project](#purpose-of-this-project)
7
+ - [Mitigations against file upload risks](#mitigations-against-file-upload-risks)
8
+ - [Prevent code execution on the server](#prevent-code-execution-on-the-server)
9
+ - [Prevent code execution in the browser](#prevent-code-execution-in-the-browser)
10
+ - [Prevent distribution of malware](#prevent-distribution-of-malware)
11
+ - [Secure file upload serving configurations](#secure-file-upload-serving-configurations)
12
+ - [Apache config](#apache-config)
13
+ - [NGINX config](#nginx-config)
14
+ - [Secure image processing configurations](#secure-image-processing-configurations)
15
+ - [ImageMagick config](#imagemagick-config)
16
+
17
+ ## Introduction
18
+
19
+ For an in-depth understanding of the potential security risks of providing file
20
+ uploads and possible mitigations, please refer to the
21
+ [OWASP - Unrestricted File Upload](https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload)
22
+ documentation.
23
+
24
+ To securely setup the project to serve uploaded files, please refer to the
25
+ sample
26
+ [Secure file upload serving configurations](#secure-file-upload-serving-configurations).
27
+
28
+ To mitigate potential vulnerabilities in image processing libraries, please
29
+ refer to the
30
+ [Secure image processing configurations](#secure-image-processing-configurations).
31
+
32
+ By default, all sample upload handlers allow only upload of image files, which
33
+ mitigates some attack vectors, but should not be relied on as the only
34
+ protection.
35
+
36
+ Please also have a look at the
37
+ [list of fixed vulnerabilities](VULNERABILITIES.md) in jQuery File Upload, which
38
+ relates mostly to the sample server-side upload handlers and how they have been
39
+ configured.
40
+
41
+ ## Purpose of this project
42
+
43
+ Please note that this project is not a complete file management product, but
44
+ foremost a client-side file upload library for [jQuery](https://jquery.com/).
45
+ The server-side sample upload handlers are just examples to demonstrate the
46
+ client-side file upload functionality.
47
+
48
+ To make this very clear, there is **no user authentication** by default:
49
+
50
+ - **everyone can upload files**
51
+ - **everyone can delete uploaded files**
52
+
53
+ In some cases this can be acceptable, but for most projects you will want to
54
+ extend the sample upload handlers to integrate user authentication, or implement
55
+ your own.
56
+
57
+ It is also up to you to configure your web server to securely serve the uploaded
58
+ files, e.g. using the
59
+ [sample server configurations](#secure-file-upload-serving-configurations).
60
+
61
+ ## Mitigations against file upload risks
62
+
63
+ ### Prevent code execution on the server
64
+
65
+ To prevent execution of scripts or binaries on server-side, the upload directory
66
+ must be configured to not execute files in the upload directory (e.g.
67
+ `server/php/files` as the default for the PHP upload handler) and only treat
68
+ uploaded files as static content.
69
+
70
+ The recommended way to do this is to configure the upload directory path to
71
+ point outside of the web application root.
72
+ Then the web server can be configured to serve files from the upload directory
73
+ with their default static files handler only.
74
+
75
+ Limiting file uploads to a whitelist of safe file types (e.g. image files) also
76
+ mitigates this issue, but should not be the only protection.
77
+
78
+ ### Prevent code execution in the browser
79
+
80
+ To prevent execution of scripts on client-side, the following headers must be
81
+ sent when delivering generic uploaded files to the client:
82
+
83
+ ```
84
+ Content-Type: application/octet-stream
85
+ X-Content-Type-Options: nosniff
86
+ ```
87
+
88
+ The `Content-Type: application/octet-stream` header instructs browsers to
89
+ display a download dialog instead of parsing it and possibly executing script
90
+ content e.g. in HTML files.
91
+
92
+ The `X-Content-Type-Options: nosniff` header prevents browsers to try to detect
93
+ the file mime type despite the given content-type header.
94
+
95
+ For known safe files, the content-type header can be adjusted using a
96
+ **whitelist**, e.g. sending `Content-Type: image/png` for PNG files.
97
+
98
+ ### Prevent distribution of malware
99
+
100
+ To prevent attackers from uploading and distributing malware (e.g. computer
101
+ viruses), it is recommended to limit file uploads only to a whitelist of safe
102
+ file types.
103
+
104
+ Please note that the detection of file types in the sample file upload handlers
105
+ is based on the file extension and not the actual file content. This makes it
106
+ still possible for attackers to upload malware by giving their files an image
107
+ file extension, but should prevent automatic execution on client computers when
108
+ opening those files.
109
+
110
+ It does not protect at all from exploiting vulnerabilities in image display
111
+ programs, nor from users renaming file extensions to inadvertently execute the
112
+ contained malicious code.
113
+
114
+ ## Secure file upload serving configurations
115
+
116
+ The following configurations serve uploaded files as static files with the
117
+ proper headers as
118
+ [mitigation against file upload risks](#mitigations-against-file-upload-risks).
119
+ Please do not simply copy&paste these configurations, but make sure you
120
+ understand what they are doing and that you have implemented them correctly.
121
+
122
+ > Always test your own setup and make sure that it is secure!
123
+
124
+ e.g. try uploading PHP scripts (as "example.php", "example.php.png" and
125
+ "example.png") to see if they get executed by your web server, e.g. the content
126
+ of the following sample:
127
+
128
+ ```php
129
+ GIF89ad <?php echo mime_content_type(__FILE__); phpinfo();
130
+ ```
131
+
132
+ ### Apache config
133
+
134
+ Add the following directive to the Apache config (e.g.
135
+ /etc/apache2/apache2.conf), replacing the directory path with the absolute path
136
+ to the upload directory:
137
+
138
+ ```ApacheConf
139
+ <Directory "/path/to/project/server/php/files">
140
+ # Some of the directives require the Apache Headers module. If it is not
141
+ # already enabled, please execute the following command and reload Apache:
142
+ # sudo a2enmod headers
143
+ #
144
+ # Please note that the order of directives across configuration files matters,
145
+ # see also:
146
+ # https://httpd.apache.org/docs/current/sections.html#merging
147
+
148
+ # The following directive matches all files and forces them to be handled as
149
+ # static content, which prevents the server from parsing and executing files
150
+ # that are associated with a dynamic runtime, e.g. PHP files.
151
+ # It also forces their Content-Type header to "application/octet-stream" and
152
+ # adds a "Content-Disposition: attachment" header to force a download dialog,
153
+ # which prevents browsers from interpreting files in the context of the
154
+ # web server, e.g. HTML files containing JavaScript.
155
+ # Lastly it also prevents browsers from MIME-sniffing the Content-Type,
156
+ # preventing them from interpreting a file as a different Content-Type than
157
+ # the one sent by the webserver.
158
+ <FilesMatch ".*">
159
+ SetHandler default-handler
160
+ ForceType application/octet-stream
161
+ Header set Content-Disposition attachment
162
+ Header set X-Content-Type-Options nosniff
163
+ </FilesMatch>
164
+
165
+ # The following directive matches known image files and unsets the forced
166
+ # Content-Type so they can be served with their original mime type.
167
+ # It also unsets the Content-Disposition header to allow displaying them
168
+ # inline in the browser.
169
+ <FilesMatch ".+\.(?i:(gif|jpe?g|png))$">
170
+ ForceType none
171
+ Header unset Content-Disposition
172
+ </FilesMatch>
173
+ </Directory>
174
+ ```
175
+
176
+ ### NGINX config
177
+
178
+ Add the following directive to the NGINX config, replacing the directory path
179
+ with the absolute path to the upload directory:
180
+
181
+ ```Nginx
182
+ location ^~ /path/to/project/server/php/files {
183
+ root html;
184
+ default_type application/octet-stream;
185
+ types {
186
+ image/gif gif;
187
+ image/jpeg jpg;
188
+ image/png png;
189
+ }
190
+ add_header X-Content-Type-Options 'nosniff';
191
+ if ($request_filename ~ /(((?!\.(jpg)|(png)|(gif)$)[^/])+$)) {
192
+ add_header Content-Disposition 'attachment; filename="$1"';
193
+ # Add X-Content-Type-Options again, as using add_header in a new context
194
+ # dismisses all previous add_header calls:
195
+ add_header X-Content-Type-Options 'nosniff';
196
+ }
197
+ }
198
+ ```
199
+
200
+ ## Secure image processing configurations
201
+
202
+ The following configuration mitigates
203
+ [potential image processing vulnerabilities with ImageMagick](VULNERABILITIES.md#potential-vulnerabilities-with-php-imagemagick)
204
+ by limiting the attack vectors to a small subset of image types
205
+ (`GIF/JPEG/PNG`).
206
+
207
+ Please also consider using alternative, safer image processing libraries like
208
+ [libvips](https://github.com/libvips/libvips) or
209
+ [imageflow](https://github.com/imazen/imageflow).
210
+
211
+ ## ImageMagick config
212
+
213
+ It is recommended to disable all non-required ImageMagick coders via
214
+ [policy.xml](https://wiki.debian.org/imagemagick/security).
215
+ To do so, locate the ImageMagick `policy.xml` configuration file and add the
216
+ following policies:
217
+
218
+ ```xml
219
+ <?xml version="1.0" encoding="UTF-8"?>
220
+ <!-- ... -->
221
+ <policymap>
222
+ <!-- ... -->
223
+ <policy domain="delegate" rights="none" pattern="*" />
224
+ <policy domain="coder" rights="none" pattern="*" />
225
+ <policy domain="coder" rights="read | write" pattern="{GIF,JPEG,JPG,PNG}" />
226
+ </policymap>
227
+ ```
@@ -0,0 +1,118 @@
1
+ # List of fixed vulnerabilities
2
+
3
+ ## Contents
4
+
5
+ - [Potential vulnerabilities with PHP+ImageMagick](#potential-vulnerabilities-with-phpimagemagick)
6
+ - [Remote code execution vulnerability in the PHP component](#remote-code-execution-vulnerability-in-the-php-component)
7
+ - [Open redirect vulnerability in the GAE components](#open-redirect-vulnerability-in-the-gae-components)
8
+ - [Cross-site scripting vulnerability in the Iframe Transport](#cross-site-scripting-vulnerability-in-the-iframe-transport)
9
+
10
+ ## Potential vulnerabilities with PHP+ImageMagick
11
+
12
+ > Mitigated: 2018-10-25 (GMT)
13
+
14
+ The sample [PHP upload handler](server/php/UploadHandler.php) before
15
+ [v9.25.1](https://github.com/blueimp/jQuery-File-Upload/releases/tag/v9.25.1)
16
+ did not validate file signatures before invoking
17
+ [ImageMagick](https://www.imagemagick.org/) (via
18
+ [Imagick](https://php.net/manual/en/book.imagick.php)).
19
+ Verifying those
20
+ [magic bytes](https://en.wikipedia.org/wiki/List_of_file_signatures) mitigates
21
+ potential vulnerabilities when handling input files other than `GIF/JPEG/PNG`.
22
+
23
+ Please also configure ImageMagick to only enable the coders required for
24
+ `GIF/JPEG/PNG` processing, e.g. with the sample
25
+ [ImageMagick config](SECURITY.md#imagemagick-config).
26
+
27
+ **Further information:**
28
+
29
+ - Commit containing the mitigation:
30
+ [fe44d34](https://github.com/blueimp/jQuery-File-Upload/commit/fe44d34be43be32c6b8d507932f318dababb25dd)
31
+ - [ImageTragick](https://imagetragick.com/)
32
+ - [CERT Vulnerability Note VU#332928](https://www.kb.cert.org/vuls/id/332928)
33
+ - [ImageMagick CVE entries](https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=imagemagick)
34
+
35
+ ## Remote code execution vulnerability in the PHP component
36
+
37
+ > Fixed: 2018-10-23 (GMT)
38
+
39
+ The sample [PHP upload handler](server/php/UploadHandler.php) before
40
+ [v9.24.1](https://github.com/blueimp/jQuery-File-Upload/releases/tag/v9.24.1)
41
+ allowed to upload all file types by default.
42
+ This opens up a remote code execution vulnerability, unless the server is
43
+ configured to not execute (PHP) files in the upload directory
44
+ (`server/php/files`).
45
+
46
+ The provided [.htaccess](server/php/files/.htaccess) file includes instructions
47
+ for Apache to disable script execution, however
48
+ [.htaccess support](https://httpd.apache.org/docs/current/howto/htaccess.html)
49
+ is disabled by default since Apache `v2.3.9` via
50
+ [AllowOverride Directive](https://httpd.apache.org/docs/current/mod/core.html#allowoverride).
51
+
52
+ **You are affected if you:**
53
+
54
+ 1. A) Uploaded jQuery File Upload < `v9.24.1` on a Webserver that executes files
55
+ with `.php` as part of the file extension (e.g. "example.php.png"), e.g.
56
+ Apache with `mod_php` enabled and the following directive (_not a recommended
57
+ configuration_):
58
+ ```ApacheConf
59
+ AddHandler php5-script .php
60
+ ```
61
+ B) Uploaded jQuery File Upload < `v9.22.1` on a Webserver that executes files
62
+ with the file extension `.php`, e.g. Apache with `mod_php` enabled and the
63
+ following directive:
64
+ ```ApacheConf
65
+ <FilesMatch \.php$>
66
+ SetHandler application/x-httpd-php
67
+ </FilesMatch>
68
+ ```
69
+ 2. Did not actively configure your Webserver to not execute files in the upload
70
+ directory (`server/php/files`).
71
+ 3. Are running Apache `v2.3.9+` with the default `AllowOverride` Directive set
72
+ to `None` or another Webserver with no `.htaccess` support.
73
+
74
+ **How to fix it:**
75
+
76
+ 1. Upgrade to the latest version of jQuery File Upload.
77
+ 2. Configure your Webserver to not execute files in the upload directory, e.g.
78
+ with the [sample Apache configuration](SECURITY.md#apache-config)
79
+
80
+ **Further information:**
81
+
82
+ - Commits containing the security fix:
83
+ [aeb47e5](https://github.com/blueimp/jQuery-File-Upload/commit/aeb47e51c67df8a504b7726595576c1c66b5dc2f),
84
+ [ad4aefd](https://github.com/blueimp/jQuery-File-Upload/commit/ad4aefd96e4056deab6fea2690f0d8cf56bb2d7d)
85
+ - [Full disclosure post on Hacker News](https://news.ycombinator.com/item?id=18267309).
86
+ - [CVE-2018-9206](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-9206)
87
+ - [OWASP - Unrestricted File Upload](https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload)
88
+
89
+ ## Open redirect vulnerability in the GAE components
90
+
91
+ > Fixed: 2015-06-12 (GMT)
92
+
93
+ The sample Google App Engine upload handlers before
94
+ v[9.10.1](https://github.com/blueimp/jQuery-File-Upload/releases/tag/9.10.1)
95
+ accepted any URL as redirect target, making it possible to use the Webserver's
96
+ domain for phishing attacks.
97
+
98
+ **Further information:**
99
+
100
+ - Commit containing the security fix:
101
+ [f74d2a8](https://github.com/blueimp/jQuery-File-Upload/commit/f74d2a8c3e3b1e8e336678d2899facd5bcdb589f)
102
+ - [OWASP - Unvalidated Redirects and Forwards Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html)
103
+
104
+ ## Cross-site scripting vulnerability in the Iframe Transport
105
+
106
+ > Fixed: 2012-08-09 (GMT)
107
+
108
+ The [redirect page](cors/result.html) for the
109
+ [Iframe Transport](js/jquery.iframe-transport.js) before commit
110
+ [4175032](https://github.com/blueimp/jQuery-File-Upload/commit/41750323a464e848856dc4c5c940663498beb74a)
111
+ (_fixed in all tagged releases_) allowed executing arbitrary JavaScript in the
112
+ context of the Webserver.
113
+
114
+ **Further information:**
115
+
116
+ - Commit containing the security fix:
117
+ [4175032](https://github.com/blueimp/jQuery-File-Upload/commit/41750323a464e848856dc4c5c940663498beb74a)
118
+ - [OWASP - Cross-site Scripting (XSS)](https://owasp.org/www-community/attacks/xss/)