%s:%s ',time(),__METHOD__);
if (DEBUGTMP||DEBUGTMPSUB) printf('* %s [Visit-Start:%s] ',__METHOD__,get_class($this));
$tree = get_cached_item($this->server_id,'tree');
if (! $tree)
$tree = Tree::getInstance($this->server_id);
$treeitem = $tree->getEntry($this->dn);
# If we have a DN, and no template_id, see if the tree has one from last time
if ($this->dn && is_null($this->template_id) && $treeitem && $treeitem->getTemplate())
$this->template_id = $treeitem->getTemplate();
# Check that we have a valid template, or present a selection
# @todo change this so that the modification templates rendered are the ones for the objectclass of the dn.
if (! $this->template_id)
$this->template_id = $this->getTemplateChoice();
if ($treeitem)
$treeitem->setTemplate($this->template_id);
$this->page = get_request('page','REQUEST',false,1);
if ($this->template_id) {
parent::accept();
$this->url_base = sprintf('server_id=%s&dn=%s',
$this->getServerID(),rawurlencode($this->template->getDN()));
$this->layout['hint'] = sprintf('
';
# If we dont want to render this template automatically, we'll return here.
if ($norender)
return;
$this->visitStart();
foreach ($this->template->getAttributes(true) as $attribute) {
# Evaluate our defaults
if ($attribute->getAutoValue())
$this->get('Default',$attribute,
$this->template->getContainer() ? $this->template->getContainer() : $this->getServer()->getContainerPath($this->template->getDN()),
'autovalue');
# If this is the default template, we should mark all our attributes to show().
if (($this->template->getID() == 'none') && (! $attribute->isInternal())
&& (($this->template->getContext() == 'edit' && $this->template->getID() == 'none')
|| ($this->template->getContext() == 'create' && $attribute->getName() != 'objectclass')))
$attribute->show();
}
if (DEBUGTMP||DEBUGTMPSUB) printf('* %s [Visit-End:%s] ',__METHOD__,get_class($this));
$this->visitEnd();
}
}
protected function getDefaultAttribute($attribute,$container,$type) {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
switch ($type) {
case 'autovalue':
$autovalue = $attribute->getAutoValue();
break;
case 'helpervalue':
$autovalue = $attribute->getHelperValue();
break;
default:
system_message(array(
'title'=>_('Unknown Default Attribute context'),
'body'=>sprintf('%s (%s)',_('A call was made to getDefaultAttribute() with an unkown context'),$type),
'type'=>'warn'));
return;
}
$args = explode(';',$autovalue['args']);
$server = $this->getServer();
$vals = '';
switch ($autovalue['function']) {
/**
* Function enables normal PHP functions to be called to evaluate a value.
* eg: =php.Function(date;dmY)
*
* All arguments will be passed to the function, and its value returned.
* If this used used in a POST context, the attribute values can be used as arguments.
*
* Mandatory Arguments:
* * arg 0
* - php Function to call
*
* Additional arguments will be passed to the function.
*/
case 'Function':
$function = array_shift($args);
if (count($args) && count($args) > 1) {
system_message(array(
'title'=>_('Too many arguments'),
'body'=>sprintf('%s (%s)',_('Function() only takes two arguments and more than two were specified'),count($args)),
'type'=>'warn'));
return;
}
$function_args = explode(',',$args[0]);
if (function_exists($function))
$vals = call_user_func_array($function,$function_args);
else
system_message(array(
'title'=>_('Function doesnt exist'),
'body'=>sprintf('%s (%s)',_('An attempt was made to call a function that doesnt exist'),$function),
'type'=>'warn'));
break;
/**
* GetNextNumber will query the LDAP server and calculate the next number based on the query
* eg:
*
* Mandatory Arguments:
* * arg 0
* - "$" => 'auto_number','search_base' in config file
* - "/",".",".." => get container parent as usual
*
* * arg 1
* - attribute to query for
*
* Optional Arguments:
* * arg 2 (pool mechanism only)
* - "true" increments attribute by 1
* - "false" do nothing
*
* * arg 3 (pool mechanism only)
* - ldap filter (must match one entry only in container)
*
* * arg 4
* - calculus on number, eg:
* - *2,+1000 => number = (2*number) + 1000
*
* * arg 5
* - Min number
*/
case 'GetNextNumber':
# If the attribute already has values, we'll return
if ($type == 'autovalue' && $attribute->getValues())
return;
if ($args[0] == '$')
$args[0] = $server->getValue($this->server_id,'auto_number','search_base');
$container = $server->getContainerPath($container,$args[0]);
$vals = get_next_number($container,$args[1],
(! empty($args[2]) && ($args[2] == 'false')) ? false : true,
(! empty($args[3])) ? $args[3] : false,
(! empty($args[5])) ? $args[5] : null);
# Operate calculus on next number.
if (! empty($args[4])) {
$mod = explode(',',$args[4]);
$next_number = $vals;
foreach ($mod as $calc) {
$operand = $calc{0};
$operator = substr ($calc,1);
switch ($operand) {
case '*':
$next_number = $next_number * $operator;
break;
case '+':
$next_number = $next_number + $operator;
break;
case '-':
$next_number = $next_number - $operator;
break;
case '/':
$next_number = $next_number / $operator;
break;
}
}
$vals = $next_number;
}
break;
/**
* MultiList will query the LDAP server and provide a multi select list of values
* eg:
*
* eg: cn=root;nobody => cn=nobody;gidNumber;10;(gidNuber=%gidNumber%);uid)]]>
*
* Mandatory Arguments:
* * arg 0
* - container, to query from current position
* - "/",".",".." => get container parent as usual
*
* * arg 1
* - LDAP filter. May include '%attr%', it will be expanded.
*
* * arg2
* - list attribute key
*
* Optional Arguments:
* * arg3
* - select display (plus modifier /C: Capitalize)
* - replaced by %arg 2% if not given
*
* * arg 4
* - the value furnished in output - must be attribute id. replaced by arg 2 if not given
*
* * arg 5
* - container override
*
* * arg 6
* - csv list (, separator) of added values. syntax: key => display_attribute=value; key...
*
* * arg 7
* - csv list (, separator) of sort attributes (less to more important)
*
* * arg 8
* - size of displayed list (default: 10 lines)
*
* * arg 9
* - preselected values filter. see arg 1.
*
* * arg 10
* - key of preselected values. replaced by arg 4 if not given. replaced by arg 2 if both are not given.
*
* * arg 11
* - base dn override for preselected values
*
* @todo This could probably be merged with PickList
*/
case 'MultiList':
$args[2] = strtolower($args[2]);
# arg5 overrides our container
if (empty($args[5]))
$container = $server->getContainerPath($container,$args[0]);
else
$container = $args[5];
# Process filter (arg 1), eventually replace %attr% by it's value setted in a previous page.
preg_match_all('/%(\w+)(\|.+)?(\/[lUC])?%/U',$args[1],$filtermatchall);
# @todo this section needs to be validated/tested
if (isset($_REQUEST['form'])) {
$formvalues = array_change_key_case($_REQUEST['form']);
foreach ($filtermatchall[1] as $arg) {
$value = $formvalues[strtolower($arg)];
$args[1] = preg_replace("/%($arg)(\|.+)?(\/[lU])?%/U",$value,$args[1]);
}
}
$args[3] = ! empty($args[3]) ? $args[3] : "%{$args[2]}%";
preg_match_all('/%(\w+)(\|.+)?(\/[lUC])?%/U',$args[3],$matchall);
//print_r($matchall); // -1 = highlevel match, 1 = attr, 2 = subst, 3 = mod
$attrs = array_unique(array_merge($matchall[1],array($args[2])));
# arg7 is sort attributes
if (isset($args[7])) {
$sort_attrs = explode(',',$args[7]);
$attrs = array_merge($attrs,$sort_attrs);
}
$picklistvalues = return_ldap_hash($container,$args[1],$args[2],$attrs,(isset($args[7]) && ($args[7])) ? $sort_attrs : false);
# arg6 is a set of fixed values to add to search result
if (isset($args[6])) {
$fixedvalues = explode(',',$args[6]);
foreach ($fixedvalues as $fixedvalue) {
if (empty($fixedvalue))
continue;
$fixedvalue = preg_split('/=\>/',$fixedvalue);
$displayvalue = explode('=',$fixedvalue[1]);
$newvalue[trim($fixedvalue[0])] = array($args[2]=>trim($fixedvalue[0]),
trim($displayvalue[0])=>trim($displayvalue[1]));
$picklistvalues = array_merge($picklistvalues,$newvalue);
}
}
/* arg 9 is the search filter for already selected values, with criteriai eventually
coming from previous pages (eg: %uid%) */
if (isset($args[9])) {
preg_match_all('/%(\w+)(\|.+)?(\/[lUC])?%/U',$args[9],$matchallinlist);
foreach ($matchallinlist[1] as $arg) {
$value=$formvalues[strtolower($arg)];
$args[9] = preg_replace('/%('.$arg.')(\|.+)?(\/[lU])?%/U',$value,$args[9]);
}
# arg11 overrides container dn for selected values
if (! empty($args[11]))
$container = $args[11];
$inpicklistvalues = return_ldap_hash($container,$args[9],$args[2],$attrs);
}
$vals = array();
foreach ($picklistvalues as $key => $values) {
$display = $args[3];
foreach ($matchall[1] as $key => $arg) {
if (isset($values[$arg]))
$disp_val = $values[$arg];
else
$disp_val = '';
if (is_array($disp_val))
$disp_val = $disp_val[0];
if ($matchall[3][$key])
switch ($matchall[3][$key]) {
case '/l':
# lowercase
if (function_exists('mb_convert_case'))
$disp_val = mb_convert_case($disp_val,MB_CASE_LOWER,'utf-8');
else
$disp_val = strtolower($disp_val);
break;
case '/U':
# uppercase
if (function_exists('mb_convert_case'))
$disp_val = mb_convert_case($disp_val,MB_CASE_UPPER,'utf-8');
else
$disp_val = strtoupper($disp_val);
break;
case '/C':
# capitalize
if (function_exists('mb_convert_case'))
$disp_val = mb_convert_case($disp_val,MB_CASE_TITLE,'utf-8');
else
$disp_val = ucfirst($disp_val);
break;
default:
break;
}
# make value a substring of
preg_match_all('/^\|([0-9]*)-([0-9]*)$/',trim($matchall[2][$key]),$substrarray);
if ((isset($substrarray[1][0]) && $substrarray[1][0]) || (isset($substrarray[2][0]) && $substrarray[2][0])) {
$begin = $substrarray[1][0] ? $substrarray[1][0] : '0';
$end = $substrarray[2][0] ? $substrarray[2][0] : strlen($disp_val);
if (function_exists('mb_substr'))
$disp_val = mb_substr($disp_val,$begin,$end,'utf-8');
else
$disp_val = substr($disp_val,$begin,$end);
}
$display = preg_replace("/%($arg)(\|.+)?(\/[lUC])?%/U",$disp_val,$display);
}
if (! isset($picklist[$values[$args[2]]])) {
$vals[$values[$args[2]]] = $display;
$picklist[$values[$args[2]]] = true;
}
}
break;
/**
* PasswordEncryptionTypes will return a list of our support password encryption types
* eg: =php.PasswordEncryptionTypes()
*
* This function doesnt use any arguments
*/
case 'PasswordEncryptionTypes':
$vals = password_types();
break;
/**
* PickList will query the LDAP server and provide a select list of values
* eg:
*
* eg: cn=Administrators,S-1-5-XX-YYY => cn=Users,S-1-5-XX-YYY => cn=Guests,S-1-5-XX-YYY => cn=power users|cn)]]>
*
* Mandatory Arguments:
* * arg 0
* - container, to query from current position
* - "/",".",".." => get container parent as usual
*
* * arg 1
* - LDAP filter.
*
* * arg2
* - list attribute key
*
* * arg3
* - select display
*
* Optional Arguments:
* * arg4
* - output attribute
*
* * arg5
* - container override
*
* * arg6
* - csv list (, separator) of added values. syntax: key => display_attribute=value; key...
*
* * arg7
* - csv list (, separator) of sort attributes (less to more important)
*/
case 'PickList':
$args[2] = strtolower($args[2]);
# arg5 overrides our container
if (empty($args[5]))
$container = $server->getContainerPath($container,$args[0]);
else
$container = $args[5];
# Extract the attributes to use in the display
preg_match_all('/%(\w+)(\|.+)?(\/[lU])?%/U',$args[3],$matchall);
//print_r($matchall); // -1 = highlevel match, 1 = attr, 2 = subst, 3 = mod
$attrs = array_unique(array_merge($matchall[1],array($args[2])));
# The query results are sorted by arg7
if (! empty($args[7])) {
$sort_attrs = explode(',',$args[7]);
$attrs = array_merge($attrs,$sort_attrs);
}
$picklistvalues = return_ldap_hash($container,$args[1],$args[2],$attrs,(isset($args[7]) && ($args[7])) ? $sort_attrs : false);
if (! empty($args[6])) {
$fixedvalues = explode(',',$args[6]);
foreach ($fixedvalues as $fixedvalue) {
$fixedvalue = preg_split('/=\>/',$fixedvalue);
$displayvalue = explode('=',$fixedvalue[1]);
$newvalue[trim($fixedvalue[0])] = array($args[2]=>trim($fixedvalue[0]),
trim($displayvalue[0])=>trim($displayvalue[1]));
$picklistvalues = array_merge($picklistvalues,$newvalue);
}
}
$vals = array();
foreach ($picklistvalues as $key => $values) {
$display = $args[3];
foreach ($matchall[1] as $arg)
if (isset($values[$arg]))
$display = preg_replace("/%($arg)(\|.+)?(\/[lU])?%/U",$values[$arg],$display);
else
$display = preg_replace("/%($arg)(\|.+)?(\/[lU])?%/U",'',$display);
if (! isset($picklist[$values[$args[2]]])) {
$vals[$values[$args[2]]] = $display;
$picklist[$display] = true;
}
}
break;
/**
* RandomPassword will create a random password for the value.
* eg: =php.RandomPassword()
*
* When calling the attribute Javascript it will generate a random password.
*
* This function doesnt use any arguments
*/
case 'RandomPassword':
break;
}
switch ($type) {
case 'autovalue':
if (! is_array($vals))
$attribute->autoValue(array($vals));
else
$attribute->autoValue($vals);
break;
case 'helpervalue':
return $vals;
}
}
/**
* Set the mode of the TemplateRender
* Applicable modes are "create" or "edit"
*/
protected function getMode() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if ($this->dn)
return 'modification';
elseif ($this->container)
return 'creation';
else
debug_dump_backtrace(sprintf('Unknown mode for %s',__METHOD__),1);
}
/**
* Return the container for this mode
*/
protected function getModeContainer() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
switch ($this->getMode()) {
case 'creation':
return $this->container;
break;
case 'modification':
return $this->dn;
break;
default:
return null;
}
}
/**
* Is the default template enabled?
*/
protected function haveDefaultTemplate() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if ($_SESSION[APPCONFIG]->getValue('appearance','disable_default_template'))
return false;
else
return true;
}
/**
* Present a list of available templates for creating and editing LDAP entries
*/
protected function drawTemplateChoice() {
if (DEBUGTMP) printf('%s ',__METHOD__);
$this->drawTitle();
$this->drawSubTitle();
echo "\n";
switch ($this->getMode()) {
case 'creation':
$msg = _('Select a template for the creation process');
break;
case 'modification':
$msg = _('Select a template to edit the entry');
break;
}
$avail_templates = $this->getTemplates();
$templates = $avail_templates->getTemplates($this->getMode(),$this->getModeContainer());
printf('
%s
',$msg);
$href_parms = array_to_query_string($_GET,array('meth'));
printf('';
}
/** VISIT METHODS **/
/**
* This function will setup our template object (read LDAP for current values, read $_REQUEST for new values, etc)
* so that it can be rendered.
*/
private function visitStart() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s ',__METHOD__);
# If we have a DN, then we are an editing template
if ($this->dn)
$this->template->setDN(get_request('dn','REQUEST'));
# Else if we have a container, we are a creating template
elseif ($this->container)
$this->template->setContainer(get_request('container','REQUEST'));
else
debug_dump_backtrace('Dont know what type of template we are - no DN or CONTAINER?',1);
# Header
$this->drawHeader();
}
private function visitEnd() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s ',__METHOD__);
foreach ($this->template->getAttributesShown() as $attribute)
if ($attribute->getPage() > $this->pagelast)
$this->pagelast = $attribute->getPage();
echo "\n\n";
if ($this->template->getContext() == 'create') {
$this->drawStepTitle($this->page);
$this->drawStepFormStart($this->page);
$this->drawStepForm($this->page);
$this->drawStepFormEnd();
} else {
# Draw internal attributes
if (get_request('show_internal_attrs','REQUEST')) {
echo '
';
$this->drawInternalAttributes();
echo '
';
echo "\n";
}
$this->drawFormStart();
# To support our AJAX add Attribute
printf('','none');
$this->drawForm();
$this->drawStepFormEnd();
}
}
/** PAGE DRAWING METHODS **/
private function drawHeader() {
if (DEBUGTMP) printf('%s ',__METHOD__);
# Title
$this->drawTitle();
$this->drawSubTitle();
echo "\n";
# Menu
$this->drawMenu();
}
public function drawTitle($title=null) {
if (DEBUGTMP) printf('%s ',__METHOD__);
if (is_null($title))
switch ($this->getMode()) {
case 'creation':
$title = _('Create Object');
break;
case 'modification':
$title = get_rdn($this->dn);
break;
default:
$title = 'Title';
}
parent::drawTitle($title);
}
public function drawSubTitle($subtitle=null) {
if (DEBUGTMP) printf('%s ',__METHOD__);
if ($subtitle)
return parent::drawSubTitle($subtitle);
switch ($this->getMode()) {
case 'creation':
$subtitle = sprintf('%s: %s %s: %s',
_('Server'),$this->getServer()->getName(),
_('Container'),$this->container);
if ($this->template_id) {
$subtitle .= ' ';
$subtitle .= sprintf('%s: %s',_('Template'),$this->template->getID() != 'none' ? $this->template->getTitle() : _('Default'));
if ($this->template->getName())
$subtitle .= sprintf(' (%s)',$this->template->getName(false));
}
break;
case 'modification':
$subtitle = sprintf('%s: %s %s: %s',
_('Server'),$this->getServer()->getName(),
_('Distinguished Name'),$this->dn);
if ($this->template_id) {
$subtitle .= ' ';
$subtitle .= sprintf('%s: %s',_('Template'),$this->template->getID() != 'none' ? $this->template->getTitle() : _('Default'));
if ($this->template->getName())
$subtitle .= sprintf(' (%s)',$this->template->getName(false));
}
break;
}
parent::drawSubTitle($subtitle);
}
/** PAGE ENTRY MENU **/
private function drawMenu() {
if (DEBUGTMP) printf('%s ',__METHOD__);
# We only have a menu for editing entries.
if ($this->template->getContext() == 'edit') {
echo '
';
echo '
';
$menuitem_number = 0;
foreach (array('entryrefresh','showinternal','switchtemplate','entryexport','entrycopy','entrydelete','entryrename','entrycompare','childcreate','addattr','msgdel','childview','childexport','msgschema','msgro','msgmodattr') as $item) {
$item = $this->getMenuItem($item);
if ($item) {
$endofrow = false;
$start = true;
$it = ''; // menu item
$ms = ''; // item message
if (is_array($item) && count($item) > 0) {
$it = $item[0];
if (count($item) > 1)
$ms = $item[1];
} else {
$it = $item;
}
if ($it) {
$menuitem_number++;
echo $it;
if ($ms) {
if (($menuitem_number % 2) == 1) {
$menuitem_number++;
echo '
';
}
}
/** PAGE ENTRY MENU ITEMS **/
private function getMenuItem($i) {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s (%s) ',__METHOD__,$i);
switch ($i) {
case 'entryrefresh':
if ($_SESSION[APPCONFIG]->isCommandAvailable('cmd','entry_refresh'))
return $this->getMenuItemRefresh();
else
return '';
case 'switchtemplate':
if ($_SESSION[APPCONFIG]->isCommandAvailable('cmd','switch_template'))
return $this->getMenuItemSwitchTemplate();
else
return '';
case 'entryexport':
if ($_SESSION[APPCONFIG]->isCommandAvailable('script','export_form') && $_SESSION[APPCONFIG]->isCommandAvailable('script','export'))
return $this->getMenuItemExportBase();
else
return '';
case 'entrycopy':
if ($_SESSION[APPCONFIG]->isCommandAvailable('script','copy_form') && $_SESSION[APPCONFIG]->isCommandAvailable('script','copy') && ! $this->template->isReadOnly())
return $this->getMenuItemMove();
else
return '';
case 'showinternal':
if ($_SESSION[APPCONFIG]->isCommandAvailable('cmd','entry_internal_attributes_show'))
return $this->getMenuItemInternalAttributes();
else
return '';
case 'entrydelete':
if ($_SESSION[APPCONFIG]->isCommandAvailable('script','delete_form') && $_SESSION[APPCONFIG]->isCommandAvailable('script','delete') && ! $this->template->isReadOnly())
return $this->getMenuItemDelete();
else
return '';
case 'entryrename':
if ($_SESSION[APPCONFIG]->isCommandAvailable('script','rename_form') && $_SESSION[APPCONFIG]->isCommandAvailable('script','rename') && ! $this->template->isReadOnly()) {
# Check if any of the RDN's are read only.
$rdnro = false;
foreach ($this->template->getRDNAttributeName() as $attr) {
$attribute = $this->template->getAttribute($attr);
if ($attribute && $attribute->isVisible() && ! $attribute->isReadOnly()) {
$rdnro = true;
break;
}
}
if (! $rdnro)
return $this->getMenuItemRename();
}
return '';
case 'msgdel':
if ($_SESSION[APPCONFIG]->getValue('appearance','show_hints')
&& $_SESSION[APPCONFIG]->isCommandAvailable('script','delete_form') && $_SESSION[APPCONFIG]->isCommandAvailable('script','delete') && ! $this->template->isReadOnly())
return array('',$this->getDeleteAttributeMessage());
else
return '';
case 'entrycompare':
if ($_SESSION[APPCONFIG]->isCommandAvailable('script','compare_form') && $_SESSION[APPCONFIG]->isCommandAvailable('script','compare') && ! $this->template->isReadOnly())
return $this->getMenuItemCompare();
else
return '';
case 'childcreate':
if ($_SESSION[APPCONFIG]->isCommandAvailable('script','create') && ! $this->template->isReadOnly())
return $this->getMenuItemCreate();
else
return '';
case 'addattr':
if ($_SESSION[APPCONFIG]->isCommandAvailable('script','add_attr_form') && ! $this->template->isReadOnly())
return $this->getMenuItemAddAttribute();
else
return '';
case 'childview':
case 'childexport':
static $children_count = false;
static $more_children = false;
$tree = get_cached_item($this->getServerID(),'tree');
$tree_item = $tree->getEntry($this->template->getDN());
if (! $tree_item) {
$tree->addEntry($this->template->getDN());
$tree_item = $tree->getEntry($this->template->getDN());
}
if ($children_count === false) {
# Visible children in the tree
$children_count = count($tree_item->getChildren());
# Is there filtered children ?
$more_children = $tree_item->isSizeLimited();
if (! $children_count || ! $more_children) {
# All children in ldap
$all_children = $this->getServer()->getContainerContents(
$this->template->getDN(),null,$children_count+1,'(objectClass=*)',$_SESSION[APPCONFIG]->getValue('deref','view'),null);
$more_children = (count($all_children) > $children_count);
}
}
if ($children_count > 0 || $more_children) {
if ($children_count <= 0)
$children_count = '';
if ($more_children)
$children_count .= '+';
if ($i == 'childview')
return $this->getMenuItemShowChildren($children_count);
elseif ($i == 'childexport' && $_SESSION[APPCONFIG]->isCommandAvailable('script','export_form') && $_SESSION[APPCONFIG]->isCommandAvailable('script','export'))
return $this->getMenuItemExportSub();
else
return '';
} else
return '';
case 'msgschema':
if ($_SESSION[APPCONFIG]->getValue('appearance','show_hints') && $_SESSION[APPCONFIG]->isCommandAvailable('script','schema'))
return array('',$this->getViewSchemaMessage());
else
return array();
case 'msgro':
if ($this->template->isReadOnly())
return array('',$this->getReadOnlyMessage());
else
return array();
case 'msgmodattr':
$modified_attrs = array();
$modified = get_request('modified_attrs','REQUEST',false,array());
foreach ($this->template->getAttributes(true) as $attribute)
if (in_array($attribute->getName(),$modified))
array_push($modified_attrs,$attribute->getFriendlyName());
if (count($modified_attrs))
return array('',$this->getModifiedAttributesMessage($modified_attrs));
else
return array();
default:
return false;
}
}
protected function getDeleteAttributeMessage() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s ',__METHOD__);
if ($_SESSION[APPCONFIG]->isCommandAvailable('script','delete_attr') && ! $this->template->isReadOnly())
return sprintf($this->layout['hint'],_('Hint: To delete an attribute, empty the text field and click save.'));
else
return '';
}
protected function getModifiedAttributesMessage(&$modified_attributes) {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s ',__METHOD__);
return sprintf($this->layout['hint'],
(count($modified_attributes) == 1) ?
sprintf(_('An attribute (%s) was modified and is highlighted below.'),implode('',$modified_attributes)) :
sprintf(_('Some attributes (%s) were modified and are highlighted below.'),implode(', ',$modified_attributes)));
}
protected function getReadOnlyMessage() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s ',__METHOD__);
return sprintf($this->layout['hint'],_('Viewing entry in read-only mode.'));
}
protected function getViewSchemaMessage() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s ',__METHOD__);
return sprintf($this->layout['hint'],_('Hint: To view the schema for an attribute, click the attribute name.'));
}
/** PAGE ENTRY MENU ITEMS DETAILS **/
private function getMenuItemRefresh() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s ',__METHOD__);
$href = sprintf('cmd=template_engine&%s&junk=%s',$this->url_base,random_junk());
if (isAjaxEnabled())
return sprintf($this->layout['actionajax'],IMGDIR,'refresh.png',_('Refresh'),
htmlspecialchars($href),_('Refresh this entry'),htmlspecialchars($href),_('Reloading'),_('Refresh'));
else
return sprintf($this->layout['action'],IMGDIR,'refresh.png',_('Refresh'),
htmlspecialchars($href),_('Refresh this entry'),_('Refresh'));
}
protected function getMenuItemSwitchTemplate() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
$href = sprintf('cmd=template_engine&%s&template=',$this->url_base);
if (isAjaxEnabled())
return sprintf($this->layout['actionajax'],IMGDIR,'switch.png',_('Switch Template'),
htmlspecialchars($href),_('Change to another template'),htmlspecialchars($href),_('Loading'),_('Switch Template'));
else
return sprintf($this->layout['action'],IMGDIR,'switch.png',_('Switch Template'),
htmlspecialchars($href),_('Change to another template'),_('Switch Template'));
}
protected function getMenuItemExportBase() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s ',__METHOD__);
$href = sprintf('cmd=export_form&%s&scope=base',$this->url_base);
if (isAjaxEnabled())
return sprintf($this->layout['actionajax'],IMGDIR,'export.png',_('Export'),
htmlspecialchars($href),_('Save a dump of this object'),htmlspecialchars($href),_('Loading'),_('Export'));
else
return sprintf($this->layout['action'],IMGDIR,'export.png',_('Export'),
htmlspecialchars($href),_('Save a dump of this object'),_('Export'));
}
private function getMenuItemMove() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s ',__METHOD__);
$href = sprintf('cmd=copy_form&%s',$this->url_base);
if (isAjaxEnabled())
return sprintf($this->layout['actionajax'],IMGDIR,'cut.png',_('Cut'),
htmlspecialchars($href),_('Copy this object to another location, a new DN, or another server'),
htmlspecialchars($href),_('Loading'),_('Copy or move this entry'));
else
return sprintf($this->layout['action'],IMGDIR,'cut.png',_('Cut'),
htmlspecialchars($href),_('Copy this object to another location, a new DN, or another server'),
_('Copy or move this entry'));
}
protected function getMenuItemInternalAttributes() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s ',__METHOD__);
if (get_request('show_internal_attrs','REQUEST')) {
$href = sprintf('cmd=template_engine&%s&junk=',$this->url_base,random_junk());
return sprintf($this->layout['action'],IMGDIR,'tools-no.png',_('Hide'),
htmlspecialchars($href),'',_('Hide internal attributes'));
} else {
$href = sprintf('cmd=template_engine&show_internal_attrs=true&%s',$this->url_base);
return sprintf($this->layout['action'],IMGDIR,'tools.png',_('Show'),
htmlspecialchars($href),'',_('Show internal attributes'));
}
}
private function getMenuItemDelete() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s ',__METHOD__);
$href = sprintf('cmd=delete_form&%s',$this->url_base);
if (isAjaxEnabled())
return sprintf($this->layout['actionajax'],IMGDIR,'trash.png',_('Trash'),
htmlspecialchars($href),_('You will be prompted to confirm this decision'),
htmlspecialchars($href),_('Loading'),_('Delete this entry'));
else
return sprintf($this->layout['action'],IMGDIR,'trash.png',_('Trash'),
htmlspecialchars($href),_('You will be prompted to confirm this decision'),_('Delete this entry'));
}
protected function getMenuItemRename() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s ',__METHOD__);
$href = sprintf('cmd=rename_form&%s&template=%s',$this->url_base,$this->template->getID());
if (isAjaxEnabled())
return sprintf($this->layout['actionajax'],IMGDIR,'rename.png',_('Rename'),
htmlspecialchars($href),_('Rename this entry'),htmlspecialchars($href),_('Loading'),_('Rename'));
else
return sprintf($this->layout['action'],IMGDIR,'rename.png',_('Rename'),
htmlspecialchars($href),_('Rename this entry'),_('Rename'));
}
protected function getMenuItemCompare() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s ',__METHOD__);
$href = sprintf('cmd=compare_form&%s',$this->url_base);
if (isAjaxEnabled())
return sprintf($this->layout['actionajax'],IMGDIR,'compare.png',_('Compare'),
htmlspecialchars($href),_('Compare this entry with another'),
htmlspecialchars($href),_('Loading'),_('Compare with another entry'));
else
return sprintf($this->layout['action'],IMGDIR,'compare.png',_('Compare'),
htmlspecialchars($href),_('Compare this entry with another'),_('Compare with another entry'));
}
protected function getMenuItemCreate() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s ',__METHOD__);
$href = sprintf('cmd=template_engine&server_id=%s&container=%s',$this->getServerID(),rawurlencode($this->template->getDN()));
if (isAjaxEnabled())
return sprintf($this->layout['actionajax'],IMGDIR,'create.png',_('Create'),
htmlspecialchars($href),_('Create a child entry'),
htmlspecialchars($href),_('Loading'),_('Create a child entry'));
else
return sprintf($this->layout['action'],IMGDIR,'create.png',_('Create'),
htmlspecialchars($href),_('Create a child entry'),_('Create a child entry'));
}
protected function getMenuItemAddAttribute() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s ',__METHOD__);
if (! $this->template->getAvailAttrs())
return '';
$href = sprintf('cmd=add_attr_form&%s',$this->url_base);
$layout = '
';
if (isAjaxEnabled())
return sprintf($layout,IMGDIR,'add.png',_('Add'),
htmlspecialchars($href),_('Add new attribute to this object'),
htmlspecialchars($href),_('Add new attribute'),_('Add new attribute'));
else
return sprintf($this->layout['action'],IMGDIR,'add.png',_('Add'),
htmlspecialchars($href),_('Add new attribute to this object'),_('Add new attribute'));
}
protected function getMenuItemShowChildren($children_count) {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s ',__METHOD__);
$href = sprintf('cmd=query_engine&server_id=%s&filter=%s&base=%s&scope=one&query=none',
$this->getServerID(),rawurlencode('objectClass=*'),rawurlencode($this->template->getDN()));
if (isAjaxEnabled())
return sprintf($this->layout['actionajax'],IMGDIR,'children.png',_('Children'),
htmlspecialchars($href),_('View the children of this object'),
htmlspecialchars($href),_('Loading'),
($children_count == 1) ? _('View 1 child') : sprintf(_('View %s children'),$children_count));
else
return sprintf($this->layout['action'],IMGDIR,'children.png',_('Children'),
htmlspecialchars($href),_('View the children of this object'),
($children_count == 1) ? _('View 1 child') : sprintf(_('View %s children'),$children_count));
}
protected function getMenuItemExportSub() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
if (DEBUGTMP) printf('%s ',__METHOD__);
$href = sprintf('cmd=export_form&%s&scope=%s',$this->url_base,'sub');
if (isAjaxEnabled())
return sprintf($this->layout['actionajax'],IMGDIR,'export.png',_('Save'),
htmlspecialchars($href),_('Save a dump of this object and all of its children'),
htmlspecialchars($href),_('Loading'),_('Export subtree'));
else
return sprintf($this->layout['action'],IMGDIR,'export.png',_('Save'),
htmlspecialchars($href),_('Save a dump of this object and all of its children'),_('Export subtree'));
}
/** CHOOSERS **/
/**
* RDN Chooser
*/
protected function drawRDNChooser() {
if (DEBUGTMP) printf('%s ',__METHOD__);
if (! count($this->template->getRDNAttrs())) {
printf('
%s
','RDN');
echo '
';
} else {
echo '
';
foreach ($this->template->getRDNAttrs() as $rdn)
printf('',htmlspecialchars($rdn));
echo '
';
}
}
/**
* Container Chooser
*/
protected function drawContainerChooser($default_container) {
if (DEBUGTMP) printf('%s ',__METHOD__);
echo '
';
}
/**
* Object Class Chooser
*/
protected function drawObjectClassChooser() {
if (DEBUGTMP) printf('%s ',__METHOD__);
$socs = $this->getServer()->SchemaObjectClasses();
if (! $socs)
$socs = array();
echo '
';
printf('
%s
',_('ObjectClasses'));
echo '
';
echo '
';
echo '
';
if ($_SESSION[APPCONFIG]->getValue('appearance','show_hints')) {
printf('
',IMGDIR);
echo _('Hint: You must choose exactly one structural objectClass (shown in bold above)');
echo '
';
}
}
/** INTERNAL ATTRIBUTES **/
protected function drawInternalAttributes() {
if ($this->template->getAttributesInternal())
foreach ($this->template->getAttributesInternal() as $attribute)
$this->draw('Internal',$attribute);
else
printf('
(%s)
',_('No internal attributes'));
echo "\n";
}
protected function drawInternalAttribute($attribute) {
if (DEBUGTMP) printf('%s ',__METHOD__);
$this->draw('Template',$attribute);
}
/** FORM METHODS **/
public function drawFormStart() {
echo '';
# Javascript
$this->drawJavascript();
# For debugging, show the template object.
if (! $_SESSION[APPCONFIG]->getValue('appearance','hide_debug_info') && get_request('debug','GET')) {
echo "\n\n";
printf('',IMGDIR);
echo '
';
echo '';
echo '
';
}
}
public function drawFormSubmitButton() {
if (DEBUGTMP) printf('%s ',__METHOD__);
if (! $this->template->isReadOnly())
printf('
',_('Update Object'));
}
/** STEP FORM METHODS **/
private function drawStepTitle($page) {
if (DEBUGTMP) printf('%s ',__METHOD__);
if (DEBUGTMP||DEBUGTMPSUB) printf('* %s [templateNAME:%s] ',__METHOD__,$this->template->getName());
# The default template needs to ask the user for objectClasses.
if ($this->template->isType('default')) {
# The default template only uses 2 pages
$this->pagelast = 2;
echo '
';
printf('%s: ',sprintf(_('Step %s of %s'),$page,$this->pagelast));
if ($page == 1)
echo _('Container and ObjectClass(es)');
else
echo _('Specify attributes and values');
echo '