Skip to content

Commit ab1a4ee

Browse files
committed
Check for repo permission before adding
1 parent b1dff67 commit ab1a4ee

File tree

1 file changed

+33
-12
lines changed

1 file changed

+33
-12
lines changed

server/api/project/project.controller.js

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ var User = require('./../user/user.model');
55
var github = require('octonode');
66
var common = require('../common.js');
77
var cache = require('rediscache');
8+
var Q = require("q");
9+
810

911
cache.connect().configure({
1012
expiry: 86400
@@ -25,26 +27,45 @@ exports.index = function (req, res, next) {
2527
*/
2628
exports.create = function (req, res, next) {
2729
var userId = req.user._id;
30+
var owner = req.body.owner;
31+
var repo = req.body.repo;
2832

2933
// Check if project already exists
3034
Project.findOne({
31-
owner: req.body.owner,
32-
repo: req.body.repo
35+
owner: owner,
36+
repo: repo
3337
}, function(err, project) {
3438
if (project) return res.json(project);
3539

36-
// Check repo ownership
37-
// TODO
40+
// Check repo permission
41+
var user = Q.nfcall(User.findOne.bind(User), {_id: userId});
42+
var accessToken = user.then(function(user) {
43+
if (!user || !user.github || !user.github.accessToken) throw new Error('Cannot get access token');
44+
return user.github.accessToken;
45+
});
46+
var githubClient = accessToken.then(function(accessToken) {
47+
return github.client(accessToken);
48+
});
49+
var repoPermissions = githubClient.then(function(githubClient) {
50+
var ghrepo = githubClient.repo(owner + '/' + repo);
51+
return Q.nfcall(ghrepo.info.bind(ghrepo)).spread(function(data, headers) {
52+
return data.permissions;
53+
});
54+
});
55+
56+
repoPermissions.then(function(repoPermissions) {
57+
if (!repoPermissions.admin) next(new Error('User does not have admin permission for repo'));
3858

39-
var project = {
40-
owner: req.body.owner,
41-
repo: req.body.repo,
42-
createdBy: userId
43-
};
59+
var project = {
60+
owner: owner,
61+
repo: repo,
62+
createdBy: userId
63+
};
4464

45-
Project.create(project, function (err, project) {
46-
if (err) return next(err);
47-
res.json(project);
65+
Project.create(project, function (err, project) {
66+
if (err) return next(err);
67+
res.json(project);
68+
});
4869
});
4970

5071
});

0 commit comments

Comments
 (0)