Fixed #11030: Reverted a change that assumed the file system encoding was utf8, and changed a test to demonstrate how that assumption corrupted uploaded non-ASCII file names on systems that don't use utf8 as their file system encoding (Windows for one, specifically). Thanks for the report to vrehak.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12661 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Karen Tracey 2010-03-02 21:58:49 +00:00
parent 125c748cf6
commit 600aa6679e
2 changed files with 8 additions and 7 deletions

View File

@ -7,7 +7,7 @@ from django.conf import settings
from django.core.exceptions import ImproperlyConfigured, SuspiciousOperation from django.core.exceptions import ImproperlyConfigured, SuspiciousOperation
from django.core.files import locks, File from django.core.files import locks, File
from django.core.files.move import file_move_safe from django.core.files.move import file_move_safe
from django.utils.encoding import force_unicode, smart_str from django.utils.encoding import force_unicode
from django.utils.functional import LazyObject from django.utils.functional import LazyObject
from django.utils.importlib import import_module from django.utils.importlib import import_module
from django.utils.text import get_valid_filename from django.utils.text import get_valid_filename
@ -210,7 +210,7 @@ class FileSystemStorage(Storage):
path = safe_join(self.location, name) path = safe_join(self.location, name)
except ValueError: except ValueError:
raise SuspiciousOperation("Attempted access to '%s' denied." % name) raise SuspiciousOperation("Attempted access to '%s' denied." % name)
return smart_str(os.path.normpath(path)) return os.path.normpath(path)
def size(self, name): def size(self, name):
return os.path.getsize(self.path(name)) return os.path.getsize(self.path(name))

View File

@ -2,7 +2,7 @@ import os
from django.core.files.uploadedfile import UploadedFile from django.core.files.uploadedfile import UploadedFile
from django.http import HttpResponse, HttpResponseServerError from django.http import HttpResponse, HttpResponseServerError
from django.utils import simplejson from django.utils import simplejson
from models import FileModel from models import FileModel, UPLOAD_TO
from uploadhandler import QuotaUploadHandler, ErroringUploadHandler from uploadhandler import QuotaUploadHandler, ErroringUploadHandler
from django.utils.hashcompat import sha_constructor from django.utils.hashcompat import sha_constructor
from tests import UNICODE_FILENAME from tests import UNICODE_FILENAME
@ -18,7 +18,7 @@ def file_upload_view(request):
# If a file is posted, the dummy client should only post the file name, # If a file is posted, the dummy client should only post the file name,
# not the full path. # not the full path.
if os.path.dirname(form_data['file_field'].name) != '': if os.path.dirname(form_data['file_field'].name) != '':
return HttpResponseServerError() return HttpResponseServerError()
return HttpResponse('') return HttpResponse('')
else: else:
return HttpResponseServerError() return HttpResponseServerError()
@ -62,7 +62,8 @@ def file_upload_unicode_name(request):
# through file save. # through file save.
uni_named_file = request.FILES['file_unicode'] uni_named_file = request.FILES['file_unicode']
obj = FileModel.objects.create(testfile=uni_named_file) obj = FileModel.objects.create(testfile=uni_named_file)
if not obj.testfile.name.endswith(uni_named_file.name): full_name = u'%s/%s' % (UPLOAD_TO, uni_named_file.name)
if not os.path.exists(full_name):
response = HttpResponseServerError() response = HttpResponseServerError()
# Cleanup the object with its exotic file name immediately. # Cleanup the object with its exotic file name immediately.
@ -82,14 +83,14 @@ def file_upload_echo(request):
""" """
r = dict([(k, f.name) for k, f in request.FILES.items()]) r = dict([(k, f.name) for k, f in request.FILES.items()])
return HttpResponse(simplejson.dumps(r)) return HttpResponse(simplejson.dumps(r))
def file_upload_quota(request): def file_upload_quota(request):
""" """
Dynamically add in an upload handler. Dynamically add in an upload handler.
""" """
request.upload_handlers.insert(0, QuotaUploadHandler()) request.upload_handlers.insert(0, QuotaUploadHandler())
return file_upload_echo(request) return file_upload_echo(request)
def file_upload_quota_broken(request): def file_upload_quota_broken(request):
""" """
You can't change handlers after reading FILES; this view shouldn't work. You can't change handlers after reading FILES; this view shouldn't work.