def render_admin_panel(self, req, cat, page, path_info): req.perm.assert_permission('SPAM_CONFIG') akismet = AkismetFilterStrategy(self.env) data = {} if req.method == 'POST': if 'cancel' in req.args: req.redirect(req.href.admin(cat, page)) api_url = req.args.get('api_url') api_key = req.args.get('api_key') try: if not akismet._verify_key(req, api_url, api_key): data['error'] = 'The API key is invalid' else: self.config.set('spam-filter', 'akismet_api_url', api_url) self.config.set('spam-filter', 'akismet_api_key', api_key) self.config.save() req.redirect(req.href.admin(cat, page)) except urllib2.URLError, e: data['error'] = e.reason[1]
def setUp(self): self.env = EnvironmentStub(enable=[AkismetFilterStrategy]) self.strategy = AkismetFilterStrategy(self.env) self.urlopen = akismet.urllib2.urlopen = DummyURLOpener()
class AkismetFilterStrategyTestCase(unittest.TestCase): def setUp(self): self.env = EnvironmentStub(enable=[AkismetFilterStrategy]) self.strategy = AkismetFilterStrategy(self.env) self.urlopen = akismet.urllib2.urlopen = DummyURLOpener() def test_no_api_key(self): req = Mock() retval = self.strategy.test(req, 'anonymous', 'foobar') self.assertEqual(None, retval) def test_bad_api_key(self): req = Mock(authname='anonymous', base_url='http://example.org/', remote_addr='127.0.0.1') self.env.config.set('spam-filter', 'akismet_api_key', 'INVALID') self.urlopen.responses = ['invalid'] retval = self.strategy.test(req, 'anonymous', 'foobar') self.assertEqual(None, retval) self.assertEqual(1, len(self.urlopen.requests)) req = self.urlopen.requests[0] self.assertEqual('http://rest.akismet.com/1.1/verify-key', req.url) self.assertEqual('blog=http%3A%2F%2Fexample.org%2F&key=INVALID', req.params) self.assertEqual(self.strategy.user_agent, req.headers['User-Agent']) def test_check_ham(self): req = Mock(authname='anonymous', base_url='http://example.org/', remote_addr='127.0.0.1', get_header=lambda x: None) self.env.config.set('spam-filter', 'akismet_api_key', 'mykey') self.urlopen.responses = ['valid', 'false'] retval = self.strategy.test(req, 'anonymous', 'foobar') self.assertEqual(None, retval) self.assertEqual(2, len(self.urlopen.requests)) req = self.urlopen.requests[1] self.assertEqual('http://mykey.rest.akismet.com/1.1/comment-check', req.url) self.assertEqual('user_ip=127.0.0.1&referrer=unknown&' 'blog=http%3A%2F%2Fexample.org%2F&user_agent=None&' 'comment_content=foobar&comment_author=&' 'comment_author_email=anonymous', req.params) self.assertEqual(self.strategy.user_agent, req.headers['User-Agent']) def test_check_spam(self): req = Mock(authname='anonymous', base_url='http://example.org/', remote_addr='127.0.0.1', get_header=lambda x: None) self.env.config.set('spam-filter', 'akismet_api_key', 'mykey') self.urlopen.responses = ['valid', 'true'] retval = self.strategy.test(req, 'anonymous', 'foobar') self.assertEqual((-5, 'Akismet says content is spam'), retval) self.assertEqual(2, len(self.urlopen.requests)) def test_submit_ham(self): req = Mock(authname='anonymous', base_url='http://example.org/', remote_addr='127.0.0.1', get_header=lambda x: None) self.env.config.set('spam-filter', 'akismet_api_key', 'mykey') self.urlopen.responses = ['valid', ''] self.strategy.train(req, 'anonymous', 'foobar', spam=False) req = self.urlopen.requests[1] self.assertEqual('http://mykey.rest.akismet.com/1.1/submit-ham', req.url) self.assertEqual('user_ip=127.0.0.1&referrer=unknown&' 'blog=http%3A%2F%2Fexample.org%2F&user_agent=None&' 'comment_content=foobar&comment_author=&' 'comment_author_email=anonymous', req.params) self.assertEqual(self.strategy.user_agent, req.headers['User-Agent']) def test_submit_spam(self): req = Mock(authname='anonymous', base_url='http://example.org/', remote_addr='127.0.0.1', get_header=lambda x: None) self.env.config.set('spam-filter', 'akismet_api_key', 'mykey') self.urlopen.responses = ['valid', ''] retval = self.strategy.train(req, 'anonymous', 'foobar', spam=True) req = self.urlopen.requests[1] self.assertEqual('http://mykey.rest.akismet.com/1.1/submit-spam', req.url) self.assertEqual('user_ip=127.0.0.1&referrer=unknown&' 'blog=http%3A%2F%2Fexample.org%2F&user_agent=None&' 'comment_content=foobar&comment_author=&' 'comment_author_email=anonymous', req.params) self.assertEqual(self.strategy.user_agent, req.headers['User-Agent'])
def render_admin_panel(self, req, cat, page, path_info): req.perm.require('SPAM_CONFIG') data = {} spam_config = self.config['spam-filter'] akismet = AkismetFilterStrategy(self.env) stopforumspam = StopForumSpamFilterStrategy(self.env) botscout = BotScoutFilterStrategy(self.env) fspamlist = FSpamListFilterStrategy(self.env) ip_blacklist_default = ip6_blacklist_default = \ url_blacklist_default = None if HttpBLFilterStrategy: ip_blacklist = IPBlacklistFilterStrategy(self.env) ip_blacklist_default = ip_blacklist.servers_default ip6_blacklist_default = ip_blacklist.servers6_default url_blacklist = URLBlacklistFilterStrategy(self.env) url_blacklist_default = url_blacklist.servers_default mollom = 0 if MollomFilterStrategy: mollom = MollomFilterStrategy(self.env) blogspam = BlogSpamFilterStrategy(self.env) if req.method == 'POST': if 'cancel' in req.args: req.redirect(req.href.admin(cat, page)) akismet_api_url = req.args.get('akismet_api_url') akismet_api_key = req.args.get('akismet_api_key') mollom_api_url = req.args.get('mollom_api_url') mollom_public_key = req.args.get('mollom_public_key') mollom_private_key = req.args.get('mollom_private_key') stopforumspam_api_key = req.args.get('stopforumspam_api_key') botscout_api_key = req.args.get('botscout_api_key') fspamlist_api_key = req.args.get('fspamlist_api_key') httpbl_api_key = req.args.get('httpbl_api_key') ip_blacklist_servers = req.args.get('ip_blacklist_servers') ip6_blacklist_servers = req.args.get('ip6_blacklist_servers') url_blacklist_servers = req.args.get('url_blacklist_servers') blogspam_api_url = req.args.get('blogspam_api_url') blogspam_skip_tests = req.args.get('blogspam_skip_tests') use_external = 'use_external' in req.args train_external = 'train_external' in req.args skip_external = req.args.get('skip_external') stop_external = req.args.get('stop_external') skip_externalham = req.args.get('skip_externalham') stop_externalham = req.args.get('stop_externalham') try: verified_key = akismet.verify_key(req, akismet_api_url, akismet_api_key) if akismet_api_key and not verified_key: data['akismeterror'] = 'The API key is invalid' data['error'] = 1 except urllib2.URLError, e: data['alismeterror'] = e.reason[1] data['error'] = 1 if mollom: try: verified_key = mollom.verify_key(req, mollom_api_url, mollom_public_key, mollom_private_key) except urllib2.URLError, e: data['mollomerror'] = e.reason[1] data['error'] = 1 else: if mollom_public_key and mollom_private_key and \ not verified_key: data['mollomerror'] = 'The API keys are invalid' data['error'] = 1
class AkismetFilterStrategyTestCase(unittest.TestCase): def setUp(self): self.env = EnvironmentStub(enable=[AkismetFilterStrategy]) self.strategy = AkismetFilterStrategy(self.env) self.urlopen = akismet.urllib2.urlopen = DummyURLOpener() def test_no_api_key(self): req = MockRequest(self.env) retval = self.strategy.test(req, 'anonymous', 'foobar', req.remote_addr) self.assertEqual(None, retval) def test_bad_api_key(self): req = MockRequest(self.env) self.env.config.set('spam-filter', 'akismet_api_key', 'INVALID') self.urlopen.responses = ['invalid'] retval = self.strategy.test(req, 'anonymous', 'foobar', req.remote_addr) self.assertEqual(None, retval) self.assertEqual(1, len(self.urlopen.requests)) req = self.urlopen.requests[0] self.assertEqual('http://rest.akismet.com/1.1/verify-key', req.url) self.assertEqual('blog=http%3A%2F%2Fexample.org%2Ftrac.cgi' '&key=INVALID', req.params) self.assertEqual(user_agent, req.headers['User-Agent']) def test_check_ham(self): req = MockRequest(self.env) self.env.config.set('spam-filter', 'akismet_api_key', 'mykey') self.urlopen.responses = ['valid', 'false'] retval = self.strategy.test(req, 'anonymous', 'foobar', req.remote_addr) self.assertEqual(None, retval) self.assertEqual(2, len(self.urlopen.requests)) req = self.urlopen.requests[1] self.assertEqual('http://mykey.rest.akismet.com/1.1/comment-check', req.url) self.assertEqual('user_ip=127.0.0.1&comment_type=trac&' 'referrer=unknown&HTTP_ACCEPT_LANGUAGE=en-US&' 'blog=http%3A%2F%2Fexample.org%2Ftrac.cgi&' 'user_agent=None&comment_content=foobar&' 'comment_author=anonymous', req.params) self.assertEqual(user_agent, req.headers['User-Agent']) def test_check_spam(self): req = MockRequest(self.env) self.env.config.set('spam-filter', 'akismet_api_key', 'mykey') self.urlopen.responses = ['valid', 'true'] retval = self.strategy.test(req, 'anonymous', 'foobar', req.remote_addr) self.assertEqual((-10, 'Akismet says content is spam'), retval) self.assertEqual(2, len(self.urlopen.requests)) def test_submit_ham(self): req = MockRequest(self.env) self.env.config.set('spam-filter', 'akismet_api_key', 'mykey') self.urlopen.responses = ['valid', ''] self.strategy.train(req, 'anonymous', 'foobar', req.remote_addr, spam=False) req = self.urlopen.requests[1] self.assertEqual('http://mykey.rest.akismet.com/1.1/submit-ham', req.url) self.assertEqual('user_ip=127.0.0.1&comment_type=trac&' 'referrer=unknown&HTTP_ACCEPT_LANGUAGE=en-US&' 'blog=http%3A%2F%2Fexample.org%2Ftrac.cgi&' 'user_agent=None&comment_content=foobar&' 'comment_author=anonymous', req.params) self.assertEqual(user_agent, req.headers['User-Agent']) def test_submit_spam(self): req = MockRequest(self.env) self.env.config.set('spam-filter', 'akismet_api_key', 'mykey') self.urlopen.responses = ['valid', ''] self.strategy.train(req, 'anonymous', 'foobar', req.remote_addr, spam=True) req = self.urlopen.requests[1] self.assertEqual('http://mykey.rest.akismet.com/1.1/submit-spam', req.url) self.assertEqual('user_ip=127.0.0.1&comment_type=trac&' 'referrer=unknown&HTTP_ACCEPT_LANGUAGE=en-US&' 'blog=http%3A%2F%2Fexample.org%2Ftrac.cgi&' 'user_agent=None&comment_content=foobar' '&comment_author=anonymous', req.params) self.assertEqual(user_agent, req.headers['User-Agent'])