~bzr-pqm/bzr/bzr.dev

4763.2.4 by John Arbash Meinel
merge bzr.2.1 in preparation for NEWS entry.
1
# Copyright (C) 2006-2010 Canonical Ltd
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
16
17
"""Implementation of Transport that prevents access to locations above a set
18
root.
19
"""
20
2018.5.104 by Andrew Bennetts
Completely rework chrooted transports.
21
from bzrlib.transport import (
4634.44.3 by Andrew Bennetts
Reimplement ChrootServer/ChrootTransport using bzrlib.transport.pathfilter.
22
    pathfilter,
2018.5.104 by Andrew Bennetts
Completely rework chrooted transports.
23
    register_transport,
24
    )
4634.44.3 by Andrew Bennetts
Reimplement ChrootServer/ChrootTransport using bzrlib.transport.pathfilter.
25
26
27
class ChrootServer(pathfilter.PathFilteringServer):
2379.2.3 by Robert Collins
Review feedback.
28
    """User space 'chroot' facility.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
29
2379.2.3 by Robert Collins
Review feedback.
30
    The server's get_url returns the url for a chroot transport mapped to the
31
    backing transport. The url is of the form chroot-xxx:/// so parent
32
    directories of the backing transport are not visible. The chroot url will
33
    not allow '..' sequences to result in requests to the chroot affecting
34
    directories outside the backing transport.
4634.44.3 by Andrew Bennetts
Reimplement ChrootServer/ChrootTransport using bzrlib.transport.pathfilter.
35
36
    PathFilteringServer does all the path sanitation needed to enforce a
37
    chroot, so this is a simple subclass of PathFilteringServer that ignores
38
    filter_func.
2379.2.3 by Robert Collins
Review feedback.
39
    """
2018.5.104 by Andrew Bennetts
Completely rework chrooted transports.
40
41
    def __init__(self, backing_transport):
4634.44.3 by Andrew Bennetts
Reimplement ChrootServer/ChrootTransport using bzrlib.transport.pathfilter.
42
        pathfilter.PathFilteringServer.__init__(self, backing_transport, None)
2018.5.104 by Andrew Bennetts
Completely rework chrooted transports.
43
44
    def _factory(self, url):
45
        return ChrootTransport(self, url)
46
4934.3.3 by Martin Pool
Rename Server.setUp to Server.start_server
47
    def start_server(self):
2018.5.104 by Andrew Bennetts
Completely rework chrooted transports.
48
        self.scheme = 'chroot-%d:///' % id(self)
49
        register_transport(self.scheme, self._factory)
50
4634.44.3 by Andrew Bennetts
Reimplement ChrootServer/ChrootTransport using bzrlib.transport.pathfilter.
51
52
class ChrootTransport(pathfilter.PathFilteringTransport):
2379.2.3 by Robert Collins
Review feedback.
53
    """A ChrootTransport.
54
55
    Please see ChrootServer for details.
56
    """
2018.5.104 by Andrew Bennetts
Completely rework chrooted transports.
57
4634.44.3 by Andrew Bennetts
Reimplement ChrootServer/ChrootTransport using bzrlib.transport.pathfilter.
58
    def _filter(self, relpath):
59
        # A simplified version of PathFilteringTransport's _filter that omits
60
        # the call to self.server.filter_func.
61
        return self._relpath_from_server_root(relpath)
2018.5.104 by Andrew Bennetts
Completely rework chrooted transports.
62
63
2070.5.1 by Andrew Bennetts
Add ChrootTransportDecorator.
64
def get_test_permutations():
65
    """Return the permutations to be used in testing."""
5017.3.20 by Vincent Ladeuil
Move TestingChrootServer to bzrlib.tests.test_server
66
    from bzrlib.tests import test_server
67
    return [(ChrootTransport, test_server.TestingChrootServer)]