From c9163bf62ae4c1889592762153709b0838bf5400 Mon Sep 17 00:00:00 2001 From: opensides Date: Tue, 16 Oct 2007 09:02:42 +0000 Subject: [PATCH] First import from opensides branch, NOT WORKING need to be cleanup up later git-svn-id: https://oss.gonicus.de/repositories/gosa/branches/2.5-plugins@7566 594d385d-05f5-0310-b6e9-bd551577e9d8 --- vhost-apache2/apache_editVhost.tpl | 120 +++++++ vhost-apache2/apache_vhost.tpl | 16 + vhost-apache2/class_apacheEditVhost.inc | 460 ++++++++++++++++++++++++ vhost-apache2/class_apacheVhost.inc | 314 ++++++++++++++++ vhost-apache2/doc/README.apache | 13 + 5 files changed, 923 insertions(+) create mode 100644 vhost-apache2/apache_editVhost.tpl create mode 100644 vhost-apache2/apache_vhost.tpl create mode 100644 vhost-apache2/class_apacheEditVhost.inc create mode 100644 vhost-apache2/class_apacheVhost.inc create mode 100644 vhost-apache2/doc/README.apache diff --git a/vhost-apache2/apache_editVhost.tpl b/vhost-apache2/apache_editVhost.tpl new file mode 100644 index 000000000..c8e5d05ad --- /dev/null +++ b/vhost-apache2/apache_editVhost.tpl @@ -0,0 +1,120 @@ +

{t}Generic{/t}

+ + + + + +
+ + + + + + + + + + + + + +
{t}Virtual Host Name{/t}{$must} + +
{t}Virtual Host Document Root{/t}{$must} + +
{t}Admin Mail address{/t}{$must} + +
+
+ + + + +
+

{t}Server Alias{/t}

+ + + + + + + +
+ {$apacheServerAlias} +
+ + + + + + + + + +
+

{t}URL Alias{/t}

+
+

{t}Directory Path{/t}

+
+ + + + +
+
+
+
+ +

 

+
+ + + + + + +
+

{t}Script Alias{/t}

+ + + + + + + +
+ {$apacheScriptAlias} +
+ + + + + + + + + +
+

{t}Alias Directory{/t}

+
+

{t}Script Directory{/t}

+
+ + + + +
+
+
+
+
+

+ + +

+
+ diff --git a/vhost-apache2/apache_vhost.tpl b/vhost-apache2/apache_vhost.tpl new file mode 100644 index 000000000..d8eec5d7f --- /dev/null +++ b/vhost-apache2/apache_vhost.tpl @@ -0,0 +1,16 @@ +

{t}Apache VHosts{/t}

+ + + + +
+ {$VhostList} + + + +
+ diff --git a/vhost-apache2/class_apacheEditVhost.inc b/vhost-apache2/class_apacheEditVhost.inc new file mode 100644 index 000000000..37422c518 --- /dev/null +++ b/vhost-apache2/class_apacheEditVhost.inc @@ -0,0 +1,460 @@ +OldApacheServerName = ""; + $this->isNew = true; + + $this->InitialApacheServerName = "";//$attrs['InitialApacheServerName']; + }else{ + $this->VhostObject = $attrs; + + $this->OldApacheServerName = $attrs['apacheServerName']; + + $this->InitialApacheServerName = $attrs['InitialApacheServerName']; + + $this->isNew = false; + + foreach($this->attributes as $value){ + if(isset($attrs[$value])){ + $this->$value = $attrs[$value]; + } + } + + if(!isset($attrs['apacheServerAlias'])) $this->apacheServerAlias = array(); + if(!isset($attrs['apacheScriptAlias'])) $this->apacheScriptAlias = array(); + + } + } + + /* TRansports the geiven Arraykey one position up*/ + function ArrayUp($atr,$attrs) + { + $ret = $attrs; + $pos = $atr ; + $cn = count($attrs); + if(!(($pos == -1)||($pos == 1)||($pos >$cn))){ + $before = array_slice($attrs,0,($pos-2)); + $mitte = array_reverse(array_slice($attrs,($pos-2),2)); + $unten = array_slice($attrs,$pos); + $ret = array(); + $ret = $this->combineArrays($before,$mitte,$unten); + } + return($ret); + } + + + /* TRansports the geiven Arraykey one position up*/ + function ArrayDown($atr,$attrs) + { + $ret = $attrs; + $pos = $atr ; + $cn = count($attrs); + if(!(($pos == -1)||($pos == $cn))){ + $before = array_slice($attrs,0,($pos-1)); + $mitte = array_reverse(array_slice($attrs,($pos-1),2)); + $unten = array_slice($attrs,($pos+1)); + $ret = array(); + $ret = $this->combineArrays($before,$mitte,$unten); + } + return($ret); + } + + /* Combine new array */ + function combineArrays($ar0,$ar1,$ar2) + { + $ret = array(); + if(is_array($ar0)) + foreach($ar0 as $ar => $a){ + $ret[]=$a; + } + if(is_array($ar1)) + foreach($ar1 as $ar => $a){ + $ret[]=$a; + } + if(is_array($ar2)) + foreach($ar2 as $ar => $a){ + $ret[]=$a; + } + return($ret); + } + + function getpos($atr,$attrs) + { + $i = 0; + foreach($attrs as $attr => $name) { + $i++; + if($attr == $atr){ + return($i); + } + } + return(-1); + } + + + function execute() + { + /* Call parent execute */ + plugin::execute(); + + + /* Fill templating stuff */ + $smarty= get_smarty(); + $display= ""; + + /* Open Vhost Entry Edit Dialog + */ + if(!count($this->VhostObject)){ + $smarty->assign("AllowVhostEdit" , false); + }else{ + $smarty->assign("AllowVhostEdit" , true); + if(isset($_POST['EditVhostEntries'])){ + $this->dialog= new servAPACHE2editVhostEntries($this->config,$this->dn,$this->VhostObject); + } + } + + /* Save Vhost Entry Edit Dialog + */ + if(isset($_POST['SaveVhostEntryChanges'])){ + $this->dialog->save_object(); + if(count($this->dialog->check())){ + $msgs = $this->dialog->check(); + foreach($msgs as $msg){ + print_red($msg); + } + }else{ + $this->dialog->save(); + $this->dialog = false; + } + } + + /* Cancel Vhost Entrie Edit Dialog + */ + if(isset($_POST['CancelVhostEntryChanges'])){ + $this->dialog = false; + } + + /* Display any type of open dialogs + */ + if($this->dialog){ + $this->dialog->save_object(); + return($this->dialog->execute()); + } + + $once =true; + foreach($_POST as $name => $value){ + if((preg_match("/^SAup_/",$name)) && ($once)){ + $once = false; + + $id = preg_replace("/^SAup_/","",$name); + $id = preg_replace("/_.*$/","",$id); + $id = base64_decode($id); + + $this->apacheServerAlias = $this->ArrayUp(($id+1),$this->apacheServerAlias); + } + if((preg_match("/^SAdown_/",$name)) && ($once)){ + $once = false; + + $id = preg_replace("/^SAdown_/","",$name); + $id = preg_replace("/_.*$/","",$id); + $id = base64_decode($id); + + $this->apacheServerAlias = $this->ArrayDown(($id+1),$this->apacheServerAlias); + } + if((preg_match("/^SAdel_/",$name)) && ($once)){ + $once = false; + + $id = preg_replace("/^SAdel_/","",$name); + $id = preg_replace("/_.*$/","",$id); + $id = base64_decode($id); + + unset($this->apacheServerAlias[$id]); + + $tmp =array(); + foreach($this->apacheServerAlias as $entry){ + $tmp[] = $entry; + } + + $this->apacheServerAlias = $tmp; + } + + if((preg_match("/^SCup_/",$name)) && ($once)){ + $once = false; + + $id = preg_replace("/^SCup_/","",$name); + $id = preg_replace("/_.*$/","",$id); + $id = base64_decode($id); + + $this->apacheScriptAlias = $this->ArrayUp(($id+1),$this->apacheScriptAlias); + } + if((preg_match("/^SCdown_/",$name)) && ($once)){ + $once = false; + + $id = preg_replace("/^SCdown_/","",$name); + $id = preg_replace("/_.*$/","",$id); + $id = base64_decode($id); + + $this->apacheScriptAlias = $this->ArrayDown(($id+1),$this->apacheScriptAlias); + } + if((preg_match("/^SCdel_/",$name)) && ($once)){ + $once = false; + + $id = preg_replace("/^SCdel_/","",$name); + $id = preg_replace("/_.*$/","",$id); + $id = base64_decode($id); + + unset($this->apacheScriptAlias[$id]); + + $tmp =array(); + foreach($this->apacheScriptAlias as $entry){ + $tmp[] = $entry; + } + + $this->apacheScriptAlias = $tmp; + } + + } + + if((isset($_POST['AddSARecord'])) && (!empty($_POST['StrSAAlias'])) && (!empty($_POST['StrSADir']))){ + $this->apacheServerAlias[] = trim($_POST['StrSAAlias']." ".$_POST['StrSADir']); + } + + if((isset($_POST['AddSCRecord'])) && (!empty($_POST['StrSCAlias'])) && (!empty($_POST['StrSCDir']))){ + $this->apacheScriptAlias[] = trim($_POST['StrSCAlias']." ".$_POST['StrSCDir']); + } + + /* Handle Post events */ + $once = true; + foreach($_POST as $name => $value){ + + /* Delete record if requested */ + if((preg_match("/RemoveRecord_/",$name))&&($once)){ + $once = false; + $id= preg_replace("/RemoveRecord_/","",$name); + unset($this->Records[$id]); + } + } + + /* Add new Vhostrecord */ + /* if(isset($_POST['AddNewRecord'])){ + $this->Records[] = array("type"=>"aRecord","value"=>""); + }*/ + + /* Fill in values */ + foreach($this->attributes as $name){ + $smarty->assign($name,$this->$name); + } + + /* Set apacheServerNames without server suffix */ + $smarty->assign("apacheServerName",$this->apacheServerName); + + $div = new DivSelectBox("apacheServerAlias"); + $div->setHeight(120); + $recs = $this->apacheServerAlias; + + $oneup = " "; + $onedown = " "; + $onedel = " + "; + user_error(print_r($recs,true)); + foreach($recs as $key => $rec){ + $div ->AddEntry(array( + array("string"=>$rec), +/* array("string"=>$key, + "attach"=>"style='width:20px;'"),*/ + array("string"=>str_replace("%s",base64_encode($key),$oneup.$onedown.$onedel), + "attach"=>"style='width:70px;border-right:0px;'") + )); + } + + $smarty->assign("NotNew", false); + + $smarty->assign("apacheServerAlias", $div->DrawList()); + + + + $div = new DivSelectBox("apacheScriptAlias"); + $div->setHeight(120); + $recs = $this->apacheScriptAlias; + + $oneup = " "; + $onedown = " "; + $onedel = " + "; + + foreach($recs as $key => $rec){ + $div ->AddEntry(array( + array("string"=>$rec), +/* array("string"=>$key, + "attach"=>"style='width:20px;'"),*/ + array("string"=>str_replace("%s",base64_encode($key),$oneup.$onedown.$onedel), + "attach"=>"style='width:70px;border-right:0px;'") + )); + } + + + $smarty->assign("NotNew", false); + + $smarty->assign("apacheScriptAlias", $div->DrawList()); + + + + /* Display template */ + $display.= $smarty->fetch(get_template_path('apache_editVhost.tpl', TRUE)); + return($display); + } + + function remove_from_parent() + { + } + + /* Save data to object */ + function save_object() + { + //plugin::save_object(); + foreach($this->attributes as $attr){ + if(isset($_POST[$attr])){ + $this->$attr = $_POST[$attr]; + } + } + + } + + + /* Check supplied data */ + function check() + { + /* Call common method to give check the hook */ + $message= plugin::check(); + + /* Check if apacheServerName is already in use */ + $usedVhosts = $this->getUsedapacheServerNames(); + if(($this->isNew == true)||($this->apacheServerName != $this->InitialApacheServerName)){ +/* if((isset($usedVhosts[$this->apacheServerName]))&&($this->apacheServerName != $this->InitialApacheServerName)){ + $message[] =_("This apacheServerName is already in use"); + } +*/ + } + + if(!is_domain($this->apacheServerName) || empty($this->apacheServerName)){ + $message[] =sprintf(_("Please choose a valid Virtual Host Name.")); + } + + if(!is_path($this->apacheDocumentRoot) || empty($this->apacheDocumentRoot)){ + $message[] = _("Please choose a valid Path as Virtual Host Document Root."); + } + + if(!is_email($this->apacheServerAdmin) || empty($this->apacheServerAdmin)){ + $message[] = _("Please choose a valid Email Account as Admin Mail address."); + } + + if($this->apacheServerName != strtolower($this->apacheServerName)){ + $message[] = _("Only lowercase strings are allowed as Virtual Host Name."); + } + + if($this->apacheDocumentRoot != strtolower($this->apacheDocumentRoot)){ + $message[] = _("Only lowercase strings are allowed as Virtual Host Document Root."); + } + + if($this->apacheServerAdmin != strtolower($this->apacheServerAdmin)){ + $message[] = _("Only lowercase strings are allowed as Admin Mail address."); + } + + foreach($this->apacheServerAlias as $key => $line){ + $apacheServerAlias_ar=split(" ",$line); + $url=$apacheServerAlias_ar[0]; + if(!is_path($url)){ + $message[] = sprintf(_("Please choose a valid Path as URL Alias Path in line: %s"),$line); + } + } + + foreach($this->apacheScriptAlias as $key => $line){ + $apacheScriptAlias_ar=split(" ",$line); + $url=$apacheScriptAlias_ar[0]; + if(!is_path($url)){ + $message[] = sprintf(_("Please choose a valid Path as URL Alias Path in line: %s"),$line); + } + } + + return ($message); + } + + /* This funtion returns all used apacheServerNames */ + function getUsedapacheServerNames() + { + $ret = array(); + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $ldap->search("(&(objectClass=apacheConfig)(apacheServerName=*))",array("apacheServerName")); + while($attr = $ldap->fetch()){ + $ret[$attr['apacheServerName'][0]]=""; + } + return($ret); + } + + /* Save to LDAP */ + function save() + { + $ret =array(); + foreach($this->attributes as $name){ + $ret[$name] = $this->$name; + } + + /* Create SA records + */ + foreach($this->apacheServerAlias as $key => $rec){ + $rec['value']= $key." ".$rec['value']; + $this->Records [] = $rec; + } + + /* Create SC records + */ + foreach($this->apacheScriptAlias as $key => $rec){ + $rec['value']= $key." ".$rec['value']; + $this->Records [] = $rec; + } + + $ret['RECORDS'] = $this->Records; + + $ret['InitialApacheServerName'] = $this->InitialApacheServerName; + + return($ret); + } + +} + +?> diff --git a/vhost-apache2/class_apacheVhost.inc b/vhost-apache2/class_apacheVhost.inc new file mode 100644 index 000000000..9c9ca50f0 --- /dev/null +++ b/vhost-apache2/class_apacheVhost.inc @@ -0,0 +1,314 @@ +orig_dn = $dn; + + /* Get all vhost Informations + */ + $this->Vhosts = getAPACHE2VhostEntries($config,$dn); + + /* If there is at least one entry in this -> types, we have APACHE2 enabled + */ + if(count($this->Vhosts) == 0){ + $this->is_account = false; + }else{ + $this->is_account = true; + } + $this->APACHE2initially_was_account = $this->is_account; + } + + + function execute() + { + /* Call parent execute + */ + plugin::execute(); + + /* Fill templating stuff + */ + $smarty= get_smarty(); + $display= ""; + + /* Do we need to flip is_account state? + */ + if (isset($_POST['modify_state'])){ + + /* Only change account state if allowed */ + if($this->is_account && $this->acl == "#all#"){ + $this->is_account= !$this->is_account; + $this->is_modified = true; + }elseif(!$this->is_account && chkacl($this->acl,"create") == ""){ + $this->is_account= !$this->is_account; + $this->is_modified = true; + } + } + + if ($this->is_account){ + $display= $this->show_header(_("Remove APACHE2 service"), + _("This server has APACHE2 features enabled. You can disable them by clicking below.")); + } else { + $display= $this->show_header(_("Add APACHE2 service"), + _("This server has APACHE2 features disabled. You can enable them by clicking below.")); + return ($display); + } + + /* Edited or Added vhost + */ + if((isset($_POST['SaveVhostChanges'])) && is_object($this->dialog)){ + $this->dialog->save_object(); + + /* Check for errors + */ + if(count($this->dialog->check())){ + foreach($this->dialog->check() as $msgs){ + print_red($msgs); + } + }else{ + /* add new/edited vhost + */ + $ret = $this->dialog->save(); + if(!$this->dialog->isNew){ + unset($this->Vhosts[$this->dialog->OldApacheServerName]); + } + $this->Vhosts[$ret['apacheServerName']] = $ret; + $this->dialog = NULL; + } + } + + /* Cancel vhost edit / new + */ + if(isset($_POST['CancelVhostChanges'])){ + $this->dialog = NULL; + } + + /* Add empty new vhost + */ + if(isset($_POST['AddVhost']) && chkacl($this->acl,"servapache2") == ""){ + $this->dialog = new servapache2editVhost($this->config,$this->dn); + } + + /* Check for edit vhost request + */ + $once = false; + foreach( $_POST as $name => $value){ + user_error(print_r($this->Vhosts,true)); + /* check all post for edit request + */ + if(preg_match("/^editVhost_/",$name)&&!$once && chkacl($this->acl,"servapache2") == ""){ + $once =true; + $tmp = preg_replace("/^editVhost_/","",$name); + $tmp = base64_decode(preg_replace("/_.*$/","",$tmp)); + $this->dialog= new servapache2editVhost($this->config,$this->dn,$this->Vhosts[$tmp]); + } + + /* check posts for delete vhost + */ + if(preg_match("/^delVhost_/",$name)&&!$once && chkacl($this->acl,"servapache2") == ""){ + + $once =true; + $tmp = preg_replace("/^delVhost_/","",$name); + $tmp = base64_decode(preg_replace("/_.*$/","",$tmp)); + + /* Initiate deletion + */ + $this->RemoveVhost($tmp); + } + } + + /* Show dialog + */ + if($this->dialog!= NULL){ + $this->dialog->save_object(); + $this->dialog->parent = $this; + return($this->dialog->execute()); + } + + /* Create Listbox with existing Vhosts + */ + $VhostList = new divSelectBox("apacheConfigs"); + $VhostList -> SetHeight(254); + + /* Add entries to divlist + */ + $editImg = " + "; + foreach($this->Vhosts as $vhost => $values ){ + $VhostList->AddEntry(array( + array("string" => $vhost), + array("string" => str_replace("%s",base64_encode($vhost),$editImg)) + )); + } + + $smarty->assign("servapache2ACL",chkacl($this->acl,"servapache2")); + + /* Display tempalte + */ + $smarty->assign("VhostList",$VhostList->DrawList()); + $display.= $smarty->fetch(get_template_path('apache_vhost.tpl', TRUE)); + return($display); + } + + + /* Delete specified vhost + */ + function RemoveVhost($id) + { + $vhosts = $this->getUsedapacheServerNames(); + + $vhostname = ""; + if(isset($this->Vhosts[$id]['InitialApacheServerName'])){ + $vhostname= $this->Vhosts[$id]['InitialApacheServerName']; + } + + $used = array(); + + /* Add Records which use this apacheServerName + */ + if(isset($vhosts[$vhostname])){ + $used = array_merge($used,$vhosts[$vhostname]); + } + + + /* There are still entries using this configuration + * Abort deletion + */ + if(count($used)){ + $i = 2; + $str =""; + foreach($used as $dn){ + if($i > 0 ){ + $i --; + $str.=$dn." "; + } + } + + /* Only show 2 apache2 in the error message + */ + if(count($used)> 2) { + $str .=" ... "; + } + print_red(sprintf(_("Can't delete the selected vhost, because it is still in use by these entry/entries '%s'"),trim($str))); + + }else{ + unset($this->Vhosts[$id]); + return(true); + } + return(false); + } + + + /* This funtion returns all used Vhostnames + */ + function getUsedapacheServerNames() + { + $ret = array(); + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $ldap->search("(&(objectClass=apacheConfig)(apacheServerName=*))",array("apacheServerName")); + while($attr = $ldap->fetch()){ + $ret[$attr['apacheServerName'][0]][] = $attr['dn']; + } + return($ret); + } + + + + /* Remove apache2 service + */ + function remove_from_parent() + { + if($this->APACHE2initially_was_account){ + $bool = true; + foreach($this->Vhosts as $key => $vhost){ + $bool= $bool & $this->RemoveVhost($key); + } + + if($bool){ + $this->save(); + } + return($bool); + } + } + + + + /* Save to LDAP */ + function save() + { + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + + /* Get differences + */ + + $old_dn = $this->orig_dn; + if($old_dn == "new"){ + $old_dn = $this->dn; + } + + $tmp = getAPACHE2VhostEntriesDiff($this->config,$this->Vhosts,$old_dn); + + /* Updated vhost entries if reverser or forward name has changed + * Must be done before moving entries, else the given dn is invalid + */ + if(isset($tmp['vhostUpdates'])){ + foreach($tmp['vhostUpdates'] as $dn => $attrs){ + $ldap->cd($dn); + $ldap->modify($attrs); + show_ldap_error("Vhost:".$ldap->get_error(), _("Updating APACHE2 service failed")); + } + } + + /* Delete apache2 + */ + foreach($tmp['del'] as $dn => $del){ + $ldap->cd($dn); + $ldap->rmdir_recursive($dn); + show_ldap_error($ldap->get_error(), _("Removing APACHE2 entries failed")); + } + + /* move follwoing entries + */ + foreach($tmp['move'] as $src => $dst){ + $this->recursive_move($src,$dst); + } + + /* Add || Update new APACHE2 entries + */ + foreach($tmp['add'] as $dn => $attrs){ + $ldap->cd($dn); + user_error(print_r($dn,true)); + $ldap->cat($dn, array('dn')); + if(count($ldap->fetch())){ + user_error("MODIFY".print_r($attrs,true)); + $ldap->cd($dn); + $ldap->modify ($attrs); + }else{ + $ldap->cd($dn); + $ldap->add($attrs); + } + show_ldap_error($ldap->get_error(), _("Saving APACHE2 entries failed")); + } + } +} +// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: +?> diff --git a/vhost-apache2/doc/README.apache b/vhost-apache2/doc/README.apache new file mode 100644 index 000000000..584f384fd --- /dev/null +++ b/vhost-apache2/doc/README.apache @@ -0,0 +1,13 @@ +To use the apache vhost server extension + +1) Add the mod_vhost_ldap.schema to your schema directory + +2) Add the following string to your server tab entry + + + +Benoit Mortier & Alejandro Escanero +OpenSides October 2007 + + + -- 2.30.2