27 lines
844 B
Python
27 lines
844 B
Python
|
|
from board.models import Ban, RangeBan
|
||
|
|
import ipaddress
|
||
|
|
|
||
|
|
|
||
|
|
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
|