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