mirror of
				https://github.com/zoriya/Kyoo.git
				synced 2025-11-04 03:27:14 -05:00 
			
		
		
		
	Check permissions
This commit is contained in:
		
							parent
							
								
									3c73196f87
								
							
						
					
					
						commit
						1b192c7d05
					
				@ -163,6 +163,8 @@ func main() {
 | 
				
			|||||||
	}))
 | 
						}))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r.GET("/users", h.ListUsers)
 | 
						r.GET("/users", h.ListUsers)
 | 
				
			||||||
 | 
						r.GET("/users/:id", h.GetUser)
 | 
				
			||||||
 | 
						r.GET("/users/me", h.GetMe)
 | 
				
			||||||
	e.POST("/users", h.Register)
 | 
						e.POST("/users", h.Register)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	e.POST("/sessions", h.Login)
 | 
						e.POST("/sessions", h.Login)
 | 
				
			||||||
 | 
				
			|||||||
@ -78,12 +78,16 @@ func MapOidc(oidc *dbc.OidcHandle) OidcHandle {
 | 
				
			|||||||
// @Failure      400  {object}  problem.Problem "Invalid after id"
 | 
					// @Failure      400  {object}  problem.Problem "Invalid after id"
 | 
				
			||||||
// @Router       /users [get]
 | 
					// @Router       /users [get]
 | 
				
			||||||
func (h *Handler) ListUsers(c echo.Context) error {
 | 
					func (h *Handler) ListUsers(c echo.Context) error {
 | 
				
			||||||
 | 
						err := CheckPermission(c, []string{"user.read"})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx := context.Background()
 | 
						ctx := context.Background()
 | 
				
			||||||
	limit := int32(20)
 | 
						limit := int32(20)
 | 
				
			||||||
	id := c.Param("afterId")
 | 
						id := c.Param("afterId")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var users []dbc.User
 | 
						var users []dbc.User
 | 
				
			||||||
	var err error
 | 
					 | 
				
			||||||
	if id == "" {
 | 
						if id == "" {
 | 
				
			||||||
		users, err = h.db.GetAllUsers(ctx, limit)
 | 
							users, err = h.db.GetAllUsers(ctx, limit)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
@ -109,6 +113,38 @@ func (h *Handler) ListUsers(c echo.Context) error {
 | 
				
			|||||||
	return c.JSON(200, ret)
 | 
						return c.JSON(200, ret)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// @Summary      Get user
 | 
				
			||||||
 | 
					// @Description  Get informations about a user from it's id
 | 
				
			||||||
 | 
					// @Tags         users
 | 
				
			||||||
 | 
					// @Produce      json
 | 
				
			||||||
 | 
					// @Security     Jwt[users.read]
 | 
				
			||||||
 | 
					// @Param        id   path      string    true  "The id of the user" Format(uuid)
 | 
				
			||||||
 | 
					// @Success      200  {object}  User
 | 
				
			||||||
 | 
					// @Failure      404  {object}  problem.Problem "No user with the given id found"
 | 
				
			||||||
 | 
					// @Router /users/{id} [get]
 | 
				
			||||||
 | 
					func (h *Handler) GetUser(c echo.Context) error {
 | 
				
			||||||
 | 
						err := CheckPermission(c, []string{"user.read"})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						id, err := uuid.Parse(c.Param("id"))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return echo.NewHTTPError(400, "Invalid id")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						dbuser, err := h.db.GetUser(context.Background(), id)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						user := MapDbUser(&dbuser[0].User)
 | 
				
			||||||
 | 
						for _, oidc := range dbuser {
 | 
				
			||||||
 | 
							user.Oidc[oidc.OidcHandle.Provider] = MapOidc(&oidc.OidcHandle)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return c.JSON(200, user)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// @Summary      Get me
 | 
					// @Summary      Get me
 | 
				
			||||||
// @Description  Get informations about the currently connected user
 | 
					// @Description  Get informations about the currently connected user
 | 
				
			||||||
// @Tags         users
 | 
					// @Tags         users
 | 
				
			||||||
@ -136,22 +172,6 @@ func (h *Handler) GetMe(c echo.Context) error {
 | 
				
			|||||||
	return c.JSON(200, user)
 | 
						return c.JSON(200, user)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func GetCurrentUserId(c echo.Context) (uuid.UUID, error) {
 | 
					 | 
				
			||||||
	user := c.Get("user").(*jwt.Token)
 | 
					 | 
				
			||||||
	if user == nil {
 | 
					 | 
				
			||||||
		return uuid.UUID{}, echo.NewHTTPError(401, "Unauthorized")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	sub, err := user.Claims.GetSubject()
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return uuid.UUID{}, echo.NewHTTPError(403, "Could not retrive subject")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	ret, err := uuid.Parse(sub)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return uuid.UUID{}, echo.NewHTTPError(403, "Invalid id")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return ret, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// @Summary      Register
 | 
					// @Summary      Register
 | 
				
			||||||
// @Description  Register as a new user and open a session for it
 | 
					// @Description  Register as a new user and open a session for it
 | 
				
			||||||
// @Tags         users
 | 
					// @Tags         users
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										62
									
								
								auth/utils.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								auth/utils.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,62 @@
 | 
				
			|||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"slices"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/golang-jwt/jwt/v5"
 | 
				
			||||||
 | 
						"github.com/google/uuid"
 | 
				
			||||||
 | 
						"github.com/labstack/echo/v4"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func GetCurrentUserId(c echo.Context) (uuid.UUID, error) {
 | 
				
			||||||
 | 
						user := c.Get("user").(*jwt.Token)
 | 
				
			||||||
 | 
						if user == nil {
 | 
				
			||||||
 | 
							return uuid.UUID{}, echo.NewHTTPError(401, "Unauthorized")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sub, err := user.Claims.GetSubject()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return uuid.UUID{}, echo.NewHTTPError(403, "Could not retrive subject")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ret, err := uuid.Parse(sub)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return uuid.UUID{}, echo.NewHTTPError(403, "Invalid id")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ret, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func CheckPremissions(c echo.Context, perms []string) error {
 | 
				
			||||||
 | 
						token, ok := c.Get("user").(*jwt.Token)
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							return echo.NewHTTPError(401, "Not logged in")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						claims, ok := token.Claims.(jwt.MapClaims)
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							return echo.NewHTTPError(403, "Could not retrieve claims")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						permissions_claims, ok := claims["permissions"]
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							return echo.NewHTTPError(403, fmt.Sprintf("Missing permissions: %s.", ", "))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						permissions, ok := permissions_claims.([]string)
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							return echo.NewHTTPError(403, "Invalid permission claim.")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						missing := make([]string, 0)
 | 
				
			||||||
 | 
						for _, perm := range perms {
 | 
				
			||||||
 | 
							if !slices.Contains(permissions, perm) {
 | 
				
			||||||
 | 
								missing = append(missing, perm)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(missing) != 0 {
 | 
				
			||||||
 | 
							return echo.NewHTTPError(
 | 
				
			||||||
 | 
								403,
 | 
				
			||||||
 | 
								fmt.Sprintf("Missing permissions: %s.", strings.Join(missing, ", ")),
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user