about summary refs log tree commit diff
path: root/lib/devise/ldap_authenticatable.rb
diff options
context:
space:
mode:
authorbeatrix <beatrix.bitrot@gmail.com>2018-03-03 13:40:00 -0500
committerGitHub <noreply@github.com>2018-03-03 13:40:00 -0500
commit43a9a781a443a6b9296431fbcc4285b3ca6a1a57 (patch)
treed4bf067aeedcebbdc3d160eca6aa1a7c7d1bfa00 /lib/devise/ldap_authenticatable.rb
parentee00da01d2e4cc455b92f1f4a7c9142c73048433 (diff)
parent65e2a4645e086110072efed5b3d4d1434c933e04 (diff)
Merge pull request #377 from glitch-soc/merge-upstream
hhhhhhhhhnnnnnnnnnnnghh!!!!!
Diffstat (limited to 'lib/devise/ldap_authenticatable.rb')
-rw-r--r--lib/devise/ldap_authenticatable.rb49
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/devise/ldap_authenticatable.rb b/lib/devise/ldap_authenticatable.rb
new file mode 100644
index 000000000..531abdbbe
--- /dev/null
+++ b/lib/devise/ldap_authenticatable.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+if ENV['LDAP_ENABLED'] == 'true'
+  require 'net/ldap'
+  require 'devise/strategies/authenticatable'
+
+  module Devise
+    module Strategies
+      class LdapAuthenticatable < Authenticatable
+        def authenticate!
+          if params[:user]
+            ldap = Net::LDAP.new(
+              host: Devise.ldap_host,
+              port: Devise.ldap_port,
+              base: Devise.ldap_base,
+              encryption: {
+                method: Devise.ldap_method,
+                tls_options: OpenSSL::SSL::SSLContext::DEFAULT_PARAMS,
+              },
+              auth: {
+                method: :simple,
+                username: Devise.ldap_bind_dn,
+                password: Devise.ldap_password,
+              },
+              connect_timeout: 10
+            )
+
+            if (user_info = ldap.bind_as(base: Devise.ldap_base, filter: "(#{Devise.ldap_uid}=#{email})", password: password))
+              user = User.ldap_get_user(user_info.first)
+              success!(user)
+            else
+              return fail(:invalid_login)
+            end
+          end
+        end
+
+        def email
+          params[:user][:email]
+        end
+
+        def password
+          params[:user][:password]
+        end
+      end
+    end
+  end
+
+  Warden::Strategies.add(:ldap_authenticatable, Devise::Strategies::LdapAuthenticatable)
+end