/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
4763.2.4 by John Arbash Meinel
merge bzr.2.1 in preparation for NEWS entry.
1
# Copyright (C) 2007-2010 Canonical Ltd
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
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
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
16
7358.9.2 by Jelmer Vernooij
Add test.
17
from breezy import config
18
from breezy.tests import TestCase, TestCaseWithTransport
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
19
from breezy.errors import SSHVendorNotFound, UnknownSSH
20
from breezy.transport.ssh import (
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
21
    OpenSSHSubprocessVendor,
2221.5.16 by Dmitry Vasiliev
Added comments for test_cached_vendor
22
    PLinkSubprocessVendor,
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
23
    SSHCorpSubprocessVendor,
5444.2.2 by Matthew Gordon
Added tests for GNU lsh support.
24
    LSHSubprocessVendor,
2221.5.16 by Dmitry Vasiliev
Added comments for test_cached_vendor
25
    SSHVendorManager,
6753.1.1 by Jelmer Vernooij
Refuse to connect to ssh hostnames starting with a dash. Fixes LP:1710979
26
    StrangeHostname,
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
27
    )
28
29
30
class TestSSHVendorManager(SSHVendorManager):
31
32
    _ssh_version_string = ""
33
34
    def set_ssh_version_string(self, version):
35
        self._ssh_version_string = version
36
37
    def _get_ssh_version_string(self, args):
38
        return self._ssh_version_string
39
40
7358.9.2 by Jelmer Vernooij
Add test.
41
class SSHVendorManagerTests(TestCaseWithTransport):
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
42
43
    def test_register_vendor(self):
44
        manager = TestSSHVendorManager()
7358.9.2 by Jelmer Vernooij
Add test.
45
        self.overrideEnv('BRZ_SSH', None)
46
        self.assertRaises(SSHVendorNotFound, manager.get_vendor)
2221.5.6 by Dmitry Vasiliev
Changed tests to make sure the vendor manager returns the same object as was registered
47
        vendor = object()
48
        manager.register_vendor("vendor", vendor)
7358.9.2 by Jelmer Vernooij
Add test.
49
        self.overrideEnv('BRZ_SSH', 'vendor')
50
        self.assertIs(manager.get_vendor(), vendor)
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
51
52
    def test_default_vendor(self):
53
        manager = TestSSHVendorManager()
7358.9.2 by Jelmer Vernooij
Add test.
54
        self.overrideEnv('BRZ_SSH', None)
55
        self.assertRaises(SSHVendorNotFound, manager.get_vendor)
2221.5.6 by Dmitry Vasiliev
Changed tests to make sure the vendor manager returns the same object as was registered
56
        vendor = object()
57
        manager.register_default_vendor(vendor)
7358.9.2 by Jelmer Vernooij
Add test.
58
        self.assertIs(manager.get_vendor(), vendor)
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
59
60
    def test_get_vendor_by_environment(self):
61
        manager = TestSSHVendorManager()
7358.9.2 by Jelmer Vernooij
Add test.
62
        self.overrideEnv('BRZ_SSH', None)
63
        self.assertRaises(SSHVendorNotFound, manager.get_vendor)
64
        self.overrideEnv('BRZ_SSH', 'vendor')
65
        self.assertRaises(UnknownSSH, manager.get_vendor)
66
        vendor = object()
67
        manager.register_vendor("vendor", vendor)
68
        self.assertIs(manager.get_vendor(), vendor)
69
70
    def test_get_vendor_by_config(self):
71
        manager = TestSSHVendorManager()
72
        self.overrideEnv('BRZ_SSH', None)
73
        self.assertRaises(SSHVendorNotFound, manager.get_vendor)
74
        config.GlobalStack().set('ssh', 'vendor')
75
        self.assertRaises(UnknownSSH, manager.get_vendor)
76
        vendor = object()
77
        manager.register_vendor("vendor", vendor)
78
        self.assertIs(manager.get_vendor(), vendor)
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
79
80
    def test_get_vendor_by_inspection_openssh(self):
81
        manager = TestSSHVendorManager()
7358.9.2 by Jelmer Vernooij
Add test.
82
        self.overrideEnv('BRZ_SSH', None)
83
        self.assertRaises(SSHVendorNotFound, manager.get_vendor)
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
84
        manager.set_ssh_version_string("OpenSSH")
7358.9.2 by Jelmer Vernooij
Add test.
85
        self.assertIsInstance(manager.get_vendor(), OpenSSHSubprocessVendor)
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
86
87
    def test_get_vendor_by_inspection_sshcorp(self):
88
        manager = TestSSHVendorManager()
7358.9.2 by Jelmer Vernooij
Add test.
89
        self.overrideEnv('BRZ_SSH', None)
90
        self.assertRaises(SSHVendorNotFound, manager.get_vendor)
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
91
        manager.set_ssh_version_string("SSH Secure Shell")
7358.9.2 by Jelmer Vernooij
Add test.
92
        self.assertIsInstance(manager.get_vendor(), SSHCorpSubprocessVendor)
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
93
5444.2.2 by Matthew Gordon
Added tests for GNU lsh support.
94
    def test_get_vendor_by_inspection_lsh(self):
95
        manager = TestSSHVendorManager()
7358.9.2 by Jelmer Vernooij
Add test.
96
        self.overrideEnv('BRZ_SSH', None)
97
        self.assertRaises(SSHVendorNotFound, manager.get_vendor)
5444.2.2 by Matthew Gordon
Added tests for GNU lsh support.
98
        manager.set_ssh_version_string("lsh")
7358.9.2 by Jelmer Vernooij
Add test.
99
        self.assertIsInstance(manager.get_vendor(), LSHSubprocessVendor)
5444.2.2 by Matthew Gordon
Added tests for GNU lsh support.
100
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
101
    def test_get_vendor_by_inspection_plink(self):
102
        manager = TestSSHVendorManager()
7358.9.2 by Jelmer Vernooij
Add test.
103
        self.overrideEnv('BRZ_SSH', None)
104
        self.assertRaises(SSHVendorNotFound, manager.get_vendor)
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
105
        manager.set_ssh_version_string("plink")
4636.3.1 by Alexander Belchenko
Disabled auto-detection of plink SSH client to avoid many problems. On Windows paramiko wil be used as default. Nevertheless user can force usage of plink via env variable BZR_SSH=plink
106
        # Auto-detect of plink vendor disabled, on Windows recommended
107
        # default ssh-client is paramiko
108
        # see https://bugs.launchpad.net/bugs/414743
7358.9.2 by Jelmer Vernooij
Add test.
109
        #~self.assertIsInstance(manager.get_vendor(), PLinkSubprocessVendor)
110
        self.assertRaises(SSHVendorNotFound, manager.get_vendor)
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
111
112
    def test_cached_vendor(self):
113
        manager = TestSSHVendorManager()
7358.9.2 by Jelmer Vernooij
Add test.
114
        self.overrideEnv('BRZ_SSH', None)
115
        self.assertRaises(SSHVendorNotFound, manager.get_vendor)
2221.5.6 by Dmitry Vasiliev
Changed tests to make sure the vendor manager returns the same object as was registered
116
        vendor = object()
117
        manager.register_vendor("vendor", vendor)
7358.9.2 by Jelmer Vernooij
Add test.
118
        self.assertRaises(SSHVendorNotFound, manager.get_vendor)
2221.5.16 by Dmitry Vasiliev
Added comments for test_cached_vendor
119
        # Once the vendor is found the result is cached (mainly because of the
120
        # 'get_vendor' sometimes can be an expensive operation) and later
121
        # invocations of the 'get_vendor' just returns the cached value.
7358.9.2 by Jelmer Vernooij
Add test.
122
        self.overrideEnv('BRZ_SSH', 'vendor')
123
        self.assertIs(manager.get_vendor(), vendor)
124
        self.overrideEnv('BRZ_SSH', None)
125
        self.assertIs(manager.get_vendor(), vendor)
2221.5.16 by Dmitry Vasiliev
Added comments for test_cached_vendor
126
        # The cache can be cleared by the 'clear_cache' method
127
        manager.clear_cache()
7358.9.2 by Jelmer Vernooij
Add test.
128
        self.overrideEnv('BRZ_SSH', None)
129
        self.assertRaises(SSHVendorNotFound, manager.get_vendor)
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
130
2221.5.17 by Dmitry Vasiliev
Added comments for test_get_vendor_search_order
131
    def test_get_vendor_search_order(self):
132
        # The 'get_vendor' method search for SSH vendors as following:
133
        #
134
        #   1. Check previously cached value
6622.1.28 by Jelmer Vernooij
More renames; commands in output, environment variables.
135
        #   2. Check BRZ_SSH environment variable
2221.5.17 by Dmitry Vasiliev
Added comments for test_get_vendor_search_order
136
        #   3. Check the system for known SSH vendors
137
        #   4. Fall back to the default vendor if registered
138
        #
139
        # Let's now check the each check method in the reverse order
140
        # clearing the cache between each invocation:
141
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
142
        manager = TestSSHVendorManager()
2221.5.17 by Dmitry Vasiliev
Added comments for test_get_vendor_search_order
143
        # At first no vendors are found
7358.9.2 by Jelmer Vernooij
Add test.
144
        self.overrideEnv('BRZ_SSH', None)
145
        self.assertRaises(SSHVendorNotFound, manager.get_vendor)
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
146
2221.5.17 by Dmitry Vasiliev
Added comments for test_get_vendor_search_order
147
        # If the default vendor is registered it will be returned
2221.5.6 by Dmitry Vasiliev
Changed tests to make sure the vendor manager returns the same object as was registered
148
        default_vendor = object()
149
        manager.register_default_vendor(default_vendor)
7358.9.2 by Jelmer Vernooij
Add test.
150
        self.assertIs(manager.get_vendor(), default_vendor)
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
151
2221.5.17 by Dmitry Vasiliev
Added comments for test_get_vendor_search_order
152
        # If the known vendor is found in the system it will be returned
2221.5.8 by Dmitry Vasiliev
Added SSHVendorManager.clear_cache() method
153
        manager.clear_cache()
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
154
        manager.set_ssh_version_string("OpenSSH")
7358.9.2 by Jelmer Vernooij
Add test.
155
        self.assertIsInstance(manager.get_vendor(), OpenSSHSubprocessVendor)
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
156
6622.1.28 by Jelmer Vernooij
More renames; commands in output, environment variables.
157
        # If the BRZ_SSH environment variable is found it will be treated as
2221.5.17 by Dmitry Vasiliev
Added comments for test_get_vendor_search_order
158
        # the vendor name
2221.5.8 by Dmitry Vasiliev
Added SSHVendorManager.clear_cache() method
159
        manager.clear_cache()
2221.5.6 by Dmitry Vasiliev
Changed tests to make sure the vendor manager returns the same object as was registered
160
        vendor = object()
161
        manager.register_vendor("vendor", vendor)
7358.9.2 by Jelmer Vernooij
Add test.
162
        self.overrideEnv('BRZ_SSH', 'vendor')
163
        self.assertIs(manager.get_vendor(), vendor)
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
164
2221.5.17 by Dmitry Vasiliev
Added comments for test_get_vendor_search_order
165
        # Last cached value always checked first
7358.9.2 by Jelmer Vernooij
Add test.
166
        self.overrideEnv('BRZ_SSH', 'vendor')
167
        self.assertIs(manager.get_vendor(), vendor)
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
168
4595.17.1 by Martin
Add ability to give a path to a particular ssh client in BZR_SSH envvar
169
    def test_get_vendor_from_path_win32_plink(self):
170
        manager = TestSSHVendorManager()
171
        manager.set_ssh_version_string("plink: Release 0.60")
172
        plink_path = "C:/Program Files/PuTTY/plink.exe"
7358.9.2 by Jelmer Vernooij
Add test.
173
        self.overrideEnv('BRZ_SSH', plink_path)
174
        vendor = manager.get_vendor()
4595.17.1 by Martin
Add ability to give a path to a particular ssh client in BZR_SSH envvar
175
        self.assertIsInstance(vendor, PLinkSubprocessVendor)
176
        args = vendor._get_vendor_specific_argv("user", "host", 22, ["bzr"])
177
        self.assertEqual(args[0], plink_path)
178
179
    def test_get_vendor_from_path_nix_openssh(self):
180
        manager = TestSSHVendorManager()
181
        manager.set_ssh_version_string(
182
            "OpenSSH_5.1p1 Debian-5, OpenSSL, 0.9.8g 19 Oct 2007")
183
        openssh_path = "/usr/bin/ssh"
7358.9.2 by Jelmer Vernooij
Add test.
184
        self.overrideEnv('BRZ_SSH', openssh_path)
185
        vendor = manager.get_vendor()
4595.17.1 by Martin
Add ability to give a path to a particular ssh client in BZR_SSH envvar
186
        self.assertIsInstance(vendor, OpenSSHSubprocessVendor)
187
        args = vendor._get_vendor_specific_argv("user", "host", 22, ["bzr"])
188
        self.assertEqual(args[0], openssh_path)
189
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
190
191
class SubprocessVendorsTests(TestCase):
192
6753.1.1 by Jelmer Vernooij
Refuse to connect to ssh hostnames starting with a dash. Fixes LP:1710979
193
    def test_openssh_command_tricked(self):
194
        vendor = OpenSSHSubprocessVendor()
195
        self.assertEqual(
196
            vendor._get_vendor_specific_argv(
197
                "user", "-oProxyCommand=blah", 100, command=["bzr"]),
198
            ["ssh", "-oForwardX11=no", "-oForwardAgent=no",
199
                "-oClearAllForwardings=yes",
200
                "-oNoHostAuthenticationForLocalhost=yes",
201
                "-p", "100",
202
                "-l", "user",
203
                "--",
204
                "-oProxyCommand=blah", "bzr"])
205
2221.5.3 by Dmitry Vasiliev
Fixed plink's arguments order. Added tests for such a case.
206
    def test_openssh_command_arguments(self):
207
        vendor = OpenSSHSubprocessVendor()
208
        self.assertEqual(
209
            vendor._get_vendor_specific_argv(
210
                "user", "host", 100, command=["bzr"]),
211
            ["ssh", "-oForwardX11=no", "-oForwardAgent=no",
5459.4.1 by Neil Martinsen-Burrell
dont force openssh to use protocol=2
212
                "-oClearAllForwardings=yes",
2221.5.3 by Dmitry Vasiliev
Fixed plink's arguments order. Added tests for such a case.
213
                "-oNoHostAuthenticationForLocalhost=yes",
214
                "-p", "100",
215
                "-l", "user",
6753.1.1 by Jelmer Vernooij
Refuse to connect to ssh hostnames starting with a dash. Fixes LP:1710979
216
                "--",
2221.5.3 by Dmitry Vasiliev
Fixed plink's arguments order. Added tests for such a case.
217
                "host", "bzr"]
218
            )
219
220
    def test_openssh_subsystem_arguments(self):
221
        vendor = OpenSSHSubprocessVendor()
222
        self.assertEqual(
223
            vendor._get_vendor_specific_argv(
224
                "user", "host", 100, subsystem="sftp"),
225
            ["ssh", "-oForwardX11=no", "-oForwardAgent=no",
5459.4.1 by Neil Martinsen-Burrell
dont force openssh to use protocol=2
226
                "-oClearAllForwardings=yes",
2221.5.3 by Dmitry Vasiliev
Fixed plink's arguments order. Added tests for such a case.
227
                "-oNoHostAuthenticationForLocalhost=yes",
228
                "-p", "100",
229
                "-l", "user",
6753.1.1 by Jelmer Vernooij
Refuse to connect to ssh hostnames starting with a dash. Fixes LP:1710979
230
                "-s", "--", "host", "sftp"]
2221.5.3 by Dmitry Vasiliev
Fixed plink's arguments order. Added tests for such a case.
231
            )
232
6753.1.1 by Jelmer Vernooij
Refuse to connect to ssh hostnames starting with a dash. Fixes LP:1710979
233
    def test_openssh_command_tricked(self):
234
        vendor = SSHCorpSubprocessVendor()
235
        self.assertRaises(
236
            StrangeHostname,
237
            vendor._get_vendor_specific_argv,
7143.15.2 by Jelmer Vernooij
Run autopep8.
238
            "user", "-oProxyCommand=host", 100, command=["bzr"])
6753.1.1 by Jelmer Vernooij
Refuse to connect to ssh hostnames starting with a dash. Fixes LP:1710979
239
2221.5.3 by Dmitry Vasiliev
Fixed plink's arguments order. Added tests for such a case.
240
    def test_sshcorp_command_arguments(self):
241
        vendor = SSHCorpSubprocessVendor()
242
        self.assertEqual(
243
            vendor._get_vendor_specific_argv(
244
                "user", "host", 100, command=["bzr"]),
245
            ["ssh", "-x",
246
                "-p", "100",
247
                "-l", "user",
248
                "host", "bzr"]
249
            )
250
251
    def test_sshcorp_subsystem_arguments(self):
252
        vendor = SSHCorpSubprocessVendor()
253
        self.assertEqual(
254
            vendor._get_vendor_specific_argv(
255
                "user", "host", 100, subsystem="sftp"),
256
            ["ssh", "-x",
257
                "-p", "100",
258
                "-l", "user",
259
                "-s", "sftp", "host"]
260
            )
261
6753.1.1 by Jelmer Vernooij
Refuse to connect to ssh hostnames starting with a dash. Fixes LP:1710979
262
    def test_lsh_command_tricked(self):
263
        vendor = LSHSubprocessVendor()
264
        self.assertRaises(
265
            StrangeHostname,
266
            vendor._get_vendor_specific_argv,
7143.15.2 by Jelmer Vernooij
Run autopep8.
267
            "user", "-oProxyCommand=host", 100, command=["bzr"])
6753.1.1 by Jelmer Vernooij
Refuse to connect to ssh hostnames starting with a dash. Fixes LP:1710979
268
5444.2.2 by Matthew Gordon
Added tests for GNU lsh support.
269
    def test_lsh_command_arguments(self):
270
        vendor = LSHSubprocessVendor()
271
        self.assertEqual(
272
            vendor._get_vendor_specific_argv(
273
                "user", "host", 100, command=["bzr"]),
274
            ["lsh",
275
                "-p", "100",
276
                "-l", "user",
277
                "host", "bzr"]
278
            )
279
280
    def test_lsh_subsystem_arguments(self):
281
        vendor = LSHSubprocessVendor()
282
        self.assertEqual(
283
            vendor._get_vendor_specific_argv(
284
                "user", "host", 100, subsystem="sftp"),
285
            ["lsh",
286
                "-p", "100",
287
                "-l", "user",
288
                "--subsystem", "sftp", "host"]
289
            )
290
6753.1.1 by Jelmer Vernooij
Refuse to connect to ssh hostnames starting with a dash. Fixes LP:1710979
291
    def test_plink_command_tricked(self):
292
        vendor = PLinkSubprocessVendor()
293
        self.assertRaises(
294
            StrangeHostname,
295
            vendor._get_vendor_specific_argv,
7143.15.2 by Jelmer Vernooij
Run autopep8.
296
            "user", "-oProxyCommand=host", 100, command=["bzr"])
6753.1.1 by Jelmer Vernooij
Refuse to connect to ssh hostnames starting with a dash. Fixes LP:1710979
297
2221.5.3 by Dmitry Vasiliev
Fixed plink's arguments order. Added tests for such a case.
298
    def test_plink_command_arguments(self):
299
        vendor = PLinkSubprocessVendor()
300
        self.assertEqual(
301
            vendor._get_vendor_specific_argv(
302
                "user", "host", 100, command=["bzr"]),
3220.1.2 by Dmitry Vasiliev
Re-enabled auto-detection of plink vendor and fixed tests
303
            ["plink", "-x", "-a", "-ssh", "-2", "-batch",
2221.5.3 by Dmitry Vasiliev
Fixed plink's arguments order. Added tests for such a case.
304
                "-P", "100",
305
                "-l", "user",
306
                "host", "bzr"]
307
            )
308
309
    def test_plink_subsystem_arguments(self):
310
        vendor = PLinkSubprocessVendor()
311
        self.assertEqual(
312
            vendor._get_vendor_specific_argv(
313
                "user", "host", 100, subsystem="sftp"),
3220.1.2 by Dmitry Vasiliev
Re-enabled auto-detection of plink vendor and fixed tests
314
            ["plink", "-x", "-a", "-ssh", "-2", "-batch",
2221.5.3 by Dmitry Vasiliev
Fixed plink's arguments order. Added tests for such a case.
315
                "-P", "100",
316
                "-l", "user",
317
                "-s", "host", "sftp"]
2221.5.1 by Dmitry Vasiliev
Added support for Putty's SSH implementation
318
            )