Last active 1716158530

This expression policy checks users against the StopForumSpam API during enrollment and rejects them if they've been reported within a specified threshold

Revision 82b8226d7d71b916522a56982eec9fb562aa97c3

stopforumspam-checker.py Raw
1# The amount of days within which to check if the user was reported
2LAST_SEEN_THRESHOLD = 180
3LAST_SEEN_REGEX = r"<lastseen>(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})<\/lastseen>"
4
5# The contact name to use in rejection messages
6CONTACT = "Admin at admin@example.com"
7
8from urllib.parse import urlencode
9from datetime import datetime
10import requests
11import re
12
13prompt_data = request.context.get("prompt_data")
14
15user_data = {}
16if ak_client_ip != ip_address('255.255.255.255'):
17 user_data['ip'] = str(ak_client_ip)
18if 'email' in prompt_data:
19 user_data['email'] = prompt_data['email']
20if 'username' in prompt_data:
21 user_data['username'] = prompt_data['username']
22
23if len(user_data) == 0:
24 ak_logger.warning("Could not find any user data to check against StopForumSpam")
25 return True
26
27context['sfs_data'] = user_data
28resp = requests.get("http://api.stopforumspam.org/api?" + urlencode(user_data))
29
30if resp.status_code != 200:
31 ak_message(f"There was an error creating your account. Please contact {CONTACT} with the following details: SFS HTTP Error {resp.status_code}")
32 ak_logger.warning("StopForumSpam HTTP error", status_code=resp.status_code)
33 return False
34
35matches = re.search(LAST_SEEN_REGEX, resp.text)
36if matches is None:
37 return True
38
39last_seen = datetime.strptime(matches.group(1), '%Y-%m-%d %H:%M:%S')
40time_elapsed = datetime.now() - last_seen
41
42if time_elapsed.days < LAST_SEEN_THRESHOLD:
43 ak_message(f"Sorry, we cannot create your account at this time. Please come back later or contact {CONTACT} if the issue persists.")
44 return False
45
46return True