当前位置: 首页>>代码示例>>Python>>正文


Python Utils.oneline方法代码示例

本文整理汇总了Python中Mailman.Utils.oneline方法的典型用法代码示例。如果您正苦于以下问题:Python Utils.oneline方法的具体用法?Python Utils.oneline怎么用?Python Utils.oneline使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在Mailman.Utils的用法示例。


在下文中一共展示了Utils.oneline方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。

示例1: scrub_msg822

# 需要导入模块: from Mailman import Utils [as 别名]
# 或者: from Mailman.Utils import oneline [as 别名]
    def scrub_msg822(self, part):
        # submessage
        submsg = part.get_payload(0)
        omask = os.umask(002)
        try:
            url = save_attachment(self.mlist, part, self.dir)
        finally:
            os.umask(omask)
        subject = submsg.get('subject', _('no subject'))
        subject = Utils.oneline(subject, self.lcset)
        date = submsg.get('date', _('no date'))
        who = submsg.get('from', _('unknown sender'))
        who = Utils.oneline(who, self.lcset)
        size = len(str(submsg))
        self.msgtexts.append(unicode(_("""\
An embedded message was scrubbed...
From: %(who)s
Subject: %(subject)s
Date: %(date)s
Size: %(size)s
URL: %(url)s
"""), self.lcset))
        # Replace this part because subparts should not be walk()-ed.
        del part['content-type']
        part.set_payload('blah blah', 'us-ascii')
开发者ID:atsuoishimoto,项目名称:mailman-2.1-ja,代码行数:27,代码来源:Scrubber.py

示例2: process

# 需要导入模块: from Mailman import Utils [as 别名]
# 或者: from Mailman.Utils import oneline [as 别名]
def process(mlist, msg, msgdata):
    # Extract the sender's address and find them in the user database
    sender = msgdata.get('original_sender', msg.get_sender())
    try:
        ack = mlist.getMemberOption(sender, mm_cfg.AcknowledgePosts)
        if not ack:
            return
    except Errors.NotAMemberError:
        return
    # Okay, they want acknowledgement of their post.  Give them their original
    # subject.  BAW: do we want to use the decoded header?
    origsubj = msgdata.get('origsubj', msg.get('subject', _('(no subject)')))
    # Get the user's preferred language
    lang = msgdata.get('lang', mlist.getMemberLanguage(sender))
    # Now get the acknowledgement template
    realname = mlist.real_name
    text = Utils.maketext(
        'postack.txt',
        {'subject'     : Utils.oneline(origsubj, Utils.GetCharSet(lang)),
         'listname'    : realname,
         'listinfo_url': mlist.GetScriptURL('listinfo', absolute=1),
         'optionsurl'  : mlist.GetOptionsURL(sender, absolute=1),
         }, lang=lang, mlist=mlist, raw=1)
    # Craft the outgoing message, with all headers and attributes
    # necessary for general delivery.  Then enqueue it to the outgoing
    # queue.
    subject = _('%(realname)s post acknowledgement')
    usermsg = Message.UserNotification(sender, mlist.GetBouncesEmail(),
                                       subject, text, lang)
    usermsg.send(mlist)
开发者ID:EdLeafe,项目名称:mailman_config,代码行数:32,代码来源:Acknowledge.py

示例3: process

# 需要导入模块: from Mailman import Utils [as 别名]
# 或者: from Mailman.Utils import oneline [as 别名]
def process(mlist, msg, msgdata):
    try:
	confs_by_list = mm_cfg.REWRITE_FROM
    except AttributeError:
	return

    if mlist.internal_name() in confs_by_list:
	conf = confs_by_list[mlist.internal_name()]
    elif '*' in confs_by_list:
	conf = confs_by_list['*']
    else:
	return

    from_name_fmt = conf.get('from_name', '%(from_name)s')
    from_address_fmt = conf.get('from_address', '%(from_address)s')
    save_original = conf.get('save_original')

    d = SafeDict({'list_real_name':	mlist.real_name,
                  'list_name':		mlist.internal_name(),
		  'list_address':	mlist.GetListEmail(),
                  'list_domain':	mlist.host_name,
                  'list_desc':		mlist.description,
                  'list_info':		mlist.info,
                  })

    lcset = Utils.GetCharSet(mlist.preferred_language)

    from_name, from_address = parseaddr(msg.get('From'))
    d['from_address'] = from_address
    try:
	d['from_local'], d['from_domain'] = re.split('@', from_address, 1)
    except ValueError:
	d['from_local'] = from_address
	d['from_domain'] = ''

    if from_name != '':
	d['from_name'] = Utils.oneline(from_name, lcset)
    else:
	d['from_name'] = d['from_local']

    try:
	membername = mlist.getMemberName(from_address) or None
	try:
	    d['from_membername'] = membername.encode(lcset)
	except (AttributeError, UnicodeError):
	    d['from_membername'] = d['from_name']
    except Errors.NotAMemberError:
	d['from_membername'] = d['from_name']

    from_name = from_name_fmt % d
    from_address = from_address_fmt % d

    if save_original:
	msg[save_original] = msg['From']
    del msg['From']
    msg['From'] = formataddr((from_name, from_address))
开发者ID:B-Rich,项目名称:mailman-hack,代码行数:58,代码来源:RewriteFrom.py

示例4: scrub_any

# 需要导入模块: from Mailman import Utils [as 别名]
# 或者: from Mailman.Utils import oneline [as 别名]
    def scrub_any(self, part):
        # Images and MS Office files and all
        payload = part.get_payload(decode=True)
        ctype = part.get_content_type()
        # XXX email 2.5 special care is omitted.
        size = len(payload)
        omask = os.umask(002)
        try:
            url = save_attachment(self.mlist, part, self.dir)
        finally:
            os.umask(omask)
        desc = part.get('content-description', _('not available'))
        desc = Utils.oneline(desc, self.lcset)
        filename = part.get_filename(_('not available'))
        filename = Utils.oneline(filename, self.lcset)
        self.msgtexts.append(unicode(_("""\
A non-text attachment was scrubbed...
Name: %(filename)s
Type: %(ctype)s
Size: %(size)d bytes
Desc: %(desc)s
URL: %(url)s
"""), self.lcset))
开发者ID:atsuoishimoto,项目名称:mailman-2.1-ja,代码行数:25,代码来源:Scrubber.py

示例5: scrub_text

# 需要导入模块: from Mailman import Utils [as 别名]
# 或者: from Mailman.Utils import oneline [as 别名]
    def scrub_text(self, part):
        # Plain text scrubber.
        omask = os.umask(002)
        try:
            url = save_attachment(self.mlist, part, self.dir)
        finally:
            os.umask(omask)
        filename = part.get_filename(_('not available'))
        filename = Utils.oneline(filename, self.lcset)
        self.msgtexts.append(unicode(_("""\
An embedded and charset-unspecified text was scrubbed...
Name: %(filename)s
URL: %(url)s
"""), self.lcset))
开发者ID:atsuoishimoto,项目名称:mailman-2.1-ja,代码行数:16,代码来源:Scrubber.py

示例6: quote

# 需要导入模块: from Mailman import Utils [as 别名]
# 或者: from Mailman.Utils import oneline [as 别名]
def quote(s, is_header=False):
    if is_header:
        h = Utils.oneline(s, 'utf-8')
    else:
        h = s

    # Remove illegal XML characters
    # Try to decode UTF-8, so that Utils.uquote can escape multibyte characters
    # correctly.
    try:
        hclean = h.decode('utf-8')
        hclean = u''.join(re.split(u'[\x00-\x08\x0B-\x1f]+', hclean))
    except UnicodeDecodeError:
        hclean = ''.join(re.split('[\x00-\x08\x0B-\x1f]+', h))
    return Utils.uquote(hclean.replace('&', '&amp;').replace('>', '&gt;').replace('<', '&lt;'))
开发者ID:Ekleog,项目名称:platal,代码行数:17,代码来源:lists.rpc.py

示例7: process

# 需要导入模块: from Mailman import Utils [as 别名]
# 或者: from Mailman.Utils import oneline [as 别名]
def process(mlist, msg, msgdata):
    try:
	confs_by_list = mm_cfg.ADD_HEADERS
    except AttributeError:
	return

    if mlist.internal_name() in confs_by_list:
	conf = confs_by_list[mlist.internal_name()]
    elif '*' in confs_by_list:
	conf = confs_by_list['*']
    else:
	return

    d = SafeDict({'list_real_name':	mlist.real_name,
                  'list_name':		mlist.internal_name(),
		  'list_address':	mlist.GetListEmail(),
                  'list_domain':	mlist.host_name,
                  'list_desc':		mlist.description,
                  'list_info':		mlist.info,
                  'post_id':		mlist.post_id,
                  })

    lcset = Utils.GetCharSet(mlist.preferred_language)
    d['from_header'] = msg.get('From')
    from_name, from_address = parseaddr(d['from_header'])
    d['from_address'] = from_address
    try:
	d['from_local'], d['from_domain'] = re.split('@', from_address, 1)
    except ValueError:
	d['from_local'] = from_address
	d['from_domain'] = ''
    if from_name != '':
	d['from_name'] = Utils.oneline(from_name, lcset)
    else:
	d['from_name'] = d['from_local']
    try:
	membername = mlist.getMemberName(from_address) or None
	try:
	    d['from_membername'] = membername.encode(lcset)
	except (AttributeError, UnicodeError):
	    d['from_membername'] = d['from_name']
    except Errors.NotAMemberError:
	d['from_membername'] = d['from_name']

    for name, value_fmt in conf.items():
        value = value_fmt % d
        change_header(name, value, mlist, msg, msgdata, delete=False)
开发者ID:fumiyas,项目名称:mailman-hack,代码行数:49,代码来源:AddHeaders.py

示例8: BounceMessage

# 需要导入模块: from Mailman import Utils [as 别名]
# 或者: from Mailman.Utils import oneline [as 别名]
 def BounceMessage(self, msg, msgdata, e=None):
     # Bounce a message back to the sender, with an error message if
     # provided in the exception argument.
     sender = msg.get_sender()
     subject = msg.get("subject", _("(no subject)"))
     subject = Utils.oneline(subject, Utils.GetCharSet(self.preferred_language))
     if e is None:
         notice = _("[No bounce details are available]")
     else:
         notice = _(e.notice())
     # Currently we always craft bounces as MIME messages.
     bmsg = Message.UserNotification(msg.get_sender(), self.GetOwnerEmail(), subject, lang=self.preferred_language)
     # BAW: Be sure you set the type before trying to attach, or you'll get
     # a MultipartConversionError.
     bmsg.set_type("multipart/mixed")
     txt = MIMEText(notice, _charset=Utils.GetCharSet(self.preferred_language))
     bmsg.attach(txt)
     bmsg.attach(MIMEMessage(msg))
     bmsg.send(self)
开发者ID:EmilyDirsh,项目名称:Paperboy,代码行数:21,代码来源:Bouncer.py

示例9: show_helds_overview

# 需要导入模块: from Mailman import Utils [as 别名]
# 或者: from Mailman.Utils import oneline [as 别名]

#.........这里部分代码省略.........
            '&nbsp;' +
            _('Preserve messages for the site administrator')
            ])
        left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2)
        left.AddRow([
            CheckBox('senderforward-' + qsender, 1).Format() +
            '&nbsp;' +
            _('Forward messages (individually) to:')
            ])
        left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2)
        left.AddRow([
            TextBox('senderforwardto-' + qsender,
                    value=mlist.GetOwnerEmail())
            ])
        left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2)
        # If the sender is a member and the message is being held due to a
        # moderation bit, give the admin a chance to clear the member's mod
        # bit.  If this sender is not a member and is not already on one of
        # the sender filters, then give the admin a chance to add this sender
        # to one of the filters.
        if mlist.isMember(sender):
            if mlist.getMemberOption(sender, mm_cfg.Moderate):
                left.AddRow([
                    CheckBox('senderclearmodp-' + qsender, 1).Format() +
                    '&nbsp;' +
                    _("Clear this member's <em>moderate</em> flag")
                    ])
            else:
                left.AddRow(
                    [_('<em>The sender is now a member of this list</em>')])
            left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2)
        elif sender not in (mlist.accept_these_nonmembers +
                            mlist.hold_these_nonmembers +
                            mlist.reject_these_nonmembers +
                            mlist.discard_these_nonmembers):
            left.AddRow([
                CheckBox('senderfilterp-' + qsender, 1).Format() +
                '&nbsp;' +
                _('Add <b>%(esender)s</b> to one of these sender filters:')
                ])
            left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2)
            btns = hacky_radio_buttons(
                'senderfilter-' + qsender,
                (_('Accepts'), _('Holds'), _('Rejects'), _('Discards')),
                (mm_cfg.ACCEPT, mm_cfg.HOLD, mm_cfg.REJECT, mm_cfg.DISCARD),
                (0, 0, 0, 1))
            left.AddRow([btns])
            left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2)
            if sender not in mlist.ban_list:
                left.AddRow([
                    CheckBox('senderbanp-' + qsender, 1).Format() +
                    '&nbsp;' +
                    _("""Ban <b>%(esender)s</b> from ever subscribing to this
                    mailing list""")])
                left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2)
        right = Table(border=0)
        right.AddRow([
            _("""Click on the message number to view the individual
            message, or you can """) +
            Link(senderurl, _('view all messages from %(esender)s')).Format()
            ])
        right.AddCellInfo(right.GetCurrentRowIndex(), 0, colspan=2)
        right.AddRow(['&nbsp;', '&nbsp;'])
        counter = 1
        for id in bysender[sender]:
            info = mlist.GetRecord(id)
            ptime, sender, subject, reason, filename, msgdata = info
            # BAW: This is really the size of the message pickle, which should
            # be close, but won't be exact.  Sigh, good enough.
            try:
                size = os.path.getsize(os.path.join(mm_cfg.DATA_DIR, filename))
            except OSError, e:
                if e.errno <> errno.ENOENT: raise
                # This message must have gotten lost, i.e. it's already been
                # handled by the time we got here.
                mlist.HandleRequest(id, mm_cfg.DISCARD)
                continue
            dispsubj = Utils.oneline(
                subject, Utils.GetCharSet(mlist.preferred_language))
            t = Table(border=0)
            t.AddRow([Link(admindburl + '?msgid=%d' % id, '[%d]' % counter),
                      Bold(_('Subject:')),
                      Utils.websafe(dispsubj)
                      ])
            t.AddRow(['&nbsp;', Bold(_('Size:')), str(size) + _(' bytes')])
            if reason:
                reason = _(reason)
            else:
                reason = _('not available')
            t.AddRow(['&nbsp;', Bold(_('Reason:')), reason])
            # Include the date we received the message, if available
            when = msgdata.get('received_time')
            if when:
                t.AddRow(['&nbsp;', Bold(_('Received:')),
                          time.ctime(when)])
            t.AddRow([InputObj(qsender, 'hidden', str(id), False).Format()])
            counter += 1
            right.AddRow([t])
        stable.AddRow([left, right])
        table.AddRow([stable])
开发者ID:EmilyDirsh,项目名称:Paperboy,代码行数:104,代码来源:admindb.py

示例10: unicode

# 需要导入模块: from Mailman import Utils [as 别名]
# 或者: from Mailman.Utils import oneline [as 别名]
     mcset = 'us-ascii'
 lcset = Utils.GetCharSet(mlist.preferred_language)
 if mcset <> lcset:
     try:
         body = unicode(body, mcset).encode(lcset, 'replace')
     except (LookupError, UnicodeError, ValueError):
         pass
 hdrtxt = NL.join(['%s: %s' % (k, v) for k, v in msg.items()])
 hdrtxt = Utils.websafe(hdrtxt)
 # Okay, we've reconstituted the message just fine.  Now for the fun part!
 t = Table(cellspacing=0, cellpadding=0, width='100%')
 t.AddRow([Bold(_('From:')), sender])
 row, col = t.GetCurrentRowIndex(), t.GetCurrentCellIndex()
 t.AddCellInfo(row, col-1, align='right')
 t.AddRow([Bold(_('Subject:')),
           Utils.websafe(Utils.oneline(subject, lcset))])
 t.AddCellInfo(row+1, col-1, align='right')
 t.AddRow([Bold(_('Reason:')), _(reason)])
 t.AddCellInfo(row+2, col-1, align='right')
 when = msgdata.get('received_time')
 if when:
     t.AddRow([Bold(_('Received:')), time.ctime(when)])
     t.AddCellInfo(row+2, col-1, align='right')
 # We can't use a RadioButtonArray here because horizontal placement can be
 # confusing to the user and vertical placement takes up too much
 # real-estate.  This is a hack!
 buttons = Table(cellspacing="5", cellpadding="0")
 buttons.AddRow(map(lambda x, s='&nbsp;'*5: s+x+s,
                    (_('Defer'), _('Approve'), _('Reject'), _('Discard'))))
 buttons.AddRow([Center(RadioButton(id, mm_cfg.DEFER, 1)),
                 Center(RadioButton(id, mm_cfg.APPROVE, 0)),
开发者ID:EmilyDirsh,项目名称:Paperboy,代码行数:33,代码来源:admindb.py

示例11: send_i18n_digests

# 需要导入模块: from Mailman import Utils [as 别名]
# 或者: from Mailman.Utils import oneline [as 别名]
def send_i18n_digests(mlist, mboxfp):
    mbox = Mailbox(mboxfp)
    # Prepare common information (first lang/charset)
    lang = mlist.preferred_language
    lcset = Utils.GetCharSet(lang)
    lcset_out = Charset(lcset).output_charset or lcset
    # Common Information (contd)
    realname = mlist.real_name
    volume = mlist.volume
    issue = mlist.next_digest_number
    digestid = _('%(realname)s Digest, Vol %(volume)d, Issue %(issue)d')
    digestsubj = Header(digestid, lcset, header_name='Subject')
    # Set things up for the MIME digest.  Only headers not added by
    # CookHeaders need be added here.
    # Date/Message-ID should be added here also.
    mimemsg = Message.Message()
    mimemsg['Content-Type'] = 'multipart/mixed'
    mimemsg['MIME-Version'] = '1.0'
    mimemsg['From'] = mlist.GetRequestEmail()
    mimemsg['Subject'] = digestsubj
    mimemsg['To'] = mlist.GetListEmail()
    mimemsg['Reply-To'] = mlist.GetListEmail()
    mimemsg['Date'] = formatdate(localtime=1)
    mimemsg['Message-ID'] = Utils.unique_message_id(mlist)
    # Set things up for the rfc1153 digest
    plainmsg = StringIO()
    rfc1153msg = Message.Message()
    rfc1153msg['From'] = mlist.GetRequestEmail()
    rfc1153msg['Subject'] = digestsubj
    rfc1153msg['To'] = mlist.GetListEmail()
    rfc1153msg['Reply-To'] = mlist.GetListEmail()
    rfc1153msg['Date'] = formatdate(localtime=1)
    rfc1153msg['Message-ID'] = Utils.unique_message_id(mlist)
    separator70 = '-' * 70
    separator30 = '-' * 30
    # In the rfc1153 digest, the masthead contains the digest boilerplate plus
    # any digest header.  In the MIME digests, the masthead and digest header
    # are separate MIME subobjects.  In either case, it's the first thing in
    # the digest, and we can calculate it now, so go ahead and add it now.
    mastheadtxt = Utils.maketext(
        'masthead.txt',
        {'real_name' :        mlist.real_name,
         'got_list_email':    mlist.GetListEmail(),
         'got_listinfo_url':  mlist.GetScriptURL('listinfo', absolute=1),
         'got_request_email': mlist.GetRequestEmail(),
         'got_owner_email':   mlist.GetOwnerEmail(),
         }, mlist=mlist)
    # MIME
    masthead = MIMEText(mastheadtxt, _charset=lcset)
    masthead['Content-Description'] = digestid
    mimemsg.attach(masthead)
    # RFC 1153
    print >> plainmsg, mastheadtxt
    print >> plainmsg
    # Now add the optional digest header but only if more than whitespace.
    if re.sub('\s', '', mlist.digest_header):
        headertxt = decorate(mlist, mlist.digest_header, _('digest header'))
        # MIME
        header = MIMEText(headertxt, _charset=lcset)
        header['Content-Description'] = _('Digest Header')
        mimemsg.attach(header)
        # RFC 1153
        print >> plainmsg, headertxt
        print >> plainmsg
    # Now we have to cruise through all the messages accumulated in the
    # mailbox file.  We can't add these messages to the plainmsg and mimemsg
    # yet, because we first have to calculate the table of contents
    # (i.e. grok out all the Subjects).  Store the messages in a list until
    # we're ready for them.
    #
    # Meanwhile prepare things for the table of contents
    toc = StringIO()
    print >> toc, _("Today's Topics:\n")
    # Now cruise through all the messages in the mailbox of digest messages,
    # building the MIME payload and core of the RFC 1153 digest.  We'll also
    # accumulate Subject: headers and authors for the table-of-contents.
    messages = []
    msgcount = 0
    msg = mbox.next()
    while msg is not None:
        if msg == '':
            # It was an unparseable message
            msg = mbox.next()
            continue
        msgcount += 1
        messages.append(msg)
        # Get the Subject header
        msgsubj = msg.get('subject', _('(no subject)'))
        subject = Utils.oneline(msgsubj, lcset)
        # Don't include the redundant subject prefix in the toc
        mo = re.match('(re:? *)?(%s)' % re.escape(mlist.subject_prefix),
                      subject, re.IGNORECASE)
        if mo:
            subject = subject[:mo.start(2)] + subject[mo.end(2):]
        username = ''
        addresses = getaddresses([Utils.oneline(msg.get('from', ''), lcset)])
        # Take only the first author we find
        if isinstance(addresses, ListType) and addresses:
            username = addresses[0][0]
            if not username:
#.........这里部分代码省略.........
开发者ID:fumiyas,项目名称:mailman-ja-utf8-debian,代码行数:103,代码来源:ToDigest.py

示例12: syslog

# 需要导入模块: from Mailman import Utils [as 别名]
# 或者: from Mailman.Utils import oneline [as 别名]
         pass
     # Queue the file for delivery by qrunner.  Trying to deliver the
     # message directly here can lead to a huge delay in web
     # turnaround.  Log the moderation and add a header.
     msg['X-Mailman-Approved-At'] = email.Utils.formatdate(localtime=1)
     syslog('vette', 'held message approved, message-id: %s',
            msg.get('message-id', 'n/a'))
     # Stick the message back in the incoming queue for further
     # processing.
     inq = get_switchboard(mm_cfg.INQUEUE_DIR)
     inq.enqueue(msg, _metadata=msgdata)
 elif value == mm_cfg.REJECT:
     # Rejected
     rejection = 'Refused'
     lang = self.getMemberLanguage(sender)
     subject = Utils.oneline(subject, Utils.GetCharSet(lang))
     self.__refuse(_('Posting of your message titled "%(subject)s"'),
                   sender, comment or _('[No reason given]'),
                   lang=lang)
 else:
     assert value == mm_cfg.DISCARD
     # Discarded
     rejection = 'Discarded'
 # Forward the message
 if forward and addr:
     # If we've approved the message, we need to be sure to craft a
     # completely unique second message for the forwarding operation,
     # since we don't want to share any state or information with the
     # normal delivery.
     try:
         copy = readMessage(path)
开发者ID:bdraco,项目名称:mailman,代码行数:33,代码来源:ListAdmin.py

示例13: save_attachment

# 需要导入模块: from Mailman import Utils [as 别名]
# 或者: from Mailman.Utils import oneline [as 别名]
def save_attachment(mlist, msg, dir, filter_html=True):
    fsdir = os.path.join(mlist.archive_dir(), dir)
    makedirs(fsdir)
    # Figure out the attachment type and get the decoded data
    decodedpayload = msg.get_payload(decode=True)
    # BAW: mimetypes ought to handle non-standard, but commonly found types,
    # e.g. image/jpg (should be image/jpeg).  For now we just store such
    # things as application/octet-streams since that seems the safest.
    ctype = msg.get_content_type()
    # i18n file name is encoded
    lcset = Utils.GetCharSet(mlist.preferred_language)
    filename = Utils.oneline(msg.get_filename(''), lcset)
    filename, fnext = os.path.splitext(filename)
    # For safety, we should confirm this is valid ext for content-type
    # but we can use fnext if we introduce fnext filtering
    if mm_cfg.SCRUBBER_USE_ATTACHMENT_FILENAME_EXTENSION:
        # HTML message doesn't have filename :-(
        ext = fnext or guess_extension(ctype, fnext)
    else:
        ext = guess_extension(ctype, fnext)
    if not ext:
        # We don't know what it is, so assume it's just a shapeless
        # application/octet-stream, unless the Content-Type: is
        # message/rfc822, in which case we know we'll coerce the type to
        # text/plain below.
        if ctype == 'message/rfc822':
            ext = '.txt'
        else:
            ext = '.bin'
    # Allow only alphanumerics, dash, underscore, and dot
    ext = sre.sub('', ext)
    path = None
    # We need a lock to calculate the next attachment number
    lockfile = os.path.join(fsdir, 'attachments.lock')
    lock = LockFile.LockFile(lockfile)
    lock.lock()
    try:
        # Now base the filename on what's in the attachment, uniquifying it if
        # necessary.
        if not filename or mm_cfg.SCRUBBER_DONT_USE_ATTACHMENT_FILENAME:
            filebase = 'attachment'
        else:
            # Sanitize the filename given in the message headers
            parts = pre.split(filename)
            filename = parts[-1]
            # Strip off leading dots
            filename = dre.sub('', filename)
            # Allow only alphanumerics, dash, underscore, and dot
            filename = sre.sub('', filename)
            # If the filename's extension doesn't match the type we guessed,
            # which one should we go with?  For now, let's go with the one we
            # guessed so attachments can't lie about their type.  Also, if the
            # filename /has/ no extension, then tack on the one we guessed.
            # The extension was removed from the name above.
            filebase = filename
        # Now we're looking for a unique name for this file on the file
        # system.  If msgdir/filebase.ext isn't unique, we'll add a counter
        # after filebase, e.g. msgdir/filebase-cnt.ext
        counter = 0
        extra = ''
        while True:
            path = os.path.join(fsdir, filebase + extra + ext)
            # Generally it is not a good idea to test for file existance
            # before just trying to create it, but the alternatives aren't
            # wonderful (i.e. os.open(..., O_CREAT | O_EXCL) isn't
            # NFS-safe).  Besides, we have an exclusive lock now, so we're
            # guaranteed that no other process will be racing with us.
            if os.path.exists(path):
                counter += 1
                extra = '-%04d' % counter
            else:
                break
    finally:
        lock.unlock()
    # `path' now contains the unique filename for the attachment.  There's
    # just one more step we need to do.  If the part is text/html and
    # ARCHIVE_HTML_SANITIZER is a string (which it must be or we wouldn't be
    # here), then send the attachment through the filter program for
    # sanitization
    if filter_html and ctype == 'text/html':
        base, ext = os.path.splitext(path)
        tmppath = base + '-tmp' + ext
        fp = open(tmppath, 'w')
        try:
            fp.write(decodedpayload)
            fp.close()
            cmd = mm_cfg.ARCHIVE_HTML_SANITIZER % {'filename' : tmppath}
            progfp = os.popen(cmd, 'r')
            decodedpayload = progfp.read()
            status = progfp.close()
            if status:
                syslog('error',
                       'HTML sanitizer exited with non-zero status: %s',
                       status)
        finally:
            os.unlink(tmppath)
        # BAW: Since we've now sanitized the document, it should be plain
        # text.  Blarg, we really want the sanitizer to tell us what the type
        # if the return data is. :(
        ext = '.txt'
#.........这里部分代码省略.........
开发者ID:jwasinger,项目名称:mailman_cas,代码行数:103,代码来源:Scrubber.py

示例14: process

# 需要导入模块: from Mailman import Utils [as 别名]
# 或者: from Mailman.Utils import oneline [as 别名]
def process(mlist, msg, msgdata=None):
    sanitize = mm_cfg.ARCHIVE_HTML_SANITIZER
    outer = True
    if msgdata is None:
        msgdata = {}
    if msgdata:
        # msgdata is available if it is in GLOBAL_PIPELINE
        # ie. not in digest or archiver
        # check if the list owner want to scrub regular delivery
        if not mlist.scrub_nondigest:
            return
    dir = calculate_attachments_dir(mlist, msg, msgdata)
    charset = None
    lcset = Utils.GetCharSet(mlist.preferred_language)
    lcset_out = Charset(lcset).output_charset or lcset
    # Now walk over all subparts of this message and scrub out various types
    format = delsp = None
    for part in msg.walk():
        ctype = part.get_content_type()
        # If the part is text/plain, we leave it alone
        if ctype == 'text/plain':
            # We need to choose a charset for the scrubbed message, so we'll
            # arbitrarily pick the charset of the first text/plain part in the
            # message.
            # MAS: Also get the RFC 3676 stuff from this part. This seems to
            # work OK for scrub_nondigest.  It will also work as far as
            # scrubbing messages for the archive is concerned, but pipermail
            # doesn't pay any attention to the RFC 3676 parameters.  The plain
            # format digest is going to be a disaster in any case as some of
            # messages will be format="flowed" and some not.  ToDigest creates
            # its own Content-Type: header for the plain digest which won't
            # have RFC 3676 parameters. If the message Content-Type: headers
            # are retained for display in the digest, the parameters will be
            # there for information, but not for the MUA. This is the best we
            # can do without having get_payload() process the parameters.
            if charset is None:
                charset = part.get_content_charset(lcset)
                format = part.get_param('format')
                delsp = part.get_param('delsp')
            # TK: if part is attached then check charset and scrub if none
            if part.get('content-disposition') and \
               not part.get_content_charset():
                omask = os.umask(002)
                try:
                    url = save_attachment(mlist, part, dir)
                finally:
                    os.umask(omask)
                filename = part.get_filename(_('not available'))
                filename = Utils.oneline(filename, lcset)
                replace_payload_by_text(part, _("""\
An embedded and charset-unspecified text was scrubbed...
Name: %(filename)s
URL: %(url)s
"""), lcset)
        elif ctype == 'text/html' and isinstance(sanitize, IntType):
            if sanitize == 0:
                if outer:
                    raise DiscardMessage
                replace_payload_by_text(part,
                                 _('HTML attachment scrubbed and removed'),
                                 # Adding charset arg and removing content-type
                                 # sets content-type to text/plain
                                 lcset)
            elif sanitize == 2:
                # By leaving it alone, Pipermail will automatically escape it
                pass
            elif sanitize == 3:
                # Pull it out as an attachment but leave it unescaped.  This
                # is dangerous, but perhaps useful for heavily moderated
                # lists.
                omask = os.umask(002)
                try:
                    url = save_attachment(mlist, part, dir, filter_html=False)
                finally:
                    os.umask(omask)
                replace_payload_by_text(part, _("""\
An HTML attachment was scrubbed...
URL: %(url)s
"""), lcset)
            else:
                # HTML-escape it and store it as an attachment, but make it
                # look a /little/ bit prettier. :(
                payload = Utils.websafe(part.get_payload(decode=True))
                # For whitespace in the margin, change spaces into
                # non-breaking spaces, and tabs into 8 of those.  Then use a
                # mono-space font.  Still looks hideous to me, but then I'd
                # just as soon discard them.
                def doreplace(s):
                    return s.replace(' ', '&nbsp;').replace('\t', '&nbsp'*8)
                lines = [doreplace(s) for s in payload.split('\n')]
                payload = '<tt>\n' + BR.join(lines) + '\n</tt>\n'
                part.set_payload(payload)
                # We're replacing the payload with the decoded payload so this
                # will just get in the way.
                del part['content-transfer-encoding']
                omask = os.umask(002)
                try:
                    url = save_attachment(mlist, part, dir, filter_html=False)
                finally:
                    os.umask(omask)
#.........这里部分代码省略.........
开发者ID:jwasinger,项目名称:mailman_cas,代码行数:103,代码来源:Scrubber.py

示例15: process

# 需要导入模块: from Mailman import Utils [as 别名]
# 或者: from Mailman.Utils import oneline [as 别名]
def process(mlist, msg, msgdata=None):
    sanitize = mm_cfg.ARCHIVE_HTML_SANITIZER
    outer = True
    in_pipeline = False
    patches = None
    sigs = None
    if msgdata is None:
        msgdata = {}
    if msgdata:
        # msgdata is available if it is in GLOBAL_PIPELINE
        # ie. not in digest or archiver
        # check if the list owner want to scrub regular delivery
        # Disabled - function split, attachments saved in pipeline,
        # if not mlist.scrub_nondigest:
        #    return
        in_pipeline = True
        patches = []
        sigs = []

    dir = calculate_attachments_dir(mlist, msg, msgdata)
    charset = None
    lcset = Utils.GetCharSet(mlist.preferred_language)
    lcset_out = Charset(lcset).output_charset or lcset
    # Now walk over all subparts of this message and scrub out various types
    format = delsp = None
    for part in msg.walk():
        ctype = part.get_content_type()
        # If the part is text/plain, we leave it alone
        if ctype == "text/plain":
            # We need to choose a charset for the scrubbed message, so we'll
            # arbitrarily pick the charset of the first text/plain part in the
            # message.
            # MAS: Also get the RFC 3676 stuff from this part. This seems to
            # work OK for scrub_nondigest.  It will also work as far as
            # scrubbing messages for the archive is concerned, but pipermail
            # doesn't pay any attention to the RFC 3676 parameters.  The plain
            # format digest is going to be a disaster in any case as some of
            # messages will be format="flowed" and some not.  ToDigest creates
            # its own Content-Type: header for the plain digest which won't
            # have RFC 3676 parameters. If the message Content-Type: headers
            # are retained for display in the digest, the parameters will be
            # there for information, but not for the MUA. This is the best we
            # can do without having get_payload() process the parameters.
            if charset is None:
                charset = part.get_content_charset(lcset)
                format = part.get_param("format")
                delsp = part.get_param("delsp")
            # TK: if part is attached then check charset and scrub if none
            if part.get("content-disposition") and not part.get_content_charset():
                if in_pipeline:
                    omask = os.umask(002)
                    try:
                        url = save_attachment(mlist, part, dir, patches=patches, sigs=sigs)
                        part[mm_cfg.SCRUBBER_URL_HEADER] = url
                    finally:
                        os.umask(omask)
                else:
                    url = "<" + part.get(mm_cfg.SCRUBBER_URL_HEADER, "N/A") + ">"
                    filename = part.get_filename(_("not available"))
                    filename = Utils.oneline(filename, lcset)
                    replace_payload_by_text(
                        part,
                        _(
                            """\
An embedded and charset-unspecified text was scrubbed...
Name: %(filename)s
URL: %(url)s
"""
                        ),
                        lcset,
                    )
            elif mm_cfg.SCRUBBER_ARCHIVE_ALL_TEXT:
                if in_pipeline:
                    # clearsigned or attached plaintext that will be shown, still archive the copy
                    omask = os.umask(002)
                    try:
                        url = save_attachment(mlist, part, dir, patches=patches, sigs=sigs)
                        part[mm_cfg.SCRUBBER_URL_HEADER] = url
                    finally:
                        os.umask(omask)
                elif outer and not msg.is_multipart():
                    # whole email is only one plaintext. add URL here
                    payload = msg.get_payload(decode=True)
                    del msg["content-type"]
                    del msg["content-transfer-encoding"]
                    payload = "URL: <" + part.get(mm_cfg.SCRUBBER_URL_HEADER, "N/A") + ">\n" + payload
                    msg.set_payload(payload)

        elif ctype == "text/html" and isinstance(sanitize, IntType):
            if sanitize == 0:
                if outer:
                    raise DiscardMessage
                replace_payload_by_text(
                    part,
                    _("HTML attachment scrubbed and removed"),
                    # Adding charset arg and removing content-type
                    # sets content-type to text/plain
                    lcset,
                )
            elif sanitize == 2:
#.........这里部分代码省略.........
开发者ID:jurov,项目名称:gnu-mailman,代码行数:103,代码来源:Scrubber.py


注:本文中的Mailman.Utils.oneline方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。