11import * as core from "@actions/core" ;
2- import { z } from "zod" ;
3- import { GroupValues , InputValues } from "./types" ;
4- const InputZodSchema = z . object ( {
5- token : z
6- . string ( )
7- . optional ( )
8- . transform ( ( val ) => val || process . env . GITHUB_TOKEN ) ,
9- actor : z
10- . string ( )
11- . optional ( )
12- . transform ( ( val ) => val || process . env . GITHUB_ACTOR || "" ) ,
13- authorizedGroups : z
14- . string ( )
15- . optional ( )
16- . or ( z . array ( z . nativeEnum ( GroupValues ) ) )
17- . transform ( ( val ) => {
18- if ( typeof val === "string" ) {
19- try {
20- const parsed = JSON . parse ( val ) ;
21- return parsed ;
22- } catch ( error ) {
23- return [ val ] ;
24- }
25- }
26- return val ;
27- } )
28- . refine ( ( val ) => {
29- if ( ! val ) return val ;
30- return Array . isArray ( val ) ;
31- } ) ,
32- authorizedActors : z
33- . string ( )
34- . optional ( )
35- . or ( z . array ( z . string ( ) ) )
36- . transform ( ( val ) => {
37- if ( typeof val === "string" ) {
38- try {
39- const parsed = JSON . parse ( val ) ;
40- return parsed ;
41- } catch ( error ) {
42- return [ val ] ;
43- }
44- }
45- return val ;
46- } )
47- . refine ( ( val ) => {
48- if ( ! val ) return val ;
49- return Array . isArray ( val ) ;
50- } ) ,
51- failSilently : z . boolean ( ) . default ( false ) ,
52- failureMessage : z
53- . string ( )
54- . default ( "Actor is not authorised to trigger this Workflow." ) ,
55- } ) ;
56- const getInput = ( ) : InputValues => {
2+ import { InputZodSchema } from "./types" ;
3+ import { Octokit } from "@octokit/rest" ;
4+
5+ async function getMembers ( org : string , token : string ) {
6+ const octokit = new Octokit ( {
7+ auth : token ,
8+ } ) ;
9+ const membersList = await octokit . orgs . listMembers ( {
10+ org,
11+ } ) ;
12+ const memberData : Promise < {
13+ login : string ;
14+ role : string ;
15+ } > [ ] = membersList . data . map ( async ( member : any ) => {
16+ const membership = await octokit . orgs . getMembershipForUser ( {
17+ org,
18+ username : member . login ,
19+ } ) ;
20+ return {
21+ login : member . login as string ,
22+ role : membership . data . role as string ,
23+ } ;
24+ } ) ;
25+ return Promise . all ( memberData ) ;
26+ }
27+ const getInput = ( ) => {
5728 const results = {
29+ githubToken : core . getInput ( "githubToken" ) ,
30+ githubOrg : core . getInput ( "githubOrg" ) ,
5831 actor : core . getInput ( "actor" ) ,
59- authorizedActors : core . getInput ( "authorizedActors" , { required : true } ) ,
32+ authorizedGroups : core . getInput ( "authorizedGroups" ) ,
33+ authorizedActors : core . getInput ( "authorizedActors" ) ,
6034 failSilently : core . getInput ( "failSilently" ) === "true" || false ,
6135 failureMessage :
6236 core . getInput ( "failureMessage" ) ||
@@ -77,8 +51,9 @@ async function run(): Promise<void> {
7751
7852 try {
7953 core . debug ( `Reading input ...` ) ;
80-
8154 const {
55+ githubOrg,
56+ githubToken,
8257 actor,
8358 authorizedActors,
8459 failSilently,
@@ -88,11 +63,21 @@ async function run(): Promise<void> {
8863
8964 core . debug ( `Got actor: ${ actor } ` ) ;
9065 core . debug ( `Got a list of authorised actors ${ authorizedActors } ` ) ;
66+ core . debug ( `Got a list of authorised groups ${ authorizedGroups } ` ) ;
67+ core . debug ( `Got a token ${ githubToken } ` ) ;
68+ core . debug ( `Got an org ${ githubOrg } ` ) ;
9169 const newAuthorizedActors = authorizedActors || [ ] ;
92-
70+ //handle access by organization
71+ if ( authorizedGroups && githubToken && githubOrg ) {
72+ const members = await getMembers ( githubOrg , githubToken ) ;
73+ const users = members
74+ . filter ( ( m ) => authorizedGroups . includes ( m . role ) )
75+ . map ( ( m ) => m . login ) ;
76+ newAuthorizedActors . push ( ...users ) ;
77+ }
9378 const isAuthorisedActor = newAuthorizedActors . includes ( actor ) ;
94- core . setOutput ( "isAuthorisedActor" , isAuthorisedActor ) ;
9579
80+ core . setOutput ( "isAuthorisedActor" , isAuthorisedActor ) ;
9681 core . debug ( `isAuthorisedActor: ${ isAuthorisedActor ? "Yes" : "No" } .` ) ;
9782 core . debug ( `Fail silently? ${ failSilently ? "Yes" : "No" } !` ) ;
9883
0 commit comments