Skip to content

Commit

Permalink
Add support for setting actions permissions on a repository (#2315)
Browse files Browse the repository at this point in the history
Fixes: #2297.
  • Loading branch information
Florian Wagner committed Mar 25, 2022
1 parent 631fa70 commit 6d5a72e
Show file tree
Hide file tree
Showing 9 changed files with 464 additions and 2 deletions.
80 changes: 80 additions & 0 deletions example/actionpermissions/main.go
@@ -0,0 +1,80 @@
// 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.

// The actionpermissions command utilizes go-github as a cli tool for
// changing GitHub Actions related permission settings for a repository.
package main

import (
"context"
"flag"
"fmt"
"log"
"os"

"github.com/google/go-github/v43/github"
"golang.org/x/oauth2"
)

var (
name = flag.String("name", "", "repo to change Actions permissions.")
owner = flag.String("owner", "", "owner of targeted repo.")
)

func main() {
flag.Parse()
token := os.Getenv("GITHUB_AUTH_TOKEN")
if token == "" {
log.Fatal("Unauthorized: No token present")
}
if *name == "" {
log.Fatal("No name: repo name must be given")
}
if *owner == "" {
log.Fatal("No owner: owner of repo must be given")
}
ctx := context.Background()
ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token})
tc := oauth2.NewClient(ctx, ts)
client := github.NewClient(tc)

actionsPermissionsRepository, _, err := client.Repositories.GetActionsPermissions(ctx, *owner, *name)
if err != nil {
log.Fatal(err)
}

fmt.Printf("Current ActionsPermissions %s\n", actionsPermissionsRepository.String())

actionsPermissionsRepository = &github.ActionsPermissionsRepository{Enabled: github.Bool(true), AllowedActions: github.String("selected")}
_, _, err = client.Repositories.EditActionsPermissions(ctx, *owner, *name, *actionsPermissionsRepository)
if err != nil {
log.Fatal(err)
}

fmt.Printf("Current ActionsPermissions %s\n", actionsPermissionsRepository.String())

actionsAllowed, _, err := client.Repositories.GetActionsAllowed(ctx, *owner, *name)
if err != nil {
log.Fatal(err)
}

fmt.Printf("Current ActionsAllowed %s\n", actionsAllowed.String())

actionsAllowed = &github.ActionsAllowed{GithubOwnedAllowed: github.Bool(true), VerifiedAllowed: github.Bool(false), PatternsAllowed: []string{"a/b"}}
_, _, err = client.Repositories.EditActionsAllowed(ctx, *owner, *name, *actionsAllowed)
if err != nil {
log.Fatal(err)
}

fmt.Printf("Current ActionsAllowed %s\n", actionsAllowed.String())

actionsPermissionsRepository = &github.ActionsPermissionsRepository{Enabled: github.Bool(true), AllowedActions: github.String("all")}
_, _, err = client.Repositories.EditActionsPermissions(ctx, *owner, *name, *actionsPermissionsRepository)
if err != nil {
log.Fatal(err)
}

fmt.Printf("Current ActionsPermissions %s\n", actionsPermissionsRepository.String())
}
24 changes: 24 additions & 0 deletions github/github-accessors.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 30 additions & 0 deletions github/github-accessors_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions github/github-stringify_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions github/orgs_actions_allowed.go
Expand Up @@ -10,9 +10,9 @@ import (
"fmt"
)

// ActionsAllowed represents selected actions that are allowed in an organization.
// ActionsAllowed represents selected actions that are allowed.
//
// GitHub API docs: https://docs.github.com/en/rest/reference/actions#get-allowed-actions-for-an-organization
// GitHub API docs: https://docs.github.com/en/rest/reference/actions#set-allowed-actions-and-workflows-for-an-organization--parameters
type ActionsAllowed struct {
GithubOwnedAllowed *bool `json:"github_owned_allowed,omitempty"`
VerifiedAllowed *bool `json:"verified_allowed,omitempty"`
Expand Down
49 changes: 49 additions & 0 deletions github/repos_actions_allowed.go
@@ -0,0 +1,49 @@
// 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"
)

// GetActionsAllowed gets the actions that are allowed in a repository.
//
// GitHub API docs: https://docs.github.com/en/rest/reference/actions#get-allowed-actions-and-workflows-for-a-repository
func (s *RepositoriesService) GetActionsAllowed(ctx context.Context, org, repo string) (*ActionsAllowed, *Response, error) {
u := fmt.Sprintf("repos/%v/%v/actions/permissions/selected-actions", org, repo)
req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

actionsAllowed := new(ActionsAllowed)
resp, err := s.client.Do(ctx, req, actionsAllowed)
if err != nil {
return nil, resp, err
}

return actionsAllowed, resp, nil
}

// EditActionsAllowed sets the actions that are allowed in a repository.
//
// GitHub API docs: https://docs.github.com/en/rest/reference/actions#set-allowed-actions-and-workflows-for-a-repository
func (s *RepositoriesService) EditActionsAllowed(ctx context.Context, org, repo string, actionsAllowed ActionsAllowed) (*ActionsAllowed, *Response, error) {
u := fmt.Sprintf("repos/%v/%v/actions/permissions/selected-actions", org, repo)
req, err := s.client.NewRequest("PUT", u, actionsAllowed)
if err != nil {
return nil, nil, err
}

p := new(ActionsAllowed)
resp, err := s.client.Do(ctx, req, p)
if err != nil {
return nil, resp, err
}

return p, resp, nil
}
93 changes: 93 additions & 0 deletions github/repos_actions_allowed_test.go
@@ -0,0 +1,93 @@
// 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"
"encoding/json"
"fmt"
"net/http"
"testing"

"github.com/google/go-cmp/cmp"
)

func TestRepositoryService_GetActionsAllowed(t *testing.T) {
client, mux, _, teardown := setup()
defer teardown()

mux.HandleFunc("/repos/o/r/actions/permissions/selected-actions", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
fmt.Fprint(w, `{"github_owned_allowed":true, "verified_allowed":false, "patterns_allowed":["a/b"]}`)
})

ctx := context.Background()
org, _, err := client.Repositories.GetActionsAllowed(ctx, "o", "r")
if err != nil {
t.Errorf("Repositories.GetActionsAllowed returned error: %v", err)
}
want := &ActionsAllowed{GithubOwnedAllowed: Bool(true), VerifiedAllowed: Bool(false), PatternsAllowed: []string{"a/b"}}
if !cmp.Equal(org, want) {
t.Errorf("Repositories.GetActionsAllowed returned %+v, want %+v", org, want)
}

const methodName = "GetActionsAllowed"
testBadOptions(t, methodName, func() (err error) {
_, _, err = client.Repositories.GetActionsAllowed(ctx, "\n", "\n")
return err
})

testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
got, resp, err := client.Repositories.GetActionsAllowed(ctx, "o", "r")
if got != nil {
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
}
return resp, err
})
}

func TestRepositoriesService_EditActionsAllowed(t *testing.T) {
client, mux, _, teardown := setup()
defer teardown()
input := &ActionsAllowed{GithubOwnedAllowed: Bool(true), VerifiedAllowed: Bool(false), PatternsAllowed: []string{"a/b"}}

mux.HandleFunc("/repos/o/r/actions/permissions/selected-actions", func(w http.ResponseWriter, r *http.Request) {
v := new(ActionsAllowed)
json.NewDecoder(r.Body).Decode(v)

testMethod(t, r, "PUT")
if !cmp.Equal(v, input) {
t.Errorf("Request body = %+v, want %+v", v, input)
}

fmt.Fprint(w, `{"github_owned_allowed":true, "verified_allowed":false, "patterns_allowed":["a/b"]}`)
})

ctx := context.Background()
org, _, err := client.Repositories.EditActionsAllowed(ctx, "o", "r", *input)
if err != nil {
t.Errorf("Repositories.EditActionsAllowed returned error: %v", err)
}

want := &ActionsAllowed{GithubOwnedAllowed: Bool(true), VerifiedAllowed: Bool(false), PatternsAllowed: []string{"a/b"}}
if !cmp.Equal(org, want) {
t.Errorf("Repositories.EditActionsAllowed returned %+v, want %+v", org, want)
}

const methodName = "EditActionsAllowed"
testBadOptions(t, methodName, func() (err error) {
_, _, err = client.Repositories.EditActionsAllowed(ctx, "\n", "\n", *input)
return err
})

testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
got, resp, err := client.Repositories.EditActionsAllowed(ctx, "o", "r", *input)
if got != nil {
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
}
return resp, err
})
}
62 changes: 62 additions & 0 deletions github/repos_actions_permissions.go
@@ -0,0 +1,62 @@
// 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"
)

// ActionsPermissionsRepository represents a policy for repositories and allowed actions in a repository.
//
// GitHub API docs: https://docs.github.com/en/rest/reference/actions#set-github-actions-permissions-for-a-repository--parameters
type ActionsPermissionsRepository struct {
Enabled *bool `json:"enabled,omitempty"`
AllowedActions *string `json:"allowed_actions,omitempty"`
SelectedActionsURL *string `json:"selected_actions_url,omitempty"`
}

func (a ActionsPermissionsRepository) String() string {
return Stringify(a)
}

// GetActionsPermissions gets the GitHub Actions permissions policy for repositories and allowed actions in a repository.
//
// GitHub API docs: https://docs.github.com/en/rest/reference/actions#get-github-actions-permissions-for-a-repository
func (s *RepositoriesService) GetActionsPermissions(ctx context.Context, owner, repo string) (*ActionsPermissionsRepository, *Response, error) {
u := fmt.Sprintf("repos/%v/%v/actions/permissions", owner, repo)
req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

permissions := new(ActionsPermissionsRepository)
resp, err := s.client.Do(ctx, req, permissions)
if err != nil {
return nil, resp, err
}

return permissions, resp, nil
}

// EditActionsPermissions sets the permissions policy for repositories and allowed actions in a repository.
//
// GitHub API docs: https://docs.github.com/en/rest/reference/actions#set-github-actions-permissions-for-a-repository
func (s *RepositoriesService) EditActionsPermissions(ctx context.Context, owner, repo string, actionsPermissionsRepository ActionsPermissionsRepository) (*ActionsPermissionsRepository, *Response, error) {
u := fmt.Sprintf("repos/%v/%v/actions/permissions", owner, repo)
req, err := s.client.NewRequest("PUT", u, actionsPermissionsRepository)
if err != nil {
return nil, nil, err
}

permissions := new(ActionsPermissionsRepository)
resp, err := s.client.Do(ctx, req, permissions)
if err != nil {
return nil, resp, err
}

return permissions, resp, nil
}

0 comments on commit 6d5a72e

Please sign in to comment.