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

File 5799-BODYSTRUCTURE_Content-Dispositiong-20120731.patch, 4.9 KB (added by argonemyth, 4 years ago)
  • 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        1 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), 1)
     916
     917
     918
    888919class SimpleMailbox:
    889920    implements(imap4.IMailboxInfo, imap4.IMailbox, imap4.ICloseableMailbox)
    890921
     
    34573488            structure)
    34583489
    34593490
     3491    def test_singlePartDisposition(self):
     3492        """
     3493        For some content-disposition parameter values,
     3494        L{imap4.getBodyStructure} returns quoted-string.
     3495        """
     3496        body = 'hello, world'
     3497        major = 'image'
     3498        minor = 'jpeg'
     3499        charset = 'us-ascii'
     3500        msg = FakeyMessage({
     3501                'content-type': '%s/%s; charset=%s; x=y' % (
     3502                    major, minor, charset),
     3503                'content-disposition': 'attachment; filename=foo (doc).pdf; ' \
     3504                    'size=bar; creation-date-parm=somedate; ' \
     3505                    'modification-date-parm=somedate; ' \
     3506                    'read-date-parm=somedate',
     3507                }, (), '', body, 123, None)
     3508        structure = imap4.getBodyStructure(msg, extended=True)
     3509        self.assertEqual(
     3510            [major, minor, ["charset", charset, 'x', 'y'], None,
     3511             None, None, len(body), None,
     3512             ['attachment', ['filename', '"foo (doc).pdf"', 'size', 'bar',
     3513              'creation-date-parm', '"somedate"',
     3514              'modification-date-parm', '"somedate"',
     3515              'read-date-parm', '"somedate"']], None, None],
     3516            structure)
     3517
     3518
    34603519    def test_textPart(self):
    34613520        """
    34623521        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: 1 if the string needs quotation marks, 0 is the
     4341        string is a token.
     4342    """
     4343    if s == '':
     4344        return 1
     4345    for c in s:
     4346        # ASCII characters without control characters
     4347        if c <= '\x20' or c > '\x7f':
     4348            return 1
     4349        if c in _TSPECIALS:
     4350            return 1
     4351    return 0
     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. A short parameter (length <= 78 characters) value containing
     4924            only ASCII characters, but including 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-parm', 'modification-date-parm',
     4936                               'read-date-parm']
     4937                params = []
     4938                for param in disp[1:]:
     4939                    key, value = param.split('=')
     4940                    params.append(key)
     4941                    if key in date_params:
     4942                        params.append(_quote(value))
     4943                    elif len(value) <= 78 and _ifQuotedString(value):
     4944                        params.append(_quote(value))
     4945                    else:
     4946                        params.append(value)
    49084947                disp = [disp[0].lower(), params]
     4948
    49094949            return disp
    49104950        else:
    49114951            return None