X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=gosa-core%2Finclude%2Fclass_gosaSupportDaemon.inc;h=189dbdfac3a9addfe14b00e5c176f18a044f0284;hb=33eaf79015161452c8d638eefd455b887af43ac9;hp=04538015981620e03b80638ca9d3367a8c0902ef;hpb=240b60a884d1297d4e838c86982e3c669478da81;p=gosa.git diff --git a/gosa-core/include/class_gosaSupportDaemon.inc b/gosa-core/include/class_gosaSupportDaemon.inc index 045380159..189dbdfac 100644 --- a/gosa-core/include/class_gosaSupportDaemon.inc +++ b/gosa-core/include/class_gosaSupportDaemon.inc @@ -33,6 +33,7 @@ class gosaSupportDaemon private $is_connected = FALSE; + protected $use_alternative_xml_parse_method = FALSE; /*! \brief Creates a new gosaSupportDaemon object. @param string Host The Host where the daemon is running on. @@ -46,13 +47,18 @@ class gosaSupportDaemon #FIXME: bad idea about referencing global variables from within classes global $config; + /* This should only be the case if we call this from setup. + __autoload() + */ + if(!is_object($config)) { return; } + # load from config, store statically - if (isset($config->current['GOSA_SI'])){ + if ($config->get_cfg_value("gosa_si") != ""){ if ($this->s_host == ""){ - $this->s_host= preg_replace("/^.*@([^:]+):.*$/", "$1", $config->current['GOSA_SI']); - $this->i_port= preg_replace("/^.*@[^:]+:(.*)$/", "$1", $config->current['GOSA_SI']); - $this->s_encryption_key = preg_replace("/^(.*)@[^:]+:.*$/", "$1", $config->current['GOSA_SI']); + $this->s_host= preg_replace("/^.*@([^:]+):.*$/", "$1", $config->get_cfg_value("gosa_si")); + $this->i_port= preg_replace("/^.*@[^:]+:(.*)$/", "$1", $config->get_cfg_value("gosa_si")); + $this->s_encryption_key = preg_replace("/^(.*)@[^:]+:.*$/", "$1", $config->get_cfg_value("gosa_si")); } $this->f_timeout = $timeout; @@ -84,6 +90,30 @@ class gosaSupportDaemon return($this->is_connected); } + + /*! \brief Returns TRUE whether we are connected or not + @return BOOLEAN Returns TRUE when connected else FALSE + */ + public function is_connected() + { + return($this->is_connected); + } + + + /*! \brief */ + public function get_hosts_with_module($mod) + { + $data = array("module_name" => $mod); + $res = $this->send_data("gosa_get_hosts_with_module",$this->s_host.":".$this->i_port,$data,TRUE); + $hosts = array(); + if(isset($res['XML'][0]['HOST'])){ + foreach($res['XML'][0]['HOST'] as $entry){ + $hosts [] = $entry['VALUE']; + } + } + return($hosts); + } + /*! \brief Disconnect from gosa daemon. */ @@ -129,8 +159,16 @@ class gosaSupportDaemon public function get_error() { $str = $this->s_error; - $str = preg_replace("/ /"," ",$str); - return($str); + $ret = ""; + if(is_string($str)){ + $ret = $str; + }else{ + foreach($str as $msg){ + $ret .= $msg." "; + } + } + $ret = preg_replace("/ /"," ",$ret); + return($ret); } @@ -796,7 +834,7 @@ class gosaSupportDaemon @param String XML string @return Array Returns an array containing the xml structure. */ - private function xml_to_array($xml) + private function xml_to_array($xml,$alternative_method = FALSE) { $params = array(); $level = array(); @@ -809,30 +847,46 @@ class gosaSupportDaemon }else{ xml_parser_free($parser); - foreach ($vals as $xml_elem) { - if ($xml_elem['type'] == 'open') { - if (array_key_exists('attributes',$xml_elem)) { - list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']); - } else { - $level[$xml_elem['level']] = $xml_elem['tag']; - } - } - if ($xml_elem['type'] == 'complete') { - $start_level = 1; - $test2 = &$params; - while($start_level < $xml_elem['level']) { - $test2 = &$test2[$level[$start_level]]; - $start_level++; + if($this->use_alternative_xml_parse_method) { + $params = $this->build_xml_array($vals); + } else { + + foreach ($vals as $xml_elem) { + if ($xml_elem['type'] == 'open') { + if (array_key_exists('attributes',$xml_elem)) { + list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']); + } else { + $level[$xml_elem['level']] = $xml_elem['tag']; + } } - if(!isset($test2[$xml_elem['tag']])){ - if(isset($xml_elem['value'])){ - $test2[$xml_elem['tag']] = $xml_elem['value']; + if ($xml_elem['type'] == 'complete') { + + $start_level = 1; + $test2 = &$params; + while($start_level < $xml_elem['level']) { + $test2 = &$test2[$level[$start_level]]; + $start_level++; } - }else{ - if(!is_array($test2[$xml_elem['tag']])){ - $test2[$xml_elem['tag']] = array($test2[$xml_elem['tag']]); + + /* Save tag attributes too. + e.g. + */ + if(isset($xml_elem['attributes'])){ + foreach($xml_elem['attributes'] as $name => $value){ + $test2['ATTRIBUTES'][$name] = $value; + } + } + + if(!isset($test2[$xml_elem['tag']])){ + if(isset($xml_elem['value'])){ + $test2[$xml_elem['tag']] = $xml_elem['value']; + } + }else{ + if(!is_array($test2[$xml_elem['tag']])){ + $test2[$xml_elem['tag']] = array($test2[$xml_elem['tag']]); + } + $test2[$xml_elem['tag']][] = $xml_elem['value']; } - $test2[$xml_elem['tag']][] = $xml_elem['value']; } } } @@ -849,6 +903,37 @@ class gosaSupportDaemon } + function build_xml_array(&$vals) + { + $array = array(); + while(count($vals)){ + $key = key($vals); + $val = $vals[$key]; + unset($vals[$key]); + if($val['type'] == "close"){ + return($array); + }elseif($val['type']=="open"){ + $array[$val['tag']][] = $this->build_xml_array($vals); + }elseif($val['type'] != "cdata"){ + $data = array("VALUE" => "","ATTRIBUTES" => ""); + foreach(array("value" => "VALUE", "attributes" => "ATTRIBUTES") as $name => $attr){ + if(isset($val[$name])){ + $data[$attr] = $val[$name]; + } + } + $array[$val['tag']][] = $data; + }else{ +#print_a($val); + } + } + return($array); + } + + + + + + /*! \brief Updates an entry with a set of new values, @param Integer The ID of the entry, we want to update. @param Array The variables to update. @@ -869,6 +954,7 @@ class gosaSupportDaemon $attr = ""; foreach($data as $key => $value){ + $key = strtolower($key); if(is_array($value)){ foreach($value as $sub_value){ $attr.= "<$key>".strtolower($sub_value)."\n"; @@ -1078,18 +1164,33 @@ class gosaSupportDaemon $entries = $this->xml_to_array($str); if(isset($entries['XML']) && is_array($entries['XML'])){ $ret = $entries; - if(isset($entries['XML']['ERROR_STRING'])) { - $this->set_error($entries['XML']['ERROR_STRING']); - new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", array($data=>$data),"FAILED ".$this->get_error()); - }elseif(isset($entries['XML']['ERROR'])){ - $this->set_error($entries['XML']['ERROR']); - new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", array($data=>$data),"FAILED ".$this->get_error()); + if($this->use_alternative_xml_parse_method) { + if(isset($entries['XML'][0]['ERROR_STRING'][0]) && is_array($entries['XML'][0]['ERROR_STRING'])) { + $this->set_error($entries['XML'][0]['ERROR_STRING'][0]['VALUE']); + new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", + array($data=>$data),"FAILED ".$this->get_error()); + }elseif(isset($entries['XML'][0]['ERROR'][0]['VALUE']) && is_array($entries['XML'][0]['ERROR'])){ + $this->set_error($entries['XML'][0]['ERROR'][0]['VALUE']); + new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", + array($data=>$data),"FAILED ".$this->get_error()); + } }else{ - new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", array($data=>$data),"SUCCESS"); + if(isset($entries['XML']['ERROR_STRING'])) { + $this->set_error($entries['XML']['ERROR_STRING']); + new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", + array($data=>$data),"FAILED ".$this->get_error()); + }elseif(isset($entries['XML']['ERROR'])){ + $this->set_error($entries['XML']['ERROR']); + new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", + array($data=>$data),"FAILED ".$this->get_error()); + } } + new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", + array($data=>$data),"SUCCESS"); } }else{ - new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", array($data=>$data),"Fire & forget, not result.! ".$this->get_error()); + new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", + array($data=>$data),"Fire & forget, not result.! ".$this->get_error()); } } return($ret); @@ -1107,7 +1208,7 @@ class gosaSupportDaemon foreach ($data as $key => $value){ if(is_array($value)){ foreach($value as $sub_val){ - $xml_message.= "<$key>$sub_value"; + $xml_message.= "<$key>$sub_val"; } }else{ $xml_message.= "<$key>$value"; @@ -1300,7 +1401,7 @@ class gosaSupportDaemon trigger_error("The given principal name is not of type string or it is empty."); return($ret); } - if(!is_array($values) || !count($values)){ + if(!is_array($values)){ trigger_error("No valid update settings given. The parameter must be of type array and must contain at least one entry"); return($ret); } @@ -1318,6 +1419,7 @@ class gosaSupportDaemon trigger_error("Invalid configuration attribute given '".$key."=".$value."'."); return($ret); } + $key = strtolower($key); if(is_array($value)){ foreach($value as $val){ $attrs.= "<$key>$val\n"; @@ -1342,6 +1444,23 @@ class gosaSupportDaemon } + function krb5_ramdomize_key($server,$name) + { + /* Prepare request event + */ + $xml_msg = + "". + "
gosa_krb5_randomize_key
". + "".$name."". + "GOSA". + "".$server."". + "
"; + + return($this->_send($xml_msg,TRUE) == TRUE && !$this->is_error()); + } + + + /*! \brief Updates a given principal with a set of configuration settings. For a list of configurable attributes have a look at 'krb5_get_principal()'. (Uses the GOsa support daemon instead of the ldap database.) @@ -1376,6 +1495,7 @@ class gosaSupportDaemon trigger_error("Invalid configuration attribute given '".$key."=".$value."'."); return($ret); } + $key = strtolower($key); if(is_array($value)){ foreach($value as $val){ $attrs.= "<$key>$val\n"; @@ -1569,6 +1689,7 @@ class gosaSupportDaemon trigger_error("Invalid policy configuration attribute given '".$id."=".$value."'."); return($ret); } + $id = strtolower($id); $attrs.= "<$id>$value\n"; } @@ -1624,6 +1745,7 @@ class gosaSupportDaemon trigger_error("Invalid policy configuration attribute given '".$id."=".$value."'."); return($ret); } + $id = strtolower($id); $attrs.= "<$id>$value\n"; } @@ -1677,6 +1799,45 @@ class gosaSupportDaemon } + /*! \brief Sets the password of for the given principal. + (Uses the GOsa support daemon instead of the ldap database.) + @param String The servers mac + @param String The principals name + @param String $the new password. + @return Boolean TRUE on success else FALSE + */ + public function krb5_set_password($server,$name,$password) + { + $ret = FALSE; + + /* Check if the given server is a valid mac address + */ + if(!tests::is_mac($server)){ + trigger_error("The given server address '".$server."' is invalid, it must be a valid mac address"); + return($ret); + } + + /* Check if the given name is a valid request value + */ + if(!is_string($name) || empty($name)){ + trigger_error("The given principal name is not of type string or it is empty."); + return($ret); + } + + /* Prepare request event + */ + $xml_msg = + "". + "
gosa_krb5_set_password
". + "".$name."". + "".$password."". + "GOSA". + "".$server."". + "
"; + return($this->_send($xml_msg,TRUE) == TRUE && !$this->is_error()); + } + + /*! \brief Returns log file informations for a given mac address @param $mac The mac address to fetch logs for. @retrun Array A Multidimensional array containing log infos. @@ -1747,6 +1908,125 @@ class gosaSupportDaemon } return(""); } + + + + + + /***************** + * DAK - Functions + *****************/ + + /*! \brief Returns all currenlty queued entries for a given DAK repository + @param ... + @return Array All queued entries. + */ + public function DAK_keyring_entries($server) + { + /* Ensure that we send the event to a valid mac address + */ + if(!is_string($server) || !tests::is_mac($server)){ + trigger_error("No valid mac address given '".$server."'."); + return; + } + + /* Create query + */ + $xml_msg = " +
gosa_get_dak_keyring
+ ".$server." + GOSA +
"; + + $res = $this->_send($xml_msg,TRUE); + + /* Check if there are results for POLICY + */ + if(isset($res['XML'])){ + $ret = array(); + foreach($res['XML'] as $key => $entry){ + if(preg_match("/^ANSWER/",$key)){ + $ret[] = $entry; + } + } + return($ret); + }else{ + return(array()); + } + } + + + /*! \brief Imports the given key into the specified keyring (Servers mac address) + @param String The servers mac address + @param String The gpg key. + @return Boolean TRUE on success else FALSE + */ + public function DAK_import_key($server,$key) + { + /* Ensure that we send the event to a valid mac address + */ + if(!is_string($server) || !tests::is_mac($server)){ + trigger_error("No valid mac address given '".$server."'."); + return; + } + + /* Check if there is some cleanup required before importing the key. + There may be some Header lines like: + -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.6 (GNU/Linux) + */ + if(preg_match("/".normalizePreg("BEGIN PGP PUBLIC KEY BLOCK")."/",$key)){ + + /* Remove header */ + $key = preg_replace("/^.*\n\n/sim","",$key); + /* Remove footer */ + $key = preg_replace("/-----.*$/sim","",$key); + }elseif (!preg_match('%^[a-zA-Z0-9/+]*={0,2}$%', $key)) { + + /* Encode key if it is raw. + */ + $key = base64_encode($key); + } + + /* Create query + */ + $xml_msg = " +
gosa_import_dak_key
+ ".$server." + ".$key." + GOSA +
"; + + $res = $this->_send($xml_msg,TRUE); + return($this->is_error()); + } + + + /*! \brief Removes a key from the keyring on the given server. + @param String The servers mac address + @param String The gpg key uid. + @return Boolean TRUE on success else FALSE + */ + public function DAK_remove_key($server,$key) + { + /* Ensure that we send the event to a valid mac address + */ + if(!is_string($server) || !tests::is_mac($server)){ + trigger_error("No valid mac address given '".$server."'."); + return; + } + + /* Create query + */ + $xml_msg = " +
gosa_remove_dak_key
+ ".$server." + ".$key." + GOSA +
"; + + $res = $this->_send($xml_msg,TRUE); + return($this->is_error()); + } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: