loader.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package policy
  2. import (
  3. "fmt"
  4. "github.com/porter-dev/porter/api/server/shared/apierrors"
  5. "github.com/porter-dev/porter/api/types"
  6. "github.com/porter-dev/porter/internal/repository"
  7. "gorm.io/gorm"
  8. )
  9. type PolicyDocumentLoader interface {
  10. LoadPolicyDocuments(userID, projectID uint) ([]*types.PolicyDocument, apierrors.RequestError)
  11. }
  12. // BasicPolicyDocumentLoader loads policy documents simply depending on the
  13. type BasicPolicyDocumentLoader struct {
  14. projRepo repository.ProjectRepository
  15. }
  16. func NewBasicPolicyDocumentLoader(projRepo repository.ProjectRepository) *BasicPolicyDocumentLoader {
  17. return &BasicPolicyDocumentLoader{projRepo}
  18. }
  19. func (b *BasicPolicyDocumentLoader) LoadPolicyDocuments(
  20. userID, projectID uint,
  21. ) ([]*types.PolicyDocument, apierrors.RequestError) {
  22. // read role and case on role "kind"
  23. role, err := b.projRepo.ReadProjectRole(projectID, userID)
  24. if err != nil && err == gorm.ErrRecordNotFound {
  25. return nil, apierrors.NewErrForbidden(
  26. fmt.Errorf("user %d does not have a role in project %d", userID, projectID),
  27. )
  28. } else if err != nil {
  29. return nil, apierrors.NewErrInternal(err)
  30. }
  31. // load role based on role kind
  32. switch role.Kind {
  33. case types.RoleAdmin:
  34. return AdminPolicy, nil
  35. case types.RoleDeveloper:
  36. return DeveloperPolicy, nil
  37. case types.RoleViewer:
  38. return ViewerPolicy, nil
  39. default:
  40. return nil, apierrors.NewErrForbidden(
  41. fmt.Errorf("%s role not supported for user %d, project %d", string(role.Kind), userID, projectID),
  42. )
  43. }
  44. }
  45. var AdminPolicy = []*types.PolicyDocument{
  46. {
  47. Scope: types.ProjectScope,
  48. Verbs: types.ReadWriteVerbGroup(),
  49. },
  50. }
  51. var DeveloperPolicy = []*types.PolicyDocument{
  52. {
  53. Scope: types.ProjectScope,
  54. Verbs: types.ReadWriteVerbGroup(),
  55. Children: map[types.PermissionScope]*types.PolicyDocument{
  56. types.SettingsScope: {
  57. Scope: types.SettingsScope,
  58. Verbs: types.ReadVerbGroup(),
  59. },
  60. },
  61. },
  62. }
  63. var ViewerPolicy = []*types.PolicyDocument{
  64. {
  65. Scope: types.ProjectScope,
  66. Verbs: types.ReadVerbGroup(),
  67. Children: map[types.PermissionScope]*types.PolicyDocument{
  68. types.SettingsScope: {
  69. Scope: types.SettingsScope,
  70. Verbs: []types.APIVerb{},
  71. },
  72. },
  73. },
  74. }