blob: 3651a940a8c75aa76e115183b2718b012c88b553 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
import logging
from pylons import request
from pylons import tmpl_context as c
from allura.lib import helpers as h
from allura.lib import utils
from allura.lib.spam import SpamFilter
try:
import Mollom
MOLLOM_AVAILABLE = True
except ImportError:
MOLLOM_AVAILABLE = False
log = logging.getLogger(__name__)
class MollomSpamFilter(SpamFilter):
"""Spam checking implementation via Mollom service.
To enable Mollom spam filtering in your Allura instance, first
enable the entry point in setup.py::
[allura.spam]
mollom = allura.lib.spam.mollomfilter:MollomSpamFilter
Then include the following parameters in your .ini file::
spam.method = mollom
spam.public_key = <your Mollom public key here>
spam.private_key = <your Mollom private key here>
"""
def __init__(self, config):
if not MOLLOM_AVAILABLE:
raise ImportError('Mollom not available')
self.service = Mollom.MollomAPI(
publicKey=config.get('spam.public_key'),
privateKey=config.get('spam.private_key'))
if not self.service.verifyKey():
raise Mollom.MollomFault('Your MOLLOM credentials are invalid.')
def check(self, text, artifact=None, user=None, content_type='comment', **kw):
"""Basic content spam check via Mollom. For more options
see http://mollom.com/api#api-content
"""
log_msg = text
kw['postBody'] = text
if artifact:
# Should be able to send url, but can't right now due to a bug in
# the PyMollom lib
# kw['url'] = artifact.url()
log_msg = artifact.url()
user = user or c.user
if user:
kw['authorName'] = user.display_name or user.username
kw['authorMail'] = user.email_addresses[
0] if user.email_addresses else ''
kw['authorIP'] = utils.ip_address(request)
# kw will be urlencoded, need to utf8-encode
for k, v in kw.items():
kw[k] = h.really_unicode(v).encode('utf8')
cc = self.service.checkContent(**kw)
res = cc['spam'] == 2
artifact.spam_check_id = cc.get('session_id', '')
log.info("spam=%s (mollom): %s" % (str(res), log_msg))
return res
def submit_spam(self, text, artifact=None, user=None, content_type='comment', **kw):
self.service.sendFeedback(artifact.spam_check_id, 'spam')
def submit_ham(self, *args, **kw):
log.info("Mollom doesn't support reporting a ham")