From ef3cede81754d4fc211093421d9483c766dfb4ae Mon Sep 17 00:00:00 2001 From: Nathan Evans Date: Tue, 17 Mar 2015 09:19:25 -0700 Subject: [PATCH 01/14] #112 - initial team auto-creation --- app/server/components/repositories/teams.js | 60 +++++++++++++++++-- .../components/repositories/util/repos.js | 19 ++++++ .../components/repositories/util/teams.js | 12 ++++ app/server/components/services/github.js | 1 + app/server/middleware/permissions.js | 25 +++++++- 5 files changed, 109 insertions(+), 8 deletions(-) diff --git a/app/server/components/repositories/teams.js b/app/server/components/repositories/teams.js index add7e0a..f14a1bb 100644 --- a/app/server/components/repositories/teams.js +++ b/app/server/components/repositories/teams.js @@ -3,6 +3,7 @@ var permUtil = require('./util/permissions'), repoUtil = require('./util/repos'), teamUtil = require('./util/teams'), + debug = require('debug')('app:repositories:teams'), getPrefix, getTeam; @@ -17,7 +18,56 @@ getTeam = (teams, prefix, permission) => { module.exports = { - edit (username, repoId, team) { + + //checks if a permissive team exists to manage a given repo at specified permission + check (repoId, permission) { + + return new Promise((resolve, reject) => { + + debug('checking if team exists for repo [' + repoId + '] at [' + permission + ']'); + + repoUtil.getRepoById(repoId).then((repo) => { + + let prefix = getPrefix(repo); + + teamUtil.getGithubTeams().then((teams) => { + + let team = getTeam(teams, prefix, permission); + resolve(typeof team !== 'undefined'); + + }); + + }); + + }); + + }, + + //create a team for a given repo and permission + create (repoId, permission) { + + return new Promise((resolve, reject) => { + + debug('creating team for [' + repoId + '] at [' + permission + ']'); + + repoUtil.getRepoById(repoId).then((repo) => { + + teamUtil.createGithubTeamForRepoPermission(repo, permission).then((team) => { + + debug('created team [', team.id + ']'); + resolve(team); + + }).catch((err) => { + reject(err); + }); + + }); + + }); + + }, + + edit (username, repoId, permission) { // get permission map return permUtil.getPermissionMap().then(map => { @@ -26,19 +76,19 @@ module.exports = { current = users[username] || permUtil.getDefaultPermissions(); // user already on the team - if (current.permissive === team) { + if (current.permissive === permission) { return; } // need repo name and team id - return repoUtil.getGithubRepo(repoId).then(repo => { + return repoUtil.getRepoById(repoId).then(repo => { let prefix = getPrefix(repo); return teamUtil.getGithubTeams().then(teams => { let oldTeam = getTeam(teams, prefix, current.permissive), - newTeam = getTeam(teams, prefix, team); + newTeam = getTeam(teams, prefix, permission); // remove-only, don't add to new team - if (team === 'none') { + if (permission === 'none') { return teamUtil.removeFromGithubTeam(username, oldTeam.id); } diff --git a/app/server/components/repositories/util/repos.js b/app/server/components/repositories/util/repos.js index 3d4d3bb..49937cd 100644 --- a/app/server/components/repositories/util/repos.js +++ b/app/server/components/repositories/util/repos.js @@ -7,6 +7,7 @@ convertGithubRepo = (repo) => { return { 'id': repo.id, 'name': repo.name, + 'full_name': repo.full_name, 'description': repo.description, 'public': !repo.private }; @@ -17,6 +18,24 @@ module.exports = { getGithubRepos () { let args = provider.getDefaultListArgs(); return provider.github.getRepos(args).then(repos => repos.map(repo => convertGithubRepo(repo))); + }, + + getRepoById(repoId) { + + return new Promise((resolve, reject) => { + + this.getGithubRepos().then((repos) => { + + //repoId is coming in as a string, hence coercion + let id = parseInt(repoId), + repo = repos.find(r => r.id === id); + + resolve(repo); + + }); + + }); + } }; diff --git a/app/server/components/repositories/util/teams.js b/app/server/components/repositories/util/teams.js index 2291c8a..ec0d7b0 100644 --- a/app/server/components/repositories/util/teams.js +++ b/app/server/components/repositories/util/teams.js @@ -2,6 +2,10 @@ var provider = require('./provider'); +let getPrefix = (repo) => { + return 'zzz-permissive-repo-' + repo.name + '-'; +}; + module.exports = { getGithubTeams () { @@ -21,6 +25,14 @@ module.exports = { return provider.github.getTeamRepos(args); }, + createGithubTeamForRepoPermission (repo, permission) { + let args = provider.getDefaultListArgs(); + args.name = getPrefix(repo) + permission; + args.repo_names = [repo.full_name]; + args.permission = permission; + return provider.github.createTeam(args); + }, + addToGithubTeam(username, teamId) { let args = provider.getDefaultItemArgs(); args.id = teamId; diff --git a/app/server/components/services/github.js b/app/server/components/services/github.js index 0868746..2f72e2c 100644 --- a/app/server/components/services/github.js +++ b/app/server/components/services/github.js @@ -39,6 +39,7 @@ module.exports = { getUser: Bluebird.promisify(github.user.getFrom), getRepos: Bluebird.promisify(github.repos.getFromOrg), getTeams: Bluebird.promisify(github.orgs.getTeams), + createTeam: Bluebird.promisify(github.orgs.createTeam), getTeamMembers: Bluebird.promisify(github.orgs.getTeamMembers), getTeamRepos: Bluebird.promisify(github.orgs.getTeamRepos), addTeamMember: Bluebird.promisify(github.orgs.addTeamMember), diff --git a/app/server/middleware/permissions.js b/app/server/middleware/permissions.js index 9734101..3e79e12 100644 --- a/app/server/middleware/permissions.js +++ b/app/server/middleware/permissions.js @@ -18,9 +18,28 @@ module.exports = { repoId = params.id, permission = params.permission; - teamRepository.edit(username, repoId, permission).then(resp => { - next(); - }).catch(err => next(err)); + teamRepository.check(repoId, permission).then((exists) => { + console.log('team exists for repo management: ' + exists); + + if (exists) { + + teamRepository.edit(username, repoId, permission).then(resp => { + next(); + }).catch(err => next(err)); + + } else { + + teamRepository.create(repoId, permission).then(team => { + + teamRepository.edit(username, repoId, permission).then(resp => { + next(); + }).catch(err => next(err)); + + }); + } + }); + + } }; From 015109e63e3c51190dd1f7db64d8bc307b1fe590 Mon Sep 17 00:00:00 2001 From: Nathan Evans Date: Tue, 17 Mar 2015 09:38:34 -0700 Subject: [PATCH 02/14] #112 - moved team creation to separate middleware --- app/server/apps/repos/routes.js | 1 + app/server/apps/users/routes.js | 1 + app/server/middleware/permissions.js | 40 +++++++++++++++------------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/app/server/apps/repos/routes.js b/app/server/apps/repos/routes.js index 61b43c6..490d6eb 100644 --- a/app/server/apps/repos/routes.js +++ b/app/server/apps/repos/routes.js @@ -22,6 +22,7 @@ module.exports = { path: '/repos/:id/users/:username/permissions/:permission', middleware: [ auth.isAuthenticated, + permissions.createTeamForRepoPermission, permissions.editRepoPermissionForUser, send.noContent ] diff --git a/app/server/apps/users/routes.js b/app/server/apps/users/routes.js index ae73a13..4e344ca 100644 --- a/app/server/apps/users/routes.js +++ b/app/server/apps/users/routes.js @@ -21,6 +21,7 @@ module.exports = { path: '/users/:username/repos/:id/permissions/:permission', middleware: [ auth.isAuthenticated, + permissions.createTeamForRepoPermission, permissions.editRepoPermissionForUser, send.noContent ] diff --git a/app/server/middleware/permissions.js b/app/server/middleware/permissions.js index 3e79e12..dd83084 100644 --- a/app/server/middleware/permissions.js +++ b/app/server/middleware/permissions.js @@ -8,37 +8,41 @@ var teamRepository = require('../components/repositories/teams'), */ module.exports = { - editRepoPermissionForUser (req, res, next) { - debug('editing user repo permission level [' + req.path + ']'); + createTeamForRepoPermission (req, res, next) { + + debug('checking for team existence and creating if necessary'); debug('params:' + JSON.stringify(req.params, null, 2)); - // get params - let params = req.params, - username = params.username, - repoId = params.id, + let repoId = params.id, permission = params.permission; teamRepository.check(repoId, permission).then((exists) => { - console.log('team exists for repo management: ' + exists); - - if (exists) { + console.log('team exists for repo management?: ' + exists); - teamRepository.edit(username, repoId, permission).then(resp => { + if (!exists) { + teamRepository.create(repoId, permission).then(() => { next(); }).catch(err => next(err)); - } else { + next(); + } + + }); - teamRepository.create(repoId, permission).then(team => { + }, - teamRepository.edit(username, repoId, permission).then(resp => { - next(); - }).catch(err => next(err)); + editRepoPermissionForUser (req, res, next) { + debug('editing user repo permission level [' + req.path + ']'); + debug('params:' + JSON.stringify(req.params, null, 2)); - }); - } - }); + let params = req.params, + username = params.username, + repoId = params.id, + permission = params.permission; + teamRepository.edit(username, repoId, permission).then(() => { + next(); + }).catch(err => next(err)); } From ce528ef0ab0506f9c1c67f1ce20bf63474c58ada Mon Sep 17 00:00:00 2001 From: Nathan Evans Date: Tue, 17 Mar 2015 10:02:47 -0700 Subject: [PATCH 03/14] #112 - fixed mock passport user to match mock data --- app/server/middleware/permissions.js | 9 +++++---- app/server/mock-passport-middleware.js | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/server/middleware/permissions.js b/app/server/middleware/permissions.js index dd83084..fa52dc0 100644 --- a/app/server/middleware/permissions.js +++ b/app/server/middleware/permissions.js @@ -13,7 +13,8 @@ module.exports = { debug('checking for team existence and creating if necessary'); debug('params:' + JSON.stringify(req.params, null, 2)); - let repoId = params.id, + let params = req.params, + repoId = params.id, permission = params.permission; teamRepository.check(repoId, permission).then((exists) => { @@ -40,9 +41,9 @@ module.exports = { repoId = params.id, permission = params.permission; - teamRepository.edit(username, repoId, permission).then(() => { - next(); - }).catch(err => next(err)); + teamRepository.edit(username, repoId, permission).then(() => { + next(); + }).catch(err => next(err)); } diff --git a/app/server/mock-passport-middleware.js b/app/server/mock-passport-middleware.js index ef4b9c6..f3e9d74 100644 --- a/app/server/mock-passport-middleware.js +++ b/app/server/mock-passport-middleware.js @@ -23,5 +23,5 @@ module.exports = { }, // TODO ... PUT Mock users in a seperate file so we can tests users that are - mockUser: { username: "TestUser", displayName: "Test User", id: 1 } + mockUser: { username: "testuser3", displayName: "Test User 3", id: 1 } }; From b8d04d787a42f75e708978795dfde4469b1f428b Mon Sep 17 00:00:00 2001 From: Nathan Evans Date: Tue, 17 Mar 2015 10:03:08 -0700 Subject: [PATCH 04/14] #112 - fixed node start for new app.js location with babel --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fc16f99..16bdf3b 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ }, "scripts": { "test": "./node_modules/.bin/gulp", - "start": "node app/app.js", + "start": "node app.js", "postinstall": "cd app/client && bower install" }, "browser": { From aea37abaccbed1d8baa4e7873e847eddad9db203 Mon Sep 17 00:00:00 2001 From: Nathan Evans Date: Tue, 17 Mar 2015 10:08:07 -0700 Subject: [PATCH 05/14] #112 - removed start/halt server from itest runs --- gulp.tasks.js | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/gulp.tasks.js b/gulp.tasks.js index 1817a75..afdd015 100644 --- a/gulp.tasks.js +++ b/gulp.tasks.js @@ -66,7 +66,7 @@ gulp.task('test', () => { }); }); -gulp.task('exec-itest', ['start-server'], () => { +gulp.task('itest', () => { return new Bluebird((resolve, reject) => { instrumentSource() .on('finish', () => { @@ -78,12 +78,6 @@ gulp.task('exec-itest', ['start-server'], () => { }); }); -gulp.task('itest', [ - 'start-server', - 'exec-itest', - 'halt-server' -]); - gulp.task('report-coverage', () => { return gulp.src('coverage/**/lcov.info') .pipe(coveralls()); @@ -125,10 +119,6 @@ gulp.task('start-server', () => { }); }); -gulp.task('halt-server', ['exec-itest'], () => { - devServer.emit('quit'); -}); - gulp.task('default', (cb) => { runSequence( 'static-checks', From bac20bb4aee241042280e4370ed3ad7d5f271a1a Mon Sep 17 00:00:00 2001 From: Nathan Evans Date: Tue, 17 Mar 2015 10:32:16 -0700 Subject: [PATCH 06/14] #112 - added mock for createTeam --- app/server/components/services/github.mock.js | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/app/server/components/services/github.mock.js b/app/server/components/services/github.mock.js index d64ea91..9c9bb5b 100644 --- a/app/server/components/services/github.mock.js +++ b/app/server/components/services/github.mock.js @@ -17,6 +17,7 @@ //jscs:disable disallowDanglingUnderscores var mask = require('json-mask'), debug = require('debug')('app:services:github-mock'), + org = 'testorg', users = { 'testuser1': { login: 'testuser1', @@ -38,12 +39,14 @@ var mask = require('json-mask'), '1': { id: 1, name: 'Test-Repo-1', + full_name: org + '/' + 'Test-Repo-1', description: 'A library for managing file io.', private: false }, '2': { id: 2, name: 'Test-Repo-2', + full_name: org + '/' + 'Test-Repo-2', private: true } }, @@ -75,13 +78,20 @@ var mask = require('json-mask'), permission: 'admin', _repos: [1], _users: ['testuser3'] + }, + '5': { + id: 5, + name: 'zzz-permissive-repo-Test-Repo-2-admin', + permission: 'admin', + _repos: [2], + _users: ['testuser3'] } }; module.exports = { config: { - org: process.env.GITHUB_ORG + org: org }, getUsers () { @@ -129,6 +139,31 @@ module.exports = { }); }, + createTeam (msg) { + debug('creating new mock team ' + msg.name); + return new Promise((resolve, reject) => { + let repo, + id = Math.round(Math.random() * 100000), + team = { + id: id, + name: msg.name, + permission: msg.permission, + _users: [] + }; + + //createTeam API method gets a list of repo full names - need to map that to a mock id + Object.keys(repos).forEach((key) => { + let r = repos[key]; + if (r.full_name === msg.repo_names[0]) { + repo = r; + } + }); + team._repos = [repo.id]; + teams[id] = team; + resolve(team); + }); + }, + getTeamMembers (msg) { let id = msg.id; debug('looking up mock team [' + id + '] members'); From e66fd1e903cfcb700e105ad8d901c88f9521844b Mon Sep 17 00:00:00 2001 From: Nathan Evans Date: Tue, 17 Mar 2015 10:38:35 -0700 Subject: [PATCH 07/14] #112 - fixed link creation logic to use correct user --- app/server/middleware/repos.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/server/middleware/repos.js b/app/server/middleware/repos.js index f17dc3b..4218502 100644 --- a/app/server/middleware/repos.js +++ b/app/server/middleware/repos.js @@ -33,20 +33,22 @@ module.exports = { }, listReposLinks (req, res, next) { - debug('checking for links on repo list'); let repos = req.entity, user = req.query.permission_user, username = req.session.passport.user.username; + debug('checking for links on repo list for logged in [' + username + '] to edit [' + user + ']'); + if (user) { permissionRepository.getRepoPermissionsForUser(repos, username).then(permissions => { repos.forEach(repo => { let permission = permissions[repo.id]; + debug('got permission for [' + username + '] against repo [' + repo.id + ']', permission); if (permission.permissive === 'admin' || permission.github === 'admin') { repo.links = [{ rel: 'edit-user-permission', - href: 'repos/' + repo.id + '/users/' + username + '/permissions/{permission}', + href: 'repos/' + repo.id + '/users/' + user + '/permissions/{permission}', method: 'PUT' }]; } From ccfd20f8e1f35182615fa9b43144f4f5e4b3a058 Mon Sep 17 00:00:00 2001 From: Nathan Evans Date: Tue, 17 Mar 2015 10:41:49 -0700 Subject: [PATCH 08/14] #112 - updated itests to use mock user with admin --- app/server/it/TestRepos.js | 6 +++--- app/server/it/TestUsers.js | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/server/it/TestRepos.js b/app/server/it/TestRepos.js index e4e41e7..760e65e 100644 --- a/app/server/it/TestRepos.js +++ b/app/server/it/TestRepos.js @@ -57,9 +57,9 @@ describe('Repo model HTTP requests', function () { chai.assert.ok(items[0].id); }); - //TODO: use authenticated user to check for links - it('repo has no links', () => { - chai.assert.isUndefined(items[0].links); + //mock user is testuser3, who has admin permission + it('repo has links', () => { + chai.assert.ok(items[0].links); }); }); diff --git a/app/server/it/TestUsers.js b/app/server/it/TestUsers.js index 512a217..05e719a 100644 --- a/app/server/it/TestUsers.js +++ b/app/server/it/TestUsers.js @@ -57,9 +57,9 @@ describe('User model HTTP requests', function () { chai.assert.ok(items[0].username); }); - //TODO: use authenticated user to check for links - it('user has no links', () => { - chai.assert.isUndefined(items[0].links); + //mock user is testuser3, who has admin permission + it('user has links', () => { + chai.assert.ok(items[0].links); }); }); From dee615803b56f77a4be487faf2c408553b2e5092 Mon Sep 17 00:00:00 2001 From: Nathan Evans Date: Tue, 17 Mar 2015 10:59:13 -0700 Subject: [PATCH 09/14] #112 - removed temporary 'auth' middleware --- app/server/middleware/auth.js | 12 ------------ app/server/middleware/repos.js | 2 +- 2 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 app/server/middleware/auth.js diff --git a/app/server/middleware/auth.js b/app/server/middleware/auth.js deleted file mode 100644 index c17699a..0000000 --- a/app/server/middleware/auth.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; - -var username = process.env.GITHUB_USERNAME; - -module.exports = { - - authenticate (req, res, next) { - req.auth = { username: username }; - next(); - } - -}; diff --git a/app/server/middleware/repos.js b/app/server/middleware/repos.js index 6b92a40..ceac716 100644 --- a/app/server/middleware/repos.js +++ b/app/server/middleware/repos.js @@ -10,7 +10,7 @@ module.exports = { debug('listing repos [' + req.path + ']'); debug('query:' + JSON.stringify(req.query, null, 2)); - let username = req.auth.username; + let username = req.session.passport.user.username; repoRepository.getRepos().then(repos => { return permissionRepository.filterReposByUserPermission(repos, username).then(filteredRepos => { From 39d460d49224635a3a1ba210b2d941db366abf2d Mon Sep 17 00:00:00 2001 From: Nathan Evans Date: Tue, 17 Mar 2015 11:36:13 -0700 Subject: [PATCH 10/14] #112 - fixed auth promise --- app/server/components/repositories/teams.js | 1 + app/server/components/repositories/users.js | 9 +++--- .../components/repositories/util/users.js | 2 +- app/server/middleware/authenticate.js | 32 ++++++++++++++++--- 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/app/server/components/repositories/teams.js b/app/server/components/repositories/teams.js index f14a1bb..afae204 100644 --- a/app/server/components/repositories/teams.js +++ b/app/server/components/repositories/teams.js @@ -69,6 +69,7 @@ module.exports = { edit (username, repoId, permission) { + debug('editing user [' + username + '] permission on team for repo [' + repoId + '] to permission [' + permission + ']'); // get permission map return permUtil.getPermissionMap().then(map => { diff --git a/app/server/components/repositories/users.js b/app/server/components/repositories/users.js index 97a6ca7..0c7ae15 100644 --- a/app/server/components/repositories/users.js +++ b/app/server/components/repositories/users.js @@ -1,8 +1,7 @@ 'use strict'; var userUtil = require('./util/users'), - Bluebird = require('bluebird'), - permUtil = require('./util/permissions'); + Bluebird = require('bluebird'); module.exports = { @@ -14,8 +13,10 @@ module.exports = { }, isOrgMember (username) { - return userUtil.isOrgMember(username).then(function (data) { - return "204 No Content" === data.meta.success; + return new Promise((resolve, reject) => { + userUtil.isOrgMember(username).then(function (data) { + resolve(data.meta.status === '204 No Content'); + }); }); } }; diff --git a/app/server/components/repositories/util/users.js b/app/server/components/repositories/util/users.js index 9d6e9da..7063891 100644 --- a/app/server/components/repositories/util/users.js +++ b/app/server/components/repositories/util/users.js @@ -28,7 +28,7 @@ module.exports = { isOrgMember(username) { return provider.github.isOrgMember({ org: provider.github.config.org, - username: username + user: username }); } }; diff --git a/app/server/middleware/authenticate.js b/app/server/middleware/authenticate.js index 96e9207..ac8d43e 100644 --- a/app/server/middleware/authenticate.js +++ b/app/server/middleware/authenticate.js @@ -1,15 +1,37 @@ 'use strict'; -var users = require('../components/repositories/users'); +let users = require('../components/repositories/users'), + debug = require('debug')('app:middleware:authenticate'); module.exports = { isAuthenticated (req, res, next) { - var authenticated = req.isAuthenticated(); - if (authenticated && users.isOrgMember(req.session.passport.user.username)) { - next(); - } else { + let authenticated = req.isAuthenticated(); + + function f401() { res.send(401); } + + debug('session is authenticated: ' + authenticated); + + if (authenticated) { + + let username = req.session.passport.user.username; + + debug('checking membership for ' + username); + + users.isOrgMember(username).then((isMember) => { + debug('user [' + username + '] is org member: ' + isMember); + if (isMember) { + next(); + } else { + f401(); + } + }).catch(() => { + f401(); + }); + } else { + f401(); + } } }; From 5271fcfa8409862b683e07c75fb3497d4b06b2ff Mon Sep 17 00:00:00 2001 From: Nathan Evans Date: Tue, 17 Mar 2015 11:48:48 -0700 Subject: [PATCH 11/14] #112 - fixed mock passport so client id/key aren't required --- app/server/components/services/github.mock.js | 2 +- app/server/main.js | 5 +++-- app/server/passport.js | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/server/components/services/github.mock.js b/app/server/components/services/github.mock.js index 9c9bb5b..65123a3 100644 --- a/app/server/components/services/github.mock.js +++ b/app/server/components/services/github.mock.js @@ -241,7 +241,7 @@ module.exports = { isOrgMember (msg) { return new Promise((resolve, reject) => { resolve({ meta: { - success: "204 No Content" + status: '204 No Content' }}); }); } diff --git a/app/server/main.js b/app/server/main.js index 6d4ce9a..0975b03 100644 --- a/app/server/main.js +++ b/app/server/main.js @@ -10,8 +10,9 @@ exports.start = () => { hostname: 'localhost' }, github: { - clientID: process.env.GITHUB_CLIENTID, - clientSecret: process.env.GITHUB_CLIENT_KEY, + //TODO: the mock is being injected here via service var. extract this to a centralized place. + clientID: process.env.GITHUB_CLIENTID || process.env.SERVICE, + clientSecret: process.env.GITHUB_CLIENT_KEY || process.env.SERVICE, authRoute: '/auth/github', authCallbackRoute: '/auth/github/callback', failureCallback: '/auth/failure' diff --git a/app/server/passport.js b/app/server/passport.js index ccb8526..03a67b0 100644 --- a/app/server/passport.js +++ b/app/server/passport.js @@ -37,10 +37,11 @@ module.exports = { if (process.env.SERVICE === 'mock') { // TODO ... is there a real di way to do this?? - console.log('using the mock passport middlware'); + debug('using the mock passport middlware'); var mock = require('./mock-passport-middleware'); app.use(mock.initialize(mock.mockUser)); } else { + debug('using the standard passport middlware'); app.use(passport.initialize()); } app.use(passport.session()); From 78ffe3bb12e798babeb80e6eb5c925647662a0fa Mon Sep 17 00:00:00 2001 From: Nathan Evans Date: Tue, 17 Mar 2015 11:51:40 -0700 Subject: [PATCH 12/14] #112 - made mock user configurable --- app/server/mock-passport-middleware.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/server/mock-passport-middleware.js b/app/server/mock-passport-middleware.js index f3e9d74..a196ddd 100644 --- a/app/server/mock-passport-middleware.js +++ b/app/server/mock-passport-middleware.js @@ -23,5 +23,5 @@ module.exports = { }, // TODO ... PUT Mock users in a seperate file so we can tests users that are - mockUser: { username: "testuser3", displayName: "Test User 3", id: 1 } + mockUser: { username: process.env.GITHUB_USERNAME || 'testuser3', displayName: 'Test User', id: 1 } }; From c1b7be965a1e864ff5d8fa0b1051ef4a4059c27e Mon Sep 17 00:00:00 2001 From: Nathan Evans Date: Tue, 17 Mar 2015 11:51:59 -0700 Subject: [PATCH 13/14] #112 - updated readme for new auth + mock params --- README.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a9139fd..cab2fb7 100644 --- a/README.md +++ b/README.md @@ -32,9 +32,19 @@ To run the application: Then: - GITHUB_TOKEN= GITHUB_ORG= npm start + npm start -You need to use an OAuth token to authenticate with the GitHub API. +The required environment vars are: + +* GITHUB_ORG: This is the org name to manage. +* GITHUB_TOKEN: You need to use an OAuth token to authenticate with the GitHub API. This token must have **owner** permissions against the org, or else team management cannot be performed. +* GITHUB_CLIENTID: This is the application OAuth ID provided by GitHub when you register the application. +* GITHUB_CLIENT_KEY: This is the application OAuth secrect key provided by GitHub when you register the application. + +If you instead choose to run with mock services that don't interact with the live GitHub API, you can ignore those params and use these instead: + +* SERVICE=mock: Setting 'mock' here will toggle the services to swap in a mock impl. +* GITHUB_USERNAME: Put in one of the mock usernames to simulate interaction as, because their won't be auth (testuser1, testuser2, or testuser3). Default=testuser3. As you develop, you can pull down the latest dependencies with either `npm install` from within the Vagrant VM or `vagrant provision` from your host. From c31bf45eac8cb6625289fb759bbc8e52b67a8e88 Mon Sep 17 00:00:00 2001 From: Nathan Evans Date: Tue, 17 Mar 2015 12:30:03 -0700 Subject: [PATCH 14/14] #112 - fixed mock team test --- app/server/test/components/services/TestGithubMock.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/server/test/components/services/TestGithubMock.js b/app/server/test/components/services/TestGithubMock.js index 2d6de1d..4191d34 100644 --- a/app/server/test/components/services/TestGithubMock.js +++ b/app/server/test/components/services/TestGithubMock.js @@ -65,7 +65,7 @@ describe('github.mock.js', () => { it('getTeams ok', (done) => { github.getTeams().then((teams) => { - chai.assert.equal(teams.length, 4); + chai.assert.equal(teams.length, 5); let team = teams[0]; //just confirm they're ok - we can't assert specifically because we don't enforce sorting chai.assert.ok(team.id);