import ipaddress from functools import reduce from urllib import parse from django.conf import settings from django.utils.http import url_has_allowed_host_and_scheme def get_client_agent(request): """ The simplest way to get client device. If you want to extend this function, try this: pip install django-user-agents `django-user-agents` is base on `ua-parser` `user-agents`, """ return request.META.get('HTTP_USER_AGENT', '') def get_client_ip(request): # FIX ME: It's dangerous to get ip from `HTTP_X_Forwarded_For` by this way. ip = request.META.get('HTTP_X_FORWARDED_FOR', '').split(',')[0] if ip: return ip ip = request.META.get('HTTP_X_REAL_IP') if ip: return ip return request.META.get('REMOTE_ADDR') def ip_into_int(ip): return reduce(lambda x, y: (x << 8) + y, map(int, ip.split('.'))) def is_internal_ip(ip): if ip == '127.0.0.1': return True ip = ip_into_int(ip) net_a = ip_into_int('10.255.255.255') >> 24 net_b = ip_into_int('172.31.255.255') >> 20 net_c = ip_into_int('192.168.255.255') >> 16 return ip >> 24 == net_a or ip >> 20 == net_b or ip >> 16 == net_c def get_safe_redirect_uri(redirect_to, request): safe_hosts = settings.TRUSTED_HOSTS + [request.get_host()] if not url_has_allowed_host_and_scheme(redirect_to, allowed_hosts=safe_hosts): redirect_to = '{}://{}'.format(request.scheme, request.get_host()) return redirect_to def get_pure_url(url): _url_parse = parse.urlparse(url) return '{}://{}{}'.format( _url_parse.scheme, _url_parse.netloc, _url_parse.path ) def is_vpn_ip(ip): if not isinstance(ip, ipaddress.IPv4Address): ip = ipaddress.ip_address(ip) for vpn_ip in settings.VPN_IP_LIST: if ip in ipaddress.ip_network(vpn_ip, strict=False): return True return False