Changeset 147:78f3eda1c1f0
- Timestamp:
- 05/05/10 13:27:39 (21 months ago)
- Author:
- Menno Smits <menno@…>
- Branch:
- default
- Message:
-
#21: High ascii bytes in folder names can break folder handling
Don't allow characters in str based folder names that can't be
converted to unicode without knowing the encoding. The idea is that
IMAPClient's user should convert to unicode themselves.
- Files:
-
Legend:
- Unmodified
- Added
- Removed
-
|
r62
|
r147
|
|
| 24 | 24 | |
| 25 | 25 | |
| | 26 | class FolderNameError(ValueError): |
| | 27 | pass |
| | 28 | |
| | 29 | |
| 26 | 30 | def encode(s): |
| | 31 | if isinstance(s, str) and sum(n for n in (ord(c) for c in s) if n > 127): |
| | 32 | raise FolderNameError("%r contains characters not valid in a str folder name. " |
| | 33 | "Convert to unicode first?" % s) |
| | 34 | |
| 27 | 35 | r = [] |
| 28 | 36 | _in = [] |
-
|
r146
|
r147
|
|
| 23 | 23 | # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| 24 | 24 | |
| 25 | | from imapclient.imap_utf7 import decode, encode |
| | 25 | from imapclient.imap_utf7 import decode, encode, FolderNameError |
| 26 | 26 | import unittest |
| 27 | 27 | |
| … |
… |
|
| 38 | 38 | [u'~peter/mail/\u65e5\u672c\u8a9e/\u53f0\u5317', |
| 39 | 39 | '~peter/mail/&ZeVnLIqe-/&U,BTFw-'], # example from RFC 2060 |
| | 40 | ['\x00foo', '&AAA-foo'], |
| 40 | 41 | ] |
| 41 | 42 | |
| … |
… |
|
| 48 | 49 | for (input, output) in self.tests: |
| 49 | 50 | self.assertEquals(input, decode(output)) |
| | 51 | |
| | 52 | |
| | 53 | def test_illegal_chars(self): |
| | 54 | not_valid_as_str = [ |
| | 55 | 'blah' + chr(0x80) + 'sne', |
| | 56 | chr(0xaa) + 'foo', |
| | 57 | 'blah' + chr(0xff) + 'sne'] |
| | 58 | |
| | 59 | for name in not_valid_as_str: |
| | 60 | self.assertRaises(FolderNameError, encode, name) |
| | 61 | |
| | 62 | unicode_names = [unicode(name, 'latin-1') for name in not_valid_as_str] |
| | 63 | for name in unicode_names: |
| | 64 | assert isinstance(encode(name), str) |
| 50 | 65 | |
| 51 | 66 | |
| … |
… |
|
| 62 | 77 | self.failUnlessEqual(decode('&-'), '&') |
| 63 | 78 | |
| | 79 | |
| | 80 | def test_FolderNameError_super(self): |
| | 81 | self.assert_(issubclass(FolderNameError, ValueError)) |
| | 82 | |
| | 83 | |
| 64 | 84 | if __name__ == '__main__': |
| 65 | 85 | unittest.main() |
-
|
r144
|
r147
|
|
| 62 | 62 | def test_list_folders(client): |
| 63 | 63 | clear_folders(client) |
| 64 | | some_folders = ['simple', r'foo\bar', r'test"folder"'] |
| | 64 | some_folders = ['simple', r'foo\bar', r'test"folder"', u'L\xffR'] |
| 65 | 65 | for name in some_folders: |
| 66 | 66 | client.create_folder(name) |