Skip to content

Commit db13ebd

Browse files
committed
Merge pull request #48 from github/cibuild-openldap
Add CI build for OpenLDAP integration
2 parents 7ae8fec + 15953cc commit db13ebd

16 files changed

+1074
-186
lines changed

.travis.yml

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,20 @@
11
language: ruby
22
rvm:
3-
- 1.9.3
4-
- 2.1.0
3+
- 1.9.3
4+
- 2.1.0
55

6+
env:
7+
- TESTENV=openldap
8+
- TESTENV=apacheds
9+
10+
install:
11+
- if [ "$TESTENV" = "openldap" ]; then ./script/install-openldap; fi
12+
- bundle install
13+
14+
script:
15+
- ./script/cibuild-$TESTENV
16+
17+
matrix:
18+
fast_finish: true
619
notifications:
720
email: false

Gemfile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,7 @@ source 'https://rubygems.org'
22

33
# Specify your gem's dependencies in github-ldap.gemspec
44
gemspec
5+
6+
group :test, :development do
7+
gem "byebug", :platforms => [:mri_20, :mri_21]
8+
end

lib/github/ldap/server.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ def self.start_server(options = {})
3838
@server_options[:domain] = @server_options[:user_domain]
3939
@server_options[:tmpdir] ||= server_tmp
4040

41+
@server_options[:quiet] = false if @server_options[:verbose]
42+
4143
@ldap_server = Ladle::Server.new(@server_options)
4244
@ldap_server.start
4345
end

script/cibuild-apacheds

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/usr/bin/env sh
2+
set -e
3+
set -x
4+
5+
cd `dirname $0`/..
6+
7+
bundle exec rake

script/cibuild-openldap

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/usr/bin/env sh
2+
set -e
3+
set -x
4+
5+
cd `dirname $0`/..
6+
7+
bundle exec rake

script/install-openldap

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#!/usr/bin/env sh
2+
set -e
3+
set -x
4+
5+
BASE_PATH="$( cd `dirname $0`/../test/fixtures/openldap && pwd )"
6+
SEED_PATH="$( cd `dirname $0`/../test/fixtures/common && pwd )"
7+
8+
DEBIAN_FRONTEND=noninteractive sudo -E apt-get install -y --force-yes slapd time ldap-utils
9+
10+
sudo /etc/init.d/slapd stop
11+
12+
TMPDIR=$(mktemp -d)
13+
cd $TMPDIR
14+
15+
# Delete data and reconfigure.
16+
sudo cp -v /var/lib/ldap/DB_CONFIG ./DB_CONFIG
17+
sudo rm -rf /etc/ldap/slapd.d/*
18+
sudo rm -rf /var/lib/ldap/*
19+
sudo cp -v ./DB_CONFIG /var/lib/ldap/DB_CONFIG
20+
sudo slapadd -F /etc/ldap/slapd.d -b "cn=config" -l $BASE_PATH/slapd.conf.ldif
21+
# Load memberof and ref-int overlays and configure them.
22+
sudo slapadd -F /etc/ldap/slapd.d -b "cn=config" -l $BASE_PATH/memberof.ldif
23+
24+
# Add base domain.
25+
sudo slapadd -F /etc/ldap/slapd.d <<EOM
26+
dn: dc=github,dc=com
27+
objectClass: top
28+
objectClass: domain
29+
dc: github
30+
EOM
31+
32+
sudo chown -R openldap.openldap /etc/ldap/slapd.d
33+
sudo chown -R openldap.openldap /var/lib/ldap
34+
35+
sudo /etc/init.d/slapd start
36+
37+
# Import seed data.
38+
# NOTE: use ldapadd in order for memberOf and refint to apply, instead of:
39+
# /vagrant/services/ldap/openldap/seed.rb | sudo slapadd -F /etc/ldap/slapd.d
40+
cat $SEED_PATH/seed.ldif |
41+
/usr/bin/time sudo ldapadd -x -D "cn=admin,dc=github,dc=com" -w passworD1 \
42+
-h localhost -p 389
43+
44+
sudo rm -rf $TMPDIR

test/domain_test.rb

Lines changed: 66 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ def setup
77
end
88

99
def test_user_valid_login
10-
user = @domain.valid_login?('calavera', 'passworD1')
11-
assert_equal 'uid=calavera,dc=github,dc=com', user.dn
10+
assert user = @domain.valid_login?('user1', 'passworD1')
11+
assert_equal 'uid=user1,ou=People,dc=github,dc=com', user.dn
1212
end
1313

1414
def test_user_with_invalid_password
15-
assert !@domain.valid_login?('calavera', 'foo'),
16-
"Login `calavera` expected to be invalid with password `foo`"
15+
assert !@domain.valid_login?('user1', 'foo'),
16+
"Login `user1` expected to be invalid with password `foo`"
1717
end
1818

1919
def test_user_with_invalid_login
@@ -22,115 +22,118 @@ def test_user_with_invalid_login
2222
end
2323

2424
def test_groups_in_server
25-
assert_equal 2, @domain.groups(%w(Enterprise People)).size
25+
assert_equal 2, @domain.groups(%w(ghe-users ghe-admins)).size
2626
end
2727

2828
def test_user_in_group
29-
user = @domain.valid_login?('calavera', 'passworD1')
29+
assert user = @domain.valid_login?('user1', 'passworD1')
3030

31-
assert @domain.is_member?(user, %w(Enterprise People)),
32-
"Expected `Enterprise` or `Poeple` to include the member `#{user.dn}`"
31+
assert @domain.is_member?(user, %w(ghe-users ghe-admins)),
32+
"Expected `ghe-users` or `ghe-admins` to include the member `#{user.dn}`"
3333
end
3434

3535
def test_user_not_in_different_group
36-
user = @domain.valid_login?('calavera', 'passworD1')
36+
user = @domain.valid_login?('user1', 'passworD1')
3737

38-
assert !@domain.is_member?(user, %w(People)),
39-
"Expected `Poeple` not to include the member `#{user.dn}`"
38+
refute @domain.is_member?(user, %w(ghe-admins)),
39+
"Expected `ghe-admins` not to include the member `#{user.dn}`"
4040
end
4141

4242
def test_user_without_group
43-
user = @domain.valid_login?('ldaptest', 'secret')
43+
user = @domain.valid_login?('groupless-user1', 'passworD1')
4444

45-
assert !@domain.is_member?(user, %w(People)),
46-
"Expected `People` not to include the member `#{user.dn}`"
45+
assert !@domain.is_member?(user, %w(all-users)),
46+
"Expected `all-users` not to include the member `#{user.dn}`"
4747
end
4848

49-
def test_authenticate_doesnt_return_invalid_users
50-
user = @domain.authenticate!('calavera', 'passworD1')
51-
assert_equal 'uid=calavera,dc=github,dc=com', user.dn
49+
def test_authenticate_returns_valid_users
50+
user = @domain.authenticate!('user1', 'passworD1')
51+
assert_equal 'uid=user1,ou=People,dc=github,dc=com', user.dn
5252
end
5353

5454
def test_authenticate_doesnt_return_invalid_users
55-
assert !@domain.authenticate!('calavera', 'foo'),
55+
refute @domain.authenticate!('user1', 'foo'),
5656
"Expected `authenticate!` to not return an invalid user"
5757
end
5858

5959
def test_authenticate_check_valid_user_and_groups
60-
user = @domain.authenticate!('calavera', 'passworD1', %w(Enterprise People))
60+
user = @domain.authenticate!('user1', 'passworD1', %w(ghe-users ghe-admins))
6161

62-
assert_equal 'uid=calavera,dc=github,dc=com', user.dn
62+
assert_equal 'uid=user1,ou=People,dc=github,dc=com', user.dn
6363
end
6464

6565
def test_authenticate_doesnt_return_valid_users_in_different_groups
66-
assert !@domain.authenticate!('calavera', 'passworD1', %w(People)),
66+
refute @domain.authenticate!('user1', 'passworD1', %w(ghe-admins)),
6767
"Expected `authenticate!` to not return an user"
6868
end
6969

7070
def test_membership_empty_for_non_members
71-
user = @ldap.domain('uid=calavera,dc=github,dc=com').bind
71+
user = @ldap.domain('uid=user1,ou=People,dc=github,dc=com').bind
7272

73-
assert @domain.membership(user, %w(People)).empty?,
74-
"Expected `calavera` not to be a member of `People`."
73+
assert @domain.membership(user, %w(ghe-admins)).empty?,
74+
"Expected `user1` not to be a member of `ghe-admins`."
7575
end
7676

7777
def test_membership_groups_for_members
78-
user = @ldap.domain('uid=calavera,dc=github,dc=com').bind
79-
groups = @domain.membership(user, %w(Enterprise People))
78+
user = @ldap.domain('uid=user1,ou=People,dc=github,dc=com').bind
79+
groups = @domain.membership(user, %w(ghe-users ghe-admins))
8080

8181
assert_equal 1, groups.size
82-
assert_equal 'cn=Enterprise,ou=Group,dc=github,dc=com', groups.first.dn
82+
assert_equal 'cn=ghe-users,ou=Groups,dc=github,dc=com', groups.first.dn
8383
end
8484

8585
def test_membership_with_virtual_attributes
8686
ldap = GitHub::Ldap.new(options.merge(virtual_attributes: true))
87-
user = ldap.domain('uid=calavera,dc=github,dc=com').bind
88-
user[:memberof] = 'cn=Enterprise,ou=Group,dc=github,dc=com'
87+
88+
user = ldap.domain('uid=user1,ou=People,dc=github,dc=com').bind
89+
user[:memberof] = 'cn=ghe-admins,ou=Groups,dc=github,dc=com'
8990

9091
domain = ldap.domain("dc=github,dc=com")
91-
groups = domain.membership(user, %w(Enterprise People))
92+
groups = domain.membership(user, %w(ghe-admins))
9293

9394
assert_equal 1, groups.size
94-
assert_equal 'cn=Enterprise,ou=Group,dc=github,dc=com', groups.first.dn
95+
assert_equal 'cn=ghe-admins,ou=Groups,dc=github,dc=com', groups.first.dn
9596
end
9697

9798
def test_search
9899
assert 1, @domain.search(
99100
attributes: %w(uid),
100-
filter: Net::LDAP::Filter.eq('uid', 'calavera')).size
101+
filter: Net::LDAP::Filter.eq('uid', 'user1')).size
101102
end
102103

103104
def test_search_override_base_name
104105
assert 1, @domain.search(
105106
base: "this base name is incorrect",
106107
attributes: %w(uid),
107-
filter: Net::LDAP::Filter.eq('uid', 'calavera')).size
108+
filter: Net::LDAP::Filter.eq('uid', 'user1')).size
108109
end
109110

110111
def test_user_exists
111-
assert_equal 'uid=calavera,dc=github,dc=com', @domain.user?('calavera').dn
112+
assert user = @domain.user?('user1')
113+
assert_equal 'uid=user1,ou=People,dc=github,dc=com', user.dn
112114
end
113115

114116
def test_user_wildcards_are_filtered
115-
assert !@domain.user?('cal*'), 'Expected uid `cal*` to not complete'
117+
refute @domain.user?('user*'), 'Expected uid `user*` to not complete'
116118
end
117119

118120
def test_user_does_not_exist
119-
assert !@domain.user?('foobar'), 'Expected uid `foobar` to not exist.'
121+
refute @domain.user?('foobar'), 'Expected uid `foobar` to not exist.'
120122
end
121123

122124
def test_user_returns_every_attribute
123-
assert_equal ['calavera@github.com'], @domain.user?('calavera')[:mail]
125+
assert user = @domain.user?('user1')
126+
assert_equal ['user1@github.com'], user[:mail]
124127
end
125128

126129
def test_auth_binds
127-
user = @domain.user?('calavera')
128-
assert @domain.auth(user, 'passworD1'), 'Expected user to be bound.'
130+
assert user = @domain.user?('user1')
131+
assert @domain.auth(user, 'passworD1'), 'Expected user to bind'
129132
end
130133

131134
def test_auth_does_not_bind
132-
user = @domain.user?('calavera')
133-
assert !@domain.auth(user, 'foo'), 'Expected user not to be bound.'
135+
assert user = @domain.user?('user1')
136+
refute @domain.auth(user, 'foo'), 'Expected user not not bind'
134137
end
135138
end
136139

@@ -143,72 +146,54 @@ class GitHubLdapDomainUnauthenticatedTest < GitHub::Ldap::UnauthenticatedTest
143146
end
144147

145148
class GitHubLdapDomainNestedGroupsTest < GitHub::Ldap::Test
146-
def self.test_server_options
147-
{user_fixtures: FIXTURES.join('github-with-subgroups.ldif').to_s}
148-
end
149-
150149
def setup
151150
@ldap = GitHub::Ldap.new(options)
152151
@domain = @ldap.domain("dc=github,dc=com")
153152
end
154153

155154
def test_membership_in_subgroups
156-
user = @ldap.domain('uid=rubiojr,ou=users,dc=github,dc=com').bind
155+
user = @ldap.domain('uid=user1,ou=People,dc=github,dc=com').bind
157156

158-
assert @domain.is_member?(user, %w(enterprise-ops)),
159-
"Expected `enterprise-ops` to include the member `#{user.dn}`"
157+
assert @domain.is_member?(user, %w(nested-groups)),
158+
"Expected `nested-groups` to include the member `#{user.dn}`"
160159
end
161160

162161
def test_membership_in_deeply_nested_subgroups
163-
assert user = @ldap.domain('uid=user1.1.1.1,ou=users,dc=github,dc=com').bind
162+
assert user = @ldap.domain('uid=user1,ou=People,dc=github,dc=com').bind
164163

165-
assert @domain.is_member?(user, %w(group1)),
166-
"Expected `group1` to include the member `#{user.dn}` via deep recursion"
164+
assert @domain.is_member?(user, %w(n-depth-nested-group4)),
165+
"Expected `n-depth-nested-group4` to include the member `#{user.dn}` via deep recursion"
167166
end
168167
end
169168

170169
class GitHubLdapPosixGroupsWithRecursionFallbackTest < GitHub::Ldap::Test
171-
def self.test_server_options
172-
{
173-
custom_schemas: FIXTURES.join('posixGroup.schema.ldif'),
174-
user_fixtures: FIXTURES.join('github-with-posixGroups.ldif').to_s,
175-
# so we exercise the recursive group search fallback
176-
recursive_group_search_fallback: true
177-
}
178-
end
179-
180170
def setup
181-
@ldap = GitHub::Ldap.new(options)
171+
opts = options.merge \
172+
recursive_group_search_fallback: true
173+
@ldap = GitHub::Ldap.new(opts)
182174
@domain = @ldap.domain("dc=github,dc=com")
183-
@cn = "enterprise-posix-devs"
175+
@cn = "posix-group1"
184176
end
185177

186178
def test_membership_for_posixGroups
187-
assert user = @ldap.domain('uid=mtodd,ou=users,dc=github,dc=com').bind
179+
assert user = @ldap.domain('uid=user1,ou=People,dc=github,dc=com').bind
188180

189181
assert @domain.is_member?(user, [@cn]),
190182
"Expected `#{@cn}` to include the member `#{user.dn}`"
191183
end
192184
end
193185

194186
class GitHubLdapPosixGroupsWithoutRecursionTest < GitHub::Ldap::Test
195-
def self.test_server_options
196-
{
197-
custom_schemas: FIXTURES.join('posixGroup.schema.ldif'),
198-
user_fixtures: FIXTURES.join('github-with-posixGroups.ldif').to_s,
199-
# so we test the test the non-recursive group membership search
200-
recursive_group_search_fallback: false
201-
}
202-
end
203-
204187
def setup
205-
@ldap = GitHub::Ldap.new(options)
188+
opts = options.merge \
189+
recursive_group_search_fallback: false
190+
@ldap = GitHub::Ldap.new(opts)
206191
@domain = @ldap.domain("dc=github,dc=com")
207-
@cn = "enterprise-posix-devs"
192+
@cn = "posix-group1"
208193
end
209194

210195
def test_membership_for_posixGroups
211-
assert user = @ldap.domain('uid=mtodd,ou=users,dc=github,dc=com').bind
196+
assert user = @ldap.domain('uid=user1,ou=People,dc=github,dc=com').bind
212197

213198
assert @domain.is_member?(user, [@cn]),
214199
"Expected `#{@cn}` to include the member `#{user.dn}`"
@@ -218,25 +203,17 @@ def test_membership_for_posixGroups
218203
# Specifically testing that this doesn't break when posixGroups are not
219204
# supported.
220205
class GitHubLdapWithoutPosixGroupsTest < GitHub::Ldap::Test
221-
def self.test_server_options
222-
{
223-
custom_schemas: FIXTURES.join('posixGroup.schema.ldif'),
224-
user_fixtures: FIXTURES.join('github-with-posixGroups.ldif').to_s,
225-
# so we test the test the non-recursive group membership search
226-
recursive_group_search_fallback: false,
227-
# explicitly disable posixGroup support (even if the schema supports it)
228-
posix_support: false
229-
}
230-
end
231-
232206
def setup
233-
@ldap = GitHub::Ldap.new(options)
207+
opts = options.merge \
208+
recursive_group_search_fallback: false, # test non-recursive group membership search
209+
posix_support: false # disable posixGroup support
210+
@ldap = GitHub::Ldap.new(opts)
234211
@domain = @ldap.domain("dc=github,dc=com")
235-
@cn = "enterprise-posix-devs"
212+
@cn = "posix-group1"
236213
end
237214

238215
def test_membership_for_posixGroups
239-
assert user = @ldap.domain('uid=mtodd,ou=users,dc=github,dc=com').bind
216+
assert user = @ldap.domain('uid=user1,ou=People,dc=github,dc=com').bind
240217

241218
refute @domain.is_member?(user, [@cn]),
242219
"Expected `#{@cn}` to not include the member `#{user.dn}`"

0 commit comments

Comments
 (0)