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