mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-06-28 00:24:19 +00:00
feat(tls,reality): port xray TLS/REALITY fields, cert-hash helpers, fallback UX
TLS: add verifyPeerCertByName (vcn) to inbound settings + emit in both share-link generators (frontend + Go sub) and outbound parser; the allowInsecure replacement xray removed after 2026-06-01. Add server-side curvePreferences, masterKeyLog, echSockopt (passthrough + form) at tlsSettings top-level so they survive the panel-only settings strip. REALITY: add limitFallbackUpload/Download (afterBytes/bytesPerSec/burstBytesPerSec) with per-field tooltips, plus masterKeyLog. Verified field names/semantics against pinned xray v1.260327.1 (bytesPerSec=0 disables). Hosts: fix verify_peer_cert_by_name column bool->string (xray expects comma-separated names) with an idempotent, history-gate-free migration (SQLite typeof blank; Postgres ALTER once); emit vcn for hosts/external proxies. Server: add getCertHash (local cert DER SHA-256) and getRemoteCertHash (xray tls ping) endpoints + api-docs; wire pinned-cert field buttons. Drop the meaningless random-hash button. Xray UI: metrics endpoint (listen/tag) config in Basics; import/export for routing rules and outbounds. Fallbacks card: compact empty state, header-aligned actions, responsive labeled grid rows. i18n: add all new keys to every locale; drop unused generateRandomPin.
This commit is contained in:
@@ -75,6 +75,8 @@ func (a *ServerController) initRouter(g *gin.RouterGroup) {
|
||||
g.POST("/xraylogs/:count", a.getXrayLogs)
|
||||
g.POST("/importDB", a.importDB)
|
||||
g.POST("/getNewEchCert", a.getNewEchCert)
|
||||
g.POST("/getCertHash", a.getCertHash)
|
||||
g.POST("/getRemoteCertHash", a.getRemoteCertHash)
|
||||
g.POST("/clientIps", a.setClientIps)
|
||||
}
|
||||
|
||||
@@ -395,6 +397,28 @@ func (a *ServerController) getNewEchCert(c *gin.Context) {
|
||||
jsonObj(c, cert, nil)
|
||||
}
|
||||
|
||||
// getCertHash returns the hex SHA-256 of the given certificate (file path or
|
||||
// inline content) so the panel can fill the pinned-cert field.
|
||||
func (a *ServerController) getCertHash(c *gin.Context) {
|
||||
hashes, err := a.serverService.GetCertHash(c.PostForm("certFile"), c.PostForm("certContent"))
|
||||
if err != nil {
|
||||
jsonMsg(c, "get cert hash", err)
|
||||
return
|
||||
}
|
||||
jsonObj(c, hashes, nil)
|
||||
}
|
||||
|
||||
// getRemoteCertHash runs `xray tls ping` against the given server and returns
|
||||
// its live certificate SHA-256 hash(es) for pinning.
|
||||
func (a *ServerController) getRemoteCertHash(c *gin.Context) {
|
||||
hashes, err := a.serverService.GetRemoteCertHash(c.PostForm("server"))
|
||||
if err != nil {
|
||||
jsonMsg(c, "get remote cert hash", err)
|
||||
return
|
||||
}
|
||||
jsonObj(c, hashes, nil)
|
||||
}
|
||||
|
||||
// getNewVlessEnc generates a new VLESS encryption key.
|
||||
func (a *ServerController) getNewVlessEnc(c *gin.Context) {
|
||||
out, err := a.serverService.GetNewVlessEnc()
|
||||
|
||||
Reference in New Issue
Block a user