Skip to content

Comments

Add listable#5625

Open
Fangliding wants to merge 1 commit intomainfrom
listable
Open

Add listable#5625
Fangliding wants to merge 1 commit intomainfrom
listable

Conversation

@Fangliding
Copy link
Member

这个泛型实现非常通用 目前只加了那个verifyPeerCertInNames和pinnedPeerCertSha256 如果用在出入站上甚至可以这样

{
    "inbounds": {
        "port": 10808,
        "protocol": "socks"
    },
    "outbounds": {
        "protocol": "freedom"
    }
}

@RPRX
Copy link
Member

RPRX commented Jan 30, 2026

verifyPeerCertInNames 也加个空白检查吧,不然不确定会发生啥,话说如果写了 fromMitm 但入站没传进来 SNI 会发生啥来着

顺便把 allowInsecure 删掉

@RPRX
Copy link
Member

RPRX commented Jan 30, 2026

我发现这个 listable 字符串写空白和列表写一项空白现在是不同的行为,统一一下 trim 掉两边空格并且不带上空白吧

[""] 应当等同于 "",也就是没写

@Fangliding
Copy link
Member Author

默认应该是 [] 而不是 [""] 这就跟集合论的 ∅ ≠ {∅} 一样
还有这个是泛型的 里面不止可能是字符串 也可能是任何东西 数字 布尔值 嵌套结构 等等

@RPRX
Copy link
Member

RPRX commented Jan 30, 2026

就是只改 ListableSimpleString,假如我就是想填一个 "" 进去,唯一的方式只能是 [""] 了,所以要把它给禁掉

@Fangliding
Copy link
Member Author

Fangliding commented Jan 30, 2026

我觉得 "" = [""] 没啥问题 如果是为了照顾面板用 "" 是纵容坏味
ListableSimpleString 只是为 ~ 分割实现的 如果不用它分割(比如里面就是可能含波浪号) 那还是得 Listable[string] 到时候这逻辑又得扯开讲

@RPRX
Copy link
Member

RPRX commented Jan 30, 2026

现在的情况就是 "" 并不等于 [""],前者的定义是空(没填)而后者是有一个成员,所以要 fix 一下,这个 simple 就不允许这种吧

@Fangliding
Copy link
Member Author

Fangliding commented Jan 30, 2026

"123"=["123"]""=[""] 没啥问题吧 没填是 []

@Fangliding
Copy link
Member Author

不然嵌套结构也会有类似 {}[{}] 的问题

@RPRX
Copy link
Member

RPRX commented Jan 30, 2026

有些软件的 json 生成方式是即使那个字段没用到也给你填个 "" 上去,这不就误会了,好像就是你说的面板

另外 Golang json 的默认解析,没填和 "" 是一样的,就像 0,不应该改变这个行为,Xray 里好像顶多检测字段是否存在

@Fangliding
Copy link
Member Author

它们总不会生成 "outbounds": "" 吧
config里任何传统的数组遇到[]写成""都会炸

@Fangliding
Copy link
Member Author

或者遇到 "" 就报错 强制写 [] 或者 [""] 防止歧义

@RPRX
Copy link
Member

RPRX commented Jan 30, 2026

我的意思是比如 GUI 直接拿用户填的值来填入 json,用户没填但 GUI 给 json 填个 "",那不就误会了

直接把 ""(含空格)给 trim 掉吧,只有它的话就搞个 nil 回去

@Fangliding
Copy link
Member Author

那就这样吧

@Fangliding
Copy link
Member Author

还有一件事是收集一下还有哪些适合listable的参数

@Fangliding
Copy link
Member Author

比方说desc里说的出站入站 还有vmess vless入站配置的那些clients

@RPRX
Copy link
Member

RPRX commented Jan 30, 2026

那个 return nil 不是 error nil 吗

如果是 ["", ""] 也应当被视为 nil,就是说不允许填写空的,对于 string 先 trim 一下左右再判断

还有一件事是收集一下还有哪些适合listable的参数

暂时没必要,不然太乱了,这两个是因为要加分享链接

@Fangliding
Copy link
Member Author

现在的逻辑是
""=没写
[""]=一个有空字符串的字符串数组

@RPRX
Copy link
Member

RPRX commented Jan 30, 2026

就是想让后者也等于没写

真的烧脑,一切的根源都是 GUI 加可变长度数组可能比较怪,alpn 都是直接让选的

对于这俩参数还有判断是否 nil 来决定是否 allowInscure 并接管证书验证的问题

要不把 verifyPeerCertInNames 给 break 了,也就那个 iran serverless 配置在用,现在也无了

@RPRX
Copy link
Member

RPRX commented Jan 30, 2026

alpn 那个在分享链接里是 , 做分隔符然后需要 url 转义,v2rayN&G 是只给选项,感觉好乱就

@Fangliding
Copy link
Member Author

可变长度其实不太难搞 比如这样
image
[""] 肯定有意义的
允许 [""] 应该不会break现有config吧 毕竟以前它们就是这么解析的

@RPRX
Copy link
Member

RPRX commented Jan 30, 2026

太烧脑了还是,决定把 verifyPeerCertInNames 改成单个的 verifyPeerCertByName,20 字节对齐,并且允许填写多个

allowInsecure 都能 break 掉为啥 verifyPeerCertInNames 不能,可能是唯一用到它的 iran serverless 现在也凉了

这东西加进分享链接和 GUI,99% 的场景也就填单个比如 fastly.com ,搞成可变长度数组不划算,同时兼容一下多个就行了

有个小问题是 IPv6 证书的话要填 :,这个需要 uri 转义,要不就都对齐 alpn 用 , 分隔然后要求 uri 转义吧,也不怎么 break

自带分割是为了规范 GUI 该怎么设计这一栏,单纯留个空位、交给内核处理就行,不然 99% 的场景填单个,搞成可变数组太复杂

@RPRX
Copy link
Member

RPRX commented Jan 30, 2026

如果最初就有这俩,alpn 那个也会设计成这模式,@DuckSoft 曾经给大伙分享过神奇的 "alpn": ["h2,http/1.1"]

@Fangliding
Copy link
Member Author

为了UI想这想那有点削足适履的感觉了

@RPRX
Copy link
Member

RPRX commented Jan 30, 2026

其实如果要上 uri 转义的话 core 设计成简单的数组就行,但是如果有 GUI 为了这通常就填一个的搞个可变长度数组那确实很复杂

@Fangliding
Copy link
Member Author

这个listable只是为了手写简单而且可读性更高而已
机读的话就应该正常用 [] 不需要分情况处理

@RPRX
Copy link
Member

RPRX commented Jan 30, 2026

这个之后看情况加不加吧,第一版先支持个 , 分隔防止有 GUI 搞成可变长度数组了,毕竟对于 alpn 都选了更适合它的下拉选项

至于 udpmasks 就搞成 XHTTP extra 那样直接分享 json 吧,毕竟估计也就 Xray 能完整支持

@patterniha
Copy link
Collaborator

patterniha commented Jan 30, 2026

but now even IRAN Serverless is obsolete.

the MitM+domainFronting version of serverless-for-Iran is still works.

but "x.com" is behind cloudflare now, so domainFronting does not work for it.
also they block "whatsapp" and all meta IPs, so "instagram" does not work either.

so domainFronting only works for "youtube", "reddit" and some others ("porn-sites", ...)

multiple entries is needed, because we don't know exactly which certificate will be returned for each IP.

///
anyway, I don't think multi-string verifyPeerCertInNames is used much and its format can be changed but it should still support multiple-entries.

@RPRX
Copy link
Member

RPRX commented Jan 30, 2026

形式会变但功能不会变,都是逗号分隔的话以后可以和 alpn 对齐

对了还有个 sockopt,这个也是 Xray 专有的东西直接 json 分享吧,XDRIVE 肯定也是 extra json

现在在纠结要不要把 udpmasks 放入 finalmask 不然后面有了 tcp 得要两个 json

这下出站配置不搞 dialer-proxy 套娃的话基本上都能通过分享链接完整分享了,以后连 fragment 和 noises 都可以了

XHTTP 搞的那个 extra json 还是太超前了,不然新加的这些 XHTTP 参数一个个塞分享链接里能要命

@patterniha
Copy link
Collaborator

patterniha commented Jan 30, 2026

Oh, No, Instagram still works, they only block "www.whatsapp.com" domain that i had used in config, i change it and instagram and whatsapp opened!

youtube+instagram+whatsapp is opened, So it's worth updating config and pinning it in the channel.

@Fangliding
Copy link
Member Author

如果这样改了那现在这个listable怎么办

@RPRX
Copy link
Member

RPRX commented Jan 31, 2026

先放着吧,以后看看要不要改

@RPRX
Copy link
Member

RPRX commented Jan 31, 2026

可能下下个版本先给 alpn 上一个然后就可以这样写 "alpn": "fromMitm"分隔符改成逗号也是为了跟分享链接的 alpn 对齐

虽然主要原因还是 IPv6 证书那个冒号肯定要被 uri 转义的

@RPRX
Copy link
Member

RPRX commented Jan 31, 2026

要不现在就先给 alpn 弄上,分隔符改成 ,,然后先把代码合进来吧

"alpn": "" 会是啥行为来着

@RPRX
Copy link
Member

RPRX commented Jan 31, 2026

但是还是有个小问题是有些人可能会这么写 "alpn": "h2, http/1.1" 然后还得 trimSpace

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants