config_issues.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package api
  2. import (
  3. apiv1 "github.com/OliveTin/OliveTin/gen/olivetin/api/v1"
  4. authpublic "github.com/OliveTin/OliveTin/internal/auth/authpublic"
  5. "github.com/OliveTin/OliveTin/internal/config"
  6. "github.com/OliveTin/OliveTin/internal/configissues"
  7. )
  8. func configIssueCountForUser(api *oliveTinAPI, user *authpublic.AuthenticatedUser) int32 {
  9. return int32(len(api.buildConfigIssuesForUser(user)))
  10. }
  11. func (api *oliveTinAPI) buildConfigIssuesForUser(user *authpublic.AuthenticatedUser) []*apiv1.ConfigIssue {
  12. if !userCanSeeDiagnostics(user) {
  13. return []*apiv1.ConfigIssue{}
  14. }
  15. return filterConfigIssuesForUser(api, user, configissues.List())
  16. }
  17. func userCanSeeDiagnostics(user *authpublic.AuthenticatedUser) bool {
  18. return user != nil && user.EffectivePolicy != nil && user.EffectivePolicy.ShowDiagnostics
  19. }
  20. func filterConfigIssuesForUser(api *oliveTinAPI, user *authpublic.AuthenticatedUser, src []configissues.Issue) []*apiv1.ConfigIssue {
  21. out := make([]*apiv1.ConfigIssue, 0, len(src))
  22. for _, issue := range src {
  23. if api.includeConfigIssueForUser(user, issue) {
  24. out = append(out, toProtoConfigIssue(issue))
  25. }
  26. }
  27. return out
  28. }
  29. func (api *oliveTinAPI) includeConfigIssueForUser(user *authpublic.AuthenticatedUser, issue configissues.Issue) bool {
  30. if issue.ActionID == "" {
  31. return true
  32. }
  33. return api.canViewActionID(user, issue.ActionID)
  34. }
  35. func (api *oliveTinAPI) canViewActionID(user *authpublic.AuthenticatedUser, actionID string) bool {
  36. action := findActionInList(api.cfg.Actions, actionID)
  37. if action == nil {
  38. return false
  39. }
  40. return api.userCanViewAction(user, action)
  41. }
  42. func findActionInList(actions []*config.Action, actionID string) *config.Action {
  43. for _, action := range actions {
  44. if actionHasID(action, actionID) {
  45. return action
  46. }
  47. }
  48. return nil
  49. }
  50. func actionHasID(action *config.Action, actionID string) bool {
  51. return action != nil && action.ID == actionID
  52. }
  53. func toProtoConfigIssue(issue configissues.Issue) *apiv1.ConfigIssue {
  54. return &apiv1.ConfigIssue{
  55. Severity: issue.Severity,
  56. Code: issue.Code,
  57. Message: issue.Message,
  58. ActionId: issue.ActionID,
  59. ActionTitle: issue.ActionTitle,
  60. ArgumentName: issue.ArgumentName,
  61. Source: issue.Source,
  62. ConfigFile: issue.ConfigFile,
  63. }
  64. }