[project @ Arch-1:robey@lag.net--2005-master-shake%paramiko--dev--1--patch-44]
try to handle utf8 paths in a sane way in SFTPClient: assume incoming strings are already utf8, and encode incoming unicodes -- for return values, use str if an ascii encoding will work, otherwise return a unicode
This commit is contained in:
parent
a22719c338
commit
f27e625926
2
README
2
README
|
@ -238,6 +238,8 @@ v0.9 FEAROW
|
||||||
|
|
||||||
* ctr forms of ciphers are missing (blowfish-ctr, aes128-ctr, aes256-ctr)
|
* ctr forms of ciphers are missing (blowfish-ctr, aes128-ctr, aes256-ctr)
|
||||||
|
|
||||||
|
* could channels have a __del__ if i used weak pointers?
|
||||||
|
|
||||||
* cool sftp extension: retreive MD5 or SHA1 of section of a file
|
* cool sftp extension: retreive MD5 or SHA1 of section of a file
|
||||||
* SFTPClient.from_url('sftp://robey@arch.lag.net/folder/filename', 'r+')
|
* SFTPClient.from_url('sftp://robey@arch.lag.net/folder/filename', 'r+')
|
||||||
keep cache of opened sftp clients by (host, port, username)
|
keep cache of opened sftp clients by (host, port, username)
|
||||||
|
|
|
@ -26,6 +26,14 @@ from sftp_attr import SFTPAttributes
|
||||||
from sftp_file import SFTPFile
|
from sftp_file import SFTPFile
|
||||||
|
|
||||||
|
|
||||||
|
def _to_unicode(s):
|
||||||
|
"if a str is not ascii, decode its utf8 into unicode"
|
||||||
|
try:
|
||||||
|
return s.encode('ascii')
|
||||||
|
except:
|
||||||
|
return s.decode('utf-8')
|
||||||
|
|
||||||
|
|
||||||
class SFTPClient (BaseSFTP):
|
class SFTPClient (BaseSFTP):
|
||||||
"""
|
"""
|
||||||
SFTP client object. C{SFTPClient} is used to open an sftp session across
|
SFTP client object. C{SFTPClient} is used to open an sftp session across
|
||||||
|
@ -127,8 +135,8 @@ class SFTPClient (BaseSFTP):
|
||||||
raise SFTPError('Expected name response')
|
raise SFTPError('Expected name response')
|
||||||
count = msg.get_int()
|
count = msg.get_int()
|
||||||
for i in range(count):
|
for i in range(count):
|
||||||
filename = msg.get_string()
|
filename = _to_unicode(msg.get_string())
|
||||||
longname = msg.get_string()
|
longname = _to_unicode(msg.get_string())
|
||||||
attr = SFTPAttributes._from_msg(msg, filename)
|
attr = SFTPAttributes._from_msg(msg, filename)
|
||||||
if (filename != '.') and (filename != '..'):
|
if (filename != '.') and (filename != '..'):
|
||||||
filelist.append(attr)
|
filelist.append(attr)
|
||||||
|
@ -296,6 +304,8 @@ class SFTPClient (BaseSFTP):
|
||||||
@type dest: string
|
@type dest: string
|
||||||
"""
|
"""
|
||||||
dest = self._adjust_cwd(dest)
|
dest = self._adjust_cwd(dest)
|
||||||
|
if type(source) is unicode:
|
||||||
|
source = source.encode('utf-8')
|
||||||
self._request(CMD_SYMLINK, source, dest)
|
self._request(CMD_SYMLINK, source, dest)
|
||||||
|
|
||||||
def chmod(self, path, mode):
|
def chmod(self, path, mode):
|
||||||
|
@ -375,7 +385,7 @@ class SFTPClient (BaseSFTP):
|
||||||
return None
|
return None
|
||||||
if count != 1:
|
if count != 1:
|
||||||
raise SFTPError('Readlink returned %d results' % count)
|
raise SFTPError('Readlink returned %d results' % count)
|
||||||
return msg.get_string()
|
return _to_unicode(msg.get_string())
|
||||||
|
|
||||||
def normalize(self, path):
|
def normalize(self, path):
|
||||||
"""
|
"""
|
||||||
|
@ -398,7 +408,7 @@ class SFTPClient (BaseSFTP):
|
||||||
count = msg.get_int()
|
count = msg.get_int()
|
||||||
if count != 1:
|
if count != 1:
|
||||||
raise SFTPError('Realpath returned %d results' % count)
|
raise SFTPError('Realpath returned %d results' % count)
|
||||||
return msg.get_string()
|
return _to_unicode(msg.get_string())
|
||||||
|
|
||||||
def chdir(self, path):
|
def chdir(self, path):
|
||||||
"""
|
"""
|
||||||
|
@ -533,6 +543,8 @@ class SFTPClient (BaseSFTP):
|
||||||
Return an adjusted path if we're emulating a "current working
|
Return an adjusted path if we're emulating a "current working
|
||||||
directory" for the server.
|
directory" for the server.
|
||||||
"""
|
"""
|
||||||
|
if type(path) is unicode:
|
||||||
|
path = path.encode('utf-8')
|
||||||
if self._cwd is None:
|
if self._cwd is None:
|
||||||
return path
|
return path
|
||||||
if (len(path) > 0) and (path[0] == '/'):
|
if (len(path) > 0) and (path[0] == '/'):
|
||||||
|
|
Loading…
Reference in New Issue