summaryrefslogtreecommitdiff
path: root/addons/document_ftp/ftpserver/ftpserver.py
diff options
context:
space:
mode:
authorP. Christeas <p_christ@hol.gr>2010-07-09 01:52:13 +0300
committerP. Christeas <p_christ@hol.gr>2010-07-09 01:52:13 +0300
commite7d01ae1e35d3c7431ce430714ab878fe1fd8d0d (patch)
treece0b53204b6bbe8977139d195271be7758c6aefd /addons/document_ftp/ftpserver/ftpserver.py
parent819eed88a2f5ca3f633a955f55b0bec5c6bef2eb (diff)
Document FTP: fix walking utf8 paths.
Also fix the error message when rename fails for utf8 filenames. bzr revid: p_christ@hol.gr-20100708225213-fcq2nbgectztjycq
Diffstat (limited to 'addons/document_ftp/ftpserver/ftpserver.py')
-rw-r--r--addons/document_ftp/ftpserver/ftpserver.py20
1 files changed, 17 insertions, 3 deletions
diff --git a/addons/document_ftp/ftpserver/ftpserver.py b/addons/document_ftp/ftpserver/ftpserver.py
index 75ad5b00883..8d3fa4b0531 100644
--- a/addons/document_ftp/ftpserver/ftpserver.py
+++ b/addons/document_ftp/ftpserver/ftpserver.py
@@ -221,6 +221,17 @@ def _strerror(err):
else:
return err.strerror
+def _to_unicode(s):
+ try:
+ return s.decode('utf-8')
+ except UnicodeError:
+ try:
+ return s.decode('latin')
+ except UnicodeError:
+ try:
+ return s.encode('ascii')
+ except UnicodeError:
+ return s
# --- library defined exceptions
@@ -2650,15 +2661,18 @@ class FTPHandler(asynchat.async_chat):
try:
try:
datacr = self.fs.get_crdata(line,'create')
- oldname = '/'.join(self.fs.rnfr.path)
+ oldname = self.fs.rnfr.path
+ if isinstance(oldname, (list, tuple)):
+ oldname = '/'.join(oldname)
self.run_as_current_user(self.fs.rename, self.fs.rnfr, datacr)
self.fs.rnfr = None
- self.log('OK RNFR/RNTO "%s ==> %s".' %(oldname, line))
+ self.log('OK RNFR/RNTO "%s ==> %s".' % \
+ (_to_unicode(oldname), _to_unicode(line)))
self.respond("250 Renaming ok.")
except EnvironmentError, err:
why = _strerror(err)
self.log('FAIL RNFR/RNTO "%s ==> %s". %s.' \
- %(self.fs.ftpnorm(self.fs.rnfr), line, why))
+ % (_to_unicode(oldname), _to_unicode(line), why))
self.respond('550 %s.' %why)
finally:
self.fs.rnfr = None