/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/tests/ftp_server/pyftpdlib_based.py

  • Committer: Breezy landing bot
  • Author(s): Jelmer Vernooij
  • Date: 2017-06-11 17:59:24 UTC
  • mfrom: (6686.1.4 medusa)
  • Revision ID: breezy.the.bot@gmail.com-20170611175924-a87niklxj8d8l36a
Drop support for medusa, support newer versions of pyftpdlib.

Merged from https://code.launchpad.net/~jelmer/brz/medusa/+merge/325457

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
"""
21
21
 
22
22
import errno
 
23
import logging
23
24
import os
24
 
from pyftpdlib import ftpserver
 
25
import pyftpdlib
 
26
import sys
 
27
from pyftpdlib.authorizers import (
 
28
    AuthorizerError,
 
29
    DummyAuthorizer,
 
30
    )
 
31
from pyftpdlib.filesystems import AbstractedFS
 
32
from pyftpdlib.handlers import (
 
33
    FTPHandler,
 
34
    proto_cmds,
 
35
    )
 
36
from pyftpdlib.servers import FTPServer
25
37
import select
26
38
import threading
27
39
 
34
46
from breezy.tests import test_server
35
47
 
36
48
 
 
49
class NullHandler(logging.Handler):
 
50
 
 
51
    def emit(self, record):
 
52
        pass
 
53
 
 
54
# Shut up very verbose pyftpdlib
 
55
logging.getLogger('pyftpdlib').addHandler(NullHandler())
 
56
 
 
57
 
37
58
# Convert the pyftplib string version into a tuple to avoid traps in string
38
59
# comparison.
39
 
pyftplib_version = tuple(map(int, ftpserver.__ver__.split('.')))
40
 
 
41
 
 
42
 
class AnonymousWithWriteAccessAuthorizer(ftpserver.DummyAuthorizer):
 
60
pyftplib_version = tuple(map(int, pyftpdlib.__ver__.split('.')))
 
61
 
 
62
 
 
63
class AnonymousWithWriteAccessAuthorizer(DummyAuthorizer):
43
64
 
44
65
    def _check_permissions(self, username, perm):
45
66
        # Like base implementation but don't warn about write permissions
46
67
        # assigned to anonymous, since that's exactly our purpose.
47
68
        for p in perm:
48
69
            if p not in self.read_perms + self.write_perms:
49
 
                raise ftpserver.AuthorizerError('No such permission "%s"' %p)
50
 
 
51
 
 
52
 
class BzrConformingFS(ftpserver.AbstractedFS):
 
70
                raise AuthorizerError('No such permission "%s"' %p)
 
71
 
 
72
 
 
73
class BzrConformingFS(AbstractedFS):
53
74
 
54
75
    def chmod(self, path, mode):
55
76
        return os.chmod(path, mode)
59
80
        return [osutils.safe_utf8(s) for s in os.listdir(path)]
60
81
 
61
82
    def fs2ftp(self, fspath):
62
 
        p = ftpserver.AbstractedFS.fs2ftp(self, osutils.safe_unicode(fspath))
 
83
        p = AbstractedFS.fs2ftp(self, osutils.safe_unicode(fspath))
63
84
        return osutils.safe_utf8(p)
64
85
 
65
86
    def ftp2fs(self, ftppath):
66
87
        p = osutils.safe_unicode(ftppath)
67
 
        return ftpserver.AbstractedFS.ftp2fs(self, p)
68
 
 
69
 
class BzrConformingFTPHandler(ftpserver.FTPHandler):
 
88
        return AbstractedFS.ftp2fs(self, p)
 
89
 
 
90
 
 
91
class BzrConformingFTPHandler(FTPHandler):
70
92
 
71
93
    abstracted_fs = BzrConformingFS
72
94
 
73
 
    def __init__(self, conn, server):
74
 
        ftpserver.FTPHandler.__init__(self, conn, server)
 
95
    def __init__(self, conn, server, ioloop=None):
 
96
        FTPHandler.__init__(self, conn, server)
75
97
        self.authorizer = server.authorizer
76
98
 
77
99
    def ftp_SIZE(self, path):
83
105
            self.log('FAIL SIZE "%s". %s.' % (line, why))
84
106
            self.respond("550 %s."  %why)
85
107
        else:
86
 
            ftpserver.FTPHandler.ftp_SIZE(self, path)
 
108
            FTPHandler.ftp_SIZE(self, path)
87
109
 
88
110
    def ftp_NLST(self, path):
89
111
        # bzr is overly picky here, but we want to make the test suite pass
94
116
            self.log('FAIL NLST "%s". %s.' % (line, why))
95
117
            self.respond("550 %s."  %why)
96
118
        else:
97
 
            ftpserver.FTPHandler.ftp_NLST(self, path)
 
119
            FTPHandler.ftp_NLST(self, path)
98
120
 
99
121
    def log_cmd(self, cmd, arg, respcode, respstr):
100
122
        # base class version choke on unicode, the alternative is to just
107
129
 
108
130
 
109
131
# An empty password is valid, hence the arg is neither mandatory nor forbidden
110
 
ftpserver.proto_cmds['PASS']['arg'] = None
 
132
proto_cmds['PASS']['arg'] = None
111
133
 
112
 
class ftp_server(ftpserver.FTPServer):
 
134
class ftp_server(FTPServer):
113
135
 
114
136
    def __init__(self, address, handler, authorizer):
115
 
        ftpserver.FTPServer.__init__(self, address, handler)
 
137
        FTPServer.__init__(self, address, handler)
116
138
        self.authorizer = authorizer
117
139
        # Worth backporting upstream ?
118
140
        self.addr = self.socket.getsockname()
155
177
        authorizer.add_anonymous(self._root, perm='elradfmwM')
156
178
        self._ftp_server = ftp_server(address, BzrConformingFTPHandler,
157
179
                                      authorizer)
158
 
        # This is hacky as hell, will not work if we need two servers working
159
 
        # at the same time, but that's the best we can do so far...
160
 
        # FIXME: At least log and logline could be overriden in the handler ?
161
 
        # -- vila 20090227
162
 
        ftpserver.log = self.log
163
 
        ftpserver.logline = self.log
164
 
        ftpserver.logerror = self.log
165
180
 
166
181
        self._port = self._ftp_server.socket.getsockname()[1]
167
182
        self._ftpd_starting = threading.Lock()
196
211
        self._ftpd_starting.release()
197
212
        while self._ftpd_running:
198
213
            try:
199
 
                self._ftp_server.serve_forever(timeout=0.1, count=1)
 
214
                self._ftp_server.serve_forever(timeout=0.1)
200
215
            except select.error as e:
201
216
                if e.args[0] != errno.EBADF:
202
217
                    raise
203
 
        self._ftp_server.close_all(ignore_all=True)
 
218
        self._ftp_server.close_all()
204
219
 
205
220
    def add_user(self, user, password):
206
221
        """Add a user with write access."""