Add decodefoldernames option to decode IMAP folder names using UTF-7.
Signed-off-by: Tommie Gannert <tommie@gannert.se>
This commit is contained in:
		@@ -762,6 +762,20 @@ remoteuser = username
 | 
				
			|||||||
#reference = Mail
 | 
					#reference = Mail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# This option stands in the [Repository RemoteExample] section.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# IMAP defines an encoding for non-ASCII ("international") characters. Enable
 | 
				
			||||||
 | 
					# this option if you want to decode them to the nowadays ubiquitous UTF-8.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Note that the IMAP 4rev1 specification (RFC 3501) allows both UTF-8 and
 | 
				
			||||||
 | 
					# modified UTF-7 folder names.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This option is disabled by default to retain compatibility with older versions
 | 
				
			||||||
 | 
					# of offlineimap.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#decodefoldernames = no
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# This option stands in the [Repository RemoteExample] section.
 | 
					# This option stands in the [Repository RemoteExample] section.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# In between synchronisations, OfflineIMAP can monitor mailboxes for new
 | 
					# In between synchronisations, OfflineIMAP can monitor mailboxes for new
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -258,6 +258,13 @@ class IMAPFolder(BaseFolder):
 | 
				
			|||||||
    def dropmessagelistcache(self):
 | 
					    def dropmessagelistcache(self):
 | 
				
			||||||
        self.messagelist = {}
 | 
					        self.messagelist = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Interface from BaseFolder
 | 
				
			||||||
 | 
					    def getvisiblename(self):
 | 
				
			||||||
 | 
					        vname = super(IMAPFolder, self).getvisiblename()
 | 
				
			||||||
 | 
					        if self.repository.getdecodefoldernames():
 | 
				
			||||||
 | 
					            return imaputil.decode_mailbox_name(vname)
 | 
				
			||||||
 | 
					        return vname
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Interface from BaseFolder
 | 
					    # Interface from BaseFolder
 | 
				
			||||||
    def getmessagelist(self):
 | 
					    def getmessagelist(self):
 | 
				
			||||||
        return self.messagelist
 | 
					        return self.messagelist
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,6 +25,9 @@ from offlineimap.ui import getglobalui
 | 
				
			|||||||
# Message headers that use space as the separator (for label storage)
 | 
					# Message headers that use space as the separator (for label storage)
 | 
				
			||||||
SPACE_SEPARATED_LABEL_HEADERS = ('X-Label', 'Keywords')
 | 
					SPACE_SEPARATED_LABEL_HEADERS = ('X-Label', 'Keywords')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Find the modified UTF-7 shifts of an international mailbox name.
 | 
				
			||||||
 | 
					MUTF7_SHIFT_RE = re.compile(r'&[^-]*-|\+')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def __debug(*args):
 | 
					def __debug(*args):
 | 
				
			||||||
    msg = []
 | 
					    msg = []
 | 
				
			||||||
@@ -328,3 +331,28 @@ def labels_from_header(header_name, header_value):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return labels
 | 
					    return labels
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def decode_mailbox_name(name):
 | 
				
			||||||
 | 
					    """Decodes a modified UTF-7 mailbox name.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    If the string cannot be decoded, it is returned unmodified.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    See RFC 3501, sec. 5.1.3.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Arguments:
 | 
				
			||||||
 | 
					    - name: string, possibly encoded with modified UTF-7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Returns: decoded UTF-8 string.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    def demodify(m):
 | 
				
			||||||
 | 
					        s = m.group()
 | 
				
			||||||
 | 
					        if s == '+':
 | 
				
			||||||
 | 
					            return '+-'
 | 
				
			||||||
 | 
					        return '+' + s[1:-1].replace(',', '/') + '-'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = MUTF7_SHIFT_RE.sub(demodify, name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        return ret.decode('utf-7').encode('utf-8')
 | 
				
			||||||
 | 
					    except UnicodeEncodeError:
 | 
				
			||||||
 | 
					        return name
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -261,6 +261,9 @@ class IMAPRepository(BaseRepository):
 | 
				
			|||||||
    def getreference(self):
 | 
					    def getreference(self):
 | 
				
			||||||
        return self.getconf('reference', '')
 | 
					        return self.getconf('reference', '')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def getdecodefoldernames(self):
 | 
				
			||||||
 | 
					        return self.getconfboolean('decodefoldernames', 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def getidlefolders(self):
 | 
					    def getidlefolders(self):
 | 
				
			||||||
        localeval = self.localeval
 | 
					        localeval = self.localeval
 | 
				
			||||||
        return localeval.eval(self.getconf('idlefolders', '[]'))
 | 
					        return localeval.eval(self.getconf('idlefolders', '[]'))
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user