|
|
@@ -425,7 +425,23 @@ func (s *KVServer) GetSessionInfo(token string) (*Session, error) {
|
|
|
return s.AuthManager.GetSession(token)
|
|
|
}
|
|
|
|
|
|
+// IsAdmin checks if the token belongs to a user with admin privileges
|
|
|
+// defined as having "admin" action on "*" key pattern
|
|
|
+func (s *KVServer) IsAdmin(token string) bool {
|
|
|
+ if !s.AuthManager.IsEnabled() {
|
|
|
+ return true // If auth disabled, everyone is admin (or handled by caller)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check internal system token
|
|
|
+ if token == "SYSTEM_INTERNAL" {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ return s.AuthManager.CheckPermission(token, "*", ActionAdmin, "") == nil
|
|
|
+}
|
|
|
+
|
|
|
// IsRoot checks if the token belongs to the root user
|
|
|
+// Deprecated: Use IsAdmin instead
|
|
|
func (s *KVServer) IsRoot(token string) bool {
|
|
|
sess, err := s.AuthManager.GetSession(token)
|
|
|
if err != nil {
|
|
|
@@ -434,19 +450,19 @@ func (s *KVServer) IsRoot(token string) bool {
|
|
|
return sess.Username == "root"
|
|
|
}
|
|
|
|
|
|
-// CreateUser creates a new user (Root only)
|
|
|
+// CreateUser creates a new user (Admin only)
|
|
|
func (s *KVServer) CreateUser(username, password string, roles []string, token string) error {
|
|
|
- if s.AuthManager.IsEnabled() && !s.IsRoot(token) {
|
|
|
- return fmt.Errorf("permission denied: root access required")
|
|
|
+ if s.AuthManager.IsEnabled() && !s.IsAdmin(token) {
|
|
|
+ return fmt.Errorf("permission denied: admin access required")
|
|
|
}
|
|
|
// Use RegisterUserSync
|
|
|
return s.AuthManager.RegisterUser(username, password, roles)
|
|
|
}
|
|
|
|
|
|
-// DeleteUser deletes a user (Root only)
|
|
|
+// DeleteUser deletes a user (Admin only)
|
|
|
func (s *KVServer) DeleteUser(username string, token string) error {
|
|
|
- if s.AuthManager.IsEnabled() && !s.IsRoot(token) {
|
|
|
- return fmt.Errorf("permission denied: root access required")
|
|
|
+ if s.AuthManager.IsEnabled() && !s.IsAdmin(token) {
|
|
|
+ return fmt.Errorf("permission denied: admin access required")
|
|
|
}
|
|
|
// Check if user exists
|
|
|
if _, err := s.AuthManager.GetUser(username); err != nil {
|
|
|
@@ -459,10 +475,10 @@ func (s *KVServer) DeleteUser(username string, token string) error {
|
|
|
return s.DelSync(AuthUserPrefix + username)
|
|
|
}
|
|
|
|
|
|
-// UpdateUser updates generic user fields (Root only)
|
|
|
+// UpdateUser updates generic user fields (Admin only)
|
|
|
func (s *KVServer) UpdateUser(user User, token string) error {
|
|
|
- if s.AuthManager.IsEnabled() && !s.IsRoot(token) {
|
|
|
- return fmt.Errorf("permission denied: root access required")
|
|
|
+ if s.AuthManager.IsEnabled() && !s.IsAdmin(token) {
|
|
|
+ return fmt.Errorf("permission denied: admin access required")
|
|
|
}
|
|
|
// Check if user exists
|
|
|
if _, err := s.AuthManager.GetUser(user.Username); err != nil {
|
|
|
@@ -471,14 +487,15 @@ func (s *KVServer) UpdateUser(user User, token string) error {
|
|
|
return s.AuthManager.UpdateUser(user)
|
|
|
}
|
|
|
|
|
|
-// ChangeUserPassword changes a user's password (Root or Self)
|
|
|
+// ChangeUserPassword changes a user's password (Admin or Self)
|
|
|
func (s *KVServer) ChangeUserPassword(username, newPassword string, token string) error {
|
|
|
if s.AuthManager.IsEnabled() {
|
|
|
session, err := s.AuthManager.GetSession(token)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
- if session.Username != "root" && session.Username != username {
|
|
|
+ // Allow if Admin OR Self
|
|
|
+ if !s.IsAdmin(token) && session.Username != username {
|
|
|
return fmt.Errorf("permission denied")
|
|
|
}
|
|
|
}
|
|
|
@@ -488,42 +505,42 @@ func (s *KVServer) ChangeUserPassword(username, newPassword string, token string
|
|
|
|
|
|
// Role Management Helpers
|
|
|
|
|
|
-// CreateRole creates a new role (Root only)
|
|
|
+// CreateRole creates a new role (Admin only)
|
|
|
func (s *KVServer) CreateRole(name string, token string) error {
|
|
|
- if s.AuthManager.IsEnabled() && !s.IsRoot(token) {
|
|
|
- return fmt.Errorf("permission denied: root access required")
|
|
|
+ if s.AuthManager.IsEnabled() && !s.IsAdmin(token) {
|
|
|
+ return fmt.Errorf("permission denied: admin access required")
|
|
|
}
|
|
|
return s.AuthManager.CreateRole(name)
|
|
|
}
|
|
|
|
|
|
-// DeleteRole deletes a role (Root only)
|
|
|
+// DeleteRole deletes a role (Admin only)
|
|
|
func (s *KVServer) DeleteRole(name string, token string) error {
|
|
|
- if s.AuthManager.IsEnabled() && !s.IsRoot(token) {
|
|
|
- return fmt.Errorf("permission denied: root access required")
|
|
|
+ if s.AuthManager.IsEnabled() && !s.IsAdmin(token) {
|
|
|
+ return fmt.Errorf("permission denied: admin access required")
|
|
|
}
|
|
|
return s.AuthManager.DeleteRole(name)
|
|
|
}
|
|
|
|
|
|
-// UpdateRole updates a role (Root only)
|
|
|
+// UpdateRole updates a role (Admin only)
|
|
|
func (s *KVServer) UpdateRole(role Role, token string) error {
|
|
|
- if s.AuthManager.IsEnabled() && !s.IsRoot(token) {
|
|
|
- return fmt.Errorf("permission denied: root access required")
|
|
|
+ if s.AuthManager.IsEnabled() && !s.IsAdmin(token) {
|
|
|
+ return fmt.Errorf("permission denied: admin access required")
|
|
|
}
|
|
|
return s.AuthManager.UpdateRole(role)
|
|
|
}
|
|
|
|
|
|
-// ListUsers lists all users (Root only)
|
|
|
+// ListUsers lists all users (Admin only)
|
|
|
func (s *KVServer) ListUsers(token string) ([]*User, error) {
|
|
|
- if s.AuthManager.IsEnabled() && !s.IsRoot(token) {
|
|
|
- return nil, fmt.Errorf("permission denied: root access required")
|
|
|
+ if s.AuthManager.IsEnabled() && !s.IsAdmin(token) {
|
|
|
+ return nil, fmt.Errorf("permission denied: admin access required")
|
|
|
}
|
|
|
return s.AuthManager.ListUsers(), nil
|
|
|
}
|
|
|
|
|
|
-// ListRoles lists all roles (Root only)
|
|
|
+// ListRoles lists all roles (Admin only)
|
|
|
func (s *KVServer) ListRoles(token string) ([]*Role, error) {
|
|
|
- if s.AuthManager.IsEnabled() && !s.IsRoot(token) {
|
|
|
- return nil, fmt.Errorf("permission denied: root access required")
|
|
|
+ if s.AuthManager.IsEnabled() && !s.IsAdmin(token) {
|
|
|
+ return nil, fmt.Errorf("permission denied: admin access required")
|
|
|
}
|
|
|
return s.AuthManager.ListRoles(), nil
|
|
|
}
|