adauth 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +3 -1
- data/Readme.md +8 -1
- data/adauth.gemspec +2 -0
- data/lib/adauth.rb +3 -1
- data/lib/adauth/ad_object.rb +8 -0
- data/lib/adauth/ad_objects/group.rb +12 -3
- data/lib/adauth/ad_objects/user.rb +12 -0
- data/lib/adauth/config.rb +3 -1
- data/lib/adauth/connection.rb +6 -1
- data/lib/adauth/version.rb +1 -1
- data/rspec_results.txt +5 -5
- data/spec/adauth_ad_object_group_spec.rb +13 -1
- data/spec/adauth_ad_object_user_spec.rb +26 -0
- data/spec/adauth_issue_spec.rb +13 -0
- data/spec/test_data.example.yml +2 -1
- metadata +20 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48e8b82dd827473a19acccdc250b66bcdf00e44a
|
4
|
+
data.tar.gz: af6839234b1405eecbb6551dcf91acecc6d76c2b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0fc542e5a2f1392253738852897817726bdb2b1bfb697dc82fe287a775729cd75131b85f1135727a3d7e9e869fe4b3131829417c828bd625ff0e09303f45b41b
|
7
|
+
data.tar.gz: 1a08d5744964257fd2284f7c52de1fd853f5c3783f1c182d0e77b5c6821a32f82f793fd48beb0ba753de391228c8cbbadbe3c3e3ece4e07e7ad7d854b66152c0
|
data/Gemfile.lock
CHANGED
data/Readme.md
CHANGED
@@ -70,4 +70,11 @@ You can interact with the logger through `Adauth.logger` and set a new one using
|
|
70
70
|
|
71
71
|
## Developing
|
72
72
|
|
73
|
-
Before you can run the tests you will need to write a yml file with your domain settings in and place it at _spec/test_data.yml_, there is an example of this file in the spec folder.
|
73
|
+
Before you can run the tests you will need to write a yml file with your domain settings in and place it at _spec/test_data.yml_, there is an example of this file in the spec folder.
|
74
|
+
|
75
|
+
When you fork Adauth please:
|
76
|
+
|
77
|
+
1. Create your feature branch (`git checkout -b my-new-feature`)
|
78
|
+
2. Commit your changes (`git commit -am 'Add some feature'`)
|
79
|
+
3. Push to the branch (`git push origin my-new-feature`)
|
80
|
+
4. Create new Pull Request
|
data/adauth.gemspec
CHANGED
@@ -11,12 +11,14 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.homepage = "http://adauth.arcath.net"
|
12
12
|
s.summary = "Provides Active Directory authentication for Rails"
|
13
13
|
s.description = "A full featured library for working with Microsofts Active Directory in Ruby."
|
14
|
+
s.license = 'MIT'
|
14
15
|
|
15
16
|
s.add_development_dependency "rake"
|
16
17
|
s.add_development_dependency "rspec"
|
17
18
|
s.add_development_dependency "simplecov"
|
18
19
|
s.add_development_dependency "yard"
|
19
20
|
s.add_dependency "net-ldap"
|
21
|
+
s.add_dependency "expects", "~> 0.0.2"
|
20
22
|
|
21
23
|
s.files = `git ls-files`.split("\n")
|
22
24
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/lib/adauth.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# Requires
|
2
|
+
require 'expects'
|
2
3
|
require 'logger'
|
3
4
|
require 'net/ldap'
|
4
5
|
require 'timeout'
|
@@ -57,7 +58,8 @@ module Adauth
|
|
57
58
|
:encryption => @config.encryption,
|
58
59
|
:allow_fallback => @config.allow_fallback,
|
59
60
|
:username => user,
|
60
|
-
:password => password
|
61
|
+
:password => password,
|
62
|
+
:anonymous_bind => @config.anonymous_bind
|
61
63
|
}
|
62
64
|
end
|
63
65
|
|
data/lib/adauth/ad_object.rb
CHANGED
@@ -15,6 +15,8 @@ module Adauth
|
|
15
15
|
#
|
16
16
|
# Provides all the common functions for Active Directory.
|
17
17
|
class AdObject
|
18
|
+
include Expects
|
19
|
+
|
18
20
|
# Returns all objects which have the ObjectClass of the inherited class
|
19
21
|
def self.all
|
20
22
|
Adauth.logger.info(self.class.inspect) { "Searching for all objects matching filter \"#{self::ObjectFilter}\"" }
|
@@ -54,6 +56,7 @@ module Adauth
|
|
54
56
|
|
55
57
|
# Creates a new instance of the object and sets @ldap_object to the passed Net::LDAP entity
|
56
58
|
def initialize(ldap_object)
|
59
|
+
expects ldap_object, Net::LDAP::Entry
|
57
60
|
@ldap_object = ldap_object
|
58
61
|
end
|
59
62
|
|
@@ -152,6 +155,11 @@ module Adauth
|
|
152
155
|
return false
|
153
156
|
end
|
154
157
|
|
158
|
+
# Delete the object
|
159
|
+
def delete
|
160
|
+
Adauth.connection.delete(dn: @ldap_object.dn)
|
161
|
+
end
|
162
|
+
|
155
163
|
private
|
156
164
|
|
157
165
|
def convert_to_objects(array)
|
@@ -20,15 +20,24 @@ module Adauth
|
|
20
20
|
:cn_members => [ :member,
|
21
21
|
Proc.new {|g| g.sub(/.*?CN=(.*?),.*/, '\1')} ],
|
22
22
|
:memberof => :member
|
23
|
-
#:cn_groups => [ :memberof,
|
24
|
-
# Proc.new {|g| g.sub(/.*?CN=(.*?),.*/, '\1')} ]
|
25
23
|
}
|
26
24
|
|
27
25
|
# Object Net::LDAP filter
|
28
26
|
#
|
29
27
|
# Used to restrict searches' to just this object
|
30
28
|
ObjectFilter = Net::LDAP::Filter.eq("objectClass", "group")
|
31
|
-
|
29
|
+
|
30
|
+
# Create a new Group
|
31
|
+
def self.new_group(name, parent)
|
32
|
+
expects parent, [Adauth::AdObjects::OU, Adauth::AdObjects::Folder]
|
33
|
+
attributes = {
|
34
|
+
cn: name,
|
35
|
+
objectclass: ["top", "group"]
|
36
|
+
}
|
37
|
+
Adauth.connection.add(dn: "CN=#{name},#{parent.ldap_object.dn}", attributes: attributes )
|
38
|
+
return Adauth::AdObjects::Group.where('name', name).first
|
39
|
+
end
|
40
|
+
|
32
41
|
# Returns all the objects which are members of this group
|
33
42
|
def members
|
34
43
|
Adauth.logger.info(self.class.inspect) { "Getting group members for #{self.name}" }
|
@@ -48,6 +48,18 @@ module Adauth
|
|
48
48
|
modify([[:replace, :unicodePwd, password]])
|
49
49
|
end
|
50
50
|
|
51
|
+
# Add the user to the supplied group
|
52
|
+
def add_to_group(group)
|
53
|
+
expects group, Adauth::AdObjects::Group
|
54
|
+
group.modify([[:add, :member, @ldap_object.dn]])
|
55
|
+
end
|
56
|
+
|
57
|
+
# Remove the user from the supplied group
|
58
|
+
def remove_from_group(group)
|
59
|
+
expects group, Adauth::AdObjects::Group
|
60
|
+
group.modify([[:delete, :member, @ldap_object.dn]])
|
61
|
+
end
|
62
|
+
|
51
63
|
private
|
52
64
|
|
53
65
|
def microsoft_encode_password(password)
|
data/lib/adauth/config.rb
CHANGED
@@ -4,7 +4,8 @@ module Adauth
|
|
4
4
|
# Sets the defaults an create and generates guess values.
|
5
5
|
class Config
|
6
6
|
attr_accessor :domain, :port, :base, :server, :encryption, :query_user, :query_password, :allow_fallback,
|
7
|
-
:allowed_groups, :denied_groups, :allowed_ous, :denied_ous, :contains_nested_groups
|
7
|
+
:allowed_groups, :denied_groups, :allowed_ous, :denied_ous, :contains_nested_groups,
|
8
|
+
:anonymous_bind
|
8
9
|
|
9
10
|
def initialize
|
10
11
|
@port = 389
|
@@ -14,6 +15,7 @@ module Adauth
|
|
14
15
|
@denied_ous = []
|
15
16
|
@allow_fallback = false
|
16
17
|
@contains_nested_groups = false
|
18
|
+
@anonymous_bind = false
|
17
19
|
end
|
18
20
|
|
19
21
|
# Guesses the Server and Base string
|
data/lib/adauth/connection.rb
CHANGED
@@ -3,7 +3,10 @@ module Adauth
|
|
3
3
|
#
|
4
4
|
# Handles errors and configures the connection.
|
5
5
|
class Connection
|
6
|
+
include Expects
|
7
|
+
|
6
8
|
def initialize(config)
|
9
|
+
expects config, Hash
|
7
10
|
@config = config
|
8
11
|
end
|
9
12
|
|
@@ -19,7 +22,9 @@ module Adauth
|
|
19
22
|
if @config[:encryption]
|
20
23
|
conn.encryption @config[:encryption]
|
21
24
|
end
|
22
|
-
|
25
|
+
|
26
|
+
raise "Anonymous Bind is disabled" if @config[:password] == "" && !(@config[:anonymous_bind])
|
27
|
+
|
23
28
|
conn.auth "#{@config[:username]}@#{@config[:domain]}", @config[:password]
|
24
29
|
|
25
30
|
begin
|
data/lib/adauth/version.rb
CHANGED
data/rspec_results.txt
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
|
1
|
+
....................*..................
|
2
2
|
|
3
3
|
Pending:
|
4
4
|
Adauth::AdObjects::User should allow you to reset the password
|
5
5
|
# Insecure connection, unable to test change password
|
6
|
-
# ./spec/adauth_ad_object_user_spec.rb:
|
6
|
+
# ./spec/adauth_ad_object_user_spec.rb:54
|
7
7
|
|
8
|
-
Finished in
|
9
|
-
|
10
|
-
Coverage report generated for RSpec to /Users/arcath/Code/Gems/Adauth/coverage.
|
8
|
+
Finished in 28.72 seconds
|
9
|
+
39 examples, 0 failures, 1 pending
|
10
|
+
Coverage report generated for RSpec to /Users/arcath/Code/Gems/Adauth/coverage. 534 / 551 LOC (96.91%) covered.
|
@@ -5,6 +5,10 @@ describe Adauth::AdObjects::Group do
|
|
5
5
|
Adauth::AdObjects::Group.where('name', 'Domain Admins').first
|
6
6
|
end
|
7
7
|
|
8
|
+
let(:test_ou) do
|
9
|
+
Adauth::AdObjects::OU.where('name', test_data("domain", "testable_ou")).first
|
10
|
+
end
|
11
|
+
|
8
12
|
it "should have a name" do
|
9
13
|
default_config
|
10
14
|
domain_admins.name.should eq "Domain Admins"
|
@@ -13,11 +17,19 @@ describe Adauth::AdObjects::Group do
|
|
13
17
|
it "should have a members list" do
|
14
18
|
default_config
|
15
19
|
domain_admins.members.should be_a Array
|
16
|
-
domain_admins.members.
|
20
|
+
domain_admins.members.last.name.should be_a String
|
17
21
|
end
|
18
22
|
|
19
23
|
it "should be a member of" do
|
20
24
|
default_config
|
21
25
|
domain_admins.groups.should be_a Array
|
22
26
|
end
|
27
|
+
|
28
|
+
it "should let you create and destroy a group" do
|
29
|
+
default_config
|
30
|
+
new_group = Adauth::AdObjects::Group.new_group("Adauth Test Group", test_ou)
|
31
|
+
new_group.should be_a Adauth::AdObjects::Group
|
32
|
+
new_group.delete
|
33
|
+
Adauth::AdObjects::Group.where('name', "Adauth Test Group").count.should eq 0
|
34
|
+
end
|
23
35
|
end
|
@@ -5,6 +5,10 @@ describe Adauth::AdObjects::User do
|
|
5
5
|
Adauth::AdObjects::User.where('sAMAccountName', test_data("domain", "breakable_user")).first
|
6
6
|
end
|
7
7
|
|
8
|
+
let(:test_ou) do
|
9
|
+
Adauth::AdObjects::OU.where('name', test_data("domain", "testable_ou")).first
|
10
|
+
end
|
11
|
+
|
8
12
|
it "should find administrator" do
|
9
13
|
default_config
|
10
14
|
user.login.should eq test_data("domain", "breakable_user")
|
@@ -13,6 +17,7 @@ describe Adauth::AdObjects::User do
|
|
13
17
|
it "should authenticate a user" do
|
14
18
|
default_config
|
15
19
|
Adauth::AdObjects::User.authenticate(test_data("domain", "query_user"), test_data("domain", "query_password")).should be_true
|
20
|
+
lambda { Adauth::AdObjects::User.authenticate(test_data("domain", "query_user"), "does not work") }.should raise_exception
|
16
21
|
end
|
17
22
|
|
18
23
|
it "should find groups" do
|
@@ -60,4 +65,25 @@ describe Adauth::AdObjects::User do
|
|
60
65
|
pending("Insecure connection, unable to test change password")
|
61
66
|
end
|
62
67
|
end
|
68
|
+
|
69
|
+
it "should be able to add a user to a group" do
|
70
|
+
default_config
|
71
|
+
new_group = Adauth::AdObjects::Group.new_group("Adauth Test Group", test_ou)
|
72
|
+
user.add_to_group new_group
|
73
|
+
rq_user = Adauth::AdObjects::User.where('sAMAccountName', test_data("domain", "breakable_user")).first
|
74
|
+
rq_user.member_of?("Adauth Test Group").should be_true
|
75
|
+
new_group.delete
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should be able to remove a user from a group" do
|
79
|
+
default_config
|
80
|
+
new_group = Adauth::AdObjects::Group.new_group("Adauth Test Group", test_ou)
|
81
|
+
user.add_to_group new_group
|
82
|
+
rq_user = Adauth::AdObjects::User.where('sAMAccountName', test_data("domain", "breakable_user")).first
|
83
|
+
rq_user.member_of?("Adauth Test Group").should be_true
|
84
|
+
rq_user.remove_from_group new_group
|
85
|
+
rq_user = Adauth::AdObjects::User.where('sAMAccountName', test_data("domain", "breakable_user")).first
|
86
|
+
rq_user.member_of?("Adauth Test Group").should be_false
|
87
|
+
new_group.delete
|
88
|
+
end
|
63
89
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "issue #37" do
|
4
|
+
it "should not happen" do
|
5
|
+
default_config
|
6
|
+
ldap_user = Adauth.authenticate("administrator", "foo")
|
7
|
+
ldap_user.should be_false
|
8
|
+
ldap_user = Adauth.authenticate(test_data("domain", "breakable_user"), "")
|
9
|
+
ldap_user.should be_false
|
10
|
+
ldap_user = Adauth.authenticate(test_data("domain", "query_user"), test_data("domain", "query_password"))
|
11
|
+
ldap_user.should be_a Adauth::AdObjects::User
|
12
|
+
end
|
13
|
+
end
|
data/spec/test_data.example.yml
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: adauth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam "Arcath" Laycock
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - '>='
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: expects
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.0.2
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.0.2
|
83
97
|
description: A full featured library for working with Microsofts Active Directory
|
84
98
|
in Ruby.
|
85
99
|
email:
|
@@ -128,12 +142,14 @@ files:
|
|
128
142
|
- spec/adauth_authenticate_spec.rb
|
129
143
|
- spec/adauth_config_spec.rb
|
130
144
|
- spec/adauth_connection_spec.rb
|
145
|
+
- spec/adauth_issue_spec.rb
|
131
146
|
- spec/adauth_rails_model_bridge_spec.rb
|
132
147
|
- spec/adauth_spec.rb
|
133
148
|
- spec/spec_helper.rb
|
134
149
|
- spec/test_data.example.yml
|
135
150
|
homepage: http://adauth.arcath.net
|
136
|
-
licenses:
|
151
|
+
licenses:
|
152
|
+
- MIT
|
137
153
|
metadata: {}
|
138
154
|
post_install_message:
|
139
155
|
rdoc_options: []
|
@@ -165,6 +181,7 @@ test_files:
|
|
165
181
|
- spec/adauth_authenticate_spec.rb
|
166
182
|
- spec/adauth_config_spec.rb
|
167
183
|
- spec/adauth_connection_spec.rb
|
184
|
+
- spec/adauth_issue_spec.rb
|
168
185
|
- spec/adauth_rails_model_bridge_spec.rb
|
169
186
|
- spec/adauth_spec.rb
|
170
187
|
- spec/spec_helper.rb
|