From 93bb2a8b36a89ecda349aa4008d1c1a754b3d4b7 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 3 Apr 2017 13:40:39 +0200 Subject: [PATCH] svn: escape special chars to allow interactions with non-standard svn paths. - fixes #4306 --- rhodecode/lib/middleware/simplesvn.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/rhodecode/lib/middleware/simplesvn.py b/rhodecode/lib/middleware/simplesvn.py index cc754eaa..847d8de5 100644 --- a/rhodecode/lib/middleware/simplesvn.py +++ b/rhodecode/lib/middleware/simplesvn.py @@ -19,8 +19,10 @@ # and proprietary license terms, please see https://rhodecode.com/licenses/ import logging +import urllib from urlparse import urljoin + import requests from webob.exc import HTTPNotAcceptable @@ -55,6 +57,14 @@ class SimpleSvnApp(object): environ['REQUEST_METHOD'], self._get_url(environ['PATH_INFO']), data=data, headers=request_headers) + if response.status_code not in [200, 401]: + if response.status_code >= 500: + log.error('Got SVN response:%s with text:`%s`', + response, response.text) + else: + log.debug('Got SVN response:%s with text:`%s`', + response, response.text) + response_headers = self._get_response_headers(response.headers) start_response( '{} {}'.format(response.status_code, response.reason), @@ -62,8 +72,10 @@ class SimpleSvnApp(object): return response.iter_content(chunk_size=1024) def _get_url(self, path): - return urljoin( + url_path = urljoin( self.config.get('subversion_http_server_url', ''), path) + url_path = urllib.quote(url_path, safe="/:=~+!$,;'") + return url_path def _get_request_headers(self, environ): headers = {}