Skip to content

Commit 4c0a35b

Browse files
Updating the tool with the following:
* The tool will no longer download all LDAP groups, instead it only downlodas the LDAP groups corresponding to projects within the system * The "groupPrefix" key has been moved to the top-level of the configuration, but is now implemented. The default "gitlab-" means that a gitlab group called "test" will have users from the LDAP group 'gitlab-test' * The new configuration key "owners" indicates the group name which containers users who will be given "owner" permissions. Note that the "groupPrefix" is applied to this name. Note that all users in this group are granted owner permissions on any gitlab group which they are assigned to (but only those groups). The default (admins) follows the previous behaviour * The old behaviour of gitlab-default (or ${groupPrefix}default) is used where the group does not exist (or has no entries) * The definition of Owner and the default access level can be defined. These default to "50" for owner and "30" for other users (which follows the previous behaviour). * The gitlab hook function for user addition has been modified so that it returns 200 if invoked with what appears to be a valid request, but only triggers reprocessing if the request is a user add.
1 parent aab941e commit 4c0a35b

File tree

4 files changed

+27
-11
lines changed

4 files changed

+27
-11
lines changed

app.js

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ readEnvironmentVariables(configSchema, config);
1313

1414
var validate = require('jsonschema').validate;
1515
var result = validate(config, configSchema);
16+
1617
if (result.errors.length > 0) {
1718
console.log('Config file invalid', result);
1819
process.exit(1);

config.sample.json

+7-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@
99
"url": "ldaps://ldap.example.com",
1010
"baseDN": "OU=AADDC Users,DC=example,DC=com",
1111
"username": "ldap@example.com",
12-
"password": "mY_S3Cr3T_P455W0Rd",
13-
"groupPrefix": "gitlab-"
14-
}
12+
"password": "mY_S3Cr3T_P455W0Rd"
13+
},
14+
"groupPrefix": "gitlab-",
15+
"ownersGroups": "admins",
16+
"ownerAccessLevel": 50,
17+
"defaultAccessLevel": 30
18+
1519
}

gitlabLdapGroupSync.js

+16-7
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ var ActiveDirectory = require('activedirectory');
44
var NodeGitlab = require('node-gitlab');
55

66
var ACCESS_LEVEL_OWNER = 50;
7-
var ACCESS_LEVEL_NORMAL = 40;
8-
9-
//require('https').globalAgent.options.ca = require('ssl-root-cas/latest').create();
7+
var ACCESS_LEVEL_NORMAL = 30;
108

119
module.exports = GitlabLdapGroupSync;
1210

@@ -68,7 +66,8 @@ GitlabLdapGroupSync.prototype.sync = function () {
6866
}
6967
while(pagedGroups.length == 100);
7068

71-
var membersOwner = yield this.resolveLdapGroupMembers(ldap, 'owners', gitlabUserMap);
69+
var membersOwner = yield this.resolveLdapGroupMembers(ldap, this.config['ownersGroup'] || 'admins', gitlabUserMap);
70+
var membersDefault = yield this.resolveLdapGroupMembers(ldap, 'default', gitlabUserMap);
7271

7372
for (var gitlabGroup of gitlabGroups) {
7473
console.log('-------------------------');
@@ -89,7 +88,7 @@ GitlabLdapGroupSync.prototype.sync = function () {
8988
continue; //ignore local users
9089
}
9190

92-
var access_level = membersOwner.indexOf(member.id) > -1 ? ACCESS_LEVEL_OWNER : ACCESS_LEVEL_NORMAL;
91+
var access_level = this.accessLevel(member.id, membersOwner);
9392
if (member.access_level !== access_level) {
9493
console.log('update group member permission', { id: gitlabGroup.id, user_id: member.id, access_level: access_level });
9594
gitlab.groupMembers.update({ id: gitlabGroup.id, user_id: member.id, access_level: access_level });
@@ -99,6 +98,7 @@ GitlabLdapGroupSync.prototype.sync = function () {
9998
}
10099

101100
var members = yield this.resolveLdapGroupMembers(ldap, gitlabGroup.name, gitlabUserMap);
101+
members = (members && members.length) ? members : membersDefault;
102102

103103
//remove unlisted users
104104
var toDeleteIds = currentMemberIds.filter(x => members.indexOf(x) == -1);
@@ -110,7 +110,7 @@ GitlabLdapGroupSync.prototype.sync = function () {
110110
//add new users
111111
var toAddIds = members.filter(x => currentMemberIds.indexOf(x) == -1);
112112
for (var id of toAddIds) {
113-
var access_level = membersOwner.indexOf(id) > -1 ? ACCESS_LEVEL_OWNER : ACCESS_LEVEL_NORMAL;
113+
var access_level = this.accessLevel(id, membersOwner);
114114
console.log('add group member', { id: gitlabGroup.id, user_id: id, access_level: access_level });
115115
gitlab.groupMembers.create({ id: gitlabGroup.id, user_id: id, access_level: access_level });
116116
}
@@ -127,6 +127,15 @@ GitlabLdapGroupSync.prototype.sync = function () {
127127

128128
var ins = undefined;
129129

130+
GitlabLdapGroupSync.prototype.accessLevel = function (id, membersOwner) {
131+
var owner = membersOwner.indexOf(id) > -1
132+
133+
if(owner) {
134+
return this.config['ownerAccessLevel'] || ACCESS_LEVEL_OWNER;
135+
}
136+
return this.config['defaultAccessLevel'] || ACCESS_LEVEL_NORMAL;
137+
}
138+
130139
GitlabLdapGroupSync.prototype.startScheduler = function (interval) {
131140
this.stopScheduler();
132141
ins = every(interval).do(this.sync.bind(this));
@@ -140,7 +149,7 @@ GitlabLdapGroupSync.prototype.stopScheduler = function () {
140149
}
141150

142151
GitlabLdapGroupSync.prototype.resolveLdapGroupMembers = function(ldap, group, gitlabUserMap) {
143-
var groupName = this.config.ldap.groupPrefix + group
152+
var groupName = (this.config.groupPrefix || 'gitlab-') + group
144153
console.log('Loading users for group: ' + groupName)
145154
return new Promise(function (resolve, reject) {
146155
var ldapGroups = {};

routes/gitlab.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ var router = express.Router();
33

44
/* GET users listing. */
55
router.post('/webhook', function (req, res) {
6-
console.log(req);
6+
console.log(req.body);
77
if (req.body.event_name === 'user_create') {
88
gitlabLdapGroupSync.sync();
99
res.status(200).send('OK');
10+
} else if(req.body.event_name) {
11+
res.status(200).send('OK');
1012
} else {
1113
res.status(422).send('This is not a valid gitlab system hook');
1214
}

0 commit comments

Comments
 (0)