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..8b57b8b2 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/inbounds/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 @@