Compare commits
3
Commits
3c420018ad
...
ae73c0bce5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ae73c0bce5 | ||
|
|
3f2ccc6f04 | ||
|
|
40875b1ff1 |
@@ -60,6 +60,7 @@ class OutboundFactory:
|
||||
outbound_cls = cls._scheme_registry[scheme]
|
||||
return outbound_cls.from_link(target_storage, link)
|
||||
|
||||
# устаревший метод, удалить после рефакторинга
|
||||
@classmethod
|
||||
def from_inbound(
|
||||
cls,
|
||||
@@ -79,6 +80,19 @@ class OutboundFactory:
|
||||
)
|
||||
return username, outbound
|
||||
|
||||
@classmethod
|
||||
def from_xray_inbound(
|
||||
cls, ts: TargetStorage, client: dict, inbound: dict
|
||||
) -> Outbound:
|
||||
protocol = inbound.get("protocol")
|
||||
|
||||
if protocol not in cls._registry:
|
||||
raise ValueError(f"Unsupported protocol: {protocol}")
|
||||
|
||||
outbound_cls = cls._registry[protocol]
|
||||
outbound = outbound_cls.from_xray_inbound(ts, client, inbound)
|
||||
return outbound
|
||||
|
||||
@classmethod
|
||||
def from_spec(
|
||||
cls,
|
||||
@@ -121,6 +135,12 @@ class Outbound(ABC):
|
||||
inbound: dict,
|
||||
) -> tuple[str, Outbound]: ...
|
||||
|
||||
@classmethod
|
||||
@abstractmethod
|
||||
def from_xray_inbound(
|
||||
cls, ts: TargetStorage, client: dict, inbound: dict
|
||||
) -> Outbound: ...
|
||||
|
||||
@classmethod
|
||||
@abstractmethod
|
||||
def from_scratch(
|
||||
@@ -145,8 +165,8 @@ class Outbound(ABC):
|
||||
|
||||
@staticmethod
|
||||
def split_client_email(email: str) -> tuple[str, str]:
|
||||
username, target = email.rsplit("-", 1)
|
||||
return username, target
|
||||
username, target_id = email.rsplit("-", 1)
|
||||
return username, target_id
|
||||
|
||||
@abstractmethod
|
||||
def __hash__(self) -> int: ...
|
||||
|
||||
@@ -7,7 +7,7 @@ from .outbound import Outbound, OutboundFactory, OutboundSpec
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .target import TargetStorage
|
||||
from .xray_config import XrayConfig
|
||||
from .xray_config import XrayConfig, XrayStorage
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -41,6 +41,18 @@ class User:
|
||||
|
||||
self.outbounds = list(user_specs.values())
|
||||
|
||||
def add_to_xray_inbounds(self, xrs: XrayStorage):
|
||||
added = False
|
||||
xray_inbounds = xrs.load_inbounds()
|
||||
for outbound in self.outbounds:
|
||||
for xray_inbound in xray_inbounds:
|
||||
if outbound.matches_inbound(xray_inbound):
|
||||
outbound.add_to_inbound(xray_inbound, self.username)
|
||||
added = True
|
||||
|
||||
if not added:
|
||||
raise RuntimeError(f"Inbound not found for {outbound}")
|
||||
|
||||
|
||||
class UserFactory:
|
||||
@staticmethod
|
||||
@@ -62,5 +74,27 @@ class UserFactory:
|
||||
return user
|
||||
|
||||
@staticmethod
|
||||
def empty(username: str):
|
||||
def empty(username: str) -> User:
|
||||
return User(username, [])
|
||||
|
||||
@staticmethod
|
||||
def from_xray_inbound(username: str, ts: TargetStorage, xrs: XrayStorage):
|
||||
user_outbounds: list[Outbound] = []
|
||||
|
||||
inbounds: list[dict] = xrs.load_inbounds()
|
||||
for inbound in inbounds:
|
||||
protocol = inbound.get("protocol")
|
||||
|
||||
if protocol in OutboundFactory._registry:
|
||||
settings = inbound.get("settings", {})
|
||||
clients = settings.get("clients", [])
|
||||
|
||||
for client in clients:
|
||||
email = client.get("email", "")
|
||||
inbound_username, _ = Outbound.split_client_email(email)
|
||||
|
||||
if inbound_username == username:
|
||||
user_outbound = OutboundFactory.from_xray_inbound(
|
||||
ts, client, inbound
|
||||
)
|
||||
user_outbounds.append(user_outbound)
|
||||
|
||||
@@ -157,3 +157,19 @@ class XrayConfig:
|
||||
self._save_json(self.inbounds_data[filename], path)
|
||||
|
||||
return True
|
||||
|
||||
|
||||
class XrayStorage:
|
||||
def __init__(self, config_path: Path):
|
||||
self.path = config_path
|
||||
|
||||
self.inbounds_files: list
|
||||
self.outbound_files: list
|
||||
self.routings_files: list
|
||||
|
||||
self.inbounds: list[dict]
|
||||
self.outbouns: list[dict]
|
||||
self.routings: list[dict]
|
||||
|
||||
def load_inbounds(self) -> list[dict]:
|
||||
return self.inbounds
|
||||
|
||||
Reference in New Issue
Block a user