update claims

This commit is contained in:
2026-10-01 13:19:59 +07:00
parent f462bc6a03
commit 1887b5b9a1
16 changed files with 222 additions and 61 deletions
+4 -2
View File
@@ -3,7 +3,6 @@ package app
import ( import (
"context" "context"
"evening_detective_server/internal/modules/processor_jwt"
"evening_detective_server/internal/modules/roles" "evening_detective_server/internal/modules/roles"
proto "evening_detective_server/proto" proto "evening_detective_server/proto"
@@ -45,7 +44,10 @@ func (s *server) SubmitTeamAnswers(ctx context.Context, req *proto.SubmitTeamAns
} }
func (s *server) SetTeamAnswerScore(ctx context.Context, req *proto.SetTeamAnswerScoreReq) (*proto.SetTeamAnswerScoreRsp, error) { func (s *server) SetTeamAnswerScore(ctx context.Context, req *proto.SetTeamAnswerScoreReq) (*proto.SetTeamAnswerScoreRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
+18
View File
@@ -0,0 +1,18 @@
package app
import (
"context"
"evening_detective_server/internal/modules/processor_jwt"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
func claimsFromContext(ctx context.Context) (*processor_jwt.JWTClaims, error) {
claims, ok := processor_jwt.ClaimsFromContext(ctx)
if !ok {
return nil, status.Error(codes.Unauthenticated, "требуется авторизация")
}
return claims, nil
}
+1 -1
View File
@@ -67,7 +67,7 @@ func newTestFileServer(storage *fakeStorage, maxSize int) *server {
} }
func ctxWithClaims(roles ...string) context.Context { func ctxWithClaims(roles ...string) context.Context {
return context.WithValue(context.Background(), "claims", &processor_jwt.JWTClaims{UserID: 1, Roles: roles}) return processor_jwt.ContextWithClaims(context.Background(), &processor_jwt.JWTClaims{UserID: 1, Roles: roles})
} }
func pdfData(n int) []byte { func pdfData(n int) []byte {
+4 -2
View File
@@ -5,7 +5,6 @@ import (
"errors" "errors"
"evening_detective_server/internal/modules/file_storage" "evening_detective_server/internal/modules/file_storage"
"evening_detective_server/internal/modules/processor_jwt"
"evening_detective_server/internal/modules/roles" "evening_detective_server/internal/modules/roles"
"evening_detective_server/internal/services/file_service" "evening_detective_server/internal/services/file_service"
proto "evening_detective_server/proto" proto "evening_detective_server/proto"
@@ -19,7 +18,10 @@ import (
func (s *server) UploadFile(ctx context.Context, req *proto.UploadFileReq) (*proto.UploadFileRsp, error) { func (s *server) UploadFile(ctx context.Context, req *proto.UploadFileReq) (*proto.UploadFileRsp, error) {
// Файлы (в т.ч. улики) загружают авторы сценариев в редакторе. // Файлы (в т.ч. улики) загружают авторы сценариев в редакторе.
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
+12 -4
View File
@@ -3,7 +3,6 @@ package app
import ( import (
"context" "context"
"evening_detective_server/internal/modules/processor_jwt"
"evening_detective_server/internal/modules/roles" "evening_detective_server/internal/modules/roles"
"evening_detective_server/internal/repos/game_reviews_repo" "evening_detective_server/internal/repos/game_reviews_repo"
"evening_detective_server/proto" "evening_detective_server/proto"
@@ -49,7 +48,10 @@ func (s *server) GetScenarioReviews(ctx context.Context, req *proto.GetScenarioR
} }
func (s *server) GetGameReviewsForModeration(ctx context.Context, req *proto.GetGameReviewsReq) (*proto.GetGameReviewsRsp, error) { func (s *server) GetGameReviewsForModeration(ctx context.Context, req *proto.GetGameReviewsReq) (*proto.GetGameReviewsRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Admin) { if !roles.HasRole(claims, roles.Admin) {
return nil, status.Error(codes.PermissionDenied, "permission denied") return nil, status.Error(codes.PermissionDenied, "permission denied")
} }
@@ -61,7 +63,10 @@ func (s *server) GetGameReviewsForModeration(ctx context.Context, req *proto.Get
} }
func (s *server) GetReviewsForModeration(ctx context.Context, req *proto.GetReviewsForModerationReq) (*proto.GetGameReviewsRsp, error) { func (s *server) GetReviewsForModeration(ctx context.Context, req *proto.GetReviewsForModerationReq) (*proto.GetGameReviewsRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Admin) { if !roles.HasRole(claims, roles.Admin) {
return nil, status.Error(codes.PermissionDenied, "permission denied") return nil, status.Error(codes.PermissionDenied, "permission denied")
} }
@@ -73,7 +78,10 @@ func (s *server) GetReviewsForModeration(ctx context.Context, req *proto.GetRevi
} }
func (s *server) ModerateGameReview(ctx context.Context, req *proto.ModerateGameReviewReq) (*proto.ModerateGameReviewRsp, error) { func (s *server) ModerateGameReview(ctx context.Context, req *proto.ModerateGameReviewReq) (*proto.ModerateGameReviewRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Admin) { if !roles.HasRole(claims, roles.Admin) {
return nil, status.Error(codes.PermissionDenied, "permission denied") return nil, status.Error(codes.PermissionDenied, "permission denied")
} }
+48 -13
View File
@@ -3,7 +3,6 @@ package app
import ( import (
"context" "context"
"evening_detective_server/internal/modules/processor_jwt"
"evening_detective_server/internal/modules/roles" "evening_detective_server/internal/modules/roles"
proto "evening_detective_server/proto" proto "evening_detective_server/proto"
@@ -19,7 +18,10 @@ func nilIfEmpty(value string) *string {
} }
func (s *server) AddGame(ctx context.Context, req *proto.AddGameReq) (*proto.AddGameRsp, error) { func (s *server) AddGame(ctx context.Context, req *proto.AddGameReq) (*proto.AddGameRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -49,7 +51,10 @@ func (s *server) AddGame(ctx context.Context, req *proto.AddGameReq) (*proto.Add
} }
func (s *server) DeleteGame(ctx context.Context, req *proto.DeleteGameReq) (*proto.DeleteGameRsp, error) { func (s *server) DeleteGame(ctx context.Context, req *proto.DeleteGameReq) (*proto.DeleteGameRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -68,7 +73,10 @@ func (s *server) DeleteGame(ctx context.Context, req *proto.DeleteGameReq) (*pro
} }
func (s *server) GetGame(ctx context.Context, req *proto.GetGameReq) (*proto.GetGameRsp, error) { func (s *server) GetGame(ctx context.Context, req *proto.GetGameReq) (*proto.GetGameRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -86,7 +94,10 @@ func (s *server) GetGame(ctx context.Context, req *proto.GetGameReq) (*proto.Get
} }
func (s *server) GetGameAnswers(ctx context.Context, req *proto.GetGameAnswersReq) (*proto.GetGameAnswersRsp, error) { func (s *server) GetGameAnswers(ctx context.Context, req *proto.GetGameAnswersReq) (*proto.GetGameAnswersRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -105,7 +116,10 @@ func (s *server) GetGameAnswers(ctx context.Context, req *proto.GetGameAnswersRe
} }
func (s *server) GetGameResults(ctx context.Context, req *proto.GetGameResultsReq) (*proto.GetGameResultsRsp, error) { func (s *server) GetGameResults(ctx context.Context, req *proto.GetGameResultsReq) (*proto.GetGameResultsRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -124,7 +138,10 @@ func (s *server) GetGameResults(ctx context.Context, req *proto.GetGameResultsRe
} }
func (s *server) GetGames(ctx context.Context, req *proto.GetGamesReq) (*proto.GetGamesRsp, error) { func (s *server) GetGames(ctx context.Context, req *proto.GetGamesReq) (*proto.GetGamesRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -142,7 +159,10 @@ func (s *server) GetGames(ctx context.Context, req *proto.GetGamesReq) (*proto.G
} }
func (s *server) UpdateGame(ctx context.Context, req *proto.UpdateGameReq) (*proto.UpdateGameRsp, error) { func (s *server) UpdateGame(ctx context.Context, req *proto.UpdateGameReq) (*proto.UpdateGameRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -171,7 +191,10 @@ func (s *server) UpdateGame(ctx context.Context, req *proto.UpdateGameReq) (*pro
} }
func (s *server) StartGame(ctx context.Context, req *proto.StartGameReq) (*proto.StartGameRsp, error) { func (s *server) StartGame(ctx context.Context, req *proto.StartGameReq) (*proto.StartGameRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -187,7 +210,10 @@ func (s *server) StartGame(ctx context.Context, req *proto.StartGameReq) (*proto
} }
func (s *server) PauseGame(ctx context.Context, req *proto.PauseGameReq) (*proto.PauseGameRsp, error) { func (s *server) PauseGame(ctx context.Context, req *proto.PauseGameReq) (*proto.PauseGameRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -203,7 +229,10 @@ func (s *server) PauseGame(ctx context.Context, req *proto.PauseGameReq) (*proto
} }
func (s *server) PlayGame(ctx context.Context, req *proto.PlayGameReq) (*proto.PlayGameRsp, error) { func (s *server) PlayGame(ctx context.Context, req *proto.PlayGameReq) (*proto.PlayGameRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -219,7 +248,10 @@ func (s *server) PlayGame(ctx context.Context, req *proto.PlayGameReq) (*proto.P
} }
func (s *server) FinishGame(ctx context.Context, req *proto.FinishGameReq) (*proto.FinishGameRsp, error) { func (s *server) FinishGame(ctx context.Context, req *proto.FinishGameReq) (*proto.FinishGameRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -235,7 +267,10 @@ func (s *server) FinishGame(ctx context.Context, req *proto.FinishGameReq) (*pro
} }
func (s *server) ResetGame(ctx context.Context, req *proto.ResetGameReq) (*proto.ResetGameRsp, error) { func (s *server) ResetGame(ctx context.Context, req *proto.ResetGameReq) (*proto.ResetGameRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
+8 -3
View File
@@ -6,7 +6,6 @@ import (
"fmt" "fmt"
"strings" "strings"
"evening_detective_server/internal/modules/processor_jwt"
"evening_detective_server/internal/modules/roles" "evening_detective_server/internal/modules/roles"
"evening_detective_server/internal/modules/scenario_archive" "evening_detective_server/internal/modules/scenario_archive"
"evening_detective_server/internal/modules/string_tools" "evening_detective_server/internal/modules/string_tools"
@@ -22,7 +21,10 @@ import (
) )
func (s *server) DownloadScenarioArchive(ctx context.Context, req *proto.DownloadScenarioArchiveReq) (*httpbody.HttpBody, error) { func (s *server) DownloadScenarioArchive(ctx context.Context, req *proto.DownloadScenarioArchiveReq) (*httpbody.HttpBody, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -62,7 +64,10 @@ func (s *server) DownloadScenarioArchive(ctx context.Context, req *proto.Downloa
} }
func (s *server) UploadScenarioArchive(ctx context.Context, req *httpbody.HttpBody) (*proto.UploadScenarioArchiveRsp, error) { func (s *server) UploadScenarioArchive(ctx context.Context, req *httpbody.HttpBody) (*proto.UploadScenarioArchiveRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
+36 -10
View File
@@ -3,7 +3,6 @@ package app
import ( import (
"context" "context"
"evening_detective_server/internal/modules/processor_jwt"
"evening_detective_server/internal/modules/roles" "evening_detective_server/internal/modules/roles"
proto "evening_detective_server/proto" proto "evening_detective_server/proto"
@@ -12,7 +11,10 @@ import (
) )
func (s *server) AddScenarioPlace(ctx context.Context, req *proto.AddScenarioPlaceReq) (*proto.AddScenarioPlaceRsp, error) { func (s *server) AddScenarioPlace(ctx context.Context, req *proto.AddScenarioPlaceReq) (*proto.AddScenarioPlaceRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -34,7 +36,10 @@ func (s *server) AddScenarioPlace(ctx context.Context, req *proto.AddScenarioPla
} }
func (s *server) UpdateScenarioPlace(ctx context.Context, req *proto.UpdateScenarioPlaceReq) (*proto.UpdateScenarioPlaceRsp, error) { func (s *server) UpdateScenarioPlace(ctx context.Context, req *proto.UpdateScenarioPlaceReq) (*proto.UpdateScenarioPlaceRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -57,7 +62,10 @@ func (s *server) UpdateScenarioPlace(ctx context.Context, req *proto.UpdateScena
} }
func (s *server) DeleteScenarioPlace(ctx context.Context, req *proto.DeleteScenarioPlaceReq) (*proto.DeleteScenarioPlaceRsp, error) { func (s *server) DeleteScenarioPlace(ctx context.Context, req *proto.DeleteScenarioPlaceReq) (*proto.DeleteScenarioPlaceRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -79,7 +87,10 @@ func (s *server) DeleteScenarioPlace(ctx context.Context, req *proto.DeleteScena
} }
func (s *server) AddScenarioQuestion(ctx context.Context, req *proto.AddScenarioQuestionReq) (*proto.AddScenarioQuestionRsp, error) { func (s *server) AddScenarioQuestion(ctx context.Context, req *proto.AddScenarioQuestionReq) (*proto.AddScenarioQuestionRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -101,7 +112,10 @@ func (s *server) AddScenarioQuestion(ctx context.Context, req *proto.AddScenario
} }
func (s *server) UpdateScenarioQuestion(ctx context.Context, req *proto.UpdateScenarioQuestionReq) (*proto.UpdateScenarioQuestionRsp, error) { func (s *server) UpdateScenarioQuestion(ctx context.Context, req *proto.UpdateScenarioQuestionReq) (*proto.UpdateScenarioQuestionRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -124,7 +138,10 @@ func (s *server) UpdateScenarioQuestion(ctx context.Context, req *proto.UpdateSc
} }
func (s *server) DeleteScenarioQuestion(ctx context.Context, req *proto.DeleteScenarioQuestionReq) (*proto.DeleteScenarioQuestionRsp, error) { func (s *server) DeleteScenarioQuestion(ctx context.Context, req *proto.DeleteScenarioQuestionReq) (*proto.DeleteScenarioQuestionRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -146,7 +163,10 @@ func (s *server) DeleteScenarioQuestion(ctx context.Context, req *proto.DeleteSc
} }
func (s *server) UpdateScenarioBackground(ctx context.Context, req *proto.UpdateScenarioBackgroundReq) (*proto.UpdateScenarioBackgroundRsp, error) { func (s *server) UpdateScenarioBackground(ctx context.Context, req *proto.UpdateScenarioBackgroundReq) (*proto.UpdateScenarioBackgroundRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -168,7 +188,10 @@ func (s *server) UpdateScenarioBackground(ctx context.Context, req *proto.Update
} }
func (s *server) UpdateScenarioIntro(ctx context.Context, req *proto.UpdateScenarioIntroReq) (*proto.UpdateScenarioIntroRsp, error) { func (s *server) UpdateScenarioIntro(ctx context.Context, req *proto.UpdateScenarioIntroReq) (*proto.UpdateScenarioIntroRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -190,7 +213,10 @@ func (s *server) UpdateScenarioIntro(ctx context.Context, req *proto.UpdateScena
} }
func (s *server) UpdateScenarioConclusion(ctx context.Context, req *proto.UpdateScenarioConclusionReq) (*proto.UpdateScenarioConclusionRsp, error) { func (s *server) UpdateScenarioConclusion(ctx context.Context, req *proto.UpdateScenarioConclusionReq) (*proto.UpdateScenarioConclusionRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
+28 -8
View File
@@ -3,7 +3,6 @@ package app
import ( import (
"context" "context"
"evening_detective_server/internal/modules/processor_jwt"
"evening_detective_server/internal/modules/roles" "evening_detective_server/internal/modules/roles"
"evening_detective_server/internal/services/scenarios_service" "evening_detective_server/internal/services/scenarios_service"
proto "evening_detective_server/proto" proto "evening_detective_server/proto"
@@ -13,7 +12,10 @@ import (
) )
func (s *server) AddScenario(ctx context.Context, req *proto.AddScenarioReq) (*proto.AddScenarioRsp, error) { func (s *server) AddScenario(ctx context.Context, req *proto.AddScenarioReq) (*proto.AddScenarioRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -30,7 +32,10 @@ func (s *server) AddScenario(ctx context.Context, req *proto.AddScenarioReq) (*p
} }
func (s *server) GetMyScenarios(ctx context.Context, req *proto.GetMyScenariosReq) (*proto.GetMyScenariosRsp, error) { func (s *server) GetMyScenarios(ctx context.Context, req *proto.GetMyScenariosReq) (*proto.GetMyScenariosRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -64,7 +69,10 @@ func (s *server) GetScenariosCatalog(ctx context.Context, req *proto.GetScenario
} }
func (s *server) GetFullScenario(ctx context.Context, req *proto.GetScenarioReq) (*proto.GetScenarioRsp, error) { func (s *server) GetFullScenario(ctx context.Context, req *proto.GetScenarioReq) (*proto.GetScenarioRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -110,7 +118,10 @@ func (s *server) addScenarioRatings(ctx context.Context, scenarios []*scenarios_
} }
func (s *server) UpdateScenario(ctx context.Context, req *proto.UpdateScenarioReq) (*proto.UpdateScenarioRsp, error) { func (s *server) UpdateScenario(ctx context.Context, req *proto.UpdateScenarioReq) (*proto.UpdateScenarioRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -134,7 +145,10 @@ func (s *server) UpdateScenario(ctx context.Context, req *proto.UpdateScenarioRe
} }
func (s *server) PublicScenario(ctx context.Context, req *proto.PublicScenarioReq) (*proto.PublicScenarioRsp, error) { func (s *server) PublicScenario(ctx context.Context, req *proto.PublicScenarioReq) (*proto.PublicScenarioRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -156,7 +170,10 @@ func (s *server) PublicScenario(ctx context.Context, req *proto.PublicScenarioRe
} }
func (s *server) DraftScenario(ctx context.Context, req *proto.DraftScenarioReq) (*proto.DraftScenarioRsp, error) { func (s *server) DraftScenario(ctx context.Context, req *proto.DraftScenarioReq) (*proto.DraftScenarioRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
// Снять с публикации опубликованный сценарий может только админ: // Снять с публикации опубликованный сценарий может только админ:
// исключительное право отчуждено Оператору в момент публикации // исключительное право отчуждено Оператору в момент публикации
// (п. 7.2 Пользовательского соглашения, ст. 1234, 1269 ГК РФ). // (п. 7.2 Пользовательского соглашения, ст. 1234, 1269 ГК РФ).
@@ -181,7 +198,10 @@ func (s *server) DraftScenario(ctx context.Context, req *proto.DraftScenarioReq)
} }
func (s *server) DeleteScenario(ctx context.Context, req *proto.DeleteScenarioReq) (*proto.DeleteScenarioRsp, error) { func (s *server) DeleteScenario(ctx context.Context, req *proto.DeleteScenarioReq) (*proto.DeleteScenarioRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
+1 -1
View File
@@ -143,7 +143,7 @@ func (s *server) SetScreenSound(ctx context.Context, req *proto.SetScreenSoundRe
} }
func canManageScreens(ctx context.Context) bool { func canManageScreens(ctx context.Context) bool {
claims, ok := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, ok := processor_jwt.ClaimsFromContext(ctx)
if !ok || claims == nil { if !ok || claims == nil {
return false return false
} }
+1 -1
View File
@@ -19,7 +19,7 @@ import (
) )
func (s *server) DownloadTeamQR(ctx context.Context, req *proto.GetGameReq) (*httpbody.HttpBody, error) { func (s *server) DownloadTeamQR(ctx context.Context, req *proto.GetGameReq) (*httpbody.HttpBody, error) {
claims, ok := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, ok := processor_jwt.ClaimsFromContext(ctx)
if !ok || claims == nil { if !ok || claims == nil {
return nil, status.Error(codes.Unauthenticated, "необходима авторизация") return nil, status.Error(codes.Unauthenticated, "необходима авторизация")
} }
+20 -6
View File
@@ -3,7 +3,6 @@ package app
import ( import (
"context" "context"
"evening_detective_server/internal/modules/processor_jwt"
"evening_detective_server/internal/modules/roles" "evening_detective_server/internal/modules/roles"
proto "evening_detective_server/proto" proto "evening_detective_server/proto"
@@ -12,7 +11,10 @@ import (
) )
func (s *server) AddTeam(ctx context.Context, req *proto.AddTeamReq) (*proto.AddTeamRsp, error) { func (s *server) AddTeam(ctx context.Context, req *proto.AddTeamReq) (*proto.AddTeamRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -37,7 +39,10 @@ func (s *server) AddTeam(ctx context.Context, req *proto.AddTeamReq) (*proto.Add
} }
func (s *server) UpdateTeam(ctx context.Context, req *proto.UpdateTeamReq) (*proto.UpdateTeamRsp, error) { func (s *server) UpdateTeam(ctx context.Context, req *proto.UpdateTeamReq) (*proto.UpdateTeamRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -57,7 +62,10 @@ func (s *server) UpdateTeam(ctx context.Context, req *proto.UpdateTeamReq) (*pro
} }
func (s *server) DeleteTeam(ctx context.Context, req *proto.DeleteTeamReq) (*proto.DeleteTeamRsp, error) { func (s *server) DeleteTeam(ctx context.Context, req *proto.DeleteTeamReq) (*proto.DeleteTeamRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -76,7 +84,10 @@ func (s *server) DeleteTeam(ctx context.Context, req *proto.DeleteTeamReq) (*pro
} }
func (s *server) GiveTeamApplications(ctx context.Context, req *proto.GiveTeamApplicationsReq) (*proto.GiveTeamApplicationsRsp, error) { func (s *server) GiveTeamApplications(ctx context.Context, req *proto.GiveTeamApplicationsReq) (*proto.GiveTeamApplicationsRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -136,7 +147,10 @@ func (s *server) AddTeamAction(ctx context.Context, req *proto.AddTeamActionReq)
} }
func (s *server) DeleteLastTeamAction(ctx context.Context, req *proto.DeleteLastTeamActionReq) (*proto.DeleteLastTeamActionRsp, error) { func (s *server) DeleteLastTeamAction(ctx context.Context, req *proto.DeleteLastTeamActionReq) (*proto.DeleteLastTeamActionRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
+2 -2
View File
@@ -44,7 +44,7 @@ func (s *server) GetTicket(ctx context.Context, req *proto.GetTicketReq) (*proto
} }
func (s *server) AcceptTicket(ctx context.Context, req *proto.AcceptTicketReq) (*proto.AcceptTicketRsp, error) { func (s *server) AcceptTicket(ctx context.Context, req *proto.AcceptTicketReq) (*proto.AcceptTicketRsp, error) {
claims, ok := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, ok := processor_jwt.ClaimsFromContext(ctx)
if !ok || claims == nil || (!roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author)) { if !ok || claims == nil || (!roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author)) {
return nil, status.Error(codes.PermissionDenied, "permission denied") return nil, status.Error(codes.PermissionDenied, "permission denied")
} }
@@ -69,7 +69,7 @@ func (s *server) AcceptTicket(ctx context.Context, req *proto.AcceptTicketReq) (
} }
func (s *server) IssueGameTickets(ctx context.Context, req *proto.IssueGameTicketsReq) (*proto.IssueGameTicketsRsp, error) { func (s *server) IssueGameTickets(ctx context.Context, req *proto.IssueGameTicketsReq) (*proto.IssueGameTicketsRsp, error) {
claims, ok := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, ok := processor_jwt.ClaimsFromContext(ctx)
if !ok || claims == nil { if !ok || claims == nil {
return nil, status.Error(codes.Unauthenticated, "необходима авторизация") return nil, status.Error(codes.Unauthenticated, "необходима авторизация")
} }
+22 -7
View File
@@ -37,7 +37,7 @@ func (s *server) Signup(ctx context.Context, req *proto.SignupReq) (*proto.Signu
} }
func (s *server) DeleteAccount(ctx context.Context, req *proto.DeleteAccountReq) (*proto.DeleteAccountRsp, error) { func (s *server) DeleteAccount(ctx context.Context, req *proto.DeleteAccountReq) (*proto.DeleteAccountRsp, error) {
claims, ok := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, ok := processor_jwt.ClaimsFromContext(ctx)
if !ok { if !ok {
return nil, status.Errorf(codes.Unauthenticated, "claims is not provided") return nil, status.Errorf(codes.Unauthenticated, "claims is not provided")
} }
@@ -152,7 +152,10 @@ func (s *server) Refresh(ctx context.Context, req *proto.RefreshReq) (*proto.Ref
} }
func (s *server) GetUsers(ctx context.Context, req *proto.GetUsersReq) (*proto.GetUsersRsp, error) { func (s *server) GetUsers(ctx context.Context, req *proto.GetUsersReq) (*proto.GetUsersRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Admin) { if !roles.HasRole(claims, roles.Admin) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -186,7 +189,10 @@ func (s *server) GetUserById(ctx context.Context, req *proto.GetUserByIdReq) (*p
} }
func (s *server) GetMe(ctx context.Context, req *proto.GetMeReq) (*proto.GetMeRsp, error) { func (s *server) GetMe(ctx context.Context, req *proto.GetMeReq) (*proto.GetMeRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
user, err := s.usersService.GetUserByID(ctx, claims.UserID) user, err := s.usersService.GetUserByID(ctx, claims.UserID)
if err != nil { if err != nil {
return &proto.GetMeRsp{ return &proto.GetMeRsp{
@@ -200,7 +206,10 @@ func (s *server) GetMe(ctx context.Context, req *proto.GetMeReq) (*proto.GetMeRs
} }
func (s *server) AddUserRole(ctx context.Context, req *proto.AddUserRoleReq) (*proto.AddUserRoleRsp, error) { func (s *server) AddUserRole(ctx context.Context, req *proto.AddUserRoleReq) (*proto.AddUserRoleRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Admin) { if !roles.HasRole(claims, roles.Admin) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -213,7 +222,10 @@ func (s *server) AddUserRole(ctx context.Context, req *proto.AddUserRoleReq) (*p
} }
func (s *server) DeleteUserRole(ctx context.Context, req *proto.DeleteUserRoleReq) (*proto.DeleteUserRoleRsp, error) { func (s *server) DeleteUserRole(ctx context.Context, req *proto.DeleteUserRoleReq) (*proto.DeleteUserRoleRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Admin) { if !roles.HasRole(claims, roles.Admin) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
@@ -226,7 +238,10 @@ func (s *server) DeleteUserRole(ctx context.Context, req *proto.DeleteUserRoleRe
} }
func (s *server) GetPermissions(ctx context.Context, req *proto.GetPermissionsReq) (*proto.GetPermissionsRsp, error) { func (s *server) GetPermissions(ctx context.Context, req *proto.GetPermissionsReq) (*proto.GetPermissionsRsp, error) {
claims := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
permissions := s.uiService.GetPermissions(claims.Roles) permissions := s.uiService.GetPermissions(claims.Roles)
return &proto.GetPermissionsRsp{ return &proto.GetPermissionsRsp{
Permissions: permissions, Permissions: permissions,
@@ -234,7 +249,7 @@ func (s *server) GetPermissions(ctx context.Context, req *proto.GetPermissionsRe
} }
func (s *server) ChangeUserPassword(ctx context.Context, req *proto.ChangeUserPasswordReq) (*proto.ChangeUserPasswordRsp, error) { func (s *server) ChangeUserPassword(ctx context.Context, req *proto.ChangeUserPasswordReq) (*proto.ChangeUserPasswordRsp, error) {
claims, ok := ctx.Value("claims").(*processor_jwt.JWTClaims) claims, ok := processor_jwt.ClaimsFromContext(ctx)
if !ok || claims == nil { if !ok || claims == nil {
return nil, status.Error(codes.Unauthenticated, "Требуется авторизация") return nil, status.Error(codes.Unauthenticated, "Требуется авторизация")
} }
+16
View File
@@ -0,0 +1,16 @@
package processor_jwt
import "context"
type claimsContextKey struct{}
// ContextWithClaims stores authenticated claims in ctx.
func ContextWithClaims(ctx context.Context, claims *JWTClaims) context.Context {
return context.WithValue(ctx, claimsContextKey{}, claims)
}
// ClaimsFromContext returns authenticated claims stored in ctx.
func ClaimsFromContext(ctx context.Context) (*JWTClaims, bool) {
claims, ok := ctx.Value(claimsContextKey{}).(*JWTClaims)
return claims, ok && claims != nil
}
@@ -39,7 +39,7 @@ func NewAuthorizationInterceptor(
return nil, status.Errorf(codes.Unauthenticated, "invalid token") return nil, status.Errorf(codes.Unauthenticated, "invalid token")
} }
ctx = context.WithValue(ctx, "claims", claims) ctx = ContextWithClaims(ctx, claims)
return handler(ctx, req) return handler(ctx, req)
} }
} }