gitscope
https://dev.kronoz.win/r/marzneshin.git
app/models/proxy.py · v0.6.3
Source
1 a47eb4c Dawsh 2y ago from enum import Enum
2 01cdf2e Dawsh 2y ago
3 2127962 Dawsh 2y ago from pydantic import ConfigDict, BaseModel, Field, field_validator
4 a47eb4c Dawsh 2y ago
5 db68a58 Dawsh 2y ago from app.models.node import Node
6 a47eb4c Dawsh 2y ago
7 a47eb4c Dawsh 2y ago
8 a47eb4c Dawsh 2y ago class ProxyTypes(str, Enum):
9 a47eb4c Dawsh 2y ago # proxy_type = protocol
10 a47eb4c Dawsh 2y ago VMess = "vmess"
11 a47eb4c Dawsh 2y ago VLESS = "vless"
12 a47eb4c Dawsh 2y ago Trojan = "trojan"
13 a47eb4c Dawsh 2y ago Shadowsocks = "shadowsocks"
14 0f3112a Dawsh 2y ago Shadowsocks2022 = "shadowsocks2022"
15 dd32f70 Dawsh 2y ago Hysteria2 = "hysteria2"
16 0f3112a Dawsh 2y ago WireGuard = "wireguard"
17 0f3112a Dawsh 2y ago TUIC = "tuic"
18 70b35e2 Dawsh 1y ago ShadowTLS = "shadowtls"
19 a47eb4c Dawsh 2y ago
20 a47eb4c Dawsh 2y ago
21 a47eb4c Dawsh 2y ago class InboundHostSecurity(str, Enum):
22 a47eb4c Dawsh 2y ago inbound_default = "inbound_default"
23 a47eb4c Dawsh 2y ago none = "none"
24 a47eb4c Dawsh 2y ago tls = "tls"
25 a47eb4c Dawsh 2y ago
26 a47eb4c Dawsh 2y ago
27 a47eb4c Dawsh 2y ago InboundHostALPN = Enum(
28 a47eb4c Dawsh 2y ago "ProxyHostALPN",
29 a47eb4c Dawsh 2y ago {
30 244c9d8 Dawsh 2y ago "none": "none",
31 a47eb4c Dawsh 2y ago "h2": "h2",
32 a47eb4c Dawsh 2y ago "http/1.1": "http/1.1",
33 a47eb4c Dawsh 2y ago "h2,http/1.1": "h2,http/1.1",
34 cba39e7 Mardin 2y ago "h3": "h3",
35 cba39e7 Mardin 2y ago "h3,h2": "h3,h2",
36 cba39e7 Mardin 2y ago "h3,h2,http/1.1": "h3,h2,http/1.1",
37 a47eb4c Dawsh 2y ago },
38 a47eb4c Dawsh 2y ago )
39 a47eb4c Dawsh 2y ago
40 a47eb4c Dawsh 2y ago
41 a47eb4c Dawsh 2y ago InboundHostFingerprint = Enum(
42 a47eb4c Dawsh 2y ago "ProxyHostFingerprint",
43 a47eb4c Dawsh 2y ago {
44 a47eb4c Dawsh 2y ago "none": "",
45 a47eb4c Dawsh 2y ago "chrome": "chrome",
46 a47eb4c Dawsh 2y ago "firefox": "firefox",
47 a47eb4c Dawsh 2y ago "safari": "safari",
48 a47eb4c Dawsh 2y ago "ios": "ios",
49 a47eb4c Dawsh 2y ago "android": "android",
50 a47eb4c Dawsh 2y ago "edge": "edge",
51 a47eb4c Dawsh 2y ago "360": "360",
52 a47eb4c Dawsh 2y ago "qq": "qq",
53 a47eb4c Dawsh 2y ago "random": "random",
54 a47eb4c Dawsh 2y ago "randomized": "randomized",
55 a47eb4c Dawsh 2y ago },
56 a47eb4c Dawsh 2y ago )
57 a47eb4c Dawsh 2y ago
58 a47eb4c Dawsh 2y ago
59 a47eb4c Dawsh 2y ago class FormatVariables(dict):
60 a47eb4c Dawsh 2y ago def __missing__(self, key):
61 a47eb4c Dawsh 2y ago return key.join("{}")
62 a47eb4c Dawsh 2y ago
63 a47eb4c Dawsh 2y ago
64 0b152b5 Mrdn 2y ago class FragmentSettings(BaseModel):
65 0b152b5 Mrdn 2y ago packets: str = Field(pattern=r"^(:?tlshello|[\d-]{1,32})$")
66 0b152b5 Mrdn 2y ago length: str = Field(pattern=r"^[\d-]{1,32}$")
67 0b152b5 Mrdn 2y ago interval: str = Field(pattern=r"^[\d-]{1,32}$")
68 0b152b5 Mrdn 2y ago
69 0b152b5 Mrdn 2y ago
70 d636f3f Dawsh 2y ago class UDPNoiseSettings(BaseModel):
71 d636f3f Dawsh 2y ago type: str = Field(pattern=r"^(:?rand|str|base64)$")
72 d636f3f Dawsh 2y ago packet: str = Field()
73 d636f3f Dawsh 2y ago interval: str = Field(pattern=r"^[\d-]{1,32}$")
74 d636f3f Dawsh 2y ago
75 d636f3f Dawsh 2y ago
76 a47eb4c Dawsh 2y ago class InboundHost(BaseModel):
77 a47eb4c Dawsh 2y ago remark: str
78 a47eb4c Dawsh 2y ago address: str
79 db68a58 Dawsh 2y ago port: int | None = Field(None)
80 db68a58 Dawsh 2y ago sni: str | None = Field(None)
81 db68a58 Dawsh 2y ago host: str | None = Field(None)
82 db68a58 Dawsh 2y ago path: str | None = Field(None)
83 a47eb4c Dawsh 2y ago security: InboundHostSecurity = InboundHostSecurity.inbound_default
84 a47eb4c Dawsh 2y ago alpn: InboundHostALPN = InboundHostALPN.none
85 a47eb4c Dawsh 2y ago fingerprint: InboundHostFingerprint = InboundHostFingerprint.none
86 d636f3f Dawsh 2y ago allowinsecure: bool | None = False
87 d636f3f Dawsh 2y ago is_disabled: bool | None = False
88 0b152b5 Mrdn 2y ago mux: bool = Field(False)
89 db68a58 Dawsh 2y ago fragment: FragmentSettings | None = Field(None)
90 d636f3f Dawsh 2y ago udp_noises: list[UDPNoiseSettings] | None = []
91 d636f3f Dawsh 2y ago http_headers: dict[str, list[str]] | None = {}
92 d636f3f Dawsh 2y ago mtu: int | None = None
93 d636f3f Dawsh 2y ago dns_servers: str | None = None
94 b584c6c Dawsh 2y ago allowed_ips: str | None = None
95 e422d72 Dawsh 2y ago weight: int = 1
96 d636f3f Dawsh 2y ago protocol: ProxyTypes | None = None
97 d636f3f Dawsh 2y ago inbound_id: int | None = None
98 a47eb4c Dawsh 2y ago model_config = ConfigDict(from_attributes=True)
99 a47eb4c Dawsh 2y ago
100 2127962 Dawsh 2y ago @field_validator("remark", "address", "path")
101 2127962 Dawsh 2y ago @classmethod
102 2127962 Dawsh 2y ago def validate_fmt_variables(cls, v: str) -> str:
103 a47eb4c Dawsh 2y ago if not v:
104 a47eb4c Dawsh 2y ago return v
105 2127962 Dawsh 2y ago
106 2127962 Dawsh 2y ago v.format_map(FormatVariables())
107 a47eb4c Dawsh 2y ago
108 a47eb4c Dawsh 2y ago return v
109 a47eb4c Dawsh 2y ago
110 244c9d8 Dawsh 2y ago @field_validator("alpn", mode="before")
111 244c9d8 Dawsh 2y ago @classmethod
112 244c9d8 Dawsh 2y ago def validate_alpn(cls, v):
113 244c9d8 Dawsh 2y ago if not v:
114 244c9d8 Dawsh 2y ago return InboundHostALPN.none
115 244c9d8 Dawsh 2y ago return v
116 244c9d8 Dawsh 2y ago
117 a47eb4c Dawsh 2y ago
118 2de9d72 Dawsh 2y ago class InboundHostResponse(InboundHost):
119 2de9d72 Dawsh 2y ago id: int
120 2de9d72 Dawsh 2y ago
121 2de9d72 Dawsh 2y ago
122 db68a58 Dawsh 2y ago class Inbound(BaseModel):
123 db68a58 Dawsh 2y ago id: int
124 db68a58 Dawsh 2y ago tag: str
125 db68a58 Dawsh 2y ago protocol: ProxyTypes
126 4d647dd Dawsh 2y ago config: str
127 db68a58 Dawsh 2y ago node: Node
128 db68a58 Dawsh 2y ago service_ids: list[int]
129 a47eb4c Dawsh 2y ago model_config = ConfigDict(from_attributes=True)