fix(svn): more binary protocol svn ssh fixes
This commit is contained in:
parent
b79db3eb9c
commit
104352ccda
1 changed files with 23 additions and 15 deletions
|
|
@ -25,7 +25,6 @@ import tempfile
|
|||
from subprocess import Popen, PIPE
|
||||
import urllib.parse
|
||||
|
||||
from rhodecode.lib.str_utils import safe_bytes
|
||||
from rhodecode_tools.lib.utils import safe_str
|
||||
from .base import SshVcsServer
|
||||
|
||||
|
|
@ -103,19 +102,27 @@ class SubversionTunnelWrapper(object):
|
|||
|
||||
def patch_first_client_response(self, response, **kwargs):
|
||||
self.create_hooks_env()
|
||||
data = response.copy()
|
||||
data.update(kwargs)
|
||||
data['url'] = self._svn_string(data['url'])
|
||||
data['ra_client'] = self._svn_string(data['ra_client'])
|
||||
data['client'] = data['client'] or ''
|
||||
buffer_ = safe_bytes(
|
||||
"( {version} ( {capabilities} ) {url}{ra_client}"
|
||||
"( {client}) ) ".format(**data))
|
||||
|
||||
version = response['version']
|
||||
capabilities = response['capabilities']
|
||||
client = response['client'] or b''
|
||||
|
||||
url = self._svn_bytes(response['url'])
|
||||
ra_client = self._svn_bytes(response['ra_client'])
|
||||
|
||||
buffer_ = b"( %b ( %b ) %b%b( %b) ) " % (
|
||||
version,
|
||||
capabilities,
|
||||
url,
|
||||
ra_client,
|
||||
client
|
||||
)
|
||||
self.process.stdin.write(buffer_)
|
||||
|
||||
def fail(self, message):
|
||||
print("( failure ( ( 210005 {message} 0: 0 ) ) )".format(
|
||||
message=self._svn_string(message)))
|
||||
fail_msg = b"( failure ( ( 210005 %b 0: 0 ) ) )" % self._svn_bytes(message)
|
||||
sys.stdout.buffer.write(fail_msg)
|
||||
sys.stdout.flush()
|
||||
self.remove_configs()
|
||||
self.process.kill()
|
||||
return 1
|
||||
|
|
@ -123,10 +130,11 @@ class SubversionTunnelWrapper(object):
|
|||
def interrupt(self, signum, frame):
|
||||
self.fail("Exited by timeout")
|
||||
|
||||
def _svn_string(self, str_):
|
||||
if not str_:
|
||||
return ''
|
||||
return f'{len(str_)}:{str_} '
|
||||
def _svn_bytes(self, bytes_: bytes) -> bytes:
|
||||
if not bytes_:
|
||||
return b''
|
||||
|
||||
return f'{len(bytes_)}:'.encode() + bytes_ + b' '
|
||||
|
||||
def _read_first_client_response(self):
|
||||
buffer_ = b""
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue