From 6ce7c0f16552fdf8ee23bb76067893dd3b93355c Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Mon, 16 May 2011 14:39:19 +0200 Subject: [PATCH] cleanups and small changes - move ldap specific config handling int storage/ldap.rb - update shadowlastchange only if the users password changes (actually not sure that this is the correct behaviour.) - change config accessor in storage to config reader - create a generic eval_pattern method in SdAdmin::Storage::Config --- app/model/user.rb | 4 ++-- app/storage.rb | 2 +- app/storage/config.rb | 20 +++++++++++++++----- app/storage/ldap.rb | 29 +++++++++++++++++------------ 4 files changed, 35 insertions(+), 20 deletions(-) diff --git a/app/model/user.rb b/app/model/user.rb index 855e854..f5f1570 100644 --- a/app/model/user.rb +++ b/app/model/user.rb @@ -18,8 +18,8 @@ class DsAdmin::Model::User @shadowlastchange = args[:shadowlastchange] end - def save + def pass=(pass) + @pass = pass @shadowlastchange = (Time::now.to_i/60/60/24).to_s - super end end diff --git a/app/storage.rb b/app/storage.rb index b4a0ae3..f2191ac 100644 --- a/app/storage.rb +++ b/app/storage.rb @@ -5,7 +5,7 @@ module DsAdmin::Storage DsAdmin::Storage.autoload(:Ldap, 'storage/ldap') DsAdmin::Storage.autoload(:Mysql, 'storage/mysql') - attr_accessor :config + attr_reader :config def initialize(config) @config = config diff --git a/app/storage/config.rb b/app/storage/config.rb index 844d5bc..9e6b406 100644 --- a/app/storage/config.rb +++ b/app/storage/config.rb @@ -17,11 +17,21 @@ class DsAdmin::Storage::Config @config[storage.config_key][@model.config_key][:map] end - def object_class(storage) - @config[storage.config_key][@model.config_key][:objectClass] - end + ## + # replace special patterns within config strings with data + # given by the data hash param. These patterns also allow to send + # a message to the replaces data e.g. for some kind of subtitution. + # + def eval_pattern(pattern, data = {}) + scan_exp = /([^#]*)(#\{(:[^}|]+)(\|([^}]*))?\})?/ + + result = String.new + pattern.scan(scan_exp) do |m| + key = m[2][1..m[2].length].to_sym if m[2] + val = eval('"' + data[key] + '".send ' + m[4]) if data[key] && m[4] - def dn_pat(storage) - @config[storage.config_key][@model.config_key][:dnPat] + result += m[0] + (val || "") + end + result end end diff --git a/app/storage/ldap.rb b/app/storage/ldap.rb index 60ba62e..62f8f0e 100644 --- a/app/storage/ldap.rb +++ b/app/storage/ldap.rb @@ -1,5 +1,20 @@ require 'net/ldap' +## +# some additional ldap specific config handlings. +# +class DsAdmin::Storage::Config + def object_class(storage) + @config[storage.config_key][@model.config_key][:objectClass] + end + + def dn(storage, data) + eval_pattern( + @config[storage.config_key][@model.config_key][:dnPat], + data) + ',' + query(storage)[:base] + end +end + class DsAdmin::Storage::Ldap include DsAdmin::Storage @@ -38,18 +53,7 @@ class DsAdmin::Storage::Ldap protected def create(data) - map = @config.map(self).invert - scan_exp = /(^|, *)([^=]*=)(([^#][^,]*)|#\{([^|}]*)(\|([^}]*))?\})/ - - dn = String.new - @config.dn_pat(self).scan(scan_exp) do |m| - val = m[3] if m[3] - val = data[m[4][1..m[4].length].to_sym] if m[4] - val = eval('"' + val + '".send ' + m[6]) if data && m[6] - - dn += m[0] + m[1] + val - end - dn += ',' + @config.query(self)[:base] + dn = @config.dn(self, data) data.delete(:id) @@ -79,6 +83,7 @@ class DsAdmin::Storage::Ldap replace.each do |key,value| if old[:id] =~ /(^|, *)#{key.to_s}=([^, ]+)/ && $2 != value delete(old[:id]) + puts return create(new) end end