Ticket #5799: 5799-BODYSTRUCTURE_Content-Dispositiong-20120801.patch

File 5799-BODYSTRUCTURE_Content-Dispositiong-20120801.patch, 5.0 KB (added by argonemyth, 4 years ago)

Second try!

  • twisted/mail/test/test_imap.py

     
    885885                self.assertEqual(L, expected,
    886886                                  "len(%r) = %r != %r" % (input, L, expected))
    887887
     888
     889    def test_IfQuotedString(self):
     890        """
     891        The strings passed to L{imap4._ifQuotedString} are not tokens, so
     892        C{True} should be returned.
     893        """
     894        inputs = [
     895            'some ramdom stuff',
     896            '(twisted)',
     897            '<twisted>',
     898            'twisted@',
     899            'twisted,',
     900            'twisted;',
     901            'twisted:',
     902            'twisted\\',
     903            'twisted"',
     904            'twisted/',
     905            '[twisted]',
     906            'twisted?',
     907            'twisted=',
     908        ]
     909
     910        # Add all the control characters
     911        for i in range(33):
     912            inputs.append('twiste'+ chr(i) + 'd')
     913
     914        for i in inputs:
     915            self.assertEqual(imap4._ifQuotedString(i), True)
     916
     917
     918    def test_IfTokens(self):
     919        """
     920        The strings passed to L{imap4._ifQuotedString} are tokens, so
     921        C{False} should be returned.
     922        """
     923        result = imap4._ifQuotedString("I'm.a.token!")
     924        self.assertEqual(result, False)
     925
     926
     927
    888928class SimpleMailbox:
    889929    implements(imap4.IMailboxInfo, imap4.IMailbox, imap4.ICloseableMailbox)
    890930
     
    34573497            structure)
    34583498
    34593499
     3500    def test_singlePartDisposition(self):
     3501        """
     3502        For some content-disposition parameter values,
     3503        L{imap4.getBodyStructure} returns quoted-string.
     3504        """
     3505        body = 'hello, world'
     3506        major = 'image'
     3507        minor = 'jpeg'
     3508        charset = 'us-ascii'
     3509        msg = FakeyMessage({
     3510                'content-type': '%s/%s; charset=%s; x=y' % (
     3511                    major, minor, charset),
     3512                'content-disposition': 'attachment; filename=foo (doc).pdf; ' \
     3513                    'size=bar; creation-date=somedate; ' \
     3514                    'modification-date=somedate; read-date=somedate',
     3515                }, (), '', body, 123, None)
     3516        structure = imap4.getBodyStructure(msg, extended=True)
     3517        self.assertEqual(
     3518            [major, minor, ["charset", charset, 'x', 'y'], None,
     3519             None, None, len(body), None,
     3520             ['attachment', ['filename', '"foo (doc).pdf"', 'size', 'bar',
     3521              'creation-date', '"somedate"',
     3522              'modification-date', '"somedate"',
     3523              'read-date', '"somedate"']], None, None],
     3524            structure)
     3525
     3526
    34603527    def test_textPart(self):
    34613528        """
    34623529        For a I{text/*} message, the number of lines in the message body are
  • twisted/mail/imap4.py

     
    43274327            return 1
    43284328    return 0
    43294329
     4330# tspecial in RFC 2045
     4331_TSPECIALS = r'()<>@,;:\"/[]?='
     4332def _ifQuotedString(s):
     4333    """
     4334    It determines if a string is a token or quoted-string.
     4335    @see: U{http://www.ietf.org/rfc/rfc2045.txt}
     4336
     4337    @type s: C{str}
     4338    @param s: The string needs to be checked
     4339
     4340    @return: True if the string needs quotation marks, False if the
     4341        string is a token.
     4342    """
     4343    if s == '':
     4344        return True
     4345    for c in s:
     4346        # ASCII characters without control characters
     4347        if c <= '\x20' or c > '\x7f':
     4348            return True
     4349        if c in _TSPECIALS:
     4350            return True
     4351    return False
     4352
    43304353def _prepareMailboxName(name):
    43314354    name = name.encode('imap4-utf-7')
    43324355    if _needsQuote(name):
     
    48954918        Parse a I{Content-Disposition} header into a two-sequence of the
    48964919        disposition and a flattened list of its parameters.
    48974920
     4921        According to RFC2183, the following parameter values will be quoted:
     4922            1. Values of date parameters
     4923            2. Values contain only ASCII characters, but including
     4924               tspecials characters.
     4925
    48984926        @return: C{None} if there is no disposition header value, a C{list} with
    48994927            two elements otherwise.
    49004928        """
     
    49044932                disp = (disp[0].lower(), None)
    49054933            elif len(disp) > 1:
    49064934                # XXX Poorly tested parser
    4907                 params = [x for param in disp[1:] for x in param.split('=', 1)]
     4935                date_params = ['creation-date', 'modification-date',
     4936                               'read-date']
     4937                params = []
     4938                for param in disp[1:]:
     4939                    key, value = param.split('=')
     4940                    params.append(key)
     4941                    if key in date_params or _ifQuotedString(value):
     4942                        params.append(_quote(value))
     4943                    else:
     4944                        params.append(value)
    49084945                disp = [disp[0].lower(), params]
    49094946            return disp
    49104947        else: