Mercurial > hg-stable
changeset 36017:59e4a7781a36
sshpeer: implement peer for version 2 of wire protocol
Since the protocol is now negotiated before we construct a
peer instance, we can return the negotiated protocol from the
handshake function and instantiate an appropriate peer class
for the protocol.
Version 2 of the SSH protocol is currently identical to version
1 post handshake. So our sshv2peer class just inherits from
sshv1peer for the time being. This will obviously change
over time.
Differential Revision: https://phab.mercurial-scm.org/D2063
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Tue, 06 Feb 2018 11:31:25 -0800 |
parents | 625038cb4b1d |
children | ae79cf6f9c82 |
files | mercurial/sshpeer.py tests/test-check-interfaces.py |
diffstat | 2 files changed, 18 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/sshpeer.py Tue Feb 06 10:57:56 2018 -0800 +++ b/mercurial/sshpeer.py Tue Feb 06 11:31:25 2018 -0800 @@ -326,7 +326,7 @@ if not caps: badresponse() - return caps + return protoname, caps class sshv1peer(wireproto.wirepeer): def __init__(self, ui, url, proc, stdin, stdout, stderr, caps): @@ -497,6 +497,12 @@ self._pipeo.flush() self._readerr() +class sshv2peer(sshv1peer): + """A peer that speakers version 2 of the transport protocol.""" + # Currently version 2 is identical to version 1 post handshake. + # And handshake is performed before the peer is instantiated. So + # we need no custom code. + def instance(ui, path, create): """Create an SSH peer. @@ -532,9 +538,16 @@ remotepath, sshenv) try: - caps = _performhandshake(ui, stdin, stdout, stderr) + protoname, caps = _performhandshake(ui, stdin, stdout, stderr) except Exception: _cleanuppipes(ui, stdout, stdin, stderr) raise - return sshv1peer(ui, path, proc, stdin, stdout, stderr, caps) + if protoname == wireprotoserver.SSHV1: + return sshv1peer(ui, path, proc, stdin, stdout, stderr, caps) + elif protoname == wireprotoserver.SSHV2: + return sshv2peer(ui, path, proc, stdin, stdout, stderr, caps) + else: + _cleanuppipes(ui, stdout, stdin, stderr) + raise error.RepoError(_('unknown version of SSH protocol: %s') % + protoname)
--- a/tests/test-check-interfaces.py Tue Feb 06 10:57:56 2018 -0800 +++ b/tests/test-check-interfaces.py Tue Feb 06 11:31:25 2018 -0800 @@ -67,6 +67,8 @@ checkobject(localrepo.localpeer(dummyrepo())) checkobject(sshpeer.sshv1peer(ui, 'ssh://localhost/foo', None, None, None, None, None)) + checkobject(sshpeer.sshv2peer(ui, 'ssh://localhost/foo', None, None, None, + None, None)) checkobject(bundlerepo.bundlepeer(dummyrepo())) checkobject(statichttprepo.statichttppeer(dummyrepo())) checkobject(unionrepo.unionpeer(dummyrepo()))