2004-06-08 18:39:53 +00:00
< ? php
/*
$Id $
2009-10-27 18:47:12 +00:00
This code is part of LDAP Account Manager ( http :// www . ldap - account - manager . org / )
2009-10-03 17:48:37 +00:00
Copyright ( C ) 2003 - 2009 Roland Gruber
2004-06-08 18:39:53 +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
*/
/**
* This is the parent class for all account modules .
*
* It implements the complete module interface and uses meta - data
* provided by the account modules for its functions .
*
* @ package modules
* @ author Roland Gruber
2008-02-05 18:40:57 +00:00
* @ see baseModule
2004-06-08 18:39:53 +00:00
*/
/**
2007-07-08 19:00:55 +00:00
* Parent class of all account modules .
2008-02-05 18:40:57 +00:00
* It implements the complete module interface and uses meta - data
* provided by the account modules for its functions .< br >
* < br >
* < b > Location and naming of modules </ b >< br >
* All LAM modules are placed in lib / modules / and are named " <class name>.inc " .
* E . g . if you create a new module and its class name is " qmail " then the filename would be " qmail.inc " .
* The class name of a module must contain only a - z , A - Z , 0 - 9 , - , and _ .< br >
* < br >
* You can avoid to override many functions by using { @ link get_metaData ()} .< br >
* < br >
* All module classes should extend the baseModule class .
2004-06-08 18:39:53 +00:00
*
* @ package modules
2008-02-05 18:40:57 +00:00
* @ author Roland Gruber
2004-06-08 18:39:53 +00:00
*/
2007-07-08 19:00:55 +00:00
abstract class baseModule {
2004-06-08 18:39:53 +00:00
/** includes all meta data provided by the sub class */
2007-07-08 19:00:55 +00:00
protected $meta ;
2004-06-08 18:39:53 +00:00
/** the account type of this module (user, group, host) */
2007-10-04 16:45:05 +00:00
private $scope ;
2004-06-08 18:39:53 +00:00
2004-07-26 15:15:30 +00:00
/** configuration settings of all modules */
2007-07-08 19:00:55 +00:00
protected $moduleSettings ;
2004-07-26 15:15:30 +00:00
2006-11-21 17:37:12 +00:00
/** self service settings of all modules */
2007-07-08 19:00:55 +00:00
protected $selfServiceSettings ;
2006-11-21 17:37:12 +00:00
2004-09-01 20:53:06 +00:00
/** name of parent accountContainer ($_SESSION[$base]) */
2007-10-03 18:02:10 +00:00
private $base ;
2004-09-01 20:53:06 +00:00
2004-09-14 11:53:33 +00:00
/** contains all ldap attributes which should be written */
2007-07-08 19:00:55 +00:00
protected $attributes ;
2006-08-14 17:29:45 +00:00
2004-09-14 11:53:33 +00:00
/** contains all ldap attributes which are loaded from ldap */
2007-07-08 19:00:55 +00:00
protected $orig ;
2004-09-14 11:53:33 +00:00
2004-09-20 19:33:31 +00:00
/** contains all error messages of a module */
2007-07-08 19:00:55 +00:00
protected $messages ;
2007-11-18 10:35:56 +00:00
/** if true, managed object classes are added when an account is created or loaded (default: true) */
protected $autoAddObjectClasses ;
2004-09-20 19:33:31 +00:00
2004-06-08 18:39:53 +00:00
/**
* Creates a new base module class
*
* @ param string $scope the account type ( user , group , host )
*/
2007-12-28 16:08:56 +00:00
public function __construct ( $scope ) {
2009-10-03 15:45:41 +00:00
// load configuration
if ( isset ( $_SESSION [ 'config' ])) $this -> moduleSettings = $_SESSION [ 'config' ] -> get_moduleSettings ();
if ( isset ( $_SESSION [ 'selfServiceProfile' ])) $this -> selfServiceSettings = $_SESSION [ 'selfServiceProfile' ];
// initialize module
2004-06-08 18:39:53 +00:00
$this -> scope = $scope ;
2004-09-27 19:12:22 +00:00
$this -> load_Messages ();
2004-06-08 18:39:53 +00:00
$this -> meta = $this -> get_metaData ();
2007-11-18 10:35:56 +00:00
$this -> autoAddObjectClasses = true ;
2004-06-08 18:39:53 +00:00
}
2004-09-27 19:12:22 +00:00
/**
* This function fills the $messages variable with output messages from this module .
2008-02-05 18:40:57 +00:00
*
* Calling this method requires the existence of an enclosing { @ link accountContainer } .
2004-09-27 19:12:22 +00:00
*/
2007-10-04 16:45:05 +00:00
protected function load_Messages () {
2004-09-27 19:12:22 +00:00
}
2004-09-01 20:53:06 +00:00
/**
2008-02-05 18:40:57 +00:00
* Initializes the module after it became part of an { @ link accountContainer }
*
* Calling this method requires the existence of an enclosing { @ link accountContainer } .
2004-09-01 20:53:06 +00:00
*
2008-02-05 18:40:57 +00:00
* @ param string $base the name of the { @ link accountContainer } object ( $_SESSION [ $base ])
2004-09-01 20:53:06 +00:00
*/
2008-02-05 18:40:57 +00:00
public function init ( $base ) {
2004-09-01 20:53:06 +00:00
$this -> base = $base ;
2006-05-14 07:47:50 +00:00
$this -> attributes = array ();
$this -> orig = array ();
// add object classes if needed
$this -> attributes [ 'objectClass' ] = array ();
$this -> orig [ 'objectClass' ] = array ();
2007-11-18 10:35:56 +00:00
if ( $this -> autoAddObjectClasses === true ) {
$objectClasses = $this -> getManagedObjectClasses ();
for ( $i = 0 ; $i < sizeof ( $objectClasses ); $i ++ ) {
if ( ! in_array ( $objectClasses [ $i ], $this -> attributes [ 'objectClass' ])) {
$this -> attributes [ 'objectClass' ][] = $objectClasses [ $i ];
}
}
2006-05-14 07:47:50 +00:00
}
2004-09-01 20:53:06 +00:00
}
2005-04-16 13:41:17 +00:00
/**
2008-02-05 18:40:57 +00:00
* This function loads the LDAP attributes when an account should be loaded .
*
* Calling this method requires the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* By default this method loads the object classes and accounts which are specified in { @ link getManagedObjectClasses ()}
* and { @ link getManagedAttributes ()} .
2005-04-16 13:41:17 +00:00
*
2008-02-05 18:40:57 +00:00
* @ param array $attributes array like the array returned by get_ldap_attributes ( dn of account ) but without count indices
2004-09-18 18:44:47 +00:00
*/
2008-02-05 18:40:57 +00:00
public function load_attributes ( $attributes ) {
2006-05-13 08:55:31 +00:00
$this -> attributes = array ();
$this -> attributes = array ();
// load object classes
if ( isset ( $attributes [ 'objectClass' ])) {
$this -> attributes [ 'objectClass' ] = $attributes [ 'objectClass' ];
$this -> orig [ 'objectClass' ] = $attributes [ 'objectClass' ];
}
else {
$this -> attributes [ 'objectClass' ] = array ();
$this -> orig [ 'objectClass' ] = array ();
}
// add object classes if needed
2007-11-18 10:35:56 +00:00
if ( $this -> autoAddObjectClasses === true ) {
$objectClasses = $this -> getManagedObjectClasses ();
for ( $i = 0 ; $i < sizeof ( $objectClasses ); $i ++ ) {
if ( ! in_array ( $objectClasses [ $i ], $this -> attributes [ 'objectClass' ])) {
$this -> attributes [ 'objectClass' ][] = $objectClasses [ $i ];
}
}
2006-05-13 08:55:31 +00:00
}
// load attributes
$attributeNames = $this -> getManagedAttributes ();
for ( $i = 0 ; $i < sizeof ( $attributeNames ); $i ++ ) {
if ( isset ( $attributes [ $attributeNames [ $i ]])) {
$this -> attributes [ $attributeNames [ $i ]] = $attributes [ $attributeNames [ $i ]];
$this -> orig [ $attributeNames [ $i ]] = $attributes [ $attributeNames [ $i ]];
2004-09-18 18:44:47 +00:00
}
}
}
2004-06-08 18:39:53 +00:00
/**
2008-02-03 14:28:28 +00:00
* This function provides meta data which is interpreted by baseModule .
* Only subclasses will return real data .< br >
* < br >
* The aim of the meta data is to reduce the number
* of functions in the subclasses . All major data is centralized in one place .< br >
* < br >
* The returned array contains a list of key - value pairs for the different functions .< br >
* < ul >
*
* < li >< b > { @ link can_manage ()} </ b >< br >
* < br >
* < b > Key :</ b > account_types < br >
* < b > Value :</ b > array of account types < br >
* < br >
* < b > Example :</ b > " account_types " => array ( " user " , " host " )
* < br >< br >
* </ li >
*
* < li >< b > { @ link is_base_module ()} </ b >< br >
* < br >
* < b > Key :</ b > is_base < br >
* < b > Value :</ b > boolean < br >
* < br >
* < b > Example :</ b > " is_base " => true
* < br >< br >
* </ li >
*
* < li >< b > { @ link get_ldap_filter ()} </ b >< br >
* < br >
* < b > Key :</ b > ldap_filter < br >
* < b > Value :</ b > array of filters < br >
* < br >
* < b > Example :</ b > " ldap_filter " => array ( 'or' => 'objectClass=posixAccount' , 'and' => '(!(uid=*$))' )
* < br >< br >
* </ li >
*
* < li >< b > { @ link getManagedObjectClasses ()} </ b >< br >
* < br >
* < b > Key :</ b > objectClasses < br >
* < b > Value :</ b > array of object classes < br >
* < br >
* < b > Example :</ b > " objectClasses " => array ( 'posixAccount' )
* < br >< br >
* </ li >
*
* < li >< b > { @ link getLDAPAliases ()} </ b >< br >
* < br >
* < b > Key :</ b > LDAPaliases < br >
* < b > Value :</ b > array of aliases < br >
* < br >
* < b > Example :</ b > " LDAPaliases " => array ( 'commonName' => 'cn' )
* < br >< br >
* </ li >
*
* < li >< b > { @ link get_RDNAttributes ()} </ b >< br >
* < br >
* < b > Key :</ b > RDN < br >
* < b > Value :</ b > array of RDNs < br >
* < br >
* < b > Example :</ b > " RDN " => array ( 'uid' => 'normal' , 'cn' => 'low' )
* < br >< br >
* </ li >
*
* < li >< b > { @ link get_dependencies ()} </ b >< br >
* < br >
* < b > Key :</ b > dependencies < br >
* < b > Value :</ b > array of dependencies < br >
* < br >
* < b > Example :</ b > " dependencies " => array ( " depends " => array ( " posixAccount " , array ( " qmail " , " sendmail " )), " conflicts " => array ( " exim " ))
* < br >< br >
* </ li >
*
* < li >< b > { @ link get_profileOptions ()} </ b >< br >
* < br >
* < b > Key :</ b > profile_options < br >
* < b > Value :</ b > array of profile options < br >
* < br >
* The syntax for the value array is the same as for the return value of get_profileOptions () .
* < br >< br >
* </ li >
*
* < li >< b > { @ link check_profileOptions ()} </ b >< br >
* < br >
* < b > Key :</ b > profile_checks < br >
* < b > Value :</ b > array of checks ( array ( " optionName " => array ())) < br >
* < br >
* The " optionName " keys of the value array are the names of the option identifiers .< br >
* Each array element is an array itself containing these values :
* < ul >
* < li >< b > type :</ b > determines how to check input < br >
* Possible values :
* < ul >
* < li >< b > regex :</ b > check with regular expression from regex variable , case sensitive </ li >
* < li >< b > regex_i :</ b > check with regular expression from regex variable , case insensitive </ li >
* < li >< b > int_greater :</ b > integer value of cmp_name1 must be greater than the integer value from the option cmp_name2 </ li >
* < li >< b > int_greaterOrEqual :</ b > integer value of cmp_name1 must be greater or equal than the integer value from the option cmp_name2 </ li >
* </ ul >
* </ li >
* < li >< b > error_message :</ b > message that is displayed if input value was syntactically incorrect < br >
* error_message is an array to build StatusMessages ( message type , message head , message text , additional variables )
* < li >< b > regex :</ b > regular expression string ( only if type is regex / regex_i ) </ li >
* < li >< b > cmp_name1 :</ b > name of first input variable that is used for comparison ( only if type is int_greater / int_greaterOrEqual ) </ li >
* < li >< b > cmp_name2 :</ b > name of second input variable that is used for comparison ( only if type is int_greater / int_greaterOrEqual ) </ li >
* < li >< b > required :</ b > true or false , if this input field must be filled set to true ( optional )
* < li >< b > required_message :</ b > message that is displayed if no input value was given ( only if required == true ) < br >
* required_message is an array to build StatusMessages ( message type , message head , message text , additional variables )
* </ li >
* </ ul >
* < br >< br >
* </ li >
*
* < li >< b > { @ link load_profile ()} </ b >< br >
* < br >
* < b > Key :</ b > profile_mappings < br >
* < b > Value :</ b > array ( 'profile_identifier1' => 'LDAP_attribute1' , 'profile_identifier2' => 'LDAP_attribute2' ) < br >
* < br >
* The mapped values are stored directly in $this -> attributes .
* < br >
* < b > Example :</ b > " profile_mappings " => array ( 'inetOrgPerson_title' => 'title' )
* < br >< br >
* </ li >
*
* < li >< b > { @ link get_configOptions ()} </ b >< br >
* < br >
* < b > Key :</ b > config_options < br >
* < b > Value :</ b > array ( 'user' => array , 'host' => array , 'all' => array ) < br >
* < br >
* The values from 'all' are always returned , the other values only if they are inside the $scopes array .< br >
* The syntax for sub arrays is the same as for the return value of { @ link get_configOptions ()} .
* < br >< br >
* </ li >
*
* < li >< b > { @ link check_configOptions ()} </ b >< br >
* < br >
* < b > Key :</ b > config_checks < br >
* < b > Value :</ b > array ( 'user' => array , 'host' => 'array' , 'all' => array ) < br >
* < br >
* The values from 'all' are always used for checking , the other values only if they are inside the $scopes array .
* The syntax for sub arrays is the same as for { @ link check_configOptions ()} .
* < br >< br >
* </ li >
*
* < li >< b > { @ link get_uploadColumns ()} </ b >< br >
* < br >
* < b > Key :</ b > upload_columns < br >
* < b > Value :</ b > array < br >
* < br >
* The syntax for array is the same as for the return value of { @ link get_uploadColumns ()} .
* < br >< br >
* </ li >
*
* < li >< b > { @ link get_uploadPreDepends ()} </ b >< br >
* < br >
* < b > Key :</ b > upload_preDepends < br >
* < b > Value :</ b > array < br >
* < br >
* The syntax for array is the same as for the return value of { @ link get_uploadPreDepends ()} .
* < br >< br >
* </ li >
*
* < li >< b > { @ link getRequiredExtensions ()} </ b >< br >
* < br >
* < b > Key :</ b > extensions < br >
* < b > Value :</ b > array of extension names < br >
* < br >
2008-08-09 11:18:36 +00:00
* < b > Example :</ b > " extensions " => array ( 'hash' )
2008-02-03 14:28:28 +00:00
* < br >< br >
* </ li >
*
2008-02-03 18:46:11 +00:00
* < li >< b > { @ link get_help ()} </ b >< br >
* < br >
* < b > Key :</ b > help < br >
* < b > Value :</ b > hashtable of help entries < br >
* < br >
* The hashtable is an array which maps help IDs to help entries .< br >
* < br >
* < b > Example :</ b > 'help' => array ( 'myEntry' => array ( 'Headline' => 'This is the head line' , 'Text' => 'Help content' ))
* < br >< br >
* </ li >
*
2008-02-03 14:28:28 +00:00
* < li >< b > { @ link getSelfServiceSearchAttributes ()} </ b >< br >
* < br >
* < b > Key :</ b > selfServiceSearchAttributes < br >
* < b > Value :</ b > array of attribute names < br >
* < br >
* < b > Example :</ b > " selfServiceSearchAttributes " => array ( 'uid' )
* < br >< br >
* </ li >
*
* < li >< b > { @ link getSelfServiceFields ()} </ b >< br >
* < br >
* < b > Key :</ b > selfServiceFieldSettings < br >
* < b > Value :</ b > array of self service fields < br >
* < br >
* < b > Example :</ b > " selfServiceFieldSettings " => array ( 'pwd' => 'Password' )
* < br >< br >
* </ li >
*
* </ ul >
2008-02-05 18:40:57 +00:00
* < b > Example :</ b > return array ( " is_base " => true );
2004-06-08 18:39:53 +00:00
*
2008-02-05 18:40:57 +00:00
* @ return array meta data
2004-06-08 18:39:53 +00:00
*/
2008-02-05 18:40:57 +00:00
public function get_metaData () {
2004-06-08 18:39:53 +00:00
return array ();
}
/**
* Returns the account type of this module ( user , group , host )
*
* @ return string account type
*/
2008-02-05 18:40:57 +00:00
public function get_scope () {
2004-06-08 18:39:53 +00:00
return $this -> scope ;
}
2004-06-13 19:58:58 +00:00
/**
2008-02-05 18:40:57 +00:00
* Returns true if this module can manage accounts of the current type , otherwise false .
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .
*
2004-06-13 19:58:58 +00:00
* @ return boolean true if module fits
2008-02-05 18:40:57 +00:00
*
* @ see baseModule :: get_metaData ()
2004-06-13 19:58:58 +00:00
*/
2008-02-05 18:40:57 +00:00
public function can_manage () {
2004-06-13 19:58:58 +00:00
if ( is_array ( $this -> meta [ " account_types " ]) && in_array ( $this -> scope , $this -> meta [ " account_types " ])) return true ;
else return false ;
}
2004-06-08 18:39:53 +00:00
/**
2008-02-05 18:40:57 +00:00
* Returns true if your module is a base module and otherwise false .
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* Every account type needs exactly one base module . A base module manages a structural object class .
* E . g . the inetOrgPerson module is a base module since its object class is structural .
2004-06-08 18:39:53 +00:00
*
2008-02-03 14:28:28 +00:00
* @ return boolean true if base module ( defaults to false if no meta data is provided )
2008-02-05 18:40:57 +00:00
*
* @ see baseModule :: get_metaData ()
2004-06-08 18:39:53 +00:00
*/
2008-02-05 18:40:57 +00:00
public function is_base_module () {
2006-05-13 08:55:31 +00:00
if ( isset ( $this -> meta [ 'is_base' ]) && ( $this -> meta [ 'is_base' ] == true )) return true ;
2004-06-08 18:39:53 +00:00
else return false ;
}
2004-06-11 15:44:49 +00:00
/**
2008-02-05 18:40:57 +00:00
* Returns an LDAP filter for the account lists
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* Returns an array ( 'or' => '...' , 'and' => '...' ) that is used to build the LDAP filter . Usually , this is used to filter object classes .
* All " or " filter parts of the base modules are combined with OR and then combined with the " and " parts .< br >
* The resulting LDAP filter will look like this : ( & ( | ( OR1 )( OR2 )( OR3 ))( AND1 )( AND2 )( AND3 )) < br >
* < br >
* < b > Example :</ b > return array ( 'or' => '(objectClass=posixAccount)' , 'and' => '(!(uid=*$))' )
2004-06-11 15:44:49 +00:00
*
* @ return string LDAP filter
2008-02-05 18:40:57 +00:00
*
* @ see baseModule :: get_metaData ()
2004-06-11 15:44:49 +00:00
*/
2008-02-05 18:40:57 +00:00
public function get_ldap_filter () {
2004-06-11 15:44:49 +00:00
if ( isset ( $this -> meta [ 'ldap_filter' ])) return $this -> meta [ 'ldap_filter' ];
else return " " ;
}
2004-06-14 16:05:36 +00:00
/**
* Returns an alias name for the module .
2008-02-05 18:40:57 +00:00
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* This function returns a more descriptive string than the class name . Alias names are used for the buttons on the account pages and the module selection in the configuration wizard .< br >
* Please take care that your alias name is not too long . It may contain any character but should not include parts that may be interpreted by the browser ( e . g . '<' or '>' ) .
* If you use different aliases dependent on the account type please make sure that there is a general alias for unknown types .
*
2004-06-14 16:05:36 +00:00
* @ return string alias name
2008-02-05 18:40:57 +00:00
*
* @ see baseModule :: get_metaData ()
2004-06-14 16:05:36 +00:00
*/
2008-02-05 18:40:57 +00:00
public function get_alias () {
2004-06-14 16:05:36 +00:00
if ( isset ( $this -> meta [ 'alias' ])) return $this -> meta [ 'alias' ];
else return get_class ( $this );
}
2004-10-06 18:17:22 +00:00
/**
2008-02-05 18:40:57 +00:00
* Returns a hash array containing a list of possible LDAP attributes that can be used to form the RDN ( Relative Distinguished Name ) .
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
2004-10-06 18:17:22 +00:00
* The returned elements have this form : < attribute > => < priority >
* < br > < attribute > is the name of the LDAP attribute
2008-02-05 18:40:57 +00:00
* < br > < priority > defines the priority of the attribute ( can be " low " , " normal " , " high " ) < br >
* < br >
* < b > Example :</ b > return array ( 'uid' => 'normal' , 'cn' => 'low' )
2004-10-06 18:17:22 +00:00
*
* @ return array list of attributes
2008-02-05 18:40:57 +00:00
*
* @ see baseModule :: get_metaData ()
2004-10-06 18:17:22 +00:00
*/
2008-02-05 18:40:57 +00:00
public function get_RDNAttributes () {
2004-10-06 18:17:22 +00:00
if ( isset ( $this -> meta [ 'RDN' ])) return $this -> meta [ 'RDN' ];
else return array ();
}
2004-06-20 17:32:02 +00:00
/**
* This function returns a list with all depending and conflicting modules .
2008-02-05 18:40:57 +00:00
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* The return value is an array with two sub arrays , " depends " and " conflicts " .
* All values of the conflict array are string values with module names . All values of the depends
* array are either string values with module names or arrays which include only string values with
* module names .< br >
* If an element of the depends array is itself an array , this means that your module
* depends on one of these modules .< br >
* < br >
* < b > Example :</ b > return array ( " depends " => array ( " posixAccount " , array ( " qmail " , " sendmail " )), " conflicts " => array ( " exim " ))
2004-06-20 17:32:02 +00:00
*
* @ return array list of dependencies and conflicts
2008-02-05 18:40:57 +00:00
*
* @ see baseModule :: get_metaData ()
2004-06-20 17:32:02 +00:00
*/
2008-02-05 18:40:57 +00:00
public function get_dependencies () {
2004-06-20 17:32:02 +00:00
if ( isset ( $this -> meta [ 'dependencies' ])) return $this -> meta [ 'dependencies' ];
else return array ( 'depends' => array (), 'conflicts' => array ());
}
2004-07-01 15:54:33 +00:00
/**
2008-02-05 18:40:57 +00:00
* This function defines what attributes will be used in the account profiles and their appearance in the profile editor .
2004-07-01 15:54:33 +00:00
*
2008-02-05 18:40:57 +00:00
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* The return value is an array that contains meta HTML code .< br >
* The type " fieldset " is not allowed here . The name attributes are used as keywords to load
* and save profiles . We recommend to use the module name as prefix for them
* ( e . g . posixAccount_homeDirectory ) to avoid naming conflicts .
*
* @ return array meta HTML code
*
* @ see baseModule :: get_metaData ()
* @ see parseHtml ()
2004-07-01 15:54:33 +00:00
*/
2008-02-05 18:40:57 +00:00
public function get_profileOptions () {
2004-07-01 15:54:33 +00:00
if ( isset ( $this -> meta [ 'profile_options' ])) return $this -> meta [ 'profile_options' ];
else return array ();
}
/**
* Checks input values of account profiles .
*
2008-02-05 18:40:57 +00:00
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* $options is an hash array ( option name => value ) that contains the user input .
* The option values are all arrays containing one or more elements .< br >
* If the input data is invalid the return value is an array that contains arrays
* to build StatusMessages ( message type , message head , message text ) . If no errors occured
* the function returns an empty array .
*
* @ param array $options a hash array ( name => value ) containing the user input
2004-09-19 08:28:03 +00:00
* @ return array list of error messages ( array ( type , title , text )) to generate StatusMessages , if any
2008-02-05 18:40:57 +00:00
*
* @ see baseModule :: get_metaData ()
2004-07-01 15:54:33 +00:00
*/
2008-02-05 18:40:57 +00:00
public function check_profileOptions ( $options ) {
2004-07-01 15:54:33 +00:00
$messages = array ();
if ( is_array ( $this -> meta [ 'profile_checks' ])) {
$identifiers = array_keys ( $this -> meta [ 'profile_checks' ]);
for ( $i = 0 ; $i < sizeof ( $identifiers ); $i ++ ) {
2004-10-06 20:00:17 +00:00
// empty input
if (( $options [ $identifiers [ $i ]][ 0 ] == '' ) || ! isset ( $options [ $identifiers [ $i ]][ 0 ])) {
// check if option is required
2006-01-25 18:31:19 +00:00
if ( isset ( $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'required' ]) && $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'required' ]) {
2004-10-06 20:00:17 +00:00
$messages [] = $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'required_message' ];
}
2005-07-07 13:45:55 +00:00
continue ;
2004-07-01 15:54:33 +00:00
}
2004-09-26 15:45:40 +00:00
switch ( $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'type' ]) {
// check by regular expression (from account.inc)
case " ext_preg " :
// ignore empty fileds
if ( $options [ $identifiers [ $i ]][ 0 ] == '' ) continue ;
if ( ! get_preg ( $options [ $identifiers [ $i ]][ 0 ], $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'regex' ])) {
$messages [] = $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'error_message' ];
}
break ;
// check by regular expression (case insensitive)
case 'regex_i' :
// ignore empty fileds
if ( $options [ $identifiers [ $i ]][ 0 ] == '' ) continue ;
2009-08-13 18:57:26 +00:00
if ( ! preg_match ( '/' . $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'regex' ] . '/i' , $options [ $identifiers [ $i ]][ 0 ])) {
2004-09-26 15:45:40 +00:00
$messages [] = $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'error_message' ];
}
break ;
// check by regular expression (case sensitive)
case 'regex' :
// ignore empty fileds
if ( $options [ $identifiers [ $i ]][ 0 ] == '' ) continue ;
2009-08-13 18:57:26 +00:00
if ( ! preg_match ( '/' . $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'regex' ] . '/' , $options [ $identifiers [ $i ]][ 0 ])) {
2004-09-26 15:45:40 +00:00
$messages [] = $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'error_message' ];
}
break ;
// check by integer comparison (greater)
case 'int_greater' :
// ignore if both fields are empty
if (( $options [ $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'cmp_name1' ]][ 0 ] == '' ) && ( $options [ $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'cmp_name2' ]][ 0 ] == '' )) continue ;
// print error message if only one field is empty
if (( $options [ $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'cmp_name1' ]][ 0 ] == '' ) || ( $options [ $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'cmp_name2' ]][ 0 ] == '' )) {
$messages [] = $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'error_message' ];
continue ;
}
// compare
if ( ! ( intval ( $options [ $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'cmp_name1' ]][ 0 ]) > intval ( $options [ $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'cmp_name2' ]][ 0 ]))) {
$messages [] = $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'error_message' ];
}
break ;
// check by integer comparison (greater or equal)
case 'int_greaterOrEqual' :
// ignore if both fields are empty
if (( $options [ $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'cmp_name1' ]][ 0 ] == '' ) && ( $options [ $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'cmp_name2' ]][ 0 ] == '' )) continue ;
// print error message if only one field is empty
if (( $options [ $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'cmp_name1' ]][ 0 ] == '' ) || ( $options [ $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'cmp_name2' ]][ 0 ] == '' )) {
$messages [] = $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'error_message' ];
continue ;
}
// compare
if ( ! ( intval ( $options [ $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'cmp_name1' ]][ 0 ]) >= intval ( $options [ $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'cmp_name2' ]][ 0 ]))) {
$messages [] = $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'error_message' ];
}
break ;
// print error message for invalid types
default :
StatusMessage ( " ERROR " , " Unsupported type! " , $this -> meta [ 'profile_checks' ][ $identifiers [ $i ]][ 'type' ]);
break ;
2004-07-13 14:51:28 +00:00
}
2004-07-01 15:54:33 +00:00
}
}
return $messages ;
}
2005-01-07 10:55:05 +00:00
/**
2008-02-05 18:40:57 +00:00
* This function loads the values from an account profile to the module ' s internal data structures .
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .
2005-01-07 10:55:05 +00:00
*
* @ param array $profile hash array with profile values ( identifier => value )
2008-02-05 18:40:57 +00:00
*
* @ see baseModule :: get_metaData ()
2005-01-07 10:55:05 +00:00
*/
2008-02-05 18:40:57 +00:00
public function load_profile ( $profile ) {
2005-01-07 10:55:05 +00:00
if ( isset ( $this -> meta [ 'profile_mappings' ])) {
$identifiers = array_keys ( $this -> meta [ 'profile_mappings' ]);
for ( $i = 0 ; $i < sizeof ( $identifiers ); $i ++ ) {
if ( isset ( $profile [ $identifiers [ $i ]])) {
$this -> attributes [ $this -> meta [ 'profile_mappings' ][ $identifiers [ $i ]]] = $profile [ $identifiers [ $i ]];
}
}
}
}
2006-08-14 17:29:45 +00:00
2004-07-24 17:14:39 +00:00
/**
2008-02-05 18:40:57 +00:00
* Returns a list of configuration options .
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
2009-10-03 15:45:41 +00:00
* The type " fieldset " is not allowed here . The attribute names are used as keywords to load and save settings .
2008-02-05 18:40:57 +00:00
* We recommend to use the module name as prefix for them ( e . g . posixAccount_homeDirectory ) to avoid naming conflicts .
2004-07-24 17:14:39 +00:00
*
* @ param array $scopes account types ( user , group , host )
2008-02-05 18:40:57 +00:00
* @ param array $allScopes list of all active account modules and their scopes ( module => array ( scopes ))
* @ return array meta HTML code
*
* @ see baseModule :: get_metaData ()
* @ see parseHtml ()
2004-07-24 17:14:39 +00:00
*/
2008-02-05 18:40:57 +00:00
public function get_configOptions ( $scopes , $allScopes ) {
2004-07-24 17:14:39 +00:00
$return = array ();
for ( $i = 0 ; $i < sizeof ( $scopes ); $i ++ ) {
if ( isset ( $this -> meta [ 'config_options' ][ $scopes [ $i ]])) $return = array_merge ( $return , $this -> meta [ 'config_options' ][ $scopes [ $i ]]);
}
if ( isset ( $this -> meta [ 'config_options' ][ 'all' ])) $return = array_merge ( $return , $this -> meta [ 'config_options' ][ 'all' ]);
return $return ;
}
/**
* Checks input values of module settings .
2008-02-05 18:40:57 +00:00
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* If the input data is invalid the return value is an array that contains subarrays to build StatusMessages ( 'message type' , 'message head' , 'message text' ) .
* < br > If no errors occured the function returns an empty array .
2004-07-24 17:14:39 +00:00
*
* @ param array $scopes list of account types which are used
2008-02-05 18:40:57 +00:00
* @ param array $options hash array ( option name => value ) that contains the input . The option values are all arrays containing one or more elements .
2004-08-01 09:37:21 +00:00
* @ return array list of error messages
2008-02-05 18:40:57 +00:00
*
* @ see baseModule :: get_metaData ()
2004-07-24 17:14:39 +00:00
*/
2008-02-05 18:40:57 +00:00
public function check_configOptions ( $scopes , $options ) {
2004-07-24 17:14:39 +00:00
$messages = array ();
$scopes [] = 'all' ; // add checks that are independent of scope
for ( $s = 0 ; $s < sizeof ( $scopes ); $s ++ ) {
2006-05-13 08:55:31 +00:00
if ( isset ( $this -> meta [ 'config_checks' ][ $scopes [ $s ]]) && is_array ( $this -> meta [ 'config_checks' ][ $scopes [ $s ]])) {
2004-07-24 17:14:39 +00:00
$identifiers = array_keys ( $this -> meta [ 'config_checks' ][ $scopes [ $s ]]);
for ( $i = 0 ; $i < sizeof ( $identifiers ); $i ++ ) {
// check if option is required
2007-10-05 18:09:49 +00:00
if ( isset ( $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'required' ]) && ( $options [ $identifiers [ $i ]][ 0 ] == '' )) {
2004-07-24 17:14:39 +00:00
$messages [] = $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'required_message' ];
}
2004-09-26 15:45:40 +00:00
switch ( $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'type' ]) {
// check by regular expression (from account.inc)
case " ext_preg " :
// ignore empty fileds
if ( $options [ $identifiers [ $i ]][ 0 ] == '' ) continue ;
if ( ! get_preg ( $options [ $identifiers [ $i ]][ 0 ], $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'regex' ])) {
$messages [] = $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'error_message' ];
2006-08-14 17:29:45 +00:00
}
2004-09-26 15:45:40 +00:00
break ;
// check by regular expression (case insensitive)
case " regex_i " :
// ignore empty fileds
if ( $options [ $identifiers [ $i ]][ 0 ] == '' ) continue ;
2009-08-13 18:57:26 +00:00
if ( ! preg_match ( '/' . $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'regex' ] . '/i' , $options [ $identifiers [ $i ]][ 0 ])) {
2004-09-26 15:45:40 +00:00
$messages [] = $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'error_message' ];
2006-08-14 17:29:45 +00:00
}
2004-09-26 15:45:40 +00:00
break ;
// check by regular expression (case sensitive)
case " regex " :
// ignore empty fileds
if ( $options [ $identifiers [ $i ]][ 0 ] == '' ) continue ;
2009-08-13 18:57:26 +00:00
if ( ! preg_match ( '/' . $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'regex' ] . '/' , $options [ $identifiers [ $i ]][ 0 ])) {
2004-09-26 15:45:40 +00:00
$messages [] = $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'error_message' ];
}
break ;
// check by integer comparison (greater)
case " int_greater " :
// ignore if both fields are empty
if (( $options [ $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'cmp_name1' ]][ 0 ] == '' ) && ( $options [ $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'cmp_name2' ]][ 0 ] == '' )) continue ;
// print error message if only one field is empty
if (( $options [ $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'cmp_name1' ]][ 0 ] == '' ) || ( $options [ $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'cmp_name2' ]][ 0 ] == '' )) {
$messages [] = $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'error_message' ];
continue ;
}
// compare
if ( ! ( intval ( $options [ $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'cmp_name1' ]][ 0 ]) > intval ( $options [ $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'cmp_name2' ]][ 0 ]))) {
$messages [] = $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'error_message' ];
}
break ;
// check by integer comparison (greater or equal)
case " int_greaterOrEqual " :
// ignore if both fields are empty
if (( $options [ $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'cmp_name1' ]][ 0 ] == '' ) && ( $options [ $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'cmp_name2' ]][ 0 ] == '' )) continue ;
// print error message if only one field is empty
if (( $options [ $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'cmp_name1' ]][ 0 ] == '' ) || ( $options [ $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'cmp_name2' ]][ 0 ] == '' )) {
$messages [] = $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'error_message' ];
continue ;
}
// compare
if ( ! ( intval ( $options [ $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'cmp_name1' ]][ 0 ]) >= intval ( $options [ $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'cmp_name2' ]][ 0 ]))) {
$messages [] = $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'error_message' ];
}
break ;
// print error message on undefined type
default :
StatusMessage ( " ERROR " , " Unsupported type! " , $this -> meta [ 'config_checks' ][ $scopes [ $s ]][ $identifiers [ $i ]][ 'type' ]);
break ;
2004-07-24 17:14:39 +00:00
}
}
}
}
return $messages ;
}
2006-08-14 17:29:45 +00:00
2004-08-17 15:16:17 +00:00
/**
2008-02-03 17:56:02 +00:00
* Returns a hashtable with all entries that may be printed out in the PDF .
2008-02-05 18:40:57 +00:00
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
2008-02-03 17:56:02 +00:00
* This method must be overwritten in case that there are non static values
2008-02-05 18:40:57 +00:00
* to be returned . The $this -> meta [ 'PDF_fields' ] array may be used for static content .< br >
2008-02-03 17:56:02 +00:00
* < br >
* < b > Format of returned hashtable :</ b >< br >
* < br >
* This function uses XML formatted commands to define the PDF output . Each part in the PDF
* document is surrounded by " <block> " and " </block> " .< br >
* Inside the < block > tags there are different ways to format the output :
* < ul >
* < li >< b > simple line with attribute name and value :</ b > < block >< key >< b > attribute name </ b ></ key >< value >< b > attribute value </ b ></ value ></ block ></ li >
* < li >< b > table :</ b > < block >< key >< b > attribute name </ b ></ key >< tr >< td >< b > value </ b >< td >< td >< b > value </ b >< td ></ tr ></ block >< block >< tr >< td >< b > value </ b ></ td >< td >< b > value </ b >< td ></ tr ></ block ></ li >
* </ ul >
* < b > Special commands :</ b >
* < ul >
* < li >< b > Alignment in < td >:</ b > You can specify the alignment in < td > tags with align = ( L | R | C ) ( e . g . < td align = \ " L \" >)</li>
* < li >< b > Cell width :</ b > < td > allows an attribute " width " to set the cell width ( e . g . < td width = 20 %> or < td width = 30 > ) .</ li >
* < li >< b > Line breaks :</ b > Line breaks can be specified by adding a << br >> tag . The new line will start at the left border of the PDF document .</ li >
* </ ul >
* < br >
* < b > Examples :</ b >< br >
* < br >
* < b > Simple name + value lines :</ b >< br >< br >
* In most cases you will just want to display a single line per attribute with its name and value .< br >
* < br >
* 'myAttribute' => '<block><key>AttrName</key><value>12345</value></block>' < br >
* < br >
* This will give the following PDF output :< br >
* < br >
* < b > Attribute name :</ b > 12345 < br >
* < br >
* < br >
* < b > Multiline values :</ b >< br >< br >
* Sometimes you have multivalued attributes where it is not applicable to write all values in one line but
* where you want to list your values one below the other or show a table . This can be done by using the < td > tag .< br >
* < br >
* This example only uses one column but you can just use more < td > tags per < block > tag to display more columns .< br >
* < br >
* 'myAttribute' => '<block><key>AttrName</key><tr><td align=\"L\">123</td></tr></block><block><tr><td align=\"L\">456</td></tr></block><block><tr><td align=\"L\">789</td></tr></block>'
*
2004-08-17 15:16:17 +00:00
* @ param string $scope account type
2008-02-03 17:56:02 +00:00
* @ return array PDF entries
*
* @ see baseModule :: get_metaData ()
2004-08-17 15:16:17 +00:00
*/
2008-02-05 18:40:57 +00:00
public function get_pdfFields () {
return (( isset ( $this -> meta [ 'PDF_fields' ])) ? $this -> meta [ 'PDF_fields' ] : array ());
2004-08-17 15:16:17 +00:00
}
2004-07-24 17:14:39 +00:00
2008-12-17 17:09:23 +00:00
/**
* Returns the PDF entries for this module .
*
* @ return array list of possible PDF entries
*/
public function get_pdfEntries () {
return array ();
}
2004-08-23 20:01:40 +00:00
/**
* Returns an array containing all input columns for the file upload .
*
2008-02-05 18:40:57 +00:00
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* This funtion returns an array which contains subarrays which represent an upload column .
* < b > Syntax of column arrays :</ b >
2008-02-03 18:46:11 +00:00
* < br >
2004-08-23 20:01:40 +00:00
* < br > array (
* < br > string : name , // fixed non-translated name which is used as column name (should be of format: <module name>_<column name>)
2004-08-28 11:53:40 +00:00
* < br > string : description , // short descriptive name
* < br > string : help , // help ID
2004-08-23 20:01:40 +00:00
* < br > string : example , // example value
2008-02-05 18:40:57 +00:00
* < br > string : values , // possible input values (optional)
* < br > string : default , // default value (optional)
2004-08-23 20:01:40 +00:00
* < br > boolean : required // true, if user must set a value for this column
2008-02-05 18:40:57 +00:00
* < br > boolean : unique // true if all values of this column must be different values (optional, default: "false")
2004-08-23 20:01:40 +00:00
* < br > )
*
* @ return array column list
2008-02-05 18:40:57 +00:00
*
* @ see baseModule :: get_metaData ()
2004-08-23 20:01:40 +00:00
*/
2008-02-05 18:40:57 +00:00
public function get_uploadColumns () {
2004-08-23 20:01:40 +00:00
if ( isset ( $this -> meta [ 'upload_columns' ])) return $this -> meta [ 'upload_columns' ];
else return array ();
}
/**
* Returns a list of module names which must be processed in building the account befor this module .
*
2008-02-05 18:40:57 +00:00
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* The named modules may not be active , LAM will check this automatically .
*
2004-08-23 20:01:40 +00:00
* @ return array list of module names
2008-02-05 18:40:57 +00:00
*
* @ see baseModule :: get_metaData ()
2004-08-23 20:01:40 +00:00
*/
2008-02-05 18:40:57 +00:00
public function get_uploadPreDepends () {
2004-08-23 20:01:40 +00:00
if ( isset ( $this -> meta [ 'upload_preDepends' ])) return $this -> meta [ 'upload_preDepends' ];
else return array ();
}
/**
2008-02-05 18:40:57 +00:00
* In this function the LDAP accounts are built .
2004-08-23 20:01:40 +00:00
*
2008-02-05 18:40:57 +00:00
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* Returns an array which contains subarrays to generate StatusMessages if any errors occured .
*
* @ param array $rawAccounts the user input data , contains one subarray for each account .
2004-08-23 20:01:40 +00:00
* @ param array $partialAccounts list of hash arrays ( name => value ) which are later added to LDAP
2004-09-19 08:28:03 +00:00
* @ param array $ids list of IDs for column position ( e . g . " posixAccount_uid " => 5 )
* @ return array list of error messages if any
2004-08-23 20:01:40 +00:00
*/
2008-02-05 18:40:57 +00:00
public function build_uploadAccounts ( $rawAccounts , $ids , & $partialAccounts ) {
2004-08-23 20:01:40 +00:00
// must be implemented in sub modules
2004-09-19 08:28:03 +00:00
return array ();
2004-08-23 20:01:40 +00:00
}
2006-08-14 17:29:45 +00:00
2004-09-08 14:38:55 +00:00
/**
2008-02-03 18:37:05 +00:00
* This function returns the help entry array for a specific help id .
2008-02-05 18:40:57 +00:00
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
2008-02-03 18:37:05 +00:00
* The result is an hashtable with the following keys :< br >
* < ul >
* < li >< b > Headline ( required ) </ b >< br >
* The headline of this help entry . Can consist of any alpha - numeric characters . No HTML / CSS elements are allowed .</ li >
* < li >< b > Text ( required ) </ b >< br >
* The text of the help entry which may contain any alpha - numeric characters .</ li >
* < li >< b > SeeAlso ( optional ) </ b >< br >
* A reference to anonther related web site . It must be an array containing a field called " text " with the link text
* that should be displayed and a field called " link " which is the link target .</ li >
* </ ul >
* < br >
* < b > Example :</ b >< br >
* < br >
2009-08-10 16:13:27 +00:00
* array ( 'Headline' => 'This is the head line' , 'Text' => 'Help content' , 'SeeAlso' => array ( 'text' => 'LAM homepage' , 'link' => 'http://www.ldap-account-manager.org/' ))
2006-08-14 17:29:45 +00:00
*
2004-09-08 14:38:55 +00:00
* @ param string $id The id string for the help entry needed .
* @ return array The desired help entry .
2008-02-03 18:37:05 +00:00
*
* @ see baseModule :: get_metaData ()
2004-09-08 14:38:55 +00:00
*/
2008-02-05 18:40:57 +00:00
public function get_help ( $id ) {
2004-09-08 14:38:55 +00:00
if ( isset ( $this -> meta [ 'help' ][ $id ])) {
return $this -> meta [ 'help' ][ $id ];
}
2004-10-30 16:46:06 +00:00
elseif ( isset ( $this -> meta [ 'help' ][ $this -> scope ][ $id ])) {
return $this -> meta [ 'help' ][ $this -> scope ][ $id ];
2004-09-08 18:26:00 +00:00
}
2004-09-08 14:38:55 +00:00
else {
return false ;
}
}
2004-08-23 20:01:40 +00:00
2005-08-13 09:19:40 +00:00
/**
* This function is used to check if this module page can be displayed .
2008-02-05 18:40:57 +00:00
*
* Calling this method requires the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* Your module might depend on input of other modules . This function determines if the user
* can change to your module page or not . The return value is true if your module accepts
* input , otherwise false .< br >
* This method ' s return value defaults to true .
2005-08-13 09:19:40 +00:00
*
* @ return boolean true , if page can be displayed
*/
2008-02-05 18:40:57 +00:00
public function module_ready () {
2005-08-13 09:19:40 +00:00
return true ;
}
/**
2009-02-01 16:18:25 +00:00
* This function is used to check if all settings for this module have been made .
2008-02-05 18:40:57 +00:00
*
* Calling this method requires the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* This function tells LAM if it can create / modify the LDAP account . If your module needs any
* additional input then set this to false . The user will be notified that your module needs
* more input .< br >
* This method ' s return value defaults to true .
2005-08-13 09:19:40 +00:00
*
* @ return boolean true , if settings are complete
*/
2008-02-05 18:40:57 +00:00
public function module_complete () {
2005-08-13 09:19:40 +00:00
return true ;
}
2006-08-14 17:29:45 +00:00
2005-08-26 08:53:16 +00:00
/**
* Controls if the module button the account page is visible and activated .
2008-02-05 18:40:57 +00:00
*
* Calling this method requires the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* < b > Possible return values :</ b >
* < ul >
* < li >< b > enabled :</ b > button is visible and active </ li >
* < li >< b > disabled :</ b > button is visible and deactivated ( greyed ) </ li >
* < li >< b > hidden :</ b > no button will be shown </ li >
* </ ul >
2005-08-26 08:53:16 +00:00
*
* @ return string status ( " enabled " , " disabled " , " hidden " )
*/
2008-02-05 18:40:57 +00:00
public function getButtonStatus () {
2005-08-26 08:53:16 +00:00
return " enabled " ;
}
2005-08-13 09:19:40 +00:00
2004-10-19 18:18:46 +00:00
/**
2008-02-05 18:40:57 +00:00
* This function is responsible to do additional tasks after the account has been created in LDAP ( e . g . modifying group memberships , adding Quota etc .. ) .
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* This function is called as long as the returned status is 'finished' . Please make sure
* that one function call lasts no longer than 3 - 4 seconds . Otherwise the upload may fail
* because the time limit is exceeded . You should not make more than one LDAP operation in
* each call .
2004-10-19 18:18:46 +00:00
*
* @ param array $data array containing one account in each element
2008-02-05 18:40:57 +00:00
* @ param array $ids maps the column names to keys for the sub arrays ( array ( < column_name > => < column number > ))
* @ param array $failed list of account numbers which could not be successfully uploaded to LDAP
2004-10-19 18:18:46 +00:00
* @ param array $temp variable to store temporary data between two post actions
* @ return array current status
* < br > array (
2008-02-05 18:40:57 +00:00
* < br > 'status' => 'finished' | 'inProgress' // defines if all operations are complete
* < br > 'progress' => 0. . 100 // the progress of the operations in percent
* < br > 'errors' => array // list of arrays which are used to generate StatusMessages
2004-10-19 18:18:46 +00:00
* < br > )
*/
2008-02-05 18:40:57 +00:00
public function doUploadPostActions ( $data , $ids , $failed , & $temp ) {
2004-10-19 18:18:46 +00:00
return array (
'status' => 'finished' ,
'progress' => 100 ,
'errors' => array ()
);
}
2004-06-08 18:39:53 +00:00
2006-02-01 19:10:51 +00:00
/**
* Returns a list of modifications which have to be made to the LDAP account .
2008-02-05 18:40:57 +00:00
*
* Calling this method requires the existence of an enclosing { @ link accountContainer } .< br >
* < br >
2006-02-01 19:10:51 +00:00
*
* < br > This function returns an array with 3 entries :
* < br > array ( DN1 ( 'add' => array ( $attr ), 'remove' => array ( $attr ), 'modify' => array ( $attr )), DN2 .... )
2008-02-05 18:40:57 +00:00
* < br > DN is the DN to change . It is possible to change several DNs ( e . g . create a new user and add him
* to some groups via attribute memberUid ) < br >
* < br >< b > " add " </ b > are attributes which have to be added to the LDAP entry
* < br >< b > " remove " </ b > are attributes which have to be removed from the LDAP entry
* < br >< b > " modify " </ b > are attributes which have to be modified in the LDAP entry
* < br >< b > " notchanged " </ b > are attributes which stay unchanged
* < br >
* < br > This builds the required comands from $this - attributes and $this -> orig .
*
* @ return array list of modifications
2006-02-01 19:10:51 +00:00
*/
2008-02-05 18:40:57 +00:00
public function save_attributes () {
2007-10-03 19:18:07 +00:00
return $this -> getAccountContainer () -> save_module_attributes ( $this -> attributes , $this -> orig );
2006-02-01 19:10:51 +00:00
}
2007-02-22 18:25:24 +00:00
/**
2007-02-25 13:48:51 +00:00
* Allows the module to run commands before the LDAP entry is changed or created .
2008-02-05 18:40:57 +00:00
*
* Calling this method requires the existence of an enclosing { @ link accountContainer } .< br >
* < br >
2007-02-25 13:48:51 +00:00
* An error message should be printed if the function returns false .
*
* @ param boolean $newAccount new account
2009-05-21 16:33:50 +00:00
* @ param array $attributes LDAP attributes of this entry
2009-05-21 15:57:40 +00:00
* @ return boolean true , if no problems occured
2007-02-25 13:48:51 +00:00
*/
2009-05-21 16:33:50 +00:00
public function preModifyActions ( $newAccount , $attributes ) {
2007-02-25 13:48:51 +00:00
return true ;
}
/**
* Allows the module to run commands after the LDAP entry is changed or created .
2008-02-05 18:40:57 +00:00
*
* Calling this method requires the existence of an enclosing { @ link accountContainer } .
2007-02-22 18:25:24 +00:00
*
* @ param boolean $newAccount new account
2009-05-21 16:33:50 +00:00
* @ param array $attributes LDAP attributes of this entry
2007-02-22 18:25:24 +00:00
*/
2009-05-21 16:33:50 +00:00
public function postModifyActions ( $newAccount , $attributes ) {
2007-02-22 18:25:24 +00:00
return ;
}
/**
2007-02-25 13:48:51 +00:00
* Allows the module to run commands before the LDAP entry is deleted .
2008-02-05 18:40:57 +00:00
*
* Calling this method requires the existence of an enclosing { @ link accountContainer } .< br >
* < br >
2007-02-25 13:48:51 +00:00
* An error message should be printed if the function returns false .
*
2009-05-21 15:57:40 +00:00
* @ return boolean true , if no problems occured
2007-02-25 13:48:51 +00:00
*/
2008-02-05 18:40:57 +00:00
public function preDeleteActions () {
2007-02-25 13:48:51 +00:00
return true ;
}
/**
* Allows the module to run commands after the LDAP entry is deleted .
2008-02-05 18:40:57 +00:00
*
* Calling this method requires the existence of an enclosing { @ link accountContainer } .
2007-02-22 18:25:24 +00:00
*/
2008-02-05 18:40:57 +00:00
public function postDeleteActions () {
2007-02-22 18:25:24 +00:00
return ;
}
2005-04-04 16:54:10 +00:00
/**
2008-02-05 18:40:57 +00:00
* This function returns an array with the same syntax as save_attributes () .
*
* Calling this method requires the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* It allows additional LDAP changes when an account is deleted .
2005-04-04 16:54:10 +00:00
*
* @ return List of LDAP operations , same as for save_attributes ()
*/
2008-02-05 18:40:57 +00:00
public function delete_attributes () {
2005-04-04 16:54:10 +00:00
return 0 ;
}
/**
2008-02-05 18:40:57 +00:00
* This function creates meta HTML code which will be displayed when an account should be deleted .
*
* Calling this method requires the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* This can be used to interact with the user , e . g . should the home directory be deleted ? The output
* of all modules is displayed on a single page .
2005-04-04 16:54:10 +00:00
*
* @ return meta HTML code
2008-02-05 18:40:57 +00:00
* @ see parseHtml ()
2005-04-04 16:54:10 +00:00
*/
2008-02-05 18:40:57 +00:00
public function display_html_delete () {
2005-04-04 16:54:10 +00:00
return 0 ;
}
2008-02-05 18:40:57 +00:00
/**
* This function processes user input .
*
* Calling this method requires the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* It checks the user input and saves changes in the module ' s data structures .< br >
* < br >
* < b > Example :</ b > return array ( array ( 'ERROR' , 'Invalid input!' , 'This is not allowed here.' ));
*
* @ return array Array which contains status messages . Each entry is an array containing the status message parameters .
*/
public abstract function process_attributes ();
/**
* This function creates meta HTML code to display the module page .
*
* Calling this method requires the existence of an enclosing { @ link accountContainer } .
*
* @ return meta HTML
*
* @ see parseHtml ()
*/
public abstract function display_html_attributes ();
2006-08-14 17:29:45 +00:00
2006-04-05 15:48:27 +00:00
/**
* Returns a list of managed object classes for this module .
2008-02-05 18:40:57 +00:00
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* This is used to fix spelling errors in LDAP - Entries ( e . g . if " posixACCOUNT " is read instead of " posixAccount " from LDAP ) .< br >
* < br >
* < b > Example :</ b > return array ( 'posixAccount' )
2006-04-05 15:48:27 +00:00
*
* @ return array list of object classes
2008-02-05 18:40:57 +00:00
*
* @ see baseModule :: get_metaData ()
2006-04-05 15:48:27 +00:00
*/
2008-02-05 18:40:57 +00:00
public function getManagedObjectClasses () {
2006-04-05 15:48:27 +00:00
if ( isset ( $this -> meta [ 'objectClasses' ]) && is_array ( $this -> meta [ 'objectClasses' ])) return $this -> meta [ 'objectClasses' ];
else return array ();
}
2006-08-14 17:29:45 +00:00
2006-05-01 16:13:10 +00:00
/**
* Returns a list of aliases for LDAP attributes .
2008-02-05 18:40:57 +00:00
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
2006-05-01 16:13:10 +00:00
* All alias attributes will be renamed to the given attribute names .
*
2008-02-05 18:40:57 +00:00
* @ return array list of aliases like array ( " alias name " => " attribute name " )
*
* @ see baseModule :: get_metaData ()
2006-05-01 16:13:10 +00:00
*/
2008-02-05 18:40:57 +00:00
public function getLDAPAliases () {
2006-05-01 16:13:10 +00:00
if ( isset ( $this -> meta [ 'LDAPaliases' ]) && is_array ( $this -> meta [ 'LDAPaliases' ])) return $this -> meta [ 'LDAPaliases' ];
else return array ();
}
2006-08-14 17:29:45 +00:00
2006-05-13 08:55:31 +00:00
/**
* Returns a list of LDAP attributes which are managed by this module .
* All attribute names will be renamed to match the given spelling .
*
* @ return array list of attributes
2008-02-05 18:40:57 +00:00
*
* @ see baseModule :: get_metaData ()
2006-05-13 08:55:31 +00:00
*/
2008-02-05 18:40:57 +00:00
public function getManagedAttributes () {
2006-05-13 08:55:31 +00:00
if ( isset ( $this -> meta [ 'attributes' ]) && is_array ( $this -> meta [ 'attributes' ])) return $this -> meta [ 'attributes' ];
else return array ();
}
2006-08-14 17:29:45 +00:00
2006-04-29 09:58:17 +00:00
/**
2008-08-09 11:18:36 +00:00
* This function returns a list of PHP extensions ( e . g . hash ) which are needed by this module .
2008-02-05 18:40:57 +00:00
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .
2006-04-29 09:58:17 +00:00
*
* @ return array extensions
2008-02-05 18:40:57 +00:00
*
* @ see baseModule :: get_metaData ()
2006-04-29 09:58:17 +00:00
*/
2008-02-05 18:40:57 +00:00
public function getRequiredExtensions () {
2006-04-29 09:58:17 +00:00
if ( isset ( $this -> meta [ 'extensions' ]) && is_array ( $this -> meta [ 'extensions' ])) return $this -> meta [ 'extensions' ];
2006-08-14 17:29:45 +00:00
else return array ();
2006-04-29 09:58:17 +00:00
}
2006-08-14 17:29:45 +00:00
2006-06-28 15:12:29 +00:00
/**
2008-02-05 18:40:57 +00:00
* This function returns a list of possible LDAP attributes ( e . g . uid , cn , ... ) which can be used to search for LDAP objects .
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .
2006-06-28 15:12:29 +00:00
*
* @ return array attributes
2008-02-05 18:40:57 +00:00
*
* @ see baseModule :: get_metaData ()
2006-06-28 15:12:29 +00:00
*/
2008-02-05 18:40:57 +00:00
public function getSelfServiceSearchAttributes () {
2006-06-28 15:12:29 +00:00
if ( isset ( $this -> meta [ 'selfServiceSearchAttributes' ]) && is_array ( $this -> meta [ 'selfServiceSearchAttributes' ])) return $this -> meta [ 'selfServiceSearchAttributes' ];
2006-08-14 17:29:45 +00:00
else return array ();
2006-06-28 15:12:29 +00:00
}
2006-07-16 17:15:37 +00:00
/**
2008-02-05 18:40:57 +00:00
* Returns a list of possible input fields and their descriptions .
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* < b > Format :</ b > array ( < field identifier > => < field description > )
2006-07-16 17:15:37 +00:00
*
* @ return array fields
2008-02-05 18:40:57 +00:00
*
* @ see baseModule :: get_metaData ()
2006-07-16 17:15:37 +00:00
*/
2008-02-05 18:40:57 +00:00
public function getSelfServiceFields () {
2006-07-16 17:15:37 +00:00
if ( isset ( $this -> meta [ 'selfServiceFieldSettings' ]) && is_array ( $this -> meta [ 'selfServiceFieldSettings' ])) return $this -> meta [ 'selfServiceFieldSettings' ];
2006-08-14 17:29:45 +00:00
else return array ();
2006-07-16 17:15:37 +00:00
}
2006-08-14 17:29:45 +00:00
2006-07-23 15:04:12 +00:00
/**
* Returns the meta HTML code for each input field .
2008-02-05 18:40:57 +00:00
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* < b > Format :</ b > array ( < field1 > => array ( < META HTML > ), ... ) < br >
2006-07-23 15:04:12 +00:00
* It is not possible to display help links .
*
* @ param array $fields list of active fields
* @ param array $attributes attributes of LDAP account ( attribute names in lower case )
* @ return array meta HTML
2008-02-05 18:40:57 +00:00
*
* @ see parseHtml ()
2006-07-23 15:04:12 +00:00
*/
2008-02-05 18:40:57 +00:00
public function getSelfServiceOptions ( $fields , $attributes ) {
2006-07-23 15:04:12 +00:00
// this function must be overwritten by subclasses.
return array ();
}
/**
2008-02-05 18:40:57 +00:00
* Checks if all input values are correct and returns the LDAP attributes which should be changed .
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .
2006-07-23 15:04:12 +00:00
*
* @ param string $fields input fields
* @ param array $attributes LDAP attributes
2008-02-05 18:40:57 +00:00
* @ return array messages and attributes ( array ( 'messages' => array (), 'add' => array ( 'mail' => array ( 'test@test.com' )), 'del' => array (), 'mod' => array ()))
2006-07-23 15:04:12 +00:00
*/
2008-02-05 18:40:57 +00:00
public function checkSelfServiceOptions ( $fields , $attributes ) {
2006-07-23 15:04:12 +00:00
$return = array ( 'messages' => array (), 'add' => array (), 'del' => array (), 'mod' => array ());
return $return ;
}
2005-04-04 16:54:10 +00:00
2006-11-21 17:37:12 +00:00
/**
* Returns a list of self service configuration settings .
2008-02-05 18:40:57 +00:00
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* The type " fieldset " is not allowed here . The name attributes are used as keywords to load
* and save settings . We recommend to use the module name as prefix for them
* ( e . g . posixAccount_homeDirectory ) to avoid naming conflicts .
2006-11-21 17:37:12 +00:00
*
2008-02-05 18:40:57 +00:00
* @ return array meta HTML code
*
* @ see baseModule :: get_metaData ()
* @ see parseHtml ()
2006-11-21 17:37:12 +00:00
*/
2008-02-05 18:40:57 +00:00
public function getSelfServiceSettings () {
2006-11-21 17:37:12 +00:00
if ( isset ( $this -> meta [ 'selfServiceSettings' ]) && is_array ( $this -> meta [ 'selfServiceSettings' ])) return $this -> meta [ 'selfServiceSettings' ];
else return array ();
}
/**
* Checks if the self service settings are valid .
2008-02-05 18:40:57 +00:00
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .< br >
* < br >
* If the input data is invalid the return value is an array that contains arrays
* to build StatusMessages ( message type , message head , message text ) . If no errors
* occured the function returns an empty array .
2006-11-21 17:37:12 +00:00
*
2008-02-05 18:40:57 +00:00
* @ param array $options hash array ( option name => value ) that contains the input . The option values are all arrays containing one or more elements .
2006-11-21 17:37:12 +00:00
* @ return array error messages
*/
2008-02-05 18:40:57 +00:00
public function checkSelfServiceSettings ( $options ) {
2006-11-21 17:37:12 +00:00
// needs to be implemented by the subclasses, if needed
return array ();
}
2007-10-03 18:02:10 +00:00
2009-11-23 18:39:26 +00:00
/**
* Allows the module to run commands before the LDAP entry is changed or created .
*
* An error message should be printed if the function returns false .
*
* @ param array $attributes LDAP attributes of this entry
* @ return boolean true , if no problems occured
*/
public function preModifySelfService ( $attributes ) {
return true ;
}
/**
* Allows the module to run commands after the LDAP entry is changed or created .
*
* @ param array $attributes LDAP attributes of this entry
* @ return boolean true , if no problems occured
*/
public function postModifySelfService ( $attributes ) {
return true ;
}
2007-10-03 18:02:10 +00:00
/**
2008-02-05 18:40:57 +00:00
* Returns the { @ link accountContainer } object .
2007-10-03 18:02:10 +00:00
*
* @ return accountContainer accountContainer object
*
2008-02-05 18:40:57 +00:00
* @ see accountContainer
2007-10-03 18:02:10 +00:00
*/
protected function getAccountContainer () {
if ( isset ( $this -> base ) && isset ( $_SESSION [ $this -> base ])) {
return $_SESSION [ $this -> base ];
}
else {
return null ;
}
}
2007-10-10 19:04:39 +00:00
/**
* Returns the LDAP attributes which are managed in this module .
*
* @ return array attributes
*/
public function getAttributes () {
return $this -> attributes ;
}
/**
* Returns the LDAP attributes which are managed in this module ( with unchanged values ) .
*
* @ return array attributes
*/
public function getOriginalAttributes () {
return $this -> orig ;
}
2007-11-19 18:42:03 +00:00
/**
* Returns the path to the module icon .
2007-12-01 12:34:52 +00:00
* The path must be releative to graphics ( e . g . key . png ) . You can also set $this -> meta [ 'icon' ] .
* The preferred size is 32 x32px .
2007-11-19 18:42:03 +00:00
*
* @ return unknown
2008-02-05 18:40:57 +00:00
*
* @ see baseModule :: get_metaData ()
2007-11-19 18:42:03 +00:00
*/
public function getIcon () {
if ( isset ( $this -> meta [ 'icon' ])) {
return $this -> meta [ 'icon' ];
}
return null ;
}
2009-10-03 17:48:37 +00:00
// helper functions
/**
* Returns if the given configuration option is set .
* This function returns false if the configuration options cannot be read .
*
* @ param String $optionName name of the option
* @ return boolean true if option is set
*/
protected function isBooleanConfigOptionSet ( $optionName ) {
// abort if configuration is not available
if ( ! isset ( $this -> moduleSettings ) || ! is_array ( $this -> moduleSettings )) {
return false ;
}
if ( isset ( $this -> moduleSettings [ $optionName ][ 0 ]) && ( $this -> moduleSettings [ $optionName ][ 0 ] == 'true' )) {
return true ;
}
return false ;
}
2006-11-21 17:37:12 +00:00
2004-10-19 18:18:46 +00:00
}
2004-06-08 18:39:53 +00:00
?>