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(), | |
| 	} | |
| }
 |