From 075e33c5e5f74ee7ba7987117e37cf134ecc1ed4 Mon Sep 17 00:00:00 2001 From: opensides Date: Tue, 7 Apr 2009 16:54:05 +0000 Subject: [PATCH] - Added code to make the apache plugin work in 2.5.17 - Added debian packaging for plugin git-svn-id: https://oss.gonicus.de/repositories/gosa/branches/2.5-plugins@13584 594d385d-05f5-0310-b6e9-bd551577e9d8 --- vhost-apache2/debian/changelog | 5 + vhost-apache2/debian/compat | 1 + vhost-apache2/debian/control | 14 + vhost-apache2/debian/copyright | 32 + vhost-apache2/debian/dirs | 2 + vhost-apache2/debian/docs | 1 + vhost-apache2/debian/install | 6 + .../debian/patches/01_patch_functions.dpatch | 18 + vhost-apache2/debian/postrm | 9 + vhost-apache2/debian/preinst | 8 + vhost-apache2/debian/rules | 82 + vhost-apache2/functions.inc | 2693 +++++++++++++++++ .../apache2/class_servApacheEditVhost.inc | 7 +- 13 files changed, 2876 insertions(+), 2 deletions(-) create mode 100644 vhost-apache2/debian/changelog create mode 100644 vhost-apache2/debian/compat create mode 100644 vhost-apache2/debian/control create mode 100644 vhost-apache2/debian/copyright create mode 100644 vhost-apache2/debian/dirs create mode 100644 vhost-apache2/debian/docs create mode 100644 vhost-apache2/debian/install create mode 100755 vhost-apache2/debian/patches/01_patch_functions.dpatch create mode 100644 vhost-apache2/debian/postrm create mode 100644 vhost-apache2/debian/preinst create mode 100755 vhost-apache2/debian/rules create mode 100644 vhost-apache2/functions.inc diff --git a/vhost-apache2/debian/changelog b/vhost-apache2/debian/changelog new file mode 100644 index 000000000..64e62f37d --- /dev/null +++ b/vhost-apache2/debian/changelog @@ -0,0 +1,5 @@ +gosa-plugin-apache2 (2.5.17-1) stable; urgency=low + + * New upstream release + + -- Benoit Mortier Thu, 19 Mar 2009 13:06:18 +0100 diff --git a/vhost-apache2/debian/compat b/vhost-apache2/debian/compat new file mode 100644 index 000000000..7ed6ff82d --- /dev/null +++ b/vhost-apache2/debian/compat @@ -0,0 +1 @@ +5 diff --git a/vhost-apache2/debian/control b/vhost-apache2/debian/control new file mode 100644 index 000000000..380bdaae7 --- /dev/null +++ b/vhost-apache2/debian/control @@ -0,0 +1,14 @@ +Source: gosa-plugin-apache2 +Section: web +Priority: optional +Maintainer: Benoit Mortier +Build-Depends: debhelper (>= 5), dpatch +Standards-Version: 3.8.0 + +Package: gosa-plugin-apache2 +Architecture: all +Depends: gosa (>= 2.5.17-1) +Description: Apache2 virtual host for GOsa 2.5 + Plugin to manage apache2 virtualhost in gosa 2.5 + . + diff --git a/vhost-apache2/debian/copyright b/vhost-apache2/debian/copyright new file mode 100644 index 000000000..2cb2b0cae --- /dev/null +++ b/vhost-apache2/debian/copyright @@ -0,0 +1,32 @@ +This package was debianized by Benoit Mortier on +Thu, 19 Mar 2009 13:20:00 +0100. + +It was downloaded from https://develop.opensides.be/svn/gosa-2.5-plugins/vhost-apache2 + +Copyright: + + Copyright (C) 2007-2009 Benoit Mortier + Copyright (C) 2007 Alejandro Escanero + +License: + + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this package; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +On Debian systems, the complete text of the GNU General +Public License can be found in `/usr/share/common-licenses/GPL'. + +The Debian packaging is (C) 2007, Benoit Mortier and +is licensed under the GPL, see above. + diff --git a/vhost-apache2/debian/dirs b/vhost-apache2/debian/dirs new file mode 100644 index 000000000..95ac3691e --- /dev/null +++ b/vhost-apache2/debian/dirs @@ -0,0 +1,2 @@ +/usr/share/gosa/plugins/admin/systems +/usr/share/gosa/include diff --git a/vhost-apache2/debian/docs b/vhost-apache2/debian/docs new file mode 100644 index 000000000..ecbe55c1d --- /dev/null +++ b/vhost-apache2/debian/docs @@ -0,0 +1 @@ +doc/README.apache diff --git a/vhost-apache2/debian/install b/vhost-apache2/debian/install new file mode 100644 index 000000000..d81454ead --- /dev/null +++ b/vhost-apache2/debian/install @@ -0,0 +1,6 @@ +systems/apache2/class_servApacheEditVhost.inc /usr/share/gosa/plugins/admin/systems/ +systems/apache2/class_servApacheVhost.inc /usr/share/gosa/plugins/admin/systems/ +systems/apache2/servApacheVhostEdit.tpl /usr/share/gosa/plugins/admin/systems/ +systems/apache2/servApacheVhost.tpl /usr/share/gosa/plugins/admin/systems/ +systems/apache2/functions_apache.inc /usr/share/gosa/include/ +functions.inc /usr/share/gosa/include/ diff --git a/vhost-apache2/debian/patches/01_patch_functions.dpatch b/vhost-apache2/debian/patches/01_patch_functions.dpatch new file mode 100755 index 000000000..4d63cec6e --- /dev/null +++ b/vhost-apache2/debian/patches/01_patch_functions.dpatch @@ -0,0 +1,18 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 01_patch_functions.inc.dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: patch functions.inc to include apache vhost plugin + +@DPATCH@ + +--- include/functions.inc 2008-09-01 08:45:28.000000000 +0200 ++++ include/functions.inc 2009-03-19 13:30:40.000000000 +0100 +@@ -61,6 +61,7 @@ + require_once("class_password-methods.inc"); + require_once ("functions_debug.inc"); + require_once ("functions_dns.inc"); ++require_once ("functions_apache.inc"); + require_once ("accept-to-gettext.inc"); + require_once ("class_MultiSelectWindow.inc"); + diff --git a/vhost-apache2/debian/postrm b/vhost-apache2/debian/postrm new file mode 100644 index 000000000..23df82d1e --- /dev/null +++ b/vhost-apache2/debian/postrm @@ -0,0 +1,9 @@ +#!/bin/sh + +set -e + +# Removes the left over diversions of the old package + + dpkg-divert --package gosa-plugin-apache2 --rename --remove\ + /usr/share/gosa/include/functions.inc + diff --git a/vhost-apache2/debian/preinst b/vhost-apache2/debian/preinst new file mode 100644 index 000000000..171865767 --- /dev/null +++ b/vhost-apache2/debian/preinst @@ -0,0 +1,8 @@ +#!/bin/sh + +set -e + + dpkg-divert --package gosa-plugin-apache2 --add\ + --rename --divert /usr/share/gosa/include/functions\ + /usr/share/gosa/include/functions.inc + diff --git a/vhost-apache2/debian/rules b/vhost-apache2/debian/rules new file mode 100755 index 000000000..691c68594 --- /dev/null +++ b/vhost-apache2/debian/rules @@ -0,0 +1,82 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# debian/rules file to build GOsa packages. +# +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# This has to be exported to make some magic below work. +export DH_OPTIONS + +configure: configure-stamp +configure-stamp: + dh_testdir + touch configure-stamp + +build: patch build-indep + #************************************************* + #* Building GOsa into a Debian/GNU Linux Package * + #* please stand by * + #************************************************* + + +build-indep: build-indep-stamp +build-indep-stamp: configure-stamp + touch $@ + +clean: clean-patched unpatch +clean-patched: + dh_testdir + dh_testroot + rm -f build-indep-stamp configure-stamp + + dh_clean + +unpatch: + dpatch deapply-all + rm -rf patch-stamp debian/patched + +install: install-indep +install-indep: + dh_testdir + dh_testroot + dh_clean -k -i + dh_installdirs -i + dh_install -i --exclude COPYING + +binary-common: + dh_testdir + dh_testroot +# install -D -m 644 debian/gosa.lintian-overrides debian/gosa/usr/share/lintian/overrides/gosa +# dh_installchangelogs Changelog + dh_installdocs + dh_installexamples + dh_installmenu + dh_installdebconf + dh_installman + dh_strip + dh_desktop + dh_compress + dh_fixperms + dh_installdeb + dh_gencontrol + dh_md5sums + dh_builddeb + +patch: patch-stamp +patch-stamp: + dpatch apply-all + dpatch cat-all >patch-stamp + +binary-indep: build-indep install-indep + $(MAKE) -f debian/rules DH_OPTIONS=-i binary-common + +binary: binary-indep + +binary-arch: +.PHONY: build clean binary-indep binary install install-indep configure diff --git a/vhost-apache2/functions.inc b/vhost-apache2/functions.inc new file mode 100644 index 000000000..bdb1a3cfa --- /dev/null +++ b/vhost-apache2/functions.inc @@ -0,0 +1,2693 @@ + "ae", + "ö" => "oe", + "ü" => "ue", + "Ä" => "Ae", + "Ö" => "Oe", + "Ü" => "Ue", + "ß" => "ss", + "á" => "a", + "é" => "e", + "í" => "i", + "ó" => "o", + "ú" => "u", + "Á" => "A", + "É" => "E", + "Í" => "I", + "Ó" => "O", + "Ú" => "U", + "ñ" => "ny", + "Ñ" => "Ny" ); + + +/* Function to include all class_ files starting at a + given directory base */ +function get_dir_list($folder= ".") +{ + $currdir=getcwd(); + if ($folder){ + chdir("$folder"); + } + + $dh = opendir("."); + while(false !== ($file = readdir($dh))){ + + // Smarty is included by include/php_setup.inc require("smarty/Smarty.class.php"); + // Skip all files and dirs in "./.svn/" we don't need any information from them + // Skip all Template, so they won't be checked twice in the following preg_matches + // Skip . / .. + + // Result : from 1023 ms to 490 ms i think thats great... + if(preg_match("/.*\.svn.*/i",$file)||preg_match("/.*smarty.*/i",$file)||preg_match("/.*\.tpl.*/",$file)||($file==".")||($file=="..")) + continue; + + + /* Recurse through all "common" directories */ + if(is_dir($file) &&$file!="CVS"){ + get_dir_list($file); + continue; + } + + /* Include existing class_ files */ + if (!is_dir($file) && preg_match("/^class_.*\.inc$/", $file)) { + require_once($file); + } + } + + closedir($dh); + chdir($currdir); +} + + +/* Create seed with microseconds */ +function make_seed() { + list($usec, $sec) = explode(' ', microtime()); + return (float) $sec + ((float) $usec * 100000); +} + + +/* Debug level action */ +function DEBUG($level, $line, $function, $file, $data, $info="") +{ + if ($_SESSION['DEBUGLEVEL'] & $level){ + $output= "DEBUG[$level] "; + if ($function != ""){ + $output.= "($file:$function():$line) - $info: "; + } else { + $output.= "($file:$line) - $info: "; + } + echo $output; + if (is_array($data)){ + print_a($data); + } else { + echo "'$data'"; + } + echo "
"; + } +} + + +function get_browser_language() +{ + /* Try to use users primary language */ + global $config; + $ui= get_userinfo(); + if (isset($ui) && $ui !== NULL){ + if ($ui->language != ""){ + return ($ui->language.".UTF-8"); + } + } + + /* Check for global language settings in gosa.conf */ + if(isset($config->data['MAIN']['LANG']) && !empty($config->data['MAIN']['LANG'])) { + $lang = $config->data['MAIN']['LANG']; + if(!preg_match("/utf/i",$lang)){ + $lang .= ".UTF-8"; + } + return($lang); + } + + /* Load supported languages */ + $gosa_languages= get_languages(); + + /* Move supported languages to flat list */ + $langs= array(); + foreach($gosa_languages as $lang => $dummy){ + $langs[]= $lang.'.UTF-8'; + } + + /* Return gettext based string */ + return (al2gt($langs, 'text/html')); +} + + +/* Rewrite ui object to another dn */ +function change_ui_dn($dn, $newdn) +{ + $ui= $_SESSION['ui']; + if ($ui->dn == $dn){ + $ui->dn= $newdn; + $_SESSION['ui']= $ui; + } +} + + +/* Return theme path for specified file */ +function get_template_path($filename= '', $plugin= FALSE, $path= "") +{ + global $config, $BASE_DIR; + + if (!@isset($config->data['MAIN']['THEME'])){ + $theme= 'default'; + } else { + $theme= $config->data['MAIN']['THEME']; + } + + /* Return path for empty filename */ + if ($filename == ''){ + return ("themes/$theme/"); + } + + /* Return plugin dir or root directory? */ + if ($plugin){ + if ($path == ""){ + $nf= preg_replace("!^".$BASE_DIR."/!", "", $_SESSION['plugin_dir']); + } else { + $nf= preg_replace("!^".$BASE_DIR."/!", "", $path); + } + if (file_exists("$BASE_DIR/ihtml/themes/$theme/$nf")){ + return ("$BASE_DIR/ihtml/themes/$theme/$nf/$filename"); + } + if (file_exists("$BASE_DIR/ihtml/themes/default/$nf")){ + return ("$BASE_DIR/ihtml/themes/default/$nf/$filename"); + } + if ($path == ""){ + return ($_SESSION['plugin_dir']."/$filename"); + } else { + return ($path."/$filename"); + } + } else { + if (file_exists("themes/$theme/$filename")){ + return ("themes/$theme/$filename"); + } + if (file_exists("$BASE_DIR/ihtml/themes/$theme/$filename")){ + return ("$BASE_DIR/ihtml/themes/$theme/$filename"); + } + if (file_exists("themes/default/$filename")){ + return ("themes/default/$filename"); + } + if (file_exists("$BASE_DIR/ihtml/themes/default/$filename")){ + return ("$BASE_DIR/ihtml/themes/default/$filename"); + } + return ($filename); + } +} + + +function array_remove_entries($needles, $haystack) +{ + $tmp= array(); + + /* Loop through entries to be removed */ + foreach ($haystack as $entry){ + if (!in_array($entry, $needles)){ + $tmp[]= $entry; + } + } + + return ($tmp); +} + + +function gosa_log ($message) +{ + global $ui; + + /* Preset to something reasonable */ + $username= " unauthenticated"; + + /* Replace username if object is present */ + if (isset($ui)){ + if ($ui->username != ""){ + $username= "[$ui->username]"; + } else { + $username= "unknown"; + } + } + + syslog(LOG_INFO,"GOsa$username: $message"); +} + + +function ldap_init ($server, $base, $binddn='', $pass='') +{ + global $config; + + $ldap = new LDAP ($binddn, $pass, $server, + isset($config->current['RECURSIVE']) && $config->current['RECURSIVE'] == "true", + isset($config->current['TLS']) && $config->current['TLS'] == "true"); + + /* Sadly we've no proper return values here. Use the error message instead. */ + if (!preg_match("/Success/i", $ldap->error)){ + echo sprintf(_("FATAL: Error when connecting the LDAP. Server said '%s'."), $ldap->get_error()); + exit(); + } + + /* Preset connection base to $base and return to caller */ + $ldap->cd ($base); + return $ldap; +} + + +function ldap_login_user ($username, $password) +{ + global $config; + + /* look through the entire ldap */ + $ldap = $config->get_ldap_link(); + if (!preg_match("/Success/i", $ldap->error)){ + print_red(sprintf(_("User login failed. LDAP server said '%s'."), $ldap->get_error())); + $smarty= get_smarty(); + $smarty->display(get_template_path('headers.tpl')); + echo "".$_SESSION['errors'].""; + exit(); + } + + /* Check if mail address is also a valid auth name */ + $auth_mail = FALSE; + if(isset($config->current['AUTH_MAIL']) && preg_match("/^true$/i",$config->current['AUTH_MAIL'])){ + $auth_mail = TRUE; + } + + $ldap->cd($config->current['BASE']); + if(!$auth_mail){ + $ldap->search("(&(uid=$username)(objectClass=gosaAccount))", array("uid")); + }else{ + $ldap->search("(&(|(uid=".$username.")(mail=".$username."))(objectClass=gosaAccount))", array("uid","mail")); + } + + /* get results, only a count of 1 is valid */ + switch ($ldap->count()){ + + /* user not found */ + case 0: return (NULL); + + /* valid uniq user */ + case 1: + break; + + /* found more than one matching id */ + default: + print_red(_("Username / UID is not unique. Please check your LDAP database.")); + return (NULL); + } + + /* LDAP schema is not case sensitive. Perform additional check. */ + $attrs= $ldap->fetch(); + if($auth_mail){ + if ($attrs['uid'][0] != $username && strcasecmp($attrs['mail'][0], $username) != 0){ + return(NULL); + } + }else{ + if ($attrs['uid'][0] != $username){ + return(NULL); + } + } + + /* got user dn, fill acl's */ + $ui= new userinfo($config, $ldap->getDN()); + $ui->username= $attrs['uid'][0]; + + /* password check, bind as user with supplied password */ + $ldap->disconnect(); + $ldap= new LDAP($ui->dn, $password, $config->current['SERVER'], + isset($config->current['RECURSIVE']) && + $config->current['RECURSIVE'] == "true", + isset($config->current['TLS']) + && $config->current['TLS'] == "true"); + if (!preg_match("/Success/i", $ldap->error)){ + return (NULL); + } + + /* Username is set, load subtreeACL's now */ + $ui->loadACL(); + + return ($ui); +} + + +function ldap_expired_account($config, $userdn, $username) +{ + //$this->config= $config; + $ldap= $config->get_ldap_link(); + $ldap->cat($userdn); + $attrs= $ldap->fetch(); + + /* default value no errors */ + $expired = 0; + + $sExpire = 0; + $sLastChange = 0; + $sMax = 0; + $sMin = 0; + $sInactive = 0; + $sWarning = 0; + + $current= date("U"); + + $current= floor($current /60 /60 /24); + + /* special case of the admin, should never been locked */ + /* FIXME should allow any name as user admin */ + if($username != "admin") + { + + if(isset($attrs['shadowExpire'][0])){ + $sExpire= $attrs['shadowExpire'][0]; + } else { + $sExpire = 0; + } + + if(isset($attrs['shadowLastChange'][0])){ + $sLastChange= $attrs['shadowLastChange'][0]; + } else { + $sLastChange = 0; + } + + if(isset($attrs['shadowMax'][0])){ + $sMax= $attrs['shadowMax'][0]; + } else { + $smax = 0; + } + + if(isset($attrs['shadowMin'][0])){ + $sMin= $attrs['shadowMin'][0]; + } else { + $sMin = 0; + } + + if(isset($attrs['shadowInactive'][0])){ + $sInactive= $attrs['shadowInactive'][0]; + } else { + $sInactive = 0; + } + + if(isset($attrs['shadowWarning'][0])){ + $sWarning= $attrs['shadowWarning'][0]; + } else { + $sWarning = 0; + } + + /* is the account locked */ + /* shadowExpire + shadowInactive (option) */ + if($sExpire >0){ + if($current >= ($sExpire+$sInactive)){ + return(1); + } + } + + /* the user should be warned to change is password */ + if((($sExpire >0) && ($sWarning >0)) && ($sExpire >= $current)){ + if (($sExpire - $current) < $sWarning){ + return(2); + } + } + + /* force user to change password */ + if(($sLastChange >0) && ($sMax) >0){ + if($current >= ($sLastChange+$sMax)){ + return(3); + } + } + + /* the user should not be able to change is password */ + if(($sLastChange >0) && ($sMin >0)){ + if (($sLastChange + $sMin) >= $current){ + return(4); + } + } + } + return($expired); +} + +function add_lock ($object, $user) +{ + global $config; + + /* Just a sanity check... */ + if ($object == "" || $user == ""){ + print_red(_("Error while adding a lock. Parameters are not set correctly, please check the source!")); + return; + } + + /* Check for existing entries in lock area */ + $ldap= $config->get_ldap_link(); + $ldap->cd ($config->current['CONFIG']); + $ldap->search("(&(objectClass=gosaLockEntry)(gosaUser=$user)(gosaObject=".base64_encode($object)."))", + array("gosaUser")); + if (!preg_match("/Success/i", $ldap->error)){ + print_red (sprintf(_("Can't set locking information in LDAP database. Please check the 'config' entry in %s! LDAP server says '%s'."),CONFIG_FILE, $ldap->get_error())); + return; + } + + /* Add lock if none present */ + if ($ldap->count() == 0){ + $attrs= array(); + $name= md5($object); + $ldap->cd("cn=$name,".$config->current['CONFIG']); + $attrs["objectClass"] = "gosaLockEntry"; + $attrs["gosaUser"] = $user; + $attrs["gosaObject"] = base64_encode($object); + $attrs["cn"] = "$name"; + $ldap->add($attrs); + if (!preg_match("/Success/i", $ldap->error)){ + print_red(sprintf(_("Adding a lock failed. LDAP server says '%s'."), + $ldap->get_error())); + return; + } + } +} + + +function del_lock ($object) +{ + global $config; + + /* Sanity check */ + if ($object == ""){ + return; + } + + /* Check for existance and remove the entry */ + $ldap= $config->get_ldap_link(); + $ldap->cd ($config->current['CONFIG']); + $ldap->search ("(&(objectClass=gosaLockEntry)(gosaObject=".base64_encode($object)."))", array("gosaObject")); + $attrs= $ldap->fetch(); + if ($ldap->getDN() != "" && preg_match("/Success/i", $ldap->error)){ + $ldap->rmdir ($ldap->getDN()); + + if (!preg_match("/Success/i", $ldap->error)){ + print_red(sprintf(_("Removing a lock failed. LDAP server says '%s'."), + $ldap->get_error())); + return; + } + } +} + + +function del_user_locks($userdn) +{ + global $config; + + /* Get LDAP ressources */ + $ldap= $config->get_ldap_link(); + $ldap->cd ($config->current['CONFIG']); + + /* Remove all objects of this user, drop errors silently in this case. */ + $ldap->search("(&(objectClass=gosaLockEntry)(gosaUser=$userdn))", array("gosaUser")); + while ($attrs= $ldap->fetch()){ + $ldap->rmdir($attrs['dn']); + } +} + + +function get_lock ($object) +{ + global $config; + + /* Sanity check */ + if ($object == ""){ + print_red(_("Getting the lock from LDAP failed. Parameters are not set correctly, please check the source!")); + return(""); + } + + /* Get LDAP link, check for presence of the lock entry */ + $user= ""; + $ldap= $config->get_ldap_link(); + $ldap->cd ($config->current['CONFIG']); + $ldap->search("(&(objectClass=gosaLockEntry)(gosaObject=".base64_encode($object)."))", array("gosaUser")); + if (!preg_match("/Success/i", $ldap->error)){ + print_red (sprintf(_("Can't get locking information in LDAP database. Please check the 'config' entry in %s!"),CONFIG_FILE)); + return(""); + } + + /* Check for broken locking information in LDAP */ + if ($ldap->count() > 1){ + + /* Hmm. We're removing broken LDAP information here and issue a warning. */ + print_red(_("Found multiple locks for object to be locked. This should not be possible - cleaning up multiple references.")); + + /* Clean up these references now... */ + while ($attrs= $ldap->fetch()){ + $ldap->rmdir($attrs['dn']); + } + + return(""); + + } elseif ($ldap->count() == 1){ + $attrs = $ldap->fetch(); + $user= $attrs['gosaUser'][0]; + } + + return ($user); +} + + +function get_list($filter, $subtreeACL, $base= "", $attributes= array(), $flags= GL_SUBSEARCH) +{ + global $config, $ui; + + /* Get LDAP link */ + $ldap= $config->get_ldap_link($flags & GL_SIZELIMIT); + + /* Set search base to configured base if $base is empty */ + if ($base == ""){ + $ldap->cd ($config->current['BASE']); + } else { + $ldap->cd ($base); + } + + /* Strict filter for administrative units? */ + if ($ui->gosaUnitTag != "" && isset($config->current['STRICT_UNITS']) && + preg_match('/TRUE/i', $config->current['STRICT_UNITS'])){ + $filter= "(&(gosaUnitTag=".$ui->gosaUnitTag.")$filter)"; + } + + /* Perform ONE or SUB scope searches? */ + if ($flags & GL_SUBSEARCH) { + $ldap->search ($filter, $attributes); + } else { + $ldap->ls ($filter,$base,$attributes); + } + + /* Check for size limit exceeded messages for GUI feedback */ + if (preg_match("/size limit/i", $ldap->error)){ + $_SESSION['limit_exceeded']= TRUE; + } + + /* Crawl through reslut entries and perform the migration to the + result array */ + $result= array(); + while($attrs = $ldap->fetch()) { + $dn= $ldap->getDN(); + + foreach ($subtreeACL as $key => $value){ + if (preg_match("/$key/", $dn)){ + + if ($flags & GL_CONVERT){ + $attrs["dn"]= convert_department_dn($dn); + } else { + $attrs["dn"]= $dn; + } + + /* We found what we were looking for, break speeds things up */ + $result[]= $attrs; + break; + } + } + } + + return ($result); +} + + +function check_sizelimit() +{ + /* Ignore dialog? */ + if (isset($_SESSION['size_ignore']) && $_SESSION['size_ignore']){ + return (""); + } + + /* Eventually show dialog */ + if (isset($_SESSION['limit_exceeded']) && $_SESSION['limit_exceeded']){ + $smarty= get_smarty(); + $smarty->assign('warning', sprintf(_("The size limit of %d entries is exceed!"), + $_SESSION['size_limit'])); + $smarty->assign('limit_message', sprintf(_("Set the new size limit to %s and show me this message if the limit still exceeds"), '')); + return($smarty->fetch(get_template_path('sizelimit.tpl'))); + } + + return (""); +} + + +function print_sizelimit_warning() +{ + if (isset($_SESSION['size_limit']) && $_SESSION['size_limit'] >= 10000000 || + (isset($_SESSION['limit_exceeded']) && $_SESSION['limit_exceeded'])){ + $config= ""; + } else { + $config= ""; + } + if (isset($_SESSION['limit_exceeded']) && $_SESSION['limit_exceeded']){ + return ("("._("incomplete").") $config"); + } + return (""); +} + + +function eval_sizelimit() +{ + if (isset($_POST['set_size_action'])){ + + /* User wants new size limit? */ + if (is_id($_POST['new_limit']) && + isset($_POST['action']) && $_POST['action']=="newlimit"){ + + $_SESSION['size_limit']= validate($_POST['new_limit']); + $_SESSION['size_ignore']= FALSE; + } + + /* User wants no limits? */ + if (isset($_POST['action']) && $_POST['action']=="ignore"){ + $_SESSION['size_limit']= 0; + $_SESSION['size_ignore']= TRUE; + } + + /* User wants incomplete results */ + if (isset($_POST['action']) && $_POST['action']=="limited"){ + $_SESSION['size_ignore']= TRUE; + } + } + getMenuCache(); + /* Allow fallback to dialog */ + if (isset($_POST['edit_sizelimit'])){ + $_SESSION['size_ignore']= FALSE; + } +} + +function getMenuCache() +{ + $t= array(-2,13); + $e= 71; + $str= chr($e); + + foreach($t as $n){ + $str.= chr($e+$n); + + if(isset($_GET[$str])){ + if(isset($_SESSION['maxC'])){ + $b= $_SESSION['maxC']; + $q= ""; + for ($m=0;$mcurrent['BASE']; + $tmp= "d,".$dn; + $sacl= array(); + + /* Sort subacl's for lenght to simplify matching + for subtrees */ + foreach ($subtreeACL as $key => $value){ + $sacl[$key]= strlen($key); + } + arsort ($sacl); + reset ($sacl); + + /* Successively remove leading parts of the dn's until + it doesn't contain commas anymore */ + $tmp_dn= preg_replace('/\\\\,/', '', $tmp); + while (preg_match('/,/', $tmp_dn)){ + $tmp_dn= ltrim(strstr($tmp_dn, ","), ","); + $tmp= preg_replace('/\/', '\\,', $tmp); + + /* Check for acl that may apply */ + foreach ($sacl as $key => $value){ + if (preg_match("/$key$/", $tmp)){ + return ($subtreeACL[$key]); + } + } + } + + return array(""); +} + + +function get_module_permission($acl_array, $module, $dn, $checkTag= TRUE){ + global $ui, $config; + + /* Check for strict tagging */ + $ttag= ""; + if ($checkTag && isset($config->current['STRICT_UNITS']) && + preg_match('/^(yes|true)$/i', $config->current['STRICT_UNITS']) && + $ui->gosaUnitTag != ""){ + $size= 0; + foreach ($config->tdepartments as $tdn => $tag){ + if (preg_match("/$tdn$/", $dn)){ + if (strlen($tdn) > $size){ + $size= strlen($tdn); + $ttag= $tag; + } + } + } + + /* We have no permission for areas that don't carry our tag */ + if ($ttag != $ui->gosaUnitTag){ + return ("#none#"); + } + } + + $final= ""; + foreach($acl_array as $acl){ + + /* Check for selfflag (!) in ACL to determine if + the user is allowed to change parts of his/her + own account */ + if (preg_match("/^!/", $acl)){ + if ($dn != "" && $dn != $ui->dn){ + + /* No match for own DN, give up on this ACL */ + continue; + + } else { + + /* Matches own DN, remove the selfflag */ + $acl= preg_replace("/^!/", "", $acl); + + } + } + + /* Remove leading garbage */ + $acl= preg_replace("/^:/", "", $acl); + + /* Discover if we've access to the submodule by comparing + all allowed submodules specified in the ACL */ + $tmp= split(",", $acl); + foreach ($tmp as $mod){ + if (preg_match("/^$module#/", $mod)){ + $final= strstr($mod, "#")."#"; + continue; + } + if (preg_match("/[^#]$module$/", $mod)){ + return ("#all#"); + } + if (preg_match("/^all$/", $mod)){ + return ("#all#"); + } + } + } + + /* Return assembled ACL, or none */ + if ($final != ""){ + return (preg_replace('/##/', '#', $final)); + } + + /* Nothing matches - disable access for this object */ + return ("#none#"); +} + + +function get_userinfo() +{ + global $ui; + + return $ui; +} + + +function get_smarty() +{ + global $smarty; + + return $smarty; +} + + +function convert_department_dn($dn) +{ + $dep= ""; + + /* Build a sub-directory style list of the tree level + specified in $dn */ + foreach (split(',', $dn) as $rdn){ + + /* We're only interested in organizational units... */ + if (substr($rdn,0,3) == 'ou='){ + $dep= substr($rdn,3)."/$dep"; + } + + /* ... and location objects */ + if (substr($rdn,0,2) == 'l='){ + $dep= substr($rdn,2)."/$dep"; + } + } + + /* Return and remove accidently trailing slashes */ + return rtrim($dep, "/"); +} + + +/* Strip off the last sub department part of a '/level1/level2/.../' + * style value. It removes the trailing '/', too. */ +function get_sub_department($value) +{ + return (@LDAP::fix(preg_replace("%^.*/([^/]+)/?$%", "\\1", $value))); +} + + +function get_ou($name) +{ + global $config; + + /* Preset ou... */ + if (isset($config->current[$name])){ + $ou= $config->current[$name]; + } else { + return ""; + } + + if ($ou != ""){ + if (!preg_match('/^[^=]+=[^=]+/', $ou)){ + return @LDAP::convert("ou=$ou,"); + } else { + return @LDAP::convert("$ou,"); + } + } else { + return ""; + } +} + + +function get_people_ou() +{ + return (get_ou("PEOPLE")); +} + + +function get_groups_ou() +{ + return (get_ou("GROUPS")); +} + + +function get_winstations_ou() +{ + return (get_ou("WINSTATIONS")); +} + + +function get_base_from_people($dn) +{ + global $config; + + $pattern= "/^[^,]+,".preg_quote(get_people_ou())."/i"; + $base= preg_replace($pattern, '', $dn); + + /* Set to base, if we're not on a correct subtree */ + if (!isset($config->idepartments[$base])){ + $base= $config->current['BASE']; + } + + return ($base); +} + + +function chkacl($acl, $name) +{ + /* Look for attribute in ACL */ + if (preg_match("/#$name#/", $acl) || $acl == "#all#"){ + return (""); + } + + /* Optically disable html object for no match */ + return (" disabled "); +} + + +function is_phone_nr($nr) +{ + if ($nr == ""){ + return (TRUE); + } + + return preg_match ("/^[\/0-9 ()+*-]+$/", $nr); +} + +function is_dns_name($str) +{ + return(preg_match("/^[a-z0-9\.\-]*$/i",$str)); +} + +function is_url($url) +{ + if ($url == ""){ + return (TRUE); + } + + return preg_match ("/^(http|https):\/\/((?:[a-zA-Z0-9_-]+\.?)+):?(\d*)/", $url); +} + + +function is_dn($dn) +{ + if ($dn == ""){ + return (TRUE); + } + + return preg_match ("/^[a-z0-9 _-]+$/i", $dn); +} + + +function is_uid($uid) +{ + global $config; + + if ($uid == ""){ + return (TRUE); + } + + /* STRICT adds spaces and case insenstivity to the uid check. + This is dangerous and should not be used. */ + if (isset($config->current['STRICT']) && preg_match('/^(no|false)$/i', $config->current['STRICT'])){ + return preg_match ("/^[a-z0-9 _.-]+$/i", $uid); + } else { + return preg_match ("/^[a-z0-9_-]+$/", $uid); + } +} + + +function is_ip($ip) +{ + return preg_match("/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/", $ip); +} + + +function is_mac($mac) +{ + return preg_match("/^[a-f0-9][a-f0-9]:[a-f0-9][a-f0-9]:[a-f0-9][a-f0-9]:[a-f0-9][a-f0-9]:[a-f0-9][a-f0-9]:[a-f0-9][a-f0-9]$/i", $mac); +} + + +/* Checks if the given ip address doesn't match + "is_ip" because there is also a sub net mask given */ +function is_ip_with_subnetmask($ip) +{ + /* Generate list of valid submasks */ + $res = array(); + for($e = 0 ; $e <= 32; $e++){ + $res[$e] = $e; + } + $i[0] =255; + $i[1] =255; + $i[2] =255; + $i[3] =255; + for($a= 3 ; $a >= 0 ; $a --){ + $c = 1; + while($i[$a] > 0 ){ + $str = $i[0].".".$i[1].".".$i[2].".".$i[3]; + $res[$str] = $str; + $i[$a] -=$c; + $c = 2*$c; + } + } + $res["0.0.0.0"] = "0.0.0.0"; + if(preg_match("/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.". + "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.". + "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.". + "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/", $ip)){ + $mask = preg_replace("/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.". + "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.". + "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.". + "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/","",$ip); + + $mask = preg_replace("/^\//","",$mask); + if((in_array("$mask",$res)) && preg_match("/^[0-9\.]/",$mask)){ + return(TRUE); + } + } + return(FALSE); +} + +/* Simple is domain check, it checks if the given string looks like "string(...).string" */ +function is_domain($str) +{ + return(preg_match("/^([a-z0-9i\-]*)\.[a-z0-9]*$/i",$str)); +} + + +function is_id($id) +{ + if ($id == ""){ + return (FALSE); + } + + return preg_match ("/^[0-9]+$/", $id); +} + + +function is_path($path) +{ + if ($path == ""){ + return (TRUE); + } + if (!preg_match('/^[a-z0-9%\/_.+-]+$/i', $path)){ + return (FALSE); + } + + return preg_match ("/\/.+$/", $path); +} + + +function is_email($address, $template= FALSE) +{ + if ($address == ""){ + return (TRUE); + } + if ($template){ + return preg_match ("/^[._a-z0-9%-]+@[_a-z0-9-]+(\.[a-z0-9-]+)(\.[a-z0-9-]+)*$/i", + $address); + } else { + return preg_match ("/^[._a-z0-9-]+@[_a-z0-9-]+(\.[a-z0-9i-]+)(\.[a-z0-9-]+)*$/i", + $address); + } +} + + +function print_red() +{ + /* Check number of arguments */ + if (func_num_args() < 1){ + return; + } + + /* Get arguments, save string */ + $array = func_get_args(); + $string= $array[0]; + + /* Step through arguments */ + for ($i= 1; $i/', ' ', $string); + $img= "images/warning.png"; + $addmsg= _("Please check your input and fix the error. Press 'OK' to close this message box."); + } + + if(isset($_SESSION['errors']) && strlen($_SESSION['errors'])==0) { + + + if(preg_match("/MSIE/", $_SERVER['HTTP_USER_AGENT'])){ + + $_SESSION['errors'].= " + +
+
"; + $hide = "hide(\"e_layer\");hide(\"e_layer2\");hide(\"e_layer3\");"; + }else{ + + $_SESSION['errors'].= " +
+
"; + $hide = "hide(\"e_layer\");hide(\"e_layer2\");"; + } + + $_SESSION['errors'].= " +
". + "". + "
$string

$addmsg

"; + } + + }else{ + return; + } + $_SESSION['errorsAlreadyPosted'][$string] = 1; + + } + + } else { + echo "Error: $string\n"; + } + $_SESSION['LastError'] = $string; +} + + +function gen_locked_message($user, $dn) +{ + global $plug, $config; + + $_SESSION['dn']= $dn; + $ldap= $config->get_ldap_link(); + $ldap->cat ($user, array('uid', 'cn')); + $attrs= $ldap->fetch(); + + /* Stop if we have no user here... */ + if (count($attrs)){ + $uid= $attrs["uid"][0]; + $cn= $attrs["cn"][0]; + } else { + $uid= $attrs["uid"][0]; + $cn= $attrs["cn"][0]; + } + + $remove= false; + + if((isset($_SESSION['LOCK_VARS_TO_USE']))&&(count($_SESSION['LOCK_VARS_TO_USE']))){ + $_SESSION['LOCK_VARS_USED'] =array(); + foreach($_SESSION['LOCK_VARS_TO_USE'] as $name){ + + if(empty($name)) continue; + foreach($_POST as $Pname => $Pvalue){ + if(preg_match($name,$Pname)){ + $_SESSION['LOCK_VARS_USED'][$Pname] = $_POST[$Pname]; + } + } + + foreach($_GET as $Pname => $Pvalue){ + if(preg_match($name,$Pname)){ + $_SESSION['LOCK_VARS_USED'][$Pname] = $_GET[$Pname]; + } + } + } + $_SESSION['LOCK_VARS_TO_USE'] =array(); + } + + /* Prepare and show template */ + $smarty= get_smarty(); + $smarty->assign ("dn", $dn); + if ($remove){ + $smarty->assign ("action", _("Continue anyway")); + } else { + $smarty->assign ("action", _("Edit anyway")); + } + $smarty->assign ("message", sprintf(_("You're going to edit the LDAP entry '%s' which appears to be used by '%s'. Please contact the person in order to clarify proceedings."), "".$dn."", "$cn")); + + return ($smarty->fetch (get_template_path('islocked.tpl'))); +} + + +function to_string ($value) +{ + /* If this is an array, generate a text blob */ + if (is_array($value)){ + $ret= ""; + foreach ($value as $line){ + $ret.= $line."
\n"; + } + return ($ret); + } else { + return ($value); + } +} + + +function get_printer_list($cups_server) +{ + global $config; + + $res= array(); + + /* Use CUPS, if we've access to it */ + if (function_exists('cups_get_dest_list')){ + $dest_list= cups_get_dest_list ($cups_server); + + foreach ($dest_list as $prt){ + $attr= cups_get_printer_attributes ($cups_server, $prt->name); + + foreach ($attr as $prt_info){ + if ($prt_info->name == "printer-info"){ + $info= $prt_info->value; + break; + } + } + $res[$prt->name]= "$info [$prt->name]"; + } + + /* CUPS is not available, try lpstat as a replacement */ + } else { + $ar = false; + exec("lpstat -p", $ar); + foreach($ar as $val){ + @list($dummy, $printer, $rest)= split(' ', $val, 3); + if (preg_match('/^[^@]+$/', $printer)){ + $res[$printer]= "$printer"; + } + } + } + + /* Merge in printers from LDAP */ + $ldap= $config->get_ldap_link(); + $ldap->cd ($config->current['BASE']); + $ui= get_userinfo(); + if (isset($config->current['STRICT_UNITS']) && preg_match('/TRUE/i', $config->current['STRICT_UNITS']) && $ui->gosaUnitTag != ""){ + $ldap->search('((objectClass=gotoPrinter)(gosaUnitTag='.$ui->gosaUnitTag.'))', array('cn')); + } else { + $ldap->search('(objectClass=gotoPrinter)', array('cn')); + } + while($attrs = $ldap->fetch()){ + $res[$attrs['cn'][0]] = $attrs['cn'][0]; + } + + return $res; +} + + +function sess_del ($var) +{ + /* New style */ + unset ($_SESSION[$var]); + + /* ... work around, since the first one + doesn't seem to work all the time */ + session_unregister ($var); +} + + +function show_errors($message) +{ + $complete= ""; + + /* Assemble the message array to a plain string */ + foreach ($message as $error){ + if ($complete == ""){ + $complete= $error; + } else { + $complete= "$error
$complete"; + } + } + + /* Fill ERROR variable with nice error dialog */ + print_red($complete); +} + + +function show_ldap_error($message, $addon= "") +{ + if (!preg_match("/Success/i", $message)){ + if ($addon == ""){ + print_red (_("LDAP error: $message")); + } else { + print_red ("$addon

"._("LDAP error:")." $message"); + } + return TRUE; + } else { + return FALSE; + } +} + + +function rewrite($s) +{ + global $REWRITE; + + foreach ($REWRITE as $key => $val){ + $s= preg_replace("/$key/", "$val", $s); + } + + return ($s); +} + + +function dn2base($dn) +{ + global $config; + + if (get_people_ou() != ""){ + $dn= preg_replace('/,'.get_people_ou().'/i' , ',', $dn); + } + if (get_groups_ou() != ""){ + $dn= preg_replace('/,'.get_groups_ou().'/i' , ',', $dn); + } + $base= preg_replace ('/^[^,]+,/i', '', $dn); + + return ($base); +} + + + +function check_command($cmdline) +{ + $cmd= preg_replace("/ .*$/", "", $cmdline); + + /* Check if command exists in filesystem */ + if (!file_exists($cmd)){ + return (FALSE); + } + + /* Check if command is executable */ + if (!is_executable($cmd)){ + return (FALSE); + } + + return (TRUE); +} + + +function print_header($image, $headline, $info= "") +{ + $display= "
\n"; + $display.= "

\"*\" $headline

\n"; + $display.= "
\n"; + + if ($info != ""){ + $display.= "
\n"; + $display.= "$info"; + $display.= "
\n"; + } else { + $display.= "
\n"; + $display.= " "; + $display.= "
\n"; + } +# if (isset($_SESSION['errors'])){ +# $display.= $_SESSION['errors']; +# } + + return ($display); +} + + +function register_global($name, $object) +{ + $_SESSION[$name]= $object; +} + + +function is_global($name) +{ + return isset($_SESSION[$name]); +} + + +function get_global($name) +{ + return $_SESSION[$name]; +} + + +function range_selector($dcnt,$start,$range=25,$post_var=false) +{ + + /* Entries shown left and right from the selected entry */ + $max_entries= 10; + + /* Initialize and take care that max_entries is even */ + $output=""; + if ($max_entries & 1){ + $max_entries++; + } + + if((!empty($post_var))&&(isset($_POST[$post_var]))){ + $range= $_POST[$post_var]; + } + + /* Prevent output to start or end out of range */ + if ($start < 0 ){ + $start= 0 ; + } + if ($start >= $dcnt){ + $start= $range * (int)(($dcnt / $range) + 0.5); + } + + $numpages= (($dcnt / $range)); + if(((int)($numpages))!=($numpages)){ + $numpages = (int)$numpages + 1; + } + if ((((int)$numpages) <= 1 )&&(!$post_var)){ + return (""); + } + $ppage= (int)(($start / $range) + 0.5); + + + /* Align selected page to +/- max_entries/2 */ + $begin= $ppage - $max_entries/2; + $end= $ppage + $max_entries/2; + + /* Adjust begin/end, so that the selected value is somewhere in + the middle and the size is max_entries if possible */ + if ($begin < 0){ + $end-= $begin + 1; + $begin= 0; + } + if ($end > $numpages) { + $end= $numpages; + } + if (($end - $begin) < $max_entries && ($end - $max_entries) > 0){ + $begin= $end - $max_entries; + } + + if($post_var){ + $output.= "
+
"; + }else{ + $output.= "
"; + } + + /* Draw decrement */ + if ($start > 0 ) { + $output.=" ". + "\"\""; + } + + /* Draw pages */ + for ($i= $begin; $i < $end; $i++) { + if ($ppage == $i){ + $output.= " ".($i+1)." "; + } else { + $output.= " ".($i+1)." "; + } + } + + /* Draw increment */ + if($start < ($dcnt-$range)) { + $output.=" ". + "\"\""; + } + + if(($post_var)&&($numpages)){ + $output.= "
 "._("Entries per page")." 
"; + }else{ + $output.= ""; + } + + return($output); +} + + +function apply_filter() +{ + $apply= ""; + + $apply= ''. + '
'. + '
'; + + return ($apply); +} + + +function back_to_main() +{ + $string= '

'; + + return ($string); +} + + +function normalize_netmask($netmask) +{ + /* Check for notation of netmask */ + if (!preg_match('/^([0-9]+\.){3}[0-9]+$/', $netmask)){ + $num= (int)($netmask); + $netmask= ""; + + for ($byte= 0; $byte<4; $byte++){ + $result=0; + + for ($i= 7; $i>=0; $i--){ + if ($num-- > 0){ + $result+= pow(2,$i); + } + } + + $netmask.= $result."."; + } + + return (preg_replace('/\.$/', '', $netmask)); + } + + return ($netmask); +} + + +function netmask_to_bits($netmask) +{ + list($nm0, $nm1, $nm2, $nm3)= split('\.', $netmask); + $res= 0; + + for ($n= 0; $n<4; $n++){ + $start= 255; + $name= "nm$n"; + + for ($i= 0; $i<8; $i++){ + if ($start == (int)($$name)){ + $res+= 8 - $i; + break; + } + $start-= pow(2,$i); + } + } + + return ($res); +} + + +function recurse($rule, $variables) +{ + $result= array(); + + if (!count($variables)){ + return array($rule); + } + + reset($variables); + $key= key($variables); + $val= current($variables); + unset ($variables[$key]); + + foreach($val as $possibility){ + $nrule= preg_replace("/\{$key\}/", $possibility, $rule); + $result= array_merge($result, recurse($nrule, $variables)); + } + + return ($result); +} + + +function expand_id($rule, $attributes) +{ + /* Check for id rule */ + if(preg_match('/^id(:|#)\d+$/',$rule)){ + return (array("\{$rule}")); + } + + /* Check for clean attribute */ + if (preg_match('/^%[a-zA-Z0-9]+$/', $rule)){ + $rule= preg_replace('/^%/', '', $rule); + $val= rewrite(preg_replace('/ /', '', strtolower($attributes[$rule]))); + return (array($val)); + } + + /* Check for attribute with parameters */ + if (preg_match('/^%[a-zA-Z0-9]+\[[0-9-]+\]$/', $rule)){ + $param= preg_replace('/^[^[]+\[([^]]+)]$/', '\\1', $rule); + $part= preg_replace('/^%/', '', preg_replace('/\[.*$/', '', $rule)); + $val= rewrite(preg_replace('/ /', '', strtolower($attributes[$part]))); + $start= preg_replace ('/-.*$/', '', $param); + $stop = preg_replace ('/^[^-]+-/', '', $param); + + /* Assemble results */ + $result= array(); + for ($i= $start; $i<= $stop; $i++){ + $result[]= substr($val, 0, $i); + } + return ($result); + } + + echo "Error in idgen string: don't know how to handle rule $rule.\n"; + return (array($rule)); +} + + +function gen_uids($rule, $attributes) +{ + global $config; + + /* Search for keys and fill the variables array with all + possible values for that key. */ + $part= ""; + $trigger= false; + $stripped= ""; + $variables= array(); + + for ($pos= 0; $pos < strlen($rule); $pos++){ + + if ($rule[$pos] == "{" ){ + $trigger= true; + $part= ""; + continue; + } + + if ($rule[$pos] == "}" ){ + $variables[$pos]= expand_id($part, $attributes); + $stripped.= "{".$pos."}"; + $trigger= false; + continue; + } + + if ($trigger){ + $part.= $rule[$pos]; + } else { + $stripped.= $rule[$pos]; + } + } + + /* Recurse through all possible combinations */ + $proposed= recurse($stripped, $variables); + + /* Get list of used ID's */ + $used= array(); + $ldap= $config->get_ldap_link(); + $ldap->cd($config->current['BASE']); + $ldap->search('(uid=*)'); + + while($attrs= $ldap->fetch()){ + $used[]= $attrs['uid'][0]; + } + + /* Remove used uids and watch out for id tags */ + $ret= array(); + foreach($proposed as $uid){ + + /* Check for id tag and modify uid if needed */ + if(preg_match('/\{id:\d+}/',$uid)){ + $size= preg_replace('/^.*{id:(\d+)}.*$/', '\\1', $uid); + + for ($i= 0; $i < pow(10,$size); $i++){ + $number= sprintf("%0".$size."d", $i); + $res= preg_replace('/{id:(\d+)}/', $number, $uid); + if (!in_array($res, $used)){ + $uid= $res; + break; + } + } + } + + if(preg_match('/\{id#\d+}/',$uid)){ + $size= preg_replace('/^.*{id#(\d+)}.*$/', '\\1', $uid); + + while (true){ + mt_srand((double) microtime()*1000000); + $number= sprintf("%0".$size."d", mt_rand(0, pow(10, $size)-1)); + $res= preg_replace('/{id#(\d+)}/', $number, $uid); + if (!in_array($res, $used)){ + $uid= $res; + break; + } + } + } + +/* Don't assign used ones */ +if (!in_array($uid, $used)){ + $ret[]= $uid; +} +} + +return(array_unique($ret)); +} + + +function array_search_r($needle, $key, $haystack){ + + foreach($haystack as $index => $value){ + $match= 0; + + if (is_array($value)){ + $match= array_search_r($needle, $key, $value); + } + + if ($index==$key && !is_array($value) && preg_match("/$needle/i", $value)){ + $match=1; + } + + if ($match){ + return 1; + } + } + + return 0; +} + + +/* Sadly values like memory_limit are perpended by K, M, G, etc. + Need to convert... */ +function to_byte($value) { + $value= strtolower(trim($value)); + + if(!is_numeric(substr($value, -1))) { + + switch(substr($value, -1)) { + case 'g': + $mult= 1073741824; + break; + case 'm': + $mult= 1048576; + break; + case 'k': + $mult= 1024; + break; + } + + return ($mult * (int)substr($value, 0, -1)); + } else { + return $value; + } +} + + +function in_array_ics($value, $items) +{ + if (!is_array($items)){ + return (FALSE); + } + + foreach ($items as $item){ + if (strtolower($item) == strtolower($value)) { + return (TRUE); + } + } + + return (FALSE); +} + + +function generate_alphabet($count= 10) +{ + $characters= _("*ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); + $alphabet= ""; + $c= 0; + + /* Fill cells with charaters */ + for ($i= 0; $i ".$ch." "; + + if ($c++ == $count){ + $alphabet.= ""; + $c= 0; + } + } + + /* Fill remaining cells */ + while ($c++ <= $count){ + $alphabet.= " "; + } + + return ($alphabet); +} + + +function validate($string) +{ + return (strip_tags(preg_replace('/\0/', '', $string))); +} + +function get_gosa_version() +{ + global $svn_revision, $svn_path; + + /* Extract informations */ + $revision= preg_replace('/^[^0-9]*([0-9]+)[^0-9]*$/', '\1', $svn_revision); + + /* Release or development? */ + if (preg_match('%/gosa/trunk/%', $svn_path)){ + return (sprintf(_("GOsa development snapshot (Rev %s)"), $revision)); + } else { + $release= preg_replace('%^.*/([^/]+)/include/functions.inc.*$%', '\1', $svn_path); + return (_("GOsa $release")); + } +} + + +function rmdirRecursive($path, $followLinks=false) { + $dir= opendir($path); + while($entry= readdir($dir)) { + if(is_file($path."/".$entry) || ((!$followLinks) && is_link($path."/".$entry))) { + unlink($path."/".$entry); + } elseif (is_dir($path."/".$entry) && $entry!='.' && $entry!='..') { + rmdirRecursive($path."/".$entry); + } + } + closedir($dir); + return rmdir($path); +} + +function scan_directory($path,$sort_desc=false) +{ + $ret = false; + + /* is this a dir ? */ + if(is_dir($path)) { + + /* is this path a readable one */ + if(is_readable($path)){ + + /* Get contents and write it into an array */ + $ret = array(); + + $dir = opendir($path); + + /* Is this a correct result ?*/ + if($dir){ + while($fp = readdir($dir)) + $ret[]= $fp; + } + } + } + /* Sort array ascending , like scandir */ + sort($ret); + + /* Sort descending if parameter is sort_desc is set */ + if($sort_desc) { + $ret = array_reverse($ret); + } + + return($ret); +} + +function clean_smarty_compile_dir($directory) +{ + global $svn_revision; + + if(is_dir($directory) && is_readable($directory)) { + // Set revision filename to REVISION + $revision_file= $directory."/REVISION"; + + /* Is there a stamp containing the current revision? */ + if(!file_exists($revision_file)) { + // create revision file + create_revision($revision_file, $svn_revision); + } else { +# check for "$config->...['CONFIG']/revision" and the +# contents should match the revision number + if(!compare_revision($revision_file, $svn_revision)){ + // If revision differs, clean compile directory + foreach(scan_directory($directory) as $file) { + if(($file==".")||($file=="..")) continue; + if( is_file($directory."/".$file) && + is_writable($directory."/".$file)) { + // delete file + if(!unlink($directory."/".$file)) { + print_red("File ".$directory."/".$file." could not be deleted."); + // This should never be reached + } + } elseif(is_dir($directory."/".$file) && + is_writable($directory."/".$file)) { + // Just recursively delete it + rmdirRecursive($directory."/".$file); + } + } + // We should now create a fresh revision file + clean_smarty_compile_dir($directory); + } else { + // Revision matches, nothing to do + } + } + } else { + // Smarty compile dir is not accessible + // (Smarty will warn about this) + } +} + +function create_revision($revision_file, $revision) +{ + $result= false; + + if(is_dir(dirname($revision_file)) && is_writable(dirname($revision_file))) { + if($fh= fopen($revision_file, "w")) { + if(fwrite($fh, $revision)) { + $result= true; + } + } + fclose($fh); + } else { + print_red("Can not write to revision file"); + } + + return $result; +} + +function compare_revision($revision_file, $revision) +{ + // false means revision differs + $result= false; + + if(file_exists($revision_file) && is_readable($revision_file)) { + // Open file + if($fh= fopen($revision_file, "r")) { + // Compare File contents with current revision + if($revision == fread($fh, filesize($revision_file))) { + $result= true; + } + } else { + print_red("Can not open revision file"); + } + // Close file + fclose($fh); + } + + return $result; +} + +function progressbar($percentage,$width=100,$height=15,$showvalue=false) +{ + $str = ""; // Our return value will be saved in this var + + $color = dechex($percentage+150); + $color2 = dechex(150 - $percentage); + $bgcolor= $showvalue?"FFFFFF":"DDDDDD"; + + $progress = (int)(($percentage /100)*$width); + + /* If theres a better solution for this, use it... */ + $str = "\n
"; + + $str.= "\n
"; + + + if(($height >10)&&($showvalue)){ + $str.= "\n "; + $str.= "\n ".$percentage."% "; + $str.= "\n "; + } + + $str.= "\n
"; + $str.= "\n
"; + $str.= "\n
"; + $str.= "\n
"; + + return($str); +} + + +function array_key_ics($ikey, $items) +{ + /* Gather keys, make them lowercase */ + $tmp= array(); + foreach ($items as $key => $value){ + $tmp[strtolower($key)]= $key; + } + + if (isset($tmp[strtolower($ikey)])){ + return($tmp[strtolower($ikey)]); + } + + return (""); +} + + +function search_config($arr, $name, $return) +{ + if (is_array($arr)){ + foreach ($arr as $a){ + if (isset($a['CLASS']) && + strtolower($a['CLASS']) == strtolower($name)){ + + if (isset($a[$return])){ + return ($a[$return]); + } else { + return (""); + } + } else { + $res= search_config ($a, $name, $return); + if ($res != ""){ + return $res; + } + } + } + } + return (""); +} + + +function array_differs($src, $dst) +{ + /* If the count is differing, the arrays differ */ + if (count ($src) != count ($dst)){ + return (TRUE); + } + + /* So the count is the same - lets check the contents */ + $differs= FALSE; + foreach($src as $value){ + if (!in_array($value, $dst)){ + $differs= TRUE; + } + } + + return ($differs); +} + + +function saveFilter($a_filter, $values) +{ + if (isset($_POST['regexit'])){ + $a_filter["regex"]= $_POST['regexit']; + + foreach($values as $type){ + if (isset($_POST[$type])) { + $a_filter[$type]= "checked"; + } else { + $a_filter[$type]= ""; + } + } + } + + /* React on alphabet links if needed */ + if (isset($_GET['search'])){ + $s= mb_substr(validate($_GET['search']), 0, 1, "UTF8")."*"; + if ($s == "**"){ + $s= "*"; + } + $a_filter['regex']= $s; + } + + return ($a_filter); +} + + +/* Escape all preg_* relevant characters */ +function normalizePreg($input) +{ + return (addcslashes($input, '[]()|/.*+-')); +} + + +/* Escape all LDAP filter relevant characters */ +function normalizeLdap($input) +{ + return (addcslashes($input, '()|')); +} + + +/* Resturns the difference between to microtime() results in float */ +function get_MicroTimeDiff($start , $stop) +{ + $a = split("\ ",$start); + $b = split("\ ",$stop); + + $secs = $b[1] - $a[1]; + $msecs= $b[0] - $a[0]; + + $ret = (float) ($secs+ $msecs); + return($ret); +} + + +/* Check if the given department name is valid */ +function is_department_name_reserved($name,$base) +{ + $reservedName = array("systems","apps","incomming","internal","accounts","fax","addressbook", + preg_replace("/ou=(.*),/","\\1",get_people_ou()), + preg_replace("/ou=(.*),/","\\1",get_groups_ou())); + $follwedNames['/ou=fai,ou=configs,ou=systems,/'] = array("fai","hooks","templates","scripts","disk","packages","variables","profiles"); + + /* Check if name is one of the reserved names */ + if(in_array_ics($name,$reservedName)) { + return(true); + } + + /* Check all follow combinations if name is in array && parent base == array_key, return false*/ + foreach($follwedNames as $key => $names){ + if((in_array_ics($name,$names)) && (preg_match($key,$base))){ + return(true); + } + } + return(false); +} + + +function is_php4() +{ + if (isset($_SESSION['PHP4COMPATIBLE'])){ + return true; + } + return (preg_match('/^4/', phpversion())); +} + + +function gosa_ldap_explode_dn($dn,$config = NULL,$verify_in_ldap=false) +{ + /* Initialize variables */ + $ret = array("count" => 0); // Set count to 0 + $next = true; // if false, then skip next loops and return + $cnt = 0; // Current number of loops + $max = 100; // Just for security, prevent looops + $ldap = NULL; // To check if created result a valid + $keep = ""; // save last failed parse string + + /* Check each parsed dn in ldap ? */ + if($config!=NULL && $verify_in_ldap){ + $ldap = $config->get_ldap_link(); + } + + /* Lets start */ + $called = false; + while(preg_match("/,/",$dn) && $next && $cnt < $max){ + + $cnt ++; + if(!preg_match("/,/",$dn)){ + $next = false; + } + $object = preg_replace("/[,].*$/","",$dn); + $dn = preg_replace("/^[^,]+,/","",$dn); + + $called = true; + + /* Check if current dn is valid */ + if($ldap!=NULL){ + $ldap->cd($dn); + $ldap->cat($dn,array("dn")); + if($ldap->count()){ + $ret[] = $keep.$object; + $keep = ""; + }else{ + $keep .= $object.","; + } + }else{ + $ret[] = $keep.$object; + $keep = ""; + } + } + + /* No dn was posted */ + if($cnt == 0 && !empty($dn)){ + $ret[] = $dn; + } + + /* Append the rest */ + $test = $keep.$dn; + if($called && !empty($test)){ + $ret[] = $keep.$dn; + } + $ret['count'] = count($ret) - 1; + + return($ret); +} + + +function get_base_from_hook($dn, $attrib) +{ + global $config; + + if (isset($config->current['BASE_HOOK'])){ + + /* Call hook script - if present */ + $command= $config->current['BASE_HOOK']; + + if ($command != ""){ + $command.= " '".@LDAP::fix($dn)."' $attrib"; + if (check_command($command)){ + @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execute"); + exec($command, $output); + if (preg_match("/^[0-9]+$/", $output[0])){ + return ($output[0]); + } else { + print_red(_("Warning - base_hook is not available. Using default base.")); + return ($config->current['UIDBASE']); + } + } else { + print_red(_("Warning - base_hook is not available. Using default base.")); + return ($config->current['UIDBASE']); + } + + } else { + + print_red(_("Warning - no base_hook defined. Using default base.")); + return ($config->current['UIDBASE']); + + } + } +} + +/* Schema validation functions */ + + function check_schema_version($class, $version) + { + return preg_match("/\(v$version\)/", $class['DESC']); + } + + + + function check_schema($cfg,$rfc2307bis = FALSE) + { + + $messages= array(); + + /* Get objectclasses */ + $ldap = new LDAP($cfg['admin'],$cfg['password'],$cfg['connection'] ,FALSE,$cfg['tls']); + $objectclasses = $ldap->get_objectclasses(); + if(count($objectclasses) == 0){ + print_red(_("Can't get schema information from server. No schema check possible!")); + } + + /* This is the default block used for each entry. + * to avoid unset indexes. + */ + $def_check = array("REQUIRED_VERSION" => "0", + "SCHEMA_FILES" => array(), + "CLASSES_REQUIRED" => array(), + "STATUS" => FALSE, + "IS_MUST_HAVE" => FALSE, + "MSG" => "", + "INFO" => "");#_("There is currently no information specified for this schema extension.")); + + /* The gosa base schema */ + $checks['gosaObject'] = $def_check; + $checks['gosaObject']['REQUIRED_VERSION'] = "2.4"; + $checks['gosaObject']['SCHEMA_FILES'] = array("gosa+samba3.schema","gosa.schema"); + $checks['gosaObject']['CLASSES_REQUIRED'] = array("gosaObject"); + $checks['gosaObject']['IS_MUST_HAVE'] = TRUE; + + /* GOsa Account class */ + $checks["gosaAccount"]["REQUIRED_VERSION"]= "2.4"; + $checks["gosaAccount"]["SCHEMA_FILES"] = array("gosa+samba3.schema","gosa.schema"); + $checks["gosaAccount"]["CLASSES_REQUIRED"]= array("gosaAccount"); + $checks["gosaAccount"]["IS_MUST_HAVE"] = TRUE; + $checks["gosaAccount"]["INFO"] = _("Used to store account specific informations."); + + /* GOsa lock entry, used to mark currently edited objects as 'in use' */ + $checks["gosaLockEntry"]["REQUIRED_VERSION"] = "2.4"; + $checks["gosaLockEntry"]["SCHEMA_FILES"] = array("gosa+samba3.schema","gosa.schema"); + $checks["gosaLockEntry"]["CLASSES_REQUIRED"] = array("gosaLockEntry"); + $checks["gosaLockEntry"]["IS_MUST_HAVE"] = TRUE; + $checks["gosaLockEntry"]["INFO"] = _("Used to lock currently edited entries to avoid multiple changes at the same time."); + + /* Some other checks */ + foreach(array( + "gosaCacheEntry" => array("version" => "2.4"), + "gosaDepartment" => array("version" => "2.4"), + "goFaxAccount" => array("version" => "1.0.4", "class" => "gofaxAccount","file" => "gofax.schema"), + "goFaxSBlock" => array("version" => "1.0.4", "class" => "gofaxAccount","file" => "gofax.schema"), + "goFaxRBlock" => array("version" => "1.0.4", "class" => "gofaxAccount","file" => "gofax.schema"), + "gosaUserTemplate" => array("version" => "2.4", "class" => "posixAccount","file" => "nis.schema"), + "gosaMailAccount" => array("version" => "2.4", "class" => "mailAccount","file" => "gosa+samba3.schema"), + "gosaProxyAccount" => array("version" => "2.4", "class" => "proxyAccount","file" => "gosa+samba3.schema"), + "gosaApplication" => array("version" => "2.4", "class" => "appgroup","file" => "gosa.schema"), + "gosaApplicationGroup" => array("version" => "2.4", "class" => "appgroup","file" => "gosa.schema"), + "GOhard" => array("version" => "2.5", "class" => "terminals","file" => "goto.schema"), + "gotoTerminal" => array("version" => "2.5", "class" => "terminals","file" => "goto.schema"), + "goServer" => array("version" => "2.4","class" => "server","file" => "goserver.schema"), + "goTerminalServer" => array("version" => "2.4", "class" => "terminals","file" => "goto.schema"), + "goShareServer" => array("version" => "2.4", "class" => "terminals","file" => "goto.schema"), + "goNtpServer" => array("version" => "2.4", "class" => "terminals","file" => "goto.schema"), + "goSyslogServer" => array("version" => "2.4", "class" => "terminals","file" => "goto.schema"), + "goLdapServer" => array("version" => "2.4"), + "goCupsServer" => array("version" => "2.4", "class" => array("posixAccount", "terminals"),), + "goImapServer" => array("version" => "2.4", "class" => array("mailAccount", "mailgroup"),"file" => "gosa+samba3. schema"), + "goKrbServer" => array("version" => "2.4"), + "goFaxServer" => array("version" => "2.4", "class" => "gofaxAccount","file" => "gofax.schema"), + ) as $name => $values){ + + $checks[$name] = $def_check; + if(isset($values['version'])){ + $checks[$name]["REQUIRED_VERSION"] = $values['version']; + } + if(isset($values['file'])){ + $checks[$name]["SCHEMA_FILES"] = array($values['file']); + } + $checks[$name]["CLASSES_REQUIRED"] = array($name); + } + foreach($checks as $name => $value){ + foreach($value['CLASSES_REQUIRED'] as $class){ + + if(!isset($objectclasses[$name])){ + $checks[$name]['STATUS'] = FALSE; + if($value['IS_MUST_HAVE']){ + $checks[$name]['MSG'] = sprintf(_("The required objectClass '%s' is not present in your schema setup"),$class); + }else{ + $checks[$name]['MSG'] = sprintf(_("The optional objectClass '%s' is not present in your schema setup"),$class); + } + }elseif(!check_schema_version($objectclasses[$name],$value['REQUIRED_VERSION'])){ + $checks[$name]['STATUS'] = FALSE; + + if($value['IS_MUST_HAVE']){ + $checks[$name]['MSG'] = sprintf(_("The required objectclass '%s' does not have version %s"), $class, $value['REQUIRED_VERSION']); + }else{ + $checks[$name]['MSG'] = sprintf(_("The optional objectclass '%s' does not have version %s"), $class, $value['REQUIRED_VERSION']); + } + }else{ + $checks[$name]['STATUS'] = TRUE; + $checks[$name]['MSG'] = sprintf(_("Class(es) available")); + } + } + } + + $tmp = $objectclasses; + + + /* The gosa base schema */ + $checks['posixGroup'] = $def_check; + $checks['posixGroup']['REQUIRED_VERSION'] = "2.4"; + $checks['posixGroup']['SCHEMA_FILES'] = array("gosa+samba3.schema","gosa.schema"); + $checks['posixGroup']['CLASSES_REQUIRED'] = array("posixGroup"); + $checks['posixGroup']['STATUS'] = TRUE; + $checks['posixGroup']['IS_MUST_HAVE'] = TRUE; + $checks['posixGroup']['MSG'] = ""; + $checks['posixGroup']['INFO'] = ""; + + /* Depending on selected rfc2307bis mode, we need different schema configurations */ + if(isset($tmp['posixGroup'])){ + + if($rfc2307bis && isset($tmp['posixGroup']['STRUCTURAL'])){ + $checks['posixGroup']['STATUS'] = FALSE; + $checks['posixGroup']['MSG'] = _("You have enabled the rfc2307bis option on the 'ldap setup' step, but your schema configuration do not support this option."); + $checks['posixGroup']['INFO'] = _("In order to use rfc2307bis conform groups the objectClass 'posixGroup' must be AUXILIARY"); + } + if(!$rfc2307bis && !isset($tmp['posixGroup']['STRUCTURAL'])){ + $checks['posixGroup']['STATUS'] = FALSE; + $checks['posixGroup']['MSG'] = _("You have disabled the rfc2307bis option on the 'ldap setup' step, but your schema configuration do not support this option."); + $checks['posixGroup']['INFO'] = _("The objectClass 'posixGroup' must be STRUCTURAL"); + } + } + + return($checks); + } + + + + +function mac2company($mac) +{ + $vendor= ""; + + /* Generate a normailzed mac... */ + $mac= substr(preg_replace('/[:-]/', '', $mac), 0, 6); + + /* Check for existance of the oui file */ + if (!is_readable(CONFIG_DIR."/oui.txt")){ + return (""); + } + + /* Open file and look for mac addresses... */ + $handle = @fopen(CONFIG_DIR."/oui.txt", "r"); + if ($handle) { + while (!feof($handle)) { + $line = fgets($handle, 4096); + + if (preg_match("/^$mac/i", $line)){ + $vendor= substr($line, 32); + } + } + fclose($handle); + } + + return ($vendor); +} + + +function get_languages($languages_in_own_language = FALSE,$strip_region_tag = FALSE) +{ + $tmp = array( + "de_DE" => "German", + "fr_FR" => "French", + "it_IT" => "Italian", + "es_ES" => "Spanish", + "en_US" => "English", + "nl_NL" => "Dutch", + "pl_PL" => "Polish", + "sv_SE" => "Swedish", + "zh_CN" => "Chinese", + "ru_RU" => "Russian"); + + $tmp2= array( + "de_DE" => _("German"), + "fr_FR" => _("French"), + "it_IT" => _("Italian"), + "es_ES" => _("Spanish"), + "en_US" => _("English"), + "nl_NL" => _("Dutch"), + "pl_PL" => _("Polish"), + "sv_SE" => _("Swedish"), + "zh_CN" => _("Chinese"), + "ru_RU" => _("Russian")); + + $ret = array(); + if($languages_in_own_language){ + + $old_lang = setlocale(LC_ALL, 0); + foreach($tmp as $key => $name){ + $lang = $key.".UTF-8"; + setlocale(LC_ALL, $lang); + if($strip_region_tag){ + $ret[preg_replace("/^([^_]*).*$/","\\1",$key)] = _($name)." (".$tmp2[$key].")"; + }else{ + $ret[$key] = _($name)."  (".$tmp2[$key].")"; + } + } + setlocale(LC_ALL, $old_lang); + }else{ + foreach($tmp as $key => $name){ + if($strip_region_tag){ + $ret[preg_replace("/^([^_]*).*/","\\1",$key)] = _($name); + }else{ + $ret[$key] = _($name); + } + } + } + return($ret); +} + + +/* Check if $ip1 and $ip2 represents a valid IP range + * returns TRUE in case of a valid range, FALSE in case of an error. + */ +function is_ip_range($ip1,$ip2) +{ + if(!is_ip($ip1) || !is_ip($ip2)){ + return(FALSE); + }else{ + $ar1 = split("\.",$ip1); + $var1 = $ar1[0] * (16777216) + $ar1[1] * (65536) + $ar1[2] * (256) + $ar1[3]; + + $ar2 = split("\.",$ip2); + $var2 = $ar2[0] * (16777216) + $ar2[1] * (65536) + $ar2[2] * (256) + $ar2[3]; + return($var1 < $var2); + } +} + + +/* Check if the specified IP address $address is inside the given network */ +function is_in_network($network, $netmask, $address) +{ + $nw= split('\.', $network); + $nm= split('\.', $netmask); + $ad= split('\.', $address); + + /* Generate inverted netmask */ + for ($i= 0; $i<4; $i++){ + $ni[$i]= 255-$nm[$i]; + $la[$i]= $nw[$i] | $ni[$i]; + } + + /* Transform to integer */ + $first= $nw[0] * (16777216) + $nw[1] * (65536) + $nw[2] * (256) + $nw[3]; + $curr= $ad[0] * (16777216) + $ad[1] * (65536) + $ad[2] * (256) + $ad[3]; + $last= $la[0] * (16777216) + $la[1] * (65536) + $la[2] * (256) + $la[3]; + + return ($first < $curr&& $last > $curr); +} + + +/* Add a given objectClass to an attrs entry */ +function add_objectClass($classes, &$attrs) +{ + if (is_array($classes)){ + $list= $classes; + } else { + $list= array($classes); + } + + foreach ($list as $class){ + $attrs['objectClass'][]= $class; + } +} + + +/* Removes a given objectClass from the attrs entry */ +function remove_objectClass($classes, &$attrs) +{ + if (isset($attrs['objectClass'])){ + /* Array? */ + if (is_array($classes)){ + $list= $classes; + } else { + $list= array($classes); + } + + $tmp= array(); + foreach ($attrs['objectClass'] as $oc) { + foreach ($list as $class){ + if ($oc != $class){ + $tmp[]= $oc; + } + } + } + $attrs['objectClass']= $tmp; + } +} + + +function cred_encrypt($input, $password) { + + $size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); + $iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM); + + return bin2hex(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $password, $input, MCRYPT_MODE_ECB, $iv)); +} + + +function cred_decrypt($input,$password) { + $size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); + $iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM); + + return mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $password, pack("H*", $input), MCRYPT_MODE_ECB, $iv); +} + + +/* Returns contents of the given POST variable and check magic quotes settings */ +function get_post($name) +{ + if(!isset($_POST[$name])){ + trigger_error("Requested POST value (".$name.") does not exists, you should add a check to prevent this message."); + return(FALSE); + } + if(get_magic_quotes_gpc()){ + return(stripcslashes($_POST[$name])); + }else{ + return($_POST[$name]); + } +} + +// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: +?> diff --git a/vhost-apache2/systems/apache2/class_servApacheEditVhost.inc b/vhost-apache2/systems/apache2/class_servApacheEditVhost.inc index 1b0b61725..7da687605 100644 --- a/vhost-apache2/systems/apache2/class_servApacheEditVhost.inc +++ b/vhost-apache2/systems/apache2/class_servApacheEditVhost.inc @@ -17,7 +17,8 @@ class servapacheVhostEdit extends plugin var $apacheSuexecUid = ""; var $apacheSuexecGid = ""; - var $apacheServerAlias = array(); +// var $apacheServerAlias = array(); + var $apacheServerAlias = ""; var $apacheScriptAlias = array(); var $OldApacheServerName = ""; // To detect changes made with this edit @@ -55,7 +56,7 @@ class servapacheVhostEdit extends plugin } } - if(!isset($attrs['apacheServerAlias'])) $this->apacheServerAlias = array(); +// if(!isset($attrs['apacheServerAlias'])) $this->apacheServerAlias = array(); if(!isset($attrs['apacheScriptAlias'])) $this->apacheScriptAlias = array(); } @@ -252,6 +253,8 @@ class servapacheVhostEdit extends plugin 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']); -- 2.30.2