Skip to content
This repository has been archived by the owner on Jun 13, 2023. It is now read-only.

Commit

Permalink
Merge branch 'master' into 116-117-style-improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
bmathews committed Mar 17, 2015
2 parents 32ab97e + 5cd1d44 commit 34eaff5
Show file tree
Hide file tree
Showing 19 changed files with 227 additions and 17 deletions.
16 changes: 15 additions & 1 deletion app/client/src/modules/app/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,22 @@ module.exports =
//load other app modules here, e.g.:
//require('./account').name
])
.config(function ($urlRouterProvider, $mdThemingProvider) {
.config(function ($urlRouterProvider, $httpProvider, $mdThemingProvider) {
$urlRouterProvider.otherwise('/');
$httpProvider.interceptors.push('authInterceptor');

$mdThemingProvider.theme('default')
.primaryPalette('light-blue');
}).factory('authInterceptor', function ($q, $location) {
return {
responseError(response) {
if (response.status === 401) {
console.log('redirecting to login');
$location.path('/login');
//$cookieStore.remove('token');
}

return $q.reject(response);
}
};
});
1 change: 1 addition & 0 deletions app/client/src/modules/app/main/login.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<a href="/auth/github">Login with GitHub</a>
4 changes: 4 additions & 0 deletions app/client/src/modules/app/main/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ module.exports =
url: '/',
templateUrl: 'app/main/main.html',
controller: 'mainController as ctrl'
})
.state('login', {
url: '/login',
templateUrl: 'app/main/login.html'
});
})
.controller('mainController', function () {
Expand Down
1 change: 1 addition & 0 deletions app/server/apps/repos/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
/**
* Business logic routes for working with repos.
*/

var express = require('express'),
jefferson = require('express-jefferson'),
conf = require('./routes'),
Expand Down
6 changes: 3 additions & 3 deletions app/server/apps/repos/routes.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
'use strict';
var auth = require('../../middleware/auth'),
var auth = require('../../middleware/authenticate'),
repos = require('../../middleware/repos'),
send = require('../../middleware/send'),
permissions = require('../../middleware/permissions');
Expand All @@ -10,7 +10,7 @@ module.exports = {
method: 'GET',
path: '/repos',
middleware: [
auth.authenticate,
auth.isAuthenticated,
repos.listRepos,
repos.listReposPermission,
repos.listReposLinks,
Expand All @@ -21,7 +21,7 @@ module.exports = {
method: 'PUT',
path: '/repos/:id/users/:username/permissions/:permission',
middleware: [
auth.authenticate,
auth.isAuthenticated,
permissions.editRepoPermissionForUser,
send.noContent
]
Expand Down
1 change: 1 addition & 0 deletions app/server/apps/users/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
/**
* Business logic routes for working with repos.
*/

var express = require('express'),
jefferson = require('express-jefferson'),
conf = require('./routes'),
Expand Down
6 changes: 3 additions & 3 deletions app/server/apps/users/routes.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
'use strict';
var auth = require('../../middleware/auth'),
var auth = require('../../middleware/authenticate'),
users = require('../../middleware/users'),
permissions = require('../../middleware/permissions'),
send = require('../../middleware/send');
Expand All @@ -9,7 +9,7 @@ module.exports = {
method: 'GET',
path: '/users',
middleware: [
auth.authenticate,
auth.isAuthenticated,
users.listUsers,
users.listUsersPermission,
users.listUsersLinks,
Expand All @@ -20,7 +20,7 @@ module.exports = {
method: 'PUT',
path: '/users/:username/repos/:id/permissions/:permission',
middleware: [
auth.authenticate,
auth.isAuthenticated,
permissions.editRepoPermissionForUser,
send.noContent
]
Expand Down
21 changes: 21 additions & 0 deletions app/server/components/repositories/permissions.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,19 @@ var permUtil = require('./util/permissions');

module.exports = {

/**
* Gets the Repo Permission for the User
*/
getUserPermissionForRepo (username, repoId) {
return permUtil.getPermissionMap().then(permissions => {
let repo = permissions[repoId];
return repo[username] || permUtil.getDefaultPermissions();
});
},

/**
* Sets the Permission for a specific Repo on each User in the list
*/
setRepoPermissionForUsers (users, repoId) {
return permUtil.getPermissionMap().then(permissions => {
let repo = permissions[repoId];
Expand All @@ -21,6 +27,9 @@ module.exports = {
});
},

/**
* Gets a list of Permissions by Repo for the User,
*/
getRepoPermissionsForUser (repos, username) {
return permUtil.getPermissionMap().then(permissions => {
let map = {};
Expand All @@ -31,6 +40,9 @@ module.exports = {
});
},

/**
* Sets the Permission for a specific User on each Repo in the list
*/
setUserPermissionForRepos (repos, username) {
return permUtil.getPermissionMap().then(permissions => {
repos.forEach(repo => {
Expand All @@ -39,6 +51,15 @@ module.exports = {
});
return repos;
});
},

filterReposByUserPermission (repos, username) {
return permUtil.getPermissionMap().then(permissions => {
return repos.filter(repo => {
let permission = permissions[repo.id][username] || permUtil.getDefaultPermissions();
return !(permission.github === 'none' && permission.permissive === 'none');
});
});
}

};
10 changes: 8 additions & 2 deletions app/server/components/repositories/users.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
'use strict';

var userUtil = require('./util/users'),
Bluebird = require('bluebird');
Bluebird = require('bluebird'),
permUtil = require('./util/permissions');

module.exports = {

Expand All @@ -10,6 +11,11 @@ module.exports = {
let profiles = users.map(user => userUtil.getGithubUser(user.username).then(profile => user.name = profile.name));
return Bluebird.all(profiles).then(() => users);
});
}
},

isOrgMember (username) {
return userUtil.isOrgMember(username).then(function (data) {
return "204 No Content" === data.meta.success;
});
}
};
8 changes: 7 additions & 1 deletion app/server/components/repositories/util/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ var provider = require('./provider'),
convertGithubUser;

convertGithubUser = (user) => {
console.log('user', user);
return {
username: user.login,
name: user.name,
Expand All @@ -24,5 +23,12 @@ module.exports = {
getGithubUsers() {
var args = provider.getDefaultListArgs();
return provider.github.getUsers(args).then(users => users.map(user => convertGithubUser(user)));
},

isOrgMember(username) {
return provider.github.isOrgMember({
org: provider.github.config.org,
username: username
});
}
};
1 change: 1 addition & 0 deletions app/server/components/services/github.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ module.exports = {
config: {
org: org
},
isOrgMember: Bluebird.promisify(github.orgs.getMember),
getUsers: Bluebird.promisify(github.orgs.getMembers),
getUser: Bluebird.promisify(github.user.getFrom),
getRepos: Bluebird.promisify(github.repos.getFromOrg),
Expand Down
8 changes: 8 additions & 0 deletions app/server/components/services/github.mock.js
Original file line number Diff line number Diff line change
Expand Up @@ -201,5 +201,13 @@ module.exports = {
reject(new Error('No mock team: ' + id));
}
});
},

isOrgMember (msg) {
return new Promise((resolve, reject) => {
resolve({ meta: {
success: "204 No Content"
}});
});
}
};
32 changes: 30 additions & 2 deletions app/server/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,43 @@

exports.start = () => {

var express = require('express'),
// HACKING IN CONFIG OBJECT HERE
var config = {
server: {
port: '3000',
api_prefix: '/api/v1',
hostname: 'localhost'
},
github: {
clientID: process.env.GITHUB_CLIENTID,
clientSecret: process.env.GITHUB_CLIENT_KEY,
authRoute: '/auth/github',
authCallbackRoute: '/auth/github/callback',
failureCallback: '/auth/failure'
},
session: {
secret: process.env.SESSION_SECRET || 'keyboard cat',
resave: false,
saveUninitialized: true,
cookie: {
secure: false
}
}},
express = require('express'),
mountie = require('express-mountie'),
http = require('http'),
path = require('path'),
session = require('express-session'),
passport = require('./passport'),
app = express();

app.set('port', 3000);
app.use(session(config.session));

passport.setup(app, config);

app.set('port', config.server.port);
app.use(express.static(path.resolve(__dirname, '../../app/client/build')));

mountie({
parent: app,
src: path.join(__dirname, 'apps'),
Expand Down
15 changes: 15 additions & 0 deletions app/server/middleware/authenticate.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
'use strict';

var users = require('../components/repositories/users');

module.exports = {
isAuthenticated (req, res, next) {
var authenticated = req.isAuthenticated();

if (authenticated && users.isOrgMember(req.session.passport.user.username)) {
next();
} else {
res.send(401);
}
}
};
10 changes: 7 additions & 3 deletions app/server/middleware/repos.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,13 @@ module.exports = {
debug('listing repos [' + req.path + ']');
debug('query:' + JSON.stringify(req.query, null, 2));

let username = req.auth.username;

repoRepository.getRepos().then(repos => {
req.entity = repos;
next();
return permissionRepository.filterReposByUserPermission(repos, username).then(filteredRepos => {
req.entity = filteredRepos;
next();
});
}).catch(err => next(err));
},

Expand All @@ -37,7 +41,7 @@ module.exports = {

let repos = req.entity,
user = req.query.permission_user,
username = req.auth.username;
username = req.session.passport.user.username;

if (user) {
permissionRepository.getRepoPermissionsForUser(repos, username).then(permissions => {
Expand Down
2 changes: 1 addition & 1 deletion app/server/middleware/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ module.exports = {

let repoId = req.query.permission_repo,
users = req.entity,
username = req.auth.username;
username = req.session.passport.user.username;

if (repoId) {
permissionRepository.getUserPermissionForRepo(username, repoId).then(permission => {
Expand Down
27 changes: 27 additions & 0 deletions app/server/mock-passport-middleware.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
'use strict';

//jscs:disable disallowDanglingUnderscores
module.exports = {
initialize(mockUser) {
return function (req, res, next) {
var passport = {};
passport._key = 'passport';
passport._userProperty = 'user';
passport.serializeUser = (user, req, done) => {
done(null, user);
};
passport.deserializeUser = (user, req, done) => {
done(null, user);
};

req._passport = { instance: passport };
req._passport.session = { user: mockUser };
req.session.passport = { user: mockUser };

next();
};
},

// TODO ... PUT Mock users in a seperate file so we can tests users that are
mockUser: { username: "TestUser", displayName: "Test User", id: 1 }
};
Loading

0 comments on commit 34eaff5

Please sign in to comment.