gitscope
https://dev.kronoz.win/r/marzneshin.git
app/models/proxy.py · v0.3.0
Source
1 a47eb4c Dawsh 2y ago import json
2 a47eb4c Dawsh 2y ago from enum import Enum
3 2127962 Dawsh 2y ago from typing import Optional, List
4 01cdf2e Dawsh 2y ago
5 2127962 Dawsh 2y ago from pydantic import ConfigDict, BaseModel, Field, field_validator
6 a47eb4c Dawsh 2y ago
7 a47eb4c Dawsh 2y ago
8 12b255b Dawsh 2y ago class XTLSFlows(Enum):
9 01cdf2e Dawsh 2y ago NONE = ""
10 01cdf2e Dawsh 2y ago VISION = "xtls-rprx-vision"
11 12b255b Dawsh 2y ago
12 12b255b Dawsh 2y ago
13 12b255b Dawsh 2y ago class ShadowsocksMethods(Enum):
14 01cdf2e Dawsh 2y ago AES_128_GCM = "aes-128-gcm"
15 01cdf2e Dawsh 2y ago AES_256_GCM = "aes-256-gcm"
16 01cdf2e Dawsh 2y ago CHACHA20_POLY1305 = "chacha20-ietf-poly1305"
17 a47eb4c Dawsh 2y ago
18 a47eb4c Dawsh 2y ago
19 a47eb4c Dawsh 2y ago class ProxyTypes(str, Enum):
20 a47eb4c Dawsh 2y ago # proxy_type = protocol
21 a47eb4c Dawsh 2y ago
22 a47eb4c Dawsh 2y ago VMess = "vmess"
23 a47eb4c Dawsh 2y ago VLESS = "vless"
24 a47eb4c Dawsh 2y ago Trojan = "trojan"
25 a47eb4c Dawsh 2y ago Shadowsocks = "shadowsocks"
26 a47eb4c Dawsh 2y ago
27 a47eb4c Dawsh 2y ago @property
28 a47eb4c Dawsh 2y ago def settings_model(self):
29 a47eb4c Dawsh 2y ago if self == self.VMess:
30 a47eb4c Dawsh 2y ago return VMessSettings
31 a47eb4c Dawsh 2y ago if self == self.VLESS:
32 a47eb4c Dawsh 2y ago return VLESSSettings
33 a47eb4c Dawsh 2y ago if self == self.Trojan:
34 a47eb4c Dawsh 2y ago return TrojanSettings
35 a47eb4c Dawsh 2y ago if self == self.Shadowsocks:
36 a47eb4c Dawsh 2y ago return ShadowsocksSettings
37 a47eb4c Dawsh 2y ago
38 a47eb4c Dawsh 2y ago
39 a47eb4c Dawsh 2y ago class ProxySettings(BaseModel):
40 a47eb4c Dawsh 2y ago @classmethod
41 a47eb4c Dawsh 2y ago def from_dict(cls, proxy_type: ProxyTypes, _dict: dict):
42 a47eb4c Dawsh 2y ago return ProxyTypes(proxy_type).settings_model.parse_obj(_dict)
43 a47eb4c Dawsh 2y ago
44 a47eb4c Dawsh 2y ago def dict(self, *, no_obj=False, **kwargs):
45 a47eb4c Dawsh 2y ago if no_obj:
46 a47eb4c Dawsh 2y ago return json.loads(self.json())
47 a47eb4c Dawsh 2y ago return super().dict(**kwargs)
48 a47eb4c Dawsh 2y ago
49 a47eb4c Dawsh 2y ago
50 a47eb4c Dawsh 2y ago class VMessSettings(ProxySettings):
51 a47eb4c Dawsh 2y ago id: str = Field(nullable=False)
52 a47eb4c Dawsh 2y ago
53 a47eb4c Dawsh 2y ago
54 a47eb4c Dawsh 2y ago class VLESSSettings(ProxySettings):
55 a47eb4c Dawsh 2y ago id: str = Field(nullable=False)
56 a47eb4c Dawsh 2y ago flow: XTLSFlows = XTLSFlows.NONE
57 a47eb4c Dawsh 2y ago
58 a47eb4c Dawsh 2y ago
59 a47eb4c Dawsh 2y ago class TrojanSettings(ProxySettings):
60 a47eb4c Dawsh 2y ago password: str = Field(nullable=False)
61 a47eb4c Dawsh 2y ago
62 a47eb4c Dawsh 2y ago
63 a47eb4c Dawsh 2y ago class ShadowsocksSettings(ProxySettings):
64 a47eb4c Dawsh 2y ago password: str = Field(nullable=False)
65 a47eb4c Dawsh 2y ago method: ShadowsocksMethods = ShadowsocksMethods.CHACHA20_POLY1305
66 a47eb4c Dawsh 2y ago
67 a47eb4c Dawsh 2y ago
68 a47eb4c Dawsh 2y ago class InboundHostSecurity(str, Enum):
69 a47eb4c Dawsh 2y ago inbound_default = "inbound_default"
70 a47eb4c Dawsh 2y ago none = "none"
71 a47eb4c Dawsh 2y ago tls = "tls"
72 a47eb4c Dawsh 2y ago
73 a47eb4c Dawsh 2y ago
74 a47eb4c Dawsh 2y ago InboundHostALPN = Enum(
75 a47eb4c Dawsh 2y ago "ProxyHostALPN",
76 a47eb4c Dawsh 2y ago {
77 a47eb4c Dawsh 2y ago "none": "",
78 a47eb4c Dawsh 2y ago "h2": "h2",
79 a47eb4c Dawsh 2y ago "http/1.1": "http/1.1",
80 a47eb4c Dawsh 2y ago "h2,http/1.1": "h2,http/1.1",
81 a47eb4c Dawsh 2y ago },
82 a47eb4c Dawsh 2y ago )
83 a47eb4c Dawsh 2y ago
84 a47eb4c Dawsh 2y ago
85 a47eb4c Dawsh 2y ago InboundHostFingerprint = Enum(
86 a47eb4c Dawsh 2y ago "ProxyHostFingerprint",
87 a47eb4c Dawsh 2y ago {
88 a47eb4c Dawsh 2y ago "none": "",
89 a47eb4c Dawsh 2y ago "chrome": "chrome",
90 a47eb4c Dawsh 2y ago "firefox": "firefox",
91 a47eb4c Dawsh 2y ago "safari": "safari",
92 a47eb4c Dawsh 2y ago "ios": "ios",
93 a47eb4c Dawsh 2y ago "android": "android",
94 a47eb4c Dawsh 2y ago "edge": "edge",
95 a47eb4c Dawsh 2y ago "360": "360",
96 a47eb4c Dawsh 2y ago "qq": "qq",
97 a47eb4c Dawsh 2y ago "random": "random",
98 a47eb4c Dawsh 2y ago "randomized": "randomized",
99 a47eb4c Dawsh 2y ago },
100 a47eb4c Dawsh 2y ago )
101 a47eb4c Dawsh 2y ago
102 a47eb4c Dawsh 2y ago
103 a47eb4c Dawsh 2y ago class FormatVariables(dict):
104 a47eb4c Dawsh 2y ago def __missing__(self, key):
105 a47eb4c Dawsh 2y ago return key.join("{}")
106 a47eb4c Dawsh 2y ago
107 a47eb4c Dawsh 2y ago
108 0b152b5 Mrdn 2y ago class FragmentSettings(BaseModel):
109 0b152b5 Mrdn 2y ago packets: str = Field(pattern=r"^(:?tlshello|[\d-]{1,32})$")
110 0b152b5 Mrdn 2y ago length: str = Field(pattern=r"^[\d-]{1,32}$")
111 0b152b5 Mrdn 2y ago interval: str = Field(pattern=r"^[\d-]{1,32}$")
112 0b152b5 Mrdn 2y ago
113 0b152b5 Mrdn 2y ago
114 a47eb4c Dawsh 2y ago class InboundHost(BaseModel):
115 a47eb4c Dawsh 2y ago remark: str
116 a47eb4c Dawsh 2y ago address: str
117 0b152b5 Mrdn 2y ago port: Optional[int] = Field(None)
118 0b152b5 Mrdn 2y ago sni: Optional[str] = Field(None)
119 0b152b5 Mrdn 2y ago host: Optional[str] = Field(None)
120 0b152b5 Mrdn 2y ago path: Optional[str] = Field(None)
121 a47eb4c Dawsh 2y ago security: InboundHostSecurity = InboundHostSecurity.inbound_default
122 a47eb4c Dawsh 2y ago alpn: InboundHostALPN = InboundHostALPN.none
123 a47eb4c Dawsh 2y ago fingerprint: InboundHostFingerprint = InboundHostFingerprint.none
124 2127962 Dawsh 2y ago allowinsecure: Optional[bool] = None
125 2127962 Dawsh 2y ago is_disabled: Optional[bool] = None
126 0b152b5 Mrdn 2y ago mux: bool = Field(False)
127 0b152b5 Mrdn 2y ago fragment: Optional[FragmentSettings] = Field(None)
128 a47eb4c Dawsh 2y ago model_config = ConfigDict(from_attributes=True)
129 a47eb4c Dawsh 2y ago
130 2127962 Dawsh 2y ago @field_validator("remark", "address", "path")
131 2127962 Dawsh 2y ago @classmethod
132 2127962 Dawsh 2y ago def validate_fmt_variables(cls, v: str) -> str:
133 a47eb4c Dawsh 2y ago if not v:
134 a47eb4c Dawsh 2y ago return v
135 2127962 Dawsh 2y ago
136 2127962 Dawsh 2y ago v.format_map(FormatVariables())
137 a47eb4c Dawsh 2y ago
138 a47eb4c Dawsh 2y ago return v
139 a47eb4c Dawsh 2y ago
140 a47eb4c Dawsh 2y ago
141 2de9d72 Dawsh 2y ago class InboundHostResponse(InboundHost):
142 2de9d72 Dawsh 2y ago id: int
143 2de9d72 Dawsh 2y ago
144 2de9d72 Dawsh 2y ago
145 a47eb4c Dawsh 2y ago class InboundBase(BaseModel):
146 a47eb4c Dawsh 2y ago id: Optional[int] = Field(None)
147 a47eb4c Dawsh 2y ago tag: str = Field()
148 a47eb4c Dawsh 2y ago protocol: ProxyTypes = Field()
149 4d647dd Dawsh 2y ago config: str
150 a47eb4c Dawsh 2y ago node_id: Optional[int] = Field(None)
151 a47eb4c Dawsh 2y ago model_config = ConfigDict(from_attributes=True)
152 a47eb4c Dawsh 2y ago
153 12b255b Dawsh 2y ago
154 a47eb4c Dawsh 2y ago from app.models.service import ServiceBase
155 a47eb4c Dawsh 2y ago from app.models.node import NodeBase
156 a47eb4c Dawsh 2y ago
157 12b255b Dawsh 2y ago
158 a47eb4c Dawsh 2y ago class Inbound(InboundBase):
159 a47eb4c Dawsh 2y ago services: Optional[List[ServiceBase]] = None
160 a47eb4c Dawsh 2y ago node: Optional[NodeBase] = None