From b488bbe921cf269e251813d3ba307bb60a837099 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Fri, 29 Apr 2011 08:48:34 +0200 Subject: [PATCH] change mail alias handling now i have separated mailAlias into mailAliasRole and mailAliasPerson. mailAliasRole holds mail aliases that are not assoziated to a concrete person but to an organizational role mailAliasPerson holds mail aliases for concrete people --- MailAliasPerson.rb | 18 +++++++++++++ MailAlias.rb => MailAliasRole.rb | 2 +- SystemDataBackend.rb | 19 ++++++++++---- SystemDataBackendLdap.rb | 43 +++++++++++++++++++------------- test_dummy.rb | 15 ++++++++--- 5 files changed, 71 insertions(+), 26 deletions(-) create mode 100644 MailAliasPerson.rb rename MailAlias.rb => MailAliasRole.rb (87%) diff --git a/MailAliasPerson.rb b/MailAliasPerson.rb new file mode 100644 index 0000000..e4308ce --- /dev/null +++ b/MailAliasPerson.rb @@ -0,0 +1,18 @@ +require 'SystemData' + +class MailAliasPerson < SystemData + attr_accessor :mail, :maildrop, :surname, :name + + def initialize(args = {}) + super(args) + + @mail = args[:mail] + @maildrop = args[:maildrop] + @surname = args[:surname] + @name = args[:name] + end + + def site + @mail.sub(/.*@/, '') + end +end diff --git a/MailAlias.rb b/MailAliasRole.rb similarity index 87% rename from MailAlias.rb rename to MailAliasRole.rb index b7f4c9c..c16b474 100644 --- a/MailAlias.rb +++ b/MailAliasRole.rb @@ -1,6 +1,6 @@ require 'SystemData' -class MailAlias < SystemData +class MailAliasRole < SystemData attr_accessor :mail, :maildrop, :user def initialize(args = {}) diff --git a/SystemDataBackend.rb b/SystemDataBackend.rb index fd8e39c..a53089f 100644 --- a/SystemDataBackend.rb +++ b/SystemDataBackend.rb @@ -1,7 +1,8 @@ require 'User' require 'Group' require 'Site' -require 'MailAlias' +require 'MailAliasRole' +require 'MailAliasPerson' require 'MailAccount' class SystemDataBackend @@ -23,8 +24,12 @@ class SystemDataBackend load(:Site) end - def mailAliases - load(:MailAlias) + def mailAliasRoles + load(:MailAliasRole) + end + + def mailAliasPeople + load(:MailAliasPerson) end def mailAccounts @@ -54,8 +59,12 @@ class SystemDataBackend end end - def mailAliasesBySite(site) - mailAliases.find_all{|mail| mail.site == site.name} + def mailAliasRolesBySite(site) + mailAliasRoles.find_all{|mail| mail.site == site.name} + end + + def mailAliasPeopleBySite(site) + mailAliasPeople.find_all{|mail| mail.site == site.name} end def mailAccountsBySite(site) diff --git a/SystemDataBackendLdap.rb b/SystemDataBackendLdap.rb index 6fdf68b..b158c6b 100644 --- a/SystemDataBackendLdap.rb +++ b/SystemDataBackendLdap.rb @@ -18,27 +18,36 @@ :memberuid => :members } - LDAP_SITE_MAP = {:o => :name} + LDAP_MAILALIASPERSON_MAP = { + :sn => :surname, + :cn => :name + } LDAP_MAP = { - :User => LDAP_USER_MAP, - :Group => LDAP_GROUP_MAP, - :Site => LDAP_SITE_MAP + :User => LDAP_USER_MAP, + :Group => LDAP_GROUP_MAP, + :Site => { :o => :name }, + :MailAliasRole => { :cn => :user }, + :MailAliasPerson => LDAP_MAILALIASPERSON_MAP, + :mailAccount => { :homedirectory => :home } } LDAP_FILTER = { - :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')), - :MailAlias => Net::LDAP::Filter::eq('objectClass', 'mailAlias'), - :MailAccount => Net::LDAP::Filter::eq('objectClass', 'mailAccount') + :User => '(objectClass=posixAccount)', + :Group => '(objectClass=posixGroup)', + :Site => '(&(objectClass=organization)(!(o=hosting)))', + :MailAliasRole => '(&(objectClass=MailAlias)(objectClass=organizationalrole))', + :MailAliasPerson => '(&(objectClass=MailAlias)(objectClass=person))', + :MailAccount => '(objectClass=mailAccount)' } LDAP_OBJECTCLASS = { - :User => [ 'account', 'posixAccount', 'shadowAccount' ], - :Group => 'posixGroup', - :Site => 'organization' + :User => [ 'account', 'posixAccount', 'shadowAccount' ], + :Group => 'posixGroup', + :Site => 'organization', + :MailAliasRole => [ 'organizationalRole', 'MailAlias' ], + :MailAliasPerson => [ 'person', 'MailAlias' ], + :MailAccount => [ 'person', 'MailAccount' ] } LDAP_LAMBDA_USER = lambda do |entry| @@ -68,7 +77,7 @@ @ldapData[kind][:internal] = @ldap.search( :base => ldapBase(kind), - :filter => LDAP_FILTER[kind] + :filter => Net::LDAP::Filter::construct(LDAP_FILTER[kind]) ) end @@ -84,9 +93,9 @@ ydata.merge!({ map[key] || key => value.size==1?value[0]:value.to_a }) end ydata - end if ! @ldapData[kind][:external] + end if ! @ldapData[kind][:external] && @ldapData[kind][:internal] - @ldapData[kind][:external].each{|ydata| yield ydata} + @ldapData[kind][:external].each{|ydata| yield ydata} if @ldapData[kind][:external] end def update(kind, data) @@ -164,7 +173,7 @@ def ldapBase(kind) case(kind) when :User, :Group: @systemDn - when :Site, :MailAlias, :MailAccount: @hostingDn + when :Site, :MailAliasRole, :MailAliasPerson, :MailAccount: @hostingDn end end diff --git a/test_dummy.rb b/test_dummy.rb index d69dfd2..49cd276 100644 --- a/test_dummy.rb +++ b/test_dummy.rb @@ -26,15 +26,24 @@ end backend.sites.each do |site| puts 'site: ' + site.name - puts ' MailAliases:' - backend.mailAliasesBySite(site).each{|account| puts ' ' + account.mail} + puts ' MailAliasRoles:' + backend.mailAliasRolesBySite(site).each{|account| puts ' ' + account.mail} + puts + puts ' MailAliasPeople:' + backend.mailAliasPeopleBySite(site).each{|account| puts ' ' + account.mail} puts puts ' MailAccounts:' backend.mailAccountsBySite(site).each{|account| puts ' ' + account.mail} puts end -backend.mailAliases.each do |mailAlias| +backend.mailAliasRoles.each do |mailAlias| + puts 'mailAlias: '+mailAlias.mail.inspect+','+mailAlias.maildrop.inspect +end + +puts + +backend.mailAliasPeople.each do |mailAlias| puts 'mailAlias: '+mailAlias.mail.inspect+','+mailAlias.maildrop.inspect end