aboutsummaryrefslogtreecommitdiff
path: root/weed/admin/handlers/user_handlers.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/admin/handlers/user_handlers.go')
-rw-r--r--weed/admin/handlers/user_handlers.go255
1 files changed, 255 insertions, 0 deletions
diff --git a/weed/admin/handlers/user_handlers.go b/weed/admin/handlers/user_handlers.go
new file mode 100644
index 000000000..9f36848c0
--- /dev/null
+++ b/weed/admin/handlers/user_handlers.go
@@ -0,0 +1,255 @@
+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(),
+ }
+}