diff --git a/backend/api/api.go b/backend/api/api.go
index bb6de1c..20a2960 100644
--- a/backend/api/api.go
+++ b/backend/api/api.go
@@ -88,7 +88,8 @@ func (a *APIHandler) postHandler(c *gin.Context) {
obj := c.Request.FormValue("object")
act := c.Request.FormValue("action")
data := c.Request.FormValue("data")
- objs, err := a.ConfigService.Save(obj, act, json.RawMessage(data), loginUser, hostname)
+ initUsers := c.Request.FormValue("initUsers")
+ objs, err := a.ConfigService.Save(obj, act, json.RawMessage(data), initUsers, loginUser, hostname)
if err != nil {
jsonMsg(c, "save", err)
return
diff --git a/backend/service/client.go b/backend/service/client.go
index 15b7f1b..cccf260 100644
--- a/backend/service/client.go
+++ b/backend/service/client.go
@@ -7,6 +7,7 @@ import (
"s-ui/logger"
"s-ui/util"
"s-ui/util/common"
+ "strings"
"time"
"gorm.io/gorm"
@@ -156,6 +157,56 @@ func (s *ClientService) updateLinksWithFixedInbounds(tx *gorm.DB, clients []*mod
return nil
}
+func (s *ClientService) UpdateClientsOnInboundAdd(tx *gorm.DB, initIds string, inboundId uint, hostname string) error {
+ clientIds := strings.Split(initIds, ",")
+ var clients []model.Client
+ err := tx.Model(model.Client{}).Where("id in ?", clientIds).Find(&clients).Error
+ if err != nil {
+ return err
+ }
+ var inbound model.Inbound
+ err = tx.Model(model.Inbound{}).Preload("Tls").Where("id = ?", inboundId).Find(&inbound).Error
+ if err != nil {
+ return err
+ }
+ for _, client := range clients {
+ // Add inbounds
+ var clientInbounds []uint
+ json.Unmarshal(client.Inbounds, &clientInbounds)
+ clientInbounds = append(clientInbounds, inboundId)
+ client.Inbounds, err = json.MarshalIndent(clientInbounds, "", " ")
+ if err != nil {
+ return err
+ }
+ // Add links
+ var clientLinks, newClientLinks []map[string]string
+ json.Unmarshal(client.Links, &clientLinks)
+ newLinks := util.LinkGenerator(client.Config, &inbound, hostname)
+ for _, newLink := range newLinks {
+ newClientLinks = append(newClientLinks, map[string]string{
+ "remark": inbound.Tag,
+ "type": "local",
+ "uri": newLink,
+ })
+ }
+ for _, clientLink := range clientLinks {
+ if clientLink["remark"] != inbound.Tag {
+ newClientLinks = append(newClientLinks, clientLink)
+ }
+ }
+
+ client.Links, err = json.MarshalIndent(newClientLinks, "", " ")
+ if err != nil {
+ return err
+ }
+ err = tx.Save(&client).Error
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
func (s *ClientService) UpdateClientsOnInboundDelete(tx *gorm.DB, id uint, tag string) error {
var clients []model.Client
err := tx.Table("clients").
diff --git a/backend/service/config.go b/backend/service/config.go
index 0498761..138221d 100644
--- a/backend/service/config.go
+++ b/backend/service/config.go
@@ -116,7 +116,7 @@ func (s *ConfigService) StopCore() error {
return nil
}
-func (s *ConfigService) Save(obj string, act string, data json.RawMessage, loginUser string, hostname string) ([]string, error) {
+func (s *ConfigService) Save(obj string, act string, data json.RawMessage, initUsers string, loginUser string, hostname string) ([]string, error) {
var err error
var inboundIds []uint
var inboundId uint
@@ -139,7 +139,7 @@ func (s *ConfigService) Save(obj string, act string, data json.RawMessage, login
case "tls":
inboundIds, err = s.TlsService.Save(tx, act, data)
case "inbounds":
- inboundId, err = s.InboundService.Save(tx, act, data, hostname)
+ inboundId, err = s.InboundService.Save(tx, act, data, initUsers, hostname)
case "outbounds":
err = s.OutboundService.Save(tx, act, data)
case "endpoints":
@@ -173,7 +173,6 @@ func (s *ConfigService) Save(obj string, act string, data json.RawMessage, login
// Commit changes so far
tx.Commit()
LastUpdate = time.Now().Unix()
- var objs []string = []string{obj}
tx = db.Begin()
// Update side changes
@@ -186,8 +185,10 @@ func (s *ConfigService) Save(obj string, act string, data json.RawMessage, login
}
objs = append(objs, "clients")
}
- if obj == "inbounds" && act != "add" {
+ if obj == "inbounds" {
switch act {
+ case "new":
+ err = s.ClientService.UpdateClientsOnInboundAdd(tx, initUsers, inboundId, hostname)
case "edit":
err = s.ClientService.UpdateLinksByInboundChange(tx, []uint{inboundId}, hostname)
case "del":
diff --git a/backend/service/inbounds.go b/backend/service/inbounds.go
index 39e24de..7b4aeea 100644
--- a/backend/service/inbounds.go
+++ b/backend/service/inbounds.go
@@ -96,7 +96,7 @@ func (s *InboundService) FromIds(ids []uint) ([]*model.Inbound, error) {
return inbounds, nil
}
-func (s *InboundService) Save(tx *gorm.DB, act string, data json.RawMessage, hostname string) (uint, error) {
+func (s *InboundService) Save(tx *gorm.DB, act string, data json.RawMessage, initUsers string, hostname string) (uint, error) {
var err error
var id uint
@@ -107,7 +107,6 @@ func (s *InboundService) Save(tx *gorm.DB, act string, data json.RawMessage, hos
if err != nil {
return 0, err
}
- id = inbound.Id
if inbound.TlsId > 0 {
err = tx.Model(model.Tls{}).Where("id = ?", inbound.TlsId).Find(&inbound.Tls).Error
if err != nil {
@@ -115,6 +114,17 @@ func (s *InboundService) Save(tx *gorm.DB, act string, data json.RawMessage, hos
}
}
+ err = util.FillOutJson(&inbound, hostname)
+ if err != nil {
+ return 0, err
+ }
+
+ err = tx.Save(&inbound).Error
+ if err != nil {
+ return 0, err
+ }
+ id = inbound.Id
+
if corePtr.IsRunning() {
if act == "edit" {
var oldTag string
@@ -133,7 +143,11 @@ func (s *InboundService) Save(tx *gorm.DB, act string, data json.RawMessage, hos
return 0, err
}
- inboundConfig, err = s.addUsers(tx, inboundConfig, inbound.Id, inbound.Type)
+ if act == "edit" {
+ inboundConfig, err = s.addUsers(tx, inboundConfig, inbound.Id, inbound.Type)
+ } else {
+ inboundConfig, err = s.initUsers(tx, inboundConfig, initUsers, inbound.Id, inbound.Type)
+ }
if err != nil {
return 0, err
}
@@ -143,16 +157,6 @@ func (s *InboundService) Save(tx *gorm.DB, act string, data json.RawMessage, hos
return 0, err
}
}
-
- err = util.FillOutJson(&inbound, hostname)
- if err != nil {
- return 0, err
- }
-
- err = tx.Save(&inbound).Error
- if err != nil {
- return 0, err
- }
case "del":
var tag string
err = json.Unmarshal(data, &tag)
@@ -263,7 +267,56 @@ func (s *InboundService) addUsers(db *gorm.DB, inboundJson []byte, inboundId uin
inbound["users"] = usersJson
}
- inbound["users"] = usersJson
+ return json.Marshal(inbound)
+}
+
+func (s *InboundService) initUsers(db *gorm.DB, inboundJson []byte, clientIds string, inboundId uint, inboundType string) ([]byte, error) {
+ ClientIds := strings.Split(clientIds, ",")
+ if len(ClientIds) == 0 {
+ return inboundJson, nil
+ }
+ switch inboundType {
+ case "mixed", "socks", "http", "shadowsocks", "vmess", "trojan", "naive", "hysteria", "shadowtls", "tuic", "hysteria2", "vless":
+ break
+ default:
+ return inboundJson, nil
+ }
+
+ var inbound map[string]interface{}
+ err := json.Unmarshal(inboundJson, &inbound)
+ if err != nil {
+ return nil, err
+ }
+
+ if inboundType == "shadowtls" {
+ version, _ := inbound["version"].(float64)
+ if int(version) < 3 {
+ return inboundJson, nil
+ }
+ }
+ if inboundType == "shadowsocks" {
+ method, _ := inbound["method"].(string)
+ if method == "2022-blake3-aes-128-gcm" {
+ inboundType = "shadowsocks16"
+ }
+ }
+ var users []string
+ err = db.Raw(`SELECT json_extract(clients.config, ?)
+ FROM clients
+ WHERE enable = true AND id in ?`,
+ "$."+inboundType, ClientIds).Scan(&users).Error
+ if err != nil {
+ return nil, err
+ }
+ var usersJson []json.RawMessage
+ for _, user := range users {
+ usersJson = append(usersJson, json.RawMessage(user))
+ }
+
+ if len(usersJson) > 0 || inboundType != "shadowsocks" {
+ inbound["users"] = usersJson
+ }
+
return json.Marshal(inbound)
}
diff --git a/frontend/src/components/Users.vue b/frontend/src/components/Users.vue
index 13c7200..636c1c0 100644
--- a/frontend/src/components/Users.vue
+++ b/frontend/src/components/Users.vue
@@ -2,34 +2,41 @@
- {inbound.users = hasUser? [] : undefined}"
- color="primary"
- :label="$t('in.clients')"
- hide-details>
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/layouts/modals/Inbound.vue b/frontend/src/layouts/modals/Inbound.vue
index e085d8d..af0e3c3 100644
--- a/frontend/src/layouts/modals/Inbound.vue
+++ b/frontend/src/layouts/modals/Inbound.vue
@@ -50,7 +50,7 @@
-
+
@@ -95,7 +95,7 @@