--
Ticket URL: <https://code.djangoproject.com/ticket/18150>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* cc: nuno@… (added)
* needs_better_patch: => 0
* needs_docs: => 0
* needs_tests: => 0
* stage: Unreviewed => Accepted
--
Ticket URL: <https://code.djangoproject.com/ticket/18150#comment:1>
* cc: supersteve9219 (added)
* owner: nobody => supersteve9219
* status: new => assigned
--
Ticket URL: <https://code.djangoproject.com/ticket/18150#comment:2>
* has_patch: 0 => 1
Comment:
I added a patch.
Given IE_sanitize is only used with files uploaded from Internet Explorer
7 and earlier which represents less than 3% of the total browser share, I
don't think it is no longer necessary to use this method. Especially given
that using IE_sanitize causes issues with all unix users.
Using IE_sanitize only on files starting with something like {{{X:\}}}
does not fix the issue since {{{:}}} is still a valid unix filename char.
--
Ticket URL: <https://code.djangoproject.com/ticket/18150#comment:3>
Comment (by supersteve9219):
I added an updated patch. The file name was also being sanitized in
django/core/files/uploadedfile.py.
I added an if statement that checks if the last character in a file name
is "\", if it does not end in "\" normal sanitation continues, however, if
it does end in "\" it replaces the "\" with "0", we could simply strip the
"\" from the end of the file name but if there is multiple backslashes at
the end or the file name is a single backslash it could result in a empty
string for the file name.
I also attached django\tests\regressiontests\file_uploads\test.py with a
test method I added to test for this bug, it fails with the same error
mentioned in the bug report, but passes without issue after the patch is
applied.
Here is the test method alone:
{{{
def test_fail_backslash(self):
"""Tests filename ending with a backslash, issue #18150 reports
crashes when a filename ends with a backslash"""
backSlashName = "backslash.jpg\\"
payload = client.FakePayload()
payload.write('\r\n'.join([
'--' + client.BOUNDARY,
'Content-Disposition: form-data; name="file1"; filename="%s"'
% backSlashName,
'Content-Type: application/octet-stream',
'',
''
]))
payload.write('\r\n--' + client.BOUNDARY + '--\r\n')
r = {
'CONTENT_LENGTH': len(payload),
'CONTENT_TYPE': client.MULTIPART_CONTENT,
'PATH_INFO': "/file_uploads/echo/",
'REQUEST_METHOD': 'POST',
'wsgi.input': payload,
}
response = self.client.request(**r)
self.assertEqual(response.status_code, 200)
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/18150#comment:4>
Comment (by anonymous):
Added a new patch, added the test method to the patch.
Changed os.path to ntpath in uploadedfile.py, os.path has inconsistent
behavior depending on operating system. In this case we need os.path to
handle filenames with both forward and back slashes, on unix operating
systems os.path will not remove backslashes, by forcing ntpath we can
avoid this. Since forward and backslashes are now handled in
uploadedfile.py we can remove it from multipartparser.py since it is
redundant.
--
Ticket URL: <https://code.djangoproject.com/ticket/18150#comment:5>
Comment (by supersteve9219):
Replying to [comment:5 anonymous]:
> Added a new patch, added the test method to the patch.
>
> Changed os.path to ntpath in uploadedfile.py, os.path has inconsistent
behavior depending on operating system. In this case we need os.path to
handle filenames with both forward and back slashes, on unix operating
systems os.path will not remove backslashes, by forcing ntpath we can
avoid this. Since forward and backslashes are now handled in
uploadedfile.py we can remove it from multipartparser.py since it is
redundant.
Accidentally posted this while logged out.
--
Ticket URL: <https://code.djangoproject.com/ticket/18150#comment:6>
* needs_better_patch: 0 => 1
* needs_docs: 0 => 1
Comment:
Patch no longer applies cleanly. Also, if we drop `IE_santize`, we need to
document the consequences of that in the release notes.
--
Ticket URL: <https://code.djangoproject.com/ticket/18150#comment:7>
* Attachment "patch_3_15_15.diff" added.
Should apply cleanly against master now
Comment (by vigneshsarma):
We are facing this issue.
I have updated the patch and should apply cleanly against master.
If there is anything more that needs to be done to get this patch into the
next bugfix release I can help with that.
--
Ticket URL: <https://code.djangoproject.com/ticket/18150#comment:8>
* owner: supersteve9219 => (none)
* status: assigned => new
Comment:
When updating a patch (please send a pull request these days), you also
need update the ticket flags (uncheck "Needs documentation" and "Patch
needs improvement") so that the ticket appears in the patch review queue.
--
Ticket URL: <https://code.djangoproject.com/ticket/18150#comment:9>
Comment (by felixxm):
Filenames with double trailing backslashes are ignored after
4b129ac81f4fa38004950d0b307f81d1e9b44af8, but the ticket is still valid
because they should be accepted as a valid filenames on Linux.
--
Ticket URL: <https://code.djangoproject.com/ticket/18150#comment:10>