adauth 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cffe1ba97471be1224d557a5df97bd0e16e5eb59
4
+ data.tar.gz: d080e1a4e3a065c57da6c7281c60c79e0fe82f07
5
+ SHA512:
6
+ metadata.gz: 12b8d3a9a46735f4528a890272db9c52434883bbc922f46f243957e87fb6acdf1e7f4abf42d70ca0bed4af8ad2ade0947b5918496af5fbca9e89495e8acab224
7
+ data.tar.gz: 94ec81bf3fb570be993eb87d51de4543ff11c91de5742e30ef26a7f7acefef8aca2866d76fdde8f87750eb71ffccf7e53f2c05acef3e381959b067d95e0db6a3
data/.gitignore CHANGED
@@ -8,6 +8,7 @@ doc/*
8
8
  .idea/
9
9
  .rvmrc
10
10
  log/*
11
+ coverage/*
11
12
 
12
13
  spec/test.sqlite3
13
14
 
@@ -2,11 +2,18 @@ language: ruby
2
2
  rvm:
3
3
  - 1.8.7
4
4
  - 1.9.3
5
+ - 2.0.0
5
6
  - rbx-18mode
6
7
  - rbx-19mode
8
+ - ruby-head
7
9
  env:
8
- - "rake=0.8"
9
10
  - "rake=0.9"
10
11
  script: "bundle exec rspec -t no_ad"
12
+ before_script: "mkdir log"
11
13
  notifications:
12
14
  email: false
15
+ matrix:
16
+ allow_failures:
17
+ - rvm: 1.8.7
18
+ - rvm: rbx-18mode
19
+ - rvm: ruby-head
data/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
- source :rubygems
1
+ source "https://rubygems.org"
2
2
 
3
3
  gemspec
@@ -1,13 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- adauth (2.0.0pre1)
4
+ adauth (2.0.0)
5
5
  net-ldap
6
6
 
7
7
  GEM
8
- remote: http://rubygems.org/
8
+ remote: https://rubygems.org/
9
9
  specs:
10
10
  diff-lcs (1.1.3)
11
+ multi_json (1.7.7)
11
12
  net-ldap (0.3.1)
12
13
  rake (0.9.2.2)
13
14
  rspec (2.11.0)
@@ -18,6 +19,11 @@ GEM
18
19
  rspec-expectations (2.11.2)
19
20
  diff-lcs (~> 1.1.3)
20
21
  rspec-mocks (2.11.2)
22
+ simplecov (0.7.1)
23
+ multi_json (~> 1.0)
24
+ simplecov-html (~> 0.7.1)
25
+ simplecov-html (0.7.1)
26
+ yard (0.8.6.2)
21
27
 
22
28
  PLATFORMS
23
29
  ruby
@@ -26,3 +32,5 @@ DEPENDENCIES
26
32
  adauth!
27
33
  rake
28
34
  rspec
35
+ simplecov
36
+ yard
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013 Adam Laycock
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/Rakefile CHANGED
@@ -1,4 +1,13 @@
1
1
  require 'rubygems'
2
2
  require 'bundler'
3
3
 
4
- Bundler::GemHelper.install_tasks
4
+ Bundler::GemHelper.install_tasks
5
+
6
+ desc "Save test results to a file"
7
+ task :generate_test_results do
8
+ puts "Running Tests"
9
+ system("rspec -c > rspec_results.txt")
10
+ puts "Saved!"
11
+ puts "Results:"
12
+ system("cat rspec_results.txt")
13
+ end
data/Readme.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # Adauth
2
- [RDoc](http://rubydoc.info/github/Arcath/Adauth/master/frames) | [www](http://adauth.arcath.net) | [Gempage](http://rubygems.org/gems/adauth) | [![Status](https://secure.travis-ci.org/Arcath/Adauth.png?branch=master)](http://travis-ci.org/Arcath/Adauth)
2
+ [RDoc](http://rubydoc.info/github/Arcath/Adauth/master/frames) | [www](http://adauth.arcath.net) | [Gempage](http://rubygems.org/gems/adauth) | [![Status](https://secure.travis-ci.org/Arcath/Adauth.png?branch=master)](http://travis-ci.org/Arcath/Adauth) | [![Code Climate](https://codeclimate.com/github/Arcath/Adauth.png)](https://codeclimate.com/github/Arcath/Adauth) | [![Dependency Status](https://gemnasium.com/Arcath/Adauth.png)](https://gemnasium.com/Arcath/Adauth)
3
+
3
4
 
4
5
  Easy to use Active Directory Authentication for Rails.
5
6
 
@@ -14,6 +14,8 @@ Gem::Specification.new do |s|
14
14
 
15
15
  s.add_development_dependency "rake"
16
16
  s.add_development_dependency "rspec"
17
+ s.add_development_dependency "simplecov"
18
+ s.add_development_dependency "yard"
17
19
  s.add_dependency "net-ldap"
18
20
 
19
21
  s.files = `git ls-files`.split("\n")
@@ -1,7 +1,7 @@
1
1
  # Requires
2
+ require 'logger'
2
3
  require 'net/ldap'
3
4
  require 'timeout'
4
- require 'logger'
5
5
  # Version
6
6
  require 'adauth/version'
7
7
  # Classes
@@ -28,6 +28,7 @@ module Adauth
28
28
  def self.configure
29
29
  @logger ||= Logger.new('log/adauth.log', 'weekly')
30
30
  @logger.info('load') { "Loading new config" }
31
+ @connection = nil
31
32
  @config = Config.new
32
33
  yield(@config)
33
34
  end
@@ -53,16 +54,19 @@ module Adauth
53
54
  :server => @config.server,
54
55
  :port => @config.port,
55
56
  :base => @config.base,
56
- :encryption => @config.encryption,
57
+ :encryption => @config.encryption,
58
+ :allow_fallback => @config.allow_fallback,
57
59
  :username => user,
58
60
  :password => password
59
61
  }
60
62
  end
61
63
 
64
+ # Returns the logger object
62
65
  def self.logger
63
66
  @logger
64
67
  end
65
68
 
69
+ # Lets you set a new logger
66
70
  def self.logger=(inputs)
67
71
  @logger = inputs
68
72
  end
@@ -14,10 +14,10 @@ module Adauth
14
14
  # Objects inherit from this class.
15
15
  #
16
16
  # Provides all the common functions for Active Directory.
17
- class AdObject
17
+ class AdObject
18
18
  # Returns all objects which have the ObjectClass of the inherited class
19
19
  def self.all
20
- Adauth.logger.info(self.inspect) { "Searching for all objects matching filter \"#{self::ObjectFilter}\"" }
20
+ Adauth.logger.info(self.class.inspect) { "Searching for all objects matching filter \"#{self::ObjectFilter}\"" }
21
21
  self.filter(self::ObjectFilter)
22
22
  end
23
23
 
@@ -26,7 +26,7 @@ module Adauth
26
26
  # Uses ObjectFilter to restrict to the current object
27
27
  def self.where(field, value)
28
28
  search_filter = Net::LDAP::Filter.eq(field, value)
29
- Adauth.logger.info(self.inspect) { "Searching for all \"#{self::ObjectFilter}\" where #{field} = #{value}" }
29
+ Adauth.logger.info(self.class.inspect) { "Searching for all \"#{self::ObjectFilter}\" where #{field} = #{value}" }
30
30
  filter(add_object_filter(search_filter))
31
31
  end
32
32
 
@@ -62,18 +62,19 @@ module Adauth
62
62
  @ldap_object
63
63
  end
64
64
 
65
- # Over rides method_missing and interacts with @ldap_object
65
+ # Over ride method missing to see if the object has a field by that name
66
66
  def method_missing(method, *args)
67
- if self.class::Fields.keys.include?(method)
68
- field = self.class::Fields[method]
69
- if field.is_a? Symbol
70
- return (@ldap_object.send(field).to_s).gsub(/\"|\[|\]/, "")
71
- elsif field.is_a? Array
72
- @ldap_object.send(field.first).collect(&field.last)
73
- end
74
- else
75
- super
76
- end
67
+ field = self.class::Fields[method]
68
+ return handle_field(field) if field
69
+ return super
70
+ end
71
+
72
+ # Handle the output for the given field
73
+ def handle_field(field)
74
+ case field
75
+ when Symbol then return return_symbol_value(field)
76
+ when Array then return @ldap_object.send(field.first).collect(&field.last)
77
+ end
77
78
  end
78
79
 
79
80
  # Returns all the groups the object is a member of
@@ -84,6 +85,19 @@ module Adauth
84
85
  @groups
85
86
  end
86
87
 
88
+ # The same as cn_groups, but with the parent groups included
89
+ def cn_groups_nested
90
+ @cn_groups_nested = cn_groups
91
+ cn_groups.each do |group|
92
+ ado = Adauth::AdObjects::Group.where('name', group).first
93
+ groups = convert_to_objects ado.cn_groups
94
+ groups.each do |g|
95
+ @cn_groups_nested.push g if !(@cn_groups_nested.include?(g))
96
+ end
97
+ end
98
+ return @cn_groups_nested
99
+ end
100
+
87
101
  # Returns all the ous the object is in
88
102
  def ous
89
103
  unless @ous
@@ -108,7 +122,11 @@ module Adauth
108
122
 
109
123
  # Runs a modify action on the current object, takes an aray of operations
110
124
  def modify(operations)
111
- raise 'Modify Operation Failed' unless Adauth.connection.modify :dn => @ldap_object.dn, :operations => operations
125
+ Adauth.logger.info(self.class.inspect) { "Attempting modify operation" }
126
+ unless Adauth.connection.modify :dn => @ldap_object.dn, :operations => operations
127
+ Adauth.logger.fatal(self.class.inspect) { "Modify Operation Failed! Code: #{Adauth.connection.get_operation_result.code} Message: #{Adauth.connection.get_operation_result.message}" }
128
+ raise 'Modify Operation Failed (see log for details)'
129
+ end
112
130
  end
113
131
 
114
132
  # Returns an array of member objects for this object
@@ -149,5 +167,13 @@ module Adauth
149
167
  group = Adauth::AdObjects::Group.where('sAMAccountName', entity).first
150
168
  (user || group)
151
169
  end
170
+
171
+ def return_symbol_value(field)
172
+ value = @ldap_object.send(field)
173
+ case value
174
+ when String then return value
175
+ when Net::BER::BerIdentifiedArray then return value.first
176
+ end
177
+ end
152
178
  end
153
179
  end
@@ -19,8 +19,9 @@ module Adauth
19
19
  :name => :samaccountname,
20
20
  :cn_members => [ :member,
21
21
  Proc.new {|g| g.sub(/.*?CN=(.*?),.*/, '\1')} ],
22
- :cn_groups => [ :memberof,
23
- Proc.new {|g| g.sub(/.*?CN=(.*?),.*/, '\1')} ]
22
+ :memberof => :member
23
+ #:cn_groups => [ :memberof,
24
+ # Proc.new {|g| g.sub(/.*?CN=(.*?),.*/, '\1')} ]
24
25
  }
25
26
 
26
27
  # Object Net::LDAP filter
@@ -30,12 +31,16 @@ module Adauth
30
31
 
31
32
  # Returns all the objects which are members of this group
32
33
  def members
33
- Adauth.logger.info(self.inspect) { "Getting group members for #{self.name}" }
34
+ Adauth.logger.info(self.class.inspect) { "Getting group members for #{self.name}" }
34
35
  unless @members
35
36
  @members = convert_to_objects(cn_members)
36
37
  end
37
38
  @members
38
39
  end
40
+
41
+ def cn_groups
42
+ memberof.split(/.*?CN=(.*?),.*/)
43
+ end
39
44
  end
40
45
  end
41
46
  end
@@ -42,11 +42,11 @@ module Adauth
42
42
  end
43
43
 
44
44
  # Changes the password to the supplied value
45
- #def set_password(new_password)
46
- # Adauth.logger.info("password management") { "Attempting password reset for #{self.login}" }
47
- # password = microsoft_encode_password(new_password)
48
- # modify([[:replace, 'unicodePwd', password]])
49
- #end
45
+ def set_password(new_password)
46
+ Adauth.logger.info("password management") { "Attempting password reset for #{self.login}" }
47
+ password = microsoft_encode_password(new_password)
48
+ modify([[:replace, :unicodePwd, password]])
49
+ end
50
50
 
51
51
  private
52
52
 
@@ -7,16 +7,13 @@ module Adauth
7
7
  Adauth.logger.info("authentication") { "Attempting to authenticate as #{username}" }
8
8
  if Adauth::AdObjects::User.authenticate(username, password)
9
9
  user = Adauth::AdObjects::User.where('sAMAccountName', username).first
10
- if allowed_group_login(user) && allowed_ou_login(user)
10
+ if allowed_to_login(user)
11
11
  Adauth.logger.info("authentication") { "Authentication succesful" }
12
12
  return user
13
13
  else
14
- Adauth.logger.info("authentication") { "Authentication failed (not in allowed group)" }
14
+ Adauth.logger.info("authentication") { "Authentication failed (not in allowed group or ou)" }
15
15
  return false
16
16
  end
17
- else
18
- Adauth.logger.info("authentication") { "Authentication failed (bad username/password)" }
19
- return false
20
17
  end
21
18
  rescue RuntimeError
22
19
  Adauth.logger.info("authentication") { "Authentication failed (RuntimeError)" }
@@ -24,63 +21,16 @@ module Adauth
24
21
  end
25
22
  end
26
23
 
27
- # Makes sure the user meets the group requirements
28
- def self.allowed_group_login(user)
29
- if @config.allowed_groups != []
30
- allowed = (user && @config.allowed_groups != (@config.allowed_groups - user.cn_groups)) ? user : nil
31
-
32
- if allowed == nil
33
- allowed = is_group_in_group(user) != nil ? user : nil
34
- end
35
- else
36
- allowed = user
37
- end
38
-
39
- if @config.denied_groups != []
40
- denied = (user && @config.denied_groups == (@config.denied_groups - user.cn_groups)) ? user : nil
41
- else
42
- denied = user
43
- end
44
-
45
- allowed == denied
24
+ # Check if the user is allowed to login
25
+ def self.allowed_to_login(user)
26
+ (allowed_from_arrays(@config.allowed_groups, @config.denied_groups, user.cn_groups_nested) && allowed_from_arrays(@config.allowed_ous, @config.denied_ous, user.dn_ous))
46
27
  end
47
28
 
48
- # Makes sure the user meets the ou requirements
49
- def self.allowed_ou_login(user)
50
- if @config.allowed_ous != []
51
- allowed = (user && @config.allowed_ous != (@config.allowed_ous - user.dn_ous)) ? user : nil
52
- else
53
- allowed = user
54
- end
55
-
56
- if @config.denied_ous != []
57
- denied = (user && @config.denied_ous == (@config.denied_ous - user.dn_ous)) ? user : nil
58
- else
59
- denied = user
60
- end
61
-
62
- allowed == denied
63
- end
64
-
65
- def self.is_group_in_group(adobject)
66
- # Loop through each users group and see if it's a member of an allowed group
67
- begin
68
- adobject.cn_groups.each do |group|
69
-
70
- if @config.allowed_groups.include?(group)
71
- return group
72
- end
73
-
74
- adGroup = Adauth::AdObjects::Group.where('name', group).first
75
-
76
- unless self.is_group_in_group(adGroup) == nil
77
- return true
78
- end
79
- end
80
- rescue
81
- return nil
29
+ private
30
+
31
+ def self.allowed_from_arrays(allowed, denied, test)
32
+ return true if allowed.empty? && denied.empty?
33
+ return true if !((allowed & test).empty?)
34
+ return false if !((denied & test).empty?)
82
35
  end
83
-
84
- nil
85
- end
86
36
  end
@@ -3,7 +3,7 @@ module Adauth
3
3
  #
4
4
  # Sets the defaults an create and generates guess values.
5
5
  class Config
6
- attr_accessor :domain, :port, :base, :server, :encryption, :query_user, :query_password,
6
+ attr_accessor :domain, :port, :base, :server, :encryption, :query_user, :query_password, :allow_fallback,
7
7
  :allowed_groups, :denied_groups, :allowed_ous, :denied_ous, :contains_nested_groups
8
8
 
9
9
  def initialize
@@ -12,6 +12,7 @@ module Adauth
12
12
  @allowed_ous = []
13
13
  @denied_groups =[]
14
14
  @denied_ous = []
15
+ @allow_fallback = false
15
16
  @contains_nested_groups = false
16
17
  end
17
18
 
@@ -32,6 +32,12 @@ module Adauth
32
32
  }
33
33
  rescue Timeout::Error
34
34
  raise 'Unable to connect to LDAP Server'
35
+ rescue Errno::ECONNRESET
36
+ if @config[:allow_fallback]
37
+ @config[:port] = @config[:allow_fallback]
38
+ @config[:encryption] = false
39
+ return Adauth::Connection.new(@config).bind
40
+ end
35
41
  end
36
42
  end
37
43
  end
@@ -64,6 +64,7 @@ module Net::BER::Extensions::String
64
64
  return result
65
65
  end
66
66
 
67
+ # Removes empty blocks from arrays
67
68
  def reject_empty_ber_arrays
68
69
  self.gsub(/0\000/n,'')
69
70
  end
@@ -1,4 +1,4 @@
1
1
  module Adauth
2
2
  # Adauths Version Number
3
- Version = '2.0.0'
3
+ Version = '2.0.1'
4
4
  end
@@ -0,0 +1,10 @@
1
+ ...................*...............
2
+
3
+ Pending:
4
+ Adauth::AdObjects::User should allow you to reset the password
5
+ # Insecure connection, unable to test change password
6
+ # ./spec/adauth_ad_object_user_spec.rb:49
7
+
8
+ Finished in 12.3 seconds
9
+ 35 examples, 0 failures, 1 pending
10
+ Coverage report generated for RSpec to /Users/arcath/Code/Gems/Adauth/coverage. 472 / 489 LOC (96.52%) covered.
@@ -1,9 +1,14 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Adauth::AdObjects::Computer do
4
+ let(:computer) do
5
+ ou = Adauth::AdObjects::OU.where('name', 'Domain Controllers').first
6
+ ou.members.first
7
+ end
8
+
4
9
  it "Should find a computer" do
5
10
  default_config
6
- pdc.should be_a Adauth::AdObjects::Computer
11
+ computer.should be_a Adauth::AdObjects::Computer
7
12
  end
8
13
 
9
14
  it "should only find computers" do
@@ -15,8 +20,8 @@ describe Adauth::AdObjects::Computer do
15
20
 
16
21
  it "should be in an ou" do
17
22
  default_config
18
- pdc.ous.should be_a Array
19
- pdc.ous.first.should be_a Adauth::AdObjects::OU
20
- pdc.ous.first.name.should eq "Domain Controllers"
23
+ computer.ous.should be_a Array
24
+ computer.ous.first.should be_a Adauth::AdObjects::OU
25
+ computer.ous.first.name.should eq "Domain Controllers"
21
26
  end
22
27
  end
@@ -1,13 +1,17 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Adauth::AdObjects::Folder do
4
- it "should find Domain Controllers" do
4
+ let(:root_folder) do
5
+ Adauth::AdObjects::Folder.root
6
+ end
7
+
8
+ it "should find the root of the domain" do
5
9
  default_config
6
- Adauth::AdObjects::Folder.root.should be_a Adauth::AdObjects::Folder
10
+ root_folder.should be_a Adauth::AdObjects::Folder
7
11
  end
8
12
 
9
13
  it "should have members" do
10
14
  default_config
11
- Adauth::AdObjects::Folder.root.members.should be_a Array
15
+ root_folder.members.should be_a Array
12
16
  end
13
17
  end
@@ -1,21 +1,23 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Adauth::AdObjects::Group do
4
+ let(:domain_admins) do
5
+ Adauth::AdObjects::Group.where('name', 'Domain Admins').first
6
+ end
7
+
4
8
  it "should have a name" do
5
9
  default_config
6
- group = domain_admins
7
- group.name.should eq "Domain Admins"
10
+ domain_admins.name.should eq "Domain Admins"
8
11
  end
9
12
 
10
13
  it "should have a members list" do
11
14
  default_config
12
- group = domain_admins
13
- group.members.first.name.should be_a String
15
+ domain_admins.members.should be_a Array
16
+ domain_admins.members.first.name.should be_a String
14
17
  end
15
18
 
16
19
  it "should be a member of" do
17
20
  default_config
18
- group = domain_admins
19
- group.groups.should be_a Array
21
+ domain_admins.groups.should be_a Array
20
22
  end
21
23
  end
@@ -1,6 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Adauth::AdObjects::OU do
4
+ let(:domain_controllers) do
5
+ Adauth::AdObjects::OU.where('name', 'Domain Controllers').first
6
+ end
7
+
4
8
  it "should find Domain Controllers" do
5
9
  default_config
6
10
  domain_controllers.should be_a Adauth::AdObjects::OU
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe Adauth::AdObject do
4
+ let(:computer) do
5
+ ou = Adauth::AdObjects::OU.where('name', 'Domain Controllers').first
6
+ ou.members.first
7
+ end
8
+
9
+ let(:user) do
10
+ Adauth::AdObjects::User.where('sAMAccountName', test_data("domain", "breakable_user")).first
11
+ end
12
+
13
+ it "should still have method missing" do
14
+ default_config
15
+ computer.should be_a Adauth::AdObjects::Computer
16
+ lambda { computer.foo_bar }.should raise_exception NoMethodError
17
+ end
18
+
19
+ it "should generate a nested group list" do
20
+ user.cn_groups.should_not eq user.cn_groups_nested
21
+ end
22
+ end
@@ -1,10 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Adauth::AdObjects::User do
4
+ let(:user) do
5
+ Adauth::AdObjects::User.where('sAMAccountName', test_data("domain", "breakable_user")).first
6
+ end
7
+
4
8
  it "should find administrator" do
5
9
  default_config
6
- user = administrator
7
- user.login.should eq "Administrator"
10
+ user.login.should eq test_data("domain", "breakable_user")
8
11
  end
9
12
 
10
13
  it "should authenticate a user" do
@@ -14,40 +17,47 @@ describe Adauth::AdObjects::User do
14
17
 
15
18
  it "should find groups" do
16
19
  default_config
17
- user = administrator
18
20
  user.groups.should be_a Array
19
21
  user.groups.first.should be_a Adauth::AdObjects::Group
20
22
  end
21
23
 
22
- it "should return true for member_of" do
24
+ it "should return boolean for member_of" do
23
25
  default_config
24
- user = administrator
25
- user.member_of?("Domain Admins").should be_true
26
+ user.member_of?("A Group").should be_false
26
27
  end
27
28
 
28
29
  it "should allow for modification" do
29
30
  default_config
30
31
  Adauth.add_field(Adauth::AdObjects::User, :phone, :homePhone)
31
- number = administrator.phone
32
- administrator.modify([[:replace, :homephone, "8765"]])
33
- administrator.phone.should eq "8765"
34
- administrator.modify([[:replace, :homephone, number]])
32
+ number = user.phone
33
+ user.modify([[:replace, :homephone, "8765"]])
34
+ new_user = Adauth::AdObjects::User.where('sAMAccountName', test_data("domain", "breakable_user")).first
35
+ new_user.phone.should eq "8765"
36
+ new_user.modify([[:replace, :homephone, number]])
37
+ new2_user = Adauth::AdObjects::User.where('sAMAccountName', test_data("domain", "breakable_user")).first
38
+ new2_user.phone.should eq number
35
39
  end
36
40
 
37
41
  it "should allow for additional methods" do
38
42
  default_config
39
43
  Adauth.add_field(Adauth::AdObjects::User, :description, :description)
40
44
  administrator.description.should be_a String
45
+ Adauth.add_field(Adauth::AdObjects::User, :objectguid, :objectguid)
46
+ administrator.objectguid.should be_a String
41
47
  end
42
48
 
43
- #it "should allow you to reset the password" do
44
- # default_config
45
- # Adauth::AdObjects::User.authenticate(test_data("domain", "breakable_user"), test_data("domain", "breakable_password")).should be_true
46
- # user = Adauth::AdObjects::User.where('sAMAccountName', test_data("domain", "breakable_user")).first
47
- # user.login.should eq test_data("domain", "breakable_user")
48
- # user.set_password("adauth_test")
49
- # Adauth::AdObjects::User.authenticate(test_data("domain", "breakable_user"), "adauth_test").should be_true
50
- # user.set_password(test_data("domain", "breakable_password"))
51
- # Adauth::AdObjects::User.authenticate(test_data("domain", "breakable_user"), test_data("domain", "breakable_password")).should be_true
52
- #end
49
+ it "should allow you to reset the password" do
50
+ default_config
51
+ begin
52
+ Adauth::AdObjects::User.authenticate(test_data("domain", "breakable_user"), test_data("domain", "breakable_password")).should be_true
53
+ user = Adauth::AdObjects::User.where('sAMAccountName', test_data("domain", "breakable_user")).first
54
+ user.login.should eq test_data("domain", "breakable_user")
55
+ user.set_password("adauth_test")
56
+ Adauth::AdObjects::User.authenticate(test_data("domain", "breakable_user"), "adauth_test").should be_true
57
+ user.set_password(test_data("domain", "breakable_password"))
58
+ Adauth::AdObjects::User.authenticate(test_data("domain", "breakable_user"), test_data("domain", "breakable_password")).should be_true
59
+ rescue RuntimeError
60
+ pending("Insecure connection, unable to test change password")
61
+ end
62
+ end
53
63
  end
@@ -11,6 +11,32 @@ describe Adauth, "#authenticate" do
11
11
  Adauth.authenticate(test_data("domain", "query_user"), "foo").should be_false
12
12
  end
13
13
 
14
+ it "should allow the user if allowed groups are used" do
15
+ Adauth.configure do |c|
16
+ c.domain = test_data("domain", "domain")
17
+ c.port = test_data("domain", "port")
18
+ c.base = test_data("domain", "base")
19
+ c.server = test_data("domain", "server")
20
+ c.query_user = test_data("domain", "query_user")
21
+ c.query_password = test_data("domain", "query_password")
22
+ c.allowed_groups = ["Administrators"]
23
+ end
24
+ Adauth.authenticate(test_data("domain", "query_user"), test_data("domain", "query_password")).should be_a Adauth::AdObjects::User
25
+ end
26
+
27
+ it "should allow the user if allowed ous are used" do
28
+ Adauth.configure do |c|
29
+ c.domain = test_data("domain", "domain")
30
+ c.port = test_data("domain", "port")
31
+ c.base = test_data("domain", "base")
32
+ c.server = test_data("domain", "server")
33
+ c.query_user = test_data("domain", "query_user")
34
+ c.query_password = test_data("domain", "query_password")
35
+ c.allowed_ous = ["Users"]
36
+ end
37
+ Adauth.authenticate(test_data("domain", "query_user"), test_data("domain", "query_password")).should be_a Adauth::AdObjects::User
38
+ end
39
+
14
40
  it "should reject a user if denied group is used" do
15
41
  Adauth.configure do |c|
16
42
  c.domain = test_data("domain", "domain")
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Adauth::Connection do
4
+ it "should support encryption" do
5
+ Adauth.configure do |c|
6
+ c.domain = test_data("domain", "domain")
7
+ c.port = test_data("domain", "port")
8
+ c.base = test_data("domain", "base")
9
+ c.server = test_data("domain", "server")
10
+ c.encryption = :simple_tls
11
+ c.query_user = test_data("domain", "query_user")
12
+ c.query_password = test_data("domain", "query_password")
13
+ end
14
+ begin
15
+ Adauth.authenticate(test_data("domain", "query_user"), test_data("domain", "query_password"))
16
+ rescue
17
+ # Failed to authenticate due to encryption (not what we are testing here)
18
+ end
19
+ end
20
+
21
+ it "should timeout if asked to connect to a server that doesn't exist" do
22
+ Adauth.configure do |c|
23
+ c.domain = test_data("domain", "domain")
24
+ c.port = test_data("domain", "port")
25
+ c.base = test_data("domain", "base")
26
+ c.server = "127.0.0.2"
27
+ c.query_user = test_data("domain", "query_user")
28
+ c.query_password = test_data("domain", "query_password")
29
+ end
30
+
31
+ lambda { Adauth::AdObjects::User.all }.should raise_exception
32
+ end
33
+ end
@@ -21,7 +21,7 @@ class TestUserModel
21
21
  end
22
22
 
23
23
  describe Adauth::Rails::ModelBridge do
24
- it "should extend", :no_ad => true do
24
+ it "should extend", :no_ad => true do
25
25
  TestUserModel.should respond_to :create_from_adauth
26
26
  end
27
27
 
@@ -1,3 +1,8 @@
1
+ # Test coverage
2
+ require 'simplecov'
3
+ SimpleCov.start
4
+
5
+ # Requires
1
6
  require 'adauth'
2
7
  require 'yaml'
3
8
 
@@ -7,6 +12,8 @@ def default_config
7
12
  c.port = test_data("domain", "port")
8
13
  c.base = test_data("domain", "base")
9
14
  c.server = test_data("domain", "server")
15
+ c.encryption = test_data("domain", "encryption").to_sym if test_data("domain", "encryption")
16
+ c.allow_fallback = test_data("domain", "allow_fallback") if test_data("domain", "allow_fallback")
10
17
  c.query_user = test_data("domain", "query_user")
11
18
  c.query_password = test_data("domain", "query_password")
12
19
  end
@@ -21,14 +28,10 @@ def administrator
21
28
  Adauth::AdObjects::User.where('sAMAccountName', "administrator").first
22
29
  end
23
30
 
24
- def domain_admins
25
- Adauth::AdObjects::Group.where('name', 'Domain Admins').first
26
- end
27
-
28
- def domain_controllers
29
- Adauth::AdObjects::OU.where('name', 'Domain Controllers').first
30
- end
31
+ #def breakable_user
32
+ # Adauth::AdObjects::User.where('sAMAccountName', test_data("domain", "breakable_user")).first
33
+ #end
31
34
 
32
- def pdc
33
- domain_controllers.members.first
35
+ def query_user
36
+ Adauth::AdObjects::User.where('sAMAccountName', test_data("domain", "query_user")).first
34
37
  end
@@ -1,7 +1,11 @@
1
1
  domain:
2
2
  domain: example.com
3
- port: 389
3
+ port: 389 # Change to 636 for ssl encryption
4
+ #encryption: simple_tls
5
+ #allow_fallback: 389 # Used to fallback to insecure
4
6
  base: "dc=example, dc=com"
5
7
  server: dc1.example.com
6
8
  query_user: User.Name
7
- query_password: Password
9
+ query_password: Password
10
+ breakable_user: User.Name
11
+ breakable_password: Password
metadata CHANGED
@@ -1,62 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adauth
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
5
- prerelease:
4
+ version: 2.0.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Adam "Arcath" Laycock
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-06-19 00:00:00.000000000 Z
11
+ date: 2013-07-14 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rake
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rspec
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: simplecov
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: yard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
44
67
  - !ruby/object:Gem::Version
45
68
  version: '0'
46
69
  - !ruby/object:Gem::Dependency
47
70
  name: net-ldap
48
71
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
72
  requirements:
51
- - - ! '>='
73
+ - - '>='
52
74
  - !ruby/object:Gem::Version
53
75
  version: '0'
54
76
  type: :runtime
55
77
  prerelease: false
56
78
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
79
  requirements:
59
- - - ! '>='
80
+ - - '>='
60
81
  - !ruby/object:Gem::Version
61
82
  version: '0'
62
83
  description: A full featured library for working with Microsofts Active Directory
@@ -71,6 +92,7 @@ files:
71
92
  - .travis.yml
72
93
  - Gemfile
73
94
  - Gemfile.lock
95
+ - LICENSE.txt
74
96
  - Rakefile
75
97
  - Readme.md
76
98
  - adauth.gemspec
@@ -96,49 +118,53 @@ files:
96
118
  - lib/generators/adauth/sessions/sessions_generator.rb
97
119
  - lib/generators/adauth/sessions/templates/new.html.erb
98
120
  - lib/generators/adauth/sessions/templates/sessions_controller.rb.erb
121
+ - rspec_results.txt
99
122
  - spec/adauth_ad_object_computer_spec.rb
100
123
  - spec/adauth_ad_object_folder_spec.rb
101
124
  - spec/adauth_ad_object_group_spec.rb
102
125
  - spec/adauth_ad_object_ou_spec.rb
126
+ - spec/adauth_ad_object_spec.rb
103
127
  - spec/adauth_ad_object_user_spec.rb
104
128
  - spec/adauth_authenticate_spec.rb
105
129
  - spec/adauth_config_spec.rb
130
+ - spec/adauth_connection_spec.rb
106
131
  - spec/adauth_rails_model_bridge_spec.rb
107
132
  - spec/adauth_spec.rb
108
133
  - spec/spec_helper.rb
109
134
  - spec/test_data.example.yml
110
135
  homepage: http://adauth.arcath.net
111
136
  licenses: []
137
+ metadata: {}
112
138
  post_install_message:
113
139
  rdoc_options: []
114
140
  require_paths:
115
141
  - lib
116
142
  required_ruby_version: !ruby/object:Gem::Requirement
117
- none: false
118
143
  requirements:
119
- - - ! '>='
144
+ - - '>='
120
145
  - !ruby/object:Gem::Version
121
146
  version: '0'
122
147
  required_rubygems_version: !ruby/object:Gem::Requirement
123
- none: false
124
148
  requirements:
125
- - - ! '>='
149
+ - - '>='
126
150
  - !ruby/object:Gem::Version
127
151
  version: '0'
128
152
  requirements: []
129
153
  rubyforge_project:
130
- rubygems_version: 1.8.23
154
+ rubygems_version: 2.0.0
131
155
  signing_key:
132
- specification_version: 3
156
+ specification_version: 4
133
157
  summary: Provides Active Directory authentication for Rails
134
158
  test_files:
135
159
  - spec/adauth_ad_object_computer_spec.rb
136
160
  - spec/adauth_ad_object_folder_spec.rb
137
161
  - spec/adauth_ad_object_group_spec.rb
138
162
  - spec/adauth_ad_object_ou_spec.rb
163
+ - spec/adauth_ad_object_spec.rb
139
164
  - spec/adauth_ad_object_user_spec.rb
140
165
  - spec/adauth_authenticate_spec.rb
141
166
  - spec/adauth_config_spec.rb
167
+ - spec/adauth_connection_spec.rb
142
168
  - spec/adauth_rails_model_bridge_spec.rb
143
169
  - spec/adauth_spec.rb
144
170
  - spec/spec_helper.rb