Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
c878882
feat(node): preserve and expose last-known xray_version data
FunLay123 Jul 3, 2026
5d63398
feat(node): migrate xhttp session keys for Xray 26.6.22+
FunLay123 Jul 3, 2026
9db8823
feat(hosts): add sessionIDTable/sessionIDLength controls
FunLay123 Jul 3, 2026
c29dfad
feat(core-editor): make Xray validation and UI version-aware
FunLay123 Jul 3, 2026
f69403f
feat(core-editor): unify xhttp sessionID room-size validation
FunLay123 Jul 3, 2026
d6851f4
chore: clean up misleading comments
FunLay123 Jul 3, 2026
ea98922
Merge pull request #2 from FunLay123/dev
FunLay123 Jul 3, 2026
c95f432
fix(node): stop force-migrating stored core config, warn on pre-relea…
FunLay123 Jul 3, 2026
229513d
feat(node): warn when a core config is shared across nodes on differe…
FunLay123 Jul 3, 2026
6dded60
fix(node): make shared-core xray_version lookup deterministic
FunLay123 Jul 3, 2026
b6acb3d
fix(node): unify pre-release warning with breaking-change styling, dr…
FunLay123 Jul 3, 2026
28ee044
fix(core-editor): flag sessionIDTable set without sessionIDLength
FunLay123 Jul 3, 2026
c896541
fix(hosts): include sessionIDTable/sessionIDLength when loading a hos…
FunLay123 Jul 4, 2026
de58089
fix(subscription): order sessionIDTable/sessionIDLength after session…
FunLay123 Jul 4, 2026
f94a24a
Merge remote-tracking branch 'origin/dev' into merge/xhttp_sessionid-…
Jul 9, 2026
62cb780
remove extra stuff
Jul 11, 2026
2f6d622
fix: xhttp session ID handling bugs
FunLay123 Jul 12, 2026
656cd93
Merge upstream/dev into fix/xhttp-session-id-bugs
FunLay123 Jul 12, 2026
78ff2d2
fix: xhttp session network/method streamSettings fallback
FunLay123 Jul 13, 2026
3da45b4
Merge remote-tracking branch 'upstream/dev' into fix/xhttp-session-id…
FunLay123 Jul 15, 2026
714c9cb
feat: add xmc finalmask TCP layer; fix: preserve final_mask_settings …
FunLay123 Jul 15, 2026
7eb9062
chore(dashboard): bump xray-config-kit to 0.3.6
FunLay123 Jul 15, 2026
abf4ad7
fix(core-editor): reset sessionIDTable custom-mode on inbound dialog …
FunLay123 Jul 15, 2026
4fd6fca
fix: normalize empty xhttp fields instead of treating them as set
FunLay123 Jul 15, 2026
7243ae3
Merge pull request #3 from FunLay123/fix/xhttp-session-id-bugs
FunLay123 Jul 16, 2026
b69deb4
Merge branch 'merge/xhttp_sessionid-into-dev' into dev
FunLay123 Jul 23, 2026
81181a9
Update to latest Dev branch
FunLay123 Jul 23, 2026
e58d743
fix: change packages versions to original releases
ImMohammad20000 Jul 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions app/core/hosts.py
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,16 @@ async def _prepare_subscription_inbound_data(
else inbound_config.get("session_placement")
),
session_key=xs.session_key if xs and xs.session_key is not None else inbound_config.get("session_key"),
session_id_table=(
xs.session_id_table
if xs and xs.session_id_table is not None
else inbound_config.get("session_id_table")
),
session_id_length=(
xs.session_id_length
if xs and xs.session_id_length is not None
else inbound_config.get("session_id_length")
),
seq_placement=(
xs.seq_placement if xs and xs.seq_placement is not None else inbound_config.get("seq_placement")
),
Expand Down
13 changes: 10 additions & 3 deletions app/core/xray.py
Original file line number Diff line number Diff line change
Expand Up @@ -329,8 +329,14 @@ def get_xhttp_value(key: str):
settings["x_padding_placement"] = get_xhttp_value("xPaddingPlacement")
settings["x_padding_method"] = get_xhttp_value("xPaddingMethod")
settings["uplink_http_method"] = get_xhttp_value("uplinkHTTPMethod")
settings["session_placement"] = get_xhttp_value("sessionPlacement")
settings["session_key"] = get_xhttp_value("sessionKey")
session_id_placement = get_xhttp_value("sessionIDPlacement")
settings["session_placement"] = (
session_id_placement if session_id_placement else get_xhttp_value("sessionPlacement")
)
session_id_key = get_xhttp_value("sessionIDKey")
settings["session_key"] = session_id_key if session_id_key else get_xhttp_value("sessionKey")
settings["session_id_table"] = get_xhttp_value("sessionIDTable")
settings["session_id_length"] = get_xhttp_value("sessionIDLength")
settings["seq_placement"] = get_xhttp_value("seqPlacement")
settings["seq_key"] = get_xhttp_value("seqKey")
settings["uplink_data_placement"] = get_xhttp_value("uplinkDataPlacement")
Expand Down Expand Up @@ -440,7 +446,8 @@ def _read_inbound(self, inbound: dict):
self._handle_shadowsocks_settings(inbound["settings"], settings)

if stream := inbound.get("streamSettings"):
net = stream.get("network", "tcp")
method = stream.get("method")
net = method if method else stream.get("network", "tcp")
net_settings = stream.get(f"{net}Settings", {})
security = stream.get("security")
tls_settings = stream.get(f"{security}Settings")
Expand Down
18 changes: 17 additions & 1 deletion app/models/host.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ class FinalMaskTcpType(str, Enum):
header_custom = "header-custom"
fragment = "fragment"
sudoku = "sudoku"
xmc = "xmc"


class FinalMaskUdpType(str, Enum):
Expand Down Expand Up @@ -135,6 +136,12 @@ class FinalMaskSudokuSettings(FinalMaskPasswordSettings):
padding_max: int | None = Field(default=None, alias="paddingMax")


class FinalMaskXmcSettings(FinalMaskBaseModel):
hostname: str | None = Field(default=None)
usernames: list[str] | None = Field(default=None)
password: str | None = Field(default=None)


class FinalMaskDomainSettings(FinalMaskBaseModel):
domain: str | None = Field(default=None)

Expand Down Expand Up @@ -171,7 +178,11 @@ class FinalMaskQuicParams(FinalMaskBaseModel):


FinalMaskTcpSettings = (
FinalMaskTcpHeaderCustomSettings | XrayFragmentSettings | FinalMaskSudokuSettings | dict[str, Any]
FinalMaskTcpHeaderCustomSettings
| XrayFragmentSettings
| FinalMaskSudokuSettings
| FinalMaskXmcSettings
| dict[str, Any]
)
FinalMaskUdpSettings = (
FinalMaskUdpHeaderCustomSettings
Expand All @@ -188,6 +199,7 @@ class FinalMaskQuicParams(FinalMaskBaseModel):
FinalMaskTcpType.header_custom: FinalMaskTcpHeaderCustomSettings,
FinalMaskTcpType.fragment: XrayFragmentSettings,
FinalMaskTcpType.sudoku: FinalMaskSudokuSettings,
FinalMaskTcpType.xmc: FinalMaskXmcSettings,
}

FINAL_MASK_UDP_SETTINGS_MODELS = {
Expand Down Expand Up @@ -299,6 +311,8 @@ class XHttpSettings(BaseModel):
uplink_http_method: str | None = Field(default=None)
session_placement: str | None = Field(default=None, pattern=r"^$|^(path|cookie|header|query)$")
session_key: str | None = Field(default=None)
session_id_table: str | None = Field(default=None, pattern=r"^[\x20-\x7E]*$")
session_id_length: str | None = Field(default=None, pattern=r"^\d{1,16}(-\d{1,16})?$")
Comment thread
coderabbitai[bot] marked this conversation as resolved.
seq_placement: str | None = Field(default=None, pattern=r"^$|^(path|cookie|header|query)$")
seq_key: str | None = Field(default=None)
uplink_data_placement: str | None = Field(default=None, pattern=r"^$|^(body|cookie|header)$")
Expand All @@ -320,6 +334,7 @@ def _empty_mode_to_none(cls, v):
"uplink_chunk_size",
"sc_max_each_post_bytes",
"sc_min_posts_interval_ms",
"session_id_length",
mode="before",
)
@classmethod
Expand All @@ -338,6 +353,7 @@ def normalize_numeric_or_range_fields(cls, value):
"uplink_http_method",
"session_placement",
"session_key",
"session_id_table",
"seq_placement",
"seq_key",
"uplink_data_placement",
Expand Down
5 changes: 5 additions & 0 deletions app/models/subscription.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,10 @@ class XHTTPTransportConfig(BaseTransportConfig):
uplink_http_method: str | None = Field(None, serialization_alias="uplinkHTTPMethod")
session_placement: str | None = Field(None, serialization_alias="sessionPlacement")
session_key: str | None = Field(None, serialization_alias="sessionKey")
session_id_table: str | None = Field(None, serialization_alias="sessionIDTable")
session_id_length: str | None = Field(
None, serialization_alias="sessionIDLength", pattern=r"^\d{1,16}(?:-\d{1,16})?$"
)
seq_placement: str | None = Field(None, serialization_alias="seqPlacement")
seq_key: str | None = Field(None, serialization_alias="seqKey")
uplink_data_placement: str | None = Field(None, serialization_alias="uplinkDataPlacement")
Expand All @@ -131,6 +135,7 @@ class XHTTPTransportConfig(BaseTransportConfig):
"sc_min_posts_interval_ms",
"x_padding_bytes",
"uplink_chunk_size",
"session_id_length",
mode="before",
)
@classmethod
Expand Down
6 changes: 4 additions & 2 deletions app/subscription/links.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,10 @@ def _transport_xhttp(self, payload: dict, protocol: str, config: XHTTPTransportC
"xPaddingPlacement": config.x_padding_placement,
"xPaddingMethod": config.x_padding_method,
"uplinkHTTPMethod": config.uplink_http_method,
"sessionPlacement": config.session_placement,
"sessionKey": config.session_key,
"sessionIDPlacement": config.session_placement,
"sessionIDKey": config.session_key,
"sessionIDTable": config.session_id_table,
"sessionIDLength": config.session_id_length,
"seqPlacement": config.seq_placement,
"seqKey": config.seq_key,
"uplinkDataPlacement": config.uplink_data_placement,
Expand Down
6 changes: 4 additions & 2 deletions app/subscription/xray.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,10 @@ def _transport_xhttp(self, config: XHTTPTransportConfig, path: str) -> dict:
"xPaddingPlacement": config.x_padding_placement,
"xPaddingMethod": config.x_padding_method,
"uplinkHTTPMethod": config.uplink_http_method,
"sessionPlacement": config.session_placement,
"sessionKey": config.session_key,
"sessionIDPlacement": config.session_placement,
"sessionIDKey": config.session_key,
"sessionIDTable": config.session_id_table,
"sessionIDLength": config.session_id_length,
"seqPlacement": config.seq_placement,
"seqKey": config.seq_key,
"uplinkDataPlacement": config.uplink_data_placement,
Expand Down
Loading