Skip to content

Commit a9fcd51

Browse files
authored
fix: ensure DefaultRole stores role ID while exposing role name in APIs (#9279)
* fix(setting): ensure DefaultRole stores role ID while exposing role name in APIs - Simplified initial settings to use `model.GUEST` as the default role ID instead of querying roles at startup. - Updated `GetSetting`, `ListSettings` handlers to: - Convert stored role ID into the corresponding role name when returning data. - Preserve dynamic role options for selection. - Removed unused `strings` import and role preloading logic from `InitialSettings`. - This change avoids DB dependency during initialization while keeping consistent role display for frontend clients. * fix(setting): ensure DefaultRole stores role ID while exposing role name in APIs (fix/settings-get-role) - Simplify initial settings to use `model.GUEST` as the default role ID instead of querying roles at startup. - Update `GetSetting`, `ListSettings` handlers to: - Convert stored role ID into the corresponding role name when returning data. - Preserve dynamic role options for selection. - Remove unused `strings` import and role preloading logic from `InitialSettings`. - Avoid DB dependency during initialization while keeping consistent role display for frontend clients.
1 parent 74e3841 commit a9fcd51

File tree

3 files changed

+43
-24
lines changed

3 files changed

+43
-24
lines changed

internal/bootstrap/data/setting.go

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package data
22

33
import (
44
"strconv"
5-
"strings"
65

76
"github.com/alist-org/alist/v3/cmd/flags"
87
"github.com/alist-org/alist/v3/internal/conf"
@@ -92,21 +91,7 @@ func InitialSettings() []model.SettingItem {
9291
} else {
9392
token = random.Token()
9493
}
95-
roles, _, err := op.GetRoles(1, model.MaxInt)
96-
if err != nil {
97-
utils.Log.Fatalf("failed get roles: %+v", err)
98-
}
99-
roleNames := make([]string, len(roles))
100-
defaultRoleID := ""
101-
for i, role := range roles {
102-
roleNames[i] = role.Name
103-
if role.Name == "guest" {
104-
defaultRoleID = strconv.Itoa(int(role.ID))
105-
}
106-
}
107-
if defaultRoleID == "" && len(roles) > 0 {
108-
defaultRoleID = strconv.Itoa(int(roles[0].ID))
109-
}
94+
defaultRoleID := strconv.Itoa(model.GUEST)
11095
initialSettingItems = []model.SettingItem{
11196
// site settings
11297
{Key: conf.VERSION, Value: conf.Version, Type: conf.TypeString, Group: model.SITE, Flag: model.READONLY},
@@ -120,7 +105,7 @@ func InitialSettings() []model.SettingItem {
120105
{Key: conf.AllowMounted, Value: "true", Type: conf.TypeBool, Group: model.SITE},
121106
{Key: conf.RobotsTxt, Value: "User-agent: *\nAllow: /", Type: conf.TypeText, Group: model.SITE},
122107
{Key: conf.AllowRegister, Value: "false", Type: conf.TypeBool, Group: model.SITE},
123-
{Key: conf.DefaultRole, Value: defaultRoleID, Type: conf.TypeSelect, Options: strings.Join(roleNames, ","), Group: model.SITE},
108+
{Key: conf.DefaultRole, Value: defaultRoleID, Type: conf.TypeSelect, Group: model.SITE},
124109
// newui settings
125110
{Key: conf.UseNewui, Value: "false", Type: conf.TypeBool, Group: model.SITE},
126111
// style settings

internal/op/hook.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,12 @@ var settingItemHooks = map[string]SettingItemHook{
8888
if v == "" {
8989
return nil
9090
}
91-
r, err := GetRoleByName(v)
91+
id, err := strconv.Atoi(v)
9292
if err != nil {
93-
return err
93+
return errors.WithStack(err)
9494
}
95-
item.Value = strconv.Itoa(int(r.ID))
96-
return nil
95+
_, err = GetRole(uint(id))
96+
return err
9797
},
9898
}
9999

server/handles/setting.go

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,12 @@ func getRoleOptions() string {
1919
if err != nil {
2020
return ""
2121
}
22-
names := make([]string, len(roles))
23-
for i, r := range roles {
24-
names[i] = r.Name
22+
names := make([]string, 0, len(roles))
23+
for _, r := range roles {
24+
if r.Name == "admin" || r.Name == "guest" {
25+
continue
26+
}
27+
names = append(names, r.Name)
2528
}
2629
return strings.Join(names, ",")
2730
}
@@ -49,6 +52,11 @@ func GetSetting(c *gin.Context) {
4952
if item.Key == conf.DefaultRole {
5053
copy := *item
5154
copy.Options = getRoleOptions()
55+
if id, err := strconv.Atoi(copy.Value); err == nil {
56+
if r, err := op.GetRole(uint(id)); err == nil {
57+
copy.Value = r.Name
58+
}
59+
}
5260
common.SuccessResp(c, copy)
5361
return
5462
}
@@ -61,6 +69,11 @@ func GetSetting(c *gin.Context) {
6169
}
6270
for i := range items {
6371
if items[i].Key == conf.DefaultRole {
72+
if id, err := strconv.Atoi(items[i].Value); err == nil {
73+
if r, err := op.GetRole(uint(id)); err == nil {
74+
items[i].Value = r.Name
75+
}
76+
}
6477
items[i].Options = getRoleOptions()
6578
break
6679
}
@@ -75,6 +88,22 @@ func SaveSettings(c *gin.Context) {
7588
common.ErrorResp(c, err, 400)
7689
return
7790
}
91+
92+
for i := range req {
93+
if req[i].Key == conf.DefaultRole {
94+
role, err := op.GetRoleByName(req[i].Value)
95+
if err != nil {
96+
common.ErrorResp(c, err, 400)
97+
return
98+
}
99+
if role.Name == "admin" || role.Name == "guest" {
100+
common.ErrorStrResp(c, "cannot set admin or guest as default role", 400)
101+
return
102+
}
103+
req[i].Value = strconv.Itoa(int(role.ID))
104+
}
105+
}
106+
78107
if err := op.SaveSettingItems(req); err != nil {
79108
common.ErrorResp(c, err, 500)
80109
} else {
@@ -114,6 +143,11 @@ func ListSettings(c *gin.Context) {
114143
}
115144
for i := range settings {
116145
if settings[i].Key == conf.DefaultRole {
146+
if id, err := strconv.Atoi(settings[i].Value); err == nil {
147+
if r, err := op.GetRole(uint(id)); err == nil {
148+
settings[i].Value = r.Name
149+
}
150+
}
117151
settings[i].Options = getRoleOptions()
118152
break
119153
}

0 commit comments

Comments
 (0)