807
811
failure_exc=FileExists)
810
class SFTPAbsoluteServer(object):
814
# ------------- server test implementation --------------
818
from bzrlib.tests.stub_sftp import StubServer, StubSFTPServer
820
STUB_SERVER_KEY = """
821
-----BEGIN RSA PRIVATE KEY-----
822
MIICWgIBAAKBgQDTj1bqB4WmayWNPB+8jVSYpZYk80Ujvj680pOTh2bORBjbIAyz
823
oWGW+GUjzKxTiiPvVmxFgx5wdsFvF03v34lEVVhMpouqPAYQ15N37K/ir5XY+9m/
824
d8ufMCkjeXsQkKqFbAlQcnWMCRnOoPHS3I4vi6hmnDDeeYTSRvfLbW0fhwIBIwKB
825
gBIiOqZYaoqbeD9OS9z2K9KR2atlTxGxOJPXiP4ESqP3NVScWNwyZ3NXHpyrJLa0
826
EbVtzsQhLn6rF+TzXnOlcipFvjsem3iYzCpuChfGQ6SovTcOjHV9z+hnpXvQ/fon
827
soVRZY65wKnF7IAoUwTmJS9opqgrN6kRgCd3DASAMd1bAkEA96SBVWFt/fJBNJ9H
828
tYnBKZGw0VeHOYmVYbvMSstssn8un+pQpUm9vlG/bp7Oxd/m+b9KWEh2xPfv6zqU
829
avNwHwJBANqzGZa/EpzF4J8pGti7oIAPUIDGMtfIcmqNXVMckrmzQ2vTfqtkEZsA
830
4rE1IERRyiJQx6EJsz21wJmGV9WJQ5kCQQDwkS0uXqVdFzgHO6S++tjmjYcxwr3g
831
H0CoFYSgbddOT6miqRskOQF3DZVkJT3kyuBgU2zKygz52ukQZMqxCb1fAkASvuTv
832
qfpH87Qq5kQhNKdbbwbmd2NxlNabazPijWuphGTdW0VfJdWfklyS2Kr+iqrs/5wV
833
HhathJt636Eg7oIjAkA8ht3MQ+XSl9yIJIS8gVpbPxSw5OMfw0PjVE7tBdQruiSc
834
nvuQES5C9BMHjF39LZiGH1iLQy7FgdHyoP+eodI7
835
-----END RSA PRIVATE KEY-----
839
class SingleListener(threading.Thread):
841
def __init__(self, callback):
842
threading.Thread.__init__(self)
843
self._callback = callback
844
self._socket = socket.socket()
845
self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
846
self._socket.bind(('localhost', 0))
847
self._socket.listen(1)
848
self.port = self._socket.getsockname()[1]
849
self.stop_event = threading.Event()
852
s, _ = self._socket.accept()
853
# now close the listen socket
855
self._callback(s, self.stop_event)
858
self.stop_event.set()
859
# We should consider waiting for the other thread
860
# to stop, because otherwise we get spurious
861
# bzr: ERROR: Socket exception: Connection reset by peer (54)
862
# because the test suite finishes before the thread has a chance
863
# to close. (Especially when only running a few tests)
866
class SFTPServer(Server):
867
"""Common code for SFTP server facilities."""
869
def _get_sftp_url(self, path):
870
"""Calculate a sftp url to this server for path."""
871
return 'sftp://foo:bar@localhost:%d/%s' % (self._listener.port, path)
874
self._original_vendor = None
876
self._listener = None
879
def log(self, *args, **kwargs):
880
"""What to do here? do we need this? Its for the StubServer.."""
882
def _run_server(self, s, stop_event):
883
ssh_server = paramiko.Transport(s)
884
key_file = os.path.join(self._homedir, 'test_rsa.key')
885
file(key_file, 'w').write(STUB_SERVER_KEY)
886
host_key = paramiko.RSAKey.from_private_key_file(key_file)
887
ssh_server.add_server_key(host_key)
888
server = StubServer(self)
889
ssh_server.set_subsystem_handler('sftp', paramiko.SFTPServer,
890
StubSFTPServer, root=self._root,
892
event = threading.Event()
893
ssh_server.start_server(event, server)
895
stop_event.wait(30.0)
898
"""See bzrlib.transport.Server.setUp."""
899
# XXX: 20051124 jamesh
900
# The tests currently pop up a password prompt when an external ssh
901
# is used. This forces the use of the paramiko implementation.
903
self._original_vendor = _ssh_vendor
905
self._homedir = os.getcwdu()
907
# FIXME WINDOWS: _root should be _homedir[0]:/
908
self._listener = SingleListener(self._run_server)
909
self._listener.setDaemon(True)
910
self._listener.start()
913
"""See bzrlib.transport.Server.tearDown."""
915
self._listener.stop()
916
_ssh_vendor = self._original_vendor
919
class SFTPAbsoluteServer(SFTPServer):
811
920
"""A test server for sftp transports, using absolute urls."""
814
class SFTPHomeDirServer(object):
923
"""See bzrlib.transport.Server.get_url."""
924
return self._get_sftp_url("%%2f%s" %
925
urlescape(self._homedir[1:]))
928
class SFTPHomeDirServer(SFTPServer):
815
929
"""A test server for sftp transports, using homedir relative urls."""
932
"""See bzrlib.transport.Server.get_url."""
933
return self._get_sftp_url("")