2
0

slack.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package oauth_callback
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "net/url"
  7. "github.com/porter-dev/porter/api/server/handlers"
  8. "github.com/porter-dev/porter/api/server/shared"
  9. "github.com/porter-dev/porter/api/server/shared/apierrors"
  10. "github.com/porter-dev/porter/api/server/shared/config"
  11. "github.com/porter-dev/porter/internal/integrations/slack"
  12. )
  13. type OAuthCallbackSlackHandler struct {
  14. handlers.PorterHandlerReadWriter
  15. }
  16. func NewOAuthCallbackSlackHandler(
  17. config *config.Config,
  18. decoderValidator shared.RequestDecoderValidator,
  19. writer shared.ResultWriter,
  20. ) *OAuthCallbackSlackHandler {
  21. return &OAuthCallbackSlackHandler{
  22. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
  23. }
  24. }
  25. func (p *OAuthCallbackSlackHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  26. session, err := p.Config().Store.Get(r, p.Config().ServerConf.CookieName)
  27. if err != nil {
  28. p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  29. return
  30. }
  31. if _, ok := session.Values["state"]; !ok {
  32. p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  33. return
  34. }
  35. if r.URL.Query().Get("state") != session.Values["state"] {
  36. p.HandleAPIError(w, r, apierrors.NewErrForbidden(err))
  37. return
  38. }
  39. token, err := p.Config().SlackConf.Exchange(context.TODO(), r.URL.Query().Get("code"))
  40. if err != nil {
  41. p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  42. return
  43. }
  44. slackInt, err := slack.TokenToSlackIntegration(token)
  45. if err != nil {
  46. p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  47. return
  48. }
  49. userID, _ := session.Values["user_id"].(uint)
  50. projID, _ := session.Values["project_id"].(uint)
  51. slackInt.UserID = userID
  52. slackInt.ProjectID = projID
  53. if _, err = p.Repo().SlackIntegration().CreateSlackIntegration(slackInt); err != nil {
  54. p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  55. return
  56. }
  57. if redirectStr, ok := session.Values["redirect_uri"].(string); ok && redirectStr != "" {
  58. // attempt to parse the redirect uri, if it fails just redirect to dashboard
  59. redirectURI, err := url.Parse(redirectStr)
  60. if err != nil {
  61. http.Redirect(w, r, "/dashboard", 302)
  62. }
  63. http.Redirect(w, r, fmt.Sprintf("%s?%s", redirectURI.Path, redirectURI.RawQuery), 302)
  64. } else {
  65. http.Redirect(w, r, "/dashboard", 302)
  66. }
  67. }