From 6e9abc39cfff94e0dc36ebe6b939caa8d2eafee0 Mon Sep 17 00:00:00 2001 From: Jeff Forcier Date: Wed, 16 Apr 2014 15:07:56 -0400 Subject: Fix logging error in sftp_client for filenames containing the character. Bug reported here: http://vlists.pepperfish.net/pipermail/obnam-flarn.net/2013-May/000767.html Antoine Brenner Backported to 1.11 by @bitprophet Conflicts: paramiko/sftp_client.py sites/www/changelog.rst tests/test_sftp.py --- paramiko/sftp_client.py | 6 ++++-- sites/www/changelog.rst | 2 ++ tests/test_sftp.py | 23 +++++++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/paramiko/sftp_client.py b/paramiko/sftp_client.py index 13e830c4..907ec413 100644 --- a/paramiko/sftp_client.py +++ b/paramiko/sftp_client.py @@ -105,9 +105,11 @@ class SFTPClient(BaseSFTP): def _log(self, level, msg, *args): if isinstance(msg, list): for m in msg: - super(SFTPClient, self)._log(level, "[chan %s] " + m, *([ self.sock.get_name() ] + list(args))) + self._log(level, m, *args) else: - super(SFTPClient, self)._log(level, "[chan %s] " + msg, *([ self.sock.get_name() ] + list(args))) + # escape '%' in msg (they could come from file or directory names) before logging + msg = msg.replace('%','%%') + super(SFTPClient, self)._log(level, "[chan %s] " + msg, *([self.sock.get_name()] + list(args))) def close(self): """ diff --git a/sites/www/changelog.rst b/sites/www/changelog.rst index cf5c142b..a7d9f93d 100644 --- a/sites/www/changelog.rst +++ b/sites/www/changelog.rst @@ -2,6 +2,8 @@ Changelog ========= +* :bug:`-` Fix logging error in sftp_client for filenames containing the '%' + character. Thanks to Antoine Brenner. * :support:`284` Add Python language trove identifiers to ``setup.py``. Thanks to Alex Gaynor for catch & patch. * :bug:`235` Improve string type testing in a handful of spots (e.g. ``s/if diff --git a/tests/test_sftp.py b/tests/test_sftp.py index cc512c18..a136f823 100755 --- a/tests/test_sftp.py +++ b/tests/test_sftp.py @@ -36,6 +36,7 @@ import StringIO import paramiko from stub_sftp import StubServer, StubSFTPServer from loop import LoopSocket +import paramiko.util from paramiko.sftp_attr import SFTPAttributes ARTICLE = ''' @@ -738,3 +739,25 @@ class SFTPTest (unittest.TestCase): self.assertNotEqual(attrs, None) finally: sftp.remove(target) + + + def test_N_file_with_percent(self): + """ + verify that we can create a file with a '%' in the filename. + ( it needs to be properly escaped by _log() ) + """ + self.assertTrue( paramiko.util.get_logger("paramiko").handlers, "This unit test requires logging to be enabled" ) + f = sftp.open(FOLDER + '/test%file', 'w') + try: + self.assertEqual(f.stat().st_size, 0) + finally: + f.close() + sftp.remove(FOLDER + '/test%file') + + +if __name__ == '__main__': + SFTPTest.init_loopback() + # logging is required by test_N_file_with_percent + paramiko.util.log_to_file('test_sftp.log') + from unittest import main + main() -- cgit v1.2.3