Skip to content

Commit fb359cb

Browse files
authored
fix: if roles changed after a restart of Dozzle, then it resets user session (#4139)
1 parent 395d864 commit fb359cb

File tree

3 files changed

+12
-5
lines changed

3 files changed

+12
-5
lines changed

internal/auth/roles.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ const (
1717

1818
const All = Shell | Actions | Download
1919

20+
// ParseRole parses a comma-separated string of roles and returns the corresponding Role. Default is All for empty input.
2021
func ParseRole(commaValues string) Role {
21-
if commaValues == "" {
22+
if strings.TrimSpace(commaValues) == "" {
2223
return All
2324
}
2425

internal/auth/simple.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ func NewSimpleAuth(userDatabase UserDatabase, ttl time.Duration) *simpleAuthCont
2121
h := sha256.New()
2222
for _, user := range userDatabase.Users {
2323
h.Write([]byte(user.Password))
24+
h.Write([]byte(user.RolesConfigured))
2425
}
2526

2627
tokenAuth := jwtauth.New("HS256", h.Sum(nil), nil)
@@ -38,7 +39,7 @@ func (a *simpleAuthContext) CreateToken(username, password string) (string, erro
3839
return "", ErrInvalidCredentials
3940
}
4041

41-
claims := map[string]interface{}{"username": user.Username, "email": user.Email, "name": user.Name, "filter": user.Filter, "roles": user.RolesConfigured}
42+
claims := map[string]interface{}{"username": user.Username, "email": user.Email, "name": user.Name, "filter": user.Filter, "roles": user.Roles}
4243
jwtauth.SetIssuedNow(claims)
4344

4445
if a.ttl > 0 {

internal/auth/users.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ func decodeUsersFromFile(path string) (UserDatabase, error) {
112112
if user.Name == "" {
113113
user.Name = username
114114
}
115+
116+
user.Roles = ParseRole(user.RolesConfigured)
115117
}
116118

117119
return users, nil
@@ -201,15 +203,18 @@ func UserFromContext(ctx context.Context) *User {
201203
email := claims["email"].(string)
202204
name := claims["name"].(string)
203205
containerFilter := container.ContainerLabels{}
204-
roles := All
206+
205207
if filter, ok := claims["filter"].(string); ok {
206208
containerFilter, err = container.ParseContainerFilter(filter)
207209
if err != nil {
208210
log.Fatal().Err(err).Str("filter", filter).Msg("Failed to parse container filter")
209211
}
210212
}
211-
if role, ok := claims["roles"].(string); ok {
212-
roles = ParseRole(role)
213+
roles := None
214+
if r, ok := claims["roles"].(float64); ok {
215+
roles = Role(r)
216+
} else {
217+
log.Warn().Interface("roles", claims["roles"]).Msg("Failed to parse roles from JWT claims")
213218
}
214219

215220
user := newUser(username, email, name, containerFilter, roles)

0 commit comments

Comments
 (0)