-
Notifications
You must be signed in to change notification settings - Fork 617
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
105 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters