chore: upgrader to 0.5.1

This commit is contained in:
Steven 2023-12-24 09:17:53 +08:00
parent 70b0645f2e
commit 7c9798b6b1
4 changed files with 32 additions and 23 deletions

View File

@ -9,7 +9,6 @@ var allowedMethodsWhenUnauthorized = map[string]bool{
"/slash.api.v2.AuthService/SignUp": true, "/slash.api.v2.AuthService/SignUp": true,
"/slash.api.v2.AuthService/SignOut": true, "/slash.api.v2.AuthService/SignOut": true,
"/memos.api.v2.AuthService/GetAuthStatus": true, "/memos.api.v2.AuthService/GetAuthStatus": true,
"/slash.api.v2.ShortcutService/GetShortcut": true,
"/slash.api.v2.ShortcutService/GetShortcutByName": true, "/slash.api.v2.ShortcutService/GetShortcutByName": true,
"/slash.api.v2.CollectionService/GetCollectionByName": 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/CreateUser": true,
"/slash.api.v2.UserService/DeleteUser": true, "/slash.api.v2.UserService/DeleteUser": true,
"/slash.api.v2.WorkspaceService/UpdateWorkspaceSetting": 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. // isOnlyForAdminAllowedMethod returns true if the method is allowed to be called only by admin.

View File

@ -3,7 +3,6 @@ package v2
import ( import (
"context" "context"
"fmt" "fmt"
"net/http"
"time" "time"
"golang.org/x/crypto/bcrypt" "golang.org/x/crypto/bcrypt"
@ -38,25 +37,25 @@ func (s *APIV2Service) SignIn(ctx context.Context, request *apiv2pb.SignInReques
Email: &request.Email, Email: &request.Email,
}) })
if err != nil { 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 { 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 { } 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. // 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 { 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)) accessToken, err := auth.GenerateAccessToken(user.Email, user.ID, time.Now().Add(auth.AccessTokenDuration), []byte(s.Secret))
if err != nil { 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 { 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{ 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, Key: storepb.WorkspaceSettingKey_WORKSAPCE_SETTING_ENABLE_SIGNUP,
}) })
if err != nil { 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() { 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) { if !s.LicenseService.IsFeatureEnabled(license.FeatureTypeUnlimitedAccounts) {
userList, err := s.Store.ListUsers(ctx, &store.FindUser{}) userList, err := s.Store.ListUsers(ctx, &store.FindUser{})
if err != nil { 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 { 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) passwordHash, err := bcrypt.GenerateFromPassword([]byte(request.Password), bcrypt.DefaultCost)
if err != nil { 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{ 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{}) existingUsers, err := s.Store.ListUsers(ctx, &store.FindUser{})
if err != nil { 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. // The first user to sign up is an admin by default.
if len(existingUsers) == 0 { 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) user, err := s.Store.CreateUser(ctx, create)
if err != nil { 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)) accessToken, err := auth.GenerateAccessToken(user.Email, user.ID, time.Now().Add(auth.AccessTokenDuration), []byte(s.Secret))
if err != nil { 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 { 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{ if err := grpc.SetHeader(ctx, metadata.New(map[string]string{

View File

@ -133,15 +133,25 @@ Sitemap: %s/sitemap.xml`, instanceURL, instanceURL)
} }
func generateShortcutMetadata(shortcut *storepb.Shortcut) string { 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{ metadataList := []string{
fmt.Sprintf(`<meta name="description" content="%s" />`, template.HTMLEscapeString(shortcut.OgMetadata.Description)), fmt.Sprintf(`<meta name="description" content="%s" />`, template.HTMLEscapeString(description)),
fmt.Sprintf(`<meta property="og:title" content="%s" />`, template.HTMLEscapeString(shortcut.OgMetadata.Title)), fmt.Sprintf(`<meta property="og:title" content="%s" />`, template.HTMLEscapeString(title)),
fmt.Sprintf(`<meta property="og:description" content="%s" />`, template.HTMLEscapeString(shortcut.OgMetadata.Description)), fmt.Sprintf(`<meta property="og:description" content="%s" />`, template.HTMLEscapeString(description)),
fmt.Sprintf(`<meta property="og:image" content="%s" />`, template.HTMLEscapeString(shortcut.OgMetadata.Image)), fmt.Sprintf(`<meta property="og:image" content="%s" />`, template.HTMLEscapeString(shortcut.OgMetadata.Image)),
`<meta property="og:type" content="website" />`, `<meta property="og:type" content="website" />`,
// Twitter related metadata. // Twitter related metadata.
fmt.Sprintf(`<meta name="twitter:title" content="%s" />`, template.HTMLEscapeString(shortcut.OgMetadata.Title)), fmt.Sprintf(`<meta name="twitter:title" content="%s" />`, template.HTMLEscapeString(title)),
fmt.Sprintf(`<meta name="twitter:description" content="%s" />`, template.HTMLEscapeString(shortcut.OgMetadata.Description)), fmt.Sprintf(`<meta name="twitter:description" content="%s" />`, template.HTMLEscapeString(description)),
fmt.Sprintf(`<meta name="twitter:image" content="%s" />`, template.HTMLEscapeString(shortcut.OgMetadata.Image)), fmt.Sprintf(`<meta name="twitter:image" content="%s" />`, template.HTMLEscapeString(shortcut.OgMetadata.Image)),
`<meta name="twitter:card" content="summary_large_image" />`, `<meta name="twitter:card" content="summary_large_image" />`,
fmt.Sprintf(`<meta property="og:url" content="%s" />`, template.HTMLEscapeString(shortcut.Link)), fmt.Sprintf(`<meta property="og:url" content="%s" />`, template.HTMLEscapeString(shortcut.Link)),

View File

@ -9,7 +9,7 @@ import (
// Version is the service current released version. // Version is the service current released version.
// Semantic versioning: https://semver.org/ // Semantic versioning: https://semver.org/
var Version = "0.5.0" var Version = "0.5.1"
// DevVersion is the service current development version. // DevVersion is the service current development version.
var DevVersion = "0.5.1" var DevVersion = "0.5.1"