Files
interchan/board/utils.py
Alek Ratzloff c53111ea60 Add user tripcodes
Users can separate their name and a password with ## to create the
illusion of consistent posting.

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
2022-07-20 00:28:02 -07:00

70 lines
2.0 KiB
Python

import base64
import hashlib
import ipaddress
import random
import string
from typing import Optional, TYPE_CHECKING
from django.utils import timezone
from django.conf import settings
from board.models import Ban, RangeBan
if TYPE_CHECKING:
from board.models import Board
def get_client_ip(request):
"Get the IP address of a client-side request. Shamelessly copy/pasted from StackOverflow."
x_forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR")
if x_forwarded_for:
ip = x_forwarded_for.split(",")[0]
else:
ip = request.META.get("REMOTE_ADDR")
return ip
def get_ip_bans(ip: str) -> list:
bans = list(Ban.objects.filter(ip=ip))
ip_addr = ipaddress.ip_address(ip)
for rangeban in RangeBan.objects.all():
start = ipaddress.ip_address(rangeban.start)
end = ipaddress.ip_address(rangeban.end)
if ip_addr.version != start.version or ip_addr.version != end.version:
continue
if start <= ip_addr <= end: # type: ignore
bans += [rangeban]
return bans
def is_banned(ip: str, board: Optional["Board"]) -> bool:
now = timezone.now()
bans = [ban for ban in get_ip_bans(ip) if ban.board == board or not ban.board]
if bans:
active = [ban for ban in bans if not ban.expires or ban.expires > now]
expired = [ban for ban in bans if ban.expires and ban.expires <= now]
# Delete expired bans
for ban in expired:
ban.delete()
return bool(active)
else:
return False
def generate_user_token() -> str:
"""
Generates a non-secure user token.
User tokens need not be secure so this is a simple implementation.
"""
return "".join(random.choices(string.ascii_letters, k=settings.USER_TOKEN_LENGTH))
def generate_tripcode(value: str) -> str:
hasher = hashlib.sha256()
hasher.update(settings.TRIPCODE_SALT.encode())
hasher.update(value.encode())
trip = base64.b64encode(hasher.digest()).decode("ascii")
return trip[0:10]