mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-08-23 11:26:52 +00:00
commit
702f03e4b7
19 changed files with 81 additions and 4 deletions
|
@ -263,6 +263,7 @@ func (s *SubJsonService) realityData(rData map[string]any) map[string]any {
|
||||||
rltyData["show"] = false
|
rltyData["show"] = false
|
||||||
rltyData["publicKey"] = rltyClientSettings["publicKey"]
|
rltyData["publicKey"] = rltyClientSettings["publicKey"]
|
||||||
rltyData["fingerprint"] = rltyClientSettings["fingerprint"]
|
rltyData["fingerprint"] = rltyClientSettings["fingerprint"]
|
||||||
|
rltyData["mldsa65Verify"] = rltyClientSettings["mldsa65Verify"]
|
||||||
|
|
||||||
// Set random data
|
// Set random data
|
||||||
rltyData["spiderX"] = "/" + random.Seq(15)
|
rltyData["spiderX"] = "/" + random.Seq(15)
|
||||||
|
|
|
@ -732,6 +732,7 @@ class RealityStreamSettings extends XrayCommonClass {
|
||||||
maxClient = '',
|
maxClient = '',
|
||||||
maxTimediff = 0,
|
maxTimediff = 0,
|
||||||
shortIds = RandomUtil.randomShortIds(),
|
shortIds = RandomUtil.randomShortIds(),
|
||||||
|
mldsa65Seed = '',
|
||||||
settings = new RealityStreamSettings.Settings()
|
settings = new RealityStreamSettings.Settings()
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
|
@ -744,6 +745,7 @@ class RealityStreamSettings extends XrayCommonClass {
|
||||||
this.maxClient = maxClient;
|
this.maxClient = maxClient;
|
||||||
this.maxTimediff = maxTimediff;
|
this.maxTimediff = maxTimediff;
|
||||||
this.shortIds = Array.isArray(shortIds) ? shortIds.join(",") : shortIds;
|
this.shortIds = Array.isArray(shortIds) ? shortIds.join(",") : shortIds;
|
||||||
|
this.mldsa65Seed = mldsa65Seed;
|
||||||
this.settings = settings;
|
this.settings = settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -754,7 +756,8 @@ class RealityStreamSettings extends XrayCommonClass {
|
||||||
json.settings.publicKey,
|
json.settings.publicKey,
|
||||||
json.settings.fingerprint,
|
json.settings.fingerprint,
|
||||||
json.settings.serverName,
|
json.settings.serverName,
|
||||||
json.settings.spiderX
|
json.settings.spiderX,
|
||||||
|
json.settings.mldsa65Verify,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return new RealityStreamSettings(
|
return new RealityStreamSettings(
|
||||||
|
@ -767,6 +770,7 @@ class RealityStreamSettings extends XrayCommonClass {
|
||||||
json.maxClient,
|
json.maxClient,
|
||||||
json.maxTimediff,
|
json.maxTimediff,
|
||||||
json.shortIds,
|
json.shortIds,
|
||||||
|
json.mldsa65Seed,
|
||||||
settings,
|
settings,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -782,6 +786,7 @@ class RealityStreamSettings extends XrayCommonClass {
|
||||||
maxClient: this.maxClient,
|
maxClient: this.maxClient,
|
||||||
maxTimediff: this.maxTimediff,
|
maxTimediff: this.maxTimediff,
|
||||||
shortIds: this.shortIds.split(","),
|
shortIds: this.shortIds.split(","),
|
||||||
|
mldsa65Seed: this.mldsa65Seed,
|
||||||
settings: this.settings,
|
settings: this.settings,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -792,13 +797,15 @@ RealityStreamSettings.Settings = class extends XrayCommonClass {
|
||||||
publicKey = '',
|
publicKey = '',
|
||||||
fingerprint = UTLS_FINGERPRINT.UTLS_CHROME,
|
fingerprint = UTLS_FINGERPRINT.UTLS_CHROME,
|
||||||
serverName = '',
|
serverName = '',
|
||||||
spiderX = '/'
|
spiderX = '/',
|
||||||
|
mldsa65Verify = ''
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
this.publicKey = publicKey;
|
this.publicKey = publicKey;
|
||||||
this.fingerprint = fingerprint;
|
this.fingerprint = fingerprint;
|
||||||
this.serverName = serverName;
|
this.serverName = serverName;
|
||||||
this.spiderX = spiderX;
|
this.spiderX = spiderX;
|
||||||
|
this.mldsa65Verify = mldsa65Verify;
|
||||||
}
|
}
|
||||||
static fromJson(json = {}) {
|
static fromJson(json = {}) {
|
||||||
return new RealityStreamSettings.Settings(
|
return new RealityStreamSettings.Settings(
|
||||||
|
@ -806,6 +813,7 @@ RealityStreamSettings.Settings = class extends XrayCommonClass {
|
||||||
json.fingerprint,
|
json.fingerprint,
|
||||||
json.serverName,
|
json.serverName,
|
||||||
json.spiderX,
|
json.spiderX,
|
||||||
|
json.mldsa65Verify
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
toJson() {
|
toJson() {
|
||||||
|
@ -814,6 +822,7 @@ RealityStreamSettings.Settings = class extends XrayCommonClass {
|
||||||
fingerprint: this.fingerprint,
|
fingerprint: this.fingerprint,
|
||||||
serverName: this.serverName,
|
serverName: this.serverName,
|
||||||
spiderX: this.spiderX,
|
spiderX: this.spiderX,
|
||||||
|
mldsa65Verify: this.mldsa65Verify
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -50,6 +50,7 @@ func (a *ServerController) initRouter(g *gin.RouterGroup) {
|
||||||
g.GET("/getDb", a.getDb)
|
g.GET("/getDb", a.getDb)
|
||||||
g.POST("/importDB", a.importDB)
|
g.POST("/importDB", a.importDB)
|
||||||
g.POST("/getNewX25519Cert", a.getNewX25519Cert)
|
g.POST("/getNewX25519Cert", a.getNewX25519Cert)
|
||||||
|
g.POST("/getNewmldsa65", a.getNewmldsa65)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *ServerController) refreshStatus() {
|
func (a *ServerController) refreshStatus() {
|
||||||
|
@ -198,3 +199,12 @@ func (a *ServerController) getNewX25519Cert(c *gin.Context) {
|
||||||
}
|
}
|
||||||
jsonObj(c, cert, nil)
|
jsonObj(c, cert, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *ServerController) getNewmldsa65(c *gin.Context) {
|
||||||
|
cert, err := a.serverService.GetNewmldsa65()
|
||||||
|
if err != nil {
|
||||||
|
jsonMsg(c, I18nWeb(c, "pages.inbounds.toasts.getNewmldsa65Error"), err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
jsonObj(c, cert, nil)
|
||||||
|
}
|
||||||
|
|
|
@ -52,5 +52,14 @@
|
||||||
<a-form-item label=" ">
|
<a-form-item label=" ">
|
||||||
<a-button type="primary" icon="import" @click="getNewX25519Cert">Get New Cert</a-button>
|
<a-button type="primary" icon="import" @click="getNewX25519Cert">Get New Cert</a-button>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
<a-form-item label="mldsa65 Seed">
|
||||||
|
<a-input v-model="inbound.stream.reality.mldsa65Seed"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="mldsa65 Verify">
|
||||||
|
<a-textarea v-model="inbound.stream.reality.settings.mldsa65Verify"></a-textarea>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label=" ">
|
||||||
|
<a-button type="primary" icon="import" @click="getNewmldsa65">Get New Seed</a-button>
|
||||||
|
</a-form-item>
|
||||||
</template>
|
</template>
|
||||||
{{end}}
|
{{end}}
|
|
@ -141,7 +141,17 @@
|
||||||
}
|
}
|
||||||
inModal.inbound.stream.reality.privateKey = msg.obj.privateKey;
|
inModal.inbound.stream.reality.privateKey = msg.obj.privateKey;
|
||||||
inModal.inbound.stream.reality.settings.publicKey = msg.obj.publicKey;
|
inModal.inbound.stream.reality.settings.publicKey = msg.obj.publicKey;
|
||||||
}
|
},
|
||||||
|
async getNewmldsa65() {
|
||||||
|
inModal.loading(true);
|
||||||
|
const msg = await HttpUtil.post('/server/getNewmldsa65');
|
||||||
|
inModal.loading(false);
|
||||||
|
if (!msg.success) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
inModal.inbound.stream.reality.mldsa65Seed = msg.obj.seed;
|
||||||
|
inModal.inbound.stream.reality.settings.mldsa65Verify = msg.obj.verify;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -709,3 +709,29 @@ func (s *ServerService) GetNewX25519Cert() (any, error) {
|
||||||
|
|
||||||
return keyPair, nil
|
return keyPair, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *ServerService) GetNewmldsa65() (any, error) {
|
||||||
|
// Run the command
|
||||||
|
cmd := exec.Command(xray.GetBinaryPath(), "mldsa65")
|
||||||
|
var out bytes.Buffer
|
||||||
|
cmd.Stdout = &out
|
||||||
|
err := cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
lines := strings.Split(out.String(), "\n")
|
||||||
|
|
||||||
|
SeedLine := strings.Split(lines[0], ":")
|
||||||
|
VerifyLine := strings.Split(lines[1], ":")
|
||||||
|
|
||||||
|
seed := strings.TrimSpace(SeedLine[1])
|
||||||
|
verify := strings.TrimSpace(VerifyLine[1])
|
||||||
|
|
||||||
|
keyPair := map[string]any{
|
||||||
|
"seed": seed,
|
||||||
|
"verify": verify,
|
||||||
|
}
|
||||||
|
|
||||||
|
return keyPair, nil
|
||||||
|
}
|
||||||
|
|
|
@ -260,6 +260,7 @@
|
||||||
"resetInboundClientTrafficSuccess" = "تم إعادة تعيين حركة المرور"
|
"resetInboundClientTrafficSuccess" = "تم إعادة تعيين حركة المرور"
|
||||||
"trafficGetError" = "خطأ في الحصول على حركات المرور"
|
"trafficGetError" = "خطأ في الحصول على حركات المرور"
|
||||||
"getNewX25519CertError" = "حدث خطأ أثناء الحصول على شهادة X25519."
|
"getNewX25519CertError" = "حدث خطأ أثناء الحصول على شهادة X25519."
|
||||||
|
"getNewmldsa65Error" = "حدث خطاء في الحصول على mldsa65."
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "طلب"
|
"request" = "طلب"
|
||||||
|
|
|
@ -258,7 +258,7 @@
|
||||||
"resetInboundClientTrafficSuccess" = "Traffic has been reset."
|
"resetInboundClientTrafficSuccess" = "Traffic has been reset."
|
||||||
"trafficGetError" = "Error getting traffics."
|
"trafficGetError" = "Error getting traffics."
|
||||||
"getNewX25519CertError" = "Error while obtaining the X25519 certificate."
|
"getNewX25519CertError" = "Error while obtaining the X25519 certificate."
|
||||||
|
"getNewmldsa65Error" = "Error while obtaining mldsa65."
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "Request"
|
"request" = "Request"
|
||||||
|
|
|
@ -262,6 +262,7 @@
|
||||||
"resetInboundClientTrafficSuccess" = "El tráfico ha sido reiniciado"
|
"resetInboundClientTrafficSuccess" = "El tráfico ha sido reiniciado"
|
||||||
"trafficGetError" = "Error al obtener los tráficos"
|
"trafficGetError" = "Error al obtener los tráficos"
|
||||||
"getNewX25519CertError" = "Error al obtener el certificado X25519."
|
"getNewX25519CertError" = "Error al obtener el certificado X25519."
|
||||||
|
"getNewmldsa65Error" = "Error al obtener el certificado mldsa65."
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "Pedido"
|
"request" = "Pedido"
|
||||||
|
|
|
@ -262,6 +262,7 @@
|
||||||
"resetInboundClientTrafficSuccess" = "ترافیک بازنشانی شد"
|
"resetInboundClientTrafficSuccess" = "ترافیک بازنشانی شد"
|
||||||
"trafficGetError" = "خطا در دریافت ترافیکها"
|
"trafficGetError" = "خطا در دریافت ترافیکها"
|
||||||
"getNewX25519CertError" = "خطا در دریافت گواهی X25519."
|
"getNewX25519CertError" = "خطا در دریافت گواهی X25519."
|
||||||
|
"getNewmldsa65Error" = "خطا در دریافت گواهی mldsa65."
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "درخواست"
|
"request" = "درخواست"
|
||||||
|
|
|
@ -262,6 +262,7 @@
|
||||||
"resetInboundClientTrafficSuccess" = "Lalu lintas telah direset"
|
"resetInboundClientTrafficSuccess" = "Lalu lintas telah direset"
|
||||||
"trafficGetError" = "Gagal mendapatkan data lalu lintas"
|
"trafficGetError" = "Gagal mendapatkan data lalu lintas"
|
||||||
"getNewX25519CertError" = "Terjadi kesalahan saat mendapatkan sertifikat X25519."
|
"getNewX25519CertError" = "Terjadi kesalahan saat mendapatkan sertifikat X25519."
|
||||||
|
"getNewmldsa65Error" = "Terjadi kesalahan saat mendapatkan sertifikat mldsa65."
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "Permintaan"
|
"request" = "Permintaan"
|
||||||
|
|
|
@ -262,6 +262,7 @@
|
||||||
"resetInboundClientTrafficSuccess" = "トラフィックがリセットされました"
|
"resetInboundClientTrafficSuccess" = "トラフィックがリセットされました"
|
||||||
"trafficGetError" = "トラフィックの取得中にエラーが発生しました"
|
"trafficGetError" = "トラフィックの取得中にエラーが発生しました"
|
||||||
"getNewX25519CertError" = "X25519証明書の取得中にエラーが発生しました。"
|
"getNewX25519CertError" = "X25519証明書の取得中にエラーが発生しました。"
|
||||||
|
"getNewmldsa65Error" = "mldsa65証明書の取得中にエラーが発生しました。"
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "リクエスト"
|
"request" = "リクエスト"
|
||||||
|
|
|
@ -262,6 +262,7 @@
|
||||||
"resetInboundClientTrafficSuccess" = "O tráfego foi reiniciado"
|
"resetInboundClientTrafficSuccess" = "O tráfego foi reiniciado"
|
||||||
"trafficGetError" = "Erro ao obter tráfegos"
|
"trafficGetError" = "Erro ao obter tráfegos"
|
||||||
"getNewX25519CertError" = "Erro ao obter o certificado X25519."
|
"getNewX25519CertError" = "Erro ao obter o certificado X25519."
|
||||||
|
"getNewmldsa65Error" = "Erro ao obter o certificado mldsa65."
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "Requisição"
|
"request" = "Requisição"
|
||||||
|
|
|
@ -262,6 +262,7 @@
|
||||||
"resetInboundClientTrafficSuccess" = "Трафик сброшен"
|
"resetInboundClientTrafficSuccess" = "Трафик сброшен"
|
||||||
"trafficGetError" = "Ошибка получения данных о трафике"
|
"trafficGetError" = "Ошибка получения данных о трафике"
|
||||||
"getNewX25519CertError" = "Ошибка при получении сертификата X25519."
|
"getNewX25519CertError" = "Ошибка при получении сертификата X25519."
|
||||||
|
"getNewmldsa65Error" = "Ошибка при получении сертификата mldsa65."
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "Запрос"
|
"request" = "Запрос"
|
||||||
|
|
|
@ -262,6 +262,7 @@
|
||||||
"resetInboundClientTrafficSuccess" = "Trafik sıfırlandı"
|
"resetInboundClientTrafficSuccess" = "Trafik sıfırlandı"
|
||||||
"trafficGetError" = "Trafik bilgisi alınırken hata oluştu"
|
"trafficGetError" = "Trafik bilgisi alınırken hata oluştu"
|
||||||
"getNewX25519CertError" = "X25519 sertifikası alınırken hata oluştu."
|
"getNewX25519CertError" = "X25519 sertifikası alınırken hata oluştu."
|
||||||
|
"getNewmldsa65Error" = "mldsa65 sertifikası alınırken hata oluştu."
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "İstek"
|
"request" = "İstek"
|
||||||
|
|
|
@ -262,6 +262,7 @@
|
||||||
"resetInboundClientTrafficSuccess" = "Трафік скинуто"
|
"resetInboundClientTrafficSuccess" = "Трафік скинуто"
|
||||||
"trafficGetError" = "Помилка отримання даних про трафік"
|
"trafficGetError" = "Помилка отримання даних про трафік"
|
||||||
"getNewX25519CertError" = "Помилка при отриманні сертифіката X25519."
|
"getNewX25519CertError" = "Помилка при отриманні сертифіката X25519."
|
||||||
|
"getNewmldsa65Error" = "Помилка при отриманні сертифіката mldsa65."
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "Запит"
|
"request" = "Запит"
|
||||||
|
|
|
@ -262,6 +262,7 @@
|
||||||
"resetInboundClientTrafficSuccess" = "Đã đặt lại lưu lượng"
|
"resetInboundClientTrafficSuccess" = "Đã đặt lại lưu lượng"
|
||||||
"trafficGetError" = "Lỗi khi lấy thông tin lưu lượng"
|
"trafficGetError" = "Lỗi khi lấy thông tin lưu lượng"
|
||||||
"getNewX25519CertError" = "Lỗi khi lấy chứng chỉ X25519."
|
"getNewX25519CertError" = "Lỗi khi lấy chứng chỉ X25519."
|
||||||
|
"getNewmldsa65Error" = "Lỗi khi lấy chúng tôi mldsa65."
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "Lời yêu cầu"
|
"request" = "Lời yêu cầu"
|
||||||
|
|
|
@ -262,6 +262,7 @@
|
||||||
"resetInboundClientTrafficSuccess" = "流量已重置"
|
"resetInboundClientTrafficSuccess" = "流量已重置"
|
||||||
"trafficGetError" = "获取流量数据时出错"
|
"trafficGetError" = "获取流量数据时出错"
|
||||||
"getNewX25519CertError" = "获取X25519证书时出错。"
|
"getNewX25519CertError" = "获取X25519证书时出错。"
|
||||||
|
"getNewmldsa65Error" = "获取mldsa65证书时出错。"
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "请求"
|
"request" = "请求"
|
||||||
|
|
|
@ -264,6 +264,7 @@
|
||||||
"resetInboundClientTrafficSuccess" = "流量已重置"
|
"resetInboundClientTrafficSuccess" = "流量已重置"
|
||||||
"trafficGetError" = "取得流量資料時發生錯誤"
|
"trafficGetError" = "取得流量資料時發生錯誤"
|
||||||
"getNewX25519CertError" = "取得X25519憑證時發生錯誤。"
|
"getNewX25519CertError" = "取得X25519憑證時發生錯誤。"
|
||||||
|
"getNewmldsa65Error" = "取得mldsa65憑證時發生錯誤。"
|
||||||
|
|
||||||
[pages.inbounds.stream.general]
|
[pages.inbounds.stream.general]
|
||||||
"request" = "請求"
|
"request" = "請求"
|
||||||
|
|
Loading…
Reference in a new issue