From f56e6b5709b848c1f6146ee42d87119e1146a452 Mon Sep 17 00:00:00 2001 From: Oleksandr Redko Date: Wed, 23 Jul 2025 14:52:16 +0300 Subject: [PATCH] fix: Add validation for nil inputs in various services --- github/actions_hosted_runners.go | 3 ++ github/actions_hosted_runners_test.go | 5 +++ github/actions_secrets.go | 21 +++++++++++ github/actions_secrets_test.go | 20 +++++++++++ github/actions_variables.go | 27 ++++++++++++++ github/actions_variables_test.go | 28 +++++++++++++++ github/admin_orgs.go | 8 +++++ github/admin_orgs_test.go | 9 +++++ github/codespaces_secrets.go | 41 ++++++++++++++++++++++ github/codespaces_secrets_test.go | 9 +++++ github/dependabot_secrets.go | 23 ++++++++++++ github/dependabot_secrets_test.go | 24 +++++++++++++ github/git_refs.go | 15 ++++++++ github/git_refs_test.go | 16 +++++++++ github/git_tags.go | 5 +++ github/git_tags_test.go | 4 +++ github/orgs_hooks.go | 5 +++ github/orgs_hooks_test.go | 4 +++ github/orgs_personal_access_tokens.go | 5 +++ github/orgs_personal_access_tokens_test.go | 4 +++ github/repos.go | 4 +++ github/repos_hooks.go | 5 +++ github/repos_hooks_test.go | 4 +++ github/repos_pages.go | 5 +++ github/repos_pages_test.go | 4 +++ github/repos_releases.go | 12 +++++++ github/repos_releases_test.go | 12 +++++++ github/repos_test.go | 4 +++ 28 files changed, 326 insertions(+) diff --git a/github/actions_hosted_runners.go b/github/actions_hosted_runners.go index dbe1f6b5b1e..207b755fc30 100644 --- a/github/actions_hosted_runners.go +++ b/github/actions_hosted_runners.go @@ -107,6 +107,9 @@ type HostedRunnerRequest struct { // If any of these conditions are violated, an appropriate error message is returned. // Otherwise, nil is returned, indicating the request is valid. func validateCreateHostedRunnerRequest(request *HostedRunnerRequest) error { + if request == nil { + return errors.New("request is required for creating a hosted runner") + } if request.Size == "" { return errors.New("size is required for creating a hosted runner") } diff --git a/github/actions_hosted_runners_test.go b/github/actions_hosted_runners_test.go index e1191ceb360..2b406f67464 100644 --- a/github/actions_hosted_runners_test.go +++ b/github/actions_hosted_runners_test.go @@ -249,6 +249,11 @@ func TestActionsService_CreateHostedRunner(t *testing.T) { request *HostedRunnerRequest expectedError string }{ + { + name: "Missing Request", + request: nil, + expectedError: "validation failed: request is required for creating a hosted runner", + }, { name: "Missing Size", request: &HostedRunnerRequest{ diff --git a/github/actions_secrets.go b/github/actions_secrets.go index ff09b4ee588..f03d3fd191d 100644 --- a/github/actions_secrets.go +++ b/github/actions_secrets.go @@ -8,6 +8,7 @@ package github import ( "context" "encoding/json" + "errors" "fmt" "strconv" ) @@ -246,6 +247,10 @@ func (s *ActionsService) putSecret(ctx context.Context, url string, eSecret *Enc // //meta:operation PUT /repos/{owner}/{repo}/actions/secrets/{secret_name} func (s *ActionsService) CreateOrUpdateRepoSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) { + if eSecret == nil { + return nil, errors.New("encrypted secret must be provided") + } + url := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, eSecret.Name) return s.putSecret(ctx, url, eSecret) } @@ -256,6 +261,10 @@ func (s *ActionsService) CreateOrUpdateRepoSecret(ctx context.Context, owner, re // //meta:operation PUT /orgs/{org}/actions/secrets/{secret_name} func (s *ActionsService) CreateOrUpdateOrgSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { + if eSecret == nil { + return nil, errors.New("encrypted secret must be provided") + } + url := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, eSecret.Name) return s.putSecret(ctx, url, eSecret) } @@ -266,6 +275,10 @@ func (s *ActionsService) CreateOrUpdateOrgSecret(ctx context.Context, org string // //meta:operation PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name} func (s *ActionsService) CreateOrUpdateEnvSecret(ctx context.Context, repoID int, env string, eSecret *EncryptedSecret) (*Response, error) { + if eSecret == nil { + return nil, errors.New("encrypted secret must be provided") + } + url := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, eSecret.Name) return s.putSecret(ctx, url, eSecret) } @@ -383,6 +396,10 @@ func (s *ActionsService) addSelectedRepoToSecret(ctx context.Context, url string // //meta:operation PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id} func (s *ActionsService) AddSelectedRepoToOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + if repo == nil { + return nil, errors.New("repository must be provided") + } + url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) return s.addSelectedRepoToSecret(ctx, url) } @@ -402,6 +419,10 @@ func (s *ActionsService) removeSelectedRepoFromSecret(ctx context.Context, url s // //meta:operation DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id} func (s *ActionsService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + if repo == nil { + return nil, errors.New("repository must be provided") + } + url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) return s.removeSelectedRepoFromSecret(ctx, url) } diff --git a/github/actions_secrets_test.go b/github/actions_secrets_test.go index 25b923c6b94..fea453217ea 100644 --- a/github/actions_secrets_test.go +++ b/github/actions_secrets_test.go @@ -311,6 +311,10 @@ func TestActionsService_CreateOrUpdateRepoSecret(t *testing.T) { } const methodName = "CreateOrUpdateRepoSecret" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.CreateOrUpdateRepoSecret(ctx, "o", "r", nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.CreateOrUpdateRepoSecret(ctx, "\n", "\n", input) return err @@ -491,6 +495,10 @@ func TestActionsService_CreateOrUpdateOrgSecret(t *testing.T) { } const methodName = "CreateOrUpdateOrgSecret" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.CreateOrUpdateOrgSecret(ctx, "o", nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.CreateOrUpdateOrgSecret(ctx, "\n", input) return err @@ -585,6 +593,10 @@ func TestActionsService_AddSelectedRepoToOrgSecret(t *testing.T) { } const methodName = "AddSelectedRepoToOrgSecret" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.AddSelectedRepoToOrgSecret(ctx, "o", "NAME", nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.AddSelectedRepoToOrgSecret(ctx, "\n", "\n", repo) return err @@ -611,6 +623,10 @@ func TestActionsService_RemoveSelectedRepoFromOrgSecret(t *testing.T) { } const methodName = "RemoveSelectedRepoFromOrgSecret" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.RemoveSelectedRepoFromOrgSecret(ctx, "o", "NAME", nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.RemoveSelectedRepoFromOrgSecret(ctx, "\n", "\n", repo) return err @@ -821,6 +837,10 @@ func TestActionsService_CreateOrUpdateEnvSecret(t *testing.T) { } const methodName = "CreateOrUpdateEnvSecret" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.CreateOrUpdateEnvSecret(ctx, 1, "e", nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.CreateOrUpdateEnvSecret(ctx, 0.0, "\n", input) return err diff --git a/github/actions_variables.go b/github/actions_variables.go index bca46b6df6b..b192ba703ec 100644 --- a/github/actions_variables.go +++ b/github/actions_variables.go @@ -7,6 +7,7 @@ package github import ( "context" + "errors" "fmt" ) @@ -186,6 +187,10 @@ func (s *ActionsService) patchVariable(ctx context.Context, url string, variable // //meta:operation PATCH /repos/{owner}/{repo}/actions/variables/{name} func (s *ActionsService) UpdateRepoVariable(ctx context.Context, owner, repo string, variable *ActionsVariable) (*Response, error) { + if variable == nil { + return nil, errors.New("variable must be provided") + } + url := fmt.Sprintf("repos/%v/%v/actions/variables/%v", owner, repo, variable.Name) return s.patchVariable(ctx, url, variable) } @@ -196,6 +201,10 @@ func (s *ActionsService) UpdateRepoVariable(ctx context.Context, owner, repo str // //meta:operation PATCH /orgs/{org}/actions/variables/{name} func (s *ActionsService) UpdateOrgVariable(ctx context.Context, org string, variable *ActionsVariable) (*Response, error) { + if variable == nil { + return nil, errors.New("variable must be provided") + } + url := fmt.Sprintf("orgs/%v/actions/variables/%v", org, variable.Name) return s.patchVariable(ctx, url, variable) } @@ -206,6 +215,10 @@ func (s *ActionsService) UpdateOrgVariable(ctx context.Context, org string, vari // //meta:operation PATCH /repos/{owner}/{repo}/environments/{environment_name}/variables/{name} func (s *ActionsService) UpdateEnvVariable(ctx context.Context, owner, repo, env string, variable *ActionsVariable) (*Response, error) { + if variable == nil { + return nil, errors.New("variable must be provided") + } + url := fmt.Sprintf("repos/%v/%v/environments/%v/variables/%v", owner, repo, env, variable.Name) return s.patchVariable(ctx, url, variable) } @@ -317,6 +330,13 @@ func (s *ActionsService) addSelectedRepoToVariable(ctx context.Context, url stri // //meta:operation PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id} func (s *ActionsService) AddSelectedRepoToOrgVariable(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + if repo == nil { + return nil, errors.New("repository must be provided") + } + if repo.ID == nil { + return nil, errors.New("id must be provided") + } + url := fmt.Sprintf("orgs/%v/actions/variables/%v/repositories/%v", org, name, *repo.ID) return s.addSelectedRepoToVariable(ctx, url) } @@ -336,6 +356,13 @@ func (s *ActionsService) removeSelectedRepoFromVariable(ctx context.Context, url // //meta:operation DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id} func (s *ActionsService) RemoveSelectedRepoFromOrgVariable(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + if repo == nil { + return nil, errors.New("repository must be provided") + } + if repo.ID == nil { + return nil, errors.New("id must be provided") + } + url := fmt.Sprintf("orgs/%v/actions/variables/%v/repositories/%v", org, name, *repo.ID) return s.removeSelectedRepoFromVariable(ctx, url) } diff --git a/github/actions_variables_test.go b/github/actions_variables_test.go index f4b0a219cdd..ab4fa370042 100644 --- a/github/actions_variables_test.go +++ b/github/actions_variables_test.go @@ -195,6 +195,10 @@ func TestActionsService_UpdateRepoVariable(t *testing.T) { } const methodName = "UpdateRepoVariable" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.UpdateRepoVariable(ctx, "o", "r", nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.UpdateRepoVariable(ctx, "\n", "\n", input) return err @@ -374,6 +378,10 @@ func TestActionsService_UpdateOrgVariable(t *testing.T) { } const methodName = "UpdateOrgVariable" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.UpdateOrgVariable(ctx, "o", nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.UpdateOrgVariable(ctx, "\n", input) return err @@ -468,6 +476,14 @@ func TestActionsService_AddSelectedRepoToOrgVariable(t *testing.T) { } const methodName = "AddSelectedRepoToOrgVariable" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.AddSelectedRepoToOrgVariable(ctx, "o", "NAME", nil) + return err + }) + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.AddSelectedRepoToOrgVariable(ctx, "o", "NAME", &Repository{ID: nil}) + return err + }) testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.AddSelectedRepoToOrgVariable(ctx, "\n", "\n", repo) return err @@ -494,6 +510,14 @@ func TestActionsService_RemoveSelectedRepoFromOrgVariable(t *testing.T) { } const methodName = "RemoveSelectedRepoFromOrgVariable" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.RemoveSelectedRepoFromOrgVariable(ctx, "o", "NAME", nil) + return err + }) + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.RemoveSelectedRepoFromOrgVariable(ctx, "o", "NAME", &Repository{ID: nil}) + return err + }) testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.RemoveSelectedRepoFromOrgVariable(ctx, "\n", "\n", repo) return err @@ -666,6 +690,10 @@ func TestActionsService_UpdateEnvVariable(t *testing.T) { } const methodName = "UpdateEnvVariable" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.UpdateEnvVariable(ctx, "usr", "1", "e", nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.UpdateEnvVariable(ctx, "usr", "1", "\n", input) return err diff --git a/github/admin_orgs.go b/github/admin_orgs.go index f111d36ce99..eb3f8d2dfea 100644 --- a/github/admin_orgs.go +++ b/github/admin_orgs.go @@ -7,6 +7,7 @@ package github import ( "context" + "errors" "fmt" ) @@ -65,6 +66,13 @@ type RenameOrgResponse struct { // //meta:operation PATCH /admin/organizations/{org} func (s *AdminService) RenameOrg(ctx context.Context, org *Organization, newName string) (*RenameOrgResponse, *Response, error) { + if org == nil { + return nil, nil, errors.New("organization must be provided") + } + if org.Login == nil { + return nil, nil, errors.New("login must be provided") + } + return s.RenameOrgByName(ctx, *org.Login, newName) } diff --git a/github/admin_orgs_test.go b/github/admin_orgs_test.go index b05ce57b31c..a9b48c177ac 100644 --- a/github/admin_orgs_test.go +++ b/github/admin_orgs_test.go @@ -90,6 +90,15 @@ func TestAdminOrgs_Rename(t *testing.T) { } const methodName = "RenameOrg" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Admin.RenameOrg(ctx, nil, "the-new-octocats") + return err + }) + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Admin.RenameOrg(ctx, &Organization{Login: nil}, "the-new-octocats") + return err + }) + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Admin.RenameOrg(ctx, input, "the-new-octocats") if got != nil { diff --git a/github/codespaces_secrets.go b/github/codespaces_secrets.go index 438c27f8ffe..ba4b9abd9d3 100644 --- a/github/codespaces_secrets.go +++ b/github/codespaces_secrets.go @@ -7,6 +7,7 @@ package github import ( "context" + "errors" "fmt" ) @@ -187,6 +188,10 @@ func (s *CodespacesService) getSecret(ctx context.Context, url string) (*Secret, // //meta:operation PUT /user/codespaces/secrets/{secret_name} func (s *CodespacesService) CreateOrUpdateUserSecret(ctx context.Context, eSecret *EncryptedSecret) (*Response, error) { + if eSecret == nil { + return nil, errors.New("encrypted secret must be provided") + } + u := fmt.Sprintf("user/codespaces/secrets/%v", eSecret.Name) return s.createOrUpdateSecret(ctx, u, eSecret) } @@ -199,6 +204,10 @@ func (s *CodespacesService) CreateOrUpdateUserSecret(ctx context.Context, eSecre // //meta:operation PUT /orgs/{org}/codespaces/secrets/{secret_name} func (s *CodespacesService) CreateOrUpdateOrgSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { + if eSecret == nil { + return nil, errors.New("encrypted secret must be provided") + } + u := fmt.Sprintf("orgs/%v/codespaces/secrets/%v", org, eSecret.Name) return s.createOrUpdateSecret(ctx, u, eSecret) } @@ -211,6 +220,10 @@ func (s *CodespacesService) CreateOrUpdateOrgSecret(ctx context.Context, org str // //meta:operation PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name} func (s *CodespacesService) CreateOrUpdateRepoSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) { + if eSecret == nil { + return nil, errors.New("encrypted secret must be provided") + } + u := fmt.Sprintf("repos/%v/%v/codespaces/secrets/%v", owner, repo, eSecret.Name) return s.createOrUpdateSecret(ctx, u, eSecret) } @@ -382,6 +395,13 @@ func (s *CodespacesService) setSelectedRepoForSecret(ctx context.Context, url st // //meta:operation PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id} func (s *CodespacesService) AddSelectedRepoToUserSecret(ctx context.Context, name string, repo *Repository) (*Response, error) { + if repo == nil { + return nil, errors.New("repository must be provided") + } + if repo.ID == nil { + return nil, errors.New("id must be provided") + } + u := fmt.Sprintf("user/codespaces/secrets/%v/repositories/%v", name, *repo.ID) return s.addSelectedRepoToSecret(ctx, u) } @@ -394,6 +414,13 @@ func (s *CodespacesService) AddSelectedRepoToUserSecret(ctx context.Context, nam // //meta:operation PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id} func (s *CodespacesService) AddSelectedRepoToOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + if repo == nil { + return nil, errors.New("repository must be provided") + } + if repo.ID == nil { + return nil, errors.New("id must be provided") + } + u := fmt.Sprintf("orgs/%v/codespaces/secrets/%v/repositories/%v", org, name, *repo.ID) return s.addSelectedRepoToSecret(ctx, u) } @@ -420,6 +447,13 @@ func (s *CodespacesService) addSelectedRepoToSecret(ctx context.Context, url str // //meta:operation DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id} func (s *CodespacesService) RemoveSelectedRepoFromUserSecret(ctx context.Context, name string, repo *Repository) (*Response, error) { + if repo == nil { + return nil, errors.New("repository must be provided") + } + if repo.ID == nil { + return nil, errors.New("id must be provided") + } + u := fmt.Sprintf("user/codespaces/secrets/%v/repositories/%v", name, *repo.ID) return s.removeSelectedRepoFromSecret(ctx, u) } @@ -432,6 +466,13 @@ func (s *CodespacesService) RemoveSelectedRepoFromUserSecret(ctx context.Context // //meta:operation DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id} func (s *CodespacesService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + if repo == nil { + return nil, errors.New("repository must be provided") + } + if repo.ID == nil { + return nil, errors.New("id must be provided") + } + u := fmt.Sprintf("orgs/%v/codespaces/secrets/%v/repositories/%v", org, name, *repo.ID) return s.removeSelectedRepoFromSecret(ctx, u) } diff --git a/github/codespaces_secrets_test.go b/github/codespaces_secrets_test.go index 2f792bb7fae..b569e7ea0ae 100644 --- a/github/codespaces_secrets_test.go +++ b/github/codespaces_secrets_test.go @@ -234,6 +234,9 @@ func TestCodespacesService_CreateOrUpdateSecret(t *testing.T) { call: func(ctx context.Context, client *Client, e *EncryptedSecret) (*Response, error) { return client.Codespaces.CreateOrUpdateUserSecret(ctx, e) }, + badCall: func(ctx context.Context, client *Client, _ *EncryptedSecret) (*Response, error) { + return client.Codespaces.CreateOrUpdateUserSecret(ctx, nil) + }, methodName: "CreateOrUpdateUserSecret", }, { @@ -657,6 +660,9 @@ func TestCodespacesService_AddSelectedReposForSecret(t *testing.T) { call: func(ctx context.Context, client *Client) (*Response, error) { return client.Codespaces.AddSelectedRepoToUserSecret(ctx, "NAME", repo) }, + badCall: func(ctx context.Context, client *Client) (*Response, error) { + return client.Codespaces.AddSelectedRepoToUserSecret(ctx, "NAME", &Repository{ID: nil}) + }, methodName: "AddSelectedRepoToUserSecret", }, { @@ -724,6 +730,9 @@ func TestCodespacesService_RemoveSelectedReposFromSecret(t *testing.T) { call: func(ctx context.Context, client *Client) (*Response, error) { return client.Codespaces.RemoveSelectedRepoFromUserSecret(ctx, "NAME", repo) }, + badCall: func(ctx context.Context, client *Client) (*Response, error) { + return client.Codespaces.RemoveSelectedRepoFromUserSecret(ctx, "NAME", nil) + }, methodName: "RemoveSelectedRepoFromUserSecret", }, { diff --git a/github/dependabot_secrets.go b/github/dependabot_secrets.go index e85c805a63f..b4b3e0aa560 100644 --- a/github/dependabot_secrets.go +++ b/github/dependabot_secrets.go @@ -7,6 +7,7 @@ package github import ( "context" + "errors" "fmt" ) @@ -150,6 +151,10 @@ func (s *DependabotService) putSecret(ctx context.Context, url string, eSecret * // //meta:operation PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name} func (s *DependabotService) CreateOrUpdateRepoSecret(ctx context.Context, owner, repo string, eSecret *DependabotEncryptedSecret) (*Response, error) { + if eSecret == nil { + return nil, errors.New("dependabot encrypted secret must be provided") + } + url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, eSecret.Name) return s.putSecret(ctx, url, eSecret) } @@ -160,6 +165,10 @@ func (s *DependabotService) CreateOrUpdateRepoSecret(ctx context.Context, owner, // //meta:operation PUT /orgs/{org}/dependabot/secrets/{secret_name} func (s *DependabotService) CreateOrUpdateOrgSecret(ctx context.Context, org string, eSecret *DependabotEncryptedSecret) (*Response, error) { + if eSecret == nil { + return nil, errors.New("dependabot encrypted secret must be provided") + } + repoIDs := make([]string, len(eSecret.SelectedRepositoryIDs)) for i, secret := range eSecret.SelectedRepositoryIDs { repoIDs[i] = fmt.Sprintf("%v", secret) @@ -264,6 +273,13 @@ func (s *DependabotService) SetSelectedReposForOrgSecret(ctx context.Context, or // //meta:operation PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id} func (s *DependabotService) AddSelectedRepoToOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + if repo == nil { + return nil, errors.New("repository must be provided") + } + if repo.ID == nil { + return nil, errors.New("id must be provided") + } + 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 { @@ -279,6 +295,13 @@ func (s *DependabotService) AddSelectedRepoToOrgSecret(ctx context.Context, org, // //meta:operation DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id} func (s *DependabotService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { + if repo == nil { + return nil, errors.New("repository must be provided") + } + if repo.ID == nil { + return nil, errors.New("id must be provided") + } + 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 { diff --git a/github/dependabot_secrets_test.go b/github/dependabot_secrets_test.go index f4c147df55a..e8c205c2c41 100644 --- a/github/dependabot_secrets_test.go +++ b/github/dependabot_secrets_test.go @@ -190,6 +190,10 @@ func TestDependabotService_CreateOrUpdateRepoSecret(t *testing.T) { } const methodName = "CreateOrUpdateRepoSecret" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Dependabot.CreateOrUpdateRepoSecret(ctx, "o", "r", nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, err = client.Dependabot.CreateOrUpdateRepoSecret(ctx, "\n", "\n", input) return err @@ -370,6 +374,10 @@ func TestDependabotService_CreateOrUpdateOrgSecret(t *testing.T) { } const methodName = "CreateOrUpdateOrgSecret" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Dependabot.CreateOrUpdateOrgSecret(ctx, "o", nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, err = client.Dependabot.CreateOrUpdateOrgSecret(ctx, "\n", input) return err @@ -464,6 +472,14 @@ func TestDependabotService_AddSelectedRepoToOrgSecret(t *testing.T) { } const methodName = "AddSelectedRepoToOrgSecret" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Dependabot.AddSelectedRepoToOrgSecret(ctx, "o", "NAME", nil) + return err + }) + testBadOptions(t, methodName, func() (err error) { + _, err = client.Dependabot.AddSelectedRepoToOrgSecret(ctx, "o", "NAME", &Repository{ID: nil}) + return err + }) testBadOptions(t, methodName, func() (err error) { _, err = client.Dependabot.AddSelectedRepoToOrgSecret(ctx, "\n", "\n", repo) return err @@ -490,6 +506,14 @@ func TestDependabotService_RemoveSelectedRepoFromOrgSecret(t *testing.T) { } const methodName = "RemoveSelectedRepoFromOrgSecret" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Dependabot.RemoveSelectedRepoFromOrgSecret(ctx, "o", "NAME", nil) + return err + }) + testBadOptions(t, methodName, func() (err error) { + _, err = client.Dependabot.RemoveSelectedRepoFromOrgSecret(ctx, "o", "NAME", &Repository{ID: nil}) + return err + }) testBadOptions(t, methodName, func() (err error) { _, err = client.Dependabot.RemoveSelectedRepoFromOrgSecret(ctx, "\n", "\n", repo) return err diff --git a/github/git_refs.go b/github/git_refs.go index 91eb6dd43fa..30c154ba667 100644 --- a/github/git_refs.go +++ b/github/git_refs.go @@ -7,6 +7,7 @@ package github import ( "context" + "errors" "fmt" "net/url" "strings" @@ -124,6 +125,13 @@ func (s *GitService) ListMatchingRefs(ctx context.Context, owner, repo string, o // //meta:operation POST /repos/{owner}/{repo}/git/refs func (s *GitService) CreateRef(ctx context.Context, owner string, repo string, ref *Reference) (*Reference, *Response, error) { + if ref == nil { + return nil, nil, errors.New("reference must be provided") + } + if ref.Ref == nil { + return nil, nil, errors.New("ref must be provided") + } + u := fmt.Sprintf("repos/%v/%v/git/refs", owner, repo) req, err := s.client.NewRequest("POST", u, &createRefRequest{ // back-compat with previous behavior that didn't require 'refs/' prefix @@ -149,6 +157,13 @@ func (s *GitService) CreateRef(ctx context.Context, owner string, repo string, r // //meta:operation PATCH /repos/{owner}/{repo}/git/refs/{ref} func (s *GitService) UpdateRef(ctx context.Context, owner string, repo string, ref *Reference, force bool) (*Reference, *Response, error) { + if ref == nil { + return nil, nil, errors.New("reference must be provided") + } + if ref.Ref == nil { + return nil, nil, errors.New("ref must be provided") + } + refPath := strings.TrimPrefix(*ref.Ref, "refs/") u := fmt.Sprintf("repos/%v/%v/git/refs/%v", owner, repo, refURLEscape(refPath)) req, err := s.client.NewRequest("PATCH", u, &updateRefRequest{ diff --git a/github/git_refs_test.go b/github/git_refs_test.go index 2fb4e8f952d..b105680e897 100644 --- a/github/git_refs_test.go +++ b/github/git_refs_test.go @@ -447,6 +447,14 @@ func TestGitService_CreateRef(t *testing.T) { } const methodName = "CreateRef" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Git.CreateRef(ctx, "o", "r", nil) + return err + }) + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Git.CreateRef(ctx, "o", "r", &Reference{Ref: nil}) + return err + }) testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.CreateRef(ctx, "\n", "\n", &Reference{ Ref: Ptr("refs/heads/b"), @@ -532,6 +540,14 @@ func TestGitService_UpdateRef(t *testing.T) { } const methodName = "UpdateRef" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Git.UpdateRef(ctx, "o", "r", nil, true) + return err + }) + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Git.UpdateRef(ctx, "o", "r", &Reference{Ref: nil}, true) + return err + }) testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.UpdateRef(ctx, "\n", "\n", &Reference{ Ref: Ptr("refs/heads/b"), diff --git a/github/git_tags.go b/github/git_tags.go index 67321566f73..951451e11cc 100644 --- a/github/git_tags.go +++ b/github/git_tags.go @@ -7,6 +7,7 @@ package github import ( "context" + "errors" "fmt" ) @@ -60,6 +61,10 @@ func (s *GitService) GetTag(ctx context.Context, owner string, repo string, sha // //meta:operation POST /repos/{owner}/{repo}/git/tags func (s *GitService) CreateTag(ctx context.Context, owner string, repo string, tag *Tag) (*Tag, *Response, error) { + if tag == nil { + return nil, nil, errors.New("tag must be provided") + } + u := fmt.Sprintf("repos/%v/%v/git/tags", owner, repo) // convert Tag into a createTagRequest diff --git a/github/git_tags_test.go b/github/git_tags_test.go index 26ee703be02..90310ddcf14 100644 --- a/github/git_tags_test.go +++ b/github/git_tags_test.go @@ -84,6 +84,10 @@ func TestGitService_CreateTag(t *testing.T) { } const methodName = "CreateTag" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Git.CreateTag(ctx, "o", "r", nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.CreateTag(ctx, "\n", "\n", inputTag) return err diff --git a/github/orgs_hooks.go b/github/orgs_hooks.go index c2eef77c92e..9ad380cb904 100644 --- a/github/orgs_hooks.go +++ b/github/orgs_hooks.go @@ -7,6 +7,7 @@ package github import ( "context" + "errors" "fmt" ) @@ -67,6 +68,10 @@ func (s *OrganizationsService) GetHook(ctx context.Context, org string, id int64 // //meta:operation POST /orgs/{org}/hooks func (s *OrganizationsService) CreateHook(ctx context.Context, org string, hook *Hook) (*Hook, *Response, error) { + if hook == nil { + return nil, nil, errors.New("hook must be provided") + } + u := fmt.Sprintf("orgs/%v/hooks", org) hookReq := &createHookRequest{ diff --git a/github/orgs_hooks_test.go b/github/orgs_hooks_test.go index aec8dda8e59..9829a2f5686 100644 --- a/github/orgs_hooks_test.go +++ b/github/orgs_hooks_test.go @@ -93,6 +93,10 @@ func TestOrganizationsService_CreateHook(t *testing.T) { } const methodName = "CreateHook" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Organizations.CreateHook(ctx, "o", nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.CreateHook(ctx, "\n", input) return err diff --git a/github/orgs_personal_access_tokens.go b/github/orgs_personal_access_tokens.go index 276fbbb4942..4abd6665ad5 100644 --- a/github/orgs_personal_access_tokens.go +++ b/github/orgs_personal_access_tokens.go @@ -7,6 +7,7 @@ package github import ( "context" + "errors" "fmt" "net/http" "net/url" @@ -155,6 +156,10 @@ func addListFineGrainedPATOptions(s string, opts *ListFineGrainedPATOptions) (st return s, err } + if opts == nil { + return "", errors.New("opts must be provided") + } + if len(opts.Owner) > 0 { ownerVals := make([]string, len(opts.Owner)) for i, owner := range opts.Owner { diff --git a/github/orgs_personal_access_tokens_test.go b/github/orgs_personal_access_tokens_test.go index 8322c403916..845dcf63e6b 100644 --- a/github/orgs_personal_access_tokens_test.go +++ b/github/orgs_personal_access_tokens_test.go @@ -141,6 +141,10 @@ func TestOrganizationsService_ListFineGrainedPersonalAccessTokens(t *testing.T) } const methodName = "ListFineGrainedPersonalAccessTokens" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Organizations.ListFineGrainedPersonalAccessTokens(ctx, "o", nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.ListFineGrainedPersonalAccessTokens(ctx, "\n", opts) return err diff --git a/github/repos.go b/github/repos.go index 2ce1df0596c..c8df90908e2 100644 --- a/github/repos.go +++ b/github/repos.go @@ -536,6 +536,10 @@ type createRepoRequest struct { //meta:operation POST /orgs/{org}/repos //meta:operation POST /user/repos func (s *RepositoriesService) Create(ctx context.Context, org string, repo *Repository) (*Repository, *Response, error) { + if repo == nil { + return nil, nil, errors.New("repository must be provided") + } + var u string if org != "" { u = fmt.Sprintf("orgs/%v/repos", org) diff --git a/github/repos_hooks.go b/github/repos_hooks.go index 67b80b857f1..862dd8b0e5f 100644 --- a/github/repos_hooks.go +++ b/github/repos_hooks.go @@ -7,6 +7,7 @@ package github import ( "context" + "errors" "fmt" "net/http" "net/url" @@ -83,6 +84,10 @@ type createHookRequest struct { // //meta:operation POST /repos/{owner}/{repo}/hooks func (s *RepositoriesService) CreateHook(ctx context.Context, owner, repo string, hook *Hook) (*Hook, *Response, error) { + if hook == nil { + return nil, nil, errors.New("hook must be provided") + } + u := fmt.Sprintf("repos/%v/%v/hooks", owner, repo) hookReq := &createHookRequest{ diff --git a/github/repos_hooks_test.go b/github/repos_hooks_test.go index e57a9161332..414deefc0b3 100644 --- a/github/repos_hooks_test.go +++ b/github/repos_hooks_test.go @@ -46,6 +46,10 @@ func TestRepositoriesService_CreateHook(t *testing.T) { } const methodName = "CreateHook" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Repositories.CreateHook(ctx, "o", "r", nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CreateHook(ctx, "\n", "\n", input) return err diff --git a/github/repos_pages.go b/github/repos_pages.go index 930f6000b7f..38913fc95af 100644 --- a/github/repos_pages.go +++ b/github/repos_pages.go @@ -7,6 +7,7 @@ package github import ( "context" + "errors" "fmt" ) @@ -107,6 +108,10 @@ type createPagesRequest struct { // //meta:operation POST /repos/{owner}/{repo}/pages func (s *RepositoriesService) EnablePages(ctx context.Context, owner, repo string, pages *Pages) (*Pages, *Response, error) { + if pages == nil { + return nil, nil, errors.New("pages must be provided") + } + u := fmt.Sprintf("repos/%v/%v/pages", owner, repo) pagesReq := &createPagesRequest{ diff --git a/github/repos_pages_test.go b/github/repos_pages_test.go index 505f6a8b6c1..fb2028e410e 100644 --- a/github/repos_pages_test.go +++ b/github/repos_pages_test.go @@ -57,6 +57,10 @@ func TestRepositoriesService_EnablePagesLegacy(t *testing.T) { } const methodName = "EnablePages" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Repositories.EnablePages(ctx, "o", "r", nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.EnablePages(ctx, "\n", "\n", input) return err diff --git a/github/repos_releases.go b/github/repos_releases.go index fb90c0fd240..87056071c9f 100644 --- a/github/repos_releases.go +++ b/github/repos_releases.go @@ -203,6 +203,10 @@ type repositoryReleaseRequest struct { // //meta:operation POST /repos/{owner}/{repo}/releases func (s *RepositoriesService) CreateRelease(ctx context.Context, owner, repo string, release *RepositoryRelease) (*RepositoryRelease, *Response, error) { + if release == nil { + return nil, nil, errors.New("release must be provided") + } + u := fmt.Sprintf("repos/%s/%s/releases", owner, repo) releaseReq := &repositoryReleaseRequest{ @@ -239,6 +243,10 @@ func (s *RepositoriesService) CreateRelease(ctx context.Context, owner, repo str // //meta:operation PATCH /repos/{owner}/{repo}/releases/{release_id} func (s *RepositoriesService) EditRelease(ctx context.Context, owner, repo string, id int64, release *RepositoryRelease) (*RepositoryRelease, *Response, error) { + if release == nil { + return nil, nil, errors.New("release must be provided") + } + u := fmt.Sprintf("repos/%s/%s/releases/%d", owner, repo, id) releaseReq := &repositoryReleaseRequest{ @@ -444,6 +452,10 @@ func (s *RepositoriesService) DeleteReleaseAsset(ctx context.Context, owner, rep // //meta:operation POST /repos/{owner}/{repo}/releases/{release_id}/assets func (s *RepositoriesService) UploadReleaseAsset(ctx context.Context, owner, repo string, id int64, opts *UploadOptions, file *os.File) (*ReleaseAsset, *Response, error) { + if file == nil { + return nil, nil, errors.New("file must be provided") + } + u := fmt.Sprintf("repos/%s/%s/releases/%d/assets", owner, repo, id) u, err := addOptions(u, opts) if err != nil { diff --git a/github/repos_releases_test.go b/github/repos_releases_test.go index 95d1c33e33a..6416086f346 100644 --- a/github/repos_releases_test.go +++ b/github/repos_releases_test.go @@ -251,6 +251,10 @@ func TestRepositoriesService_CreateRelease(t *testing.T) { } const methodName = "CreateRelease" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Repositories.CreateRelease(ctx, "o", "r", nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CreateRelease(ctx, "\n", "\n", input) return err @@ -314,6 +318,10 @@ func TestRepositoriesService_EditRelease(t *testing.T) { } const methodName = "EditRelease" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Repositories.EditRelease(ctx, "o", "r", 1, nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.EditRelease(ctx, "\n", "\n", 1, input) return err @@ -761,6 +769,10 @@ func TestRepositoriesService_UploadReleaseAsset(t *testing.T) { } const methodName = "UploadReleaseAsset" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Repositories.UploadReleaseAsset(ctx, "o", "r", int64(key), test.uploadOpts, nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.UploadReleaseAsset(ctx, "\n", "\n", int64(key), test.uploadOpts, file) return err diff --git a/github/repos_test.go b/github/repos_test.go index 0493484d9c0..1384fb40ca7 100644 --- a/github/repos_test.go +++ b/github/repos_test.go @@ -255,6 +255,10 @@ func TestRepositoriesService_Create_user(t *testing.T) { } const methodName = "Create" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Repositories.Create(ctx, "", nil) + return err + }) testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.Create(ctx, "\n", input) return err