gitscope
https://dev.kronoz.win/r/marzneshin.git
app/models/proxy.py · v0.4.1
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 a47eb4c Dawsh 2y ago
15 a47eb4c Dawsh 2y ago
16 a47eb4c Dawsh 2y ago class InboundHostSecurity(str, Enum):
17 a47eb4c Dawsh 2y ago inbound_default = "inbound_default"
18 a47eb4c Dawsh 2y ago none = "none"
19 a47eb4c Dawsh 2y ago tls = "tls"
20 a47eb4c Dawsh 2y ago
21 a47eb4c Dawsh 2y ago
22 a47eb4c Dawsh 2y ago InboundHostALPN = Enum(
23 a47eb4c Dawsh 2y ago "ProxyHostALPN",
24 a47eb4c Dawsh 2y ago {
25 244c9d8 Dawsh 2y ago "none": "none",
26 a47eb4c Dawsh 2y ago "h2": "h2",
27 a47eb4c Dawsh 2y ago "http/1.1": "http/1.1",
28 a47eb4c Dawsh 2y ago "h2,http/1.1": "h2,http/1.1",
29 cba39e7 Mardin 2y ago "h3": "h3",
30 cba39e7 Mardin 2y ago "h3,h2": "h3,h2",
31 cba39e7 Mardin 2y ago "h3,h2,http/1.1": "h3,h2,http/1.1",
32 a47eb4c Dawsh 2y ago },
33 a47eb4c Dawsh 2y ago )
34 a47eb4c Dawsh 2y ago
35 a47eb4c Dawsh 2y ago
36 a47eb4c Dawsh 2y ago InboundHostFingerprint = Enum(
37 a47eb4c Dawsh 2y ago "ProxyHostFingerprint",
38 a47eb4c Dawsh 2y ago {
39 a47eb4c Dawsh 2y ago "none": "",
40 a47eb4c Dawsh 2y ago "chrome": "chrome",
41 a47eb4c Dawsh 2y ago "firefox": "firefox",
42 a47eb4c Dawsh 2y ago "safari": "safari",
43 a47eb4c Dawsh 2y ago "ios": "ios",
44 a47eb4c Dawsh 2y ago "android": "android",
45 a47eb4c Dawsh 2y ago "edge": "edge",
46 a47eb4c Dawsh 2y ago "360": "360",
47 a47eb4c Dawsh 2y ago "qq": "qq",
48 a47eb4c Dawsh 2y ago "random": "random",
49 a47eb4c Dawsh 2y ago "randomized": "randomized",
50 a47eb4c Dawsh 2y ago },
51 a47eb4c Dawsh 2y ago )
52 a47eb4c Dawsh 2y ago
53 a47eb4c Dawsh 2y ago
54 a47eb4c Dawsh 2y ago class FormatVariables(dict):
55 a47eb4c Dawsh 2y ago def __missing__(self, key):
56 a47eb4c Dawsh 2y ago return key.join("{}")
57 a47eb4c Dawsh 2y ago
58 a47eb4c Dawsh 2y ago
59 0b152b5 Mrdn 2y ago class FragmentSettings(BaseModel):
60 0b152b5 Mrdn 2y ago packets: str = Field(pattern=r"^(:?tlshello|[\d-]{1,32})$")
61 0b152b5 Mrdn 2y ago length: str = Field(pattern=r"^[\d-]{1,32}$")
62 0b152b5 Mrdn 2y ago interval: str = Field(pattern=r"^[\d-]{1,32}$")
63 0b152b5 Mrdn 2y ago
64 0b152b5 Mrdn 2y ago
65 a47eb4c Dawsh 2y ago class InboundHost(BaseModel):
66 a47eb4c Dawsh 2y ago remark: str
67 a47eb4c Dawsh 2y ago address: str
68 db68a58 Dawsh 2y ago port: int | None = Field(None)
69 db68a58 Dawsh 2y ago sni: str | None = Field(None)
70 db68a58 Dawsh 2y ago host: str | None = Field(None)
71 db68a58 Dawsh 2y ago path: str | None = Field(None)
72 a47eb4c Dawsh 2y ago security: InboundHostSecurity = InboundHostSecurity.inbound_default
73 a47eb4c Dawsh 2y ago alpn: InboundHostALPN = InboundHostALPN.none
74 a47eb4c Dawsh 2y ago fingerprint: InboundHostFingerprint = InboundHostFingerprint.none
75 db68a58 Dawsh 2y ago allowinsecure: bool | None = None
76 db68a58 Dawsh 2y ago is_disabled: bool | None = None
77 0b152b5 Mrdn 2y ago mux: bool = Field(False)
78 db68a58 Dawsh 2y ago fragment: FragmentSettings | None = Field(None)
79 a47eb4c Dawsh 2y ago model_config = ConfigDict(from_attributes=True)
80 a47eb4c Dawsh 2y ago
81 2127962 Dawsh 2y ago @field_validator("remark", "address", "path")
82 2127962 Dawsh 2y ago @classmethod
83 2127962 Dawsh 2y ago def validate_fmt_variables(cls, v: str) -> str:
84 a47eb4c Dawsh 2y ago if not v:
85 a47eb4c Dawsh 2y ago return v
86 2127962 Dawsh 2y ago
87 2127962 Dawsh 2y ago v.format_map(FormatVariables())
88 a47eb4c Dawsh 2y ago
89 a47eb4c Dawsh 2y ago return v
90 a47eb4c Dawsh 2y ago
91 244c9d8 Dawsh 2y ago @field_validator("alpn", mode="before")
92 244c9d8 Dawsh 2y ago @classmethod
93 244c9d8 Dawsh 2y ago def validate_alpn(cls, v):
94 244c9d8 Dawsh 2y ago if not v:
95 244c9d8 Dawsh 2y ago return InboundHostALPN.none
96 244c9d8 Dawsh 2y ago return v
97 244c9d8 Dawsh 2y ago
98 a47eb4c Dawsh 2y ago
99 2de9d72 Dawsh 2y ago class InboundHostResponse(InboundHost):
100 2de9d72 Dawsh 2y ago id: int
101 2de9d72 Dawsh 2y ago
102 2de9d72 Dawsh 2y ago
103 db68a58 Dawsh 2y ago class Inbound(BaseModel):
104 db68a58 Dawsh 2y ago id: int
105 db68a58 Dawsh 2y ago tag: str
106 db68a58 Dawsh 2y ago protocol: ProxyTypes
107 4d647dd Dawsh 2y ago config: str
108 db68a58 Dawsh 2y ago node: Node
109 db68a58 Dawsh 2y ago service_ids: list[int]
110 a47eb4c Dawsh 2y ago model_config = ConfigDict(from_attributes=True)