diff --git a/lib/RemoveOutsideCollaborators.js b/lib/RemoveOutsideCollaborators.js index 4f2e443..1845333 100644 --- a/lib/RemoveOutsideCollaborators.js +++ b/lib/RemoveOutsideCollaborators.js @@ -2,18 +2,19 @@ const yaml = require('js-yaml') const noOrgConfig = false class RemoveOutsideCollaborators { - static analyze (github, repo, payload, logger) { + + static analyze(github, repo, payload, logger) { const defaults = require('./defaults') const orgRepo = (process.env.ORG_WIDE_REPO_NAME) ? process.env.ORG_WIDE_REPO_NAME : defaults.ORG_WIDE_REPO_NAME const filename = (process.env.FILE_NAME) ? process.env.FILE_NAME : defaults.FILE_NAME return github.repos.getContent({ - owner: repo.owner, - repo: orgRepo, - path: filename - }).catch(() => ({ - noOrgConfig - })) + owner: repo.owner, + repo: orgRepo, + path: filename + }).catch(() => ({ + noOrgConfig + })) .then((orgConfig) => { if ('noOrgConfig' in orgConfig) { return new RemoveOutsideCollaborators(github, repo, payload, logger, '').update() @@ -24,7 +25,7 @@ class RemoveOutsideCollaborators { }) } - constructor (github, repo, payload, logger, config) { + constructor(github, repo, payload, logger, config) { this.github = github this.repo = repo this.payload = payload @@ -32,7 +33,13 @@ class RemoveOutsideCollaborators { this.config = yaml.safeLoad(config) } - update () { + update() { + if (this.isRepoAddedByOrgMember(this.payload)) return + + this.executeWorkflow() + } + + executeWorkflow() { var configParams = Object.assign({}, require('./defaults'), this.config || {}) if (this.isRemoveCollaboratorsDisabled(configParams.enableCollaboratorRemoval, configParams.monitorOnly)) return @@ -46,39 +53,56 @@ class RemoveOutsideCollaborators { return this.executeMonitorOnly(configParams) } - isRemoveCollaboratorsDisabled (enableCollaboratorRemoval, monitorOnly) { + async isRepoAddedByOrgMember() { + var isMember = false + const orgParams = { + org: this.payload.organization.login, + username: this.payload.member.login + } + const toOrgParams = Object.assign({}, orgParams || {}) + + this.github.orgs.checkMembership(toOrgParams).then(({ + data + }) => { + return isMember === 'pending' ? false : true + }).catch(() => { + this.executeWorkflow() + }) + } + + isRemoveCollaboratorsDisabled(enableCollaboratorRemoval, monitorOnly) { if (this.payload.action === 'added' && !enableCollaboratorRemoval && !monitorOnly) { return true } return false } - isExcludedCollaborator (excludeCollaborators) { + isExcludedCollaborator(excludeCollaborators) { if (excludeCollaborators.includes(this.payload.member.login)) { return true } return false } - executeRemoval (configParams) { + executeRemoval(configParams) { var issueBody = this.formIssueBody(`

${configParams.removedIssueBody}

`, configParams.ccList) this.createIssue(configParams.removedIssueTitle, issueBody) this.removeCollaborator() } - executeMonitorOnly (configParams) { + executeMonitorOnly(configParams) { var issueBody = this.formIssueBody(`

${configParams.monitorIssueBody}

`, configParams.ccList) this.createIssue(configParams.monitorIssueTitle, issueBody) } - formIssueBody (body, ccList) { + formIssueBody(body, ccList) { const owner = this.payload.sender.login var issueBody = body + `\n\n

Collaborator added: ${owner}

\n\n---` issueBody += (ccList) ? `\n\n
/cc ${ccList}
` : '' return issueBody } - createIssue (title, body) { + createIssue(title, body) { const issueParams = { title: title, body: body @@ -87,7 +111,7 @@ class RemoveOutsideCollaborators { this.github.issues.create(createIssueParams) } - removeCollaborator () { + removeCollaborator() { const removeParams = { owner: this.payload.repository.owner.login, repo: this.repo.repo, diff --git a/test/lib/plugins/RemoveOutsideCollaborators.test.js b/test/lib/plugins/RemoveOutsideCollaborators.test.js index c104208..4d52e03 100644 --- a/test/lib/plugins/RemoveOutsideCollaborators.test.js +++ b/test/lib/plugins/RemoveOutsideCollaborators.test.js @@ -7,7 +7,7 @@ describe('removeOutsideCollaborators', () => { return new RemoveOutsideCollaborators(github, {owner: 'Hollywood', repo: 'test', username: 'Usr45'}, payload, console, yaml) } - let payloadRemoveCollaborator = { action: 'added', member: { login: 'Usr45' }, repository: { name: 'test', owner: { login: 'Usr45' } }, sender: { login: 'Usr45' } } + let payloadRemoveCollaborator = { action: 'added', member: { login: 'Usr45' }, repository: { name: 'test', owner: { login: 'Usr45' } }, organization: { login: 'Albatoss'}, sender: { login: 'Usr45' } } beforeEach(() => { github = { @@ -17,6 +17,9 @@ describe('removeOutsideCollaborators', () => { }, issues: { create: jest.fn().mockImplementation(() => Promise.resolve([])) + }, + orgs: { + getOrgMembership: jest.fn().mockImplementation(() => Promise.resolve([])) } } }) @@ -26,14 +29,20 @@ describe('removeOutsideCollaborators', () => { var spyMonitorOnly beforeEach(() => { + spyIsOrgMember = jest.spyOn(RemoveOutsideCollaborators.prototype, 'isRepoAddedByOrgMember') spyExecuteRemoval = jest.spyOn(RemoveOutsideCollaborators.prototype, 'executeRemoval') spyMonitorOnly = jest.spyOn(RemoveOutsideCollaborators.prototype, 'executeMonitorOnly') }) afterEach(function () { + spyIsOrgMember.mockClear() spyExecuteRemoval.mockClear() spyMonitorOnly.mockClear() }) + it('repo created by an org member', () => { + expect(spyExecuteRemoval).not.toHaveBeenCalled() + }) + it('added and enableCollaboratorRemoval is disabled', () => { const config = configure(payloadRemoveCollaborator, ` monitorOnly: true