Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Empty return and error for UTF8 (surrogate) filename. #181

Closed
1mm0rt41PC opened this issue Apr 15, 2020 · 0 comments
Closed

Empty return and error for UTF8 (surrogate) filename. #181

1mm0rt41PC opened this issue Apr 15, 2020 · 0 comments

Comments

@1mm0rt41PC
Copy link
Contributor

1mm0rt41PC commented Apr 15, 2020

I have files with french charset on Windows.
Some of them are encoded in the modified utf8 => https://stackoverflow.com/questions/51001150/what-are-surrogate-characters-in-utf-8

By default, surrogate escaping is not enabled and any request with a filename with "Modified UTF8" encoding will crash :

10:21:11.254 - <1729885280> wsgidav.wsgidav_app         INFO    : 127.0.0.1 - 1mm0rt41 - [2020-04-15 08:21:11] "PROPFIND /home/desktop.ini" length=0, depth=0, elap=0.001sec -> 404 Not Found
10:21:13.980 - <1721496672> wsgidav.error_printer       ERROR   : Caught Exception
Traceback (most recent call last):
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/error_printer.py", line 52, in __call__
    for v in app_iter:
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/request_resolver.py", line 213, in __call__
    for v in app_iter:
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/request_server.py", line 126, in __call__
    app_iter = provider.custom_request_handler(environ, start_response, method)
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/dav_provider.py", line 1525, in custom_request_handler
    return default_handler(environ, start_response)
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/request_server.py", line 355, in do_PROPFIND
    propList = child.get_properties("allprop")
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/dav_provider.py", line 560, in get_properties
    name_list = self.get_property_names(mode == "allprop")
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/dav_provider.py", line 518, in get_property_names
    if self.get_etag() is not None:
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/fs_dav_provider.py", line 66, in get_etag
    return util.get_etag(self._file_path)
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/util.py", line 973, in get_etag
    file_path = file_path.encode("utf8")
UnicodeEncodeError: 'utf-8' codec can't encode character '\udcc3' in position 61: surrogates not allowed

ValueError("invalid literal for int() with base 10: ''",)
Traceback (most recent call last):
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/cheroot/wsgi.py", line 145, in respond
    for chunk in filter(None, response):
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/wsgidav_app.py", line 563, in __call__
    for v in app_iter:
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/debug_filter.py", line 157, in __call__
    for v in app_iter:
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/error_printer.py", line 52, in __call__
    for v in app_iter:
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/request_resolver.py", line 213, in __call__
    for v in app_iter:
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/request_server.py", line 126, in __call__
    app_iter = provider.custom_request_handler(environ, start_response, method)
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/dav_provider.py", line 1525, in custom_request_handler
    return default_handler(environ, start_response)
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/request_server.py", line 355, in do_PROPFIND
    propList = child.get_properties("allprop")
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/dav_provider.py", line 560, in get_properties
    name_list = self.get_property_names(mode == "allprop")
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/dav_provider.py", line 518, in get_property_names
    if self.get_etag() is not None:
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/fs_dav_provider.py", line 66, in get_etag
    return util.get_etag(self._file_path)
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/wsgidav/util.py", line 973, in get_etag
    file_path = file_path.encode("utf8")
UnicodeEncodeError: 'utf-8' codec can't encode character '\udcc3' in position 61: surrogates not allowed

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/cheroot/server.py", line 1269, in communicate
    req.respond()
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/cheroot/server.py", line 1071, in respond
    self.server.gateway(self).respond()
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/cheroot/wsgi.py", line 151, in respond
    self.req.ensure_headers_sent()
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/cheroot/server.py", line 1118, in ensure_headers_sent
    self.send_headers()
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/cheroot/server.py", line 1136, in send_headers
    status = int(self.status[:3])

The fix is easy, just change the line 973 in the file "wsgidav/util.py"
from:

file_path = file_path.encode("utf8")

to

file_path = file_path.encode("utf8","surrogateescape")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant