's'
This commit is contained in:
92
proxy.py
Normal file
92
proxy.py
Normal file
@@ -0,0 +1,92 @@
|
||||
import os
|
||||
import sys
|
||||
from enum import Enum, auto
|
||||
from dataclasses import dataclass, field
|
||||
from utils import logger
|
||||
|
||||
|
||||
class ProxyType(Enum):
|
||||
HTTP = auto()
|
||||
HTTPS = auto()
|
||||
SOCKS = auto()
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class ProxyInfo:
|
||||
ip: str = field(default="", repr=True)
|
||||
port: str = field(default="", repr=True)
|
||||
|
||||
def __post_init__(self):
|
||||
if (self.ip and not self.port) or (not self.ip and self.port):
|
||||
raise ValueError("IP or port cannot be empty")
|
||||
|
||||
if (self.ip and self.port) and (not self.port.isdigit() or not (1 <= int(self.port) <= 65535)):
|
||||
raise ValueError("Port must be a digit between 1 and 65535")
|
||||
|
||||
|
||||
class ProxyDetector:
|
||||
def __init__(self):
|
||||
if sys.platform.startswith('win'):
|
||||
import winreg
|
||||
self.winreg = winreg
|
||||
self.__path = r'Software\Microsoft\Windows\CurrentVersion\Internet Settings'
|
||||
with winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) as key_user:
|
||||
self.__INTERNET_SETTINGS = winreg.OpenKeyEx(key_user, self.__path, 0, winreg.KEY_ALL_ACCESS)
|
||||
else:
|
||||
self.__is_windows = False
|
||||
|
||||
def get_proxy_info(self) -> ProxyInfo:
|
||||
if sys.platform.startswith('win'):
|
||||
ip, port = self._get_proxy_info_windows()
|
||||
else:
|
||||
ip, port = self._get_proxy_info_linux()
|
||||
return ProxyInfo(ip, port)
|
||||
|
||||
def is_proxy_enabled(self) -> bool:
|
||||
if sys.platform.startswith('win'):
|
||||
return self._is_proxy_enabled_windows()
|
||||
else:
|
||||
return self._is_proxy_enabled_linux()
|
||||
|
||||
def _get_proxy_info_windows(self) -> tuple[str, str]:
|
||||
ip, port = "", ""
|
||||
if self._is_proxy_enabled_windows():
|
||||
try:
|
||||
ip_port = self.winreg.QueryValueEx(self.__INTERNET_SETTINGS, "ProxyServer")[0]
|
||||
if ip_port:
|
||||
ip, port = ip_port.split(":")
|
||||
except FileNotFoundError as err:
|
||||
logger.warning("No proxy information found: " + str(err))
|
||||
except Exception as err:
|
||||
logger.error("An error occurred: " + str(err))
|
||||
else:
|
||||
logger.debug("No proxy is enabled on the system")
|
||||
return ip, port
|
||||
|
||||
def _is_proxy_enabled_windows(self) -> bool:
|
||||
try:
|
||||
if self.winreg.QueryValueEx(self.__INTERNET_SETTINGS, "ProxyEnable")[0] == 1:
|
||||
return True
|
||||
except FileNotFoundError as err:
|
||||
print("No proxy information found: " + str(err))
|
||||
except Exception as err:
|
||||
print("An error occurred: " + str(err))
|
||||
return False
|
||||
|
||||
@staticmethod
|
||||
def _get_proxy_info_linux() -> tuple[str, str]:
|
||||
proxies = {
|
||||
'http': os.getenv('http_proxy'),
|
||||
'https': os.getenv('https_proxy'),
|
||||
'ftp': os.getenv('ftp_proxy')
|
||||
}
|
||||
ip = port = ""
|
||||
for proto, proxy in proxies.items():
|
||||
if proxy:
|
||||
ip, port = proxy.split(':')
|
||||
break
|
||||
return ip, port
|
||||
|
||||
def _is_proxy_enabled_linux(self) -> bool:
|
||||
proxies = self._get_proxy_info_linux()
|
||||
return any(proxy != '' for proxy in proxies)
|
||||
Reference in New Issue
Block a user