~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/ssh.py

  • Committer: Robert Collins
  • Date: 2009-05-11 01:59:06 UTC
  • mto: This revision was merged to the branch mainline in revision 4593.
  • Revision ID: robertc@robertcollins.net-20090511015906-6zi6a9b8tuuhipc8
Less lock thrashing in check.py.

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
 
20
20
import errno
21
21
import getpass
22
 
import logging
23
22
import os
24
23
import socket
25
24
import subprocess
123
122
        elif 'SSH Secure Shell' in version:
124
123
            trace.mutter('ssh implementation is SSH Corp.')
125
124
            vendor = SSHCorpSubprocessVendor()
126
 
        # Auto-detect of plink vendor disabled, on Windows recommended
127
 
        # default ssh-client is paramiko
128
 
        # see https://bugs.launchpad.net/bugs/414743
129
 
        #~elif 'plink' in version and args[0] == 'plink':
130
 
        #~    # Checking if "plink" was the executed argument as Windows
131
 
        #~    # sometimes reports 'ssh -V' incorrectly with 'plink' in it's
132
 
        #~    # version.  See https://bugs.launchpad.net/bzr/+bug/107155
133
 
        #~    trace.mutter("ssh implementation is Putty's plink.")
134
 
        #~    vendor = PLinkSubprocessVendor()
 
125
        elif 'plink' in version and args[0] == 'plink':
 
126
            # Checking if "plink" was the executed argument as Windows
 
127
            # sometimes reports 'ssh -V' incorrectly with 'plink' in it's
 
128
            # version.  See https://bugs.launchpad.net/bzr/+bug/107155
 
129
            trace.mutter("ssh implementation is Putty's plink.")
 
130
            vendor = PLinkSubprocessVendor()
135
131
        return vendor
136
132
 
137
133
    def _get_vendor_by_inspection(self):
485
481
    if _try_pkey_auth(paramiko_transport, paramiko.DSSKey, username, 'id_dsa'):
486
482
        return
487
483
 
488
 
    # If we have gotten this far, we are about to try for passwords, do an
489
 
    # auth_none check to see if it is even supported.
490
 
    supported_auth_types = []
491
 
    try:
492
 
        # Note that with paramiko <1.7.5 this logs an INFO message:
493
 
        #    Authentication type (none) not permitted.
494
 
        # So we explicitly disable the logging level for this action
495
 
        old_level = paramiko_transport.logger.level
496
 
        paramiko_transport.logger.setLevel(logging.WARNING)
497
 
        try:
498
 
            paramiko_transport.auth_none(username)
499
 
        finally:
500
 
            paramiko_transport.logger.setLevel(old_level)
501
 
    except paramiko.BadAuthenticationType, e:
502
 
        # Supported methods are in the exception
503
 
        supported_auth_types = e.allowed_types
504
 
    except paramiko.SSHException, e:
505
 
        # Don't know what happened, but just ignore it
506
 
        pass
507
 
    if 'password' not in supported_auth_types:
508
 
        raise errors.ConnectionError('Unable to authenticate to SSH host as'
509
 
            '\n  %s@%s\nsupported auth types: %s'
510
 
            % (username, host, supported_auth_types))
511
 
 
512
484
    if password:
513
485
        try:
514
486
            paramiko_transport.auth_password(username, password)
518
490
 
519
491
    # give up and ask for a password
520
492
    password = auth.get_password('ssh', host, username, port=port)
521
 
    # get_password can still return None, which means we should not prompt
522
 
    if password is not None:
523
 
        try:
524
 
            paramiko_transport.auth_password(username, password)
525
 
        except paramiko.SSHException, e:
526
 
            raise errors.ConnectionError(
527
 
                'Unable to authenticate to SSH host as'
528
 
                '\n  %s@%s\n' % (username, host), e)
529
 
    else:
530
 
        raise errors.ConnectionError('Unable to authenticate to SSH host as'
531
 
                                     '  %s@%s' % (username, host))
 
493
    try:
 
494
        paramiko_transport.auth_password(username, password)
 
495
    except paramiko.SSHException, e:
 
496
        raise errors.ConnectionError(
 
497
            'Unable to authenticate to SSH host as %s@%s' % (username, host), e)
532
498
 
533
499
 
534
500
def _try_pkey_auth(paramiko_transport, pkey_class, username, filename):