2
0

preview_environment.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package authz
  2. import (
  3. "errors"
  4. "net/http"
  5. "github.com/porter-dev/porter/api/server/shared/apierrors"
  6. "github.com/porter-dev/porter/api/server/shared/config"
  7. "github.com/porter-dev/porter/api/types"
  8. "github.com/porter-dev/porter/internal/models"
  9. )
  10. var (
  11. errPreviewProjectDisabled = errors.New("preview environments are not enabled for this project")
  12. errPreviewClusterDisabled = errors.New("preview environments are not enabled for this cluster")
  13. )
  14. type PreviewEnvironmentScopedFactory struct {
  15. config *config.Config
  16. }
  17. func NewPreviewEnvironmentScopedFactory(
  18. config *config.Config,
  19. ) *PreviewEnvironmentScopedFactory {
  20. return &PreviewEnvironmentScopedFactory{config}
  21. }
  22. func (p *PreviewEnvironmentScopedFactory) Middleware(next http.Handler) http.Handler {
  23. return &PreviewEnvironmentScopedMiddleware{next, p.config}
  24. }
  25. type PreviewEnvironmentScopedMiddleware struct {
  26. next http.Handler
  27. config *config.Config
  28. }
  29. func (p *PreviewEnvironmentScopedMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  30. project, _ := r.Context().Value(types.ProjectScope).(*models.Project)
  31. cluster, _ := r.Context().Value(types.ClusterScope).(*models.Cluster)
  32. if !project.PreviewEnvsEnabled {
  33. apierrors.HandleAPIError(p.config.Logger, p.config.Alerter, w, r,
  34. apierrors.NewErrForbidden(errPreviewProjectDisabled), true)
  35. return
  36. } else if !cluster.PreviewEnvsEnabled {
  37. apierrors.HandleAPIError(p.config.Logger, p.config.Alerter, w, r,
  38. apierrors.NewErrForbidden(errPreviewClusterDisabled), true)
  39. return
  40. }
  41. // FIXME: use this middleware to also get values for environment_id and deployment_id
  42. p.next.ServeHTTP(w, r)
  43. }