~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/sftp.py

[merge] fix sftp selftest and parsing of passwords in sftp urls

Show diffs side-by-side

added added

removed removed

Lines of Context:
84
84
    Transport implementation for SFTP access.
85
85
    """
86
86
 
87
 
    _url_matcher = re.compile(r'^sftp://([^@]*@)?(.*?)(:\d+)?(/.*)?$')
 
87
    _url_matcher = re.compile(r'^sftp://([^:@]*(:[^@]*)?@)?(.*?)(:\d+)?(/.*)?$')
88
88
    
89
89
    def __init__(self, base, clone_from=None):
90
90
        assert base.startswith('sftp://')
344
344
        m = self._url_matcher.match(url)
345
345
        if m is None:
346
346
            raise SFTPTransportError('Unable to parse SFTP URL %r' % (url,))
347
 
        self._username, self._host, self._port, self._path = m.groups()
 
347
        self._username, self._password, self._host, self._port, self._path = m.groups()
348
348
        if self._username is None:
349
349
            self._username = getpass.getuser()
350
350
        else:
351
351
            self._username = self._username[:-1]
 
352
        if self._password:
 
353
            self._password = self._password[1:]
 
354
            self._username = self._username[len(self._password)+1:]
352
355
        if self._port is None:
353
356
            self._port = 22
354
357
        else:
415
418
        if self._try_pkey_auth(transport, paramiko.DSSKey, 'id_dsa'):
416
419
            return
417
420
 
 
421
        if self._password:
 
422
            try:
 
423
                transport.auth_password(self._username, self._password)
 
424
                return
 
425
            except paramiko.SSHException, e:
 
426
                pass
 
427
 
418
428
        # give up and ask for a password
419
429
        password = getpass.getpass('SSH %s@%s password: ' % (self._username, self._host))
420
430
        try: