You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							255 lines
						
					
					
						
							7.2 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							255 lines
						
					
					
						
							7.2 KiB
						
					
					
				
								package handlers
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"net/http"
							 | 
						|
									"time"
							 | 
						|
								
							 | 
						|
									"github.com/gin-gonic/gin"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/admin/dash"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/admin/view/app"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/admin/view/layout"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/glog"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								// UserHandlers contains all the HTTP handlers for user management
							 | 
						|
								type UserHandlers struct {
							 | 
						|
									adminServer *dash.AdminServer
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// NewUserHandlers creates a new instance of UserHandlers
							 | 
						|
								func NewUserHandlers(adminServer *dash.AdminServer) *UserHandlers {
							 | 
						|
									return &UserHandlers{
							 | 
						|
										adminServer: adminServer,
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// ShowObjectStoreUsers renders the object store users management page
							 | 
						|
								func (h *UserHandlers) ShowObjectStoreUsers(c *gin.Context) {
							 | 
						|
									// Get object store users data from the server
							 | 
						|
									usersData := h.getObjectStoreUsersData(c)
							 | 
						|
								
							 | 
						|
									// Render HTML template
							 | 
						|
									c.Header("Content-Type", "text/html")
							 | 
						|
									usersComponent := app.ObjectStoreUsers(usersData)
							 | 
						|
									layoutComponent := layout.Layout(c, usersComponent)
							 | 
						|
									err := layoutComponent.Render(c.Request.Context(), c.Writer)
							 | 
						|
									if err != nil {
							 | 
						|
										c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to render template: " + err.Error()})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// GetUsers returns the list of users as JSON
							 | 
						|
								func (h *UserHandlers) GetUsers(c *gin.Context) {
							 | 
						|
									users, err := h.adminServer.GetObjectStoreUsers()
							 | 
						|
									if err != nil {
							 | 
						|
										c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get users: " + err.Error()})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
									c.JSON(http.StatusOK, gin.H{"users": users})
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// CreateUser handles user creation
							 | 
						|
								func (h *UserHandlers) CreateUser(c *gin.Context) {
							 | 
						|
									var req dash.CreateUserRequest
							 | 
						|
									if err := c.ShouldBindJSON(&req); err != nil {
							 | 
						|
										c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request: " + err.Error()})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Validate required fields
							 | 
						|
									if req.Username == "" {
							 | 
						|
										c.JSON(http.StatusBadRequest, gin.H{"error": "Username is required"})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									user, err := h.adminServer.CreateObjectStoreUser(req)
							 | 
						|
									if err != nil {
							 | 
						|
										glog.Errorf("Failed to create user %s: %v", req.Username, err)
							 | 
						|
										c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create user: " + err.Error()})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									c.JSON(http.StatusCreated, gin.H{
							 | 
						|
										"message": "User created successfully",
							 | 
						|
										"user":    user,
							 | 
						|
									})
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// UpdateUser handles user updates
							 | 
						|
								func (h *UserHandlers) UpdateUser(c *gin.Context) {
							 | 
						|
									username := c.Param("username")
							 | 
						|
									if username == "" {
							 | 
						|
										c.JSON(http.StatusBadRequest, gin.H{"error": "Username is required"})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									var req dash.UpdateUserRequest
							 | 
						|
									if err := c.ShouldBindJSON(&req); err != nil {
							 | 
						|
										c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request: " + err.Error()})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									user, err := h.adminServer.UpdateObjectStoreUser(username, req)
							 | 
						|
									if err != nil {
							 | 
						|
										glog.Errorf("Failed to update user %s: %v", username, err)
							 | 
						|
										c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update user: " + err.Error()})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									c.JSON(http.StatusOK, gin.H{
							 | 
						|
										"message": "User updated successfully",
							 | 
						|
										"user":    user,
							 | 
						|
									})
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// DeleteUser handles user deletion
							 | 
						|
								func (h *UserHandlers) DeleteUser(c *gin.Context) {
							 | 
						|
									username := c.Param("username")
							 | 
						|
									if username == "" {
							 | 
						|
										c.JSON(http.StatusBadRequest, gin.H{"error": "Username is required"})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									err := h.adminServer.DeleteObjectStoreUser(username)
							 | 
						|
									if err != nil {
							 | 
						|
										glog.Errorf("Failed to delete user %s: %v", username, err)
							 | 
						|
										c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete user: " + err.Error()})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									c.JSON(http.StatusOK, gin.H{
							 | 
						|
										"message": "User deleted successfully",
							 | 
						|
									})
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// GetUserDetails returns detailed information about a specific user
							 | 
						|
								func (h *UserHandlers) GetUserDetails(c *gin.Context) {
							 | 
						|
									username := c.Param("username")
							 | 
						|
									if username == "" {
							 | 
						|
										c.JSON(http.StatusBadRequest, gin.H{"error": "Username is required"})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									user, err := h.adminServer.GetObjectStoreUserDetails(username)
							 | 
						|
									if err != nil {
							 | 
						|
										c.JSON(http.StatusNotFound, gin.H{"error": "User not found: " + err.Error()})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									c.JSON(http.StatusOK, user)
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// CreateAccessKey creates a new access key for a user
							 | 
						|
								func (h *UserHandlers) CreateAccessKey(c *gin.Context) {
							 | 
						|
									username := c.Param("username")
							 | 
						|
									if username == "" {
							 | 
						|
										c.JSON(http.StatusBadRequest, gin.H{"error": "Username is required"})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									accessKey, err := h.adminServer.CreateAccessKey(username)
							 | 
						|
									if err != nil {
							 | 
						|
										glog.Errorf("Failed to create access key for user %s: %v", username, err)
							 | 
						|
										c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create access key: " + err.Error()})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									c.JSON(http.StatusCreated, gin.H{
							 | 
						|
										"message":    "Access key created successfully",
							 | 
						|
										"access_key": accessKey,
							 | 
						|
									})
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// DeleteAccessKey deletes an access key for a user
							 | 
						|
								func (h *UserHandlers) DeleteAccessKey(c *gin.Context) {
							 | 
						|
									username := c.Param("username")
							 | 
						|
									accessKeyId := c.Param("accessKeyId")
							 | 
						|
								
							 | 
						|
									if username == "" || accessKeyId == "" {
							 | 
						|
										c.JSON(http.StatusBadRequest, gin.H{"error": "Username and access key ID are required"})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									err := h.adminServer.DeleteAccessKey(username, accessKeyId)
							 | 
						|
									if err != nil {
							 | 
						|
										glog.Errorf("Failed to delete access key %s for user %s: %v", accessKeyId, username, err)
							 | 
						|
										c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete access key: " + err.Error()})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									c.JSON(http.StatusOK, gin.H{
							 | 
						|
										"message": "Access key deleted successfully",
							 | 
						|
									})
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// GetUserPolicies returns the policies for a user
							 | 
						|
								func (h *UserHandlers) GetUserPolicies(c *gin.Context) {
							 | 
						|
									username := c.Param("username")
							 | 
						|
									if username == "" {
							 | 
						|
										c.JSON(http.StatusBadRequest, gin.H{"error": "Username is required"})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									policies, err := h.adminServer.GetUserPolicies(username)
							 | 
						|
									if err != nil {
							 | 
						|
										c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get user policies: " + err.Error()})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									c.JSON(http.StatusOK, gin.H{"policies": policies})
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// UpdateUserPolicies updates the policies for a user
							 | 
						|
								func (h *UserHandlers) UpdateUserPolicies(c *gin.Context) {
							 | 
						|
									username := c.Param("username")
							 | 
						|
									if username == "" {
							 | 
						|
										c.JSON(http.StatusBadRequest, gin.H{"error": "Username is required"})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									var req dash.UpdateUserPoliciesRequest
							 | 
						|
									if err := c.ShouldBindJSON(&req); err != nil {
							 | 
						|
										c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request: " + err.Error()})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									err := h.adminServer.UpdateUserPolicies(username, req.Actions)
							 | 
						|
									if err != nil {
							 | 
						|
										glog.Errorf("Failed to update policies for user %s: %v", username, err)
							 | 
						|
										c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update user policies: " + err.Error()})
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									c.JSON(http.StatusOK, gin.H{
							 | 
						|
										"message": "User policies updated successfully",
							 | 
						|
									})
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// getObjectStoreUsersData retrieves object store users data from the server
							 | 
						|
								func (h *UserHandlers) getObjectStoreUsersData(c *gin.Context) dash.ObjectStoreUsersData {
							 | 
						|
									username := c.GetString("username")
							 | 
						|
									if username == "" {
							 | 
						|
										username = "admin"
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Get object store users
							 | 
						|
									users, err := h.adminServer.GetObjectStoreUsers()
							 | 
						|
									if err != nil {
							 | 
						|
										glog.Errorf("Failed to get object store users: %v", err)
							 | 
						|
										// Return empty data on error
							 | 
						|
										return dash.ObjectStoreUsersData{
							 | 
						|
											Username:    username,
							 | 
						|
											Users:       []dash.ObjectStoreUser{},
							 | 
						|
											TotalUsers:  0,
							 | 
						|
											LastUpdated: time.Now(),
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									return dash.ObjectStoreUsersData{
							 | 
						|
										Username:    username,
							 | 
						|
										Users:       users,
							 | 
						|
										TotalUsers:  len(users),
							 | 
						|
										LastUpdated: time.Now(),
							 | 
						|
									}
							 | 
						|
								}
							 |