def check_host(hostname, username=None, password=None, namespace=None): """ Checks if we can connect to a host with a known key. This will raise an exception if we cannot connect to the host. The exception will be one of BadHostKeyError, UnknownHostKeyError, or SCMError. """ from django.conf import settings client = SSHClient(namespace=namespace) client.set_missing_host_key_policy(RaiseUnknownHostKeyPolicy()) kwargs = {} # We normally want to notify on unknown host keys, but not when running # unit tests. if getattr(settings, 'RUNNING_TEST', False): client.set_missing_host_key_policy(paramiko.WarningPolicy()) kwargs['allow_agent'] = False try: client.connect(hostname, username=username, password=password, pkey=client.get_user_key(), **kwargs) except paramiko.BadHostKeyException, e: raise BadHostKeyError(e.hostname, e.key, e.expected_key)
def check_host(netloc, username=None, password=None, namespace=None): """ Checks if we can connect to a host with a known key. This will raise an exception if we cannot connect to the host. The exception will be one of BadHostKeyError, UnknownHostKeyError, or SCMError. """ from django.conf import settings client = SSHClient(namespace=namespace) client.set_missing_host_key_policy(RaiseUnknownHostKeyPolicy()) kwargs = {} if ':' in netloc: hostname, port = netloc.split(':') try: port = int(port) except ValueError: raise SSHInvalidPortError(port) else: hostname = netloc port = SSH_PORT # We normally want to notify on unknown host keys, but not when running # unit tests. if getattr(settings, 'RUNNING_TEST', False): client.set_missing_host_key_policy(paramiko.WarningPolicy()) kwargs['allow_agent'] = False try: client.connect(hostname, port, username=username, password=password, pkey=client.get_user_key(), **kwargs) except paramiko.BadHostKeyException as e: raise BadHostKeyError(e.hostname, e.key, e.expected_key) except paramiko.AuthenticationException as e: # Some AuthenticationException instances have allowed_types set, # and some don't. allowed_types = getattr(e, 'allowed_types', []) if 'publickey' in allowed_types: key = client.get_user_key() else: key = None raise SSHAuthenticationError(allowed_types=allowed_types, user_key=key) except paramiko.SSHException as e: msg = six.text_type(e) if msg == 'No authentication methods available': raise SSHAuthenticationError else: raise SSHError(msg)
def test_post_with_bad_host_key(self): """Testing the POST repositories/ API with Bad Host Key error""" self.spy_on(TestTool.check_repository, owner=TestTool, op=kgb.SpyOpRaise(BadHostKeyError('example.com', key1, key2))) rsp = self._post_repository(expected_status=403) self.assertEqual(rsp['stat'], 'fail') self.assertEqual(rsp['err']['code'], BAD_HOST_KEY.code) self.assertIn('hostname', rsp) self.assertIn('expected_key', rsp) self.assertIn('key', rsp) self.assertEqual(rsp['hostname'], 'example.com') self.assertEqual(rsp['expected_key'], key2.get_base64()) self.assertEqual(rsp['key'], key1.get_base64())
def _check_repository(cls, *args, **kwargs): if not saw['replace_host_key']: raise BadHostKeyError(hostname, key, expected_key)
def _check_repository(cls, *args, **kwargs): raise BadHostKeyError(hostname, key, expected_key)
def _check_repository(cls, *args, **kwargs): if not SSHClient.replace_host_key.called: raise BadHostKeyError('example.com', key1, key2)