diff --git a/api/v2/acl_config.go b/api/v2/acl_config.go index ec984e2..8e61fdc 100644 --- a/api/v2/acl_config.go +++ b/api/v2/acl_config.go @@ -9,7 +9,6 @@ var allowedMethodsWhenUnauthorized = map[string]bool{ "/slash.api.v2.AuthService/SignUp": true, "/slash.api.v2.AuthService/SignOut": true, "/memos.api.v2.AuthService/GetAuthStatus": true, - "/slash.api.v2.ShortcutService/GetShortcut": true, "/slash.api.v2.ShortcutService/GetShortcutByName": true, "/slash.api.v2.CollectionService/GetCollectionByName": true, } @@ -26,6 +25,7 @@ var allowedMethodsOnlyForAdmin = map[string]bool{ "/slash.api.v2.UserService/CreateUser": true, "/slash.api.v2.UserService/DeleteUser": true, "/slash.api.v2.WorkspaceService/UpdateWorkspaceSetting": true, + "/slash.api.v2.SubscriptionService/UpdateSubscription": true, } // isOnlyForAdminAllowedMethod returns true if the method is allowed to be called only by admin. diff --git a/api/v2/auth_service.go b/api/v2/auth_service.go index 6060742..f8e8b20 100644 --- a/api/v2/auth_service.go +++ b/api/v2/auth_service.go @@ -3,7 +3,6 @@ package v2 import ( "context" "fmt" - "net/http" "time" "golang.org/x/crypto/bcrypt" @@ -38,25 +37,25 @@ func (s *APIV2Service) SignIn(ctx context.Context, request *apiv2pb.SignInReques Email: &request.Email, }) if err != nil { - return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to find user by email %s", request.Email)) + return nil, status.Errorf(codes.Internal, fmt.Sprintf("failed to find user by email %s", request.Email)) } if user == nil { - return nil, status.Errorf(http.StatusUnauthorized, fmt.Sprintf("user not found with email %s", request.Email)) + return nil, status.Errorf(codes.InvalidArgument, fmt.Sprintf("user not found with email %s", request.Email)) } else if user.RowStatus == store.Archived { - return nil, status.Errorf(http.StatusForbidden, fmt.Sprintf("user has been archived with email %s", request.Email)) + return nil, status.Errorf(codes.PermissionDenied, fmt.Sprintf("user has been archived with email %s", request.Email)) } // Compare the stored hashed password, with the hashed version of the password that was received. if err := bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(request.Password)); err != nil { - return nil, status.Errorf(http.StatusUnauthorized, "unmatched email and password") + return nil, status.Errorf(codes.InvalidArgument, "unmatched email and password") } accessToken, err := auth.GenerateAccessToken(user.Email, user.ID, time.Now().Add(auth.AccessTokenDuration), []byte(s.Secret)) if err != nil { - return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to generate tokens, err: %s", err)) + return nil, status.Errorf(codes.Internal, fmt.Sprintf("failed to generate tokens, err: %s", err)) } if err := s.UpsertAccessTokenToStore(ctx, user, accessToken, "user login"); err != nil { - return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to upsert access token to store, err: %s", err)) + return nil, status.Errorf(codes.Internal, fmt.Sprintf("failed to upsert access token to store, err: %s", err)) } if err := grpc.SetHeader(ctx, metadata.New(map[string]string{ @@ -76,25 +75,25 @@ func (s *APIV2Service) SignUp(ctx context.Context, request *apiv2pb.SignUpReques Key: storepb.WorkspaceSettingKey_WORKSAPCE_SETTING_ENABLE_SIGNUP, }) if err != nil { - return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to get workspace setting, err: %s", err)) + return nil, status.Errorf(codes.Internal, fmt.Sprintf("failed to get workspace setting, err: %s", err)) } if enableSignUpSetting != nil && !enableSignUpSetting.GetEnableSignup() { - return nil, status.Errorf(http.StatusForbidden, "sign up is not allowed") + return nil, status.Errorf(codes.PermissionDenied, "sign up is not allowed") } if !s.LicenseService.IsFeatureEnabled(license.FeatureTypeUnlimitedAccounts) { userList, err := s.Store.ListUsers(ctx, &store.FindUser{}) if err != nil { - return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to list users, err: %s", err)) + return nil, status.Errorf(codes.Internal, fmt.Sprintf("failed to list users, err: %s", err)) } if len(userList) >= 5 { - return nil, status.Errorf(http.StatusBadRequest, "maximum number of users reached") + return nil, status.Errorf(codes.InvalidArgument, "maximum number of users reached") } } passwordHash, err := bcrypt.GenerateFromPassword([]byte(request.Password), bcrypt.DefaultCost) if err != nil { - return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to generate password hash, err: %s", err)) + return nil, status.Errorf(codes.Internal, fmt.Sprintf("failed to generate password hash, err: %s", err)) } create := &store.User{ @@ -104,7 +103,7 @@ func (s *APIV2Service) SignUp(ctx context.Context, request *apiv2pb.SignUpReques } existingUsers, err := s.Store.ListUsers(ctx, &store.FindUser{}) if err != nil { - return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to list users, err: %s", err)) + return nil, status.Errorf(codes.Internal, fmt.Sprintf("failed to list users, err: %s", err)) } // The first user to sign up is an admin by default. if len(existingUsers) == 0 { @@ -115,15 +114,15 @@ func (s *APIV2Service) SignUp(ctx context.Context, request *apiv2pb.SignUpReques user, err := s.Store.CreateUser(ctx, create) if err != nil { - return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to create user, err: %s", err)) + return nil, status.Errorf(codes.Internal, fmt.Sprintf("failed to create user, err: %s", err)) } accessToken, err := auth.GenerateAccessToken(user.Email, user.ID, time.Now().Add(auth.AccessTokenDuration), []byte(s.Secret)) if err != nil { - return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to generate tokens, err: %s", err)) + return nil, status.Errorf(codes.Internal, fmt.Sprintf("failed to generate tokens, err: %s", err)) } if err := s.UpsertAccessTokenToStore(ctx, user, accessToken, "user login"); err != nil { - return nil, status.Errorf(http.StatusInternalServerError, fmt.Sprintf("failed to upsert access token to store, err: %s", err)) + return nil, status.Errorf(codes.Internal, fmt.Sprintf("failed to upsert access token to store, err: %s", err)) } if err := grpc.SetHeader(ctx, metadata.New(map[string]string{ diff --git a/server/embed_frontend.go b/server/embed_frontend.go index 46e0fed..a8c40ab 100644 --- a/server/embed_frontend.go +++ b/server/embed_frontend.go @@ -133,15 +133,25 @@ Sitemap: %s/sitemap.xml`, instanceURL, instanceURL) } func generateShortcutMetadata(shortcut *storepb.Shortcut) string { + title, description := shortcut.Title, shortcut.Description + if shortcut.OgMetadata != nil { + if shortcut.OgMetadata.Title != "" { + title = shortcut.OgMetadata.Title + } + if shortcut.OgMetadata.Description != "" { + description = shortcut.OgMetadata.Description + } + } + metadataList := []string{ - fmt.Sprintf(``, template.HTMLEscapeString(shortcut.OgMetadata.Description)), - fmt.Sprintf(``, template.HTMLEscapeString(shortcut.OgMetadata.Title)), - fmt.Sprintf(``, template.HTMLEscapeString(shortcut.OgMetadata.Description)), + fmt.Sprintf(``, template.HTMLEscapeString(description)), + fmt.Sprintf(``, template.HTMLEscapeString(title)), + fmt.Sprintf(``, template.HTMLEscapeString(description)), fmt.Sprintf(``, template.HTMLEscapeString(shortcut.OgMetadata.Image)), ``, // Twitter related metadata. - fmt.Sprintf(``, template.HTMLEscapeString(shortcut.OgMetadata.Title)), - fmt.Sprintf(``, template.HTMLEscapeString(shortcut.OgMetadata.Description)), + fmt.Sprintf(``, template.HTMLEscapeString(title)), + fmt.Sprintf(``, template.HTMLEscapeString(description)), fmt.Sprintf(``, template.HTMLEscapeString(shortcut.OgMetadata.Image)), ``, fmt.Sprintf(``, template.HTMLEscapeString(shortcut.Link)), diff --git a/server/version/version.go b/server/version/version.go index bbfffd7..7900293 100644 --- a/server/version/version.go +++ b/server/version/version.go @@ -9,7 +9,7 @@ import ( // Version is the service current released version. // Semantic versioning: https://semver.org/ -var Version = "0.5.0" +var Version = "0.5.1" // DevVersion is the service current development version. var DevVersion = "0.5.1"