36 protected $iconmenu =
'';
58 protected $silly_cache = [];
65 global $class_mapping;
68 $classes = get_declared_classes();
74 $conflicts_infos = [];
76 foreach ($classes as $cname) {
77 $cmethods = get_class_methods($cname);
79 $infos = call_user_func([$cname,
'plInfo']);
83 if (is_subclass_of($cname,
'simpleService')) {
84 $infos[
'plSelfModify'] = FALSE;
86 unset($infos[
'plObjectType']);
87 $infos[
'plCategory'] = [
'server'];
89 if (!isset($infos[
'plSelfModify'])) {
90 $infos[
'plSelfModify'] = FALSE;
93 if (isset($class_mapping[$cname])) {
94 $infos[
'PATH'] = dirname($class_mapping[$cname]);
96 if (isset($infos[
'plDepends'])) {
97 $depends_infos[] = $cname;
99 if (isset($infos[
'plConflicts'])) {
100 $conflicts_infos[] = $cname;
102 if (isset($infos[
'plForeignKeys'])) {
103 foreach ($infos[
'plForeignKeys'] as $ofield => &$pfks) {
104 if (!is_array($pfks)) {
107 if (!is_array($pfks[0])) {
110 foreach ($pfks as &$pfk) {
112 if (isset($pfk[1])) {
119 if (isset($pfk[2])) {
122 if ($filter === NULL) {
123 $filter =
"$ofield=%oldvalue%";
126 if (!isset($foreign_refs[$class])) {
127 $foreign_refs[$class] = [];
129 if (!isset($foreign_refs[$class][$field])) {
130 $foreign_refs[$class][$field] = [];
132 $foreign_refs[$class][$field][] = [$cname, $ofield, $filter];
133 if ($field ==
'dn') {
134 $this->dnForeignRefs[] = [$cname, $ofield, $filter, (isset($pfk[3]) ? $pfk[3] :
"$ofield=*%oldvalue%")];
141 $infos[
'plForeignKeys'] = [];
143 if (!isset($infos[
'plProvidedAcls'])) {
144 $infos[
'plProvidedAcls'] = [];
146 if (!isset($infos[
'plCategory'])) {
147 $infos[
'plCategory'] = [];
149 if (!isset($infos[
'plTitle']) && isset($infos[
'plShortName'])) {
150 $infos[
'plTitle'] = $infos[
'plShortName'];
152 if (!empty($infos[
'plObjectClass']) && !isset($infos[
'plFilter'])) {
153 if (count($infos[
'plObjectClass']) == 1) {
154 $infos[
'plFilter'] =
'(objectClass='.$infos[
'plObjectClass'][0].
')';
156 $infos[
'plFilter'] =
'(&(objectClass='.implode(
')(objectClass=', $infos[
'plObjectClass']).
'))';
159 if (isset($infos[
'plFilter'])) {
160 $infos[
'plFilterObject'] = ldapFilter::parse($infos[
'plFilter']);
162 if (isset($infos[
'plObjectType']) && !isset($infos[
'plPriority']) && !is_numeric(key($infos[
'plObjectType']))) {
164 $infos[
'plPriority'] = 0;
166 $infos[
'plForeignRefs'] = [];
167 $infos[
'INDEX'] = $index;
168 $this->info[$cname] = $infos;
169 $this->dirlist[$index++] = $cname;
173 foreach ($depends_infos as $cname) {
174 foreach ($this->info[$cname][
'plDepends'] as $depend) {
175 if (isset($this->info[$depend])) {
176 if (isset($this->info[$depend][
'plDepending'])) {
177 $this->info[$depend][
'plDepending'][] = $cname;
179 $this->info[$depend][
'plDepending'] = [$cname];
182 trigger_error(
"$cname depends of the inexisting plugin $depend");
186 foreach ($conflicts_infos as $cname) {
187 foreach ($this->info[$cname][
'plConflicts'] as $conflict) {
188 if (isset($this->info[$conflict])) {
189 if (isset($this->info[$conflict][
'plConflicts'])) {
190 if (!in_array($cname, $this->info[$conflict][
'plConflicts'])) {
191 $this->info[$conflict][
'plConflicts'][] = $cname;
194 $this->info[$conflict][
'plConflicts'] = [$cname];
199 foreach ($foreign_refs as $cname => $refs) {
200 if (isset($this->info[$cname])) {
201 $this->info[$cname][
'plForeignRefs'] = $refs;
206 $this->info[
'all'] = [];
208 $this->info[
'all'][
'plProvidedAcls'] = [];
209 $this->info[
'all'][
'plDescription'] = _(
"All objects in this category");
210 $this->info[
'all'][
'plSelfModify'] = FALSE;
215 if (isset($a[
'plPriority']) && isset($b[
'plPriority'])) {
216 if ($a[
'plPriority'] == $b[
'plPriority']) {
218 } elseif ($a[
'plPriority'] < $b[
'plPriority']) {
223 } elseif (isset($a[
'plPriority'])) {
225 } elseif (isset($b[
'plPriority'])) {
247 if (isset($infos[
'CLASS']) && $ui->isBlacklisted($infos[
'CLASS'])) {
251 if (!isset($infos[
'ACL'])) {
255 $aclname = $infos[
'ACL'];
257 if (isset($this->silly_cache[$aclname])) {
258 return $this->silly_cache[$aclname];
265 if (preg_match(
"/,/", $aclname)) {
266 $acls_to_check = explode(
",", $aclname);
268 $acls_to_check = [$aclname];
271 foreach ($acls_to_check as $acl_to_check) {
272 $acl_to_check = trim($acl_to_check);
276 if (preg_match(
"/:self$/", $acl_to_check)) {
277 $acl_to_check = preg_replace(
"/:self$/",
"", $acl_to_check);
278 if (strpos($acl_to_check,
'/')) {
279 if ($ui->get_permissions($ui->dn, $acl_to_check,
"") !=
"") {
280 $this->silly_cache[$aclname] = TRUE;
284 if ($ui->get_category_permissions($ui->dn, $acl_to_check) !=
'') {
285 $this->silly_cache[$aclname] = TRUE;
292 $deps = $ui->get_module_departments($acl_to_check, TRUE);
294 $this->silly_cache[$aclname] = TRUE;
300 $this->silly_cache[$aclname] = FALSE;
311 $plDescription = FALSE;
312 $index = $this->get_index($cname);
313 $href =
"main.php?plug=$index&reset=1";
314 if (isset($this->info[$cname])) {
315 if (isset($this->info[$cname][
'plShortName'])) {
316 $plHeadline = $this->info[$cname][
'plShortName'];
318 if (isset($this->info[$cname][
'plIcon'])) {
319 $plIcon = $this->info[$cname][
'plIcon'];
321 if (isset($this->info[$cname][
'plDescription'])) {
322 $plDescription = $this->info[$cname][
'plDescription'];
324 if ($plHeadline && $plIcon && $plDescription) {
325 return [$plHeadline,$plDescription,$href,$plIcon];
328 $vars = get_class_vars($cname);
330 if (!$plHeadline && isset($vars[
'plHeadline'])) {
331 $plHeadline = _($vars[
'plHeadline']);
333 if (!$plDescription && isset($vars[
'plDescription'])) {
334 $plDescription = _($vars[
'plDescription']);
336 if (!$plIcon && isset($vars[
'plIcon'])) {
337 $plIcon = $vars[
'plIcon'];
340 die(
'Unknown class '.$cname);
343 $plIcon =
"icon.png";
345 return [$plHeadline,$plDescription,$href,$plIcon];
354 if ($this->menu ==
"") {
355 $this->menu =
'<ul class="menu">'.
"\n";
357 foreach ($config->data[
'SECTIONS'] as $section => $section_infos) {
361 foreach ($config->data[
'MENU'][$section] as $info) {
366 $index = $this->get_index($info[
'CLASS']);
367 $this->allowed_plugins[$index] = $index;
368 list ($plHeadline, $plDescription, $href, ) = $this->
get_infos($info[
'CLASS']);
369 $id = $info[
'CLASS'];
370 } elseif (!isset($info[
'CLASS'])) {
371 $plHeadline = $info[
'TITLE'];
372 $plDescription = $info[
'DESCRIPTION'];
373 $href = $info[
'LINK'];
379 $entries .=
'<li class="menuitem" id="menuitem_'.$id.
'">';
380 $entries .=
'<a href="'.$href.
'" title="'.
htmlescape($plDescription).
'">'.
htmlescape($plHeadline).
'</a></li>'.
"\n";
384 if ($entries !=
"") {
385 $this->menu .=
'<li><a>'.htmlescape($section_infos[
'NAME']).
"</a>\n<ul>\n".$entries.
"\n</ul></li>\n";
388 $this->menu .=
'</ul>'.
"\n";
392 if (isset($_GET[
'plug'])) {
393 $plug = $_GET[
'plug'];
397 $lines = preg_split(
"/\n/", $this->menu);
398 foreach ($lines as &$line) {
399 if (preg_match(
'/'.preg_quote(
"main.php?plug=$plug&reset=1",
'/').
'/', $line)) {
400 $line = preg_replace(
'/class="menuitem"/',
'class="menuitem menucurrent"', $line);
401 } elseif (preg_match(
'/class="menuitem menucurrent"/', $line)) {
402 $line = preg_replace(
'/class="menuitem menucurrent"/',
'class="menuitem"', $line);
408 $this->menu = join(
"\n", $lines);
416 global $class_mapping, $config;
417 if ($this->iconmenu ==
"") {
420 foreach ($config->data[
'SECTIONS'] as $section => $section_infos) {
422 $sectionMenu =
'<div class="iconmenu-section"><h1 class="menuheader">';
423 $sectionMenu .=
htmlescape($section_infos[
'NAME']).
"</h1>\n";
425 foreach ($config->data[
'MENU'][$section] as $info) {
431 list ($plHeadline, $plDescription, $href, $plIcon) = $this->
get_infos($info[
'CLASS']);
432 $id = $info[
'CLASS'];
433 } elseif (!isset($info[
'CLASS'])) {
434 $plHeadline = $info[
'TITLE'];
435 $plDescription = $info[
'DESCRIPTION'];
436 $href = $info[
'LINK'];
437 $plIcon = $info[
'ICONPATH'];
444 if (isset($info[
'CLASS']) && !preg_match(
"/\//", $plIcon) && !preg_match(
"/^geticon/", $plIcon)) {
445 $image =
get_template_path(
'plugins/'.preg_replace(
'%^.*/([^/]+)/[^/]+$%',
'\1', $class_mapping[$info[
'CLASS']]).
'/images/'.$plIcon);
450 $entries .=
'<div class="iconmenu" id="menuitem_icon_'.$id.
'" onClick=\'location.href="'.$href.
'"\' title="'.
htmlescape($plDescription).
'">';
451 $item =
'<div class="imgcontainer"><img src="'.htmlescape($image).
'" alt=""/></div><span> '.
htmlescape($plHeadline).
'</span>';
452 $entries .= $item.
"</div>\n";
456 if ($entries !=
"") {
457 $this->iconmenu .= $sectionMenu.$entries.
"</div>\n";
463 return $this->iconmenu;
471 function get_path ($index)
473 if (!isset($this->dirlist[$index])) {
476 return "../".$this->info[$this->dirlist[$index]][
'PATH'];
484 function get_index ($class)
487 if (isset($this->info[$class])) {
488 return $this->info[$class][
'INDEX'];
504 return isset($this->allowed_plugins[$plug_id]);
515 $this->iconmenu =
'';
516 $this->silly_cache = [];
517 $this->allowed_plugins = [];
520 static function pluginInfos ($cname)
524 if (!isset($plist->info[$cname])) {
527 return $plist->info[$cname];
529 trigger_error(
'plist not loaded yet');
538 global $config, $plist;
545 $config->loadPlist($plist);
546 $config->resetDepartmentCache();
554 static function runMainInc ($index, $forceCleanup = FALSE)
556 global $BASE_DIR, $config, $plist, $ui, $smarty, $display, $remove_lock, $cleanup, $plug;
558 if ($index ==
'welcome') {
559 $plugin_dir =
"$BASE_DIR/plugins/generic/welcome";
562 $plugin_dir = $plist->get_path($index);
563 $plugin = $plist->dirlist[$index];
570 $cleanup = $remove_lock = TRUE;
572 if (is_file(
"$plugin_dir/main.inc")) {
574 require(
"$plugin_dir/main.inc");
575 } elseif (is_callable([$plugin,
'mainInc'])) {
580 _(
'Fatal error: Cannot find any plugin definitions for plugin "%s" ("%s" is not a file)!'),
582 "$plugin_dir/main.inc" 587 $cleanup = $remove_lock = FALSE;
590 $smarty->assign(
'headline', _(
'Fatal error!'));
591 $smarty->assign(
'headline_image',
'geticon.php?context=status&icon=dialog-error&size=32');
592 $display =
'<h1>'.htmlescape(_(
'An unrecoverable error occurred. Please contact your administator.')).
'</h1><p>';
593 if (ini_get(
'display_errors') == 1) {
596 $display .=
'Error detail display is turned off.';
598 $display .=
'</p>'.
"\n";
resetCache()
Resets menu and ACL cache.
htmlescape(string $str)
Escape string for HTML output.
show_iconmenu()
Show the menu icon.
in_array_ics($value, array $items)
Check if a value exists in an array (case-insensitive)
static load()
Loads plist and load it in config object.
get_template_path($filename='', $plugin=FALSE, $path='')
Return themed path for specified base file.
static get($name)
Accessor of a session var.
This class contains all the function needed to make list of plugin and manage them.
static set($name, $value)
Set a value in a session.
check_access($infos)
Check whether we are allowed to modify the given acl or not.
$dnForeignRefs
Foreign references on DNs.
$info
The plInfo result for all plugin, using class as key. Contains the plugin index in 'INDEX' and the pa...
Fatal error class. Does not extend FusionDirectoryError.
$allowed_plugins
List plugin indexes of all plugin that the user have acl for.
__construct()
List the plugins.
plugin_access_allowed($plug_id)
This function checks if we are allowed to view the plugin with the given id.
$dirlist
Using the plugin index as a key, the class of the plugin.
plugin_available($plugin)
Check if plugin is available.
static is_set($name)
Check if the name of the session is set.
get_infos($cname)
Get headline, description and icon of a plugin.