From ee5fb9cb3feefed8b5b2168400b48449b8a8fb88 Mon Sep 17 00:00:00 2001 From: John Jones Date: Mon, 10 Jan 2022 17:33:57 -0800 Subject: [PATCH 1/6] Add support for Dependabot secrets --- github/actions_secrets.go | 431 +++++++++++++++++++++----------------- 1 file changed, 239 insertions(+), 192 deletions(-) diff --git a/github/actions_secrets.go b/github/actions_secrets.go index 5bfb22ac080..11aa08be132 100644 --- a/github/actions_secrets.go +++ b/github/actions_secrets.go @@ -47,12 +47,8 @@ func (p *PublicKey) UnmarshalJSON(data []byte) error { return nil } -// GetRepoPublicKey gets a public key that should be used for secret encryption. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-public-key -func (s *ActionsService) GetRepoPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) { - u := fmt.Sprintf("repos/%v/%v/actions/secrets/public-key", owner, repo) - req, err := s.client.NewRequest("GET", u, nil) +func (s *ActionsService) getPublicKey(ctx context.Context, url string) (*PublicKey, *Response, error) { + req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } @@ -66,42 +62,44 @@ func (s *ActionsService) GetRepoPublicKey(ctx context.Context, owner, repo strin return pubKey, resp, nil } +// GetRepoPublicKey gets a public key that should be used for secret encryption. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-public-key +func (s *ActionsService) GetRepoPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) { + url := fmt.Sprintf("repos/%v/%v/actions/secrets/public-key", owner, repo) + return s.getPublicKey(ctx, url) +} + +// GetRepoDependabotPublicKey gets a public key that should be used for secret encryption. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-public-key +func (s *ActionsService) GetRepoDependabotPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) { + url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/public-key", owner, repo) + return s.getPublicKey(ctx, url) +} + // GetOrgPublicKey gets a public key that should be used for secret encryption. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-organization-public-key func (s *ActionsService) GetOrgPublicKey(ctx context.Context, org string) (*PublicKey, *Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets/public-key", org) - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return nil, nil, err - } - - pubKey := new(PublicKey) - resp, err := s.client.Do(ctx, req, pubKey) - if err != nil { - return nil, resp, err - } + url := fmt.Sprintf("orgs/%v/actions/secrets/public-key", org) + return s.getPublicKey(ctx, url) +} - return pubKey, resp, nil +// GetOrgDependabotPublicKey gets a public key that should be used for secret encryption. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-organization-public-key +func (s *ActionsService) GetOrgDependabotPublicKey(ctx context.Context, org string) (*PublicKey, *Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/public-key", org) + return s.getPublicKey(ctx, url) } // GetEnvPublicKey gets a public key that should be used for secret encryption. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#get-an-environment-public-key func (s *ActionsService) GetEnvPublicKey(ctx context.Context, repoID int, env string) (*PublicKey, *Response, error) { - u := fmt.Sprintf("repositories/%v/environments/%v/secrets/public-key", repoID, env) - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return nil, nil, err - } - - pubKey := new(PublicKey) - resp, err := s.client.Do(ctx, req, pubKey) - if err != nil { - return nil, resp, err - } - - return pubKey, resp, nil + url := fmt.Sprintf("repositories/%v/environments/%v/secrets/public-key", repoID, env) + return s.getPublicKey(ctx, url) } // Secret represents a repository action secret. @@ -119,13 +117,8 @@ type Secrets struct { Secrets []*Secret `json:"secrets"` } -// ListRepoSecrets lists all secrets available in a repository -// without revealing their encrypted values. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-repository-secrets -func (s *ActionsService) ListRepoSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { - u := fmt.Sprintf("repos/%v/%v/actions/secrets", owner, repo) - u, err := addOptions(u, opts) +func (s *ActionsService) listSecrets(ctx context.Context, url string, opts *ListOptions) (*Secrets, *Response, error) { + u, err := addOptions(url, opts) if err != nil { return nil, nil, err } @@ -144,12 +137,52 @@ func (s *ActionsService) ListRepoSecrets(ctx context.Context, owner, repo string return secrets, resp, nil } -// GetRepoSecret gets a single repository secret without revealing its encrypted value. +// ListRepoSecrets lists all secrets available in a repository +// without revealing their encrypted values. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-secret -func (s *ActionsService) GetRepoSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) { - u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) - req, err := s.client.NewRequest("GET", u, nil) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-repository-secrets +func (s *ActionsService) ListRepoSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { + url := fmt.Sprintf("repos/%v/%v/actions/secrets", owner, repo) + return s.listSecrets(ctx, url, opts) +} + +// ListRepoDependabotSecrets lists all secrets available in a repository +// without revealing their encrypted values. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-repository-secrets +func (s *ActionsService) ListRepoDependabotSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { + url := fmt.Sprintf("repos/%v/%v/dependabot/secrets", owner, repo) + return s.listSecrets(ctx, url, opts) +} + +// ListOrgSecrets lists all secrets available in an organization +// without revealing their encrypted values. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-organization-secrets +func (s *ActionsService) ListOrgSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) { + url := fmt.Sprintf("orgs/%v/actions/secrets", org) + return s.listSecrets(ctx, url, opts) +} + +// ListOrgDependabtSecrets lists all secrets available in an organization +// without revealing their encrypted values. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-organization-secrets +func (s *ActionsService) ListOrgDependabotSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets", org) + return s.listSecrets(ctx, url, opts) +} + +// ListEnvSecrets lists all secrets available in an environment. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-environment-secrets +func (s *ActionsService) ListEnvSecrets(ctx context.Context, repoID int, env string, opts *ListOptions) (*Secrets, *Response, error) { + url := fmt.Sprintf("repositories/%v/environments/%v/secrets", repoID, env) + return s.listSecrets(ctx, url, opts) +} + +func (s *ActionsService) getSecret(ctx context.Context, url string) (*Secret, *Response, error) { + req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } @@ -163,6 +196,46 @@ func (s *ActionsService) GetRepoSecret(ctx context.Context, owner, repo, name st return secret, resp, nil } +// GetRepoSecret gets a single repository secret without revealing its encrypted value. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-secret +func (s *ActionsService) GetRepoSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) { + url := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) + return s.getSecret(ctx, url) +} + +// GetRepoDependabotSecret gets a single repository secret without revealing its encrypted value. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-secret +func (s *ActionsService) GetRepoDependabotSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) { + url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, name) + return s.getSecret(ctx, url) +} + +// GetOrgSecret gets a single organization secret without revealing its encrypted value. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-organization-secret +func (s *ActionsService) GetOrgSecret(ctx context.Context, org, name string) (*Secret, *Response, error) { + url := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) + return s.getSecret(ctx, url) +} + +// GetOrgDependabotSecret gets a single organization secret without revealing its encrypted value. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-organization-secret +func (s *ActionsService) GetOrgDependabotSecret(ctx context.Context, org, name string) (*Secret, *Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, name) + return s.getSecret(ctx, url) +} + +// GetEnvSecret gets a single environment secret without revealing its encrypted value. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-environment-secrets +func (s *ActionsService) GetEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Secret, *Response, error) { + url := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName) + return s.getSecret(ctx, url) +} + // SelectedRepoIDs are the repository IDs that have access to the secret. type SelectedRepoIDs []int64 @@ -179,13 +252,8 @@ type EncryptedSecret struct { SelectedRepositoryIDs SelectedRepoIDs `json:"selected_repository_ids,omitempty"` } -// CreateOrUpdateRepoSecret creates or updates a repository secret with an encrypted value. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-a-repository-secret -func (s *ActionsService) CreateOrUpdateRepoSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) { - u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, eSecret.Name) - - req, err := s.client.NewRequest("PUT", u, eSecret) +func (s *ActionsService) putSecret(ctx context.Context, url string, eSecret *EncryptedSecret) (*Response, error) { + req, err := s.client.NewRequest("PUT", url, eSecret) if err != nil { return nil, err } @@ -193,76 +261,93 @@ func (s *ActionsService) CreateOrUpdateRepoSecret(ctx context.Context, owner, re return s.client.Do(ctx, req, nil) } -// DeleteRepoSecret deletes a secret in a repository using the secret name. +// CreateOrUpdateRepoSecret creates or updates a repository secret with an encrypted value. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-a-repository-secret -func (s *ActionsService) DeleteRepoSecret(ctx context.Context, owner, repo, name string) (*Response, error) { - u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-a-repository-secret +func (s *ActionsService) CreateOrUpdateRepoSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) { + url := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, eSecret.Name) + return s.putSecret(ctx, url, eSecret) +} - req, err := s.client.NewRequest("DELETE", u, nil) - if err != nil { - return nil, err - } +// CreateOrUpdateRepoDependabotSecret creates or updates a repository secret with an encrypted value. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-a-repository-secret +func (s *ActionsService) CreateOrUpdateRepoDependabotSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) { + url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, eSecret.Name) + return s.putSecret(ctx, url, eSecret) +} - return s.client.Do(ctx, req, nil) +// CreateOrUpdateOrgSecret creates or updates an organization secret with an encrypted value. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-an-organization-secret +func (s *ActionsService) CreateOrUpdateOrgSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { + url := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, eSecret.Name) + return s.putSecret(ctx, url, eSecret) } -// ListOrgSecrets lists all secrets available in an organization -// without revealing their encrypted values. +// CreateOrUpdateOrgDependabotSecret creates or updates an organization secret with an encrypted value. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-organization-secrets -func (s *ActionsService) ListOrgSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets", org) - u, err := addOptions(u, opts) - if err != nil { - return nil, nil, err - } +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-an-organization-secret +func (s *ActionsService) CreateOrUpdateOrgDependabotSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, eSecret.Name) + return s.putSecret(ctx, url, eSecret) +} - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return nil, nil, err - } +// CreateOrUpdateEnvSecret creates or updates a repository secret with an encrypted value. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/actions#create-or-update-an-environment-secret +func (s *ActionsService) CreateOrUpdateEnvSecret(ctx context.Context, repoID int, env string, eSecret *EncryptedSecret) (*Response, error) { + url := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, eSecret.Name) + return s.putSecret(ctx, url, eSecret) +} - secrets := new(Secrets) - resp, err := s.client.Do(ctx, req, &secrets) +func (s *ActionsService) deleteSecret(ctx context.Context, url string) (*Response, error) { + req, err := s.client.NewRequest("DELETE", url, nil) if err != nil { - return nil, resp, err + return nil, err } - return secrets, resp, nil + return s.client.Do(ctx, req, nil) } -// GetOrgSecret gets a single organization secret without revealing its encrypted value. +// DeleteRepoSecret deletes a secret in a repository using the secret name. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-organization-secret -func (s *ActionsService) GetOrgSecret(ctx context.Context, org, name string) (*Secret, *Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return nil, nil, err - } - - secret := new(Secret) - resp, err := s.client.Do(ctx, req, secret) - if err != nil { - return nil, resp, err - } +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-a-repository-secret +func (s *ActionsService) DeleteRepoSecret(ctx context.Context, owner, repo, name string) (*Response, error) { + url := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) + return s.deleteSecret(ctx, url) +} - return secret, resp, nil +// DeleteRepoSecret deletes a secret in a repository using the secret name. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-a-repository-secret +func (s *ActionsService) DeleteRepoDependabotSecret(ctx context.Context, owner, repo, name string) (*Response, error) { + url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, name) + return s.deleteSecret(ctx, url) } -// CreateOrUpdateOrgSecret creates or updates an organization secret with an encrypted value. +// DeleteOrgSecret deletes a secret in an organization using the secret name. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-an-organization-secret -func (s *ActionsService) CreateOrUpdateOrgSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, eSecret.Name) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-an-organization-secret +func (s *ActionsService) DeleteOrgSecret(ctx context.Context, org, name string) (*Response, error) { + url := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) + return s.deleteSecret(ctx, url) +} - req, err := s.client.NewRequest("PUT", u, eSecret) - if err != nil { - return nil, err - } +// DeleteOrgDependabotSecret deletes a secret in an organization using the secret name. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-an-organization-secret +func (s *ActionsService) DeleteOrgDependabotSecret(ctx context.Context, org, name string) (*Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, name) + return s.deleteSecret(ctx, url) +} - return s.client.Do(ctx, req, nil) +// DeleteEnvSecret deletes a secret in an environment using the secret name. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/actions#delete-an-environment-secret +func (s *ActionsService) DeleteEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Response, error) { + url := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName) + return s.deleteSecret(ctx, url) } // SelectedReposList represents the list of repositories selected for an organization secret. @@ -271,12 +356,8 @@ type SelectedReposList struct { Repositories []*Repository `json:"repositories,omitempty"` } -// ListSelectedReposForOrgSecret lists all repositories that have access to a secret. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-selected-repositories-for-an-organization-secret -func (s *ActionsService) ListSelectedReposForOrgSecret(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) - u, err := addOptions(u, opts) +func (s *ActionsService) listSelectedReposForSecret(ctx context.Context, url string, opts *ListOptions) (*SelectedReposList, *Response, error) { + u, err := addOptions(url, opts) if err != nil { return nil, nil, err } @@ -295,17 +376,28 @@ func (s *ActionsService) ListSelectedReposForOrgSecret(ctx context.Context, org, return result, resp, nil } -// SetSelectedReposForOrgSecret sets the repositories that have access to a secret. +// ListSelectedReposForOrgSecret lists all repositories that have access to a secret. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#set-selected-repositories-for-an-organization-secret -func (s *ActionsService) SetSelectedReposForOrgSecret(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-selected-repositories-for-an-organization-secret +func (s *ActionsService) ListSelectedReposForOrgSecret(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) { + url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) + return s.listSelectedReposForSecret(ctx, url, opts) +} +// ListSelectedReposForOrgDependabotSecret lists all repositories that have access to a secret. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-selected-repositories-for-an-organization-secret +func (s *ActionsService) ListSelectedReposForOrgDependabotSecret(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories", org, name) + return s.listSelectedReposForSecret(ctx, url, opts) +} + +func (s *ActionsService) setSelectedReposForSecret(ctx context.Context, url string, ids SelectedRepoIDs) (*Response, error) { type repoIDs struct { SelectedIDs SelectedRepoIDs `json:"selected_repository_ids"` } - req, err := s.client.NewRequest("PUT", u, repoIDs{SelectedIDs: ids}) + req, err := s.client.NewRequest("PUT", url, repoIDs{SelectedIDs: ids}) if err != nil { return nil, err } @@ -313,39 +405,24 @@ func (s *ActionsService) SetSelectedReposForOrgSecret(ctx context.Context, org, return s.client.Do(ctx, req, nil) } -// AddSelectedRepoToOrgSecret adds a repository to an organization secret. +// SetSelectedReposForOrgSecret sets the repositories that have access to a secret. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#add-selected-repository-to-an-organization-secret -func (s *ActionsService) AddSelectedRepoToOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) - req, err := s.client.NewRequest("PUT", u, nil) - if err != nil { - return nil, err - } - - return s.client.Do(ctx, req, nil) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#set-selected-repositories-for-an-organization-secret +func (s *ActionsService) SetSelectedReposForOrgSecret(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) { + url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) + return s.setSelectedReposForSecret(ctx, url, ids) } -// RemoveSelectedRepoFromOrgSecret removes a repository from an organization secret. +// SetSelectedReposForOrgDependabotSecret sets the repositories that have access to a secret. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#remove-selected-repository-from-an-organization-secret -func (s *ActionsService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) - req, err := s.client.NewRequest("DELETE", u, nil) - if err != nil { - return nil, err - } - - return s.client.Do(ctx, req, nil) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#set-selected-repositories-for-an-organization-secret +func (s *ActionsService) SetSelectedReposForOrgDependabotSecret(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories", org, name) + return s.setSelectedReposForSecret(ctx, url, ids) } -// DeleteOrgSecret deletes a secret in an organization using the secret name. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-an-organization-secret -func (s *ActionsService) DeleteOrgSecret(ctx context.Context, org, name string) (*Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) - - req, err := s.client.NewRequest("DELETE", u, nil) +func (s *ActionsService) addSelectedRepoToSecret(ctx context.Context, url string) (*Response, error) { + req, err := s.client.NewRequest("PUT", url, nil) if err != nil { return nil, err } @@ -353,56 +430,24 @@ func (s *ActionsService) DeleteOrgSecret(ctx context.Context, org, name string) return s.client.Do(ctx, req, nil) } -// ListEnvSecrets lists all secrets available in an environment. +// AddSelectedRepoToOrgSecret adds a repository to an organization secret. // -// GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-environment-secrets -func (s *ActionsService) ListEnvSecrets(ctx context.Context, repoID int, env string, opts *ListOptions) (*Secrets, *Response, error) { - u := fmt.Sprintf("repositories/%v/environments/%v/secrets", repoID, env) - u, err := addOptions(u, opts) - if err != nil { - return nil, nil, err - } - - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return nil, nil, err - } - - secrets := new(Secrets) - resp, err := s.client.Do(ctx, req, &secrets) - if err != nil { - return nil, resp, err - } - - return secrets, resp, nil +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#add-selected-repository-to-an-organization-secret +func (s *ActionsService) AddSelectedRepoToOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) + return s.addSelectedRepoToSecret(ctx, url) } -// GetEnvSecret gets a single environment secret without revealing its encrypted value. +// AddSelectedRepoToOrgDependabotSecret adds a repository to an organization secret. // -// GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-environment-secrets -func (s *ActionsService) GetEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Secret, *Response, error) { - u := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName) - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return nil, nil, err - } - - secret := new(Secret) - resp, err := s.client.Do(ctx, req, secret) - if err != nil { - return nil, resp, err - } - - return secret, resp, nil +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#add-selected-repository-to-an-organization-secret +func (s *ActionsService) AddSelectedRepoToOrgDependabotSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories/%v", org, name, *repo.ID) + return s.addSelectedRepoToSecret(ctx, url) } -// CreateOrUpdateEnvSecret creates or updates a repository secret with an encrypted value. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/actions#create-or-update-an-environment-secret -func (s *ActionsService) CreateOrUpdateEnvSecret(ctx context.Context, repoID int, env string, eSecret *EncryptedSecret) (*Response, error) { - u := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, eSecret.Name) - - req, err := s.client.NewRequest("PUT", u, eSecret) +func (s *ActionsService) removeSelectedRepoFromSecret(ctx context.Context, url string) (*Response, error) { + req, err := s.client.NewRequest("DELETE", url, nil) if err != nil { return nil, err } @@ -410,16 +455,18 @@ func (s *ActionsService) CreateOrUpdateEnvSecret(ctx context.Context, repoID int return s.client.Do(ctx, req, nil) } -// DeleteEnvSecret deletes a secret in an environment using the secret name. +// RemoveSelectedRepoFromOrgSecret removes a repository from an organization secret. // -// GitHub API docs: https://docs.github.com/en/rest/reference/actions#delete-an-environment-secret -func (s *ActionsService) DeleteEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Response, error) { - u := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName) - - req, err := s.client.NewRequest("DELETE", u, nil) - if err != nil { - return nil, err - } +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#remove-selected-repository-from-an-organization-secret +func (s *ActionsService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) + return s.removeSelectedRepoFromSecret(ctx, url) +} - return s.client.Do(ctx, req, nil) +// RemoveSelectedRepoFromOrgDependabotSecret removes a repository from an organization secret. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#remove-selected-repository-from-an-organization-secret +func (s *ActionsService) RemoveSelectedRepoFromOrgDependabotSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories/%v", org, name, *repo.ID) + return s.removeSelectedRepoFromSecret(ctx, url) } From 0e65faf22100d6c19638c1c1dc87beb99dd1b422 Mon Sep 17 00:00:00 2001 From: John Jones Date: Tue, 11 Jan 2022 11:15:27 -0800 Subject: [PATCH 2/6] Move Dependabot secrets handling to its own file and add unit tests --- github/actions_secrets.go | 116 +------ github/dependabot_secrets.go | 125 +++++++ github/dependabot_secrets_test.go | 526 ++++++++++++++++++++++++++++++ 3 files changed, 652 insertions(+), 115 deletions(-) create mode 100644 github/dependabot_secrets.go create mode 100644 github/dependabot_secrets_test.go diff --git a/github/actions_secrets.go b/github/actions_secrets.go index 11aa08be132..29f70a1a166 100644 --- a/github/actions_secrets.go +++ b/github/actions_secrets.go @@ -70,14 +70,6 @@ func (s *ActionsService) GetRepoPublicKey(ctx context.Context, owner, repo strin return s.getPublicKey(ctx, url) } -// GetRepoDependabotPublicKey gets a public key that should be used for secret encryption. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-public-key -func (s *ActionsService) GetRepoDependabotPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) { - url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/public-key", owner, repo) - return s.getPublicKey(ctx, url) -} - // GetOrgPublicKey gets a public key that should be used for secret encryption. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-organization-public-key @@ -86,14 +78,6 @@ func (s *ActionsService) GetOrgPublicKey(ctx context.Context, org string) (*Publ return s.getPublicKey(ctx, url) } -// GetOrgDependabotPublicKey gets a public key that should be used for secret encryption. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-organization-public-key -func (s *ActionsService) GetOrgDependabotPublicKey(ctx context.Context, org string) (*PublicKey, *Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets/public-key", org) - return s.getPublicKey(ctx, url) -} - // GetEnvPublicKey gets a public key that should be used for secret encryption. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#get-an-environment-public-key @@ -146,15 +130,6 @@ func (s *ActionsService) ListRepoSecrets(ctx context.Context, owner, repo string return s.listSecrets(ctx, url, opts) } -// ListRepoDependabotSecrets lists all secrets available in a repository -// without revealing their encrypted values. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-repository-secrets -func (s *ActionsService) ListRepoDependabotSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { - url := fmt.Sprintf("repos/%v/%v/dependabot/secrets", owner, repo) - return s.listSecrets(ctx, url, opts) -} - // ListOrgSecrets lists all secrets available in an organization // without revealing their encrypted values. // @@ -164,15 +139,6 @@ func (s *ActionsService) ListOrgSecrets(ctx context.Context, org string, opts *L return s.listSecrets(ctx, url, opts) } -// ListOrgDependabtSecrets lists all secrets available in an organization -// without revealing their encrypted values. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-organization-secrets -func (s *ActionsService) ListOrgDependabotSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets", org) - return s.listSecrets(ctx, url, opts) -} - // ListEnvSecrets lists all secrets available in an environment. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-environment-secrets @@ -204,14 +170,6 @@ func (s *ActionsService) GetRepoSecret(ctx context.Context, owner, repo, name st return s.getSecret(ctx, url) } -// GetRepoDependabotSecret gets a single repository secret without revealing its encrypted value. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-secret -func (s *ActionsService) GetRepoDependabotSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) { - url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, name) - return s.getSecret(ctx, url) -} - // GetOrgSecret gets a single organization secret without revealing its encrypted value. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-organization-secret @@ -220,14 +178,6 @@ func (s *ActionsService) GetOrgSecret(ctx context.Context, org, name string) (*S return s.getSecret(ctx, url) } -// GetOrgDependabotSecret gets a single organization secret without revealing its encrypted value. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-organization-secret -func (s *ActionsService) GetOrgDependabotSecret(ctx context.Context, org, name string) (*Secret, *Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, name) - return s.getSecret(ctx, url) -} - // GetEnvSecret gets a single environment secret without revealing its encrypted value. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-environment-secrets @@ -269,14 +219,6 @@ func (s *ActionsService) CreateOrUpdateRepoSecret(ctx context.Context, owner, re return s.putSecret(ctx, url, eSecret) } -// CreateOrUpdateRepoDependabotSecret creates or updates a repository secret with an encrypted value. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-a-repository-secret -func (s *ActionsService) CreateOrUpdateRepoDependabotSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) { - url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, eSecret.Name) - return s.putSecret(ctx, url, eSecret) -} - // CreateOrUpdateOrgSecret creates or updates an organization secret with an encrypted value. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-an-organization-secret @@ -285,15 +227,7 @@ func (s *ActionsService) CreateOrUpdateOrgSecret(ctx context.Context, org string return s.putSecret(ctx, url, eSecret) } -// CreateOrUpdateOrgDependabotSecret creates or updates an organization secret with an encrypted value. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-an-organization-secret -func (s *ActionsService) CreateOrUpdateOrgDependabotSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, eSecret.Name) - return s.putSecret(ctx, url, eSecret) -} - -// CreateOrUpdateEnvSecret creates or updates a repository secret with an encrypted value. +// CreateOrUpdateEnvSecret creates or updates a single environment secret with an encrypted value. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#create-or-update-an-environment-secret func (s *ActionsService) CreateOrUpdateEnvSecret(ctx context.Context, repoID int, env string, eSecret *EncryptedSecret) (*Response, error) { @@ -318,14 +252,6 @@ func (s *ActionsService) DeleteRepoSecret(ctx context.Context, owner, repo, name return s.deleteSecret(ctx, url) } -// DeleteRepoSecret deletes a secret in a repository using the secret name. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-a-repository-secret -func (s *ActionsService) DeleteRepoDependabotSecret(ctx context.Context, owner, repo, name string) (*Response, error) { - url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, name) - return s.deleteSecret(ctx, url) -} - // DeleteOrgSecret deletes a secret in an organization using the secret name. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-an-organization-secret @@ -334,14 +260,6 @@ func (s *ActionsService) DeleteOrgSecret(ctx context.Context, org, name string) return s.deleteSecret(ctx, url) } -// DeleteOrgDependabotSecret deletes a secret in an organization using the secret name. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-an-organization-secret -func (s *ActionsService) DeleteOrgDependabotSecret(ctx context.Context, org, name string) (*Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, name) - return s.deleteSecret(ctx, url) -} - // DeleteEnvSecret deletes a secret in an environment using the secret name. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#delete-an-environment-secret @@ -384,14 +302,6 @@ func (s *ActionsService) ListSelectedReposForOrgSecret(ctx context.Context, org, return s.listSelectedReposForSecret(ctx, url, opts) } -// ListSelectedReposForOrgDependabotSecret lists all repositories that have access to a secret. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-selected-repositories-for-an-organization-secret -func (s *ActionsService) ListSelectedReposForOrgDependabotSecret(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories", org, name) - return s.listSelectedReposForSecret(ctx, url, opts) -} - func (s *ActionsService) setSelectedReposForSecret(ctx context.Context, url string, ids SelectedRepoIDs) (*Response, error) { type repoIDs struct { SelectedIDs SelectedRepoIDs `json:"selected_repository_ids"` @@ -413,14 +323,6 @@ func (s *ActionsService) SetSelectedReposForOrgSecret(ctx context.Context, org, return s.setSelectedReposForSecret(ctx, url, ids) } -// SetSelectedReposForOrgDependabotSecret sets the repositories that have access to a secret. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#set-selected-repositories-for-an-organization-secret -func (s *ActionsService) SetSelectedReposForOrgDependabotSecret(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories", org, name) - return s.setSelectedReposForSecret(ctx, url, ids) -} - func (s *ActionsService) addSelectedRepoToSecret(ctx context.Context, url string) (*Response, error) { req, err := s.client.NewRequest("PUT", url, nil) if err != nil { @@ -438,14 +340,6 @@ func (s *ActionsService) AddSelectedRepoToOrgSecret(ctx context.Context, org, na return s.addSelectedRepoToSecret(ctx, url) } -// AddSelectedRepoToOrgDependabotSecret adds a repository to an organization secret. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#add-selected-repository-to-an-organization-secret -func (s *ActionsService) AddSelectedRepoToOrgDependabotSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories/%v", org, name, *repo.ID) - return s.addSelectedRepoToSecret(ctx, url) -} - func (s *ActionsService) removeSelectedRepoFromSecret(ctx context.Context, url string) (*Response, error) { req, err := s.client.NewRequest("DELETE", url, nil) if err != nil { @@ -462,11 +356,3 @@ func (s *ActionsService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, or url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) return s.removeSelectedRepoFromSecret(ctx, url) } - -// RemoveSelectedRepoFromOrgDependabotSecret removes a repository from an organization secret. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#remove-selected-repository-from-an-organization-secret -func (s *ActionsService) RemoveSelectedRepoFromOrgDependabotSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories/%v", org, name, *repo.ID) - return s.removeSelectedRepoFromSecret(ctx, url) -} diff --git a/github/dependabot_secrets.go b/github/dependabot_secrets.go new file mode 100644 index 00000000000..3ec50b94058 --- /dev/null +++ b/github/dependabot_secrets.go @@ -0,0 +1,125 @@ +// Copyright 2020 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +import ( + "context" + "fmt" +) + +// GetRepoDependabotPublicKey gets a public key that should be used for Dependabot secret encryption. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#get-a-repository-public-key +func (s *ActionsService) GetRepoDependabotPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) { + url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/public-key", owner, repo) + return s.getPublicKey(ctx, url) +} + +// GetOrgDependabotPublicKey gets a public key that should be used for Dependabot secret encryption. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#get-an-organization-public-key +func (s *ActionsService) GetOrgDependabotPublicKey(ctx context.Context, org string) (*PublicKey, *Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/public-key", org) + return s.getPublicKey(ctx, url) +} + +// ListRepoDependabotSecrets lists all Dependabot secrets available in a repository +// without revealing their encrypted values. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#list-repository-secrets +func (s *ActionsService) ListRepoDependabotSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { + url := fmt.Sprintf("repos/%v/%v/dependabot/secrets", owner, repo) + return s.listSecrets(ctx, url, opts) +} + +// ListOrgDependabotSecrets lists all Dependabot secrets available in an organization +// without revealing their encrypted values. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#list-organization-secrets +func (s *ActionsService) ListOrgDependabotSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets", org) + return s.listSecrets(ctx, url, opts) +} + +// GetRepoDependabotSecret gets a single repository Dependabot secret without revealing its encrypted value. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#get-a-repository-secret +func (s *ActionsService) GetRepoDependabotSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) { + url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, name) + return s.getSecret(ctx, url) +} + +// GetOrgDependabotSecret gets a single organization Dependabot secret without revealing its encrypted value. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#get-an-organization-secret +func (s *ActionsService) GetOrgDependabotSecret(ctx context.Context, org, name string) (*Secret, *Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, name) + return s.getSecret(ctx, url) +} + +// CreateOrUpdateRepoDependabotSecret creates or updates a repository Dependabot secret with an encrypted value. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#create-or-update-a-repository-secret +func (s *ActionsService) CreateOrUpdateRepoDependabotSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) { + url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, eSecret.Name) + return s.putSecret(ctx, url, eSecret) +} + +// CreateOrUpdateOrgDependabotSecret creates or updates an organization Dependabot secret with an encrypted value. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#create-or-update-an-organization-secret +func (s *ActionsService) CreateOrUpdateOrgDependabotSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, eSecret.Name) + return s.putSecret(ctx, url, eSecret) +} + +// DeleteRepoDependabotSecret deletes a Dependabot secret in a repository using the secret name. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#delete-a-repository-secret +func (s *ActionsService) DeleteRepoDependabotSecret(ctx context.Context, owner, repo, name string) (*Response, error) { + url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, name) + return s.deleteSecret(ctx, url) +} + +// DeleteOrgDependabotSecret deletes a Dependabot secret in an organization using the secret name. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#delete-an-organization-secret +func (s *ActionsService) DeleteOrgDependabotSecret(ctx context.Context, org, name string) (*Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, name) + return s.deleteSecret(ctx, url) +} + +// ListSelectedReposForOrgDependabotSecret lists all repositories that have access to a Dependabot secret. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#list-selected-repositories-for-an-organization-secret +func (s *ActionsService) ListSelectedReposForOrgDependabotSecret(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories", org, name) + return s.listSelectedReposForSecret(ctx, url, opts) +} + +// SetSelectedReposForOrgDependabotSecret sets the repositories that have access to a Dependabot secret. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#set-selected-repositories-for-an-organization-secret +func (s *ActionsService) SetSelectedReposForOrgDependabotSecret(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories", org, name) + return s.setSelectedReposForSecret(ctx, url, ids) +} + +// AddSelectedRepoToOrgDependabotSecret adds a repository to an organization Dependabot secret. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#add-selected-repository-to-an-organization-secret +func (s *ActionsService) AddSelectedRepoToOrgDependabotSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories/%v", org, name, *repo.ID) + return s.addSelectedRepoToSecret(ctx, url) +} + +// RemoveSelectedRepoFromOrgDependabotSecret removes a repository from an organization Dependabot secret. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#remove-selected-repository-from-an-organization-secret +func (s *ActionsService) RemoveSelectedRepoFromOrgDependabotSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories/%v", org, name, *repo.ID) + return s.removeSelectedRepoFromSecret(ctx, url) +} diff --git a/github/dependabot_secrets_test.go b/github/dependabot_secrets_test.go new file mode 100644 index 00000000000..d6900058b75 --- /dev/null +++ b/github/dependabot_secrets_test.go @@ -0,0 +1,526 @@ +// Copyright 2020 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +import ( + "context" + "fmt" + "net/http" + "testing" + "time" + + "github.com/google/go-cmp/cmp" +) + +func TestDependabotSecrets_GetRepoDependabotPublicKey(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/repos/o/r/dependabot/secrets/public-key", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `{"key_id":"1234","key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`) + }) + + ctx := context.Background() + key, _, err := client.Actions.GetRepoDependabotPublicKey(ctx, "o", "r") + if err != nil { + t.Errorf("Actions.GetRepoDependabotPublicKey returned error: %v", err) + } + + want := &PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} + if !cmp.Equal(key, want) { + t.Errorf("Actions.GetRepoDependabotPublicKey returned %+v, want %+v", key, want) + } + + const methodName = "GetRepoDependabotPublicKey" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Actions.GetRepoDependabotPublicKey(ctx, "\n", "\n") + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Actions.GetRepoDependabotPublicKey(ctx, "o", "r") + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestDependabotSecrets_GetRepoDependabotPublicKeyNumeric(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/repos/o/r/dependabot/secrets/public-key", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `{"key_id":1234,"key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`) + }) + + ctx := context.Background() + key, _, err := client.Actions.GetRepoDependabotPublicKey(ctx, "o", "r") + if err != nil { + t.Errorf("Actions.GetRepoDependabotPublicKey returned error: %v", err) + } + + want := &PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} + if !cmp.Equal(key, want) { + t.Errorf("Actions.GetRepoDependabotPublicKey returned %+v, want %+v", key, want) + } + + const methodName = "GetRepoDependabotPublicKey" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Actions.GetRepoDependabotPublicKey(ctx, "\n", "\n") + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Actions.GetRepoDependabotPublicKey(ctx, "o", "r") + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestDependabotSecrets_ListRepoDependabotSecrets(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/repos/o/r/dependabot/secrets", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + testFormValues(t, r, values{"per_page": "2", "page": "2"}) + fmt.Fprint(w, `{"total_count":4,"secrets":[{"name":"A","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"},{"name":"B","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}]}`) + }) + + opts := &ListOptions{Page: 2, PerPage: 2} + ctx := context.Background() + secrets, _, err := client.Actions.ListRepoDependabotSecrets(ctx, "o", "r", opts) + if err != nil { + t.Errorf("Actions.ListRepoDependabotSecrets returned error: %v", err) + } + + want := &Secrets{ + TotalCount: 4, + Secrets: []*Secret{ + {Name: "A", CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, + {Name: "B", CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, + }, + } + if !cmp.Equal(secrets, want) { + t.Errorf("Actions.ListRepoDependabotSecrets returned %+v, want %+v", secrets, want) + } + + const methodName = "ListRepoDependabotSecrets" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Actions.ListRepoDependabotSecrets(ctx, "\n", "\n", opts) + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Actions.ListRepoDependabotSecrets(ctx, "o", "r", opts) + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestDependabotSecrets_GetRepoDependabotSecret(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/repos/o/r/dependabot/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `{"name":"NAME","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}`) + }) + + ctx := context.Background() + secret, _, err := client.Actions.GetRepoDependabotSecret(ctx, "o", "r", "NAME") + if err != nil { + t.Errorf("Actions.GetRepoDependabotSecret returned error: %v", err) + } + + want := &Secret{ + Name: "NAME", + CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, + UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}, + } + if !cmp.Equal(secret, want) { + t.Errorf("Actions.GetRepoDependabotSecret returned %+v, want %+v", secret, want) + } + + const methodName = "GetRepoDependabotSecret" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Actions.GetRepoDependabotSecret(ctx, "\n", "\n", "\n") + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Actions.GetRepoDependabotSecret(ctx, "o", "r", "NAME") + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestDependabotSecrets_CreateOrUpdateRepoDependabotSecret(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/repos/o/r/dependabot/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "PUT") + testHeader(t, r, "Content-Type", "application/json") + testBody(t, r, `{"key_id":"1234","encrypted_value":"QIv="}`+"\n") + w.WriteHeader(http.StatusCreated) + }) + + input := &EncryptedSecret{ + Name: "NAME", + EncryptedValue: "QIv=", + KeyID: "1234", + } + ctx := context.Background() + _, err := client.Actions.CreateOrUpdateRepoDependabotSecret(ctx, "o", "r", input) + if err != nil { + t.Errorf("Actions.CreateOrUpdateRepoDependabotSecret returned error: %v", err) + } + + const methodName = "CreateOrUpdateRepoDependabotSecret" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.CreateOrUpdateRepoDependabotSecret(ctx, "\n", "\n", input) + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + return client.Actions.CreateOrUpdateRepoDependabotSecret(ctx, "o", "r", input) + }) +} + +func TestDependabotSecrets_DeleteRepoDependabotSecret(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/repos/o/r/dependabot/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "DELETE") + }) + + ctx := context.Background() + _, err := client.Actions.DeleteRepoDependabotSecret(ctx, "o", "r", "NAME") + if err != nil { + t.Errorf("Actions.DeleteRepoDependabotSecret returned error: %v", err) + } + + const methodName = "DeleteRepoDependabotSecret" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.DeleteRepoDependabotSecret(ctx, "\n", "\n", "\n") + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + return client.Actions.DeleteRepoDependabotSecret(ctx, "o", "r", "NAME") + }) +} + +func TestDependabotSecrets_GetOrgDependabotPublicKey(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/orgs/o/dependabot/secrets/public-key", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `{"key_id":"012345678","key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`) + }) + + ctx := context.Background() + key, _, err := client.Actions.GetOrgDependabotPublicKey(ctx, "o") + if err != nil { + t.Errorf("Actions.GetOrgDependabotPublicKey returned error: %v", err) + } + + want := &PublicKey{KeyID: String("012345678"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} + if !cmp.Equal(key, want) { + t.Errorf("Actions.GetOrgDependabotPublicKey returned %+v, want %+v", key, want) + } + + const methodName = "GetOrgDependabotPublicKey" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Actions.GetOrgDependabotPublicKey(ctx, "\n") + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Actions.GetOrgDependabotPublicKey(ctx, "o") + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestDependabotSecrets_ListOrgDependabotSecrets(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/orgs/o/dependabot/secrets", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + testFormValues(t, r, values{"per_page": "2", "page": "2"}) + fmt.Fprint(w, `{"total_count":3,"secrets":[{"name":"GIST_ID","created_at":"2019-08-10T14:59:22Z","updated_at":"2020-01-10T14:59:22Z","visibility":"private"},{"name":"DEPLOY_TOKEN","created_at":"2019-08-10T14:59:22Z","updated_at":"2020-01-10T14:59:22Z","visibility":"all"},{"name":"GH_TOKEN","created_at":"2019-08-10T14:59:22Z","updated_at":"2020-01-10T14:59:22Z","visibility":"selected","selected_repositories_url":"https://api.github.com/orgs/octo-org/dependabot/secrets/SUPER_SECRET/repositories"}]}`) + }) + + opts := &ListOptions{Page: 2, PerPage: 2} + ctx := context.Background() + secrets, _, err := client.Actions.ListOrgDependabotSecrets(ctx, "o", opts) + if err != nil { + t.Errorf("Actions.ListOrgDependabotSecrets returned error: %v", err) + } + + want := &Secrets{ + TotalCount: 3, + Secrets: []*Secret{ + {Name: "GIST_ID", CreatedAt: Timestamp{time.Date(2019, time.August, 10, 14, 59, 22, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 10, 14, 59, 22, 0, time.UTC)}, Visibility: "private"}, + {Name: "DEPLOY_TOKEN", CreatedAt: Timestamp{time.Date(2019, time.August, 10, 14, 59, 22, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 10, 14, 59, 22, 0, time.UTC)}, Visibility: "all"}, + {Name: "GH_TOKEN", CreatedAt: Timestamp{time.Date(2019, time.August, 10, 14, 59, 22, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 10, 14, 59, 22, 0, time.UTC)}, Visibility: "selected", SelectedRepositoriesURL: "https://api.github.com/orgs/octo-org/dependabot/secrets/SUPER_SECRET/repositories"}, + }, + } + if !cmp.Equal(secrets, want) { + t.Errorf("Actions.ListOrgDependabotSecrets returned %+v, want %+v", secrets, want) + } + + const methodName = "ListOrgDependabotSecrets" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Actions.ListOrgDependabotSecrets(ctx, "\n", opts) + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Actions.ListOrgDependabotSecrets(ctx, "o", opts) + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestDependabotSecrets_GetOrgDependabotSecret(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/orgs/o/dependabot/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `{"name":"NAME","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z","visibility":"selected","selected_repositories_url":"https://api.github.com/orgs/octo-org/dependabot/secrets/SUPER_SECRET/repositories"}`) + }) + + ctx := context.Background() + secret, _, err := client.Actions.GetOrgDependabotSecret(ctx, "o", "NAME") + if err != nil { + t.Errorf("Actions.GetOrgDependabotSecret returned error: %v", err) + } + + want := &Secret{ + Name: "NAME", + CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, + UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}, + Visibility: "selected", + SelectedRepositoriesURL: "https://api.github.com/orgs/octo-org/dependabot/secrets/SUPER_SECRET/repositories", + } + if !cmp.Equal(secret, want) { + t.Errorf("Actions.GetOrgDependabotSecret returned %+v, want %+v", secret, want) + } + + const methodName = "GetOrgDependabotSecret" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Actions.GetOrgDependabotSecret(ctx, "\n", "\n") + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Actions.GetOrgDependabotSecret(ctx, "o", "NAME") + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestDependabotSecrets_CreateOrUpdateOrgDependabotSecret(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/orgs/o/dependabot/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "PUT") + testHeader(t, r, "Content-Type", "application/json") + testBody(t, r, `{"key_id":"1234","encrypted_value":"QIv=","visibility":"selected","selected_repository_ids":[1296269,1269280]}`+"\n") + w.WriteHeader(http.StatusCreated) + }) + + input := &EncryptedSecret{ + Name: "NAME", + EncryptedValue: "QIv=", + KeyID: "1234", + Visibility: "selected", + SelectedRepositoryIDs: SelectedRepoIDs{1296269, 1269280}, + } + ctx := context.Background() + _, err := client.Actions.CreateOrUpdateOrgDependabotSecret(ctx, "o", input) + if err != nil { + t.Errorf("Actions.CreateOrUpdateOrgDependabotSecret returned error: %v", err) + } + + const methodName = "CreateOrUpdateOrgDependabotSecret" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.CreateOrUpdateOrgDependabotSecret(ctx, "\n", input) + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + return client.Actions.CreateOrUpdateOrgDependabotSecret(ctx, "o", input) + }) +} + +func TestDependabotSecrets_ListSelectedReposForOrgDependabotSecret(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/orgs/o/dependabot/secrets/NAME/repositories", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprintf(w, `{"total_count":1,"repositories":[{"id":1}]}`) + }) + + opts := &ListOptions{Page: 2, PerPage: 2} + ctx := context.Background() + repos, _, err := client.Actions.ListSelectedReposForOrgDependabotSecret(ctx, "o", "NAME", opts) + if err != nil { + t.Errorf("Actions.ListSelectedReposForOrgDependabotSecret returned error: %v", err) + } + + want := &SelectedReposList{ + TotalCount: Int(1), + Repositories: []*Repository{ + {ID: Int64(1)}, + }, + } + if !cmp.Equal(repos, want) { + t.Errorf("Actions.ListSelectedReposForOrgDependabotSecret returned %+v, want %+v", repos, want) + } + + const methodName = "ListSelectedReposForOrgDependabotSecret" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Actions.ListSelectedReposForOrgDependabotSecret(ctx, "\n", "\n", opts) + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Actions.ListSelectedReposForOrgDependabotSecret(ctx, "o", "NAME", opts) + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestDependabotSecrets_SetSelectedReposForOrgDependabotSecret(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/orgs/o/dependabot/secrets/NAME/repositories", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "PUT") + testHeader(t, r, "Content-Type", "application/json") + testBody(t, r, `{"selected_repository_ids":[64780797]}`+"\n") + }) + + ctx := context.Background() + _, err := client.Actions.SetSelectedReposForOrgDependabotSecret(ctx, "o", "NAME", SelectedRepoIDs{64780797}) + if err != nil { + t.Errorf("Actions.SetSelectedReposForOrgDependabotSecret returned error: %v", err) + } + + const methodName = "SetSelectedReposForOrgDependabotSecret" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.SetSelectedReposForOrgDependabotSecret(ctx, "\n", "\n", SelectedRepoIDs{64780797}) + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + return client.Actions.SetSelectedReposForOrgDependabotSecret(ctx, "o", "NAME", SelectedRepoIDs{64780797}) + }) +} + +func TestDependabotSecrets_AddSelectedRepoToOrgDependabotSecret(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/orgs/o/dependabot/secrets/NAME/repositories/1234", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "PUT") + }) + + repo := &Repository{ID: Int64(1234)} + ctx := context.Background() + _, err := client.Actions.AddSelectedRepoToOrgDependabotSecret(ctx, "o", "NAME", repo) + if err != nil { + t.Errorf("Actions.AddSelectedRepoToOrgDependabotSecret returned error: %v", err) + } + + const methodName = "AddSelectedRepoToOrgDependabotSecret" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.AddSelectedRepoToOrgDependabotSecret(ctx, "\n", "\n", repo) + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + return client.Actions.AddSelectedRepoToOrgDependabotSecret(ctx, "o", "NAME", repo) + }) +} + +func TestDependabotSecrets_RemoveSelectedRepoFromOrgDependabotSecret(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/orgs/o/dependabot/secrets/NAME/repositories/1234", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "DELETE") + }) + + repo := &Repository{ID: Int64(1234)} + ctx := context.Background() + _, err := client.Actions.RemoveSelectedRepoFromOrgDependabotSecret(ctx, "o", "NAME", repo) + if err != nil { + t.Errorf("Actions.RemoveSelectedRepoFromOrgDependabotSecret returned error: %v", err) + } + + const methodName = "RemoveSelectedRepoFromOrgDependabotSecret" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.RemoveSelectedRepoFromOrgDependabotSecret(ctx, "\n", "\n", repo) + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + return client.Actions.RemoveSelectedRepoFromOrgDependabotSecret(ctx, "o", "NAME", repo) + }) +} + +func TestDependabotSecrets_DeleteOrgDependabotSecret(t *testing.T) { + client, mux, _, teardown := setup() + defer teardown() + + mux.HandleFunc("/orgs/o/dependabot/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "DELETE") + }) + + ctx := context.Background() + _, err := client.Actions.DeleteOrgDependabotSecret(ctx, "o", "NAME") + if err != nil { + t.Errorf("Actions.DeleteOrgDependabotSecret returned error: %v", err) + } + + const methodName = "DeleteOrgDependabotSecret" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.DeleteOrgDependabotSecret(ctx, "\n", "\n") + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + return client.Actions.DeleteOrgDependabotSecret(ctx, "o", "NAME") + }) +} From ebac560a44a8ca1da8b5f9cd18b5b0c62431eddf Mon Sep 17 00:00:00 2001 From: John Jones Date: Tue, 11 Jan 2022 20:07:38 -0800 Subject: [PATCH 3/6] Rename dependabot secrets to indicate they're part of the Actions service and update CC dates --- github/{dependabot_secrets.go => actions_dependabot_secrets.go} | 2 +- ...dabot_secrets_test.go => actions_dependabot_secrets_test.go} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename github/{dependabot_secrets.go => actions_dependabot_secrets.go} (99%) rename github/{dependabot_secrets_test.go => actions_dependabot_secrets_test.go} (99%) diff --git a/github/dependabot_secrets.go b/github/actions_dependabot_secrets.go similarity index 99% rename from github/dependabot_secrets.go rename to github/actions_dependabot_secrets.go index 3ec50b94058..01d409ec622 100644 --- a/github/dependabot_secrets.go +++ b/github/actions_dependabot_secrets.go @@ -1,4 +1,4 @@ -// Copyright 2020 The go-github AUTHORS. All rights reserved. +// Copyright 2022 The go-github AUTHORS. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/github/dependabot_secrets_test.go b/github/actions_dependabot_secrets_test.go similarity index 99% rename from github/dependabot_secrets_test.go rename to github/actions_dependabot_secrets_test.go index d6900058b75..1fdef4272d0 100644 --- a/github/dependabot_secrets_test.go +++ b/github/actions_dependabot_secrets_test.go @@ -1,4 +1,4 @@ -// Copyright 2020 The go-github AUTHORS. All rights reserved. +// Copyright 2022 The go-github AUTHORS. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. From 80c52f3b0ff978b6cb7c6ec6464df934a112b7c6 Mon Sep 17 00:00:00 2001 From: John Jones Date: Wed, 12 Jan 2022 10:57:33 -0800 Subject: [PATCH 4/6] Make a DependabotService and move secrets management into it --- github/actions_dependabot_secrets.go | 125 ---------- github/dependabot.go | 12 + github/dependabot_secrets.go | 228 ++++++++++++++++++ ...ets_test.go => dependabot_secrets_test.go} | 196 +++++++-------- github/github.go | 2 + 5 files changed, 340 insertions(+), 223 deletions(-) delete mode 100644 github/actions_dependabot_secrets.go create mode 100644 github/dependabot.go create mode 100644 github/dependabot_secrets.go rename github/{actions_dependabot_secrets_test.go => dependabot_secrets_test.go} (63%) diff --git a/github/actions_dependabot_secrets.go b/github/actions_dependabot_secrets.go deleted file mode 100644 index 01d409ec622..00000000000 --- a/github/actions_dependabot_secrets.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2022 The go-github AUTHORS. All rights reserved. -// -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package github - -import ( - "context" - "fmt" -) - -// GetRepoDependabotPublicKey gets a public key that should be used for Dependabot secret encryption. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#get-a-repository-public-key -func (s *ActionsService) GetRepoDependabotPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) { - url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/public-key", owner, repo) - return s.getPublicKey(ctx, url) -} - -// GetOrgDependabotPublicKey gets a public key that should be used for Dependabot secret encryption. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#get-an-organization-public-key -func (s *ActionsService) GetOrgDependabotPublicKey(ctx context.Context, org string) (*PublicKey, *Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets/public-key", org) - return s.getPublicKey(ctx, url) -} - -// ListRepoDependabotSecrets lists all Dependabot secrets available in a repository -// without revealing their encrypted values. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#list-repository-secrets -func (s *ActionsService) ListRepoDependabotSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { - url := fmt.Sprintf("repos/%v/%v/dependabot/secrets", owner, repo) - return s.listSecrets(ctx, url, opts) -} - -// ListOrgDependabotSecrets lists all Dependabot secrets available in an organization -// without revealing their encrypted values. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#list-organization-secrets -func (s *ActionsService) ListOrgDependabotSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets", org) - return s.listSecrets(ctx, url, opts) -} - -// GetRepoDependabotSecret gets a single repository Dependabot secret without revealing its encrypted value. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#get-a-repository-secret -func (s *ActionsService) GetRepoDependabotSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) { - url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, name) - return s.getSecret(ctx, url) -} - -// GetOrgDependabotSecret gets a single organization Dependabot secret without revealing its encrypted value. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#get-an-organization-secret -func (s *ActionsService) GetOrgDependabotSecret(ctx context.Context, org, name string) (*Secret, *Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, name) - return s.getSecret(ctx, url) -} - -// CreateOrUpdateRepoDependabotSecret creates or updates a repository Dependabot secret with an encrypted value. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#create-or-update-a-repository-secret -func (s *ActionsService) CreateOrUpdateRepoDependabotSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) { - url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, eSecret.Name) - return s.putSecret(ctx, url, eSecret) -} - -// CreateOrUpdateOrgDependabotSecret creates or updates an organization Dependabot secret with an encrypted value. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#create-or-update-an-organization-secret -func (s *ActionsService) CreateOrUpdateOrgDependabotSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, eSecret.Name) - return s.putSecret(ctx, url, eSecret) -} - -// DeleteRepoDependabotSecret deletes a Dependabot secret in a repository using the secret name. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#delete-a-repository-secret -func (s *ActionsService) DeleteRepoDependabotSecret(ctx context.Context, owner, repo, name string) (*Response, error) { - url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, name) - return s.deleteSecret(ctx, url) -} - -// DeleteOrgDependabotSecret deletes a Dependabot secret in an organization using the secret name. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#delete-an-organization-secret -func (s *ActionsService) DeleteOrgDependabotSecret(ctx context.Context, org, name string) (*Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, name) - return s.deleteSecret(ctx, url) -} - -// ListSelectedReposForOrgDependabotSecret lists all repositories that have access to a Dependabot secret. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#list-selected-repositories-for-an-organization-secret -func (s *ActionsService) ListSelectedReposForOrgDependabotSecret(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories", org, name) - return s.listSelectedReposForSecret(ctx, url, opts) -} - -// SetSelectedReposForOrgDependabotSecret sets the repositories that have access to a Dependabot secret. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#set-selected-repositories-for-an-organization-secret -func (s *ActionsService) SetSelectedReposForOrgDependabotSecret(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories", org, name) - return s.setSelectedReposForSecret(ctx, url, ids) -} - -// AddSelectedRepoToOrgDependabotSecret adds a repository to an organization Dependabot secret. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#add-selected-repository-to-an-organization-secret -func (s *ActionsService) AddSelectedRepoToOrgDependabotSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories/%v", org, name, *repo.ID) - return s.addSelectedRepoToSecret(ctx, url) -} - -// RemoveSelectedRepoFromOrgDependabotSecret removes a repository from an organization Dependabot secret. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#remove-selected-repository-from-an-organization-secret -func (s *ActionsService) RemoveSelectedRepoFromOrgDependabotSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { - url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories/%v", org, name, *repo.ID) - return s.removeSelectedRepoFromSecret(ctx, url) -} diff --git a/github/dependabot.go b/github/dependabot.go new file mode 100644 index 00000000000..8ee0c0c7d8d --- /dev/null +++ b/github/dependabot.go @@ -0,0 +1,12 @@ +// Copyright 2022 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +// DependabotService handles communication with the Dependabot related +// methods of the GitHub API. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/dependabot/ +type DependabotService service diff --git a/github/dependabot_secrets.go b/github/dependabot_secrets.go new file mode 100644 index 00000000000..a6645339cc2 --- /dev/null +++ b/github/dependabot_secrets.go @@ -0,0 +1,228 @@ +// Copyright 2022 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +import ( + "context" + "fmt" +) + +func (s *DependabotService) getPublicKey(ctx context.Context, url string) (*PublicKey, *Response, error) { + req, err := s.client.NewRequest("GET", url, nil) + if err != nil { + return nil, nil, err + } + + pubKey := new(PublicKey) + resp, err := s.client.Do(ctx, req, pubKey) + if err != nil { + return nil, resp, err + } + + return pubKey, resp, nil +} + +// GetRepoPublicKey gets a public key that should be used for Dependabot secret encryption. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#get-a-repository-public-key +func (s *DependabotService) GetRepoPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) { + url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/public-key", owner, repo) + return s.getPublicKey(ctx, url) +} + +// GetOrgPublicKey gets a public key that should be used for Dependabot secret encryption. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#get-an-organization-public-key +func (s *DependabotService) GetOrgPublicKey(ctx context.Context, org string) (*PublicKey, *Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/public-key", org) + return s.getPublicKey(ctx, url) +} + +func (s *DependabotService) listSecrets(ctx context.Context, url string, opts *ListOptions) (*Secrets, *Response, error) { + u, err := addOptions(url, opts) + if err != nil { + return nil, nil, err + } + + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + secrets := new(Secrets) + resp, err := s.client.Do(ctx, req, &secrets) + if err != nil { + return nil, resp, err + } + + return secrets, resp, nil +} + +// ListRepoSecrets lists all Dependabot secrets available in a repository +// without revealing their encrypted values. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#list-repository-secrets +func (s *DependabotService) ListRepoSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { + url := fmt.Sprintf("repos/%v/%v/dependabot/secrets", owner, repo) + return s.listSecrets(ctx, url, opts) +} + +// ListOrgSecrets lists all Dependabot secrets available in an organization +// without revealing their encrypted values. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#list-organization-secrets +func (s *DependabotService) ListOrgSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets", org) + return s.listSecrets(ctx, url, opts) +} + +func (s *DependabotService) getSecret(ctx context.Context, url string) (*Secret, *Response, error) { + req, err := s.client.NewRequest("GET", url, nil) + if err != nil { + return nil, nil, err + } + + secret := new(Secret) + resp, err := s.client.Do(ctx, req, secret) + if err != nil { + return nil, resp, err + } + + return secret, resp, nil +} + +// GetRepoSecret gets a single repository Dependabot secret without revealing its encrypted value. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#get-a-repository-secret +func (s *DependabotService) GetRepoSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) { + url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, name) + return s.getSecret(ctx, url) +} + +// GetOrgSecret gets a single organization Dependabot secret without revealing its encrypted value. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#get-an-organization-secret +func (s *DependabotService) GetOrgSecret(ctx context.Context, org, name string) (*Secret, *Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, name) + return s.getSecret(ctx, url) +} + +func (s *DependabotService) putSecret(ctx context.Context, url string, eSecret *EncryptedSecret) (*Response, error) { + req, err := s.client.NewRequest("PUT", url, eSecret) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) +} + +// CreateOrUpdateRepoSecret creates or updates a repository Dependabot secret with an encrypted value. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#create-or-update-a-repository-secret +func (s *DependabotService) CreateOrUpdateRepoSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) { + url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, eSecret.Name) + return s.putSecret(ctx, url, eSecret) +} + +// CreateOrUpdateOrgSecret creates or updates an organization Dependabot secret with an encrypted value. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#create-or-update-an-organization-secret +func (s *DependabotService) CreateOrUpdateOrgSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, eSecret.Name) + return s.putSecret(ctx, url, eSecret) +} + +func (s *DependabotService) deleteSecret(ctx context.Context, url string) (*Response, error) { + req, err := s.client.NewRequest("DELETE", url, nil) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) +} + +// DeleteRepoSecret deletes a Dependabot secret in a repository using the secret name. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#delete-a-repository-secret +func (s *DependabotService) DeleteRepoSecret(ctx context.Context, owner, repo, name string) (*Response, error) { + url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, name) + return s.deleteSecret(ctx, url) +} + +// DeleteOrgSecret deletes a Dependabot secret in an organization using the secret name. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#delete-an-organization-secret +func (s *DependabotService) DeleteOrgSecret(ctx context.Context, org, name string) (*Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, name) + return s.deleteSecret(ctx, url) +} + +// ListSelectedReposForOrgSecret lists all repositories that have access to a Dependabot secret. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#list-selected-repositories-for-an-organization-secret +func (s *DependabotService) ListSelectedReposForOrgSecret(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories", org, name) + u, err := addOptions(url, opts) + if err != nil { + return nil, nil, err + } + + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + result := new(SelectedReposList) + resp, err := s.client.Do(ctx, req, result) + if err != nil { + return nil, resp, err + } + + return result, resp, nil +} + +// SetSelectedReposForOrgSecret sets the repositories that have access to a Dependabot secret. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#set-selected-repositories-for-an-organization-secret +func (s *DependabotService) SetSelectedReposForOrgSecret(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories", org, name) + type repoIDs struct { + SelectedIDs SelectedRepoIDs `json:"selected_repository_ids"` + } + + req, err := s.client.NewRequest("PUT", url, repoIDs{SelectedIDs: ids}) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) +} + +// AddSelectedRepoToOrgSecret adds a repository to an organization Dependabot secret. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#add-selected-repository-to-an-organization-secret +func (s *DependabotService) AddSelectedRepoToOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories/%v", org, name, *repo.ID) + req, err := s.client.NewRequest("PUT", url, nil) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) +} + +// RemoveSelectedRepoFromOrgSecret removes a repository from an organization Dependabot secret. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/dependabot#remove-selected-repository-from-an-organization-secret +func (s *DependabotService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories/%v", org, name, *repo.ID) + req, err := s.client.NewRequest("DELETE", url, nil) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) +} diff --git a/github/actions_dependabot_secrets_test.go b/github/dependabot_secrets_test.go similarity index 63% rename from github/actions_dependabot_secrets_test.go rename to github/dependabot_secrets_test.go index 1fdef4272d0..49b93e760cf 100644 --- a/github/actions_dependabot_secrets_test.go +++ b/github/dependabot_secrets_test.go @@ -15,7 +15,7 @@ import ( "github.com/google/go-cmp/cmp" ) -func TestDependabotSecrets_GetRepoDependabotPublicKey(t *testing.T) { +func TestDependabotService_GetRepoPublicKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() @@ -25,24 +25,24 @@ func TestDependabotSecrets_GetRepoDependabotPublicKey(t *testing.T) { }) ctx := context.Background() - key, _, err := client.Actions.GetRepoDependabotPublicKey(ctx, "o", "r") + key, _, err := client.Dependabot.GetRepoPublicKey(ctx, "o", "r") if err != nil { - t.Errorf("Actions.GetRepoDependabotPublicKey returned error: %v", err) + t.Errorf("Dependabot.GetRepoPublicKey returned error: %v", err) } want := &PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} if !cmp.Equal(key, want) { - t.Errorf("Actions.GetRepoDependabotPublicKey returned %+v, want %+v", key, want) + t.Errorf("Dependabot.GetRepoPublicKey returned %+v, want %+v", key, want) } - const methodName = "GetRepoDependabotPublicKey" + const methodName = "GetRepoPublicKey" testBadOptions(t, methodName, func() (err error) { - _, _, err = client.Actions.GetRepoDependabotPublicKey(ctx, "\n", "\n") + _, _, err = client.Dependabot.GetRepoPublicKey(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - got, resp, err := client.Actions.GetRepoDependabotPublicKey(ctx, "o", "r") + got, resp, err := client.Dependabot.GetRepoPublicKey(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } @@ -50,7 +50,7 @@ func TestDependabotSecrets_GetRepoDependabotPublicKey(t *testing.T) { }) } -func TestDependabotSecrets_GetRepoDependabotPublicKeyNumeric(t *testing.T) { +func TestDependabotService_GetRepoPublicKeyNumeric(t *testing.T) { client, mux, _, teardown := setup() defer teardown() @@ -60,24 +60,24 @@ func TestDependabotSecrets_GetRepoDependabotPublicKeyNumeric(t *testing.T) { }) ctx := context.Background() - key, _, err := client.Actions.GetRepoDependabotPublicKey(ctx, "o", "r") + key, _, err := client.Dependabot.GetRepoPublicKey(ctx, "o", "r") if err != nil { - t.Errorf("Actions.GetRepoDependabotPublicKey returned error: %v", err) + t.Errorf("Dependabot.GetRepoPublicKey returned error: %v", err) } want := &PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} if !cmp.Equal(key, want) { - t.Errorf("Actions.GetRepoDependabotPublicKey returned %+v, want %+v", key, want) + t.Errorf("Dependabot.GetRepoPublicKey returned %+v, want %+v", key, want) } - const methodName = "GetRepoDependabotPublicKey" + const methodName = "GetRepoPublicKey" testBadOptions(t, methodName, func() (err error) { - _, _, err = client.Actions.GetRepoDependabotPublicKey(ctx, "\n", "\n") + _, _, err = client.Dependabot.GetRepoPublicKey(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - got, resp, err := client.Actions.GetRepoDependabotPublicKey(ctx, "o", "r") + got, resp, err := client.Dependabot.GetRepoPublicKey(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } @@ -85,7 +85,7 @@ func TestDependabotSecrets_GetRepoDependabotPublicKeyNumeric(t *testing.T) { }) } -func TestDependabotSecrets_ListRepoDependabotSecrets(t *testing.T) { +func TestDependabotService_ListRepoSecrets(t *testing.T) { client, mux, _, teardown := setup() defer teardown() @@ -97,9 +97,9 @@ func TestDependabotSecrets_ListRepoDependabotSecrets(t *testing.T) { opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() - secrets, _, err := client.Actions.ListRepoDependabotSecrets(ctx, "o", "r", opts) + secrets, _, err := client.Dependabot.ListRepoSecrets(ctx, "o", "r", opts) if err != nil { - t.Errorf("Actions.ListRepoDependabotSecrets returned error: %v", err) + t.Errorf("Dependabot.ListRepoSecrets returned error: %v", err) } want := &Secrets{ @@ -110,17 +110,17 @@ func TestDependabotSecrets_ListRepoDependabotSecrets(t *testing.T) { }, } if !cmp.Equal(secrets, want) { - t.Errorf("Actions.ListRepoDependabotSecrets returned %+v, want %+v", secrets, want) + t.Errorf("Dependabot.ListRepoSecrets returned %+v, want %+v", secrets, want) } - const methodName = "ListRepoDependabotSecrets" + const methodName = "ListRepoSecrets" testBadOptions(t, methodName, func() (err error) { - _, _, err = client.Actions.ListRepoDependabotSecrets(ctx, "\n", "\n", opts) + _, _, err = client.Dependabot.ListRepoSecrets(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - got, resp, err := client.Actions.ListRepoDependabotSecrets(ctx, "o", "r", opts) + got, resp, err := client.Dependabot.ListRepoSecrets(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } @@ -128,7 +128,7 @@ func TestDependabotSecrets_ListRepoDependabotSecrets(t *testing.T) { }) } -func TestDependabotSecrets_GetRepoDependabotSecret(t *testing.T) { +func TestDependabotService_GetRepoSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() @@ -138,9 +138,9 @@ func TestDependabotSecrets_GetRepoDependabotSecret(t *testing.T) { }) ctx := context.Background() - secret, _, err := client.Actions.GetRepoDependabotSecret(ctx, "o", "r", "NAME") + secret, _, err := client.Dependabot.GetRepoSecret(ctx, "o", "r", "NAME") if err != nil { - t.Errorf("Actions.GetRepoDependabotSecret returned error: %v", err) + t.Errorf("Dependabot.GetRepoSecret returned error: %v", err) } want := &Secret{ @@ -149,17 +149,17 @@ func TestDependabotSecrets_GetRepoDependabotSecret(t *testing.T) { UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}, } if !cmp.Equal(secret, want) { - t.Errorf("Actions.GetRepoDependabotSecret returned %+v, want %+v", secret, want) + t.Errorf("Dependabot.GetRepoSecret returned %+v, want %+v", secret, want) } - const methodName = "GetRepoDependabotSecret" + const methodName = "GetRepoSecret" testBadOptions(t, methodName, func() (err error) { - _, _, err = client.Actions.GetRepoDependabotSecret(ctx, "\n", "\n", "\n") + _, _, err = client.Dependabot.GetRepoSecret(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - got, resp, err := client.Actions.GetRepoDependabotSecret(ctx, "o", "r", "NAME") + got, resp, err := client.Dependabot.GetRepoSecret(ctx, "o", "r", "NAME") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } @@ -167,7 +167,7 @@ func TestDependabotSecrets_GetRepoDependabotSecret(t *testing.T) { }) } -func TestDependabotSecrets_CreateOrUpdateRepoDependabotSecret(t *testing.T) { +func TestDependabotService_CreateOrUpdateRepoSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() @@ -184,23 +184,23 @@ func TestDependabotSecrets_CreateOrUpdateRepoDependabotSecret(t *testing.T) { KeyID: "1234", } ctx := context.Background() - _, err := client.Actions.CreateOrUpdateRepoDependabotSecret(ctx, "o", "r", input) + _, err := client.Dependabot.CreateOrUpdateRepoSecret(ctx, "o", "r", input) if err != nil { - t.Errorf("Actions.CreateOrUpdateRepoDependabotSecret returned error: %v", err) + t.Errorf("Dependabot.CreateOrUpdateRepoSecret returned error: %v", err) } - const methodName = "CreateOrUpdateRepoDependabotSecret" + const methodName = "CreateOrUpdateRepoSecret" testBadOptions(t, methodName, func() (err error) { - _, err = client.Actions.CreateOrUpdateRepoDependabotSecret(ctx, "\n", "\n", input) + _, err = client.Dependabot.CreateOrUpdateRepoSecret(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - return client.Actions.CreateOrUpdateRepoDependabotSecret(ctx, "o", "r", input) + return client.Dependabot.CreateOrUpdateRepoSecret(ctx, "o", "r", input) }) } -func TestDependabotSecrets_DeleteRepoDependabotSecret(t *testing.T) { +func TestDependabotService_DeleteRepoSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() @@ -209,23 +209,23 @@ func TestDependabotSecrets_DeleteRepoDependabotSecret(t *testing.T) { }) ctx := context.Background() - _, err := client.Actions.DeleteRepoDependabotSecret(ctx, "o", "r", "NAME") + _, err := client.Dependabot.DeleteRepoSecret(ctx, "o", "r", "NAME") if err != nil { - t.Errorf("Actions.DeleteRepoDependabotSecret returned error: %v", err) + t.Errorf("Dependabot.DeleteRepoSecret returned error: %v", err) } - const methodName = "DeleteRepoDependabotSecret" + const methodName = "DeleteRepoSecret" testBadOptions(t, methodName, func() (err error) { - _, err = client.Actions.DeleteRepoDependabotSecret(ctx, "\n", "\n", "\n") + _, err = client.Dependabot.DeleteRepoSecret(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - return client.Actions.DeleteRepoDependabotSecret(ctx, "o", "r", "NAME") + return client.Dependabot.DeleteRepoSecret(ctx, "o", "r", "NAME") }) } -func TestDependabotSecrets_GetOrgDependabotPublicKey(t *testing.T) { +func TestDependabotService_GetOrgPublicKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() @@ -235,24 +235,24 @@ func TestDependabotSecrets_GetOrgDependabotPublicKey(t *testing.T) { }) ctx := context.Background() - key, _, err := client.Actions.GetOrgDependabotPublicKey(ctx, "o") + key, _, err := client.Dependabot.GetOrgPublicKey(ctx, "o") if err != nil { - t.Errorf("Actions.GetOrgDependabotPublicKey returned error: %v", err) + t.Errorf("Dependabot.GetOrgPublicKey returned error: %v", err) } want := &PublicKey{KeyID: String("012345678"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} if !cmp.Equal(key, want) { - t.Errorf("Actions.GetOrgDependabotPublicKey returned %+v, want %+v", key, want) + t.Errorf("Dependabot.GetOrgPublicKey returned %+v, want %+v", key, want) } - const methodName = "GetOrgDependabotPublicKey" + const methodName = "GetOrgPublicKey" testBadOptions(t, methodName, func() (err error) { - _, _, err = client.Actions.GetOrgDependabotPublicKey(ctx, "\n") + _, _, err = client.Dependabot.GetOrgPublicKey(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - got, resp, err := client.Actions.GetOrgDependabotPublicKey(ctx, "o") + got, resp, err := client.Dependabot.GetOrgPublicKey(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } @@ -260,7 +260,7 @@ func TestDependabotSecrets_GetOrgDependabotPublicKey(t *testing.T) { }) } -func TestDependabotSecrets_ListOrgDependabotSecrets(t *testing.T) { +func TestDependabotService_ListOrgSecrets(t *testing.T) { client, mux, _, teardown := setup() defer teardown() @@ -272,9 +272,9 @@ func TestDependabotSecrets_ListOrgDependabotSecrets(t *testing.T) { opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() - secrets, _, err := client.Actions.ListOrgDependabotSecrets(ctx, "o", opts) + secrets, _, err := client.Dependabot.ListOrgSecrets(ctx, "o", opts) if err != nil { - t.Errorf("Actions.ListOrgDependabotSecrets returned error: %v", err) + t.Errorf("Dependabot.ListOrgSecrets returned error: %v", err) } want := &Secrets{ @@ -286,17 +286,17 @@ func TestDependabotSecrets_ListOrgDependabotSecrets(t *testing.T) { }, } if !cmp.Equal(secrets, want) { - t.Errorf("Actions.ListOrgDependabotSecrets returned %+v, want %+v", secrets, want) + t.Errorf("Dependabot.ListOrgSecrets returned %+v, want %+v", secrets, want) } - const methodName = "ListOrgDependabotSecrets" + const methodName = "ListOrgSecrets" testBadOptions(t, methodName, func() (err error) { - _, _, err = client.Actions.ListOrgDependabotSecrets(ctx, "\n", opts) + _, _, err = client.Dependabot.ListOrgSecrets(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - got, resp, err := client.Actions.ListOrgDependabotSecrets(ctx, "o", opts) + got, resp, err := client.Dependabot.ListOrgSecrets(ctx, "o", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } @@ -304,7 +304,7 @@ func TestDependabotSecrets_ListOrgDependabotSecrets(t *testing.T) { }) } -func TestDependabotSecrets_GetOrgDependabotSecret(t *testing.T) { +func TestDependabotService_GetOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() @@ -314,9 +314,9 @@ func TestDependabotSecrets_GetOrgDependabotSecret(t *testing.T) { }) ctx := context.Background() - secret, _, err := client.Actions.GetOrgDependabotSecret(ctx, "o", "NAME") + secret, _, err := client.Dependabot.GetOrgSecret(ctx, "o", "NAME") if err != nil { - t.Errorf("Actions.GetOrgDependabotSecret returned error: %v", err) + t.Errorf("Dependabot.GetOrgSecret returned error: %v", err) } want := &Secret{ @@ -327,17 +327,17 @@ func TestDependabotSecrets_GetOrgDependabotSecret(t *testing.T) { SelectedRepositoriesURL: "https://api.github.com/orgs/octo-org/dependabot/secrets/SUPER_SECRET/repositories", } if !cmp.Equal(secret, want) { - t.Errorf("Actions.GetOrgDependabotSecret returned %+v, want %+v", secret, want) + t.Errorf("Dependabot.GetOrgSecret returned %+v, want %+v", secret, want) } - const methodName = "GetOrgDependabotSecret" + const methodName = "GetOrgSecret" testBadOptions(t, methodName, func() (err error) { - _, _, err = client.Actions.GetOrgDependabotSecret(ctx, "\n", "\n") + _, _, err = client.Dependabot.GetOrgSecret(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - got, resp, err := client.Actions.GetOrgDependabotSecret(ctx, "o", "NAME") + got, resp, err := client.Dependabot.GetOrgSecret(ctx, "o", "NAME") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } @@ -345,7 +345,7 @@ func TestDependabotSecrets_GetOrgDependabotSecret(t *testing.T) { }) } -func TestDependabotSecrets_CreateOrUpdateOrgDependabotSecret(t *testing.T) { +func TestDependabotService_CreateOrUpdateOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() @@ -364,23 +364,23 @@ func TestDependabotSecrets_CreateOrUpdateOrgDependabotSecret(t *testing.T) { SelectedRepositoryIDs: SelectedRepoIDs{1296269, 1269280}, } ctx := context.Background() - _, err := client.Actions.CreateOrUpdateOrgDependabotSecret(ctx, "o", input) + _, err := client.Dependabot.CreateOrUpdateOrgSecret(ctx, "o", input) if err != nil { - t.Errorf("Actions.CreateOrUpdateOrgDependabotSecret returned error: %v", err) + t.Errorf("Dependabot.CreateOrUpdateOrgSecret returned error: %v", err) } - const methodName = "CreateOrUpdateOrgDependabotSecret" + const methodName = "CreateOrUpdateOrgSecret" testBadOptions(t, methodName, func() (err error) { - _, err = client.Actions.CreateOrUpdateOrgDependabotSecret(ctx, "\n", input) + _, err = client.Dependabot.CreateOrUpdateOrgSecret(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - return client.Actions.CreateOrUpdateOrgDependabotSecret(ctx, "o", input) + return client.Dependabot.CreateOrUpdateOrgSecret(ctx, "o", input) }) } -func TestDependabotSecrets_ListSelectedReposForOrgDependabotSecret(t *testing.T) { +func TestDependabotService_ListSelectedReposForOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() @@ -391,9 +391,9 @@ func TestDependabotSecrets_ListSelectedReposForOrgDependabotSecret(t *testing.T) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() - repos, _, err := client.Actions.ListSelectedReposForOrgDependabotSecret(ctx, "o", "NAME", opts) + repos, _, err := client.Dependabot.ListSelectedReposForOrgSecret(ctx, "o", "NAME", opts) if err != nil { - t.Errorf("Actions.ListSelectedReposForOrgDependabotSecret returned error: %v", err) + t.Errorf("Dependabot.ListSelectedReposForOrgSecret returned error: %v", err) } want := &SelectedReposList{ @@ -403,17 +403,17 @@ func TestDependabotSecrets_ListSelectedReposForOrgDependabotSecret(t *testing.T) }, } if !cmp.Equal(repos, want) { - t.Errorf("Actions.ListSelectedReposForOrgDependabotSecret returned %+v, want %+v", repos, want) + t.Errorf("Dependabot.ListSelectedReposForOrgSecret returned %+v, want %+v", repos, want) } - const methodName = "ListSelectedReposForOrgDependabotSecret" + const methodName = "ListSelectedReposForOrgSecret" testBadOptions(t, methodName, func() (err error) { - _, _, err = client.Actions.ListSelectedReposForOrgDependabotSecret(ctx, "\n", "\n", opts) + _, _, err = client.Dependabot.ListSelectedReposForOrgSecret(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - got, resp, err := client.Actions.ListSelectedReposForOrgDependabotSecret(ctx, "o", "NAME", opts) + got, resp, err := client.Dependabot.ListSelectedReposForOrgSecret(ctx, "o", "NAME", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } @@ -421,7 +421,7 @@ func TestDependabotSecrets_ListSelectedReposForOrgDependabotSecret(t *testing.T) }) } -func TestDependabotSecrets_SetSelectedReposForOrgDependabotSecret(t *testing.T) { +func TestDependabotService_SetSelectedReposForOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() @@ -432,23 +432,23 @@ func TestDependabotSecrets_SetSelectedReposForOrgDependabotSecret(t *testing.T) }) ctx := context.Background() - _, err := client.Actions.SetSelectedReposForOrgDependabotSecret(ctx, "o", "NAME", SelectedRepoIDs{64780797}) + _, err := client.Dependabot.SetSelectedReposForOrgSecret(ctx, "o", "NAME", SelectedRepoIDs{64780797}) if err != nil { - t.Errorf("Actions.SetSelectedReposForOrgDependabotSecret returned error: %v", err) + t.Errorf("Dependabot.SetSelectedReposForOrgSecret returned error: %v", err) } - const methodName = "SetSelectedReposForOrgDependabotSecret" + const methodName = "SetSelectedReposForOrgSecret" testBadOptions(t, methodName, func() (err error) { - _, err = client.Actions.SetSelectedReposForOrgDependabotSecret(ctx, "\n", "\n", SelectedRepoIDs{64780797}) + _, err = client.Dependabot.SetSelectedReposForOrgSecret(ctx, "\n", "\n", SelectedRepoIDs{64780797}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - return client.Actions.SetSelectedReposForOrgDependabotSecret(ctx, "o", "NAME", SelectedRepoIDs{64780797}) + return client.Dependabot.SetSelectedReposForOrgSecret(ctx, "o", "NAME", SelectedRepoIDs{64780797}) }) } -func TestDependabotSecrets_AddSelectedRepoToOrgDependabotSecret(t *testing.T) { +func TestDependabotService_AddSelectedRepoToOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() @@ -458,23 +458,23 @@ func TestDependabotSecrets_AddSelectedRepoToOrgDependabotSecret(t *testing.T) { repo := &Repository{ID: Int64(1234)} ctx := context.Background() - _, err := client.Actions.AddSelectedRepoToOrgDependabotSecret(ctx, "o", "NAME", repo) + _, err := client.Dependabot.AddSelectedRepoToOrgSecret(ctx, "o", "NAME", repo) if err != nil { - t.Errorf("Actions.AddSelectedRepoToOrgDependabotSecret returned error: %v", err) + t.Errorf("Dependabot.AddSelectedRepoToOrgSecret returned error: %v", err) } - const methodName = "AddSelectedRepoToOrgDependabotSecret" + const methodName = "AddSelectedRepoToOrgSecret" testBadOptions(t, methodName, func() (err error) { - _, err = client.Actions.AddSelectedRepoToOrgDependabotSecret(ctx, "\n", "\n", repo) + _, err = client.Dependabot.AddSelectedRepoToOrgSecret(ctx, "\n", "\n", repo) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - return client.Actions.AddSelectedRepoToOrgDependabotSecret(ctx, "o", "NAME", repo) + return client.Dependabot.AddSelectedRepoToOrgSecret(ctx, "o", "NAME", repo) }) } -func TestDependabotSecrets_RemoveSelectedRepoFromOrgDependabotSecret(t *testing.T) { +func TestDependabotService_RemoveSelectedRepoFromOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() @@ -484,23 +484,23 @@ func TestDependabotSecrets_RemoveSelectedRepoFromOrgDependabotSecret(t *testing. repo := &Repository{ID: Int64(1234)} ctx := context.Background() - _, err := client.Actions.RemoveSelectedRepoFromOrgDependabotSecret(ctx, "o", "NAME", repo) + _, err := client.Dependabot.RemoveSelectedRepoFromOrgSecret(ctx, "o", "NAME", repo) if err != nil { - t.Errorf("Actions.RemoveSelectedRepoFromOrgDependabotSecret returned error: %v", err) + t.Errorf("Dependabot.RemoveSelectedRepoFromOrgSecret returned error: %v", err) } - const methodName = "RemoveSelectedRepoFromOrgDependabotSecret" + const methodName = "RemoveSelectedRepoFromOrgSecret" testBadOptions(t, methodName, func() (err error) { - _, err = client.Actions.RemoveSelectedRepoFromOrgDependabotSecret(ctx, "\n", "\n", repo) + _, err = client.Dependabot.RemoveSelectedRepoFromOrgSecret(ctx, "\n", "\n", repo) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - return client.Actions.RemoveSelectedRepoFromOrgDependabotSecret(ctx, "o", "NAME", repo) + return client.Dependabot.RemoveSelectedRepoFromOrgSecret(ctx, "o", "NAME", repo) }) } -func TestDependabotSecrets_DeleteOrgDependabotSecret(t *testing.T) { +func TestDependabotService_DeleteOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() @@ -509,18 +509,18 @@ func TestDependabotSecrets_DeleteOrgDependabotSecret(t *testing.T) { }) ctx := context.Background() - _, err := client.Actions.DeleteOrgDependabotSecret(ctx, "o", "NAME") + _, err := client.Dependabot.DeleteOrgSecret(ctx, "o", "NAME") if err != nil { - t.Errorf("Actions.DeleteOrgDependabotSecret returned error: %v", err) + t.Errorf("Dependabot.DeleteOrgSecret returned error: %v", err) } - const methodName = "DeleteOrgDependabotSecret" + const methodName = "DeleteOrgSecret" testBadOptions(t, methodName, func() (err error) { - _, err = client.Actions.DeleteOrgDependabotSecret(ctx, "\n", "\n") + _, err = client.Dependabot.DeleteOrgSecret(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - return client.Actions.DeleteOrgDependabotSecret(ctx, "o", "NAME") + return client.Dependabot.DeleteOrgSecret(ctx, "o", "NAME") }) } diff --git a/github/github.go b/github/github.go index 26bf78a91bb..4fb466e3a60 100644 --- a/github/github.go +++ b/github/github.go @@ -178,6 +178,7 @@ type Client struct { Billing *BillingService Checks *ChecksService CodeScanning *CodeScanningService + Dependabot *DependabotService Enterprise *EnterpriseService Gists *GistsService Git *GitService @@ -306,6 +307,7 @@ func NewClient(httpClient *http.Client) *Client { c.Billing = (*BillingService)(&c.common) c.Checks = (*ChecksService)(&c.common) c.CodeScanning = (*CodeScanningService)(&c.common) + c.Dependabot = (*DependabotService)(&c.common) c.Enterprise = (*EnterpriseService)(&c.common) c.Gists = (*GistsService)(&c.common) c.Git = (*GitService)(&c.common) From 094bc334b6a155ea4619814d1f0c076dd6152c57 Mon Sep 17 00:00:00 2001 From: John Jones Date: Wed, 12 Jan 2022 10:58:11 -0800 Subject: [PATCH 5/6] Revert changes to Actions secrets --- github/actions_secrets.go | 341 +++++++++++++++++++++++--------------- 1 file changed, 204 insertions(+), 137 deletions(-) diff --git a/github/actions_secrets.go b/github/actions_secrets.go index 29f70a1a166..5bfb22ac080 100644 --- a/github/actions_secrets.go +++ b/github/actions_secrets.go @@ -47,8 +47,12 @@ func (p *PublicKey) UnmarshalJSON(data []byte) error { return nil } -func (s *ActionsService) getPublicKey(ctx context.Context, url string) (*PublicKey, *Response, error) { - req, err := s.client.NewRequest("GET", url, nil) +// GetRepoPublicKey gets a public key that should be used for secret encryption. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-public-key +func (s *ActionsService) GetRepoPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) { + u := fmt.Sprintf("repos/%v/%v/actions/secrets/public-key", owner, repo) + req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } @@ -62,28 +66,42 @@ func (s *ActionsService) getPublicKey(ctx context.Context, url string) (*PublicK return pubKey, resp, nil } -// GetRepoPublicKey gets a public key that should be used for secret encryption. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-public-key -func (s *ActionsService) GetRepoPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) { - url := fmt.Sprintf("repos/%v/%v/actions/secrets/public-key", owner, repo) - return s.getPublicKey(ctx, url) -} - // GetOrgPublicKey gets a public key that should be used for secret encryption. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-organization-public-key func (s *ActionsService) GetOrgPublicKey(ctx context.Context, org string) (*PublicKey, *Response, error) { - url := fmt.Sprintf("orgs/%v/actions/secrets/public-key", org) - return s.getPublicKey(ctx, url) + u := fmt.Sprintf("orgs/%v/actions/secrets/public-key", org) + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + pubKey := new(PublicKey) + resp, err := s.client.Do(ctx, req, pubKey) + if err != nil { + return nil, resp, err + } + + return pubKey, resp, nil } // GetEnvPublicKey gets a public key that should be used for secret encryption. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#get-an-environment-public-key func (s *ActionsService) GetEnvPublicKey(ctx context.Context, repoID int, env string) (*PublicKey, *Response, error) { - url := fmt.Sprintf("repositories/%v/environments/%v/secrets/public-key", repoID, env) - return s.getPublicKey(ctx, url) + u := fmt.Sprintf("repositories/%v/environments/%v/secrets/public-key", repoID, env) + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + pubKey := new(PublicKey) + resp, err := s.client.Do(ctx, req, pubKey) + if err != nil { + return nil, resp, err + } + + return pubKey, resp, nil } // Secret represents a repository action secret. @@ -101,8 +119,13 @@ type Secrets struct { Secrets []*Secret `json:"secrets"` } -func (s *ActionsService) listSecrets(ctx context.Context, url string, opts *ListOptions) (*Secrets, *Response, error) { - u, err := addOptions(url, opts) +// ListRepoSecrets lists all secrets available in a repository +// without revealing their encrypted values. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-repository-secrets +func (s *ActionsService) ListRepoSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { + u := fmt.Sprintf("repos/%v/%v/actions/secrets", owner, repo) + u, err := addOptions(u, opts) if err != nil { return nil, nil, err } @@ -121,34 +144,12 @@ func (s *ActionsService) listSecrets(ctx context.Context, url string, opts *List return secrets, resp, nil } -// ListRepoSecrets lists all secrets available in a repository -// without revealing their encrypted values. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-repository-secrets -func (s *ActionsService) ListRepoSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { - url := fmt.Sprintf("repos/%v/%v/actions/secrets", owner, repo) - return s.listSecrets(ctx, url, opts) -} - -// ListOrgSecrets lists all secrets available in an organization -// without revealing their encrypted values. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-organization-secrets -func (s *ActionsService) ListOrgSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) { - url := fmt.Sprintf("orgs/%v/actions/secrets", org) - return s.listSecrets(ctx, url, opts) -} - -// ListEnvSecrets lists all secrets available in an environment. +// GetRepoSecret gets a single repository secret without revealing its encrypted value. // -// GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-environment-secrets -func (s *ActionsService) ListEnvSecrets(ctx context.Context, repoID int, env string, opts *ListOptions) (*Secrets, *Response, error) { - url := fmt.Sprintf("repositories/%v/environments/%v/secrets", repoID, env) - return s.listSecrets(ctx, url, opts) -} - -func (s *ActionsService) getSecret(ctx context.Context, url string) (*Secret, *Response, error) { - req, err := s.client.NewRequest("GET", url, nil) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-secret +func (s *ActionsService) GetRepoSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) { + u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) + req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } @@ -162,30 +163,6 @@ func (s *ActionsService) getSecret(ctx context.Context, url string) (*Secret, *R return secret, resp, nil } -// GetRepoSecret gets a single repository secret without revealing its encrypted value. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-secret -func (s *ActionsService) GetRepoSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) { - url := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) - return s.getSecret(ctx, url) -} - -// GetOrgSecret gets a single organization secret without revealing its encrypted value. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-organization-secret -func (s *ActionsService) GetOrgSecret(ctx context.Context, org, name string) (*Secret, *Response, error) { - url := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) - return s.getSecret(ctx, url) -} - -// GetEnvSecret gets a single environment secret without revealing its encrypted value. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-environment-secrets -func (s *ActionsService) GetEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Secret, *Response, error) { - url := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName) - return s.getSecret(ctx, url) -} - // SelectedRepoIDs are the repository IDs that have access to the secret. type SelectedRepoIDs []int64 @@ -202,41 +179,27 @@ type EncryptedSecret struct { SelectedRepositoryIDs SelectedRepoIDs `json:"selected_repository_ids,omitempty"` } -func (s *ActionsService) putSecret(ctx context.Context, url string, eSecret *EncryptedSecret) (*Response, error) { - req, err := s.client.NewRequest("PUT", url, eSecret) - if err != nil { - return nil, err - } - - return s.client.Do(ctx, req, nil) -} - // CreateOrUpdateRepoSecret creates or updates a repository secret with an encrypted value. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-a-repository-secret func (s *ActionsService) CreateOrUpdateRepoSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) { - url := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, eSecret.Name) - return s.putSecret(ctx, url, eSecret) -} + u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, eSecret.Name) -// CreateOrUpdateOrgSecret creates or updates an organization secret with an encrypted value. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-an-organization-secret -func (s *ActionsService) CreateOrUpdateOrgSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { - url := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, eSecret.Name) - return s.putSecret(ctx, url, eSecret) + req, err := s.client.NewRequest("PUT", u, eSecret) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) } -// CreateOrUpdateEnvSecret creates or updates a single environment secret with an encrypted value. +// DeleteRepoSecret deletes a secret in a repository using the secret name. // -// GitHub API docs: https://docs.github.com/en/rest/reference/actions#create-or-update-an-environment-secret -func (s *ActionsService) CreateOrUpdateEnvSecret(ctx context.Context, repoID int, env string, eSecret *EncryptedSecret) (*Response, error) { - url := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, eSecret.Name) - return s.putSecret(ctx, url, eSecret) -} +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-a-repository-secret +func (s *ActionsService) DeleteRepoSecret(ctx context.Context, owner, repo, name string) (*Response, error) { + u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) -func (s *ActionsService) deleteSecret(ctx context.Context, url string) (*Response, error) { - req, err := s.client.NewRequest("DELETE", url, nil) + req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } @@ -244,28 +207,62 @@ func (s *ActionsService) deleteSecret(ctx context.Context, url string) (*Respons return s.client.Do(ctx, req, nil) } -// DeleteRepoSecret deletes a secret in a repository using the secret name. +// ListOrgSecrets lists all secrets available in an organization +// without revealing their encrypted values. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-a-repository-secret -func (s *ActionsService) DeleteRepoSecret(ctx context.Context, owner, repo, name string) (*Response, error) { - url := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) - return s.deleteSecret(ctx, url) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-organization-secrets +func (s *ActionsService) ListOrgSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) { + u := fmt.Sprintf("orgs/%v/actions/secrets", org) + u, err := addOptions(u, opts) + if err != nil { + return nil, nil, err + } + + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + secrets := new(Secrets) + resp, err := s.client.Do(ctx, req, &secrets) + if err != nil { + return nil, resp, err + } + + return secrets, resp, nil } -// DeleteOrgSecret deletes a secret in an organization using the secret name. +// GetOrgSecret gets a single organization secret without revealing its encrypted value. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-an-organization-secret -func (s *ActionsService) DeleteOrgSecret(ctx context.Context, org, name string) (*Response, error) { - url := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) - return s.deleteSecret(ctx, url) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-organization-secret +func (s *ActionsService) GetOrgSecret(ctx context.Context, org, name string) (*Secret, *Response, error) { + u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + secret := new(Secret) + resp, err := s.client.Do(ctx, req, secret) + if err != nil { + return nil, resp, err + } + + return secret, resp, nil } -// DeleteEnvSecret deletes a secret in an environment using the secret name. +// CreateOrUpdateOrgSecret creates or updates an organization secret with an encrypted value. // -// GitHub API docs: https://docs.github.com/en/rest/reference/actions#delete-an-environment-secret -func (s *ActionsService) DeleteEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Response, error) { - url := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName) - return s.deleteSecret(ctx, url) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-an-organization-secret +func (s *ActionsService) CreateOrUpdateOrgSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { + u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, eSecret.Name) + + req, err := s.client.NewRequest("PUT", u, eSecret) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) } // SelectedReposList represents the list of repositories selected for an organization secret. @@ -274,8 +271,12 @@ type SelectedReposList struct { Repositories []*Repository `json:"repositories,omitempty"` } -func (s *ActionsService) listSelectedReposForSecret(ctx context.Context, url string, opts *ListOptions) (*SelectedReposList, *Response, error) { - u, err := addOptions(url, opts) +// ListSelectedReposForOrgSecret lists all repositories that have access to a secret. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-selected-repositories-for-an-organization-secret +func (s *ActionsService) ListSelectedReposForOrgSecret(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) { + u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) + u, err := addOptions(u, opts) if err != nil { return nil, nil, err } @@ -294,20 +295,17 @@ func (s *ActionsService) listSelectedReposForSecret(ctx context.Context, url str return result, resp, nil } -// ListSelectedReposForOrgSecret lists all repositories that have access to a secret. +// SetSelectedReposForOrgSecret sets the repositories that have access to a secret. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-selected-repositories-for-an-organization-secret -func (s *ActionsService) ListSelectedReposForOrgSecret(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) { - url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) - return s.listSelectedReposForSecret(ctx, url, opts) -} +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#set-selected-repositories-for-an-organization-secret +func (s *ActionsService) SetSelectedReposForOrgSecret(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) { + u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) -func (s *ActionsService) setSelectedReposForSecret(ctx context.Context, url string, ids SelectedRepoIDs) (*Response, error) { type repoIDs struct { SelectedIDs SelectedRepoIDs `json:"selected_repository_ids"` } - req, err := s.client.NewRequest("PUT", url, repoIDs{SelectedIDs: ids}) + req, err := s.client.NewRequest("PUT", u, repoIDs{SelectedIDs: ids}) if err != nil { return nil, err } @@ -315,16 +313,25 @@ func (s *ActionsService) setSelectedReposForSecret(ctx context.Context, url stri return s.client.Do(ctx, req, nil) } -// SetSelectedReposForOrgSecret sets the repositories that have access to a secret. +// AddSelectedRepoToOrgSecret adds a repository to an organization secret. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#set-selected-repositories-for-an-organization-secret -func (s *ActionsService) SetSelectedReposForOrgSecret(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) { - url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) - return s.setSelectedReposForSecret(ctx, url, ids) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#add-selected-repository-to-an-organization-secret +func (s *ActionsService) AddSelectedRepoToOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) + req, err := s.client.NewRequest("PUT", u, nil) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) } -func (s *ActionsService) addSelectedRepoToSecret(ctx context.Context, url string) (*Response, error) { - req, err := s.client.NewRequest("PUT", url, nil) +// RemoveSelectedRepoFromOrgSecret removes a repository from an organization secret. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#remove-selected-repository-from-an-organization-secret +func (s *ActionsService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) + req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } @@ -332,16 +339,70 @@ func (s *ActionsService) addSelectedRepoToSecret(ctx context.Context, url string return s.client.Do(ctx, req, nil) } -// AddSelectedRepoToOrgSecret adds a repository to an organization secret. +// DeleteOrgSecret deletes a secret in an organization using the secret name. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#add-selected-repository-to-an-organization-secret -func (s *ActionsService) AddSelectedRepoToOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { - url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) - return s.addSelectedRepoToSecret(ctx, url) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-an-organization-secret +func (s *ActionsService) DeleteOrgSecret(ctx context.Context, org, name string) (*Response, error) { + u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) + + req, err := s.client.NewRequest("DELETE", u, nil) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) +} + +// ListEnvSecrets lists all secrets available in an environment. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-environment-secrets +func (s *ActionsService) ListEnvSecrets(ctx context.Context, repoID int, env string, opts *ListOptions) (*Secrets, *Response, error) { + u := fmt.Sprintf("repositories/%v/environments/%v/secrets", repoID, env) + u, err := addOptions(u, opts) + if err != nil { + return nil, nil, err + } + + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + secrets := new(Secrets) + resp, err := s.client.Do(ctx, req, &secrets) + if err != nil { + return nil, resp, err + } + + return secrets, resp, nil +} + +// GetEnvSecret gets a single environment secret without revealing its encrypted value. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-environment-secrets +func (s *ActionsService) GetEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Secret, *Response, error) { + u := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName) + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + secret := new(Secret) + resp, err := s.client.Do(ctx, req, secret) + if err != nil { + return nil, resp, err + } + + return secret, resp, nil } -func (s *ActionsService) removeSelectedRepoFromSecret(ctx context.Context, url string) (*Response, error) { - req, err := s.client.NewRequest("DELETE", url, nil) +// CreateOrUpdateEnvSecret creates or updates a repository secret with an encrypted value. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/actions#create-or-update-an-environment-secret +func (s *ActionsService) CreateOrUpdateEnvSecret(ctx context.Context, repoID int, env string, eSecret *EncryptedSecret) (*Response, error) { + u := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, eSecret.Name) + + req, err := s.client.NewRequest("PUT", u, eSecret) if err != nil { return nil, err } @@ -349,10 +410,16 @@ func (s *ActionsService) removeSelectedRepoFromSecret(ctx context.Context, url s return s.client.Do(ctx, req, nil) } -// RemoveSelectedRepoFromOrgSecret removes a repository from an organization secret. +// DeleteEnvSecret deletes a secret in an environment using the secret name. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#remove-selected-repository-from-an-organization-secret -func (s *ActionsService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { - url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) - return s.removeSelectedRepoFromSecret(ctx, url) +// GitHub API docs: https://docs.github.com/en/rest/reference/actions#delete-an-environment-secret +func (s *ActionsService) DeleteEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Response, error) { + u := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName) + + req, err := s.client.NewRequest("DELETE", u, nil) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) } From 3dc35e6d9285f44edb1f675b1a62a7911d00c045 Mon Sep 17 00:00:00 2001 From: John Jones Date: Wed, 12 Jan 2022 13:06:41 -0800 Subject: [PATCH 6/6] Revert the last revert, got a little carried away :P --- github/actions_secrets.go | 341 +++++++++++++++----------------------- 1 file changed, 137 insertions(+), 204 deletions(-) diff --git a/github/actions_secrets.go b/github/actions_secrets.go index 5bfb22ac080..29f70a1a166 100644 --- a/github/actions_secrets.go +++ b/github/actions_secrets.go @@ -47,12 +47,8 @@ func (p *PublicKey) UnmarshalJSON(data []byte) error { return nil } -// GetRepoPublicKey gets a public key that should be used for secret encryption. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-public-key -func (s *ActionsService) GetRepoPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) { - u := fmt.Sprintf("repos/%v/%v/actions/secrets/public-key", owner, repo) - req, err := s.client.NewRequest("GET", u, nil) +func (s *ActionsService) getPublicKey(ctx context.Context, url string) (*PublicKey, *Response, error) { + req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } @@ -66,42 +62,28 @@ func (s *ActionsService) GetRepoPublicKey(ctx context.Context, owner, repo strin return pubKey, resp, nil } +// GetRepoPublicKey gets a public key that should be used for secret encryption. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-public-key +func (s *ActionsService) GetRepoPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) { + url := fmt.Sprintf("repos/%v/%v/actions/secrets/public-key", owner, repo) + return s.getPublicKey(ctx, url) +} + // GetOrgPublicKey gets a public key that should be used for secret encryption. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-organization-public-key func (s *ActionsService) GetOrgPublicKey(ctx context.Context, org string) (*PublicKey, *Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets/public-key", org) - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return nil, nil, err - } - - pubKey := new(PublicKey) - resp, err := s.client.Do(ctx, req, pubKey) - if err != nil { - return nil, resp, err - } - - return pubKey, resp, nil + url := fmt.Sprintf("orgs/%v/actions/secrets/public-key", org) + return s.getPublicKey(ctx, url) } // GetEnvPublicKey gets a public key that should be used for secret encryption. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#get-an-environment-public-key func (s *ActionsService) GetEnvPublicKey(ctx context.Context, repoID int, env string) (*PublicKey, *Response, error) { - u := fmt.Sprintf("repositories/%v/environments/%v/secrets/public-key", repoID, env) - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return nil, nil, err - } - - pubKey := new(PublicKey) - resp, err := s.client.Do(ctx, req, pubKey) - if err != nil { - return nil, resp, err - } - - return pubKey, resp, nil + url := fmt.Sprintf("repositories/%v/environments/%v/secrets/public-key", repoID, env) + return s.getPublicKey(ctx, url) } // Secret represents a repository action secret. @@ -119,13 +101,8 @@ type Secrets struct { Secrets []*Secret `json:"secrets"` } -// ListRepoSecrets lists all secrets available in a repository -// without revealing their encrypted values. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-repository-secrets -func (s *ActionsService) ListRepoSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { - u := fmt.Sprintf("repos/%v/%v/actions/secrets", owner, repo) - u, err := addOptions(u, opts) +func (s *ActionsService) listSecrets(ctx context.Context, url string, opts *ListOptions) (*Secrets, *Response, error) { + u, err := addOptions(url, opts) if err != nil { return nil, nil, err } @@ -144,12 +121,34 @@ func (s *ActionsService) ListRepoSecrets(ctx context.Context, owner, repo string return secrets, resp, nil } -// GetRepoSecret gets a single repository secret without revealing its encrypted value. +// ListRepoSecrets lists all secrets available in a repository +// without revealing their encrypted values. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-secret -func (s *ActionsService) GetRepoSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) { - u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) - req, err := s.client.NewRequest("GET", u, nil) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-repository-secrets +func (s *ActionsService) ListRepoSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { + url := fmt.Sprintf("repos/%v/%v/actions/secrets", owner, repo) + return s.listSecrets(ctx, url, opts) +} + +// ListOrgSecrets lists all secrets available in an organization +// without revealing their encrypted values. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-organization-secrets +func (s *ActionsService) ListOrgSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) { + url := fmt.Sprintf("orgs/%v/actions/secrets", org) + return s.listSecrets(ctx, url, opts) +} + +// ListEnvSecrets lists all secrets available in an environment. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-environment-secrets +func (s *ActionsService) ListEnvSecrets(ctx context.Context, repoID int, env string, opts *ListOptions) (*Secrets, *Response, error) { + url := fmt.Sprintf("repositories/%v/environments/%v/secrets", repoID, env) + return s.listSecrets(ctx, url, opts) +} + +func (s *ActionsService) getSecret(ctx context.Context, url string) (*Secret, *Response, error) { + req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } @@ -163,6 +162,30 @@ func (s *ActionsService) GetRepoSecret(ctx context.Context, owner, repo, name st return secret, resp, nil } +// GetRepoSecret gets a single repository secret without revealing its encrypted value. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-secret +func (s *ActionsService) GetRepoSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) { + url := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) + return s.getSecret(ctx, url) +} + +// GetOrgSecret gets a single organization secret without revealing its encrypted value. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-organization-secret +func (s *ActionsService) GetOrgSecret(ctx context.Context, org, name string) (*Secret, *Response, error) { + url := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) + return s.getSecret(ctx, url) +} + +// GetEnvSecret gets a single environment secret without revealing its encrypted value. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-environment-secrets +func (s *ActionsService) GetEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Secret, *Response, error) { + url := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName) + return s.getSecret(ctx, url) +} + // SelectedRepoIDs are the repository IDs that have access to the secret. type SelectedRepoIDs []int64 @@ -179,13 +202,8 @@ type EncryptedSecret struct { SelectedRepositoryIDs SelectedRepoIDs `json:"selected_repository_ids,omitempty"` } -// CreateOrUpdateRepoSecret creates or updates a repository secret with an encrypted value. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-a-repository-secret -func (s *ActionsService) CreateOrUpdateRepoSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) { - u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, eSecret.Name) - - req, err := s.client.NewRequest("PUT", u, eSecret) +func (s *ActionsService) putSecret(ctx context.Context, url string, eSecret *EncryptedSecret) (*Response, error) { + req, err := s.client.NewRequest("PUT", url, eSecret) if err != nil { return nil, err } @@ -193,76 +211,61 @@ func (s *ActionsService) CreateOrUpdateRepoSecret(ctx context.Context, owner, re return s.client.Do(ctx, req, nil) } -// DeleteRepoSecret deletes a secret in a repository using the secret name. +// CreateOrUpdateRepoSecret creates or updates a repository secret with an encrypted value. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-a-repository-secret -func (s *ActionsService) DeleteRepoSecret(ctx context.Context, owner, repo, name string) (*Response, error) { - u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) - - req, err := s.client.NewRequest("DELETE", u, nil) - if err != nil { - return nil, err - } - - return s.client.Do(ctx, req, nil) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-a-repository-secret +func (s *ActionsService) CreateOrUpdateRepoSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) { + url := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, eSecret.Name) + return s.putSecret(ctx, url, eSecret) } -// ListOrgSecrets lists all secrets available in an organization -// without revealing their encrypted values. +// CreateOrUpdateOrgSecret creates or updates an organization secret with an encrypted value. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-organization-secrets -func (s *ActionsService) ListOrgSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets", org) - u, err := addOptions(u, opts) - if err != nil { - return nil, nil, err - } - - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return nil, nil, err - } - - secrets := new(Secrets) - resp, err := s.client.Do(ctx, req, &secrets) - if err != nil { - return nil, resp, err - } - - return secrets, resp, nil +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-an-organization-secret +func (s *ActionsService) CreateOrUpdateOrgSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { + url := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, eSecret.Name) + return s.putSecret(ctx, url, eSecret) } -// GetOrgSecret gets a single organization secret without revealing its encrypted value. +// CreateOrUpdateEnvSecret creates or updates a single environment secret with an encrypted value. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-organization-secret -func (s *ActionsService) GetOrgSecret(ctx context.Context, org, name string) (*Secret, *Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return nil, nil, err - } +// GitHub API docs: https://docs.github.com/en/rest/reference/actions#create-or-update-an-environment-secret +func (s *ActionsService) CreateOrUpdateEnvSecret(ctx context.Context, repoID int, env string, eSecret *EncryptedSecret) (*Response, error) { + url := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, eSecret.Name) + return s.putSecret(ctx, url, eSecret) +} - secret := new(Secret) - resp, err := s.client.Do(ctx, req, secret) +func (s *ActionsService) deleteSecret(ctx context.Context, url string) (*Response, error) { + req, err := s.client.NewRequest("DELETE", url, nil) if err != nil { - return nil, resp, err + return nil, err } - return secret, resp, nil + return s.client.Do(ctx, req, nil) } -// CreateOrUpdateOrgSecret creates or updates an organization secret with an encrypted value. +// DeleteRepoSecret deletes a secret in a repository using the secret name. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-an-organization-secret -func (s *ActionsService) CreateOrUpdateOrgSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, eSecret.Name) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-a-repository-secret +func (s *ActionsService) DeleteRepoSecret(ctx context.Context, owner, repo, name string) (*Response, error) { + url := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) + return s.deleteSecret(ctx, url) +} - req, err := s.client.NewRequest("PUT", u, eSecret) - if err != nil { - return nil, err - } +// DeleteOrgSecret deletes a secret in an organization using the secret name. +// +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-an-organization-secret +func (s *ActionsService) DeleteOrgSecret(ctx context.Context, org, name string) (*Response, error) { + url := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) + return s.deleteSecret(ctx, url) +} - return s.client.Do(ctx, req, nil) +// DeleteEnvSecret deletes a secret in an environment using the secret name. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/actions#delete-an-environment-secret +func (s *ActionsService) DeleteEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Response, error) { + url := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName) + return s.deleteSecret(ctx, url) } // SelectedReposList represents the list of repositories selected for an organization secret. @@ -271,12 +274,8 @@ type SelectedReposList struct { Repositories []*Repository `json:"repositories,omitempty"` } -// ListSelectedReposForOrgSecret lists all repositories that have access to a secret. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-selected-repositories-for-an-organization-secret -func (s *ActionsService) ListSelectedReposForOrgSecret(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) - u, err := addOptions(u, opts) +func (s *ActionsService) listSelectedReposForSecret(ctx context.Context, url string, opts *ListOptions) (*SelectedReposList, *Response, error) { + u, err := addOptions(url, opts) if err != nil { return nil, nil, err } @@ -295,17 +294,20 @@ func (s *ActionsService) ListSelectedReposForOrgSecret(ctx context.Context, org, return result, resp, nil } -// SetSelectedReposForOrgSecret sets the repositories that have access to a secret. +// ListSelectedReposForOrgSecret lists all repositories that have access to a secret. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#set-selected-repositories-for-an-organization-secret -func (s *ActionsService) SetSelectedReposForOrgSecret(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-selected-repositories-for-an-organization-secret +func (s *ActionsService) ListSelectedReposForOrgSecret(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) { + url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) + return s.listSelectedReposForSecret(ctx, url, opts) +} +func (s *ActionsService) setSelectedReposForSecret(ctx context.Context, url string, ids SelectedRepoIDs) (*Response, error) { type repoIDs struct { SelectedIDs SelectedRepoIDs `json:"selected_repository_ids"` } - req, err := s.client.NewRequest("PUT", u, repoIDs{SelectedIDs: ids}) + req, err := s.client.NewRequest("PUT", url, repoIDs{SelectedIDs: ids}) if err != nil { return nil, err } @@ -313,39 +315,16 @@ func (s *ActionsService) SetSelectedReposForOrgSecret(ctx context.Context, org, return s.client.Do(ctx, req, nil) } -// AddSelectedRepoToOrgSecret adds a repository to an organization secret. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#add-selected-repository-to-an-organization-secret -func (s *ActionsService) AddSelectedRepoToOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) - req, err := s.client.NewRequest("PUT", u, nil) - if err != nil { - return nil, err - } - - return s.client.Do(ctx, req, nil) -} - -// RemoveSelectedRepoFromOrgSecret removes a repository from an organization secret. +// SetSelectedReposForOrgSecret sets the repositories that have access to a secret. // -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#remove-selected-repository-from-an-organization-secret -func (s *ActionsService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) - req, err := s.client.NewRequest("DELETE", u, nil) - if err != nil { - return nil, err - } - - return s.client.Do(ctx, req, nil) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#set-selected-repositories-for-an-organization-secret +func (s *ActionsService) SetSelectedReposForOrgSecret(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) { + url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) + return s.setSelectedReposForSecret(ctx, url, ids) } -// DeleteOrgSecret deletes a secret in an organization using the secret name. -// -// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-an-organization-secret -func (s *ActionsService) DeleteOrgSecret(ctx context.Context, org, name string) (*Response, error) { - u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) - - req, err := s.client.NewRequest("DELETE", u, nil) +func (s *ActionsService) addSelectedRepoToSecret(ctx context.Context, url string) (*Response, error) { + req, err := s.client.NewRequest("PUT", url, nil) if err != nil { return nil, err } @@ -353,56 +332,16 @@ func (s *ActionsService) DeleteOrgSecret(ctx context.Context, org, name string) return s.client.Do(ctx, req, nil) } -// ListEnvSecrets lists all secrets available in an environment. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-environment-secrets -func (s *ActionsService) ListEnvSecrets(ctx context.Context, repoID int, env string, opts *ListOptions) (*Secrets, *Response, error) { - u := fmt.Sprintf("repositories/%v/environments/%v/secrets", repoID, env) - u, err := addOptions(u, opts) - if err != nil { - return nil, nil, err - } - - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return nil, nil, err - } - - secrets := new(Secrets) - resp, err := s.client.Do(ctx, req, &secrets) - if err != nil { - return nil, resp, err - } - - return secrets, resp, nil -} - -// GetEnvSecret gets a single environment secret without revealing its encrypted value. +// AddSelectedRepoToOrgSecret adds a repository to an organization secret. // -// GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-environment-secrets -func (s *ActionsService) GetEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Secret, *Response, error) { - u := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName) - req, err := s.client.NewRequest("GET", u, nil) - if err != nil { - return nil, nil, err - } - - secret := new(Secret) - resp, err := s.client.Do(ctx, req, secret) - if err != nil { - return nil, resp, err - } - - return secret, resp, nil +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#add-selected-repository-to-an-organization-secret +func (s *ActionsService) AddSelectedRepoToOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) + return s.addSelectedRepoToSecret(ctx, url) } -// CreateOrUpdateEnvSecret creates or updates a repository secret with an encrypted value. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/actions#create-or-update-an-environment-secret -func (s *ActionsService) CreateOrUpdateEnvSecret(ctx context.Context, repoID int, env string, eSecret *EncryptedSecret) (*Response, error) { - u := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, eSecret.Name) - - req, err := s.client.NewRequest("PUT", u, eSecret) +func (s *ActionsService) removeSelectedRepoFromSecret(ctx context.Context, url string) (*Response, error) { + req, err := s.client.NewRequest("DELETE", url, nil) if err != nil { return nil, err } @@ -410,16 +349,10 @@ func (s *ActionsService) CreateOrUpdateEnvSecret(ctx context.Context, repoID int return s.client.Do(ctx, req, nil) } -// DeleteEnvSecret deletes a secret in an environment using the secret name. +// RemoveSelectedRepoFromOrgSecret removes a repository from an organization secret. // -// GitHub API docs: https://docs.github.com/en/rest/reference/actions#delete-an-environment-secret -func (s *ActionsService) DeleteEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Response, error) { - u := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName) - - req, err := s.client.NewRequest("DELETE", u, nil) - if err != nil { - return nil, err - } - - return s.client.Do(ctx, req, nil) +// GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#remove-selected-repository-from-an-organization-secret +func (s *ActionsService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) + return s.removeSelectedRepoFromSecret(ctx, url) }