avdt_ldap_legacy 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in avdt_ldap_legacy.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2011 Alessandro Verlato, Davide Targa
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
@@ -0,0 +1,118 @@
1
+ = AvdtLdapLegacy
2
+
3
+ avdt_ldap version for Ruby 1.8.6
4
+
5
+ This gem supports LDAP authentication both on sigle and multiple LDAP servers with a minimal configuration.
6
+ It requires 'ruby-net-ldap' gem (automatically installed)
7
+
8
+ == Installation
9
+
10
+ === Rails 3
11
+
12
+ This gem doesn't work with Rails 3 because it requires Ruby >= 1.8.7
13
+ If you use Rails 3 you have to install avdt_ldap. Documentation[https://github.com/davide-targa/avdt_ldap] RubyGem[https://rubygems.org/gems/avdt_ldap]
14
+
15
+ === Rails 2
16
+
17
+ Add this to your environment.rb file:
18
+
19
+ config.gem "avdt_ldap_legacy"
20
+
21
+ == Usage
22
+
23
+ Just add a config file named ldap.yml in config/ directory.
24
+
25
+ You can change default file name by setting +ldap_config_file+ configuration parameter.
26
+ For example, inside the avdt_ldap initializer:
27
+
28
+ AvdtLdapLegacy.configure do |c|
29
+ c.ldap_config_file = "#{Rails.root}/config/foobar.yml"
30
+ end
31
+
32
+ == ldap.yml
33
+
34
+ Inside this file you have to specify connection parameters for all the directories on which to verify users credentials
35
+
36
+ Example file:
37
+
38
+ # All the directory attributes (except "base") are optional. Defaults are specified in the example below.
39
+
40
+ development:
41
+ dir1:
42
+ host: ldap.foobar.com # defaults to "127.0.0.1"
43
+ base: ou=People,dc=foobar,dc=com # REQUIRED
44
+ port: 123 # defaults to 389
45
+ ssl: true # defaults to false
46
+ attribute: cn # defaults to "uid"
47
+
48
+
49
+ dir2:
50
+ host: ldap.goofy.foobar.com
51
+ base: ou=People,dc=goofy,dc=foobar,dc=com
52
+
53
+ test:
54
+ dir1:
55
+ host: ldap.test.foobar.com
56
+ base: ou=People,dc=foobar,dc=com
57
+
58
+ dir2:
59
+ host: ldap.goofy.foobar.com
60
+ base: ou=People,dc=goofy,dc=foobar,dc=com
61
+
62
+ production:
63
+ dir2:
64
+ host: ldap.live.foobar.com
65
+ base: ou=People,dc=foobar,dc=com
66
+ attribute: cn
67
+
68
+ new_dir:
69
+ host: donald.duck.com
70
+ attribute: foo
71
+ base: ou=Ducks,dc=foobar,dc=com
72
+
73
+
74
+ Not specified parameters (except for "base" which is required) will be set to the default values:
75
+
76
+ host: "127.0.0.1"
77
+ port: 389
78
+ attribute: uid
79
+ base: %s
80
+ ssl: false
81
+
82
+ == Authentication
83
+
84
+ To verify user's credentials on ALL the specified directories (default) simply do this:
85
+
86
+ AvdtLdap.new.valid?(login, password)
87
+
88
+ As mentioned this will try to authenticate the user on all the directories specified on ldap.yml and will return true or false.
89
+ If authentication fails an error message, containing directory response (error message and code), will be displayed on server's logs.
90
+
91
+ === Authentication only on specified directories
92
+
93
+ If you have to check user's credentials only on some specific directories, you can pass an hash to AvdtLdap.new(), specifying on which to do the check.
94
+
95
+ a = AvdtLdap.new(:directories => [:dir1,dir3])
96
+ a.valid?(login,password)
97
+ => true (false)
98
+
99
+ NOTE: The authentication process stops as soon as one positive match is found, so it's possible that not all the directories are queried.
100
+
101
+ === User's attributes access
102
+
103
+ If the authentication process is successfull, you can access user's attributes simply calling a method on your AvdtLdap object, with the same name of the desired attribute. For example let's suppose we want the user's name and surname (+givenName+ and +sn+ attributes on the directory), then you can do this:
104
+
105
+ username = a.givenname
106
+ surname = a.cn
107
+
108
+ Note: theese methods must be called on lowercase
109
+
110
+ You can also access the whole attributes hash by calling:
111
+
112
+ a.user_attributes
113
+
114
+ ==== On which directory is located the user ?
115
+
116
+ You can know it by calling the +user_location+ method on your AvdtLdap object:
117
+
118
+ location = a.user_location
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "avdt_ldap_legacy/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "avdt_ldap_legacy"
7
+ s.version = AvdtLdapLegacy::VERSION
8
+ s.authors = ["Alessandro Verlato","Davide Targa"]
9
+ s.email = ["averlato@gmail.com","davide.targa@gmail.com"]
10
+ s.homepage = "https://rubygems.org/gems/avdt_ldap_legacy"
11
+ s.summary = %q{avdt_ldap for Ruby 1.8.6}
12
+ s.description = %q{avdt_ldap is a simple LDAP authentication library for user authentication on multiple LDAP directories}
13
+ s.required_ruby_version = "~> 1.8.6"
14
+
15
+ s.rubyforge_project = "avdt_ldap_legacy"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+ s.add_dependency "ruby-net-ldap"
22
+ end
@@ -0,0 +1,34 @@
1
+ # All the directory attributes (except "base") are optional. Defaults are specified in the example below.
2
+
3
+ development:
4
+ dir1:
5
+ host: ldap.foobar.com # defaults to "127.0.0.1"
6
+ base: ou=People,dc=foobar,dc=com # REQUIRED
7
+ port: 123 # defaults to 389
8
+ ssl: true # defaults to false
9
+ attribute: cn # defaults to "uid"
10
+
11
+
12
+ dir2:
13
+ host: ldap.goofy.foobar.com
14
+ base: ou=People,dc=goofy,dc=foobar,dc=com
15
+
16
+ test:
17
+ dir1:
18
+ host: ldap.test.foobar.com
19
+ base: ou=People,dc=foobar,dc=com
20
+
21
+ dir2:
22
+ host: ldap.goofy.foobar.com
23
+ base: ou=People,dc=goofy,dc=foobar,dc=com
24
+
25
+ production:
26
+ dir2:
27
+ host: ldap.live.foobar.com
28
+ base: ou=People,dc=foobar,dc=com
29
+ attribute: cn
30
+
31
+ new_dir:
32
+ host: donald.duck.com
33
+ attribute: foo
34
+ base: ou=Ducks,dc=foobar,dc=com
@@ -0,0 +1,4 @@
1
+ # avdt init file
2
+ require 'avdt_ldap_legacy/hash'
3
+ require 'avdt_ldap_legacy/avdt_ldap_legacy'
4
+ require 'avdt_ldap_legacy/configuration'
@@ -0,0 +1,155 @@
1
+ # AvdtLdapLegacy
2
+
3
+ # This gem supports LDAP authentication both on sigle and multiple LDAP servers
4
+ # with a minimal configuration.
5
+ # It requires 'ruby-net-ldap' gem.
6
+ #
7
+ # USAGE
8
+ # Authentication
9
+
10
+ # To verify user's credentials on ALL the specified directories (default) simply do this:
11
+ #
12
+ # AvdtLdapLegacy.new.valid?(login, password)
13
+ #
14
+ # As mentioned this will try to authenticate the user on all the directories specified on ldap.yml and will return true or false.
15
+ # If authentication fails an error message, containing directory response (error message and code), will be displayed on server's logs.
16
+ #
17
+ # Authentication only on specified directories
18
+ #
19
+ # If you have to check user's credentials only on some specific directories, you can pass an hash to AvdtLdapLegacy.new(), specifying on which to do the check.
20
+ #
21
+ # a = AvdtLdapLegacy.new(:directories => [:dir1,dir3])
22
+ # a.valid?(login,password)
23
+ # => true (false)
24
+ #
25
+ # NOTE: The authentication process stops as soon as one positive match is found, so it's possible that not all the directories are queried.
26
+ #
27
+ # User's attributes access:
28
+ # If you have to access (read) user's attributes from the directory you can
29
+ # use the handy methods provided by the gem. Let's suppose we need two attributes,
30
+ # the user's name and surname ("givenName" and "sn" attributes on the directory).
31
+ # Simply access attributes as in the example below:
32
+ #
33
+ # a = AvdtLdapLegacy.new.valid?(login, password)
34
+ # name = a.givenname
35
+ # surname = a.cn
36
+ #
37
+ # As you can see methods names reflects attribute's name (but always in downcase).
38
+ # You can also access the whole attributes hash by calling:
39
+
40
+ # a.user_attributes
41
+ #
42
+ # On which directory is located the user ?
43
+ # You can know it by calling the +user_location+ method on your AvdtLdapLegacy object:
44
+ #
45
+ # location = a.user_location
46
+
47
+ require 'net/ldap'
48
+
49
+ class AvdtLdapLegacy
50
+
51
+ # Used to simplify configuration from rails initializers.
52
+ # Works with the methods configuration and configure defined below.
53
+ class << self
54
+ attr_accessor :configuration
55
+ end
56
+
57
+ attr_accessor :directories, :include_default, :user_attributes, :user_location
58
+
59
+ # Loads ldap configuration file and sets up the object's parameters
60
+ def initialize(args = {})
61
+ if File.exist?(AvdtLdapLegacy.configuration.ldap_config_file)
62
+ @LDAP = YAML.load_file(AvdtLdapLegacy.configuration.ldap_config_file).symbolize_keys!
63
+ else
64
+ raise "AvdtLdapLegacy: File #{AvdtLdapLegacy.configuration.ldap_config_file} not found, maybe you forgot to define it ?"
65
+ end
66
+ @directories = args[:directories] || @LDAP[env].keys
67
+ end
68
+
69
+ # Checks for user's existance on specified directories. Just pass "login" and
70
+ # "password" parameters to chech if a user resides on one of the directories.
71
+ # After this method calling, if the user is authenticated, his (directory)
72
+ # attributes are availaible.
73
+ def valid? login, password
74
+ @directories.each do |ldap|
75
+ ldap = ldap.to_sym
76
+ unless @LDAP[env][ldap].nil?
77
+ conn = connection(ldap)
78
+ conn.authenticate("#{attribute(ldap)}=#{login.to_s},#{base(ldap)}", password.to_s)
79
+ begin
80
+ # if bind => OK
81
+ if conn.bind
82
+ logger.info("Authenticated #{login.to_s} by #{host(ldap)}") if logger
83
+ @user_attributes = conn.search(:base => base(ldap),:filter => Net::LDAP::Filter.eq(attribute(ldap),login.to_s)).first.each do |k,v|
84
+ class_eval "attr_reader :#{k}"
85
+ self.instance_variable_set "@#{k}".to_sym, v
86
+ end
87
+ @user_location = ldap
88
+ return true
89
+ else
90
+ logger.info("Error attempting to authenticate #{login.to_s} by #{host(ldap)}: #{conn.get_operation_result.code} #{conn.get_operation_result.message}") if logger
91
+ end
92
+ rescue Net::LDAP::LdapError => error
93
+ logger.info("Error attempting to authenticate #{login.to_s} by #{host(ldap)}: #{error.message}") if logger
94
+ return false
95
+ end
96
+ else
97
+ logger.info "ERROR ! \"#{ldap}\" directory data are missing in ldap.yml" if logger
98
+ raise Net::LDAP::LdapError, "\"#{ldap}\" directory data are missing in ldap.yml"
99
+ end
100
+ end
101
+ false
102
+ end
103
+
104
+ # Adds configuration ability to the gem
105
+ def self.configuration
106
+ @configuration ||= Configuration.new
107
+ end
108
+
109
+ def self.configure
110
+ yield(configuration)
111
+ end
112
+
113
+ private
114
+
115
+ # Given a directory name returns a connection to that server using parameters
116
+ # specified in ldap.yml
117
+ def connection(which_ldap)
118
+ Net::LDAP.new(:host => host(which_ldap), :port => port(which_ldap), :encryption => (:simple_tls if ssl?(which_ldap)))
119
+ end
120
+
121
+ # Given a directory return it's host name
122
+ def host(which_ldap)
123
+ @LDAP[env][which_ldap][:host] || "127.0.0.1"
124
+ end
125
+
126
+ # Given a directory returns it's host port
127
+ def port(which_ldap)
128
+ ssl?(which_ldap) ? (@LDAP[env][which_ldap][:port] || 636) : (@LDAP[env][which_ldap][:port] || 389)
129
+ end
130
+
131
+ # Given a directory returns it's attribute (example: uid)
132
+ def attribute(which_ldap)
133
+ @LDAP[env][which_ldap][:attribute] || "uid"
134
+ end
135
+
136
+ # Given a directory returns it's base path (example ou=People,dc=foo,dc=bar)
137
+ def base(which_ldap)
138
+ @LDAP[env][which_ldap][:base] || "%s"
139
+ end
140
+
141
+ # Given a directory returns if connection should use ssl
142
+ def ssl?(which_ldap)
143
+ @LDAP[env][which_ldap][:ssl] ? true : false
144
+ end
145
+
146
+ # Returns Rails Default logger
147
+ def logger
148
+ Rails.logger
149
+ end
150
+
151
+ def env
152
+ Rails.env.to_sym
153
+ end
154
+
155
+ end
@@ -0,0 +1,7 @@
1
+ class Configuration
2
+ attr_accessor :ldap_config_file
3
+
4
+ def initialize
5
+ @ldap_config_file = "#{Rails.root}/config/ldap.yml"
6
+ end
7
+ end
@@ -0,0 +1,20 @@
1
+ class Hash
2
+
3
+ # Transforms all the hash keys from strings to symbols.
4
+ # Example:
5
+ # {"one" => "two", "three" => "four"}.symbolize_keys
6
+ # => {:one=>"two", :three=>"four"}
7
+ #
8
+ def symbolize_keys!
9
+ t = self.dup
10
+ self.clear
11
+ t.each_pair do |k,v|
12
+ self[k.to_sym] = v
13
+ if v.kind_of?(Hash)
14
+ v.symbolize_keys!
15
+ end
16
+ self
17
+ end
18
+ self
19
+ end
20
+ end
@@ -0,0 +1,3 @@
1
+ module AvdtLdapLegacy
2
+ VERSION = "1.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: avdt_ldap_legacy
3
+ version: !ruby/object:Gem::Version
4
+ hash: 19
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 1
9
+ - 0
10
+ version: 1.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Alessandro Verlato
14
+ - Davide Targa
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2011-06-22 00:00:00 +02:00
20
+ default_executable:
21
+ dependencies:
22
+ - !ruby/object:Gem::Dependency
23
+ name: ruby-net-ldap
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ hash: 3
31
+ segments:
32
+ - 0
33
+ version: "0"
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ description: avdt_ldap is a simple LDAP authentication library for user authentication on multiple LDAP directories
37
+ email:
38
+ - averlato@gmail.com
39
+ - davide.targa@gmail.com
40
+ executables: []
41
+
42
+ extensions: []
43
+
44
+ extra_rdoc_files: []
45
+
46
+ files:
47
+ - .gitignore
48
+ - Gemfile
49
+ - LICENSE
50
+ - README.rdoc
51
+ - Rakefile
52
+ - avdt_ldap_legacy.gemspec
53
+ - ldap.example.yml
54
+ - lib/avdt_ldap_legacy.rb
55
+ - lib/avdt_ldap_legacy/avdt_ldap_legacy.rb
56
+ - lib/avdt_ldap_legacy/configuration.rb
57
+ - lib/avdt_ldap_legacy/hash.rb
58
+ - lib/avdt_ldap_legacy/version.rb
59
+ has_rdoc: true
60
+ homepage: https://rubygems.org/gems/avdt_ldap_legacy
61
+ licenses: []
62
+
63
+ post_install_message:
64
+ rdoc_options: []
65
+
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ~>
72
+ - !ruby/object:Gem::Version
73
+ hash: 59
74
+ segments:
75
+ - 1
76
+ - 8
77
+ - 6
78
+ version: 1.8.6
79
+ required_rubygems_version: !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ requirements: []
89
+
90
+ rubyforge_project: avdt_ldap_legacy
91
+ rubygems_version: 1.3.7
92
+ signing_key:
93
+ specification_version: 3
94
+ summary: avdt_ldap for Ruby 1.8.6
95
+ test_files: []
96
+