93 lines
3.1 KiB
Python
93 lines
3.1 KiB
Python
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)
|