Title: imaplib: must not replace LF or CR by CRLF in literals
Type: behavior Stage: test needed
Components: email, Library (Lib) Versions: Python 2.7, Python 2.6
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: barry, mcepl, memeplex, r.david.murray, rajeshsr, ron.duplain
Priority: normal Keywords: easy, patch

Created on 2009-03-06 07:51 by memeplex, last changed 2017-10-23 16:03 by mcepl.

File name Uploaded Description Edit
test_imaplib_cr_lf.diff ron.duplain, 2009-04-26 20:21 an attempt at testing IMAP4.append for CR, LF preservation review
Messages (4)
msg83241 - (view) Author: Memeplex (memeplex) Date: 2009-03-06 07:51
For example, after that "normalization", quoted printable encoded
headers (as described at rfc 2047) longer than 76 characters are
splitted in two different ill-formed headers because the soft LF line
break becomes a "hard" CRLF one. This is clearly wrong.

rfc 2060 specifically allows CR and LF inside literals:

A literal is a sequence of zero or more octets (including CR and LF),
prefix-quoted with an octet count in the form of an open brace ("{"),
the number of octets, close brace ("}"), and CRLF.
msg86572 - (view) Author: Ron DuPlain (ron.duplain) * (Python committer) Date: 2009-04-25 23:38
It looks like the IMAP4.append method is responsible for the CRLF
substitution (trunk/Lib/

# defined near top of module:
MapCRLF = re.compile(r'\r\n|\r|\n')

# in append method:
self.literal = MapCRLF.sub(CRLF, message)

I'll work on a test for it this evening.

msg86602 - (view) Author: Ron DuPlain (ron.duplain) * (Python committer) Date: 2009-04-26 20:21
Module imaplib has pretty sparse test code.  There is only 1 test case,
for imaplib.Time2Internaldate.

The attached patch tests for LF, CR preservation with regard to the
IMAP4.append method, but more testing is necessary to make sure LF, CR
are preserved in IMAP literals throughout imaplib and that the
respective fix doesn't break anything.  Mock IMAP interaction may be the
way to go for better test cases.  Is anyone working on expanding imaplib
test coverage?

msg94578 - (view) Author: Rajesh S R (rajeshsr) Date: 2009-10-27 20:32
Am quite new here; just searching hard to contribute, would like to
patch this, if I can go ahead.

Don't we need to patch the original imaplib code also?

just remove the line:
self.literal = MapCRLF.sub(CRLF, message)
and have:
self.literal = message
Or am I missing something completely?
Date User Action Args
2017-10-23 16:03:20mceplsetnosy: + mcepl
2013-01-23 15:03:21r.david.murraysetnosy: + barry, r.david.murray
components: + email
2009-10-27 20:32:57rajeshsrsetnosy: + rajeshsr
messages: + msg94578
2009-04-26 20:21:12ron.duplainsetfiles: + test_imaplib_cr_lf.diff
keywords: + patch
messages: + msg86602

versions: + Python 2.7
2009-04-25 23:38:47ron.duplainsetnosy: + ron.duplain
messages: + msg86572
2009-04-22 14:38:28ajaksu2setkeywords: + easy
stage: test needed
2009-03-06 07:52:05memeplexsettitle: Must not replace LF or CR by CRLF in literals -> imaplib: must not replace LF or CR by CRLF in literals
2009-03-06 07:51:15memeplexcreate