Code

* Fix LDAP search filter escaping
[gosa.git] / gosa-si / modules / ClientPackages.pm
index 4b69675660732eef7304095320d3bba188811708..08c8689357e994930ba38f38eac978b39723abd0 100644 (file)
@@ -69,6 +69,14 @@ foreach my $log_line (@$result) {
         &main::daemon_log("0 ERROR: ClientPackages - $log_line", 1);
     }
 }
+# build vice versa event_hash, event_name => module
+my $event2module_hash = {};
+while (my ($module, $mod_events) = each %$event_hash) {
+    while (my ($event_name, $nothing) = each %$mod_events) {
+        $event2module_hash->{$event_name} = $module;
+    }
+
+}
 
 # Unit tag can be defined in config
 if((not defined($main::gosa_unit_tag)) || length($main::gosa_unit_tag) == 0) {
@@ -152,6 +160,7 @@ $main::server_address = $server_address;
 sub get_module_info {
     my @info = ($server_address,
                 $ClientPackages_key,
+                $event_hash,
                 );
     return \@info;
 }
@@ -285,10 +294,10 @@ sub process_incoming_msg {
                 @out_msg_l = &here_i_am($msg, $msg_hash, $session_id)
             } else {
                 # a event exists with the header as name
-                if( exists $event_hash->{$header} ) {
-                    &main::daemon_log("$session_id INFO: found event '$header' at event-module '".$event_hash->{$header}."'", 5);
+                if( exists $event2module_hash->{$header} ) {
+                    &main::daemon_log("$session_id INFO: found event '$header' at event-module '".$event2module_hash->{$header}."'", 5);
                     no strict 'refs';
-                    @out_msg_l = &{$event_hash->{$header}."::$header"}($msg, $msg_hash, $session_id);
+                    @out_msg_l = &{$event2module_hash->{$header}."::$header"}($msg, $msg_hash, $session_id);
 
                 # if no event handler is implemented   
                 } else {
@@ -619,7 +628,7 @@ sub new_syslog_config {
        }
 
        my $entry= $ldap_res->entry(0);
-    my $dn = &Net::LDAP::Util::escape_dn_value($entry->dn);
+    my $filter_dn = &Net::LDAP::Util::escape_filter_value($entry->dn);
        my $syslog_server = $entry->get_value("gotoSyslogServer");
 
     # If no syslog server is specified at host, just have a look at the object group of the host
@@ -628,7 +637,7 @@ sub new_syslog_config {
         my $ldap_res = $ldap_handle->search( base   => $ldap_base,
                 scope  => 'sub',
                 attrs => ['gotoSyslogServer'],
-                filter => "(&(objectClass=gosaGroupOfNames)(member=$dn))");
+                filter => "(&(objectClass=gosaGroupOfNames)(member=$filter_dn))");
         if($ldap_res->code) {
             &main::daemon_log("$session_id ".$ldap_res->error, 1);
             return;
@@ -640,7 +649,7 @@ sub new_syslog_config {
                     "\n\tbase: $ldap_base".
                     "\n\tscope: sub".
                     "\n\tattrs: gotoSyslogServer".
-                    "\n\tfilter: (&(objectClass=gosaGroupOfNames)(member=$dn))", 1);
+                    "\n\tfilter: (&(objectClass=gosaGroupOfNames)(member=$filter_dn))", 1);
             return;
         }
 
@@ -653,6 +662,7 @@ sub new_syslog_config {
         &main::daemon_log("$session_id WARNING: no syslog server specified for this host '$mac_address'", 3);
         return;
     }
+
  
     # Add syslog server to 'syslog_config' message
     my $syslog_msg_hash = &create_xml_hash("new_syslog_config", $server_address, $mac_address);
@@ -694,7 +704,7 @@ sub new_ntp_config {
        }
 
        my $entry= $ldap_res->entry(0);
-    my $dn = &Net::LDAP::Util::escape_dn_value($entry->dn);
+    my $filter_dn = &Net::LDAP::Util::escape_filter_value($entry->dn);
        my @ntp_servers= $entry->get_value("gotoNtpServer");
 
     # If no ntp server is specified at host, just have a look at the object group of the host
@@ -703,7 +713,7 @@ sub new_ntp_config {
         my $ldap_res = $ldap_handle->search( base   => $ldap_base,
                 scope  => 'sub',
                 attrs => ['gotoNtpServer'],
-                filter => "(&(objectClass=gosaGroupOfNames)(member=$dn))");
+                filter => "(&(objectClass=gosaGroupOfNames)(member=$filter_dn))");
         if($ldap_res->code) {
             &main::daemon_log("$session_id ".$ldap_res->error, 1);
             return;
@@ -715,7 +725,7 @@ sub new_ntp_config {
                     "\n\tbase: $ldap_base".
                     "\n\tscope: sub".
                     "\n\tattrs: gotoNtpServer".
-                    "\n\tfilter: (&(objectClass=gosaGroupOfNames)(member=$dn))", 1);
+                    "\n\tfilter: (&(objectClass=gosaGroupOfNames)(member=$filter_dn))", 1);
             return;
         }
 
@@ -755,6 +765,7 @@ sub new_ldap_config {
        my $hit_counter = keys %{$res};
        if( not $hit_counter == 1 ) {
                &main::daemon_log("$session_id ERROR: more or no hit found in known_clients_db by query '$sql_statement'", 1);
+        return;
        }
 
     $address = $res->{1}->{hostname};
@@ -785,7 +796,7 @@ sub new_ldap_config {
 
        # Sanity check
        if ($mesg->count != 1) {
-               &main::daemon_log("$session_id WARNING: client with mac address $macaddress not found/unique/active - not sending ldap config".
+               &main::daemon_log("$session_id ERROR: client with mac address $macaddress not found/unique/active - not sending ldap config".
                 "\n\tbase: $ldap_base".
                 "\n\tscope: sub".
                 "\n\tattrs: dn, gotoLdapServer".
@@ -794,13 +805,14 @@ sub new_ldap_config {
        }
 
        my $entry= $mesg->entry(0);
-       my $dn= $entry->dn;
+       my $filter_dn= &Net::LDAP::Util::escape_filter_value($entry->dn);
        my @servers= $entry->get_value("gotoLdapServer");
        my $unit_tag= $entry->get_value("gosaUnitTag");
        my @ldap_uris;
        my $server;
        my $base;
        my $release;
+    my $dn= $entry->dn;
 
        # Fill release if available
        my $FAIclass= $entry->get_value("FAIclass");
@@ -810,13 +822,12 @@ sub new_ldap_config {
 
        # Do we need to look at an object class?
        if (not @servers){
-          my $escaped_dn = &Net::LDAP::Util::escape_dn_value($dn);
                $mesg = $ldap_handle->search( base   => $ldap_base,
                        scope  => 'sub',
                        attrs => ['dn', 'gotoLdapServer', 'FAIclass'],
-                       filter => "(&(objectClass=gosaGroupOfNames)(member=$escaped_dn))");
+                       filter => "(&(objectClass=gosaGroupOfNames)(member=$filter_dn))");
                if($mesg->code) {
-                       &main::daemon_log("$session_id ERROR: unable to search for '(&(objectClass=gosaGroupOfNames)(member=$dn))': ".$mesg->error, 1);
+                       &main::daemon_log("$session_id ERROR: unable to search for '(&(objectClass=gosaGroupOfNames)(member=$filter_dn))': ".$mesg->error, 1);
                        return;
                }
 
@@ -826,7 +837,7 @@ sub new_ldap_config {
                     "\n\tbase: $ldap_base".
                     "\n\tscope: sub".
                     "\n\tattrs: dn, gotoLdapServer, FAIclass".
-                    "\n\tfilter: (&(objectClass=gosaGroupOfNames)(member=$escaped_dn))", 1);
+                    "\n\tfilter: (&(objectClass=gosaGroupOfNames)(member=$filter_dn))", 1);
             return;
         }
 
@@ -978,7 +989,6 @@ sub hardware_config {
        
        } else {
                my $entry= $mesg->entry(0);
-               my $dn= $entry->dn;
                if (defined($entry->get_value("gotoHardwareChecksum"))) {
                        if (! $entry->get_value("gotoHardwareChecksum") eq $gotoHardwareChecksum) {
                                $entry->replace(gotoHardwareChecksum => $gotoHardwareChecksum);