2004-01-30 10:26:04 +00:00
< ? php
/*
$Id $
This code is part of LDAP Account Manager ( http :// www . sourceforge . net / projects / lam )
2007-01-14 18:41:42 +00:00
Copyright ( C ) 2003 - 2007 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 .
2006-08-14 17:29:45 +00:00
*
2004-06-20 19:23:04 +00:00
* @ 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-12-09 19:10:57 +00:00
/** lamdaemon functions */
include_once ( " lamdaemon.inc " );
2006-04-23 16:33:25 +00:00
/** security functions */
include_once ( " security.inc " );
2006-08-14 17:29:45 +00:00
2004-06-20 19:23:04 +00:00
/**
* This includes all module files .
2004-02-10 19:59:41 +00:00
*/
2004-10-14 14:09:44 +00:00
$modulesINC_dirname = substr ( __FILE__ , 0 , strlen ( __FILE__ ) - 12 ) . " /modules " ;
$modulesINC_dir = dir ( $modulesINC_dirname );
// get module names.
while ( $entry = $modulesINC_dir -> read ())
if (( substr ( $entry , strlen ( $entry ) - 4 , 4 ) == '.inc' ) && is_file ( $modulesINC_dirname . '/' . $entry )) {
include_once ( $modulesINC_dirname . '/' . $entry );
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 ) {
2004-10-17 09:52:58 +00:00
$mods = $_SESSION [ 'config' ] -> get_AccountModules ( $scope );
2004-02-23 16:55:51 +00:00
$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 ++ ) {
2005-01-10 10:57:04 +00:00
$module = new $mods [ $i ]( $scope );
$modinfo = $module -> get_ldap_filter ();
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 ) {
2004-10-17 09:52:58 +00:00
$mods = $_SESSION [ 'config' ] -> get_AccountModules ( $scope );
2004-10-06 18:17:22 +00:00
$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
2005-08-13 09:49:28 +00:00
$return = array_values ( array_unique ( $attrs_high ));
for ( $i = 0 ; $i < sizeof ( $attrs_normal ); $i ++ ) {
if ( ! in_array ( $attrs_normal [ $i ], $return )) $return [] = $attrs_normal [ $i ];
}
for ( $i = 0 ; $i < sizeof ( $attrs_low ); $i ++ ) {
if ( ! in_array ( $attrs_low [ $i ], $return )) $return [] = $attrs_low [ $i ];
}
2004-10-06 18:17:22 +00:00
return $return ;
}
2004-06-20 19:23:04 +00:00
/**
2004-10-17 09:52:58 +00:00
* Returns a hash array ( module name => dependencies ) of all module dependencies
2004-06-20 19:23:04 +00:00
*
* " 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
2005-07-21 11:22:59 +00:00
* @ return boolean false if no conflict was found ,
2004-06-20 19:23:04 +00:00
* 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-10-14 14:09:44 +00:00
$dirname = substr ( __FILE__ , 0 , strlen ( __FILE__ ) - 12 ) . " /modules " ;
$dir = dir ( $dirname );
2004-05-23 15:51:21 +00:00
$return = array ();
2004-02-07 18:34:26 +00:00
// get module names.
2004-10-14 14:09:44 +00:00
while ( $entry = $dir -> read ())
if (( substr ( $entry , strlen ( $entry ) - 4 , 4 ) == '.inc' ) && is_file ( $dirname . '/' . $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-10-28 19:37:40 +00:00
$mods = $_SESSION [ 'config' ] -> get_AccountModules ( $scope );
$return = array ();
for ( $i = 0 ; $i < sizeof ( $mods ); $i ++ ) {
$module = new $mods [ $i ]( $scope );
$return [ $mods [ $i ]] = $module -> get_profileOptions ();
2004-02-08 15:57:55 +00:00
}
2004-10-28 19:37:40 +00:00
return $return ;
2004-04-03 14:47:33 +00:00
}
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-10-28 19:37:40 +00:00
$mods = $_SESSION [ 'config' ] -> get_AccountModules ( $scope );
$return = array ();
for ( $i = 0 ; $i < sizeof ( $mods ); $i ++ ) {
$module = new $mods [ $i ]( $scope );
$temp = $module -> check_profileOptions ( $options );
$return = array_merge ( $return , $temp );
2004-02-08 15:57:55 +00:00
}
2004-10-28 19:37:40 +00:00
return $return ;
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' );
2006-03-06 17:09:17 +00:00
$return [ $modules [ $i ]] = $m -> get_configOptions ( $scopes [ $modules [ $i ]], $scopes );
2004-07-24 17:14:39 +00:00
}
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 );
2007-10-05 18:09:49 +00:00
if ( isset ( $errors ) && is_array ( $errors )) {
$return = array_merge ( $return , $errors );
}
2004-07-24 17:14:39 +00:00
}
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' ));
2004-10-30 16:46:06 +00:00
return $moduleObject -> get_help ( $helpID );
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 ) {
2005-06-19 09:40:30 +00:00
$mods = $_SESSION [ 'config' ] -> get_AccountModules ( $scope );
$return = array ();
for ( $i = 0 ; $i < sizeof ( $mods ); $i ++ ) {
$module = new $mods [ $i ]( $scope );
$return [ $mods [ $i ]] = $module -> get_pdfFields ();
2004-05-30 13:43:42 +00:00
}
2005-06-19 09:40:30 +00:00
$return [ 'main' ] = array ( 'dn' );
return $return ;
2004-05-30 13:43:42 +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 ) {
2004-10-28 19:37:40 +00:00
$mods = $_SESSION [ 'config' ] -> get_AccountModules ( $scope );
$return = array ();
for ( $i = 0 ; $i < sizeof ( $mods ); $i ++ ) {
$module = new $mods [ $i ]( $scope );
$return [ $mods [ $i ]] = $module -> get_uploadColumns ();
2004-09-08 19:30:18 +00:00
}
2004-10-28 19:37:40 +00:00
return $return ;
2004-09-08 19:30:18 +00:00
}
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
2004-10-17 09:52:58 +00:00
$unOrdered = $_SESSION [ 'config' ] -> get_AccountModules ( $scope );
2004-09-19 08:26:33 +00:00
$ordered = array ();
$predepends = array ();
2004-10-17 09:36:36 +00:00
// get dependencies
2004-09-19 08:26:33 +00:00
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
2004-10-23 11:53:30 +00:00
StatusMessage ( " ERROR " , " Internal Error: Unable to find correct module order. " , " " );
2004-09-19 08:26:33 +00:00
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-17 15:55:26 +00:00
array_unshift ( $errors , array ( " INFO " , _ ( " Displayed account numbers start at \" 0 \" . Add 2 to get the row in your spreadsheet. " ), " " ));
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-10-19 18:18:46 +00:00
/**
* This function executes one post upload action .
*
* @ param string $scope account type
* @ param array $data array containing one account in each element
* @ param array $ids array ( < column_name > => < column number > )
* @ param array $failed list of accounts which were not created successfully
* @ return array current status
* < br > array (
* < br > 'status' => 'finished' | 'inProgress'
* < br > 'module' => < name of active module >
* < br > 'progress' => 0. . 100
* < br > 'errors' => array ( < array of parameters for StatusMessage > )
* < br > )
*/
function doUploadPostActions ( $scope , $data , $ids , $failed ) {
// check if function is called the first time
if ( ! isset ( $_SESSION [ 'mass_postActions' ][ 'remainingModules' ])) {
// make list of remaining modules
$moduleList = $_SESSION [ 'config' ] -> get_AccountModules ( $scope );
$_SESSION [ 'mass_postActions' ][ 'remainingModules' ] = $moduleList ;
}
$activeModule = $_SESSION [ 'mass_postActions' ][ 'remainingModules' ][ 0 ];
// initialize temporary variable
if ( ! isset ( $_SESSION [ 'mass_postActions' ][ $activeModule ])) {
$_SESSION [ 'mass_postActions' ][ $activeModule ] = array ();
}
// let first module do one post action
$module = new $activeModule ( $scope );
$return = $module -> doUploadPostActions ( $data , $ids , $failed , $_SESSION [ 'mass_postActions' ][ $activeModule ]);
// remove active module from list if already finished
if ( $return [ 'status' ] == 'finished' ) {
unset ( $_SESSION [ 'mass_postActions' ][ 'remainingModules' ][ 0 ]);
$_SESSION [ 'mass_postActions' ][ 'remainingModules' ] = array_values ( $_SESSION [ 'mass_postActions' ][ 'remainingModules' ]);
}
// update status and return back to upload page
$return [ 'module' ] = $activeModule ;
if ( sizeof ( $_SESSION [ 'mass_postActions' ][ 'remainingModules' ]) > 0 ) {
$return [ 'status' ] = 'inProgress' ;
}
else {
$return [ 'status' ] = 'finished' ;
}
return $return ;
}
2006-04-29 09:58:17 +00:00
/**
* Returns true if the module is a base module
*
* @ return array required extensions
*/
function getRequiredExtensions () {
$extList = array ();
$scopes = $_SESSION [ 'config' ] -> get_ActiveTypes ();
for ( $i = 0 ; $i < sizeof ( $scopes ); $i ++ ) {
$mods = $_SESSION [ 'config' ] -> get_AccountModules ( $scopes [ $i ]);
for ( $m = 0 ; $m < sizeof ( $mods ); $m ++ ) {
$module = new $mods [ $m ]( $scopes [ $i ]);
$ext = $module -> getRequiredExtensions ();
for ( $e = 0 ; $e < sizeof ( $ext ); $e ++ ) {
if ( ! in_array ( $ext [ $e ], $extList )) $extList [] = $ext [ $e ];
}
}
}
return $extList ;
}
2005-03-29 10:05:08 +00:00
/**
* Takes a list of meta - HTML elements and prints the equivalent HTML output .
*
* @ param string $module Name of account module
* @ param array $input List of meta - HTML elements
* @ param array $values List of values which override the defaults in $input ( name => value )
* @ param boolean $restricted If true then no buttons will be displayed
* @ param integer $tabindex Start value of tabulator index for input fields
* @ param integer $tabindexLink Start value of tabulator index for links
2005-03-29 16:10:30 +00:00
* @ param string $scope Account type
2005-03-29 14:33:31 +00:00
* @ return array List of input field names and their type ( name => type )
2005-03-29 10:05:08 +00:00
*/
2005-03-29 16:10:30 +00:00
function parseHtml ( $module , $input , $values , $restricted , & $tabindex , & $tabindexLink , $scope ) {
2005-03-29 14:33:31 +00:00
$ret = array ();
2005-03-29 10:05:08 +00:00
if ( is_array ( $input )) {
echo " <table> \n " ;
for ( $i = 0 ; $i < count ( $input ); $i ++ ) { // $i = row number
// Draw column
echo " <tr> \n " ;
for ( $j = 0 ; $j < count ( $input [ $i ]); $j ++ ) { // $j = column number
// Draw cell
echo " <td " ;
if ( isset ( $input [ $i ][ $j ][ 'td' ][ 'align' ])) echo " align= \" " . $input [ $i ][ $j ][ 'td' ][ 'align' ] . " \" " ;
if ( isset ( $input [ $i ][ $j ][ 'td' ][ 'valign' ])) echo " valign= \" " . $input [ $i ][ $j ][ 'td' ][ 'valign' ] . " \" " ;
if ( isset ( $input [ $i ][ $j ][ 'td' ][ 'colspan' ])) echo " colspan= \" " . $input [ $i ][ $j ][ 'td' ][ 'colspan' ] . " \" " ;
if ( isset ( $input [ $i ][ $j ][ 'td' ][ 'rowspan' ])) echo " rowspan= \" " . $input [ $i ][ $j ][ 'td' ][ 'rowspan' ] . " \" " ;
2005-07-05 12:46:53 +00:00
if ( isset ( $input [ $i ][ $j ][ 'td' ][ 'width' ])) echo " width= \" " . $input [ $i ][ $j ][ 'td' ][ 'width' ] . " \" " ;
2005-03-29 10:05:08 +00:00
echo " > \n " ;
switch ( $input [ $i ][ $j ][ 'kind' ]) {
// plain text
case 'text' :
2006-01-23 18:40:47 +00:00
if ( isset ( $input [ $i ][ $j ][ 'text' ])) echo $input [ $i ][ $j ][ 'text' ];
2005-03-29 10:05:08 +00:00
break ;
// input fields
case 'input' :
2005-03-29 14:33:31 +00:00
$type = $input [ $i ][ $j ][ 'type' ];
2007-02-18 18:32:07 +00:00
if ( $restricted && (( $type == " submit " ) || ( $type == " reset " ))) break ; // no buttons in restricted mode
2005-03-29 10:05:08 +00:00
$output = " <input " ;
if ( $input [ $i ][ $j ][ 'name' ] != '' ) $output .= ' name="' . $input [ $i ][ $j ][ 'name' ] . '"' ;
2005-03-29 14:33:31 +00:00
if ( $type != '' ) $output .= ' type="' . $type . '"' ;
2007-03-21 13:06:40 +00:00
if ( isset ( $input [ $i ][ $j ][ 'size' ]) && ( $input [ $i ][ $j ][ 'size' ] != '' )) {
$output .= ' size="' . $input [ $i ][ $j ][ 'size' ] . '"' ;
}
if ( isset ( $input [ $i ][ $j ][ 'maxlength' ]) && ( $input [ $i ][ $j ][ 'maxlength' ] != '' )) {
$output .= ' maxlength="' . $input [ $i ][ $j ][ 'maxlength' ] . '"' ;
}
2005-03-29 14:33:31 +00:00
// checkbox
if ( $type == " checkbox " ) {
if ( isset ( $values [ $input [ $i ][ $j ][ 'name' ]])) {
2005-03-29 16:10:30 +00:00
if ( $values [ $input [ $i ][ $j ][ 'name' ]][ 0 ] == " true " ) $output .= ' checked' ;
2005-03-29 14:33:31 +00:00
}
elseif ( $input [ $i ][ $j ][ 'checked' ]) $output .= ' checked' ;
}
// other input element
else {
if ( isset ( $values [ $input [ $i ][ $j ][ 'name' ]])) {
2007-03-21 13:06:40 +00:00
$output .= ' value="' . htmlspecialchars ( $values [ $input [ $i ][ $j ][ 'name' ]][ 0 ], ENT_QUOTES , " UTF-8 " ) . '"' ;
}
elseif ( isset ( $input [ $i ][ $j ][ 'value' ]) && $input [ $i ][ $j ][ 'value' ] != '' ) {
$output .= ' value="' . htmlspecialchars ( $input [ $i ][ $j ][ 'value' ], ENT_QUOTES , " UTF-8 " ) . '"' ;
2005-03-29 14:33:31 +00:00
}
}
2006-01-23 18:40:47 +00:00
if ( isset ( $input [ $i ][ $j ][ 'disabled' ]) && ( $input [ $i ][ $j ][ 'disabled' ] == true )) $output .= ' disabled' ;
2005-03-29 10:05:08 +00:00
// Show taborder
else {
$output .= " tabindex= $tabindex " ;
$tabindex ++ ;
}
$output .= " > " ;
echo $output ;
2005-03-29 14:33:31 +00:00
$ret [ $input [ $i ][ $j ][ 'name' ]] = $type ; // save type
2005-03-29 10:05:08 +00:00
break ;
2006-03-06 15:29:36 +00:00
// text area
case 'textarea' :
echo " <textarea " ;
if ( isset ( $input [ $i ][ $j ][ 'name' ])) echo ' name="' . $input [ $i ][ $j ][ 'name' ] . '"' ;
if ( isset ( $input [ $i ][ $j ][ 'readonly' ]) && ( isset ( $input [ $i ][ $j ][ 'readonly' ]) === true )) echo ' readonly' ;
echo ' cols="' . $input [ $i ][ $j ][ 'cols' ] . '"' ;
echo ' rows="' . $input [ $i ][ $j ][ 'rows' ] . '"' ;
echo " > " ;
2007-03-21 13:06:40 +00:00
if ( isset ( $values [ $input [ $i ][ $j ][ 'name' ]])) {
2008-01-16 19:56:31 +00:00
echo htmlspecialchars ( implode ( " \r \n " , $values [ $input [ $i ][ $j ][ 'name' ]]), ENT_QUOTES , " UTF-8 " );
2007-03-21 13:06:40 +00:00
}
else {
echo htmlspecialchars ( $input [ $i ][ $j ][ 'value' ], ENT_QUOTES , " UTF-8 " );
}
2006-03-06 15:29:36 +00:00
echo " </textarea> " ;
2008-01-16 19:56:31 +00:00
$ret [ $input [ $i ][ $j ][ 'name' ]] = 'textarea' ; // save type
2006-03-06 15:29:36 +00:00
break ;
2005-03-29 10:05:08 +00:00
// inner fieldset
case 'fieldset' :
2007-08-19 13:50:20 +00:00
echo " <fieldset class= \" " . $scope . " edit \" > \n " ;
2005-03-29 10:05:08 +00:00
if ( $input [ $i ][ $j ][ 'legend' ] != '' ) echo " <legend> " . $input [ $i ][ $j ][ 'legend' ] . " </legend> \n " ;
2007-02-28 21:15:58 +00:00
$retTemp = parseHtml ( $module , $input [ $i ][ $j ][ 'value' ], $values , $restricted , $tabindex , $tabindexLink , $scope );
$ret = array_merge ( $ret , $retTemp );
2005-03-29 10:05:08 +00:00
echo " </fieldset> \n " ;
break ;
// selection
case 'select' :
2006-01-23 18:40:47 +00:00
if ( ! isset ( $input [ $i ][ $j ][ 'size' ])) $input [ $i ][ $j ][ 'size' ] = 1 ; // correct size if needed
2005-03-29 14:33:31 +00:00
if ( isset ( $input [ $i ][ $j ][ 'multiple' ])) {
echo " <select name= \" " . $input [ $i ][ $j ][ 'name' ] . '[]"' ;
echo ' multiple' ;
$ret [ $input [ $i ][ $j ][ 'name' ]] = 'multiselect' ; // save type
}
else {
echo " <select name= \" " . $input [ $i ][ $j ][ 'name' ] . '"' ;
$ret [ $input [ $i ][ $j ][ 'name' ]] = 'select' ; // save type
}
echo ' size="' . $input [ $i ][ $j ][ 'size' ] . '"' ;
2008-01-19 13:06:03 +00:00
if ( ! $restricted && isset ( $input [ $i ][ $j ][ 'onchange' ])) {
echo ' onchange="' . htmlspecialchars ( $input [ $i ][ $j ][ 'onchange' ]) . '"' ;
}
2005-03-29 14:33:31 +00:00
// Show taborder
echo " tabindex= $tabindex " ;
$tabindex ++ ;
echo " > \n " ;
// init option fields
2005-03-29 10:05:08 +00:00
if ( ! is_array ( $input [ $i ][ $j ][ 'options' ])) $input [ $i ][ $j ][ 'options' ] = array ( $input [ $i ][ $j ][ 'options' ] );
if ( isset ( $input [ $i ][ $j ][ 'options_selected' ])) {
if ( ! is_array ( $input [ $i ][ $j ][ 'options_selected' ])) {
// one selected element
$input [ $i ][ $j ][ 'options_selected' ] = array ( $input [ $i ][ $j ][ 'options_selected' ] );
}
}
else {
$input [ $i ][ $j ][ 'options_selected' ] = array ();
}
2005-03-29 14:33:31 +00:00
if ( isset ( $values [ $input [ $i ][ $j ][ 'name' ]])) $input [ $i ][ $j ][ 'options_selected' ] = $values [ $input [ $i ][ $j ][ 'name' ]];
2005-03-29 10:05:08 +00:00
// merge both option arrays and sort them.
2006-03-14 17:58:52 +00:00
$options = $input [ $i ][ $j ][ 'options' ];
if ( ! isset ( $input [ $i ][ $j ][ 'descriptiveOptions' ]) || ( $input [ $i ][ $j ][ 'descriptiveOptions' ] === false )) {
// merge both option arrays and sort them.
$options = array_merge ( $input [ $i ][ $j ][ 'options' ], $input [ $i ][ $j ][ 'options_selected' ] );
$options = array_unique ( $options );
}
2006-01-24 14:23:42 +00:00
if ( ! isset ( $input [ $i ][ $j ][ 'noSorting' ]) || ! $input [ $i ][ $j ][ 'noSorting' ]) {
2005-10-25 18:17:01 +00:00
sort ( $options );
2005-08-13 11:31:26 +00:00
}
2005-03-29 10:05:08 +00:00
foreach ( $options as $option ) {
2006-03-14 17:58:52 +00:00
if ( isset ( $input [ $i ][ $j ][ 'descriptiveOptions' ]) && ( $input [ $i ][ $j ][ 'descriptiveOptions' ] === true )) {
2007-03-21 13:06:40 +00:00
if ( in_array ( $option [ 0 ], $input [ $i ][ $j ][ 'options_selected' ])) {
echo " <option value= \" " . htmlspecialchars ( $option [ 0 ], ENT_QUOTES , " UTF-8 " ) . " \" selected> " . htmlspecialchars ( $option [ 1 ], ENT_QUOTES , " UTF-8 " ) . " </option> \n " ;
}
else {
echo " <option value= \" " . htmlspecialchars ( $option [ 0 ], ENT_QUOTES , " UTF-8 " ) . " \" > " . htmlspecialchars ( $option [ 1 ], ENT_QUOTES , " UTF-8 " ) . " </option> \n " ;
}
2006-03-14 17:58:52 +00:00
}
elseif ( $option != '' ) {
2007-03-21 13:06:40 +00:00
if ( in_array ( $option , $input [ $i ][ $j ][ 'options_selected' ])) {
echo " <option selected> " . htmlspecialchars ( $option , ENT_QUOTES , " UTF-8 " ) . " </option> \n " ;
}
else {
echo " <option> " . htmlspecialchars ( $option , ENT_QUOTES , " UTF-8 " ) . " </option> \n " ;
}
2005-03-29 10:05:08 +00:00
}
}
echo " </select> \n " ;
break ;
// sub table
case 'table' :
2005-07-11 18:53:53 +00:00
$retTemp = parseHtml ( $module , $input [ $i ][ $j ][ 'value' ], $values , $restricted , $tabindex , $tabindexLink , $scope );
$ret = array_merge ( $ret , $retTemp );
2005-03-29 10:05:08 +00:00
break ;
// help link
case 'help' :
2005-04-05 12:04:37 +00:00
$helpPath = " ../ " ;
2005-04-23 16:54:34 +00:00
if ( is_file ( " ./help.php " )) $helpPath = " " ;
2007-10-28 19:40:30 +00:00
echo " <a href= \" " . $helpPath . " help.php?module= $module &HelpNumber= " . $input [ $i ][ $j ][ 'value' ] . " &scope= " . $scope . " \" target= \" help \" tabindex= $tabindexLink > " ;
2005-04-23 16:54:34 +00:00
echo " <img src= \" ../ $helpPath /graphics/help.png \" alt= \" " . _ ( 'Help' ) . " \" title= \" " . _ ( 'Help' ) . " \" > " ;
echo " </a> \n " ;
2005-03-29 10:05:08 +00:00
$tabindexLink ++ ;
break ;
// status message
case 'message' :
StatusMessage ( $input [ $i ][ $j ][ 'type' ], $input [ $i ][ $j ][ 'headline' ], $input [ $i ][ $j ][ 'text' ]);
break ;
// image
case 'image' :
echo " <img " ;
if ( isset ( $input [ $i ][ $j ][ 'path' ])) echo 'src="' . $input [ $i ][ $j ][ 'path' ] . '" ' ;
if ( isset ( $input [ $i ][ $j ][ 'width' ])) echo 'width="' . $input [ $i ][ $j ][ 'width' ] . '" ' ;
if ( isset ( $input [ $i ][ $j ][ 'height' ])) echo 'height="' . $input [ $i ][ $j ][ 'height' ] . '" ' ;
if ( isset ( $input [ $i ][ $j ][ 'alt' ])) echo 'alt="' . $input [ $i ][ $j ][ 'alt' ] . '" ' ;
echo " > \n " ;
break ;
// error, unknown type
default :
echo " Unrecognized type: " . $input [ $i ][ $j ][ 'kind' ] . " \n " ;
break ;
}
2005-08-21 17:12:30 +00:00
echo " </td> \n " ;
2005-03-29 10:05:08 +00:00
}
echo " </tr> \n " ;
}
}
echo " </table> \n " ;
2005-03-29 14:33:31 +00:00
return $ret ;
2005-03-29 10:05:08 +00:00
}
2004-10-19 18:18:46 +00:00
2006-03-14 17:58:52 +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 {
2007-10-03 18:25:55 +00:00
2005-07-21 11:22:59 +00:00
/**
* Constructor
*
* @ param string $type account type
* @ param string $base key in $_SESSION where this object is saved
*/
2007-12-28 16:08:56 +00:00
function __construct ( $type , $base ) {
2004-02-07 18:34:26 +00:00
/* Set the type of account . Valid
* types are : user , group , host
*/
// Check input variable
2006-08-14 17:29:45 +00:00
2004-10-23 11:11:31 +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 );
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' ;
2005-04-29 15:20:48 +00:00
$this -> isNewAccount = false ;
2004-02-07 18:34:26 +00:00
return 0 ;
}
2005-04-29 15:20:48 +00:00
/**
* Array of all used attributes
2004-02-07 18:34:26 +00:00
* Syntax is attribute => array ( objectClass => MUST or MAY , ... )
*/
var $attributes ;
2006-08-14 17:29:45 +00:00
2005-04-29 15:20:48 +00:00
/**
* This variale stores the account type .
* Currently " user " , " group " and " host " are supported .
2004-02-07 18:34:26 +00:00
*/
2007-10-04 16:45:05 +00:00
private $type ;
2006-08-14 17:29:45 +00:00
2005-07-21 11:22:59 +00:00
/** This is an array with all module objects */
2007-10-04 16:45:05 +00:00
private $module ;
2006-08-14 17:29:45 +00:00
2005-05-02 17:41:09 +00:00
/** DN suffix of the account */
2004-02-07 18:34:26 +00:00
var $dn ;
2006-08-14 17:29:45 +00:00
2005-05-02 17:41:09 +00:00
/** DN suffix of account when it was loaded */
2004-02-07 18:34:26 +00:00
var $dn_orig ;
2006-08-14 17:29:45 +00:00
2005-05-02 17:41:09 +00:00
/** RDN attribute of this account */
var $rdn ;
2006-08-14 17:29:45 +00:00
2005-05-02 17:41:09 +00:00
/** original LDAP attributes when account was loaded from LDAP */
var $attributes_orig ;
2006-08-14 17:29:45 +00:00
2005-04-29 15:20:48 +00:00
/** Module order */
2007-10-04 16:45:05 +00:00
private $order ;
2006-08-14 17:29:45 +00:00
2005-04-29 15:20:48 +00:00
/** Name of accountContainer variable in session */
2007-10-03 18:25:55 +00:00
private $base ;
2006-08-14 17:29:45 +00:00
2005-04-29 15:20:48 +00:00
/** This variable stores the name of the currently displayed page */
2007-10-04 16:45:05 +00:00
private $current_page ;
2006-08-14 17:29:45 +00:00
2005-04-29 15:20:48 +00:00
/** This variable is set to the pagename of a subpage if it should be displayed */
2007-10-04 16:45:05 +00:00
private $subpage ;
2006-08-14 17:29:45 +00:00
2005-04-29 15:20:48 +00:00
/** True if this is a newly created account */
var $isNewAccount ;
2007-12-04 15:58:05 +00:00
private $lastLoadedProfile = '' ;
2004-02-07 18:34:26 +00:00
2007-10-01 17:46:55 +00:00
/**
* Returns the account module with the given class name
*
* @ param string $name class name ( e . g . posixAccount )
2007-10-10 16:45:30 +00:00
* @ return baseModule account module
2007-10-01 17:46:55 +00:00
*/
function getAccountModule ( $name ) {
if ( isset ( $this -> module [ $name ])) {
return $this -> module [ $name ];
}
else {
return null ;
}
2007-10-26 14:10:10 +00:00
}
/**
* Returns the included account modules .
*
* @ return array modules
*/
function getAccountModules () {
return $this -> module ;
}
2007-10-01 17:46:55 +00:00
2005-07-21 11:22:59 +00:00
/**
* Returns the accout type of this object ( e . g . user , group , host ) .
*
* @ return string account type
2004-02-07 18:34:26 +00:00
*/
function get_type () {
return $this -> type ;
}
2006-08-14 17:29:45 +00:00
2005-07-21 11:22:59 +00:00
/**
* This function is called when the user clicks on any button on the account pages .
* It prints the HTML code of each account page .
*/
2006-08-14 17:29:45 +00:00
function continue_main () {
2006-08-27 14:57:22 +00:00
$result = array ();
2007-12-26 18:49:04 +00:00
$stopProcessing = false ; // when set to true, no module options are displayed
$errorsOccured = false ;
2008-01-15 18:13:34 +00:00
$profileLoaded = $this -> loadProfileIfRequested ();
2004-09-08 10:07:25 +00:00
if ( $this -> subpage == '' ) $this -> subpage = 'attributes' ;
2007-12-26 18:49:04 +00:00
if ( isset ( $_POST [ 'accountContainerReset' ])) {
2006-09-16 13:26:18 +00:00
$result = $this -> load_account ( $this -> dn_orig );
}
2008-01-15 18:13:34 +00:00
elseif ( ! $profileLoaded ) {
2007-12-03 13:01:17 +00:00
// change dn suffix
2007-12-26 18:49:04 +00:00
if ( isset ( $_REQUEST [ 'suffix' ]) && ( $_REQUEST [ 'suffix' ] != '' )) {
$this -> dn = $_REQUEST [ 'suffix' ];
}
2007-12-04 15:24:34 +00:00
if ( isset ( $_REQUEST [ 'accountContainerSuffix' ]) && ( $_REQUEST [ 'accountContainerSuffix' ] != '' )) {
$this -> dn = $_REQUEST [ 'accountContainerSuffix' ];
}
2007-12-09 19:39:09 +00:00
// change RDN
2007-12-26 18:49:04 +00:00
if ( isset ( $_POST [ 'accountContainerRDN' ])) {
$this -> rdn = $_POST [ 'accountContainerRDN' ];
}
// create another account
if ( isset ( $_POST [ 'accountContainerCreateAgain' ])) {
// open fresh account page
unset ( $_SESSION [ $this -> base ]);
2007-12-28 09:10:07 +00:00
metaRefresh ( " edit.php?type= " . $this -> type . " &suffix= " . $this -> dn );
2007-12-26 18:49:04 +00:00
exit ();
}
// back to account list
if ( isset ( $_POST [ 'accountContainerBackToList' ])) {
// Return to account list
unset ( $_SESSION [ $this -> base ]);
metaRefresh ( " ../lists/list.php?type= " . $this -> type );
exit ;
}
// create PDF file
if ( isset ( $_POST [ 'accountContainerCreatePDF' ])) {
// display PDf-file
createModulePDF ( array ( $_SESSION [ $this -> base ]), $_POST [ 'pdfStructure' ]);
exit ;
}
// module actions
2008-01-01 15:00:46 +00:00
if (( sizeof ( $_POST ) > 0 ) && checkIfWriteAccessIsAllowed ()) {
2007-12-26 18:49:04 +00:00
$result = call_user_func ( array ( & $this -> module [ $this -> order [ $this -> current_page ]], 'process_' . $this -> subpage ));
if ( is_array ( $result )) { // messages were returned, check for errors
for ( $i = 0 ; $i < sizeof ( $result ); $i ++ ) {
if ( $result [ $i ][ 0 ] == 'ERROR' ) {
$errorsOccured = true ;
break ;
2005-05-10 16:51:32 +00:00
}
2004-09-08 10:07:25 +00:00
}
}
2004-02-07 18:34:26 +00:00
}
2007-12-26 18:49:04 +00:00
// save account
if ( ! $errorsOccured && isset ( $_POST [ 'accountContainerSaveAccount' ])) {
// check if all modules are complete
2007-12-04 15:58:05 +00:00
$modules = array_keys ( $this -> module );
2007-12-26 18:49:04 +00:00
$incompleteModules = array ();
foreach ( $modules as $module ) {
if ( ! $this -> module [ $module ] -> module_complete ()) {
$incompleteModules [] = $this -> module [ $module ] -> get_alias ();
2007-12-04 15:58:05 +00:00
}
}
2007-12-26 18:49:04 +00:00
if ( sizeof ( $incompleteModules ) > 0 ) {
StatusMessage ( 'INFO' , _ ( 'Some required information is missing' ),
sprintf ( _ ( 'Please set up all required attributes on page: %s' ), implode ( " , " , $incompleteModules )));
}
else {
// save account
$errors = $this -> save_account ();
if ( sizeof ( $errors ) > 0 ) {
$result = $errors ;
$stopProcessing = true ;
}
else {
$this -> printSuccessPage ();
return ;
}
2007-12-04 15:58:05 +00:00
}
}
2005-09-01 15:20:15 +00:00
}
2005-05-07 14:32:18 +00:00
// change to next page
if ( is_array ( $result )) { // messages were returned, check for errors
2006-08-16 17:42:35 +00:00
for ( $i = 0 ; $i < sizeof ( $result ); $i ++ ) {
if ( $result [ $i ][ 0 ] == 'ERROR' ) {
$errorsOccured = true ;
break ;
2005-05-07 14:32:18 +00:00
}
}
}
2005-09-01 15:20:15 +00:00
if ( ! $errorsOccured ) {
2005-09-07 12:58:34 +00:00
// go to subpage of current module
2006-08-14 17:29:45 +00:00
$postKeys = array_keys ( $_POST );
2005-09-01 15:20:15 +00:00
for ( $p = 0 ; $p < sizeof ( $postKeys ); $p ++ ) {
if ( is_string ( $postKeys [ $p ]) && ( strpos ( $postKeys [ $p ], 'form_subpage_' . $this -> order [ $this -> current_page ]) === 0 )) {
$temp = substr ( $postKeys [ $p ], strlen ( $this -> order [ $this -> current_page ]) + 14 );
$temp = explode ( '_' , $temp );
if ( sizeof ( $temp ) == 2 ) {
$this -> subpage = $temp [ 0 ];
}
}
}
2007-12-26 18:49:04 +00:00
for ( $i = 0 ; $i < count ( $this -> order ); $i ++ ) {
if ( isset ( $_POST [ 'form_main_' . $this -> order [ $i ]])) {
if ( $this -> module [ $this -> order [ $i ]] -> module_ready ()) {
$this -> current_page = $i ;
$this -> subpage = 'attributes' ;
}
else {
StatusMessage ( 'ERROR' , _ ( 'The module %s is not yet ready.' ),
_ ( 'Please enter the account information on the other pages first.' ),
array ( $this -> module [ $this -> order [ $i ]] -> get_alias ()));
2005-08-02 19:06:29 +00:00
}
2005-05-07 14:32:18 +00:00
}
2005-09-07 12:58:34 +00:00
}
2005-05-07 14:32:18 +00:00
}
2007-12-26 18:49:04 +00:00
$this -> printPageHeader ();
2004-10-12 13:34:00 +00:00
// Display error-messages
2005-05-10 16:51:32 +00:00
if ( is_array ( $result )) {
2006-08-16 17:42:35 +00:00
for ( $i = 0 ; $i < sizeof ( $result ); $i ++ ) {
call_user_func_array ( " StatusMessage " , $result [ $i ]);
2005-05-10 16:51:32 +00:00
}
2007-12-26 18:49:04 +00:00
if ( $stopProcessing ) {
2005-05-10 16:51:32 +00:00
echo " </body> \n " ;
echo " </html> \n " ;
2007-12-26 18:49:04 +00:00
return ;
2005-05-07 14:32:18 +00:00
}
}
2007-12-30 16:08:54 +00:00
if ( checkIfWriteAccessIsAllowed ()) {
$this -> printCommonControls ();
2007-12-11 18:52:07 +00:00
}
echo " <br> \n " ;
2007-08-23 18:33:54 +00:00
// create module menu
2007-08-19 13:50:20 +00:00
echo " <table class= \" " . $this -> type . " list \" border=0 width= \" 100% \" style= \" border-collapse: collapse; \" > \n " ;
2007-10-24 18:12:35 +00:00
echo " <tr class= \" " . $this -> type . " list \" valign= \" top \" ><td style= \" border-bottom: 1px solid;padding:0px; \" colspan=2> " ;
2007-12-26 18:49:04 +00:00
// tab menu
$this -> printModuleTabs ();
echo " </td></tr> \n " ;
// content header
echo " <tr class= \" " . $this -> type . " list \" > \n " ;
echo " <td style= \" padding:10px; \" > \n " ;
$this -> printContentHeader ();
echo " </td> \n " ;
echo " </tr> \n " ;
echo " <tr class= \" " . $this -> type . " list \" > \n " ;
// content area
echo " <td width= \" 100% \" style= \" padding:10px; \" > " ;
// display html-code from modules
$return = array ();
$return = call_user_func ( array ( $this -> module [ $this -> order [ $this -> current_page ]], 'display_html_' . $this -> subpage ));
$y = 5000 ;
$z = 10000 ;
parseHtml ( $this -> order [ $this -> current_page ], $return , array (), false , $y , $z , $this -> type );
// Display rest of html-page
echo " <br>* " . _ ( 'required' );
echo " </td></tr></table> \n " ;
$this -> printPageFooter ();
}
2007-12-30 16:08:54 +00:00
/**
* Prints common controls like the save button and the ou selection .
*/
private function printCommonControls () {
echo " <table class= \" " . $this -> type . " list \" style= \" border-width:0px; \" width= \" 100% \" ><tr> " ;
echo " <td align= \" left \" > " ;
// save button
echo " <input style= \" margin:2px; \" name= \" accountContainerSaveAccount \" type= \" submit \" value= \" " . _ ( 'Save' ) . " \" > \n " ;
// reset button
if ( $this -> dn_orig != '' ) {
echo " <input style= \" margin:2px; \" name= \" accountContainerReset \" type= \" submit \" value= \" " . _ ( 'Reset changes' ) . " \" > \n " ;
}
echo " </td> " ;
echo " <td align= \" right \" > " ;
// profile selection
$profilelist = getAccountProfiles ( $this -> type );
if ( sizeof ( $profilelist ) > 0 ) {
sort ( $profilelist );
echo " <select name= \" accountContainerSelectLoadProfile \" size=1> \n " ;
for ( $i = 0 ; $i < sizeof ( $profilelist ); $i ++ ) {
$selected = '' ;
if ( $profilelist [ $i ] === $this -> lastLoadedProfile ) {
$selected = 'selected' ;
}
echo " <option $selected > " . $profilelist [ $i ] . " </option> \n " ;
}
echo " </select> \n " ;
echo " <input type= \" submit \" name= \" accountContainerLoadProfile \" value= \" " . _ ( 'Load profile' ) . " \" > \n " ;
echo " <a href= \" ../help.php?HelpNumber=401 \" target= \" help \" tabindex=10001> " ;
echo " <img src= \" ../../graphics/help.png \" alt= \" " . _ ( 'Help' ) . " \" title= \" " . _ ( 'Help' ) . " \" > " ;
echo " </a> \n " ;
}
echo " </td> " ;
echo " </tr></table> " ;
}
2007-12-26 18:49:04 +00:00
/**
* Prints the header of the account pages .
*/
private function printPageHeader () {
echo $_SESSION [ 'header' ];
echo " <title>LDAP Account Manager</title> \n " ;
echo " <link rel= \" stylesheet \" type= \" text/css \" href= \" ../../style/layout.css \" > \n " ;
echo " <link rel= \" stylesheet \" type= \" text/css \" href= \" ../../style/type_ " . $this -> type . " .css \" > \n " ;
echo " </head><body> \n " ;
echo " <form enctype= \" multipart/form-data \" action= \" edit.php \" method= \" post \" > \n " ;
}
/**
* Prints the footer of the account pages .
*/
private function printPageFooter () {
echo " </form> \n " ;
echo " </body> \n " ;
echo " </html> \n " ;
}
/**
* Prints the HTML code to notify the user about the successful saving .
*
*/
private function printSuccessPage () {
$pdfStructures = getPDFStructureDefinitions ( $this -> type );
$this -> printPageHeader ();
// Show success message
if ( $this -> dn_orig == '' ) {
$text = _ ( " Account was created successfully. " );
}
else {
$text = _ ( " Account was modified successfully. " );
}
StatusMessage ( 'INFO' , _ ( 'LDAP operation successful.' ), $text );
echo " <br> \n " ;
2007-12-28 09:10:07 +00:00
echo " <table class= \" " . $this -> type . " list \" width= \" 100% \" style= \" border-width:0px; \" ><tr><td> \n " ;
2007-12-26 18:49:04 +00:00
echo " <input name= \" accountContainerCreateAgain \" type= \" submit \" value= \" " . _ ( 'Create another account' ) . " \" > \n " ;
2007-12-28 09:10:07 +00:00
echo " <input name= \" accountContainerBackToList \" type= \" submit \" value= \" " . _ ( 'Back to account list' ) . " \" > \n " ;
2007-12-26 18:49:04 +00:00
echo " " ;
echo " <select name= \" pdfStructure \" size=1> \n " ;
for ( $i = 0 ; $i < sizeof ( $pdfStructures ); $i ++ ) {
echo " <option> " . $pdfStructures [ $i ] . " </option> \n " ;
}
echo " </select> \n " ;
echo " <input name= \" accountContainerCreatePDF \" type= \" submit \" value= \" " . _ ( 'Create PDF file' ) . " \" > \n " ;
echo " <a href= \" ../help.php?HelpNumber=403 \" target= \" help \" ><img src= \" ../../graphics/help.png \" alt= \" " . _ ( " Help " ) . " \" title= \" " . _ ( " Help " ) . " \" ></a> \n " ;
2007-12-28 09:10:07 +00:00
echo " </td></tr></table> \n " ;
2007-12-26 18:49:04 +00:00
$this -> printPageFooter ();
}
/**
* Checks if the user requested to load a profile .
2008-01-15 18:13:34 +00:00
*
* @ return boolean true , if profile was loaded
2007-12-26 18:49:04 +00:00
*/
private function loadProfileIfRequested () {
if ( isset ( $_POST [ 'accountContainerLoadProfile' ]) && isset ( $_POST [ 'accountContainerSelectLoadProfile' ])) {
$profile = loadAccountProfile ( $_POST [ 'accountContainerSelectLoadProfile' ], $this -> type );
$this -> lastLoadedProfile = $_POST [ 'accountContainerSelectLoadProfile' ];
// pass profile to each module
$modules = array_keys ( $this -> module );
foreach ( $modules as $module ) $this -> module [ $module ] -> load_profile ( $profile );
if ( isset ( $profile [ 'ldap_rdn' ][ 0 ])) {
if ( in_array ( $profile [ 'ldap_rdn' ][ 0 ], getRDNAttributes ( $this -> type ))) {
$this -> rdn = $profile [ 'ldap_rdn' ][ 0 ];
}
}
if ( isset ( $profile [ 'ldap_suffix' ][ 0 ])) {
$this -> dn = $profile [ 'ldap_suffix' ][ 0 ];
}
2008-01-15 18:13:34 +00:00
return true ;
2007-12-26 18:49:04 +00:00
}
2008-01-15 18:13:34 +00:00
return false ;
2007-12-26 18:49:04 +00:00
}
/**
* Prints the HTML code of the module tabs .
*/
private function printModuleTabs () {
2005-08-24 17:53:03 +00:00
// calculate button width
2007-12-26 18:49:04 +00:00
$buttonWidth = 0 ;
for ( $b = 0 ; $b < sizeof ( $this -> order ); $b ++ ) {
2007-12-01 12:34:52 +00:00
$tempWidth = round ( 0.8 * strlen ( utf8_decode ( $this -> module [ $this -> order [ $b ]] -> get_alias ()))) + 2 ;
2005-08-24 17:53:03 +00:00
if ( $buttonWidth < $tempWidth ) $buttonWidth = $tempWidth ;
}
2007-12-26 18:49:04 +00:00
// $x is used to count up tabindex
2004-09-15 19:52:29 +00:00
$x = 0 ;
2007-10-24 18:12:35 +00:00
echo " <table width= \" 100% \" border=0 style= \" border-collapse: collapse; \" > " ;
2007-12-26 18:49:04 +00:00
echo " <tr> \n " ;
2004-02-07 18:34:26 +00:00
// Loop for module
2007-12-26 18:49:04 +00:00
for ( $i = 0 ; $i < count ( $this -> order ); $i ++ ) {
2007-10-03 18:25:55 +00:00
$buttonStatus = $this -> module [ $this -> order [ $i ]] -> getButtonStatus ();
// skip hidden buttons
if ( $buttonStatus == 'hidden' ) continue ;
2007-08-19 13:50:20 +00:00
$class = $this -> type . " list-head " ;
if ( $this -> order [ $this -> current_page ] == $this -> order [ $i ]) $class = $this -> type . " list-edit " ;
2007-10-24 18:12:35 +00:00
echo " <td width= \" $buttonWidth\ " style = \ " padding-bottom:0px;padding-right:5px;padding-left:5px;padding-top:10px; \" > \n " ;
2007-08-19 13:50:20 +00:00
echo " <table width= \" 100% \" style= \" border-collapse: collapse; \" > \n " ;
2007-10-03 18:25:55 +00:00
echo " <tr class= \" " . $class . " \" ><td onclick= \" document.getElementsByName('form_main_ " . $this -> order [ $i ] . " ')[0].click(); \" " ;
2007-12-01 12:34:52 +00:00
echo " align= \" center \" style= \" border: 1px solid;border-bottom: 0px solid;padding:5px; \" > \n " ;
2004-09-28 15:41:16 +00:00
// print normal button
2007-11-19 18:42:03 +00:00
$buttonImage = $this -> module [ $this -> order [ $i ]] -> getIcon ();
$buttonImageStyle = '' ;
$buttonSpace = '' ;
if ( $buttonImage != null ) {
2007-12-01 12:34:52 +00:00
$buttonImageStyle = 'background-image: url(../../graphics/' . $buttonImage . ');background-position: 2px center;background-repeat: no-repeat;height:32px;' ;
$buttonSpace = ' ' ;
2007-11-19 18:42:03 +00:00
}
$buttonStyle = $buttonImageStyle . 'background-color:transparent;width:' . $buttonWidth . 'em;border:0px solid;' ;
echo " <input style= \" " . $buttonStyle . " \" name= \" form_main_ " . $this -> order [ $i ] . " \" type= \" submit \" value= \" " ;
echo $buttonSpace . $this -> module [ $this -> order [ $i ]] -> get_alias ();
2005-05-10 16:51:32 +00:00
echo " \" tabindex= $x " ;
2007-12-26 18:49:04 +00:00
if ( $buttonStatus == 'disabled' ) echo " disabled " ;
2007-11-18 10:38:11 +00:00
echo " > \n " ;
2007-08-19 13:50:20 +00:00
echo " </td></tr></table> \n " ;
echo '</td>' ;
2004-09-28 15:41:16 +00:00
$x ++ ;
2005-08-26 08:53:16 +00:00
}
2007-12-26 18:49:04 +00:00
echo " <td width= \" 100% \" > </td></tr></table> \n " ;
2006-05-13 08:55:31 +00:00
}
2007-12-03 13:01:17 +00:00
/**
* Prints the head part of the content area .
*/
private function printContentHeader () {
echo " <table width= \" 100% \" border=0><tr> \n " ;
echo " <td align= \" left \" > \n " ;
// display DN
if ( isset ( $this -> dn_orig ) && ( $this -> dn_orig != '' )) {
2007-12-09 19:39:09 +00:00
echo _ ( " DN " ) . " : <b> " . htmlspecialchars ( $this -> dn_orig ) . " </b> " ;
2007-12-03 13:01:17 +00:00
}
echo " </td> \n " ;
echo " <td align= \" right \" > \n " ;
echo _ ( 'Suffix' ) . " : " ;
2007-12-04 15:24:34 +00:00
echo " <select name= \" accountContainerSuffix \" size=1> \n " ;
2007-12-03 13:01:17 +00:00
// loop through all suffixes
$rootsuffix = $_SESSION [ 'config' ] -> get_Suffix ( $this -> type );
foreach ( $_SESSION [ 'ldap' ] -> search_units ( $rootsuffix ) as $suffix ) {
echo " <option " ;
if ( $this -> dn == $suffix ) {
echo 'selected' ;
}
echo " > " . $suffix . " </option> \n " ;
}
2007-12-28 09:10:07 +00:00
if ( ! ( $this -> dn == '' ) && ! in_array ( $this -> dn , $_SESSION [ 'ldap' ] -> search_units ( $rootsuffix ))) {
2007-12-03 13:01:17 +00:00
echo " <option selected> " . $this -> dn . " </option> \n " ;;
}
echo " </select> \n " ;
2007-12-09 19:39:09 +00:00
echo ' ' ;
// RDN selection
$rdnlist = getRDNAttributes ( $this -> type );
echo _ ( 'RDN identifier' ) . " : " ;
echo " <select name= \" accountContainerRDN \" size=1> \n " ;
for ( $i = 0 ; $i < sizeof ( $rdnlist ); $i ++ ) {
echo " <option " ;
if ( $this -> rdn === $rdnlist [ $i ]) {
echo 'selected' ;
}
echo " > " . $rdnlist [ $i ] . " </option> \n " ;
}
echo " </select> \n " ;
echo " <a href= \" ../help.php?HelpNumber=301 \" target= \" help \" tabindex=10001> " ;
echo " <img src= \" ../../graphics/help.png \" alt= \" " . _ ( 'Help' ) . " \" title= \" " . _ ( 'Help' ) . " \" > " ;
echo " </a> \n " ;
2007-12-03 13:01:17 +00:00
echo " </td> \n " ;
echo " </tr></table> \n " ;
// separator line
echo '<hr noshade style="width: 100%; height: 2px;">' ;
}
2004-02-07 18:34:26 +00:00
2005-07-21 11:22:59 +00:00
/**
* This function checks which LDAP attributes have changed while the account was edited .
2006-08-14 17:29:45 +00:00
*
2005-07-21 11:22:59 +00:00
* @ param array $attributes list of current LDAP attributes
* @ param array $orig list of old attributes when account was loaded
* @ return array an array which can be passed to $this -> saveAccount ()
2004-02-07 18:34:26 +00:00
*/
function save_module_attributes ( $attributes , $orig ) {
2006-05-01 16:13:10 +00:00
$toadd = array ();
$tomodify = array ();
$torem = array ();
$notchanged = array ();
2006-09-03 12:29:44 +00:00
// get list of all attributes
2004-02-07 18:34:26 +00:00
$attr_names = array_keys ( $attributes );
2006-09-03 12:29:44 +00:00
$orig_names = array_keys ( $orig );
// find deleted attributes (in $orig but no longer in $attributes)
2007-10-28 12:31:31 +00:00
foreach ( $orig_names as $i => $value ) {
if ( ! isset ( $attributes [ $value ])) {
$torem [ $value ] = $orig [ $value ];
2006-09-03 12:29:44 +00:00
}
}
2006-05-07 08:49:47 +00:00
// find changed attributes
2007-10-28 12:31:31 +00:00
foreach ( $attr_names as $i => $name ) {
2006-05-07 08:49:47 +00:00
// find deleted attributes
2007-10-28 12:48:13 +00:00
if ( isset ( $orig [ $name ]) && is_array ( $orig [ $name ])) {
foreach ( $orig [ $name ] as $j => $value ) {
if ( is_array ( $attributes [ $name ])) {
if ( ! in_array ( $value , $attributes [ $name ])) {
if (( $value != '' ) && ( $name != 'objectClass' )) $torem [ $name ][] = $value ;
}
2004-02-07 18:34:26 +00:00
}
2007-10-28 12:48:13 +00:00
else if (( $value != '' ) && ( $name != 'objectClass' )) $torem [ $name ][] = $value ;
2004-02-07 18:34:26 +00:00
}
2006-05-07 08:49:47 +00:00
}
// find new attributes
2007-10-28 12:48:13 +00:00
if ( isset ( $attributes [ $name ]) && is_array ( $attributes [ $name ])) {
foreach ( $attributes [ $name ] as $j => $value ) {
if ( is_array ( $orig [ $name ])) {
if ( ! in_array ( $value , $orig [ $name ]))
if ( $value != '' ) {
$toadd [ $name ][] = $value ;
}
}
else if ( $value != '' ) $toadd [ $name ][] = $value ;
2004-02-07 18:34:26 +00:00
}
2006-05-07 08:49:47 +00:00
}
// find unchanged attributes
2007-10-28 12:31:31 +00:00
if ( is_array ( $orig [ $name ]) && is_array ( $attributes [ $name ])) {
2007-10-28 12:48:13 +00:00
foreach ( $attributes [ $name ] as $j => $value ) {
if (( $value != '' ) && in_array ( $value , $orig [ $name ])) {
$notchanged [ $name ][] = $value ;
2006-07-05 19:51:20 +00:00
}
2004-02-07 18:34:26 +00:00
}
}
2006-05-07 08:49:47 +00:00
}
2004-09-15 19:52:29 +00:00
// create modify with add and remove
2006-05-07 08:49:47 +00:00
$attributes2 = array_keys ( $toadd );
for ( $i = 0 ; $i < count ( $attributes2 ); $i ++ ) {
if ( isset ( $torem [ $attributes2 [ $i ]]))
if (( count ( $toadd [ $attributes2 [ $i ]]) > 0 ) && ( count ( $torem [ $attributes2 [ $i ]]) > 0 )) {
// found attribute which should be modified
$tomodify [ $attributes2 [ $i ]] = $toadd [ $attributes2 [ $i ]];
// merge unchanged values
if ( isset ( $notchanged [ $attributes2 [ $i ]])) {
$tomodify [ $attributes2 [ $i ]] = array_merge ( $tomodify [ $attributes2 [ $i ]], $notchanged [ $attributes2 [ $i ]]);
unset ( $notchanged [ $attributes2 [ $i ]]);
2004-02-07 18:34:26 +00:00
}
2006-05-07 08:49:47 +00:00
// remove old add and remove commands
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 ;
}
2005-07-21 11:22:59 +00:00
/**
* Loads an LDAP account with the given DN .
*
* @ param string $dn the DN of the account
2006-09-16 13:26:18 +00:00
* @ return array error messages
2004-02-07 18:34:26 +00:00
*/
function load_account ( $dn ) {
2006-09-16 13:26:18 +00:00
$this -> module = array ();
2004-10-17 09:36:36 +00:00
$modules = $_SESSION [ 'config' ] -> get_AccountModules ( $this -> type );
2004-02-07 18:34:26 +00:00
$search = substr ( $dn , 0 , strpos ( $dn , ',' ));
2006-09-16 13:26:18 +00:00
$result = @ ldap_search ( $_SESSION [ 'ldap' ] -> server (), $dn , $search );
if ( ! $result ) {
2006-10-26 17:49:50 +00:00
return array ( array ( " ERROR " , _ ( " Unable to load LDAP entry: " ) . " " . $dn , ldap_error ( $_SESSION [ 'ldap' ] -> server ())));
2006-09-16 13:26:18 +00:00
}
$entry = @ ldap_first_entry ( $_SESSION [ 'ldap' ] -> server (), $result );
if ( ! $entry ) {
2006-10-26 17:49:50 +00:00
return array ( array ( " ERROR " , _ ( " Unable to load LDAP entry: " ) . " " . $dn , ldap_error ( $_SESSION [ 'ldap' ] -> server ())));
2006-09-16 13:26:18 +00:00
}
2004-02-07 18:34:26 +00:00
$this -> dn = substr ( $dn , strpos ( $dn , ',' ) + 1 );
$this -> dn_orig = $dn ;
2005-05-02 17:41:09 +00:00
// extract RDN
$this -> rdn = split ( " = " , substr ( $dn , 0 , strpos ( $dn , ',' )));
$this -> rdn = $this -> rdn [ 0 ];
2004-09-08 19:30:18 +00:00
$attr = ldap_get_attributes ( $_SESSION [ 'ldap' ] -> server (), $entry );
2005-05-02 17:41:09 +00:00
// remove 'count' entries and numerical entries
for ( $i = 0 ; $i < count ( $attr ); $i ++ ) {
if ( isset ( $attr [ $i ])) unset ( $attr [ $i ]);
}
2006-01-23 19:26:16 +00:00
$attrNames = array_keys ( $attr );
2005-07-05 14:33:46 +00:00
for ( $i = 0 ; $i < sizeof ( $attrNames ); $i ++ ) unset ( $attr [ $attrNames [ $i ]][ 'count' ]);
unset ( $attr [ 'count' ]);
2006-04-05 15:48:27 +00:00
// fix spelling errors
$attr = $this -> fixLDAPAttributes ( $attr , $modules );
2005-12-05 14:27:47 +00:00
// get binary attributes
$binaryAttr = array ( 'jpegPhoto' );
for ( $i = 0 ; $i < sizeof ( $binaryAttr ); $i ++ ) {
if ( isset ( $attr [ $binaryAttr [ $i ]][ 0 ])) {
$binData = ldap_get_values_len ( $_SESSION [ 'ldap' ] -> server (), $entry , $binaryAttr [ $i ]);
unset ( $binData [ 'count' ]);
$attr [ $binaryAttr [ $i ]] = $binData ;
}
}
2005-05-02 17:41:09 +00:00
// save original attributes
$this -> attributes_orig = $attr ;
2006-08-14 17:29:45 +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
}
2005-08-23 12:16:58 +00:00
// sort module buttons
$this -> sortModules ();
2006-09-16 13:26:18 +00:00
return array ();
2006-04-05 15:48:27 +00:00
}
2006-08-14 17:29:45 +00:00
2006-04-05 15:48:27 +00:00
/**
* Fixes spelling errors in the attribute names .
*
* @ param array $attributes LDAP attributes
* @ param array $modules list of active modules
* @ return array fixed attributes
*/
function fixLDAPAttributes ( $attributes , $modules ) {
if ( ! is_array ( $attributes )) return $attributes ;
$keys = array_keys ( $attributes );
2006-05-01 16:13:10 +00:00
// get correct object class names, aliases and attributes
2006-04-05 15:48:27 +00:00
$objectClasses = array ();
2006-05-01 16:13:10 +00:00
$aliases = array ();
2006-07-23 15:03:35 +00:00
$ldapAttributesTemp = array ();
2006-04-05 15:48:27 +00:00
foreach ( $modules as $module ) {
$moduleObj = new $module ( $this -> type );
$objectClasses = array_merge ( $objectClasses , $moduleObj -> getManagedObjectClasses ());
2006-05-01 16:13:10 +00:00
$aliases = array_merge ( $aliases , $moduleObj -> getLDAPAliases ());
2006-07-23 15:03:35 +00:00
$ldapAttributesTemp = array_merge ( $ldapAttributesTemp , $moduleObj -> getManagedAttributes ());
2004-02-07 18:34:26 +00:00
}
2006-07-23 15:03:35 +00:00
// build lower case attribute names
$ldapAttributes = array ();
for ( $i = 0 ; $i < sizeof ( $ldapAttributesTemp ); $i ++ ) {
$ldapAttributes [ strtolower ( $ldapAttributesTemp [ $i ])] = $ldapAttributesTemp [ $i ];
unset ( $ldapAttributes [ $i ]);
}
$ldapAttributesKeys = array_keys ( $ldapAttributes );
2006-05-01 16:13:10 +00:00
// convert alias names to lower case (for easier comparison)
$aliasKeys = array_keys ( $aliases );
for ( $i = 0 ; $i < sizeof ( $aliasKeys ); $i ++ ) {
if ( $aliasKeys [ $i ] != strtolower ( $aliasKeys [ $i ])) {
$aliases [ strtolower ( $aliasKeys [ $i ])] = $aliases [ $aliasKeys [ $i ]];
unset ( $aliases [ $aliasKeys [ $i ]]);
$aliasKeys [ $i ] = strtolower ( $aliasKeys [ $i ]);
}
}
// fix object classes and attributes
2006-04-05 15:48:27 +00:00
for ( $i = 0 ; $i < sizeof ( $keys ); $i ++ ) {
2006-05-01 16:13:10 +00:00
// check object classes
2006-04-05 15:48:27 +00:00
if ( strtolower ( $keys [ $i ]) == 'objectclass' ) {
// fix object class attribute
if ( $keys [ $i ] != 'objectClass' ) {
$temp = $attributes [ $keys [ $i ]];
unset ( $attributes [ $keys [ $i ]]);
$attributes [ 'objectClass' ] = $temp ;
}
// fix object classes
for ( $attrClass = 0 ; $attrClass < sizeof ( $attributes [ 'objectClass' ]); $attrClass ++ ) {
for ( $modClass = 0 ; $modClass < sizeof ( $objectClasses ); $modClass ++ ) {
if ( strtolower ( $attributes [ 'objectClass' ][ $attrClass ]) == strtolower ( $objectClasses [ $modClass ])) {
if ( $attributes [ 'objectClass' ][ $attrClass ] != $objectClasses [ $modClass ]) {
unset ( $attributes [ 'objectClass' ][ $attrClass ]);
$attributes [ 'objectClass' ][] = $objectClasses [ $modClass ];
}
break ;
}
}
}
2006-05-01 16:13:10 +00:00
}
else {
// fix aliases
if ( in_array ( strtolower ( $keys [ $i ]), $aliasKeys )) {
$attributes [ $aliases [ strtolower ( $keys [ $i ])]] = $attributes [ $keys [ $i ]];
unset ( $attributes [ $keys [ $i ]]);
}
2006-07-23 15:03:35 +00:00
// fix attribute names
elseif ( in_array ( strtolower ( $keys [ $i ]), $ldapAttributesKeys )) {
if ( $keys [ $i ] != $ldapAttributes [ strtolower ( $keys [ $i ])]) {
$attributes [ $ldapAttributes [ strtolower ( $keys [ $i ])]] = $attributes [ $keys [ $i ]];
unset ( $attributes [ $keys [ $i ]]);
}
}
2006-04-05 15:48:27 +00:00
}
}
return $attributes ;
}
2004-02-07 18:34:26 +00:00
2005-04-29 15:20:48 +00:00
/**
* This function will prepare the object for a new account .
2004-02-07 18:34:26 +00:00
*/
function new_account () {
2005-04-29 15:20:48 +00:00
$this -> isNewAccount = true ;
2007-12-04 15:58:05 +00:00
$this -> lastLoadedProfile = 'default' ;
2004-10-17 09:36:36 +00:00
$modules = $_SESSION [ 'config' ] -> get_AccountModules ( $this -> type );
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 );
}
2005-08-23 12:16:58 +00:00
// sort module buttons
$this -> sortModules ();
2005-04-16 10:58:18 +00:00
$profile = loadAccountProfile ( 'default' , $this -> type );
// pass profile to each module
$modules = array_keys ( $this -> module );
foreach ( $modules as $module ) $this -> module [ $module ] -> load_profile ( $profile );
2005-05-22 09:05:33 +00:00
if ( isset ( $profile [ 'ldap_rdn' ][ 0 ])) {
2005-08-13 09:38:32 +00:00
if ( in_array ( $profile [ 'ldap_rdn' ][ 0 ], getRDNAttributes ( $this -> type ))) {
$this -> rdn = $profile [ 'ldap_rdn' ][ 0 ];
}
2005-05-22 09:05:33 +00:00
}
if ( isset ( $profile [ 'ldap_suffix' ][ 0 ])) {
$this -> dn = $profile [ 'ldap_suffix' ][ 0 ];
}
2004-02-07 18:34:26 +00:00
return 0 ;
}
2005-05-02 17:41:09 +00:00
/**
* This function will save an account to the LDAP database .
*
* @ return array list of status messages if any errors occured
2004-02-07 18:34:26 +00:00
*/
function save_account () {
2007-12-30 16:08:54 +00:00
if ( ! checkIfWriteAccessIsAllowed ()) {
die ();
}
2007-12-11 18:52:07 +00:00
$finalDN = $this -> dn ;
2006-08-27 14:57:22 +00:00
$errors = array ();
2006-05-16 15:18:24 +00:00
$ldapUser = $_SESSION [ 'ldap' ] -> decrypt_login ();
$ldapUser = $ldapUser [ 0 ];
2004-02-07 18:34:26 +00:00
$module = array_keys ( $this -> module );
$attributes = array ();
// load attributes
foreach ( $module as $singlemodule ) {
// load changes
$temp = $this -> module [ $singlemodule ] -> save_attributes ();
2005-12-17 12:07:36 +00:00
if ( ! is_array ( $temp )) $temp = array ();
2004-02-07 18:34:26 +00:00
// merge changes
$DNs = array_keys ( $temp );
2005-07-06 13:35:54 +00:00
if ( is_array ( $temp )) $attributes = array_merge_recursive ( $temp , $attributes );
2004-02-07 18:34:26 +00:00
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 ]]);
}
}
}
2006-05-07 08:49:47 +00:00
// Complete dn with RDN attribute
2005-05-02 17:41:09 +00:00
$search = $this -> rdn ;
2004-02-07 18:34:26 +00:00
$added = false ;
foreach ( $attributes as $DN ) {
if ( isset ( $DN [ 'modify' ][ $search ][ 0 ]) && ! $added ) {
2007-12-11 18:52:07 +00:00
$attributes [ $search . '=' . $DN [ 'modify' ][ $search ][ 0 ] . ',' . $finalDN ] = $attributes [ $finalDN ];
unset ( $attributes [ $finalDN ]);
$finalDN = $search . '=' . $DN [ 'modify' ][ $search ][ 0 ] . ',' . $finalDN ;
2004-02-07 18:34:26 +00:00
$added = true ;
}
if ( isset ( $DN [ 'add' ][ $search ][ 0 ]) && ! $added ) {
2007-12-11 18:52:07 +00:00
$attributes [ $search . '=' . $DN [ 'add' ][ $search ][ 0 ] . ',' . $finalDN ] = $attributes [ $finalDN ];
unset ( $attributes [ $finalDN ]);
$finalDN = $search . '=' . $DN [ 'add' ][ $search ][ 0 ] . ',' . $finalDN ;
2004-02-07 18:34:26 +00:00
$added = true ;
}
if ( isset ( $DN [ 'notchanged' ][ $search ][ 0 ]) && ! $added ) {
2007-12-11 18:52:07 +00:00
$attributes [ $search . '=' . $DN [ 'notchanged' ][ $search ][ 0 ] . ',' . $finalDN ] = $attributes [ $finalDN ];
unset ( $attributes [ $finalDN ]);
$finalDN = $search . '=' . $DN [ 'notchanged' ][ $search ][ 0 ] . ',' . $finalDN ;
2004-02-07 18:34:26 +00:00
$added = true ;
}
}
// Add old dn if dn hasn't changed
if ( ! $added ) {
2007-12-11 18:52:07 +00:00
$attributes [ $this -> dn_orig ] = $attributes [ $finalDN ];
unset ( $attributes [ $finalDN ]);
$finalDN = $this -> dn_orig ;
2004-02-07 18:34:26 +00:00
}
// Set to true if an real error has happened
$stopprocessing = false ;
2007-12-11 18:52:07 +00:00
if ( strtolower ( $finalDN ) != strtolower ( $this -> dn_orig )) {
2006-05-07 08:49:47 +00:00
// move existing DN
if ( $this -> dn_orig != '' ) {
2007-12-11 18:52:07 +00:00
$success = ldap_rename ( $_SESSION [ 'ldap' ] -> server (), $this -> dn_orig , $this -> getRDN ( $finalDN ), $this -> getParentDN ( $finalDN ), false );
2006-05-07 08:49:47 +00:00
if ( $success ) {
2007-12-11 18:52:07 +00:00
logNewMessage ( LOG_NOTICE , '[' . $ldapUser . '] Renamed DN ' . $this -> dn_orig . " to " . $finalDN );
2006-05-07 08:49:47 +00:00
}
2007-05-13 13:02:32 +00:00
else {
logNewMessage ( LOG_ERR , '[' . $ldapUser . '] Unable to rename DN: ' . $this -> dn_orig . ' (' . ldap_error ( $_SESSION [ 'ldap' ] -> server ()) . ').' );
$errors [] = array ( 'ERROR' , sprintf ( _ ( 'Was unable to rename DN: %s.' ), $this -> dn_orig ), ldap_error ( $_SESSION [ 'ldap' ] -> server ()));
2006-05-07 08:49:47 +00:00
$stopprocessing = true ;
}
}
// create complete new dn
else {
$attr = array ();
2007-12-11 18:52:07 +00:00
if ( is_array ( $attributes [ $finalDN ][ 'add' ])) $attr = array_merge_recursive ( $attr , $attributes [ $finalDN ][ 'add' ]);
if ( is_array ( $attributes [ $finalDN ][ 'notchanged' ])) $attr = array_merge_recursive ( $attr , $attributes [ $finalDN ][ 'notchanged' ]);
if ( is_array ( $attributes [ $finalDN ][ 'modify' ])) $attr = array_merge_recursive ( $attr , $attributes [ $finalDN ][ 'modify' ]);
$success = ldap_add ( $_SESSION [ 'ldap' ] -> server (), $finalDN , $attr );
2006-05-07 08:49:47 +00:00
if ( ! $success ) {
2007-12-11 18:52:07 +00:00
logNewMessage ( LOG_ERR , '[' . $ldapUser . '] Unable to create DN: ' . $finalDN . ' (' . ldap_err2str ( ldap_errno ( $_SESSION [ 'ldap' ] -> server ())) . ').' );
$errors [] = array ( 'ERROR' , sprintf ( _ ( 'Was unable to create DN: %s.' ), $finalDN ), ldap_error ( $_SESSION [ 'ldap' ] -> server ()));
2006-05-07 08:49:47 +00:00
$stopprocessing = true ;
}
2006-05-16 15:18:24 +00:00
else {
2007-12-11 18:52:07 +00:00
logNewMessage ( LOG_NOTICE , '[' . $ldapUser . '] Created DN: ' . $finalDN );
2006-05-16 15:18:24 +00:00
}
2007-12-11 18:52:07 +00:00
unset ( $attributes [ $finalDN ]);
2004-02-07 18:34:26 +00:00
}
2005-10-15 09:33:05 +00:00
}
2004-02-07 18:34:26 +00:00
$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 ) {
2006-05-16 15:18:24 +00:00
logNewMessage ( LOG_ERR , '[' . $ldapUser . '] Unable to modify attribtues from DN: ' . $DNs [ $i ] . ' (' . ldap_err2str ( ldap_errno ( $_SESSION [ 'ldap' ] -> server ())) . ').' );
2005-05-10 16:51:32 +00:00
$errors [] = array ( 'ERROR' , sprintf ( _ ( 'Was unable to modify attribtues from DN: %s.' ), $DNs [ $i ]), ldap_error ( $_SESSION [ 'ldap' ] -> server ()));
2004-02-07 18:34:26 +00:00
$stopprocessing = true ;
}
2006-05-16 15:18:24 +00:00
else {
logNewMessage ( LOG_NOTICE , '[' . $ldapUser . '] Modified DN: ' . $DNs [ $i ]);
}
2005-10-15 09:33:05 +00:00
}
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 ) {
2006-05-16 15:18:24 +00:00
logNewMessage ( LOG_ERR , '[' . $ldapUser . '] Unable to add attribtues to DN: ' . $DNs [ $i ] . ' (' . ldap_err2str ( ldap_errno ( $_SESSION [ 'ldap' ] -> server ())) . ').' );
2005-05-10 16:51:32 +00:00
$errors [] = array ( 'ERROR' , sprintf ( _ ( 'Was unable to add attribtues to DN: %s.' ), $DNs [ $i ]), ldap_error ( $_SESSION [ 'ldap' ] -> server ()));
2004-02-07 18:34:26 +00:00
$stopprocessing = true ;
}
2006-05-16 15:18:24 +00:00
else {
logNewMessage ( LOG_NOTICE , '[' . $ldapUser . '] Modified DN: ' . $DNs [ $i ]);
}
2005-10-15 09:33:05 +00:00
}
2005-12-05 14:27:47 +00:00
// remove attributes
2004-02-07 18:34:26 +00:00
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 ) {
2006-05-16 15:18:24 +00:00
logNewMessage ( LOG_ERR , '[' . $ldapUser . '] Unable to delete attribtues from DN: ' . $DNs [ $i ] . ' (' . ldap_err2str ( ldap_errno ( $_SESSION [ 'ldap' ] -> server ())) . ').' );
2005-05-10 16:51:32 +00:00
$errors [] = array ( 'ERROR' , sprintf ( _ ( 'Was unable to remove attribtues from DN: %s.' ), $DNs [ $i ]), ldap_error ( $_SESSION [ 'ldap' ] -> server ()));
2004-02-07 18:34:26 +00:00
$stopprocessing = true ;
}
2006-05-16 15:18:24 +00:00
else {
logNewMessage ( LOG_NOTICE , '[' . $ldapUser . '] Modified DN: ' . $DNs [ $i ]);
}
2004-02-07 18:34:26 +00:00
}
}
2005-10-15 09:33:05 +00:00
}
2004-02-07 18:34:26 +00:00
if ( ! $stopprocessing ) {
2007-02-25 13:50:13 +00:00
// post modify actions
foreach ( $module as $singlemodule ) {
$this -> module [ $singlemodule ] -> postModifyActions ( $this -> isNewAccount );
2004-02-07 18:34:26 +00:00
}
2005-10-15 09:33:05 +00:00
}
$_SESSION [ 'cache' ] -> refresh_cache ( true );
2006-08-27 14:57:22 +00:00
return $errors ;
2005-08-05 08:49:03 +00:00
}
2004-02-07 18:34:26 +00:00
2005-08-05 08:49:03 +00:00
/**
* Returns a list of possible PDF entries for this account .
2006-08-14 17:29:45 +00:00
*
2005-08-05 08:49:03 +00:00
* @ return list of PDF entries ( array ( < name > => < PDF lines > ))
*/
function get_pdfEntries () {
$return = array ();
while (( $current = current ( $this -> module )) != null ) {
2005-10-09 18:05:32 +00:00
$return = array_merge ( $return , $current -> get_pdfEntries ());
2005-08-05 08:49:03 +00:00
next ( $this -> module );
2004-05-23 15:23:00 +00:00
}
2005-08-05 08:49:03 +00:00
$return = array_merge ( $return , array ( 'main_dn' => array ( '<block><key>' . _ ( 'DN' ) . '</key><value>' . $this -> dn . '</value></block>' )));
return $return ;
}
2005-08-23 12:16:58 +00:00
/**
* Sorts the module buttons for the account page .
*/
function sortModules () {
$order = array ();
$modules = array_keys ( $this -> module );
$depModules = array ();
for ( $i = 0 ; $i < sizeof ( $modules ); $i ++ ) {
// insert waiting modules
for ( $w = 0 ; $w < sizeof ( $depModules ); $w ++ ) {
$dependencies = $this -> module [ $depModules [ $w ]] -> get_dependencies ( $this -> type );
$dependencies = $dependencies [ 'depends' ];
$everything_found = true ;
for ( $d = 0 ; $d < sizeof ( $dependencies ); $d ++ ) {
if ( ! in_array ( $dependencies [ $d ], $order )) {
$everything_found = false ;
break ;
}
}
// inser after depending module
if ( $everything_found ) {
$order [] = $depModules [ $w ];
unset ( $depModules [ $w ]);
$depModules = array_values ( $depModules );
$w -- ;
}
}
// check next module
$dependencies = $this -> module [ $modules [ $i ]] -> get_dependencies ( $this -> type );
if ( is_array ( $dependencies [ 'depends' ])) {
$everything_found = true ;
$dependencies = $dependencies [ 'depends' ];
for ( $d = 0 ; $d < sizeof ( $dependencies ); $d ++ ) {
if ( ! in_array ( $dependencies [ $d ], $order )) {
$everything_found = false ;
break ;
}
}
// remove module if dependencies are not satisfied
if ( ! $everything_found ) {
$depModules [] = $modules [ $i ];
unset ( $modules [ $i ]);
$modules = array_values ( $modules );
$i -- ;
}
else {
$order [] = $modules [ $i ];
}
}
else {
$order [] = $modules [ $i ];
}
}
// add modules which could not be sorted (e.g. because of cyclic dependencies)
if ( sizeof ( $depModules ) > 0 ) {
for ( $i = 0 ; $i < sizeof ( $depModules ); $i ++ ) $order [] = $depModules [ $i ];
}
$this -> order = $order ;
}
2007-05-13 13:02:32 +00:00
/**
* Returns the RDN part of a given DN .
*
* @ param String $dn DN
* @ return String RDN
*/
function getRDN ( $dn ) {
if (( $dn == " " ) || ( $dn == null )) return " " ;
$rdn = substr ( $dn , 0 , strpos ( $dn , " , " ));
return $rdn ;
}
/**
* Returns the parent DN of a given DN .
*
* @ param String $dn DN
* @ return String DN
*/
function getParentDN ( $dn ) {
if (( $dn == " " ) || ( $dn == null )) return " " ;
$parent = substr ( $dn , strpos ( $dn , " , " ) + 1 );
return $parent ;
}
2006-08-14 17:29:45 +00:00
2005-08-05 08:49:03 +00:00
/**
* Encrypts sensitive data before storing in session .
*
* @ return array list of attributes which are serialized
*/
function __sleep () {
// encrypt data
$this -> attributes = $_SESSION [ 'ldap' ] -> encrypt ( serialize ( $this -> attributes ));
$this -> attributes_orig = $_SESSION [ 'ldap' ] -> encrypt ( serialize ( $this -> attributes_orig ));
$this -> module = $_SESSION [ 'ldap' ] -> encrypt ( serialize ( $this -> module ));
// save all attributes
2005-09-04 12:49:26 +00:00
return array_keys ( get_object_vars ( $this ));
2005-08-05 08:49:03 +00:00
}
2006-08-14 17:29:45 +00:00
2005-08-05 08:49:03 +00:00
/**
* Decrypts sensitive data after accountContainer was loaded from session .
*/
function __wakeup () {
// decrypt data
$this -> attributes = unserialize ( $_SESSION [ 'ldap' ] -> decrypt ( $this -> attributes ));
$this -> attributes_orig = unserialize ( $_SESSION [ 'ldap' ] -> decrypt ( $this -> attributes_orig ));
$this -> module = unserialize ( $_SESSION [ 'ldap' ] -> decrypt ( $this -> module ));
2004-02-07 18:34:26 +00:00
}
2005-08-05 08:49:03 +00:00
}
2004-09-08 10:07:25 +00:00
?>