~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/stub_sftp.py

Merged mailine

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
import os
23
23
from paramiko import ServerInterface, SFTPServerInterface, SFTPServer, SFTPAttributes, \
24
24
    SFTPHandle, SFTP_OK, AUTH_SUCCESSFUL, OPEN_SUCCEEDED
 
25
from bzrlib.osutils import pathjoin
 
26
from bzrlib.trace import mutter
25
27
 
26
28
 
27
29
class StubServer (ServerInterface):
49
51
    def chattr(self, attr):
50
52
        # python doesn't have equivalents to fchown or fchmod, so we have to
51
53
        # use the stored filename
 
54
        mutter('Changing permissions on %s to %s', self.filename, attr)
52
55
        try:
53
56
            SFTPServer.set_file_attr(self.filename, attr)
54
57
        except OSError, e:
56
59
 
57
60
 
58
61
class StubSFTPServer (SFTPServerInterface):
59
 
    def __init__(self, server, root):
 
62
    def __init__(self, server, root, home=None):
60
63
        SFTPServerInterface.__init__(self, server)
61
64
        self.root = root
62
 
        
 
65
        if home is None:
 
66
            self.home = self.root
 
67
        else:
 
68
            self.home = home[len(self.root):]
 
69
        if (len(self.home) > 0) and (self.home[0] == '/'):
 
70
            self.home = self.home[1:]
 
71
 
63
72
    def _realpath(self, path):
64
73
        return self.root + self.canonicalize(path)
65
74
 
 
75
    def canonicalize(self, path):
 
76
        if os.path.isabs(path):
 
77
            return os.path.normpath(path)
 
78
        else:
 
79
            return os.path.normpath('/' + os.path.join(self.home, path))
 
80
 
 
81
    def chattr(self, path, attr):
 
82
        try:
 
83
            SFTPServer.set_file_attr(path, attr)
 
84
        except OSError, e:
 
85
            return SFTPServer.convert_errno(e.errno)
 
86
        return SFTP_OK
 
87
 
66
88
    def list_folder(self, path):
67
89
        path = self._realpath(path)
68
90
        try:
69
91
            out = [ ]
70
92
            flist = os.listdir(path)
71
93
            for fname in flist:
72
 
                attr = SFTPAttributes.from_stat(os.stat(os.path.join(path, fname)))
 
94
                attr = SFTPAttributes.from_stat(os.stat(pathjoin(path, fname)))
73
95
                attr.filename = fname
74
96
                out.append(attr)
75
97
            return out
93
115
    def open(self, path, flags, attr):
94
116
        path = self._realpath(path)
95
117
        try:
96
 
            fd = os.open(path, flags)
 
118
            if hasattr(os, 'O_BINARY'):
 
119
                flags |= os.O_BINARY
 
120
            if getattr(attr, 'st_mode', None):
 
121
                fd = os.open(path, flags, attr.st_mode)
 
122
            else:
 
123
                fd = os.open(path, flags)
97
124
        except OSError, e:
98
125
            return SFTPServer.convert_errno(e.errno)
99
126
        if (flags & os.O_CREAT) and (attr is not None):
 
127
            attr._flags &= ~attr.FLAG_PERMISSIONS
100
128
            SFTPServer.set_file_attr(path, attr)
101
129
        if flags & os.O_WRONLY:
102
 
            fstr = 'w'
 
130
            fstr = 'wb'
103
131
        elif flags & os.O_RDWR:
104
 
            fstr = 'r+'
 
132
            fstr = 'rb+'
105
133
        else:
106
134
            # O_RDONLY (== 0)
107
 
            fstr = 'r'
 
135
            fstr = 'rb'
108
136
        try:
109
137
            f = os.fdopen(fd, fstr)
110
138
        except OSError, e:
135
163
    def mkdir(self, path, attr):
136
164
        path = self._realpath(path)
137
165
        try:
138
 
            os.mkdir(path)
 
166
            # Using getattr() in case st_mode is None or 0
 
167
            # both evaluate to False
 
168
            if getattr(attr, 'st_mode', None):
 
169
                os.mkdir(path, attr.st_mode)
 
170
            else:
 
171
                os.mkdir(path)
139
172
            if attr is not None:
 
173
                attr._flags &= ~attr.FLAG_PERMISSIONS
140
174
                SFTPServer.set_file_attr(path, attr)
141
175
        except OSError, e:
142
176
            return SFTPServer.convert_errno(e.errno)