Fix handling of unicode filename downloads
Add photo attribute dot_extension Fix bug using unnormalized offset in calculations
This commit is contained in:
		
							parent
							
								
									0d0431edff
								
							
						
					
					
						commit
						a305350f5f
					
				
					 5 changed files with 24 additions and 16 deletions
				
			
		
							
								
								
									
										15
									
								
								etiquette.py
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								etiquette.py
									
									
									
									
									
								
							|  | @ -4,6 +4,7 @@ import json | |||
| import mimetypes | ||||
| import os | ||||
| import random | ||||
| import urllib.parse | ||||
| import warnings | ||||
| import zipstream | ||||
| 
 | ||||
|  | @ -303,10 +304,10 @@ def get_album_zip(albumid): | |||
|         download_as = '%s - %s.zip' % (album.id, album.title) | ||||
|     else: | ||||
|         download_as = '%s.zip' % album.id | ||||
|     download_as = download_as.replace('"', '\\"') | ||||
|     download_as = urllib.parse.quote(download_as) | ||||
|     outgoing_headers = { | ||||
|         'Content-Type': 'application/octet-stream', | ||||
|         'Content-Disposition': 'attachment; filename=%s' % download_as, | ||||
|         'Content-Disposition': 'attachment; filename*=UTF-8\'\'%s' % download_as, | ||||
| 
 | ||||
|     } | ||||
|     return flask.Response(streamed_zip, headers=outgoing_headers) | ||||
|  | @ -354,13 +355,11 @@ def get_file(photoid): | |||
|         if use_original_filename: | ||||
|             download_as = photo.basename | ||||
|         else: | ||||
|             download_as = photo.id | ||||
|             if photo.extension: | ||||
|                 download_as += photo.extension | ||||
|             download_as = photo.id + photo.dot_extension | ||||
| 
 | ||||
|         download_as = download_as.replace('"', '\\"') | ||||
|         download_as =  urllib.parse.quote(download_as) | ||||
|         response = flask.make_response(send_file(photo.real_filepath)) | ||||
|         response.headers['Content-Disposition'] = 'attachment; filename="%s"' % download_as | ||||
|         response.headers['Content-Disposition'] = 'attachment; filename*=UTF-8\'\'%s' % download_as | ||||
|         return response | ||||
|     else: | ||||
|         return send_file(photo.real_filepath) | ||||
|  | @ -485,7 +484,7 @@ def get_search_core(): | |||
|     total_tags = sorted(total_tags) | ||||
| 
 | ||||
|     # PREV-NEXT PAGE URLS | ||||
|     offset = offset or 0 | ||||
|     offset = search_kwargs['offset'] or 0 | ||||
|     original_params = request.args.to_dict() | ||||
|     if len(photos) == limit: | ||||
|         next_params = helpers.edit_params(original_params, {'offset': offset + limit}) | ||||
|  |  | |||
|  | @ -191,9 +191,6 @@ def is_xor(*args): | |||
|     ''' | ||||
|     return [bool(a) for a in args].count(True) == 1 | ||||
| 
 | ||||
| def normalize_extension(extension): | ||||
|     pass | ||||
| 
 | ||||
| def normalize_filepath(filepath, allowed=''): | ||||
|     ''' | ||||
|     Remove some bad characters. | ||||
|  |  | |||
|  | @ -292,6 +292,11 @@ class Photo(ObjectBase): | |||
|         self.extension = row_tuple['extension'] | ||||
|         self.tagged_at = row_tuple['tagged_at'] | ||||
| 
 | ||||
|         if self.extension == '': | ||||
|             self.dot_extension = '' | ||||
|         else: | ||||
|             self.dot_extension = '.' + self.extension | ||||
| 
 | ||||
|         self.area = row_tuple['area'] | ||||
|         self.bytes = row_tuple['bytes'] | ||||
|         self.duration = row_tuple['duration'] | ||||
|  |  | |||
|  | @ -567,6 +567,7 @@ class PDBPhotoMixin: | |||
| 
 | ||||
|         extension_not: | ||||
|             A string or list of strings of unacceptable file extensions. | ||||
|             Including '*' will forbid all extensions | ||||
| 
 | ||||
|         filename: | ||||
|             A string or list of strings which will be split into words. The file's basename | ||||
|  | @ -722,7 +723,14 @@ class PDBPhotoMixin: | |||
|                 #print('Failed extension') | ||||
|                 continue | ||||
| 
 | ||||
|             if extension_not and photo.extension in extension_not: | ||||
|             ext_fail = ( | ||||
|                 extension_not and | ||||
|                 ( | ||||
|                     ('*' in extension_not and photo.extension) or | ||||
|                     (photo.extension in extension_not) | ||||
|                 ) | ||||
|             ) | ||||
|             if (ext_fail): | ||||
|                 #print('Failed extension_not') | ||||
|                 continue | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ | |||
|     <meta charset="UTF-8"> | ||||
|     <link rel="stylesheet" href="/static/common.css"> | ||||
|     <script src="/static/common.js"></script> | ||||
|     {% set filename = photo.id + "." + photo.extension %} | ||||
|     {% set filename = photo.id + photo.dot_extension %} | ||||
|     {% set link = "/file/" + filename %} | ||||
| 
 | ||||
| <style> | ||||
|  | @ -122,9 +122,8 @@ | |||
|         {% if photo.duration %} | ||||
|             <li>Duration: {{photo.duration_string()}}</li> | ||||
|         {% endif %} | ||||
|         {% set extension= "." + photo.extension if photo.extension != "" else "" %} | ||||
|             <li><a href="/file/{{photo.id}}{{extension}}?download=1">Download as {{photo.id}}.{{photo.extension}}</a></li> | ||||
|             <li><a href="/file/{{photo.id}}{{extension}}?download=1&original_filename=1">Download as "{{photo.basename}}"</a></li> | ||||
|             <li><a href="/file/{{photo.id}}{{photo.dot_extension}}?download=1">Download as {{photo.id}}.{{photo.extension}}</a></li> | ||||
|             <li><a href="/file/{{photo.id}}{{photo.dot_extension}}?download=1&original_filename=1">Download as "{{photo.basename}}"</a></li> | ||||
|         </ul> | ||||
| 
 | ||||
|         <!-- CONTAINING ALBUMS --> | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue