diff --git a/Dockerfile b/Dockerfile index 3db3af91..62ba6852 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,9 +23,6 @@ RUN go build \ FROM alpine:3.14.3 AS monolithic WORKDIR /usr/local/memos -# RUN apk add --no-cache tzdata -# ENV TZ="Asia/Shanghai" - COPY --from=backend /backend-build/memos /usr/local/memos/ COPY --from=frontend /frontend-build/dist /usr/local/memos/web/dist diff --git a/bin/server/cmd/root.go b/bin/server/cmd/root.go index 6210722a..bde1bac4 100644 --- a/bin/server/cmd/root.go +++ b/bin/server/cmd/root.go @@ -84,6 +84,8 @@ func (m *Main) Run() error { s.ShortcutService = store.NewShortcutService(db) s.MemoService = store.NewMemoService(db) s.UserService = store.NewUserService(db) + s.ShortcutService = store.NewShortcutService(db) + s.ResourceService = store.NewResourceService(db) m.server = s diff --git a/server/jwt.go b/server/basic_auth.go similarity index 86% rename from server/jwt.go rename to server/basic_auth.go index fc07ad65..d38287d4 100644 --- a/server/jwt.go +++ b/server/basic_auth.go @@ -24,7 +24,7 @@ func getUserIdContextKey() string { func setUserSession(c echo.Context, user *api.User) error { sess, err := session.Get("session", c) if err != nil { - return fmt.Errorf("failed to get session") + return fmt.Errorf("failed to get session, err: %w", err) } sess.Options = &sessions.Options{ Path: "/", @@ -34,7 +34,7 @@ func setUserSession(c echo.Context, user *api.User) error { sess.Values[userIdContextKey] = user.Id err = sess.Save(c.Request(), c.Response()) if err != nil { - return fmt.Errorf("failed to set session") + return fmt.Errorf("failed to set session, err: %w", err) } return nil @@ -43,7 +43,7 @@ func setUserSession(c echo.Context, user *api.User) error { func removeUserSession(c echo.Context) error { sess, err := session.Get("session", c) if err != nil { - return fmt.Errorf("failed to get session") + return fmt.Errorf("failed to get session, err: %w", err) } sess.Options = &sessions.Options{ Path: "/", @@ -53,14 +53,14 @@ func removeUserSession(c echo.Context) error { sess.Values[userIdContextKey] = nil err = sess.Save(c.Request(), c.Response()) if err != nil { - return fmt.Errorf("failed to set session") + return fmt.Errorf("failed to set session, err: %w", err) } return nil } // Use session instead of jwt in the initial version -func JWTMiddleware(us api.UserService, next echo.HandlerFunc) echo.HandlerFunc { +func BasicAuthMiddleware(us api.UserService, next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { // Skips auth if common.HasPrefixes(c.Path(), "/api/auth") { @@ -69,7 +69,7 @@ func JWTMiddleware(us api.UserService, next echo.HandlerFunc) echo.HandlerFunc { sess, err := session.Get("session", c) if err != nil { - return echo.NewHTTPError(http.StatusUnauthorized, "Missing session") + return echo.NewHTTPError(http.StatusUnauthorized, "Missing session").SetInternal(err) } userIdValue := sess.Values[userIdContextKey] diff --git a/server/resource.go b/server/resource.go index b4d05d4b..5841e467 100644 --- a/server/resource.go +++ b/server/resource.go @@ -30,20 +30,20 @@ func (s *Server) registerResourceRoutes(g *echo.Group) { size := file.Size src, err := file.Open() if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, "Failed to open file").SetInternal(err) + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to open file").SetInternal(err) } defer src.Close() - blob, err := ioutil.ReadAll(src) + fileBytes, err := ioutil.ReadAll(src) if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, "Failed to read file").SetInternal(err) + return echo.NewHTTPError(http.StatusInternalServerError, "Failed to read file").SetInternal(err) } resourceCreate := &api.ResourceCreate{ Filename: filename, Type: filetype, Size: size, - Blob: blob, + Blob: fileBytes, CreatorId: userId, } diff --git a/server/server.go b/server/server.go index 56ed641a..0f26e52a 100644 --- a/server/server.go +++ b/server/server.go @@ -3,7 +3,7 @@ package server import ( "fmt" "memos/api" - "memos/common" + "time" "github.com/gorilla/sessions" "github.com/labstack/echo-contrib/session" @@ -28,6 +28,16 @@ func NewServer() *Server { e.HideBanner = true e.HidePort = false + e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{ + Format: "${method} ${uri} ${status}\n", + })) + + e.Use(middleware.TimeoutWithConfig(middleware.TimeoutConfig{ + Skipper: middleware.DefaultSkipper, + ErrorMessage: "Request timeout", + Timeout: 30 * time.Second, + })) + e.Use(middleware.StaticWithConfig(middleware.StaticConfig{ Skipper: middleware.DefaultSkipper, Root: "web/dist", @@ -35,7 +45,7 @@ func NewServer() *Server { HTML5: true, })) - e.Use(session.Middleware(sessions.NewCookieStore([]byte(common.GenUUID())))) + e.Use(session.Middleware(sessions.NewCookieStore([]byte("just_memos")))) s := &Server{ e: e, @@ -47,7 +57,7 @@ func NewServer() *Server { apiGroup := e.Group("/api") apiGroup.Use(func(next echo.HandlerFunc) echo.HandlerFunc { - return JWTMiddleware(s.UserService, next) + return BasicAuthMiddleware(s.UserService, next) }) s.registerAuthRoutes(apiGroup) s.registerUserRoutes(apiGroup) diff --git a/server/user.go b/server/user.go index 907fa921..75ba07b5 100644 --- a/server/user.go +++ b/server/user.go @@ -11,7 +11,13 @@ import ( func (s *Server) registerUserRoutes(g *echo.Group) { g.GET("/user/me", func(c echo.Context) error { - userId := c.Get(getUserIdContextKey()).(int) + // /api/user/me is used to check if the user is logged in, + userSessionId := c.Get(getUserIdContextKey()) + if userSessionId == nil { + return echo.NewHTTPError(http.StatusUnauthorized, "Missing session") + } + + userId := userSessionId.(int) userFind := &api.UserFind{ Id: &userId, } diff --git a/server/webhook.go b/server/webhook.go index 097e2cc3..c6d734aa 100644 --- a/server/webhook.go +++ b/server/webhook.go @@ -47,7 +47,7 @@ func (s *Server) registerWebhookRoutes(g *echo.Group) { return nil }) - g.GET("r/:resourceId/:filename", func(c echo.Context) error { + g.GET("/r/:resourceId/:filename", func(c echo.Context) error { resourceId, err := strconv.Atoi(c.Param("resourceId")) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("ID is not a number: %s", c.Param("resourceId"))).SetInternal(err) diff --git a/store/resource.go b/store/resource.go index 502367eb..306a8391 100644 --- a/store/resource.go +++ b/store/resource.go @@ -24,7 +24,7 @@ func (s *ResourceService) CreateResource(create *api.ResourceCreate) (*api.Resou return resource, nil } -func (s *ResourceService) FindResouceList(find *api.ResourceFind) ([]*api.Resource, error) { +func (s *ResourceService) FindResourceList(find *api.ResourceFind) ([]*api.Resource, error) { list, err := findResourceList(s.db, find) if err != nil { return nil, err @@ -33,6 +33,19 @@ func (s *ResourceService) FindResouceList(find *api.ResourceFind) ([]*api.Resour return list, nil } +func (s *ResourceService) FindResource(find *api.ResourceFind) (*api.Resource, error) { + list, err := findResourceList(s.db, find) + if err != nil { + return nil, err + } + + if len(list) == 0 { + return nil, &common.Error{Code: common.NotFound, Err: fmt.Errorf("not found")} + } + + return list[0], nil +} + func (s *ResourceService) DeleteResource(delete *api.ResourceDelete) error { err := deleteResource(s.db, delete) if err != nil {