2
0

helpers.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package gitinstallation
  2. import (
  3. "context"
  4. "net/http"
  5. ghinstallation "github.com/bradleyfalzon/ghinstallation/v2"
  6. "github.com/google/go-github/v41/github"
  7. "github.com/porter-dev/porter/api/server/shared/config"
  8. "github.com/porter-dev/porter/api/types"
  9. "github.com/porter-dev/porter/internal/models"
  10. "github.com/porter-dev/porter/internal/models/integrations"
  11. "github.com/porter-dev/porter/internal/oauth"
  12. "golang.org/x/oauth2"
  13. )
  14. // GetGithubAppOauthTokenFromRequest gets the GH oauth token from the request based on the currently
  15. // logged in user
  16. func GetGithubAppOauthTokenFromRequest(config *config.Config, r *http.Request) (*oauth2.Token, error) {
  17. // read the user from context
  18. user, _ := r.Context().Value(types.UserScope).(*models.User)
  19. getOAuthInt := config.Repo.GithubAppOAuthIntegration().ReadGithubAppOauthIntegration
  20. oauthInt, err := getOAuthInt(user.GithubAppIntegrationID)
  21. if err != nil {
  22. return nil, err
  23. }
  24. _, _, err = oauth.GetAccessToken(oauthInt.SharedOAuthModel,
  25. &config.GithubAppConf.Config,
  26. oauth.MakeUpdateGithubAppOauthIntegrationFunction(oauthInt, config.Repo),
  27. )
  28. if err != nil {
  29. // try again, in case the token got updated
  30. oauthInt2, err := getOAuthInt(user.GithubAppIntegrationID)
  31. if err != nil || oauthInt2.Expiry == oauthInt.Expiry {
  32. return nil, err
  33. }
  34. oauthInt.AccessToken = oauthInt2.AccessToken
  35. oauthInt.RefreshToken = oauthInt2.RefreshToken
  36. oauthInt.Expiry = oauthInt2.Expiry
  37. }
  38. return &oauth2.Token{
  39. AccessToken: string(oauthInt.AccessToken),
  40. RefreshToken: string(oauthInt.RefreshToken),
  41. Expiry: oauthInt.Expiry,
  42. TokenType: "Bearer",
  43. }, nil
  44. }
  45. // GetGithubAppClientFromRequest gets the github app installation id from the request and authenticates
  46. // using it and a private key file
  47. func GetGithubAppClientFromRequest(config *config.Config, r *http.Request) (*github.Client, error) {
  48. // get installation id from context
  49. ga, _ := r.Context().Value(types.GitInstallationScope).(*integrations.GithubAppInstallation)
  50. itr, err := ghinstallation.NewKeyFromFile(
  51. http.DefaultTransport,
  52. config.GithubAppConf.AppID,
  53. ga.InstallationID,
  54. config.GithubAppConf.SecretPath,
  55. )
  56. if err != nil {
  57. return nil, err
  58. }
  59. return github.NewClient(&http.Client{Transport: itr}), nil
  60. }
  61. type GithubAppPermissions struct {
  62. Actions string
  63. Administration string
  64. Contents string
  65. Deployments string
  66. Environments string
  67. Metadata string
  68. PullRequests string
  69. Secrets string
  70. Workflows string
  71. RepositoryWebhook string
  72. }
  73. // GetGithubAppClientFromRequest gets the github app installation id from the request and authenticates
  74. // using it and a private key file
  75. func GetGithubAppPermissions(config *config.Config, r *http.Request) (*GithubAppPermissions, error) {
  76. // get installation id from context
  77. ga, _ := r.Context().Value(types.GitInstallationScope).(*integrations.GithubAppInstallation)
  78. itr, err := ghinstallation.NewKeyFromFile(
  79. http.DefaultTransport,
  80. config.GithubAppConf.AppID,
  81. ga.InstallationID,
  82. config.GithubAppConf.SecretPath,
  83. )
  84. if err != nil {
  85. return nil, err
  86. }
  87. // need to request the token before permissions can be verified
  88. _, err = itr.Token(context.Background())
  89. if err != nil {
  90. return nil, err
  91. }
  92. permissions, err := itr.Permissions()
  93. return &GithubAppPermissions{
  94. Actions: permissionToString(permissions.Actions),
  95. Administration: permissionToString(permissions.Administration),
  96. Contents: permissionToString(permissions.Contents),
  97. Deployments: permissionToString(permissions.Deployments),
  98. Environments: permissionToString(permissions.Environments),
  99. Metadata: permissionToString(permissions.Metadata),
  100. PullRequests: permissionToString(permissions.PullRequests),
  101. Secrets: permissionToString(permissions.Secrets),
  102. Workflows: permissionToString(permissions.Workflows),
  103. RepositoryWebhook: permissionToString(permissions.RepositoryHooks),
  104. }, err
  105. }
  106. func permissionToString(permission *string) string {
  107. if permission == nil {
  108. return ""
  109. }
  110. return *permission
  111. }