import socket import ipware import ipaddress from typing import Tuple from django.http import HttpRequest from django.conf import settings def check_ec2_instance_port(public_ip: str, port: int, timeout: int = 5) -> bool: """ Check if the port is open on the EC2 instance. """ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.settimeout(timeout) try: s.connect((public_ip, port)) return True except socket.error: return False def get_client_ip(request: HttpRequest) -> Tuple[str, bool]: """ Get the client real IP address. Returns a tuple of (ip, is_routable). """ return ipware.get_client_ip(request, proxy_count=settings.PROXY_COUNT) def is_from_company_vpn(request: HttpRequest) -> bool: """ Check if the request is coming from company secure VPN. """ cached = getattr(request, "_is_from_company_vpn", None) if cached is not None: return cached ip, _ = get_client_ip(request) if not ip: request._is_from_company_vpn = False return False try: client_ip = ipaddress.ip_address(ip) except ValueError: request._is_from_company_vpn = False return False request._is_from_company_vpn = False for cidr in settings.COMPANY_VPN_CIDRS: if client_ip in cidr: request._is_from_company_vpn = True break return request._is_from_company_vpn