diff --git a/web/controller/api.go b/web/controller/api.go index 32af934e..6edd7939 100644 --- a/web/controller/api.go +++ b/web/controller/api.go @@ -9,6 +9,7 @@ import ( type APIController struct { BaseController inboundController *InboundController + serverController *ServerController Tgbot service.Tgbot } @@ -19,43 +20,22 @@ func NewAPIController(g *gin.RouterGroup) *APIController { } func (a *APIController) initRouter(g *gin.RouterGroup) { - g = g.Group("/panel/api/inbounds") - g.Use(a.checkLogin) + // Main API group + api := g.Group("/panel/api") + api.Use(a.checkLogin) - a.inboundController = NewInboundController(g) + // Inbounds API + inbounds := api.Group("/inbounds") + a.inboundController = NewInboundController(inbounds) - inboundRoutes := []struct { - Method string - Path string - Handler gin.HandlerFunc - }{ - {"GET", "/createbackup", a.createBackup}, - {"GET", "/list", a.inboundController.getInbounds}, - {"GET", "/get/:id", a.inboundController.getInbound}, - {"GET", "/getClientTraffics/:email", a.inboundController.getClientTraffics}, - {"GET", "/getClientTrafficsById/:id", a.inboundController.getClientTrafficsById}, - {"POST", "/add", a.inboundController.addInbound}, - {"POST", "/del/:id", a.inboundController.delInbound}, - {"POST", "/update/:id", a.inboundController.updateInbound}, - {"POST", "/clientIps/:email", a.inboundController.getClientIps}, - {"POST", "/clearClientIps/:email", a.inboundController.clearClientIps}, - {"POST", "/addClient", a.inboundController.addInboundClient}, - {"POST", "/:id/delClient/:clientId", a.inboundController.delInboundClient}, - {"POST", "/updateClient/:clientId", a.inboundController.updateInboundClient}, - {"POST", "/:id/resetClientTraffic/:email", a.inboundController.resetClientTraffic}, - {"POST", "/resetAllTraffics", a.inboundController.resetAllTraffics}, - {"POST", "/resetAllClientTraffics/:id", a.inboundController.resetAllClientTraffics}, - {"POST", "/delDepletedClients/:id", a.inboundController.delDepletedClients}, - {"POST", "/onlines", a.inboundController.onlines}, - {"POST", "/lastOnline", a.inboundController.lastOnline}, - {"POST", "/updateClientTraffic/:email", a.inboundController.updateClientTraffic}, - } + // Server API + server := api.Group("/server") + a.serverController = NewServerController(server) - for _, route := range inboundRoutes { - g.Handle(route.Method, route.Path, route.Handler) - } + // Extra routes + api.GET("/backuptotgbot", a.BackuptoTgbot) } -func (a *APIController) createBackup(c *gin.Context) { +func (a *APIController) BackuptoTgbot(c *gin.Context) { a.Tgbot.SendBackupToAdmins() } diff --git a/web/controller/inbound.go b/web/controller/inbound.go index 9ff2f302..10a58daa 100644 --- a/web/controller/inbound.go +++ b/web/controller/inbound.go @@ -24,9 +24,12 @@ func NewInboundController(g *gin.RouterGroup) *InboundController { } func (a *InboundController) initRouter(g *gin.RouterGroup) { - g = g.Group("/inbound") - g.POST("/list", a.getInbounds) + g.GET("/list", a.getInbounds) + g.GET("/get/:id", a.getInbound) + g.GET("/getClientTraffics/:email", a.getClientTraffics) + g.GET("/getClientTrafficsById/:id", a.getClientTrafficsById) + g.POST("/add", a.addInbound) g.POST("/del/:id", a.delInbound) g.POST("/update/:id", a.updateInbound) @@ -41,6 +44,8 @@ func (a *InboundController) initRouter(g *gin.RouterGroup) { g.POST("/delDepletedClients/:id", a.delDepletedClients) g.POST("/import", a.importInbound) g.POST("/onlines", a.onlines) + g.POST("/lastOnline", a.lastOnline) + g.POST("/updateClientTraffic/:email", a.updateClientTraffic) } func (a *InboundController) getInbounds(c *gin.Context) { diff --git a/web/controller/server.go b/web/controller/server.go index b1174b8f..d5ae688b 100644 --- a/web/controller/server.go +++ b/web/controller/server.go @@ -37,11 +37,17 @@ func NewServerController(g *gin.RouterGroup) *ServerController { } func (a *ServerController) initRouter(g *gin.RouterGroup) { - g = g.Group("/server") - g.Use(a.checkLogin) - g.POST("/status", a.status) - g.POST("/getXrayVersion", a.getXrayVersion) + g.GET("/status", a.status) + g.GET("/getXrayVersion", a.getXrayVersion) + g.GET("/getConfigJson", a.getConfigJson) + g.GET("/getDb", a.getDb) + g.GET("/getNewUUID", a.getNewUUID) + g.GET("/getNewX25519Cert", a.getNewX25519Cert) + g.GET("/getNewmldsa65", a.getNewmldsa65) + g.GET("/getNewmlkem768", a.getNewmlkem768) + g.GET("/getNewVlessEnc", a.getNewVlessEnc) + g.POST("/stopXrayService", a.stopXrayService) g.POST("/restartXrayService", a.restartXrayService) g.POST("/installXray/:version", a.installXray) @@ -49,13 +55,8 @@ func (a *ServerController) initRouter(g *gin.RouterGroup) { g.POST("/updateGeofile/:fileName", a.updateGeofile) g.POST("/logs/:count", a.getLogs) g.POST("/xraylogs/:count", a.getXrayLogs) - g.POST("/getConfigJson", a.getConfigJson) - g.GET("/getDb", a.getDb) g.POST("/importDB", a.importDB) - g.POST("/getNewX25519Cert", a.getNewX25519Cert) - g.POST("/getNewmldsa65", a.getNewmldsa65) g.POST("/getNewEchCert", a.getNewEchCert) - g.POST("/getNewVlessEnc", a.getNewVlessEnc) } func (a *ServerController) refreshStatus() { @@ -276,3 +277,22 @@ func (a *ServerController) getNewVlessEnc(c *gin.Context) { } jsonObj(c, out, nil) } + +func (a *ServerController) getNewUUID(c *gin.Context) { + uuidResp, err := a.serverService.GetNewUUID() + if err != nil { + jsonMsg(c, "Failed to generate UUID", err) + return + } + + jsonObj(c, uuidResp, nil) +} + +func (a *ServerController) getNewmlkem768(c *gin.Context) { + out, err := a.serverService.GetNewmlkem768() + if err != nil { + jsonMsg(c, "Failed to generate mlkem768 keys", err) + return + } + jsonObj(c, out, nil) +} diff --git a/web/controller/xui.go b/web/controller/xui.go index 5b4c0a18..1afbc427 100644 --- a/web/controller/xui.go +++ b/web/controller/xui.go @@ -8,6 +8,7 @@ type XUIController struct { BaseController inboundController *InboundController + serverController *ServerController settingController *SettingController xraySettingController *XraySettingController } @@ -28,6 +29,7 @@ func (a *XUIController) initRouter(g *gin.RouterGroup) { g.GET("/xray", a.xraySettings) a.inboundController = NewInboundController(g) + a.serverController = NewServerController(g) a.settingController = NewSettingController(g) a.xraySettingController = NewXraySettingController(g) } diff --git a/web/html/form/protocol/vless.html b/web/html/form/protocol/vless.html index baa5a285..140b9c1a 100644 --- a/web/html/form/protocol/vless.html +++ b/web/html/form/protocol/vless.html @@ -30,7 +30,7 @@ - + diff --git a/web/html/inbounds.html b/web/html/inbounds.html index 81ef1b39..830c940f 100644 --- a/web/html/inbounds.html +++ b/web/html/inbounds.html @@ -830,7 +830,7 @@ }, async getDBInbounds() { this.refreshing = true; - const msg = await HttpUtil.post('/panel/inbound/list'); + const msg = await HttpUtil.get('/panel/api/inbounds/list'); if (!msg.success) { this.refreshing = false; return; @@ -845,7 +845,7 @@ }, 500); }, async getOnlineUsers() { - const msg = await HttpUtil.post('/panel/inbound/onlines'); + const msg = await HttpUtil.post('/panel/api/inbounds/onlines'); if (!msg.success) { return; } @@ -1099,7 +1099,7 @@ streamSettings: baseInbound.stream.toString(), sniffing: baseInbound.sniffing.toString(), }; - await this.submit('/panel/inbound/add', data, inModal); + await this.submit('/panel/api/inbounds/add', data, inModal); }, openAddInbound() { inModal.show({ @@ -1148,7 +1148,7 @@ } data.sniffing = inbound.sniffing.toString(); - await this.submit('/panel/inbound/add', data, inModal); + await this.submit('/panel/api/inbounds/add', data, inModal); }, async updateInbound(inbound, dbInbound) { const data = { @@ -1171,7 +1171,7 @@ } data.sniffing = inbound.sniffing.toString(); - await this.submit(`/panel/inbound/update/${dbInbound.id}`, data, inModal); + await this.submit(`/panel/api/inbounds/update/${dbInbound.id}`, data, inModal); }, openAddClient(dbInboundId) { dbInbound = this.dbInbounds.find(row => row.id === dbInboundId); @@ -1226,14 +1226,14 @@ id: dbInboundId, settings: '{"clients": [' + clients.toString() + ']}', }; - await this.submit(`/panel/inbound/addClient`, data, modal); + await this.submit(`/panel/api/inbounds/addClient`, data, modal); }, async updateClient(client, dbInboundId, clientId) { const data = { id: dbInboundId, settings: '{"clients": [' + client.toString() + ']}', }; - await this.submit(`/panel/inbound/updateClient/${clientId}`, data, clientModal); + await this.submit(`/panel/api/inbounds/updateClient/${clientId}`, data, clientModal); }, resetTraffic(dbInboundId) { dbInbound = this.dbInbounds.find(row => row.id === dbInboundId); @@ -1258,7 +1258,7 @@ class: themeSwitcher.currentTheme, okText: '{{ i18n "delete"}}', cancelText: '{{ i18n "cancel"}}', - onOk: () => this.submit('/panel/inbound/del/' + dbInboundId), + onOk: () => this.submit('/panel/api/inbounds/del/' + dbInboundId), }); }, delClient(dbInboundId, client,confirmation = true) { @@ -1271,10 +1271,10 @@ class: themeSwitcher.currentTheme, okText: '{{ i18n "delete"}}', cancelText: '{{ i18n "cancel"}}', - onOk: () => this.submit(`/panel/inbound/${dbInboundId}/delClient/${clientId}`), + onOk: () => this.submit(`/panel/api/inbounds/${dbInboundId}/delClient/${clientId}`), }); } else { - this.submit(`/panel/inbound/${dbInboundId}/delClient/${clientId}`); + this.submit(`/panel/api/inbounds/${dbInboundId}/delClient/${clientId}`); } }, getSubGroupClients(dbInbounds, currentClient) { @@ -1353,7 +1353,7 @@ switchEnable(dbInboundId,state) { dbInbound = this.dbInbounds.find(row => row.id === dbInboundId); dbInbound.enable = state; - this.submit(`/panel/inbound/update/${dbInboundId}`, dbInbound); + this.submit(`/panel/api/inbounds/update/${dbInboundId}`, dbInbound); }, async switchEnableClient(dbInboundId, client) { this.loading() @@ -1383,10 +1383,10 @@ class: themeSwitcher.currentTheme, okText: '{{ i18n "reset"}}', cancelText: '{{ i18n "cancel"}}', - onOk: () => this.submit('/panel/inbound/' + dbInboundId + '/resetClientTraffic/' + client.email), + onOk: () => this.submit('/panel/api/inbounds/' + dbInboundId + '/resetClientTraffic/' + client.email), }) } else { - this.submit('/panel/inbound/' + dbInboundId + '/resetClientTraffic/' + client.email); + this.submit('/panel/api/inbounds/' + dbInboundId + '/resetClientTraffic/' + client.email); } }, resetAllTraffic() { @@ -1396,7 +1396,7 @@ class: themeSwitcher.currentTheme, okText: '{{ i18n "reset"}}', cancelText: '{{ i18n "cancel"}}', - onOk: () => this.submit('/panel/inbound/resetAllTraffics'), + onOk: () => this.submit('/panel/api/inbounds/resetAllTraffics'), }); }, resetAllClientTraffics(dbInboundId) { @@ -1406,7 +1406,7 @@ class: themeSwitcher.currentTheme, okText: '{{ i18n "reset"}}', cancelText: '{{ i18n "cancel"}}', - onOk: () => this.submit('/panel/inbound/resetAllClientTraffics/' + dbInboundId), + onOk: () => this.submit('/panel/api/inbounds/resetAllClientTraffics/' + dbInboundId), }) }, delDepletedClients(dbInboundId) { @@ -1416,7 +1416,7 @@ class: themeSwitcher.currentTheme, okText: '{{ i18n "delete"}}', cancelText: '{{ i18n "cancel"}}', - onOk: () => this.submit('/panel/inbound/delDepletedClients/' + dbInboundId), + onOk: () => this.submit('/panel/api/inbounds/delDepletedClients/' + dbInboundId), }) }, isExpiry(dbInbound, index) { @@ -1542,7 +1542,7 @@ value: '', okText: '{{ i18n "pages.inbounds.import" }}', confirm: async (dbInboundText) => { - await this.submit('/panel/inbound/import', {data: dbInboundText}, promptModal); + await this.submit('/panel/api/inbounds/import', {data: dbInboundText}, promptModal); }, }); }, diff --git a/web/html/index.html b/web/html/index.html index 42b8a032..5d5c3b1d 100644 --- a/web/html/index.html +++ b/web/html/index.html @@ -746,7 +746,7 @@ ${dateTime} }, async getStatus() { try { - const msg = await HttpUtil.post('/server/status'); + const msg = await HttpUtil.get('/panel/api/server/status'); if (msg.success) { if (!this.loadingStates.fetched) { this.loadingStates.fetched = true; @@ -763,7 +763,7 @@ ${dateTime} }, async openSelectV2rayVersion() { this.loading(true); - const msg = await HttpUtil.post('server/getXrayVersion'); + const msg = await HttpUtil.get('/panel/api/server/getXrayVersion'); this.loading(false); if (!msg.success) { return; @@ -780,7 +780,7 @@ ${dateTime} onOk: async () => { versionModal.hide(); this.loading(true, '{{ i18n "pages.index.dontRefresh"}}'); - await HttpUtil.post(`/server/installXray/${version}`); + await HttpUtil.post(`/panel/api/server/installXray/${version}`); this.loading(false); }, }); @@ -798,9 +798,9 @@ ${dateTime} onOk: async () => { versionModal.hide(); this.loading(true, '{{ i18n "pages.index.dontRefresh"}}'); - const url = isSingleFile - ? `/server/updateGeofile/${fileName}` - : `/server/updateGeofile`; + const url = isSingleFile + ? `/panel/api/server/updateGeofile/${fileName}` + : `/panel/api/server/updateGeofile`; await HttpUtil.post(url); this.loading(false); }, @@ -808,7 +808,7 @@ ${dateTime} }, async stopXrayService() { this.loading(true); - const msg = await HttpUtil.post('server/stopXrayService'); + const msg = await HttpUtil.post('/panel/api/server/stopXrayService'); this.loading(false); if (!msg.success) { return; @@ -816,7 +816,7 @@ ${dateTime} }, async restartXrayService() { this.loading(true); - const msg = await HttpUtil.post('server/restartXrayService'); + const msg = await HttpUtil.post('/panel/api/server/restartXrayService'); this.loading(false); if (!msg.success) { return; @@ -824,7 +824,7 @@ ${dateTime} }, async openLogs(){ logModal.loading = true; - const msg = await HttpUtil.post('server/logs/'+logModal.rows,{level: logModal.level, syslog: logModal.syslog}); + const msg = await HttpUtil.post('/panel/api/server/logs/'+logModal.rows,{level: logModal.level, syslog: logModal.syslog}); if (!msg.success) { return; } @@ -834,7 +834,7 @@ ${dateTime} }, async openXrayLogs(){ xraylogModal.loading = true; - const msg = await HttpUtil.post('server/xraylogs/'+xraylogModal.rows,{filter: xraylogModal.filter, showDirect: xraylogModal.showDirect, showBlocked: xraylogModal.showBlocked, showProxy: xraylogModal.showProxy}); + const msg = await HttpUtil.post('/panel/api/server/xraylogs/'+xraylogModal.rows,{filter: xraylogModal.filter, showDirect: xraylogModal.showDirect, showBlocked: xraylogModal.showBlocked, showProxy: xraylogModal.showProxy}); if (!msg.success) { return; } @@ -844,7 +844,7 @@ ${dateTime} }, async openConfig() { this.loading(true); - const msg = await HttpUtil.post('server/getConfigJson'); + const msg = await HttpUtil.get('/panel/api/server/getConfigJson'); this.loading(false); if (!msg.success) { return; @@ -855,7 +855,7 @@ ${dateTime} backupModal.show(); }, exportDatabase() { - window.location = basePath + 'server/getDb'; + window.location = basePath + 'panel/api/server/getDb'; }, importDatabase() { const fileInput = document.createElement('input'); @@ -868,7 +868,7 @@ ${dateTime} formData.append('db', dbFile); backupModal.hide(); this.loading(true); - const uploadMsg = await HttpUtil.post('server/importDB', formData, { + const uploadMsg = await HttpUtil.post('/panel/api/server/importDB', formData, { headers: { 'Content-Type': 'multipart/form-data', } diff --git a/web/html/modals/client_modal.html b/web/html/modals/client_modal.html index 623e720d..92c8302e 100644 --- a/web/html/modals/client_modal.html +++ b/web/html/modals/client_modal.html @@ -121,7 +121,7 @@ }, methods: { async getDBClientIps(email) { - const msg = await HttpUtil.post(`/panel/inbound/clientIps/${email}`); + const msg = await HttpUtil.post(`/panel/api/inbound/clientIps/${email}`); if (!msg.success) { document.getElementById("clientIPs").value = msg.obj; return; @@ -139,7 +139,7 @@ }, async clearDBClientIps(email) { try { - const msg = await HttpUtil.post(`/panel/inbound/clearClientIps/${email}`); + const msg = await HttpUtil.post(`/panel/api/inbounds/clearClientIps/${email}`); if (!msg.success) { return; } @@ -156,7 +156,7 @@ cancelText: '{{ i18n "cancel"}}', onOk: async () => { iconElement.disabled = true; - const msg = await HttpUtil.postWithModal('/panel/inbound/' + dbInboundId + '/resetClientTraffic/' + email); + const msg = await HttpUtil.postWithModal('/panel/api/inbounds/' + dbInboundId + '/resetClientTraffic/' + email); if (msg.success) { this.clientModal.clientStats.up = 0; this.clientModal.clientStats.down = 0; diff --git a/web/html/modals/inbound_info_modal.html b/web/html/modals/inbound_info_modal.html index 4110c244..0f29d318 100644 --- a/web/html/modals/inbound_info_modal.html +++ b/web/html/modals/inbound_info_modal.html @@ -492,7 +492,7 @@