Fix improper header separator for X-OfflineIMAP header

For servers without UIDPLUS we are inserting additional header
just after transformation '\n' -> CRLF was done.  addmessageheaders()
was written to work with just '\n' as the separator, so X-OfflineIMAP
header wasn't preceeded by the CRLF, but just by '\n'.

Signed-off-by: Eygene Ryabinkin <rea@codelabs.ru>
This commit is contained in:
Eygene Ryabinkin 2014-06-01 22:09:44 +04:00
parent 7770b5ff73
commit e8db1217d4
5 changed files with 29 additions and 10 deletions

View File

@ -5,7 +5,15 @@ ChangeLog
:website: http://offlineimap.org :website: http://offlineimap.org
OfflineIMAP v6.5.6 (YYYY-MM-DD) OfflineIMAP v6.5.6.1 (YYYY-MM-DD)
=================================
* Fix mangled message headers for servers without UIDPLUS:
X-OfflineIMAP was added with preceeding '\n' instead of
'\r\n' just before message was uploaded to the IMAP server.
OfflineIMAP v6.5.6 (2014-05-14)
=============================== ===============================
* Fix IDLE mode regression (it didn't worked) introduced * Fix IDLE mode regression (it didn't worked) introduced

View File

@ -413,16 +413,26 @@ next line\n
""" """
def addmessageheader(self, content, headername, headervalue): def addmessageheader(self, content, crlf, headername, headervalue):
"""
Adds new header to the provided message.
Arguments:
- content: message content, headers and body as a single string
- crlf: string that carries line ending
- headername: name of the header to add
- headervalue: value of the header to add
"""
self.ui.debug('', self.ui.debug('',
'addmessageheader: called to add %s: %s' % (headername, 'addmessageheader: called to add %s: %s' % (headername,
headervalue)) headervalue))
prefix = '\n' prefix = crlf
suffix = '' suffix = ''
insertionpoint = content.find('\n\n') insertionpoint = content.find(crlf + crlf)
if insertionpoint == 0 or insertionpoint == -1: if insertionpoint == 0 or insertionpoint == -1:
prefix = '' prefix = ''
suffix = '\n' suffix = crlf
if insertionpoint == -1: if insertionpoint == -1:
insertionpoint = 0 insertionpoint = 0
# When body starts immediately, without preceding '\n' # When body starts immediately, without preceding '\n'
@ -430,8 +440,8 @@ next line\n
# we seen many broken ones), we should add '\n' to make # we seen many broken ones), we should add '\n' to make
# new (and the only header, in this case) to be properly # new (and the only header, in this case) to be properly
# separated from the message body. # separated from the message body.
if content[0] != '\n': if content[0:len(crlf)] != crlf:
suffix = suffix + '\n' suffix = suffix + crlf
self.ui.debug('', 'addmessageheader: insertionpoint = %d' % insertionpoint) self.ui.debug('', 'addmessageheader: insertionpoint = %d' % insertionpoint)
headers = content[0:insertionpoint] headers = content[0:insertionpoint]

View File

@ -93,7 +93,7 @@ class GmailFolder(IMAPFolder):
labels = set() labels = set()
labels = labels - self.ignorelabels labels = labels - self.ignorelabels
labels_str = imaputil.format_labels_string(self.labelsheader, sorted(labels)) labels_str = imaputil.format_labels_string(self.labelsheader, sorted(labels))
body = self.addmessageheader(body, self.labelsheader, labels_str) body = self.addmessageheader(body, '\n', self.labelsheader, labels_str)
if len(body)>200: if len(body)>200:
dbg_output = "%s...%s" % (str(body)[:150], str(body)[-50:]) dbg_output = "%s...%s" % (str(body)[:150], str(body)[-50:])

View File

@ -141,7 +141,7 @@ class GmailMaildirFolder(MaildirFolder):
# Change labels into content # Change labels into content
labels_str = imaputil.format_labels_string(self.labelsheader, labels_str = imaputil.format_labels_string(self.labelsheader,
sorted(labels | ignoredlabels)) sorted(labels | ignoredlabels))
content = self.addmessageheader(content, self.labelsheader, labels_str) content = self.addmessageheader(content, '\n', self.labelsheader, labels_str)
rtime = self.messagelist[uid].get('rtime', None) rtime = self.messagelist[uid].get('rtime', None)
# write file with new labels to a unique file in tmp # write file with new labels to a unique file in tmp

View File

@ -526,6 +526,7 @@ class IMAPFolder(BaseFolder):
# NB: imapobj to None. # NB: imapobj to None.
try: try:
while retry_left: while retry_left:
# XXX: we can mangle message only once, out of the loop
# UIDPLUS extension provides us with an APPENDUID response. # UIDPLUS extension provides us with an APPENDUID response.
use_uidplus = 'UIDPLUS' in imapobj.capabilities use_uidplus = 'UIDPLUS' in imapobj.capabilities
@ -535,7 +536,7 @@ class IMAPFolder(BaseFolder):
content) content)
self.ui.debug('imap', 'savemessage: header is: %s: %s' %\ self.ui.debug('imap', 'savemessage: header is: %s: %s' %\
(headername, headervalue)) (headername, headervalue))
content = self.addmessageheader(content, headername, headervalue) content = self.addmessageheader(content, CRLF, headername, headervalue)
if len(content)>200: if len(content)>200:
dbg_output = "%s...%s" % (content[:150], content[-50:]) dbg_output = "%s...%s" % (content[:150], content[-50:])