|
|
@ -21,20 +21,35 @@ class SystemDataBackendLdap |
|
|
LDAP_SITE_MAP = {:o => :name} |
|
|
LDAP_SITE_MAP = {:o => :name} |
|
|
|
|
|
|
|
|
LDAP_MAP = { |
|
|
LDAP_MAP = { |
|
|
:user => LDAP_USER_MAP, |
|
|
|
|
|
:group => LDAP_GROUP_MAP, |
|
|
|
|
|
:site => LDAP_SITE_MAP |
|
|
|
|
|
|
|
|
:User => LDAP_USER_MAP, |
|
|
|
|
|
:Group => LDAP_GROUP_MAP, |
|
|
|
|
|
:Site => LDAP_SITE_MAP |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
LDAP_FILTER = { |
|
|
LDAP_FILTER = { |
|
|
:user => Net::LDAP::Filter::eq('objectClass', 'posixAccount'), |
|
|
|
|
|
:group => Net::LDAP::Filter::eq('objectClass', 'posixGroup'), |
|
|
|
|
|
:site => Net::LDAP::Filter::eq('objectClass', 'organization') & |
|
|
|
|
|
|
|
|
:User => Net::LDAP::Filter::eq('objectClass', 'posixAccount'), |
|
|
|
|
|
:Group => Net::LDAP::Filter::eq('objectClass', 'posixGroup'), |
|
|
|
|
|
:Site => Net::LDAP::Filter::eq('objectClass', 'organization') & |
|
|
(~Net::LDAP::Filter::eq('o', 'hosting')), |
|
|
(~Net::LDAP::Filter::eq('o', 'hosting')), |
|
|
:mailAlias => Net::LDAP::Filter::eq('objectClass', 'mailAlias'), |
|
|
|
|
|
:mailAccount => Net::LDAP::Filter::eq('objectClass', 'mailAccount') |
|
|
|
|
|
|
|
|
:MailAlias => Net::LDAP::Filter::eq('objectClass', 'mailAlias'), |
|
|
|
|
|
:MailAccount => Net::LDAP::Filter::eq('objectClass', 'mailAccount') |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
LDAP_OBJECTCLASS = { |
|
|
|
|
|
:User => [ 'account', 'posixAccount', 'shadowAccount' ], |
|
|
|
|
|
:Group => 'posixGroup' |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
LDAP_LAMBDA_USER = lambda do |entry| |
|
|
|
|
|
entry[:cn] = entry[:uid] |
|
|
|
|
|
entry[:shadowlastchange] = (Time::now.to_i/60/60/24).to_s |
|
|
|
|
|
entry[:shadowmax] = '99999' |
|
|
|
|
|
entry[:shadowwarning] = '7' |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
LDAP_LAMBDA = { |
|
|
|
|
|
:User => LDAP_LAMBDA_USER |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
def initialize(host, port, baseDn, args={}) |
|
|
def initialize(host, port, baseDn, args={}) |
|
|
@baseDn = baseDn |
|
|
@baseDn = baseDn |
|
|
@ -62,8 +77,7 @@ class SystemDataBackendLdap |
|
|
map = { :dn => :id } |
|
|
map = { :dn => :id } |
|
|
map.merge!(LDAP_MAP[kind]) if LDAP_MAP[kind] |
|
|
map.merge!(LDAP_MAP[kind]) if LDAP_MAP[kind] |
|
|
|
|
|
|
|
|
ydata = { :backend => self } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ydata = {} |
|
|
data.each do |key,value| |
|
|
data.each do |key,value| |
|
|
ydata.merge!({ map[key] || key => value.size==1?value[0]:value.to_a }) |
|
|
ydata.merge!({ map[key] || key => value.size==1?value[0]:value.to_a }) |
|
|
end |
|
|
end |
|
|
@ -72,12 +86,32 @@ class SystemDataBackendLdap |
|
|
end |
|
|
end |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
def update(kind, data) |
|
|
|
|
|
map = {} |
|
|
|
|
|
map.merge!(LDAP_MAP[kind].invert) if LDAP_MAP[kind] |
|
|
|
|
|
|
|
|
|
|
|
entry = Net::LDAP::Entry.new(data[:id]) |
|
|
|
|
|
data.delete(:id) |
|
|
|
|
|
|
|
|
|
|
|
entry[:changetype] = 'add' |
|
|
|
|
|
entry[:objectclass] = LDAP_OBJECTCLASS[kind] |
|
|
|
|
|
|
|
|
|
|
|
data.each do |key,value| |
|
|
|
|
|
key = map[key] if map[key] |
|
|
|
|
|
entry[key] = value |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
LDAP_LAMBDA[kind].call(entry) if LDAP_LAMBDA[kind] |
|
|
|
|
|
|
|
|
|
|
|
puts entry.to_ldif |
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
private |
|
|
private |
|
|
|
|
|
|
|
|
def ldapBase(kind) |
|
|
def ldapBase(kind) |
|
|
case(kind) |
|
|
case(kind) |
|
|
when :user, :group: @systemDn |
|
|
|
|
|
when :site, :mailAlias, :mailAccount: @hostingDn |
|
|
|
|
|
|
|
|
when :User, :Group: @systemDn |
|
|
|
|
|
when :Site, :MailAlias, :MailAccount: @hostingDn |
|
|
end |
|
|
end |
|
|
end |
|
|
end |
|
|
|
|
|
|
|
|
|