From 173be44150448b48acc17a641640797c14aee237 Mon Sep 17 00:00:00 2001 From: "P. Christeas" Date: Fri, 9 Jul 2010 01:54:33 +0300 Subject: [PATCH] Document ftp: fix unicode in NLST At the nlst command, the paths from the API could have been unicode, in which case the '\r\n' separator would be sent as '\00\r\00\n' over the wire (that's utf-16 encoding). For that, bring the utf-8 conversion functions inside ftpserver. bzr revid: p_christ@hol.gr-20100708225433-fqpl911kqfsrm1ff --- .../document_ftp/ftpserver/abstracted_fs.py | 23 +------------ addons/document_ftp/ftpserver/ftpserver.py | 32 ++++++++++++++----- 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/addons/document_ftp/ftpserver/abstracted_fs.py b/addons/document_ftp/ftpserver/abstracted_fs.py index 318957e68fa..4f0428ecb02 100644 --- a/addons/document_ftp/ftpserver/abstracted_fs.py +++ b/addons/document_ftp/ftpserver/abstracted_fs.py @@ -34,29 +34,8 @@ def _get_month_name(month): elif month==11:return 'Nov' elif month==12:return 'Dec' -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 +from ftpserver import _to_decode, _to_unicode -def _to_decode(s): - try: - return s.encode('utf-8') - except UnicodeError: - try: - return s.encode('latin') - except UnicodeError: - try: - return s.decode('ascii') - except UnicodeError: - return s class abstracted_fs(object): """A class used to interact with the file system, providing a high diff --git a/addons/document_ftp/ftpserver/ftpserver.py b/addons/document_ftp/ftpserver/ftpserver.py index 8d3fa4b0531..e267216ddec 100644 --- a/addons/document_ftp/ftpserver/ftpserver.py +++ b/addons/document_ftp/ftpserver/ftpserver.py @@ -225,13 +225,29 @@ 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 + pass + try: + return s.decode('latin') + except UnicodeError: + pass + try: + return s.encode('ascii') + except UnicodeError: + return s + +def _to_decode(s): + try: + return s.encode('utf-8') + except UnicodeError: + pass + try: + return s.encode('latin') + except UnicodeError: + pass + try: + return s.decode('ascii') + except UnicodeError: + return s # --- library defined exceptions @@ -2080,7 +2096,7 @@ class FTPHandler(asynchat.async_chat): data = '' if listing: listing.sort() - data = '\r\n'.join(listing) + '\r\n' + data = ''.join([ _to_decode(x) + '\r\n' for x in listing ]) self.log('OK NLST "%s". Transfer starting.' %line) self.push_dtp_data(data)