|
|
|
@@ -1,8 +1,4 @@
|
|
|
|
|
class LdapService < ApplicationService
|
|
|
|
|
def initialize
|
|
|
|
|
@suffix = ENV["LDAP_SUFFIX"] || "dc=kosmos,dc=org"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def modify(dn, operations=[])
|
|
|
|
|
client.modify dn: dn, operations: operations
|
|
|
|
|
client.get_operation_result.code
|
|
|
|
@@ -45,7 +41,7 @@ class LdapService < ApplicationService
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
filter = Net::LDAP::Filter.eq("objectClass", objectclass)
|
|
|
|
|
entries = client.search(base: @suffix, filter: filter, attributes: %w{dn})
|
|
|
|
|
entries = client.search(base: ldap_suffix, filter: filter, attributes: %w{dn})
|
|
|
|
|
entries.sort_by!{ |e| e.dn.length }.reverse!
|
|
|
|
|
|
|
|
|
|
entries.each do |e|
|
|
|
|
@@ -55,14 +51,14 @@ class LdapService < ApplicationService
|
|
|
|
|
|
|
|
|
|
def fetch_users(args={})
|
|
|
|
|
if args[:ou]
|
|
|
|
|
treebase = "ou=#{args[:ou]},cn=users,#{@suffix}"
|
|
|
|
|
treebase = "ou=#{args[:ou]},cn=users,#{ldap_suffix}"
|
|
|
|
|
else
|
|
|
|
|
treebase = ldap_config["base"]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
attributes = %w[
|
|
|
|
|
dn cn uid mail displayName admin service
|
|
|
|
|
mailRoutingAddress mailpassword
|
|
|
|
|
mailRoutingAddress mailpassword nostrKey
|
|
|
|
|
]
|
|
|
|
|
filter = Net::LDAP::Filter.eq("uid", args[:uid] || "*")
|
|
|
|
|
|
|
|
|
@@ -77,7 +73,7 @@ class LdapService < ApplicationService
|
|
|
|
|
services_enabled: e.try(:serviceEnabled),
|
|
|
|
|
email_maildrop: e.try(:mailRoutingAddress),
|
|
|
|
|
email_password: e.try(:mailpassword),
|
|
|
|
|
nostr_key: e.try(:nostrKey)
|
|
|
|
|
nostr_key: e.try(:nostrKey) ? e.nostrKey.first : nil
|
|
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
@@ -86,7 +82,7 @@ class LdapService < ApplicationService
|
|
|
|
|
attributes = %w{dn ou description}
|
|
|
|
|
filter = Net::LDAP::Filter.eq("objectClass", "organizationalUnit")
|
|
|
|
|
# filter = Net::LDAP::Filter.eq("objectClass", "*")
|
|
|
|
|
treebase = "cn=users,#{@suffix}"
|
|
|
|
|
treebase = "cn=users,#{ldap_suffix}"
|
|
|
|
|
|
|
|
|
|
entries = client.search(base: treebase, filter: filter, attributes: attributes)
|
|
|
|
|
|
|
|
|
@@ -102,10 +98,10 @@ class LdapService < ApplicationService
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def add_organization(ou, description, interactive=false)
|
|
|
|
|
dn = "ou=#{ou},cn=users,#{@suffix}"
|
|
|
|
|
dn = "ou=#{ou},cn=users,#{ldap_suffix}"
|
|
|
|
|
|
|
|
|
|
aci = <<-EOS
|
|
|
|
|
(target="ldap:///cn=*,ou=#{ou},cn=users,#{@suffix}")(targetattr="cn || sn || uid || mail || userPassword || nsRole || objectClass") (version 3.0; acl "service-#{ou.gsub(".", "-")}-read-search"; allow (read,search) userdn="ldap:///uid=service,ou=#{ou},cn=applications,#{@suffix}";)
|
|
|
|
|
(target="ldap:///cn=*,ou=#{ou},cn=users,#{ldap_suffix}")(targetattr="cn || sn || uid || mail || userPassword || nsRole || objectClass") (version 3.0; acl "service-#{ou.gsub(".", "-")}-read-search"; allow (read,search) userdn="ldap:///uid=service,ou=#{ou},cn=applications,#{ldap_suffix}";)
|
|
|
|
|
EOS
|
|
|
|
|
|
|
|
|
|
attrs = {
|
|
|
|
@@ -126,14 +122,14 @@ class LdapService < ApplicationService
|
|
|
|
|
delete_all_entries!
|
|
|
|
|
|
|
|
|
|
user_read_aci = <<-EOS
|
|
|
|
|
(target="ldap:///#{@suffix}")(targetattr="*") (version 3.0; acl "user-read-search-own-attributes"; allow (read,search) userdn="ldap:///self";)
|
|
|
|
|
(target="ldap:///#{ldap_suffix}")(targetattr="*") (version 3.0; acl "user-read-search-own-attributes"; allow (read,search) userdn="ldap:///self";)
|
|
|
|
|
EOS
|
|
|
|
|
|
|
|
|
|
add_entry @suffix, {
|
|
|
|
|
add_entry ldap_suffix, {
|
|
|
|
|
dc: "kosmos", objectClass: ["top", "domain"], aci: user_read_aci
|
|
|
|
|
}, true
|
|
|
|
|
|
|
|
|
|
add_entry "cn=users,#{@suffix}", {
|
|
|
|
|
add_entry "cn=users,#{ldap_suffix}", {
|
|
|
|
|
cn: "users", objectClass: ["top", "organizationalRole"]
|
|
|
|
|
}, true
|
|
|
|
|
end
|
|
|
|
@@ -155,4 +151,8 @@ class LdapService < ApplicationService
|
|
|
|
|
def ldap_config
|
|
|
|
|
ldap_config ||= YAML.load(ERB.new(File.read("#{Rails.root}/config/ldap.yml")).result)[Rails.env]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def ldap_suffix
|
|
|
|
|
@ldap_suffix ||= ENV["LDAP_SUFFIX"] || "dc=kosmos,dc=org"
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|