loader.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package loader
  2. import (
  3. "net/http"
  4. "strconv"
  5. "github.com/gorilla/websocket"
  6. "github.com/porter-dev/porter/api/server/shared/apierrors/alerter"
  7. "github.com/porter-dev/porter/api/server/shared/config"
  8. "github.com/porter-dev/porter/internal/adapter"
  9. "github.com/porter-dev/porter/internal/auth/sessionstore"
  10. "github.com/porter-dev/porter/internal/auth/token"
  11. "github.com/porter-dev/porter/internal/notifier"
  12. "github.com/porter-dev/porter/internal/notifier/sendgrid"
  13. "github.com/porter-dev/porter/internal/oauth"
  14. "github.com/porter-dev/porter/internal/repository/gorm"
  15. lr "github.com/porter-dev/porter/internal/logger"
  16. )
  17. type EnvConfigLoader struct{}
  18. func NewEnvLoader() config.ConfigLoader {
  19. return &EnvConfigLoader{}
  20. }
  21. func (e *EnvConfigLoader) LoadConfig() (res *config.Config, err error) {
  22. envConf, err := FromEnv()
  23. if err != nil {
  24. return nil, err
  25. }
  26. sc := envConf.ServerConf
  27. res = &config.Config{
  28. Logger: lr.NewConsole(sc.Debug),
  29. ServerConf: sc,
  30. }
  31. res.Metadata = config.MetadataFromConf(envConf.ServerConf)
  32. db, err := adapter.New(envConf.DBConf)
  33. if err != nil {
  34. return nil, err
  35. }
  36. err = gorm.AutoMigrate(db)
  37. if err != nil {
  38. return nil, err
  39. }
  40. var key [32]byte
  41. for i, b := range []byte(envConf.DBConf.EncryptionKey) {
  42. key[i] = b
  43. }
  44. res.Repo = gorm.NewRepository(db, &key)
  45. // create the session store
  46. res.Store, err = sessionstore.NewStore(
  47. &sessionstore.NewStoreOpts{
  48. SessionRepository: res.Repo.Session(),
  49. CookieSecrets: envConf.ServerConf.CookieSecrets,
  50. },
  51. )
  52. if err != nil {
  53. return nil, err
  54. }
  55. res.TokenConf = &token.TokenGeneratorConf{
  56. TokenSecret: envConf.ServerConf.TokenGeneratorSecret,
  57. }
  58. res.UserNotifier = &notifier.EmptyUserNotifier{}
  59. if res.Metadata.Email {
  60. res.UserNotifier = sendgrid.NewUserNotifier(&sendgrid.Client{
  61. APIKey: envConf.ServerConf.SendgridAPIKey,
  62. PWResetTemplateID: envConf.ServerConf.SendgridPWResetTemplateID,
  63. PWGHTemplateID: envConf.ServerConf.SendgridPWGHTemplateID,
  64. VerifyEmailTemplateID: envConf.ServerConf.SendgridVerifyEmailTemplateID,
  65. ProjectInviteTemplateID: envConf.ServerConf.SendgridProjectInviteTemplateID,
  66. SenderEmail: envConf.ServerConf.SendgridSenderEmail,
  67. })
  68. }
  69. res.Alerter = alerter.NoOpAlerter{}
  70. if envConf.ServerConf.SentryDSN != "" {
  71. res.Alerter, err = alerter.NewSentryAlerter(envConf.ServerConf.SentryDSN)
  72. }
  73. if sc.DOClientID != "" && sc.DOClientSecret != "" {
  74. res.DOConf = oauth.NewDigitalOceanClient(&oauth.Config{
  75. ClientID: sc.DOClientID,
  76. ClientSecret: sc.DOClientSecret,
  77. Scopes: []string{"read", "write"},
  78. BaseURL: sc.ServerURL,
  79. })
  80. }
  81. if sc.GithubClientID != "" && sc.GithubClientSecret != "" {
  82. res.GithubConf = oauth.NewGithubClient(&oauth.Config{
  83. ClientID: sc.GithubClientID,
  84. ClientSecret: sc.GithubClientSecret,
  85. Scopes: []string{"read:user", "user:email"},
  86. BaseURL: sc.ServerURL,
  87. })
  88. }
  89. if sc.GithubAppClientID != "" &&
  90. sc.GithubAppClientSecret != "" &&
  91. sc.GithubAppName != "" &&
  92. sc.GithubAppWebhookSecret != "" &&
  93. sc.GithubAppSecretPath != "" &&
  94. sc.GithubAppID != "" {
  95. if AppID, err := strconv.ParseInt(sc.GithubAppID, 10, 64); err == nil {
  96. res.GithubAppConf = oauth.NewGithubAppClient(&oauth.Config{
  97. ClientID: sc.GithubAppClientID,
  98. ClientSecret: sc.GithubAppClientSecret,
  99. Scopes: []string{"read:user"},
  100. BaseURL: sc.ServerURL,
  101. }, sc.GithubAppName, sc.GithubAppWebhookSecret, sc.GithubAppSecretPath, AppID)
  102. }
  103. }
  104. res.WSUpgrader = &websocket.Upgrader{
  105. ReadBufferSize: 1024,
  106. WriteBufferSize: 1024,
  107. CheckOrigin: func(r *http.Request) bool {
  108. origin := r.Header.Get("Origin")
  109. return origin == sc.ServerURL
  110. },
  111. }
  112. return res, nil
  113. }