/breezy/unstable

To get this branch, use:
bzr branch https://code.breezy-vcs.org/breezy/unstable

« back to all changes in this revision

Viewing changes to breezy/tests/stub_sftp.py

  • Committer: Jelmer Vernooij
  • Date: 2017-05-24 01:39:33 UTC
  • mfrom: (3815.3776.6)
  • Revision ID: jelmer@jelmer.uk-20170524013933-ir4y4tqtrsiz2ka2
New upstream snapshot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
import os
23
23
import paramiko
24
24
import socket
25
 
import SocketServer
 
25
try:
 
26
    import socketserver
 
27
except ImportError:
 
28
    import SocketServer as socketserver
26
29
import sys
27
30
import time
28
31
 
29
 
from bzrlib import (
 
32
from .. import (
30
33
    osutils,
31
34
    trace,
32
35
    urlutils,
33
36
    )
34
 
from bzrlib.transport import (
 
37
from ..transport import (
35
38
    ssh,
36
39
    )
37
 
from bzrlib.tests import test_server
 
40
from . import test_server
38
41
 
39
42
 
40
43
class StubServer(paramiko.ServerInterface):
59
62
        try:
60
63
            return paramiko.SFTPAttributes.from_stat(
61
64
                os.fstat(self.readfile.fileno()))
62
 
        except OSError, e:
 
65
        except OSError as e:
63
66
            return paramiko.SFTPServer.convert_errno(e.errno)
64
67
 
65
68
    def chattr(self, attr):
68
71
        trace.mutter('Changing permissions on %s to %s', self.filename, attr)
69
72
        try:
70
73
            paramiko.SFTPServer.set_file_attr(self.filename, attr)
71
 
        except OSError, e:
 
74
        except OSError as e:
72
75
            return paramiko.SFTPServer.convert_errno(e.errno)
73
76
 
74
77
 
125
128
    def chattr(self, path, attr):
126
129
        try:
127
130
            paramiko.SFTPServer.set_file_attr(path, attr)
128
 
        except OSError, e:
 
131
        except OSError as e:
129
132
            return paramiko.SFTPServer.convert_errno(e.errno)
130
133
        return paramiko.SFTP_OK
131
134
 
146
149
                attr.filename = fname
147
150
                out.append(attr)
148
151
            return out
149
 
        except OSError, e:
 
152
        except OSError as e:
150
153
            return paramiko.SFTPServer.convert_errno(e.errno)
151
154
 
152
155
    def stat(self, path):
153
156
        path = self._realpath(path)
154
157
        try:
155
158
            return paramiko.SFTPAttributes.from_stat(os.stat(path))
156
 
        except OSError, e:
 
159
        except OSError as e:
157
160
            return paramiko.SFTPServer.convert_errno(e.errno)
158
161
 
159
162
    def lstat(self, path):
160
163
        path = self._realpath(path)
161
164
        try:
162
165
            return paramiko.SFTPAttributes.from_stat(os.lstat(path))
163
 
        except OSError, e:
 
166
        except OSError as e:
164
167
            return paramiko.SFTPServer.convert_errno(e.errno)
165
168
 
166
169
    def open(self, path, flags, attr):
172
175
            else:
173
176
                # os.open() defaults to 0777 which is
174
177
                # an odd default mode for files
175
 
                fd = os.open(path, flags, 0666)
176
 
        except OSError, e:
 
178
                fd = os.open(path, flags, 0o666)
 
179
        except OSError as e:
177
180
            return paramiko.SFTPServer.convert_errno(e.errno)
178
181
 
179
182
        if (flags & os.O_CREAT) and (attr is not None):
188
191
            fstr = 'rb'
189
192
        try:
190
193
            f = os.fdopen(fd, fstr)
191
 
        except (IOError, OSError), e:
 
194
        except (IOError, OSError) as e:
192
195
            return paramiko.SFTPServer.convert_errno(e.errno)
193
196
        fobj = StubSFTPHandle()
194
197
        fobj.filename = path
200
203
        path = self._realpath(path)
201
204
        try:
202
205
            os.remove(path)
203
 
        except OSError, e:
 
206
        except OSError as e:
204
207
            return paramiko.SFTPServer.convert_errno(e.errno)
205
208
        return paramiko.SFTP_OK
206
209
 
209
212
        newpath = self._realpath(newpath)
210
213
        try:
211
214
            os.rename(oldpath, newpath)
212
 
        except OSError, e:
 
215
        except OSError as e:
213
216
            return paramiko.SFTPServer.convert_errno(e.errno)
214
217
        return paramiko.SFTP_OK
215
218
 
225
228
            if attr is not None:
226
229
                attr._flags &= ~attr.FLAG_PERMISSIONS
227
230
                paramiko.SFTPServer.set_file_attr(path, attr)
228
 
        except OSError, e:
 
231
        except OSError as e:
229
232
            return paramiko.SFTPServer.convert_errno(e.errno)
230
233
        return paramiko.SFTP_OK
231
234
 
233
236
        path = self._realpath(path)
234
237
        try:
235
238
            os.rmdir(path)
236
 
        except OSError, e:
 
239
        except OSError as e:
237
240
            return paramiko.SFTPServer.convert_errno(e.errno)
238
241
        return paramiko.SFTP_OK
239
242
 
337
340
        return bytes_sent
338
341
 
339
342
 
340
 
class TestingSFTPConnectionHandler(SocketServer.BaseRequestHandler):
 
343
class TestingSFTPConnectionHandler(socketserver.BaseRequestHandler):
341
344
 
342
345
    def setup(self):
343
346
        self.wrap_for_latency()
398
401
        try:
399
402
            sftp_server.start_subsystem(
400
403
                'sftp', None, ssh.SocketAsChannelAdapter(self.request))
401
 
        except socket.error, e:
 
404
        except socket.error as e:
402
405
            if (len(e.args) > 0) and (e.args[0] == errno.EPIPE):
403
406
                # it's okay for the client to disconnect abruptly
404
407
                # (bug in paramiko 1.6: it should absorb this exception)
405
408
                pass
406
409
            else:
407
410
                raise
408
 
        except Exception, e:
 
411
        except Exception as e:
409
412
            # This typically seems to happen during interpreter shutdown, so
410
413
            # most of the useful ways to report this error won't work.
411
414
            # Writing the exception type, and then the text of the exception,
481
484
                'the local current working directory.' % (backing_server,))
482
485
        self._original_vendor = ssh._ssh_vendor_manager._cached_ssh_vendor
483
486
        ssh._ssh_vendor_manager._cached_ssh_vendor = self._vendor
 
487
        self._homedir = osutils.getcwd()
484
488
        if sys.platform == 'win32':
485
 
            # Win32 needs to use the UNICODE api
486
 
            self._homedir = os.getcwdu()
487
489
            # Normalize the path or it will be wrongly escaped
488
490
            self._homedir = osutils.normpath(self._homedir)
489
491
        else:
490
492
            # But unix SFTP servers should just deal in bytestreams
491
 
            self._homedir = os.getcwd()
 
493
            self._homedir = self._homedir.encode('utf-8')
492
494
        if self._server_homedir is None:
493
495
            self._server_homedir = self._homedir
494
496
        self._root = '/'
503
505
            ssh._ssh_vendor_manager._cached_ssh_vendor = self._original_vendor
504
506
 
505
507
    def get_bogus_url(self):
506
 
        """See bzrlib.transport.Server.get_bogus_url."""
 
508
        """See breezy.transport.Server.get_bogus_url."""
507
509
        # this is chosen to try to prevent trouble with proxies, weird dns, etc
508
510
        # we bind a random socket, so that we get a guaranteed unused port
509
511
        # we just never listen on that port
516
518
    """A test server for sftp transports, using absolute urls and ssh."""
517
519
 
518
520
    def get_url(self):
519
 
        """See bzrlib.transport.Server.get_url."""
 
521
        """See breezy.transport.Server.get_url."""
520
522
        homedir = self._homedir
521
523
        if sys.platform != 'win32':
522
524
            # Remove the initial '/' on all platforms but win32
540
542
    """A test server for sftp transports, using absolute urls."""
541
543
 
542
544
    def get_url(self):
543
 
        """See bzrlib.transport.Server.get_url."""
 
545
        """See breezy.transport.Server.get_url."""
544
546
        homedir = self._homedir
545
547
        if sys.platform != 'win32':
546
548
            # Remove the initial '/' on all platforms but win32
552
554
    """A test server for sftp transports, using homedir relative urls."""
553
555
 
554
556
    def get_url(self):
555
 
        """See bzrlib.transport.Server.get_url."""
 
557
        """See breezy.transport.Server.get_url."""
556
558
        return self._get_sftp_url("%7E/")
557
559
 
558
560