summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbwarsaw2002-11-12 22:51:28 +0000
committerbwarsaw2002-11-12 22:51:28 +0000
commitaf6cb3e9ee6b7e06683709af0107283c1e9bd5d5 (patch)
tree4ff3c5760479cc59a0a2b6fc60be188cde753909
parent7a7e1b3737ba80727d1f3f03a57e937a73b67cd7 (diff)
downloadmailman-af6cb3e9ee6b7e06683709af0107283c1e9bd5d5.tar.gz
mailman-af6cb3e9ee6b7e06683709af0107283c1e9bd5d5.tar.zst
mailman-af6cb3e9ee6b7e06683709af0107283c1e9bd5d5.zip
email.Header does everything this module used to do for us, so we
don't need it anymore.
-rw-r--r--Mailman/EncWord.py171
1 files changed, 0 insertions, 171 deletions
diff --git a/Mailman/EncWord.py b/Mailman/EncWord.py
deleted file mode 100644
index c5fd5cc25..000000000
--- a/Mailman/EncWord.py
+++ /dev/null
@@ -1,171 +0,0 @@
-# Copyright (C) 1998,1999,2000,2001,2002 by the Free Software Foundation, Inc.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-"""Decode encoded-words as defined by RFC 2047"""
-
-import sys
-import string
-import base64
-
-
-
-class DecodeError(ValueError):
- __super_init = ValueError.__init__
- def __init__(self, msg):
- self.__super_init('invalid encoded-word: %s' % msg)
-
-
-
-class Decoder:
- """Decode mail header encoded-word format defined by RFC 2047"""
-
- offset = 0
-
- def decode(self, s):
- """Decode an encoded-word.
-
- Returns the charset of the encoded-word, the decoded text, and the
- position of the first character following the encoded-word.
-
- The first position of the input string must by the first character of
- the encoded-word.
- """
- if s[:2] <> '=?':
- raise DecodeError('must start with "=?", not %s' % repr(s[:2]))
- charset = self._get_charset(s)
- encoding = self._get_encoding(s)
- _text = self._get_text(s)
- # encoding must be either 'q' or 'b', ensured by _get_encoding()
- if encoding == 'q':
- text = self._decode_q(_text)
- else:
- text = self._decode_b(_text)
- return charset, text, self.offset
-
- # TBD: Technically the charset and encoding can't contain SPACE, CTLs, or
- # especials; do not currently check this.
-
- def _get_charset(self, s):
- i = string.find(s, '?', 2)
- if i == -1:
- raise DecodeError("can't find end of charset")
- self.offset = i + 1
- return s[2:i]
-
- _valid_encodings = ('q', 'b')
-
- def _get_encoding(self, s):
- i = string.find(s, '?', self.offset)
- if i < 0:
- raise DecodeError("can't find encoding")
- enc = string.lower(s[self.offset:i])
- self.offset = i + 1
- if enc not in Decoder._valid_encodings:
- raise DecodeError('not a valid encoding: %s' % enc)
- return enc
-
- def _get_text(self, s):
- i = string.find(s, '?=', self.offset)
- if i < 0:
- raise DecodeError("can't find end of encoded text")
- text = s[self.offset:i]
- self.offset = i + 2
- return text
-
- SPACE = chr(0x20)
-
- def _decode_q(self, s):
- """Q encoding defined by RFC 2047"""
- chunks = []
- offset = 0
- end = len(s)
- while offset < end:
- i = string.find(s, '=', offset)
- j = string.find(s, '_', offset)
- if i < 0 and j < 0:
- chunks.append(s[offset:])
- break
- if (j < i and j >= 0) or i < 0:
- chunks.append(s[offset:j])
- chunks.append(Decoder.SPACE)
- offset = j + 1
- else:
- chunks.append(s[offset:i])
- hexdig = s[i+1:i+3]
- chunks.append(chr(string.atoi(hexdig, 16)))
- offset = i + 3
- return string.join(chunks, '')
-
- def _decode_b(self, s):
- """B encoding == base64 encoding defined by RFC 2045"""
- return base64.decodestring(s)
-
-
-
-def decode(s):
- """Decode a string containing encoded words"""
- _decode = Decoder().decode
-
- chunks = []
- offset = 0
- charset = None
- while 1:
- i = string.find(s, '=?', offset)
- if i < 0:
- chunks.append(s[offset:])
- break
- chunks.append(s[offset:i])
- _charset, text, offset = _decode(s[i:])
- offset = offset + i
- if charset is None:
- charset = _charset
- elif charset <> _charset:
- raise ValueError("can't decode string with multiple charsets")
- chunks.append(text)
- return string.join(chunks, ''), charset
-
-
-
-def test():
- examples = [
- # valid
- '=?US-ASCII?Q?Keith_Moore?= <moore@cs.utk.edu>',
- '=?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk>',
- '=?ISO-8859-1?Q?Andr=E9_?= Pirard <PIRARD@vm1.ulg.ac.be>',
- '=?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?=',
- '=?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?=',
- '=?US-ASCII?Q?.._cool!?=',
- '=?ISO-8859-1?Q?Olle_J=E4rnefors?= <ojarnef@admin.kth.se>',
- '(=?iso-8859-8?b?7eXs+SDv4SDp7Oj08A==?=)',
- # invalid
- 'abc',
- '=?abc',
- '=?abc?abc',
- '=?ISO-8859-1?abc?text',
- ]
- for s in examples:
- try:
- text, charset = decode(s)
- except ValueError, msg:
- print "error:", msg
- else:
- print text, charset
-
-
-
-if __name__ == "__main__":
- test()
-