2004-01-30 10:26:04 +00:00
< ? php
/*
$Id $
This code is part of LDAP Account Manager ( http :// www . sourceforge . net / projects / lam )
2004-01-31 10:35:34 +00:00
Copyright ( C ) 2003 - 2004 Roland Gruber
2004-01-30 10:26:04 +00:00
This program 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 program 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 program ; if not , write to the Free Software
Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
2004-06-20 19:23:04 +00:00
*/
2004-01-30 10:26:04 +00:00
2004-06-20 19:23:04 +00:00
/**
* Interface between modules and other parts of LAM .
*
* @ package modules
* @ author Tilo Lutz
* @ author Michael Duergner
* @ author Roland Gruber
2004-01-30 10:26:04 +00:00
*/
2004-06-20 19:23:04 +00:00
/** LDAP caches */
2004-04-03 14:47:33 +00:00
include_once ( " cache.inc " );
2004-06-20 19:23:04 +00:00
/** some helper functions */
2004-04-04 13:45:59 +00:00
include_once ( " account.inc " );
2004-06-08 18:54:37 +00:00
/** parent class of account modules */
include_once ( " baseModule.inc " );
2004-09-08 19:30:18 +00:00
/** access to LDAP server */
include_once ( " ldap.inc " );
2004-06-20 19:23:04 +00:00
/**
* This includes all module files .
2004-02-10 19:59:41 +00:00
*/
// Get Lampath, needed 4 includes
$stay = 0 ;
$relative = '' ;
while ( $stay < 7 ) {
if ( is_dir ( $relative . 'lib/modules' )) {
$dir = opendir ( $relative . 'lib/modules' );
while ( $entry = readdir ( $dir ))
2004-06-04 11:28:22 +00:00
if (( substr ( $entry , strlen ( $entry ) - 4 , 4 ) == '.inc' ) && is_file ( $relative . 'lib/modules/' . $entry )) include_once ( $relative . 'lib/modules/' . $entry );
2004-02-10 19:59:41 +00:00
$stay = 10 ;
2004-07-24 17:14:39 +00:00
}
2004-02-10 19:59:41 +00:00
else {
$stay ++ ;
$relative .= '../' ;
}
2004-07-24 17:14:39 +00:00
}
2004-01-30 10:26:04 +00:00
2004-06-14 16:05:36 +00:00
/**
* Returns the alias name of a module
*
* @ param string $name the module name
* @ param string $scope the account type ( " user " , " group " , " host " )
* @ return string alias name
*/
2004-02-21 17:25:18 +00:00
function getModuleAlias ( $name , $scope ) {
2004-06-14 16:05:36 +00:00
$module = new $name ( $scope );
return $module -> get_alias ();
2004-02-21 17:25:18 +00:00
}
2004-06-20 19:23:04 +00:00
/**
* Returns true if the module is a base module
*
* @ param string $name the module name
* @ param string $scope the account type ( " user " , " group " , " host " )
* @ return boolean true if base module
*/
2004-02-21 17:25:18 +00:00
function is_base_module ( $name , $scope ) {
2004-06-08 18:54:37 +00:00
$module = new $name ( $scope );
return $module -> is_base_module ();
2004-02-21 17:25:18 +00:00
}
2004-01-30 10:26:04 +00:00
2004-06-20 19:23:04 +00:00
/**
* Returns the LDAP filter used by the account lists
*
* @ param string $scope the account type ( " user " , " group " , " host " )
* @ return string LDAP filter
*/
2004-02-23 16:55:51 +00:00
function get_ldap_filter ( $scope ) {
$mods = getAvailableModules ( $scope );
$filters = array ();
2004-06-04 11:28:22 +00:00
$orFilter = '' ;
2004-02-23 16:55:51 +00:00
for ( $i = 0 ; $i < sizeof ( $mods ); $i ++ ) {
if ( is_base_module ( $mods [ $i ], $scope )) {
2004-06-11 15:44:49 +00:00
$module = new $mods [ $i ]( $scope );
$modinfo = $module -> get_ldap_filter ();
2004-06-04 11:28:22 +00:00
if ( isset ( $modinfo [ 'or' ])) $filters [ 'or' ][] = $modinfo [ 'or' ];
if ( isset ( $modinfo [ 'and' ])) $filters [ 'and' ][] = $modinfo [ 'and' ];
2004-02-23 16:55:51 +00:00
}
}
2004-06-04 11:28:22 +00:00
// build OR filter
if ( sizeof ( $filters [ 'or' ]) == 1 ) {
$orFilter = $filters [ 'or' ][ 0 ];
2004-02-23 16:55:51 +00:00
}
2004-06-04 11:28:22 +00:00
elseif ( sizeof ( $filters [ 'or' ]) > 1 ) {
$orFilter = " (| " . implode ( " " , $filters [ 'or' ]) . " ) " ;
2004-02-23 16:55:51 +00:00
}
2004-06-04 11:28:22 +00:00
// add built OR filter to AND filters
if ( $orFilter != '' ) $filters [ 'and' ][] = $orFilter ;
// collapse AND filters
if ( sizeof ( $filters [ 'and' ]) < 2 ) return $filters [ 'and' ][ 0 ];
else return " (& " . implode ( " " , $filters [ 'and' ]) . " ) " ;
2004-02-23 16:55:51 +00:00
}
2004-10-06 18:17:22 +00:00
/**
* Returns a list of LDAP attributes which can be used to form the RDN .
*
* The list is already sorted by the priority given by the nodules .
*
* @ param string $scope account type ( user , group , host )
* @ return array list of LDAP attributes
*/
function getRDNAttributes ( $scope ) {
$mods = getAvailableModules ( $scope );
$return = array ();
$attrs_low = array ();
$attrs_normal = array ();
$attrs_high = array ();
for ( $i = 0 ; $i < sizeof ( $mods ); $i ++ ) {
// get list of attributes
$module = new $mods [ $i ]( $scope );
$attrs = $module -> get_RDNAttributes ();
$keys = array_keys ( $attrs );
// sort attributes
for ( $k = 0 ; $k < sizeof ( $keys ); $k ++ ) {
switch ( $attrs [ $keys [ $k ]]) {
case " low " :
$attrs_low [] = $keys [ $k ];
break ;
case " normal " :
$attrs_normal [] = $keys [ $k ];
break ;
case " high " :
$attrs_high [] = $keys [ $k ];
break ;
default :
$attrs_low [] = $keys [ $k ];
break ;
}
}
}
// merge arrays
$return = $attrs_high ;
for ( $i = 0 ; $i < sizeof ( $attrs_normal ); $i ++ ) $return [] = $attrs_normal [ $i ];
for ( $i = 0 ; $i < sizeof ( $attrs_low ); $i ++ ) $return [] = $attrs_low [ $i ];
$return = array_values ( array_unique ( $return ));
return $return ;
}
2004-06-20 19:23:04 +00:00
/**
* Returns a hash array ( module name => dependencies ) of all user module dependencies
*
* " dependencies " contains an array with two sub arrays : depends , conflicts
* < br > The elements of " depends " are either module names or an array of module names ( OR - case ) .
* < br > The elements of conflicts are module names .
*
* @ param string $scope the account type ( user , group , host )
* @ return array dependencies
*/
2004-02-08 15:57:55 +00:00
function getModulesDependencies ( $scope ) {
2004-06-04 11:28:22 +00:00
$mods = getAvailableModules ( $scope );
for ( $i = 0 ; $i < sizeof ( $mods ); $i ++ ) {
2004-06-20 17:32:02 +00:00
$module = new $mods [ $i ]( $scope );
$return [ $mods [ $i ]] = $module -> get_dependencies ();
2004-06-04 11:28:22 +00:00
}
2004-02-07 18:34:26 +00:00
return $return ;
2004-07-24 17:14:39 +00:00
}
2004-02-07 18:34:26 +00:00
2004-01-30 10:26:04 +00:00
2004-06-20 19:23:04 +00:00
/**
* Checks if there are missing dependencies between modules .
*
* @ param array $selected selected module names
* @ param array $deps module dependencies
* @ return mixed false if no misssing dependency was found ,
* otherwise an array of array ( selected module , depending module ) if missing dependencies were found
*/
2004-02-21 17:25:18 +00:00
function check_module_depends ( $selected , $deps ) {
$ret = array ();
for ( $m = 0 ; $m < sizeof ( $selected ); $m ++ ) { // check selected modules
for ( $i = 0 ; $i < sizeof ( $deps [ $selected [ $m ]][ 'depends' ]); $i ++ ) { // check dependencies of module
// check if we have OR-combined modules
if ( is_array ( $deps [ $selected [ $m ]][ 'depends' ][ $i ])) {
// one of the elements is needed
$found = false ;
$depends = $deps [ $selected [ $m ]][ 'depends' ][ $i ];
for ( $d = 0 ; $d < sizeof ( $depends ); $d ++ ) {
if ( in_array ( $depends [ $d ], $selected )) {
$found = true ;
break ;
}
}
if ( ! $found ) {
// missing dependency, add to return value
$ret [] = array ( $selected [ $m ], implode ( " || " , $depends ));
}
}
else {
// single dependency
if ( ! in_array ( $deps [ $selected [ $m ]][ 'depends' ][ $i ], $selected )) {
// missing dependency, add to return value
$ret [] = array ( $selected [ $m ], $deps [ $selected [ $m ]][ 'depends' ][ $i ]);
}
}
}
}
if ( sizeof ( $ret ) > 0 ) return $ret ;
else return false ;
}
2004-06-20 19:23:04 +00:00
/**
* Checks if there are conflicts between modules
*
* @ param array $selected selected module names
* @ param array $deps module dependencies
* @ return false if no conflict was found ,
* otherwise an array of array ( selected module , conflicting module ) if conflicts were found
*/
2004-02-21 17:25:18 +00:00
function check_module_conflicts ( $selected , $deps ) {
$ret = array ();
for ( $m = 0 ; $m < sizeof ( $selected ); $m ++ ) {
for ( $i = 0 ; $i < sizeof ( $deps [ $selected [ $m ]][ 'conflicts' ]); $i ++ ) {
if ( in_array ( $deps [ $selected [ $m ]][ 'conflicts' ][ $i ], $selected )) {
$ret [] = array ( $selected [ $m ], $deps [ $selected [ $m ]][ 'conflicts' ][ $i ]);
}
}
}
if ( sizeof ( $ret ) > 0 ) return $ret ;
else return false ;
}
2004-06-13 19:58:58 +00:00
/**
* Returns an array with all available user module names
*
* @ param string $scope account type ( user , group , host )
* @ return array list of possible modules
*/
2004-02-07 18:34:26 +00:00
function getAvailableModules ( $scope ) {
2004-05-26 16:47:45 +00:00
global $relative ;
2004-05-23 15:51:21 +00:00
$return = array ();
2004-02-07 18:34:26 +00:00
// get module names.
2004-05-26 16:47:45 +00:00
$dir = opendir ( $relative . 'lib/modules' );
2004-02-07 18:34:26 +00:00
while ( $entry = readdir ( $dir ))
2004-06-04 11:28:22 +00:00
if (( substr ( $entry , strlen ( $entry ) - 4 , 4 ) == '.inc' ) && is_file ( $relative . 'lib/modules/' . $entry )) {
2004-02-08 15:57:55 +00:00
$entry = substr ( $entry , 0 , strpos ( $entry , '.' ));
2004-06-13 19:58:58 +00:00
$temp = new $entry ( $scope );
if ( $temp -> can_manage ()) $return [] = $entry ;
2004-03-02 19:58:17 +00:00
}
2004-02-07 18:34:26 +00:00
return $return ;
2004-05-23 15:51:21 +00:00
}
2004-02-07 18:34:26 +00:00
2004-06-20 19:23:04 +00:00
/**
* Returns the elements for the profile page .
*
* @ param string $scope account type ( user , group , host )
* @ return array profile elements
*/
2004-03-06 19:15:40 +00:00
function getProfileOptions ( $scope ) {
2004-04-03 14:47:33 +00:00
// create new account container if needed
if ( ! isset ( $_SESSION [ " profile_account_ $scope " ])) {
$_SESSION [ " profile_account_ $scope " ] = new accountContainer ( $scope , " profile_account_ $scope " );
$_SESSION [ " profile_account_ $scope " ] -> new_account ();
2004-02-08 15:57:55 +00:00
}
2004-04-03 14:47:33 +00:00
// get options
return $_SESSION [ " profile_account_ $scope " ] -> getProfileOptions ();
}
2004-02-08 15:57:55 +00:00
2004-06-20 19:23:04 +00:00
/**
* Checks if the profile options are valid
*
* @ param string $scope account type ( user , group , host )
* @ param array $options hash array containing all options ( name => array ( ... ))
* @ return array list of error messages
*/
2004-03-14 17:35:22 +00:00
function checkProfileOptions ( $scope , $options ) {
2004-07-01 15:54:33 +00:00
// create new account container if needed
if ( ! isset ( $_SESSION [ " profile_account_ $scope " ])) {
$_SESSION [ " profile_account_ $scope " ] = new accountContainer ( $scope , " profile_account_ $scope " );
$_SESSION [ " profile_account_ $scope " ] -> new_account ();
2004-02-08 15:57:55 +00:00
}
2004-07-01 15:54:33 +00:00
// get options
return $_SESSION [ " profile_account_ $scope " ] -> checkProfileOptions ( $options );
2004-03-14 17:35:22 +00:00
}
2004-02-21 17:25:18 +00:00
2004-07-24 17:14:39 +00:00
/**
* Returns a hash array ( module name => elements ) of all module options for the configuration page .
*
* @ param array $scopes hash array ( module name => array ( account types ))
* @ return array configuration options
*/
function getConfigOptions ( $scopes ) {
$return = array ();
$modules = array_keys ( $scopes );
for ( $i = 0 ; $i < sizeof ( $modules ); $i ++ ) {
$m = new $modules [ $i ]( 'none' );
$return [ $modules [ $i ]] = $m -> get_configOptions ( $scopes [ $modules [ $i ]]);
}
return $return ;
}
/**
* Returns a hash array ( module name => descriptions ) containing descriptions shown on configuration pages .
*
* The returned array has the format array ( 'legend' => array ( 'posixAccount' => '...' , ... ), descriptions => array ( 'option1' => '...' , ... )) .
* < br > The " legend " value is used as text for the fieldset , the descriptions are used when the configuration is printed .
*
* @ return array configuration descriptions
*/
function getConfigDescriptions () {
$return = array ( 'legend' => array (), 'descriptions' => array ());
$modules = array_merge ( getAvailableModules ( 'user' ), getAvailableModules ( 'group' ), getAvailableModules ( 'host' ));
$modules = array_values ( array_unique ( $modules ));
for ( $i = 0 ; $i < sizeof ( $modules ); $i ++ ) {
$m = new $modules [ $i ]( 'none' );
$desc = $m -> get_configDescriptions ();
$return [ 'legend' ][ $modules [ $i ]] = $desc [ 'legend' ];
$return [ 'descriptions' ] = array_merge ( $return [ 'descriptions' ], $desc [ 'descriptions' ]);
}
return $return ;
}
/**
* Checks if the configuration options are valid
*
* @ param array $scopes hash array ( module name => array ( account types ))
* @ param array $options hash array containing all options ( name => array ( ... ))
* @ return array list of error messages
*/
function checkConfigOptions ( $scopes , $options ) {
$return = array ();
$modules = array_keys ( $scopes );
for ( $i = 0 ; $i < sizeof ( $modules ); $i ++ ) {
$m = new $modules [ $i ]( 'none' );
$errors = $m -> check_configOptions ( $scopes [ $modules [ $i ]], $options );
$return = array_merge ( $return , $errors );
}
return $return ;
}
2004-06-20 19:23:04 +00:00
/**
* Returns a help entry from an account module .
*
* @ param string $helpID help identifier
* @ param string $module module name
* @ return array help entry
*/
2004-09-09 07:10:14 +00:00
function getHelp ( $module , $helpID , $scope = '' ) {
$moduleObject = new $module ((( $scope != '' ) ? $scope : 'none' ));
return $moduleObject -> get_help ( $helpID , $scope );
2004-03-15 16:30:52 +00:00
}
2004-06-20 19:23:04 +00:00
/**
* Returns a list of available PDF entries .
*
* @ param string $scope account type ( user , group , host )
* @ return array PDF entries
*/
2004-05-30 13:43:42 +00:00
function getAvailablePDFFields ( $scope ) {
// create new account container if needed
if ( ! isset ( $_SESSION [ " profile_account_ $scope " ])) {
$_SESSION [ " profile_account_ $scope " ] = new accountContainer ( $scope , " profile_account_ $scope " );
$_SESSION [ " profile_account_ $scope " ] -> new_account ();
}
// get options
return $_SESSION [ " profile_account_ $scope " ] -> getAvailablePDFFields ();
}
2004-07-16 06:33:37 +00:00
/**
* Return a list of current available scopes
*
* @ return array Available scopes
*/
function getAvailableScopes () {
2004-09-08 10:58:56 +00:00
return array ( 'user' , 'group' , 'host' , 'domain' );
2004-07-16 06:33:37 +00:00
}
2004-09-08 19:30:18 +00:00
/**
* Returns an array containing all input columns for the file upload .
*
* Syntax :
* < br > array (
* < br > string : name , // fixed non-translated name which is used as column name (should be of format: <module name>_<column name>)
* < br > string : description , // short descriptive name
* < br > string : help , // help ID
* < br > string : example , // example value
* < br > boolean : required // true, if user must set a value for this column
* < br > )
*
* @ param string $scope account type
* @ return array column list
*/
function getUploadColumns ( $scope ) {
// create new account container if needed
if ( ! isset ( $_SESSION [ " profile_account_ $scope " ])) {
$_SESSION [ " profile_account_ $scope " ] = new accountContainer ( $scope , " profile_account_ $scope " );
$_SESSION [ " profile_account_ $scope " ] -> new_account ();
}
// get options
return $_SESSION [ " profile_account_ $scope " ] -> get_uploadColumns ();
}
2004-09-19 08:26:33 +00:00
/**
* This function builds the LDAP accounts for the file upload .
*
* If there are problems status messages will be printed automatically .
*
* @ param string $scope account type
* @ param array $data array containing one account in each element
* @ param array $ids array ( < column_name > => < column number > )
* @ return mixed array including accounts or false if there were errors
*/
function buildUploadAccounts ( $scope , $data , $ids ) {
// build module order
$unOrdered = getAvailableModules ( $scope );
$ordered = array ();
$predepends = array ();
for ( $i = 0 ; $i < sizeof ( $unOrdered ); $i ++ ) {
$mod = new $unOrdered [ $i ]( $scope );
$predepends [ $unOrdered [ $i ]] = $mod -> get_uploadPreDepends ();
}
// first all modules without predepends can be ordered
for ( $i = 0 ; $i < sizeof ( $unOrdered ); $i ++ ) {
if ( sizeof ( $predepends [ $unOrdered [ $i ]]) == 0 ) {
$ordered [] = $unOrdered [ $i ];
unset ( $unOrdered [ $i ]);
$unOrdered = array_values ( $unOrdered );
$i -- ;
}
}
$unOrdered = array_values ( $unOrdered ); // fix indexes
// now add all modules with fulfilled dependencies until all are in order
while ( sizeof ( $unOrdered ) > 0 ) {
$newRound = false ;
for ( $i = 0 ; $i < sizeof ( $unOrdered ); $i ++ ) {
$deps = $predepends [ $unOrdered [ $i ]];
$depends = false ;
for ( $d = 0 ; $d < sizeof ( $deps ); $d ++ ) {
if ( in_array ( $deps [ $d ], $unOrdered )) {
$depends = true ;
break ;
}
}
if ( ! $depends ) { // add to order if dependencies are fulfilled
$ordered [] = $unOrdered [ $i ];
unset ( $unOrdered [ $i ]);
$unOrdered = array_values ( $unOrdered );
$newRound = true ;
break ;
}
}
if ( $newRound ) continue ;
// this point should never be reached, LAM was unable to find a correct module order
StatusMessage ( " ERROR " , _ ( " Internal Error: Unable to find correct module order. " ), " " );
return false ;
}
// give raw data to modules
$errors = array ();
$partialAccounts = array ();
2004-09-21 18:32:44 +00:00
for ( $i = 0 ; $i < sizeof ( $data ); $i ++ ) $partialAccounts [ $i ][ 'objectClass' ] = array ();
2004-09-19 08:26:33 +00:00
for ( $i = 0 ; $i < sizeof ( $ordered ); $i ++ ) {
$module = new $ordered [ $i ]( $scope );
2004-09-19 16:04:37 +00:00
$errors = $module -> build_uploadAccounts ( $data , $ids , $partialAccounts );
if ( sizeof ( $errors ) > 0 ) {
2004-10-09 11:08:16 +00:00
$errors [] = array ( " ERROR " , _ ( " Upload was stopped after errors in %s module! " ), " " , array ( $module -> get_alias ()));
2004-09-19 16:04:37 +00:00
break ;
}
2004-09-19 08:26:33 +00:00
}
2004-09-19 16:04:37 +00:00
if ( sizeof ( $errors ) > 0 ) {
2004-10-09 11:08:16 +00:00
for ( $i = 0 ; (( $i < sizeof ( $errors )) || ( $i > 49 )); $i ++ ) call_user_func_array ( " StatusMessage " , $errors [ $i ]);
2004-09-19 16:04:37 +00:00
return false ;
}
else return $partialAccounts ;
2004-09-19 08:26:33 +00:00
}
2004-09-08 19:30:18 +00:00
2004-06-20 19:23:04 +00:00
/**
* This class includes all modules and attributes of an account .
*
* @ package modules
*/
2004-02-07 18:34:26 +00:00
class accountContainer {
// Constructor
function accountContainer ( $type , $base ) {
/* Set the type of account . Valid
* types are : user , group , host
*/
// Check input variable
2004-09-15 19:52:29 +00:00
2004-02-07 18:34:26 +00:00
if ( ! is_string ( $type )) trigger_error ( _ ( 'Argument of accountContainer must be string.' ), E_USER_ERROR );
if ( ! is_string ( $base )) trigger_error ( _ ( 'Argument of accountContainer must be string.' ), E_USER_ERROR );
// *** fixme use global variable to determine allowed types
2004-09-08 10:58:56 +00:00
if ( ! in_array ( $type , getAvailableScopes ())) trigger_error ( _ ( 'Account type not recognized.' ), E_USER_ERROR );
2004-02-07 18:34:26 +00:00
$this -> type = $type ;
$this -> base = $base ;
2004-09-08 10:07:25 +00:00
// Set startpage
$this -> current_page = 0 ;
$this -> subpage = 'attributes' ;
2004-02-07 18:34:26 +00:00
return 0 ;
}
/* Array of all used attributes
* Syntax is attribute => array ( objectClass => MUST or MAY , ... )
*/
var $attributes ;
/* This variale stores the type
* of account . Current unix , group , host are supported
*/
2004-04-03 14:47:33 +00:00
var $type ;
2004-02-07 18:34:26 +00:00
var $module ; // This is an array with all module objects
// DN of the account
var $dn ;
var $dn_orig ;
// this are stores the module order
var $order ;
// name of accountContainer so we can read other classes in accuontArray
var $base ;
2004-09-08 10:07:25 +00:00
// This variable stores the number of the current displayed page
var $current_page ;
// This variable os set to the pagename of a subpage if it should be displayed
var $subpage ;
2004-02-07 18:34:26 +00:00
2004-09-08 10:07:25 +00:00
2004-02-07 18:34:26 +00:00
/* Get the type of account . Valid
* types are : user , group , host
*/
function get_type () {
return $this -> type ;
}
2004-09-08 10:07:25 +00:00
2004-02-07 18:34:26 +00:00
function continue_main ( $post ) {
2004-09-08 10:07:25 +00:00
if ( $this -> subpage == '' ) $this -> subpage = 'attributes' ;
2004-02-07 18:34:26 +00:00
if ( $post [ 'form_main_reset' ]) {
$this -> load_account ( $this -> dn_orig );
}
else {
2004-09-08 10:07:25 +00:00
if ( $this -> current_page == 0 ) {
if ( $this -> subpage == 'attributes' ) {
$result = 0 ;
// change dn
if ( $post [ 'suffix' ] != '' ) $this -> dn = $post [ 'suffix' ];
// load profile
if ( $post [ 'selectLoadProfile' ] && $post [ 'loadProfile' ]) {
// *** fixme load*Profile must return array in the same way ldap_get_attributes does.
$function = '$newattributes = load' . ucfirst ( $scope ) . 'Profile($post[\'selectLoadProfile\']);' ;
//eval($function);
$newattributes = call_user_func ( 'load' . ucfirst ( $scope ) . 'Profile' , $post [ 'selectLoadProfile' ]);
// pass newattributes to each module
$modules = array_keys ( $this -> module );
foreach ( $modules as $module ) $this -> module [ $module ] -> load_attributes ( $newattributes );
$result = 0 ;
}
// save account
if ( $post [ 'create' ]) {
$errors = $this -> save_account ();
if ( is_array ( $errors )) $result = array ( $errors );
// return name of subpage
$result = 'finish' ;
}
// save profile
if ( $post [ 'saveProfile' ]) {
if ( $post [ 'selectSaveProfile' ] == '' ) $errors [ 'saveProfile' ][] = array ( 'ERROR' , _ ( 'Save profile' ), _ ( 'No profilename given.' ));
else {
$function = 'save' . ucfirst ( $scope ) . 'Profile();' ;
//eval($function);
call_user_func ( 'save' . ucfirst ( $scope ) . 'Profile' );
if ( $function ) $errors [ 'saveProfile' ][] = array ( 'INFO' , _ ( 'Save profile' ), _ ( 'New profile created.' ));
else $errors [ 'saveProfile' ][] = array ( 'ERROR' , _ ( 'Save profile' ), _ ( 'Wrong profilename given.' ));
}
if ( is_array ( $errors ) && ! $profile ) $result = $errors ;
else $result = 0 ;
}
}
if ( $this -> subpage == 'finish' ) {
if ( $post [ 'createagain' ]) {
// Reset objects
$modules = array_keys ( $this -> module );
foreach ( $modules as $module )
if ( $module != 'main' ) unset ( $this -> module [ $module ]);
// Reset accountContainer
$this -> dn = '' ;
$this -> dn_orig = '' ;
$this -> attributes = array ();
$this -> order = array ();
$this -> current_page = 0 ;
$this -> subpage = '' ;
// Add all required objects etc.
$this -> new_account ();
$result = 0 ;
}
if ( $post [ 'backmain' ]) {
// Return to *-list
// *** fixme unset accountContainer in session
metaRefresh ( " ../lists/list " . $this -> type . " s.php " );
exit ;
}
if ( $post [ 'outputpdf' ]) {
// Create / display PDf-file
$function = 'create' . ucfirst ( $this -> type ) . 'PDF(array($_SESSION[$this->base]));' ;
//eval($function);
call_user_func ( 'create' . ucfirst ( $this -> type ) . 'PDF' , array ( $_SESSION [ $this -> base ]));
exit ;
}
}
}
2004-09-24 16:32:46 +00:00
else $result = call_user_func ( array ( & $this -> module [ $this -> order [ $this -> current_page ]], 'proccess_' . $this -> subpage ), & $post );
2004-02-07 18:34:26 +00:00
}
2004-09-08 10:07:25 +00:00
if ( is_string ( $result )) $this -> subpage = $result ;
if ( is_int ( $result )) {
if ( $post [ 'form_main_main' ]) {
$this -> current_page = 0 ;
$this -> subpage = 'attributes' ;
}
else for ( $i = 1 ; $i < count ( $this -> order ); $i ++ )
2004-09-28 15:41:16 +00:00
if ( $post [ 'form_main_' . $this -> order [ $i ]] && ( $this -> module [ $this -> order [ $i ]] -> module_ready ())) {
2004-09-08 10:07:25 +00:00
$this -> current_page = $i ;
$this -> subpage = 'attributes' ;
2004-02-07 18:34:26 +00:00
}
2004-09-08 10:07:25 +00:00
}
2004-02-07 18:34:26 +00:00
// Write HTML-Code
2004-09-28 15:41:16 +00:00
echo $_SESSION [ 'header' ];
2004-02-07 18:34:26 +00:00
echo " <title> " ;
if ( $this -> dn_orig != '' ) echo _ ( " Modify Account " );
else echo _ ( " Create new Account " );
echo " </title> \n " ;
echo " <link rel= \" stylesheet \" type= \" text/css \" href= \" ../../style/layout.css \" > \n " ;
echo " </head><body> \n " ;
2004-02-10 20:18:00 +00:00
echo " <form action= \" edit.php \" method= \" post \" > \n " ;
2004-02-07 18:34:26 +00:00
// Display errir-messages
if ( is_array ( $result ))
foreach ( $result as $result2 )
if ( is_array ( $result2 ))
for ( $i = 0 ; $i < sizeof ( $result2 ); $i ++ ) StatusMessage ( $result2 [ $i ][ 0 ], $result2 [ $i ][ 1 ], $result2 [ $i ][ 2 ]);
// Create left module-menu
echo " <table border=0 width= \" 100% \" > \n <tr><td valign= \" top \" width= \" 15% \" > " ;
echo " <table><tr> " ;
2004-09-08 10:07:25 +00:00
2004-02-07 18:34:26 +00:00
echo " <td><fieldset class= \" " . $this -> type . " edit-dark \" ><legend class= \" " . $this -> type . " edit-bright \" ><b> " ;
echo _ ( 'Please select page:' );
echo " </b></legend> \n " ;
2004-09-15 19:52:29 +00:00
$x = 0 ;
2004-09-28 15:41:16 +00:00
// print normal button
echo " <input name= \" form_main_main \" type= \" submit \" value= \" " ;
echo _ ( 'Main' );
echo " \" tabindex= $x > \n <br> " ;
$x ++ ;
2004-02-07 18:34:26 +00:00
// Loop for module
2004-08-11 11:08:56 +00:00
// $x is used to count up tabindex
2004-09-08 10:07:25 +00:00
for ( $i = 1 ; $i < count ( $this -> order ); $i ++ ) {
2004-09-28 15:41:16 +00:00
// print normal button
echo " <input name= \" form_main_ " . $this -> order [ $i ] . " \" type= \" submit \" value= \" " ;
echo $this -> module [ $this -> order [ $i ]] -> get_alias ();
echo " \" tabindex= $x > \n <br> " ;
$x ++ ;
2004-02-07 18:34:26 +00:00
}
if ( $this -> dn_orig != '' ) echo " <input name= \" form_main_reset \" type= \" submit \" value= \" " . _ ( 'Reset changes' ) . " \" ><br> \n " ;
echo " </fieldset></td></tr> \n " ;
echo " </table></td> \n <td> " ;
2004-09-08 10:07:25 +00:00
if ( $this -> current_page == 0 ) {
echo " <td><fieldset class= \" " . $this -> type . " edit-dark \" ><legend class= \" " . $this -> type . " edit-bright \" ><b> " ;
echo _ ( 'Main' );
2004-02-07 18:34:26 +00:00
echo " </b></legend> \n " ;
2004-09-08 10:07:25 +00:00
}
else {
echo " <td><fieldset class= \" " . $this -> type . " edit-dark \" ><legend class= \" " . $this -> type . " edit-bright \" ><b> " ;
echo $this -> module [ $this -> order [ $this -> current_page ]] -> get_alias ( $type );
echo " </b></legend> \n " ;
}
2004-02-07 18:34:26 +00:00
// display html-code from mdule
2004-09-08 10:07:25 +00:00
if ( $this -> current_page == 0 ) {
if ( $this -> subpage == 'attributes' ) {
$modules = array_keys ( $this -> module );
2004-09-15 19:52:29 +00:00
$table = array ();
2004-09-08 10:07:25 +00:00
if ( ! $profile ) {
$disabled = false ;
foreach ( $modules as $module ) {
if ( ! $this -> module [ $module ] -> module_complete ()) {
$disabled = true ;
$table [] = array ( 0 => array ( 'kind' => 'message' , 'type' => 'ERROR' , 'headline' => _ ( 'Check module' ),
2004-09-15 19:52:29 +00:00
'text' => sprintf ( _ ( 'Please set up all required attributes on %s page.' ), $this -> module [ $module ] -> get_alias ()) ));
2004-09-08 10:07:25 +00:00
}
}
}
if ( count ( $table ) != 0 ) $return [] = array ( 0 => array ( 'kind' => 'table' , 'value' => $table ) );
// loop through all suffixes
2004-09-14 11:53:33 +00:00
$rootsuffix = call_user_func ( array ( & $_SESSION [ 'config' ], 'get_' . ucfirst ( $this -> type ) . 'Suffix' ));
2004-09-08 19:30:18 +00:00
foreach ( $_SESSION [ 'ldap' ] -> search_units ( $rootsuffix ) as $suffix ) {
2004-09-08 10:07:25 +00:00
if ( $this -> dn == $suffix ) $option_selected = $suffix ;
$suffixes [] = $suffix ;
}
$return [] = array ( 0 => array ( 'kind' => 'text' , 'text' => _ ( 'Suffix' ) ),
1 => array ( 'kind' => 'select' , 'name' => 'suffix' , 'options' => $suffixes ,
'option_selected' => array ( $option_selected ) ),
2 => array ( 'kind' => 'help' , 'value' => 'suffix' ));
if ( ! $profile ) {
// Get list of profiles
$function = '$profilelist = get' . ucfirst ( $this -> type ) . 'Profiles();' ;
//eval($function);
$profilelist = call_user_func ( 'get' . ucfirst ( $this -> type ) . 'Profiles' );
if ( count ( $profilelist ) != 0 ) {
$return [] = array ( 0 => array ( 'kind' => 'text' , 'text' => _ ( " Load profile " ) ),
1 => array ( 'kind' => 'select' , 'name' => 'selectLoadProfile' , 'options' => $profilelist ),
2 => array ( 'kind' => 'help' , 'value' => 'selectLoadProfile' ));
}
$return [] = array ( 0 => array ( 'kind' => 'text' , 'text' => _ ( " Save profile " ) ),
1 => array ( 'kind' => 'table' , 'value' => array ( 0 => array (
0 => array ( 'kind' => 'input' , 'name' => 'selectSaveProfile' , 'type' => 'text' , 'size' => '30' ,
'maxlength' => '255' , ),
1 => array ( 'kind' => 'input' , 'name' => 'saveProfile' , 'type' => 'submit' ,
'value' => _ ( 'Save profile' ), 'disabled' => $disabled ))) ),
2 => array ( 'kind' => 'help' , 'value' => 'saveProfile' ));
if ( $this -> dn_orig != '' ) $text = _ ( 'Modify Account' );
else $text = _ ( 'Create Account' );
$return [] = array ( 0 => array ( 'kind' => 'text' , 'text' => $text ),
1 => array ( 'kind' => 'input' , 'type' => 'submit' , 'name' => 'create' , 'value' => $text ),
2 => array ( 'kind' => 'help' , 'value' => 'create' ));
}
}
if ( $this -> subpage == 'finish' ) {
// Show success message
if ( $this -> dn_orig == '' ) $kind = _ ( 'created' );
else $kind = _ ( 'modified' );
$text = sprintf ( _ ( '%s has been %s.' ), ucfirst ( $this -> type ), $kind );
if ( ! $profile ) {
$return [] = array ( 0 => array ( 'kind' => 'message' , 'type' => 'INFO' , 'headline' => _ ( 'LDAP operation successful.' ),
'text' => $text ));
$return [] = array ( 0 => array ( 'kind' => 'input' , 'type' => 'submit' , 'name' => 'createagain' ,
'value' => sprintf ( _ ( 'Create another %s' ), $this -> type ) ),
1 => array ( 'kind' => 'input' , 'type' => 'submit' , 'name' => 'outputpdf' ,
'value' => _ ( 'Create PDF file' ) ),
2 => array ( 'kind' => 'input' , 'type' => 'submit' , 'name' => 'backmain' ,
'value' => sprintf ( _ ( 'Back to %s list' ), $this -> type ) ));
}
}
}
2004-09-24 16:32:46 +00:00
else $return = call_user_func ( array ( $this -> module [ $this -> order [ $this -> current_page ]], 'display_html_' . $this -> subpage ), & $post );
2004-09-08 10:07:25 +00:00
$this -> parse_html ( $this -> order [ $this -> current_page ], $return );
2004-02-07 18:34:26 +00:00
// Display rest of html-page
echo " </fieldset> \n " ;
echo " </td></tr></table> \n " ;
echo " </form> \n " ;
echo " </body> \n " ;
echo " </html> \n " ;
return 0 ;
}
2004-08-11 11:08:56 +00:00
function parse_html ( $module , $input , $y = 5000 , $z = 10000 ) {
/* $y and $z are used to change the the taborder .
* Unfortunatly we don ' t now how many taborders we need
* Every link also help needs a taborder .
* Therefore we start with taborder = 10000 for help
* and taborder = 5000 for input fields
* taborder starts at 5000 because we need also some
* taborders for the side bar .
*/
2004-02-07 18:34:26 +00:00
if ( is_array ( $input )) {
echo " <table> \n " ;
for ( $i = 0 ; $i < count ( $input ); $i ++ ) {
// Draw column
echo " <tr> \n " ;
for ( $j = 0 ; $j < count ( $input [ $i ]); $j ++ ) {
2004-08-11 11:08:56 +00:00
// Draw raw
2004-02-07 18:34:26 +00:00
switch ( $input [ $i ][ $j ][ 'kind' ]) {
case 'text' :
echo " <td " ;
if ( $input [ $i ][ $j ][ 'td' ][ 'valign' ] != '' ) echo ' valign="' . $input [ $i ][ $j ][ 'td' ][ 'valign' ] . '"' ;
echo " > \n " ;
echo $input [ $i ][ $j ][ 'text' ] . " </td> \n " ;
break ;
case 'input' :
echo " <td " ;
if ( $input [ $i ][ $j ][ 'td' ][ 'valign' ] != '' ) echo ' valign="' . $input [ $i ][ $j ][ 'td' ][ 'valign' ] . '"' ;
echo " > \n " ;
$output = " <input " ;
if ( $input [ $i ][ $j ][ 'name' ] != '' ) $output .= ' name="' . $input [ $i ][ $j ][ 'name' ] . '"' ;
if ( $input [ $i ][ $j ][ 'type' ] != '' ) $output .= ' type="' . $input [ $i ][ $j ][ 'type' ] . '"' ;
if ( $input [ $i ][ $j ][ 'size' ] != '' ) $output .= ' size="' . $input [ $i ][ $j ][ 'size' ] . '"' ;
if ( $input [ $i ][ $j ][ 'maxlength' ] != '' ) $output .= ' maxlength="' . $input [ $i ][ $j ][ 'maxlength' ] . '"' ;
if ( $input [ $i ][ $j ][ 'value' ] != '' ) $output .= ' value="' . $input [ $i ][ $j ][ 'value' ] . '"' ;
if ( $input [ $i ][ $j ][ 'disabled' ]) $output .= ' disabled' ;
2004-08-11 11:08:56 +00:00
// Show taborder
else {
$output .= " tabindex= $y " ;
$y ++ ;
}
2004-02-07 18:34:26 +00:00
if ( $input [ $i ][ $j ][ 'checked' ]) $output .= ' checked' ;
$output .= " ></td> \n " ;
echo $output ;
break ;
case 'fieldset' :
echo " <td " ;
if ( $input [ $i ][ $j ][ 'td' ][ 'valign' ] != '' ) echo ' valign="' . $input [ $i ][ $j ][ 'td' ][ 'valign' ] . '"' ;
echo " > \n " ;
echo " <fieldset> \n " ;
if ( $input [ $i ][ $j ][ 'legend' ] != '' ) echo " <legend> " . $input [ $i ][ $j ][ 'legend' ] . " </legend> \n " ;
2004-09-15 19:52:29 +00:00
$this -> parse_html ( $module , $input [ $i ][ $j ][ 'value' ], & $y , & $z );
2004-02-07 18:34:26 +00:00
echo " </fieldset> \n " ;
break ;
case 'select' :
if ( ! is_array ( $input [ $i ][ $j ][ 'options' ])) $input [ $i ][ $j ][ 'options' ] = array ( $input [ $i ][ $j ][ 'options' ] );
if ( ! is_array ( $input [ $i ][ $j ][ 'options_selected' ])) $input [ $i ][ $j ][ 'options_selected' ] = array ( $input [ $i ][ $j ][ 'options_selected' ] );
echo " <td " ;
if ( $input [ $i ][ $j ][ 'td' ][ 'valign' ] != '' ) echo ' valign="' . $input [ $i ][ $j ][ 'td' ][ 'valign' ] . '"' ;
echo " > \n " ;
echo " <select name= \" " . $input [ $i ][ $j ][ 'name' ] . '"' ;
if ( $input [ $i ][ $j ][ 'multiple' ]) echo ' multiple' ;
if ( $input [ $i ][ $j ][ 'size' ]) echo ' size="' . $input [ $i ][ $j ][ 'size' ] . '"' ;
2004-08-11 11:08:56 +00:00
// Show taborder
echo " tabindex= $y " ;
$y ++ ;
2004-02-07 18:34:26 +00:00
echo " > \n " ;
// merge both option arrays and sort them.
$options = array_merge ( $input [ $i ][ $j ][ 'options' ], $input [ $i ][ $j ][ 'options_selected' ] );
$options = array_unique ( $options );
sort ( $options , SORT_NUMERIC );
foreach ( $options as $option ) {
if ( $option != '' ) {
if ( in_array ( $option , $input [ $i ][ $j ][ 'options_selected' ])) echo " <option selected> " . $option . " </option> \n " ;
else echo " <option> " . $option . " </option> \n " ;
}
}
echo " </select></td> \n " ;
break ;
case 'table' :
echo " <td " ;
if ( $input [ $i ][ $j ][ 'td' ][ 'valign' ] != '' ) echo ' valign="' . $input [ $i ][ $j ][ 'td' ][ 'valign' ] . '"' ;
echo " > \n " ;
2004-09-15 19:52:29 +00:00
$this -> parse_html ( $module , $input [ $i ][ $j ][ 'value' ], & $y , & $z );
2004-02-07 18:34:26 +00:00
echo " </td> \n " ;
break ;
case 'help' :
echo " <td " ;
if ( $input [ $i ][ $j ][ 'td' ][ 'valign' ] != '' ) echo ' valign="' . $input [ $i ][ $j ][ 'td' ][ 'valign' ] . '"' ;
echo " > \n " ;
2004-09-09 07:10:14 +00:00
echo " <a href=../help.php?module= $module &item= " . $input [ $i ][ $j ][ 'value' ] . " &scope= " . $this -> type . " target= \" help \" tabindex= $z > " . _ ( 'Help' ) . " </a></td> \n " ;
2004-08-11 11:08:56 +00:00
$z ++ ;
2004-02-07 18:34:26 +00:00
break ;
case 'message' :
2004-02-09 18:11:01 +00:00
echo " <td " ;
if ( $input [ $i ][ $j ][ 'td' ][ 'valign' ] != '' ) echo ' valign="' . $input [ $i ][ $j ][ 'td' ][ 'valign' ] . '"' ;
echo " > \n " ;
2004-02-07 18:34:26 +00:00
StatusMessage ( $input [ $i ][ $j ][ 'type' ], $input [ $i ][ $j ][ 'headline' ], $input [ $i ][ $j ][ 'text' ]);
2004-02-09 18:11:01 +00:00
echo " </td> \n " ;
2004-02-07 18:34:26 +00:00
break ;
default :
echo " <td>Unrecognized type: " . $input [ $i ][ $j ][ 'kind' ] . " </td> \n " ;
break ;
}
}
echo " </tr> \n " ;
}
}
echo " </table> \n " ;
}
/* Add attributes to variable . Syntax is array ( attribute = array ( objectClass1 => MUST | MAX , objectClass2 => MUST | MAY ), ... )
*/
function add_attributes ( $objectClass ) {
// loop through every existing objectlass and select current objectClass
$line =- 1 ;
2004-09-08 19:30:18 +00:00
for ( $i = 0 ; $i < count ( $_SESSION [ 'ldap' ] -> objectClasses ) || $i ==- 1 ; $i ++ ) {
2004-09-14 11:53:33 +00:00
if ( strpos ( strtolower ( $_SESSION [ 'ldap' ] -> objectClasses [ $i ]), strtolower ( " NAME ' $objectClass ' " ))) $line = $i ;
2004-02-07 18:34:26 +00:00
}
// Return error if objectClass isn't found
if ( $line ==- 1 ) trigger_error ( sprintf ( _ ( " objectClass %s required but not defined in ldap. " ), $objectClass ), E_USER_WARNING );
// create array with must-attributes
// Get startposition in string
2004-09-08 19:30:18 +00:00
if ( strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'MUST (' )) {
$string_withtail = substr ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'MUST (' ) + 6 );
2004-02-07 18:34:26 +00:00
// Now we have a string with all must-attributes
$string = substr ( $string_withtail , 0 , strpos ( $string_withtail , ')' ));
$string = trim ( $string );
$must = explode ( " $ " , $string );
// Ad must
foreach ( $must as $attribute ) {
if ( ! isset ( $this -> attributes [ $attribute ])) $this -> attributes [ $attribute ][ $objectClass ] = 'MUST' ;
else $this -> attributes [ $attribute ][ $objectClass ] = 'MUST' ;
}
}
// create array with may-attributes
// Get startposition in string
2004-09-08 19:30:18 +00:00
if ( strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'MAY (' )) {
$string_withtail = substr ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'MAY (' ) + 5 );
2004-02-07 18:34:26 +00:00
// Now we have a string with all must-attributes
$string = substr ( $string_withtail , 0 , strpos ( $string_withtail , ')' ));
$string = trim ( $string );
$may = explode ( " $ " , $string );
// Ad may
foreach ( $may as $attribute ) {
if ( ! isset ( $this -> attributes [ $attribute ])) $this -> attributes [ $attribute ][ $objectClass ] = 'MAY' ;
else $this -> attributes [ $attribute ][ $objectClass ] = 'MAY' ;
}
}
// Get attributes of subclasses
2004-09-08 19:30:18 +00:00
while ( strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], " SUP " )) {
$string_withtail = substr ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'SUP ' ) + 4 );
2004-02-07 18:34:26 +00:00
$subclass = substr ( $string_withtail , 0 , strpos ( $string_withtail , ' ' ));
// Add account type to object
2004-09-08 19:30:18 +00:00
for ( $i = 0 ; $i < count ( $_SESSION [ 'ldap' ] -> objectClasses ) || $i ==- 1 ; $i ++ ) {
if ( strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $i ], " NAME ' $subclass ' " )) $line = $i ;
2004-02-07 18:34:26 +00:00
}
// Return error if objectClass isn't found
if ( $line ==- 1 ) trigger_error ( sprintf ( _ ( " objectClass %s required but not defined in ldap. " ), $objectClass ), E_USER_WARNING );
// create array with must-attributes
// Get startposition in string
2004-09-08 19:30:18 +00:00
if ( strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'MUST (' )) {
$string_withtail = substr ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'MUST (' ) + 6 );
2004-02-07 18:34:26 +00:00
// Now we have a string with all must-attributes
$string = substr ( $string_withtail , 0 , strpos ( $string_withtail , ')' ));
$string = trim ( $string );
$must = explode ( " $ " , $string );
// Ad must
foreach ( $must as $attribute ) {
if ( ! isset ( $this -> attributes [ $attribute ])) $this -> attributes [ $attribute ][ $objectClass ] = 'MUST' ;
else $this -> attributes [ $attribute ][ $objectClass ] = 'MUST' ;
}
}
// create array with may-attributes
// Get startposition in string
2004-09-08 19:30:18 +00:00
if ( strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'MAY (' )) {
$string_withtail = substr ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'MAY (' ) + 5 );
2004-02-07 18:34:26 +00:00
// Now we have a string with all must-attributes
$string = substr ( $string_withtail , 0 , strpos ( $string_withtail , ')' ));
$string = trim ( $string );
$may = explode ( " $ " , $string );
// Ad may
foreach ( $may as $attribute ) {
if ( ! isset ( $this -> attributes [ $attribute ])) $this -> attributes [ $attribute ][ $objectClass ] = 'MAY' ;
else $this -> attributes [ $attribute ][ $objectClass ] = 'MAY' ;
}
}
}
}
/* This function return ldap attributes
* Syntax is get_attributes ( $value , $scope )
* $scope = 'objectClass' , $value = objectClass return value are all attributes of objectClass
* $scope = 'attribute' , $value = attribute returns alle objectClasses which are using the attribute
*/
function get_attributes ( $value , $scope ) {
if ( $scope == 'attribute' && isset ( $this -> attributes [ $value ])) return $this -> attributes [ $value ];
if ( $scope == 'objectClass' ) {
$keys = array_keys ( $this -> attributes );
foreach ( $keys as $attribute ) {
if ( isset ( $this -> attributes [ $attribute ][ $value ])) $return [ $attribute ] = $this -> attributes [ $attribute ][ $value ];
}
return $return ;
}
return 0 ;
}
2004-02-09 18:11:01 +00:00
2004-09-14 11:53:33 +00:00
/* This function returns all ldap attributes in an array which are used by $objectClass
* ldap attributs already in use by another objectClass are passed as reference .
* Therefore this function must be called as reference : $result =& .. get_module_attributes
*
* if original is true referencees will be set to original attributes . This are the original attributes
* when an ldap entry is loaded .
2004-02-07 18:34:26 +00:00
*/
2004-09-14 11:53:33 +00:00
function get_module_attributes ( $objectClass , $original = false ) {
2004-02-07 18:34:26 +00:00
// Add account type to object
$line =- 1 ;
2004-09-08 19:30:18 +00:00
for ( $i = 0 ; $i < count ( $_SESSION [ 'ldap' ] -> objectClasses ) || $i ==- 1 ; $i ++ ) {
2004-09-14 11:53:33 +00:00
if ( strpos ( strtolower ( $_SESSION [ 'ldap' ] -> objectClasses [ $i ]), strtolower ( " NAME ' $objectClass ' " ))) $line = $i ;
2004-02-07 18:34:26 +00:00
}
2004-09-15 19:52:29 +00:00
// Return empty array if no objectClass wasn't found
if ( $line ==- 1 ) return array ();
//if ($line==-1) trigger_error (sprintf(_("ObjectClass %s required but not defined in ldap."), $objectClass), E_USER_WARNING);
2004-09-14 13:09:13 +00:00
// get casesensitive objectClass name
$objectClassName = substr ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 6 + strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], " NAME ' " ), strlen ( $objectClass ) );
2004-09-08 19:30:18 +00:00
if ( strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'MUST (' )) {
$string_withtail = substr ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'MUST (' ) + 6 );
2004-02-07 18:34:26 +00:00
// Now we have a string with all must-attributes
$string = substr ( $string_withtail , 0 , strpos ( $string_withtail , ')' ));
$string = trim ( $string );
// Ad must
foreach ( explode ( " $ " , $string ) as $attribute ) {
2004-09-13 12:01:28 +00:00
$return [ $attribute ] = array ( '' );
2004-02-07 18:34:26 +00:00
}
}
// create array with may-attributes
// Get startposition in string
2004-09-08 19:30:18 +00:00
if ( strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'MAY (' )) {
$string_withtail = substr ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'MAY (' ) + 5 );
2004-02-07 18:34:26 +00:00
// Now we have a string with all must-attributes
$string = substr ( $string_withtail , 0 , strpos ( $string_withtail , ')' ));
$string = trim ( $string );
// Ad may
foreach ( explode ( " $ " , $string ) as $attribute ) {
2004-09-13 12:01:28 +00:00
$return [ $attribute ] = array ( '' );
2004-02-07 18:34:26 +00:00
}
}
// Get attributes of subclasses
2004-09-08 19:30:18 +00:00
while ( strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], " SUP " )) {
$string_withtail = substr ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'SUP ' ) + 4 );
2004-02-07 18:34:26 +00:00
$subclass = substr ( $string_withtail , 0 , strpos ( $string_withtail , ' ' ));
// Add account type to object
2004-09-08 19:30:18 +00:00
for ( $i = 0 ; $i < count ( $_SESSION [ 'ldap' ] -> objectClasses ) || $i ==- 1 ; $i ++ ) {
if ( strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $i ], " NAME ' $subclass ' " )) $line = $i ;
2004-02-07 18:34:26 +00:00
}
// Return error if objectClass isn't found
if ( $line ==- 1 ) trigger_error ( sprintf ( _ ( " ObjectClass %s required but not defined in ldap. " ), $subclass ), E_USER_WARNING );
// create array with must-attributes
// Get startposition in string
2004-09-08 19:30:18 +00:00
if ( strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'MUST (' )) {
$string_withtail = substr ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'MUST (' ) + 6 );
2004-02-07 18:34:26 +00:00
// Now we have a string with all must-attributes
$string = substr ( $string_withtail , 0 , strpos ( $string_withtail , ')' ));
$string = trim ( $string );
// Ad must
foreach ( explode ( " $ " , $string ) as $attribute ) {
2004-09-13 12:01:28 +00:00
$return [ $attribute ] = array ( '' );
2004-02-07 18:34:26 +00:00
}
}
// create array with may-attributes
// Get startposition in string
2004-09-08 19:30:18 +00:00
if ( strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'MAY (' )) {
$string_withtail = substr ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], strpos ( $_SESSION [ 'ldap' ] -> objectClasses [ $line ], 'MAY (' ) + 5 );
2004-02-07 18:34:26 +00:00
// Now we have a string with all must-attributes
$string = substr ( $string_withtail , 0 , strpos ( $string_withtail , ')' ));
$string = trim ( $string );
// Ad may
foreach ( explode ( " $ " , $string ) as $attribute ) {
2004-09-13 12:01:28 +00:00
$return [ $attribute ] = array ( '' );
2004-02-07 18:34:26 +00:00
}
}
}
2004-09-14 11:53:33 +00:00
2004-09-15 19:52:29 +00:00
// make references with attibutes which are used by more than one module
2004-09-14 11:53:33 +00:00
$newattributes = array_keys ( $return );
$module = array_keys ( $this -> module );
if ( ! $original ) {
// Only add attributes when original is false. We don't want to add them twice
$this -> add_attributes ( $objectClass );
for ( $i = 0 ; $i < count ( $module ); $i ++ ) {
if ( $module [ $i ] != $objectClass )
foreach ( $newattributes as $attribute )
2004-09-15 19:52:29 +00:00
if ( isset ( $this -> module [ $module [ $i ]] -> attributes [ $attribute ]) && ( $attribute != 'objectClass' ))
2004-09-14 11:53:33 +00:00
$return [ $attribute ] =& $this -> module [ $module [ $i ]] -> attributes [ $attribute ];
}
}
else {
for ( $i = 0 ; $i < count ( $module ); $i ++ ) {
if ( $module [ $i ] != $objectClass )
foreach ( $newattributes as $attribute )
2004-09-15 19:52:29 +00:00
if ( isset ( $this -> module [ $module [ $i ]] -> orig [ $attribute ]) && ( $attribute != 'objectClass' ))
2004-09-14 11:53:33 +00:00
$return [ $attribute ] =& $this -> module [ $module [ $i ]] -> orig [ $attribute ];
}
}
2004-09-15 19:52:29 +00:00
$return [ 'objectClass' ] = array ();
2004-09-14 13:09:13 +00:00
return $return ;
2004-02-07 18:34:26 +00:00
}
/* This function return ldap attributes which are uses by $objectClass
* Syntax is get_attributes ( $attributes , $orig )
* Return is an array as needed for $this -> saveAccount ()
*/
function save_module_attributes ( $attributes , $orig ) {
// Get list of all "easy" attributes
$attr_names = array_keys ( $attributes );
// Get attributes which should be added
for ( $i = 0 ; $i < count ( $attr_names ); $i ++ ) {
for ( $j = 0 ; $j < count ( $orig [ $attr_names [ $i ]]); $j ++ ) {
if ( is_array ( $attributes [ $attr_names [ $i ]])) {
if ( ! in_array ( $orig [ $attr_names [ $i ]][ $j ], $attributes [ $attr_names [ $i ]]))
2004-10-01 12:13:16 +00:00
if (( $orig [ $attr_names [ $i ]][ $j ] != '' ) && ( $attr_names [ $i ] != 'objectClass' )) $torem [ $attr_names [ $i ]][] = $orig [ $attr_names [ $i ]][ $j ];
2004-02-07 18:34:26 +00:00
}
2004-10-01 12:13:16 +00:00
else if (( $orig [ $attr_names [ $i ]][ $j ] != '' ) && ( $attr_names [ $i ] != 'objectClass' )) $torem [ $attr_names [ $i ]][] = $orig [ $attr_names [ $i ]][ $j ];
2004-02-07 18:34:26 +00:00
}
for ( $j = 0 ; $j < count ( $attributes [ $attr_names [ $i ]]); $j ++ ) {
if ( is_array ( $orig [ $attr_names [ $i ]])) {
if ( ! in_array ( $attributes [ $attr_names [ $i ]][ $j ], $orig [ $attr_names [ $i ]]))
2004-10-01 12:13:16 +00:00
if ( $attributes [ $attr_names [ $i ]][ $j ] != '' ) $toadd [ $attr_names [ $i ]][] = $attributes [ $attr_names [ $i ]][ $j ];
2004-02-07 18:34:26 +00:00
}
2004-10-01 12:13:16 +00:00
else if ( $attributes [ $attr_names [ $i ]][ $j ] != '' ) $toadd [ $attr_names [ $i ]][] = $attributes [ $attr_names [ $i ]][ $j ];
2004-02-07 18:34:26 +00:00
}
for ( $j = 0 ; $j < count ( $attributes [ $attr_names [ $i ]]); $j ++ ) {
if ( is_array ( $orig [ $attr_names [ $i ]]) && is_array ( $attributes [ $attr_names [ $i ]])) {
if (( $attributes [ $attr_names [ $i ]][ $j ] == $orig [ $attr_names [ $i ]][ $j ]) && $attributes [ $attr_names [ $i ]][ $j ] != '' )
2004-10-01 12:13:16 +00:00
$notchanged [ $attr_names [ $i ]][] = $attributes [ $attr_names [ $i ]][ $j ];
2004-02-07 18:34:26 +00:00
}
}
}
2004-09-15 19:52:29 +00:00
// create modify with add and remove
2004-02-07 18:34:26 +00:00
if ( is_array ( $toadd )) {
$attributes2 = array_keys ( $toadd );
for ( $i = 0 ; $i < count ( $attributes2 ); $i ++ ) {
2004-09-15 19:52:29 +00:00
if ( isset ( $torem [ $attributes2 [ $i ]]))
/* found modify entry
* Some ldap attributes must be set exactly one time .
* Adding or removing such an attribute wont ' t work
* because it would conflict with an ldap schema .
* Therefore when an attribute has only one entry
* and is set in $toadd and $torem this will be merged
* to $tomodify
*/
if (( count ( $toadd [ $attributes2 [ $i ]] == 0 )) && ( count ( $torem [ $attributes2 [ $i ]] == 0 ))) {
// found attribute which should only modified
$tomodify [ $attributes2 [ $i ]] = $toadd [ $attributes2 [ $i ]];
unset ( $toadd [ $attributes2 [ $i ]]);
unset ( $torem [ $attributes2 [ $i ]]);
2004-02-07 18:34:26 +00:00
}
}
}
if ( count ( $toadd ) != 0 ) $return [ $this -> dn ][ 'add' ] = $toadd ;
if ( count ( $torem ) != 0 ) $return [ $this -> dn ][ 'remove' ] = $torem ;
if ( count ( $tomodify ) != 0 ) $return [ $this -> dn ][ 'modify' ] = $tomodify ;
if ( count ( $notchanged ) != 0 ) $return [ $this -> dn ][ 'notchanged' ] = $notchanged ;
return $return ;
}
/* This function checks if all MUST - attribtues are set .
* If not it will return an array with all modules
* which have to be set first
*/
function check_attributes () {
$return = array ();
if ( is_array ( $this -> attributes )) {
// get named list of attributes
$attributes = array_keys ( $this -> attributes );
for ( $i = 0 ; $i < count ( $attributes ); $i ++ ) {
$singleattribute = array_keys ( $this -> attributes [ $attributes [ $i ]]);
for ( $j = 0 ; $j < count ( $singleattribute ); $j ++ ) {
// found attribute which must be set
if ( $this -> attributes [ $attributes [ $i ]][ $singleattribute [ $j ]] == 'MUST' ) {
// Check if attribute is set
2004-02-09 18:11:01 +00:00
if ( $this -> module [ $singleattribute [ $j ]] -> attributes [ $attributes [ $i ]] == '' ) {
2004-02-07 18:34:26 +00:00
if ( ! in_array ( $singleattribute [ $j ], $return )) $return [] = $singleattribute [ $j ];
2004-02-09 18:11:01 +00:00
}
2004-02-07 18:34:26 +00:00
}
}
}
return $return ;
}
}
/* This function will load an account .
* $dn is the dn of the account which should be loaded
*/
function load_account ( $dn ) {
2004-09-08 19:30:18 +00:00
$modules = call_user_func ( array ( $_SESSION [ 'config' ], 'get_' . ucfirst ( $this -> type ) . 'Modules' ));
2004-02-07 18:34:26 +00:00
$search = substr ( $dn , 0 , strpos ( $dn , ',' ));
2004-09-08 19:30:18 +00:00
$result = ldap_search ( $_SESSION [ 'ldap' ] -> server (), $dn , $search );
$entry = ldap_first_entry ( $_SESSION [ 'ldap' ] -> server (), $result );
2004-02-07 18:34:26 +00:00
$this -> dn = substr ( $dn , strpos ( $dn , ',' ) + 1 );
$this -> dn_orig = $dn ;
2004-09-08 19:30:18 +00:00
$attr = ldap_get_attributes ( $_SESSION [ 'ldap' ] -> server (), $entry );
2004-02-12 12:09:41 +00:00
2004-02-12 11:26:30 +00:00
foreach ( $modules as $module ) {
2004-06-08 18:54:37 +00:00
if ( ! isset ( $this -> module [ $module ])) {
$this -> module [ $module ] = new $module ( $this -> type );
$this -> module [ $module ] -> init ( $this -> base );
}
2004-02-12 11:26:30 +00:00
$this -> module [ $module ] -> load_attributes ( $attr );
2004-02-07 18:34:26 +00:00
}
// sortm modules and make all active because all required attributes should be set
$module = array_keys ( $this -> module );
$modulelist = array ();
// loop until all modules are in order.
// We don't want to loop forever
$remain = count ( $module ) * count ( $module );
$order = array ();
while ( ( count ( $module ) != count ( $modulelist )) && ( $remain != 0 ) ) {
$remain -- ;
foreach ( $module as $moduleitem ) {
$required = $this -> module [ $moduleitem ] -> get_dependencies ( $this -> type );
$everything_found = true ;
if ( is_array ( $required [ 'require' ])) {
foreach ( $required [ 'require' ] as $requireditem )
if ( ! in_array ( $reuquireditem , $modulelist )) $everthing_found = false ;
}
if ( $everything_found && ! in_array ( $moduleitem , $order ) ) $order [] = $moduleitem ;
}
}
// Write Module-Order in variable
2004-09-08 10:07:25 +00:00
$this -> order = array_merge ( 'main' , $order );
2004-02-07 18:34:26 +00:00
return 0 ;
}
2004-04-03 14:47:33 +00:00
/**
* Returns an hash array containing all profile options
*/
function getProfileOptions () {
2004-02-07 18:34:26 +00:00
$return = array ();
2004-04-03 14:47:33 +00:00
$modules = array_keys ( $this -> module );
foreach ( $modules as $singlemodule ) {
$return [ $singlemodule ] = $this -> module [ $singlemodule ] -> get_profileOptions ();
2004-02-07 18:34:26 +00:00
}
2004-04-03 14:47:33 +00:00
return $return ;
}
2004-02-07 18:34:26 +00:00
2004-07-01 15:54:33 +00:00
/**
* Checks the input values of an account profile .
*
* @ param array $options list of input values
* @ return array list of error messages
*/
function checkProfileOptions ( $options ) {
$return = array ();
$modules = array_keys ( $this -> module );
foreach ( $modules as $singlemodule ) {
$temp = $this -> module [ $singlemodule ] -> check_profileOptions ( $options );
$return = array_merge ( $return , $temp );
}
return $return ;
}
2004-03-14 17:35:22 +00:00
// TODO remove this function?
2004-02-07 18:34:26 +00:00
function proccess_profile ( $post ) {
$return = array ();
$module = array_keys ( $this -> module );
foreach ( $module as $singlemodule ) {
// get list of display functions.
$list = $this -> module [ $singlemodule ] -> pages ();
foreach ( $list as $item ) {
$function = 'display_html_' . $item ;
$page = $this -> module [ $singlemodule ] -> $function ( $post , true );
//eval($function);
$return = array_merge ( $return , $page );
}
}
return $return ;
}
/* This function will prepare the object
* for a new account
*/
function new_account () {
2004-04-03 14:47:33 +00:00
$temp = ucfirst ( $this -> type );
$modules = call_user_func ( array ( & $_SESSION [ 'config' ], 'get_' . $temp . 'Modules' ));
2004-06-08 18:54:37 +00:00
foreach ( $modules as $module ) {
$this -> module [ $module ] = new $module ( $this -> type );
$this -> module [ $module ] -> init ( $this -> base );
}
2004-02-07 18:34:26 +00:00
$module = array_keys ( $this -> module );
2004-02-13 09:48:14 +00:00
$modulelist = array ();
2004-02-07 18:34:26 +00:00
// loop until all modules are in order.
// We don't want to loop forever
$remain = count ( $module ) * count ( $module );
$order = array ();
while ( ( count ( $module ) != count ( $modulelist )) && ( $remain != 0 ) ) {
$remain -- ;
foreach ( $module as $moduleitem ) {
$required = $this -> module [ $moduleitem ] -> get_dependencies ( $this -> type );
$everything_found = true ;
if ( is_array ( $required [ 'require' ])) {
foreach ( $required [ 'require' ] as $requireditem )
if ( ! in_array ( $reuquireditem , $modulelist )) $everthing_found = false ;
}
if ( $everything_found && ! in_array ( $moduleitem , $order ) ) $order [] = $moduleitem ;
}
}
// Write Module-Order in variable
2004-09-08 10:07:25 +00:00
$this -> order = array_merge ( 'main' , $order );
2004-02-07 18:34:26 +00:00
// *** fixme load*Profile must return array in the same way ldap_get_attributes does.
$function = '$newattributes = load' . ucfirst ( $this -> type ) . 'Profile(\'default\');' ;
//eval($function);
return 0 ;
}
2004-09-15 19:52:29 +00:00
/* This function will save an account .
2004-02-07 18:34:26 +00:00
*/
function save_account () {
$module = array_keys ( $this -> module );
$attributes = array ();
// load attributes
foreach ( $module as $singlemodule ) {
// load changes
$temp = $this -> module [ $singlemodule ] -> save_attributes ();
// merge changes
$DNs = array_keys ( $temp );
// *** fixme don't include references
$attributes = array_merge_recursive ( $temp , $attributes );
for ( $i = 0 ; $i < count ( $DNs ); $i ++ ) {
$ops = array_keys ( $temp [ $DNs [ $i ]]);
for ( $j = 0 ; $j < count ( $ops ); $j ++ ) {
$attrs = array_keys ( $temp [ $DNs [ $i ]][ $ops [ $j ]]);
for ( $k = 0 ; $k < count ( $attrs ); $k ++ )
$attributes [ $DNs [ $i ]][ $ops [ $j ]][ $attrs [ $k ]] = array_unique ( $attributes [ $DNs [ $i ]][ $ops [ $j ]][ $attrs [ $k ]]);
}
}
}
// Complete dn with uid or cn=
if ( $this -> type == 'group' ) $search = 'cn' ;
else $search = 'uid' ;
$added = false ;
foreach ( $attributes as $DN ) {
if ( isset ( $DN [ 'modify' ][ $search ][ 0 ]) && ! $added ) {
$attributes [ $search . '=' . $DN [ 'modify' ][ $search ][ 0 ] . ',' . $this -> dn ] = $attributes [ $this -> dn ];
unset ( $attributes [ $this -> dn ]);
$this -> dn = $search . '=' . $DN [ 'modify' ][ $search ][ 0 ] . ',' . $this -> dn ;
$added = true ;
}
if ( isset ( $DN [ 'add' ][ $search ][ 0 ]) && ! $added ) {
$attributes [ $search . '=' . $DN [ 'add' ][ $search ][ 0 ] . ',' . $this -> dn ] = $attributes [ $this -> dn ];
unset ( $attributes [ $this -> dn ]);
$this -> dn = $search . '=' . $DN [ 'add' ][ $search ][ 0 ] . ',' . $this -> dn ;
$added = true ;
}
if ( isset ( $DN [ 'notchanged' ][ $search ][ 0 ]) && ! $added ) {
$attributes [ $search . '=' . $DN [ 'notchanged' ][ $search ][ 0 ] . ',' . $this -> dn ] = $attributes [ $this -> dn ];
unset ( $attributes [ $this -> dn ]);
$this -> dn = $search . '=' . $DN [ 'notchanged' ][ $search ][ 0 ] . ',' . $this -> dn ;
$added = true ;
}
}
// Add old dn if dn hasn't changed
if ( ! $added ) {
$attributes [ $this -> dn_orig ] = $attributes [ $this -> dn ];
unset ( $attributes [ $this -> dn ]);
$this -> dn = $this -> dn_orig ;
}
// Set to true if an real error has happened
$stopprocessing = false ;
// Add new DN
if ( isset ( $attributes [ $DNs [ $i ]][ 'errors' ])) {
foreach ( $attributes [ $DNs [ $i ]][ 'errors' ] as $singleerror ) {
$errors [] = $singleerror ;
if ( $singleerror [ 0 ] = 'ERROR' ) $stopprocessing = true ;
}
}
// fixme *** ad update_cache after every ldap-change
2004-09-08 10:58:56 +00:00
print_r ( $attributes );
2004-02-07 18:34:26 +00:00
if ( ! $stopprocessing ) {
if ( $this -> dn != $this -> dn_orig ) {
// move existing DN
if ( $this -> dn_orig != '' ) {
// merge attributes together
$attr = array_merge_recursive ( $attributes [ $this -> dn ][ 'add' ], $attributes [ $this -> dn ][ 'notchanged' ], $attributes [ $this -> dn ][ 'modify' ]);
2004-09-08 19:30:18 +00:00
$success = ldap_add ( $_SESSION [ 'ldap' ] -> server (), $this -> dn , $attr );
2004-02-07 18:34:26 +00:00
if ( $success ) {
2004-09-14 11:53:33 +00:00
$_SESSION [ 'cache' ] -> update_cache ( $this -> $dn , 'add' , $attr );
2004-09-08 19:30:18 +00:00
$success = ldap_delete ( $_SESSION [ 'ldap' ] -> server (), $this -> dn_orig );
2004-02-07 18:34:26 +00:00
if ( ! $success ) {
$errors [] = array ( 'ERROR' , 'LDAP' , sprintf ( _ ( 'Was unable to delete dn: %s.' ), $this -> dn_orig ));
$stopprocessing = true ;
}
if ( $success )
2004-09-14 11:53:33 +00:00
$_SESSION [ 'cache' ] -> update_cache ( $this -> $dn , 'delete_dn' );
2004-02-07 18:34:26 +00:00
}
if ( ! $success ) {
$errors [] = array ( 'ERROR' , 'LDAP' , sprintf ( _ ( 'Was unable to create dn: %s. This is possible a bug. Please check your ldap logs and send a bug report if it is a possible bug.' ), $this -> dn ));
$stopprocessing = true ;
}
}
// create complete new dn
else {
$attr = array_merge_recursive ( $attributes [ $this -> dn ][ 'add' ], $attributes [ $this -> dn ][ 'notchanged' ], $attributes [ $this -> dn ][ 'modify' ]);
2004-09-08 19:30:18 +00:00
$success = ldap_add ( $_SESSION [ 'ldap' ] -> server (), $this -> dn , $attr );
2004-02-07 18:34:26 +00:00
if ( ! $success ) {
$errors [] = array ( 'ERROR' , 'LDAP' , sprintf ( _ ( 'Was unable to create dn: %s. This is possible a bug. Please check your ldap logs and send a bug report if it is a possible bug.' ), $this -> dn ));
$stopprocessing = true ;
}
else
2004-09-14 11:53:33 +00:00
$_SESSION [ 'cache' ] -> update_cache ( $this -> $dn , 'add' , $attr );
2004-02-07 18:34:26 +00:00
}
unset ( $attributes [ $this -> dn ]);
}
}
$DNs = array_keys ( $attributes );
for ( $i = 0 ; $i < count ( $DNs ); $i ++ ) {
if ( ! $stopprocessing ) {
// modify attributes
if ( isset ( $attributes [ $DNs [ $i ]][ 'modify' ]) && ! $stopprocessing ) {
2004-09-08 19:30:18 +00:00
$success = @ ldap_mod_replace ( $_SESSION [ 'ldap' ] -> server (), $DNs [ $i ], $attributes [ $DNs [ $i ]][ 'modify' ]);
2004-02-07 18:34:26 +00:00
if ( ! $success ) {
$errors [] = array ( 'ERROR' , 'LDAP' , sprintf ( _ ( 'Was unable to modify attribtues from dn: %s. This is possible a bug. Please check your ldap logs and send a bug report if it is a possible bug.' ), $DNs [ $i ]));
$stopprocessing = true ;
}
else
2004-09-14 11:53:33 +00:00
$_SESSION [ 'cache' ] -> update_cache ( $this -> $dn , 'modify' , $attributes [ $this -> dn ][ 'modify' ]);
2004-02-07 18:34:26 +00:00
}
// add attributes
if ( isset ( $attributes [ $DNs [ $i ]][ 'add' ]) && ! $stopprocessing ) {
2004-09-08 19:30:18 +00:00
$success = @ ldap_mod_add ( $_SESSION [ 'ldap' ] -> server (), $DNs [ $i ], $attributes [ $DNs [ $i ]][ 'add' ]);
2004-02-07 18:34:26 +00:00
if ( ! $success ) {
$errors [] = array ( 'ERROR' , 'LDAP' , sprintf ( _ ( 'Was unable to add attribtues to dn: %s. This is possible a bug. Please check your ldap logs and send a bug report if it is a possible bug.' ), $DNs [ $i ]));
$stopprocessing = true ;
}
else
2004-09-14 11:53:33 +00:00
$_SESSION [ 'cache' ] -> update_cache ( $this -> $dn , 'add' , $attributes [ $this -> dn ][ 'add' ]);
2004-02-07 18:34:26 +00:00
}
// removce attributes
if ( isset ( $attributes [ $DNs [ $i ]][ 'remove' ]) && ! $stopprocessing ) {
2004-09-08 19:30:18 +00:00
$success = @ ldap_mod_del ( $_SESSION [ 'ldap' ] -> server (), $DNs [ $i ], $attributes [ $DNs [ $i ]][ 'remove' ]);
2004-02-07 18:34:26 +00:00
if ( ! $success ) {
$errors [] = array ( 'ERROR' , 'LDAP' , sprintf ( _ ( 'Was unable to remove attribtues from dn: %s. This is possible a bug. Please check your ldap logs and send a bug report if it is a possible bug.' ), $DNs [ $i ]));
$stopprocessing = true ;
}
else
2004-09-14 11:53:33 +00:00
$_SESSION [ 'cache' ] -> update_cache ( $this -> $dn , 'remove' , $attributes [ $this -> dn ][ 'remove' ]);
2004-02-07 18:34:26 +00:00
}
}
}
if ( ! $stopprocessing ) {
foreach ( $attributes as $DN ) {
if ( is_array ( $DN [ 'lamdaemon' ][ 'command' ])) $result = $this -> lamdaemon ( $DN [ 'lamdaemon' ][ 'command' ]);
// Error somewhere in lamdaemon
2004-09-08 10:58:56 +00:00
if ( is_array ( $result ))
foreach ( $result as $singleresult ) {
if ( is_array ( $singleresult )) {
if ( $singleresult [ 0 ] = 'ERROR' ) $stopprocessing = true ;
$temparray [ 0 ] = $singleresult [ 0 ];
$temparray [ 1 ] = _ ( $singleresult [ 1 ]);
$temparray [ 2 ] = _ ( $singleresult [ 2 ]);
$errors [] = $temparray ;
}
2004-02-07 18:34:26 +00:00
}
}
}
if ( count ( $errors ) != 0 ) return $errors ;
return 0 ;
}
function lamdaemon ( $commands ) {
// get username and password of the current lam-admin
2004-09-08 19:30:18 +00:00
$ldap_q = $_SESSION [ 'ldap' ] -> decrypt_login ();
2004-02-07 18:34:26 +00:00
/* $towrite has the following syntax :
* admin - username , admin - password , owner of homedir , 'home' , operation = 'add'
* use escapeshellarg to make exec () shell - safe
*/
2004-09-08 19:30:18 +00:00
$towrite = escapeshellarg ( $_SESSION [ 'config' ] -> scriptServer ) . " " . escapeshellarg ( $_SESSION [ 'config' ] -> scriptPath ) . " " .
2004-02-07 18:34:26 +00:00
escapeshellarg ( $ldap_q [ 0 ]) . ' ' . escapeshellarg ( $ldap_q [ 1 ]);
$userstring = implode ( " \n " , $commands );
if ( function_exists ( proc_open )) {
// New Code, requires PHP 4.3
$descriptorspec = array (
0 => array ( " pipe " , " r " ), // stdin
1 => array ( " pipe " , " w " ), // stout
2 => array ( " file " , " /dev/null " , " a " ) // sterr
);
$process = proc_open ( escapeshellarg ( $_SESSION [ 'lampath' ] . " lib/lamdaemon.pl " ) . " " . $towrite ,
$descriptorspec ,
$pipes );
if ( is_resource ( $process )) {
/* perl - script is running
* $pipes [ 0 ] is writeable handle to child stdin
* $pipes [ 1 ] is readable handle to child stdout
* any error is send to / dev / null
*/
// Write to stdin
fwrite ( $pipes [ 0 ], $userstring );
}
fclose ( $pipes [ 0 ]);
while ( ! feof ( $pipes [ 1 ])) {
$output = fgets ( $pipes [ 1 ], 1024 );
if ( $output != '' ) $output_array [] = $output ;
}
fclose ( $pipes [ 1 ]);
proc_close ( $process );
}
else { // PHP 4.3>
$command = escapeshellarg ( $_SESSION [ 'lampath' ] . " lib/lamdaemon.pl " ) . " " . $towrite ;
$pipe = popen ( " echo \" $userstring\ " | $command " , 'r');
while ( ! feof ( $pipe )) {
//$output .= fread($pipe, 1024);
$output = fgets ( $pipe , 1024 );
if ( $output != '' ) $output_array [] = $output ;
}
pclose ( $pipe );
}
return $output_array ;
}
2004-05-23 15:23:00 +00:00
2004-09-09 07:10:14 +00:00
/**
*
*
* @ param string account_type
*
* @ return
*/
2004-05-23 15:23:00 +00:00
function get_pdfEntries ( $acount_type ) {
$return = array ();
2004-05-27 17:46:11 +00:00
while (( $current = current ( $this -> module )) != null ) {
2004-05-27 17:42:19 +00:00
$return = array_merge ( $return , $current -> get_pdfEntries ( $account_type ));
2004-05-27 18:06:19 +00:00
next ( $this -> module );
2004-05-23 15:23:00 +00:00
}
2004-09-08 10:07:25 +00:00
$return = array_merge ( $return , array ( 'main_dn' => array ( '<block><key>' . _ ( 'DN' ) . '</key><value>' . $this -> dn . '</value></block>' )));
2004-05-23 15:23:00 +00:00
return $return ;
}
2004-05-30 13:43:42 +00:00
2004-09-09 07:10:14 +00:00
/**
*
*
* @ return
*/
2004-05-30 13:43:42 +00:00
function getAvailablePDFFields () {
$return = array ();
2004-06-03 14:26:48 +00:00
foreach ( $this -> module as $moduleName => $module ) {
$return [ $moduleName ] = $module -> get_pdfFields ( $this -> type );
2004-05-30 13:43:42 +00:00
}
2004-09-08 10:07:25 +00:00
$return [ 'main' ] = array ( 'dn' );
2004-05-30 13:43:42 +00:00
return $return ;
}
2004-09-08 19:30:18 +00:00
/**
* Returns an array containing all input columns for the file upload .
*
* Syntax :
* < br > array (
* < br > string : name , // fixed non-translated name which is used as column name (should be of format: <module name>_<column name>)
* < br > string : description , // short descriptive name
* < br > string : help , // help ID
* < br > string : example , // example value
* < br > boolean : required // true, if user must set a value for this column
* < br > )
*
* @ return array column list
*/
function get_uploadColumns () {
$return = array ();
foreach ( $this -> module as $moduleName => $module ) {
$return [ $moduleName ] = $module -> get_uploadColumns ();
}
return $return ;
}
2004-02-07 18:34:26 +00:00
}
2004-09-08 10:07:25 +00:00
?>