373 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			373 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?php
 | |
| namespace LAM\SCHEMA;
 | |
| use \htmlResponsiveRow;
 | |
| use \htmlSpacer;
 | |
| use \htmlLink;
 | |
| use \htmlStatusMessage;
 | |
| use \htmlResponsiveTable;
 | |
| use \htmlOutputText;
 | |
| use \htmlGroup;
 | |
| use \htmlSelect;
 | |
| use \htmlDiv;
 | |
| use \htmlSubTitle;
 | |
| /*
 | |
| 
 | |
|   Copyright (C) 2018 Roland Gruber
 | |
| 
 | |
|   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
 | |
| 
 | |
| */
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * Displays the LDAP schema of the server
 | |
|  *
 | |
|  * @package tools
 | |
|  * @author Roland Gruber
 | |
|  */
 | |
| 
 | |
| 
 | |
| /** security functions */
 | |
| include_once("../../lib/security.inc");
 | |
| /** access to LDAP server */
 | |
| include_once("../../lib/ldap.inc");
 | |
| /** access to configuration options */
 | |
| include_once("../../lib/config.inc");
 | |
| /** schema functions */
 | |
| require_once("../../lib/schema.inc");
 | |
| 
 | |
| // start session
 | |
| startSecureSession();
 | |
| enforceUserIsLoggedIn();
 | |
| 
 | |
| checkIfToolIsActive('toolSchemaBrowser');
 | |
| 
 | |
| setlanguage();
 | |
| 
 | |
| include '../../lib/adminHeader.inc';
 | |
| echo "<div class=\"user-bright smallPaddingContent\">\n";
 | |
| 
 | |
| $availableViews = array('objectClass', 'attribute', 'syntax', 'rule');
 | |
| $selectedView = 'objectClass';
 | |
| if (!empty($_GET['display']) && in_array($_GET['display'], $availableViews)) {
 | |
| 	$selectedView = $_GET['display'];
 | |
| }
 | |
| 
 | |
| $tabindex = 1;
 | |
| 
 | |
| $row = new htmlResponsiveRow();
 | |
| $row->addVerticalSpacer('2rem');
 | |
| $row->add(new htmlSpacer('1rem', '1px'), 0, 2);
 | |
| $row->add(new htmlLink(_('Object classes'), 'schema.php'), 12, 2, 2, 'font-big text-center');
 | |
| $row->add(new htmlLink(_('Attribute types'), 'schema.php?display=attribute'), 12, 2, 2, 'font-big text-center');
 | |
| $row->add(new htmlLink(_('Syntaxes'), 'schema.php?display=syntax'), 12, 2, 2, 'font-big text-center');
 | |
| $row->add(new htmlLink(_('Matching rules'), 'schema.php?display=rule'), 12, 2, 2, 'font-big text-center');
 | |
| $row->add(new htmlSpacer('1rem', '1px'), 0, 2);
 | |
| $row->addVerticalSpacer('2rem');
 | |
| 
 | |
| if ($selectedView === 'syntax') {
 | |
| 	displaySyntaxList($row);
 | |
| }
 | |
| elseif( $selectedView == 'attribute' ) {
 | |
| 	displayAttributeList($row);
 | |
| }
 | |
| elseif ($selectedView === 'rule') {
 | |
| 	displayRuleList($row);
 | |
| }
 | |
| elseif( $selectedView == 'objectClass' ) {
 | |
| 	displayObjectClassList($row);
 | |
| }
 | |
| 
 | |
| parseHtml(null, $row, array(), false, $tabindex, 'user');
 | |
| 
 | |
| echo '</div>';
 | |
| include '../../lib/adminFooter.inc';
 | |
| 
 | |
| /**
 | |
|  * Displays the syntax list.
 | |
|  *
 | |
|  * @param htmlResponsiveRow $row row
 | |
|  */
 | |
| function displaySyntaxList(htmlResponsiveRow &$row) {
 | |
| 	$schema_syntaxes = get_schema_syntaxes(null);
 | |
| 	if (!$schema_syntaxes) {
 | |
| 		$row->add(new htmlStatusMessage("ERROR", _("Unable to retrieve schema!")), 12);
 | |
| 		return;
 | |
| 	}
 | |
| 	$data = array();
 | |
| 	$labels = array(_('Syntax OID'), _('Description'));
 | |
| 	$pos = 0;
 | |
| 	$highlighted = array();
 | |
| 	foreach( $schema_syntaxes as $syntax ) {
 | |
| 		$oid = new htmlOutputText($syntax->getOID());
 | |
| 		$description = new htmlOutputText($syntax->getDescription());
 | |
| 		$data[] = array($oid, $description);
 | |
| 		if (!empty($_GET['sel']) && ($syntax->getOID() === $_GET['sel'])) {
 | |
| 			$highlighted[] = $pos;
 | |
| 		}
 | |
| 		$pos++;
 | |
| 	}
 | |
| 	$row->add(new htmlResponsiveTable($labels, $data, $highlighted), 12);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Displays the matching rule list.
 | |
|  *
 | |
|  * @param htmlResponsiveRow $row row
 | |
|  */
 | |
| function displayRuleList(htmlResponsiveRow &$row) {
 | |
|     $rules = get_schema_matching_rules(null);
 | |
| 	if (!$rules) {
 | |
| 		$row->add(new htmlStatusMessage("ERROR", _("Unable to retrieve schema!")), 12);
 | |
| 		return;
 | |
| 	}
 | |
|     $row->addLabel(new htmlOutputText(_('Jump to a matching rule')));
 | |
|     $availableRules = array('');
 | |
|     foreach ($rules as $rule) {
 | |
| 		$availableRules[] = $rule->getName();
 | |
|     }
 | |
|     $selectedRule = array();
 | |
|     if (!empty($_GET['sel']) && in_array($_GET['sel'], $availableRules)) {
 | |
|     	$selectedRule[] = $_GET['sel'];
 | |
|     }
 | |
|     $ruleSelect = new htmlSelect('lam-schema-select', $availableRules, $selectedRule);
 | |
|     $ruleSelect->addDataAttribute('display', 'rule');
 | |
| 	$row->addField($ruleSelect);
 | |
| 	$row->addVerticalSpacer('1rem');
 | |
| 
 | |
| 	$labels = array(_('Matching rule OID'), _('Name'), _('Used by attributes'));
 | |
| 	$data = array();
 | |
| 	foreach ($rules as $rule) {
 | |
| 		if (!empty($selectedRule) && !in_array($rule->getName(), $selectedRule)) {
 | |
| 			continue;
 | |
| 		}
 | |
| 		$oid = new htmlOutputText($rule->getOID());
 | |
| 		$name = $rule->getName();
 | |
| 		if (!empty($rule->getDescription())) {
 | |
| 			$name .= ' (' . $rule->getDescription() . ')';
 | |
| 		}
 | |
| 		if ($rule->getIsObsolete()) {
 | |
| 			$name .= ' (' . _('Obsolete') . ')';
 | |
| 		}
 | |
| 		$nameText = new htmlOutputText($name);
 | |
| 		$attributes = new htmlGroup();
 | |
| 		foreach ($rule->getUsedByAttrs() as $attr) {
 | |
| 			$attributes->addElement(new htmlDiv(null, new htmlLink($attr, 'schema.php?display=attribute&sel=' . $attr)));
 | |
| 		}
 | |
| 		$data[] = array($oid, $nameText, new htmlDiv(null, $attributes, array('smallScroll')));
 | |
| 	}
 | |
| 
 | |
| 	$row->add(new htmlResponsiveTable($labels, $data), 12);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Displays the object class list.
 | |
|  *
 | |
|  * @param htmlResponsiveRow $row row
 | |
|  */
 | |
| function displayObjectClassList(htmlResponsiveRow &$row) {
 | |
| 	$objectClasses = get_schema_objectclasses(null);
 | |
| 	if (!$objectClasses) {
 | |
| 		$row->add(new htmlStatusMessage("ERROR", _("Unable to retrieve schema!")), 12);
 | |
| 		return;
 | |
| 	}
 | |
|     $row->addLabel(new htmlOutputText(_('Jump to an object class')));
 | |
|     $availableClasses = array(_('all') => '');
 | |
|     foreach ($objectClasses as $objectClass) {
 | |
| 		$availableClasses[$objectClass->getName()] = $objectClass->getName();
 | |
|     }
 | |
|     $selectedClass = array();
 | |
|     if (isset($_GET['sel']) && (empty($_GET['sel']) || array_key_exists(strtolower($_GET['sel']), $objectClasses))) {
 | |
|     	$selectedClass[0] = $_GET['sel'];
 | |
|     }
 | |
|     if (empty($selectedClass) && (sizeof($objectClasses) > 0)) {
 | |
|     	// select first class by default
 | |
|     	$selectedClassNames = array_keys($objectClasses);
 | |
|     	$selectedClass[0] = $selectedClassNames[0];
 | |
|     }
 | |
|     $classSelect = new htmlSelect('lam-schema-select', $availableClasses, $selectedClass);
 | |
|     $classSelect->addDataAttribute('display', 'objectClass');
 | |
|     $classSelect->setHasDescriptiveElements(true);
 | |
|     $classSelect->setSortElements(false);
 | |
| 	$row->addField($classSelect);
 | |
| 	$row->addVerticalSpacer('1rem');
 | |
| 
 | |
| 	// fill child object classes
 | |
| 	foreach ($objectClasses as $name => $objectClass) {
 | |
| 		if (!empty($objectClass->getSupClasses())) {
 | |
| 			foreach ($objectClass->getSupClasses() as $subClass) {
 | |
| 				if (!isset($objectClasses[strtolower($subClass)])) {
 | |
| 					continue;
 | |
| 				}
 | |
| 				$objectClasses[strtolower($subClass)]->addChildObjectClass($name);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	foreach ($objectClasses as $name => $objectClass) {
 | |
| 		if (!empty($selectedClass[0]) && ($name !== strtolower($selectedClass[0]))) {
 | |
| 			continue;
 | |
| 		}
 | |
| 		$row->add(new htmlSubTitle($name), 12);
 | |
| 		$row->addLabel(new htmlOutputText(_('OID')), 'bold-mobile-only');
 | |
| 		$row->addField(new htmlOutputText($objectClass->getOID()));
 | |
| 		if (!empty($objectClass->getDescription())) {
 | |
| 			$row->addLabel(new htmlOutputText(_('Description')), 'bold-mobile-only');
 | |
| 			$row->addField(new htmlOutputText($objectClass->getDescription()));
 | |
| 		}
 | |
| 		$row->addLabel(new htmlOutputText(_('Type')), 'bold-mobile-only');
 | |
| 		$row->addField(new htmlOutputText($objectClass->getType()));
 | |
| 		if ($objectClass->getIsObsolete()) {
 | |
| 			$row->addLabel(new htmlOutputText(_('Obsolete')));
 | |
| 			$row->addField(new htmlOutputText(_('yes')));
 | |
| 		}
 | |
| 		if (!empty($objectClass->getSupClasses())) {
 | |
| 			$row->addLabel(new htmlOutputText(_('Inherits from')), 'bold-mobile-only');
 | |
| 			$subClasses = new htmlGroup();
 | |
| 			foreach ($objectClass->getSupClasses() as $subClass) {
 | |
| 				$subClasses->addElement(new htmlDiv(null, new htmlLink($subClass, 'schema.php?display=objectClass&sel=' . rawurlencode($subClass))));
 | |
| 			}
 | |
| 			$row->addField($subClasses);
 | |
| 		}
 | |
| 		if (!empty($objectClass->getChildObjectClasses())) {
 | |
| 			$row->addLabel(new htmlOutputText(_('Parent to')), 'bold-mobile-only');
 | |
| 			$subClasses = new htmlGroup();
 | |
| 			foreach ($objectClass->getChildObjectClasses() as $subClass) {
 | |
| 				$subClasses->addElement(new htmlDiv(null, new htmlLink($subClass, 'schema.php?display=objectClass&sel=' . rawurlencode($subClass))));
 | |
| 			}
 | |
| 			$row->addField($subClasses);
 | |
| 		}
 | |
| 		if (!empty($objectClass->getMustAttrs())) {
 | |
| 			$row->addLabel(new htmlOutputText(_('Required attributes')), 'bold-mobile-only');
 | |
| 			$attributes = new htmlGroup();
 | |
| 			foreach ($objectClass->getMustAttrs() as $attribute) {
 | |
| 				$attributes->addElement(new htmlDiv(null, new htmlLink($attribute->getName(), 'schema.php?display=attribute&sel=' . rawurlencode($attribute->getName()))));
 | |
| 			}
 | |
| 			$row->addField($attributes);
 | |
| 		}
 | |
| 		if (!empty($objectClass->getMayAttrs())) {
 | |
| 			$row->addLabel(new htmlOutputText(_('Optional attributes')), 'bold-mobile-only');
 | |
| 			$attributes = new htmlGroup();
 | |
| 			foreach ($objectClass->getMayAttrs() as $attribute) {
 | |
| 				$attributes->addElement(new htmlDiv(null, new htmlLink($attribute->getName(), 'schema.php?display=attribute&sel=' . rawurlencode($attribute->getName()))));
 | |
| 			}
 | |
| 			$row->addField($attributes);
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Displays the attributes list.
 | |
|  *
 | |
|  * @param htmlResponsiveRow $row row
 | |
|  */
 | |
| function displayAttributeList(htmlResponsiveRow $row) {
 | |
| 	$attributes = get_schema_attributes(null);
 | |
| 	if (!$attributes) {
 | |
| 		$row->add(new htmlStatusMessage("ERROR", _("Unable to retrieve schema!")), 12);
 | |
| 		return;
 | |
| 	}
 | |
| 	$row->addLabel(new htmlOutputText(_('Jump to an attribute type')));
 | |
| 	$availableAttributes = array(_('all') => '');
 | |
| 	foreach ($attributes as $attribute) {
 | |
| 		$availableAttributes[$attribute->getName()] = $attribute->getName();
 | |
| 	}
 | |
| 	$selectedAttribute = array();
 | |
| 	if (isset($_GET['sel']) && (empty($_GET['sel']) || array_key_exists(strtolower($_GET['sel']), $attributes))) {
 | |
| 		$selectedAttribute[0] = $_GET['sel'];
 | |
| 	}
 | |
| 	if (empty($selectedAttribute) && (sizeof($availableAttributes) > 0)) {
 | |
| 		// select first attribute by default
 | |
| 		$attributeNames = array_keys($availableAttributes);
 | |
| 		$selectedAttribute[0] = $attributeNames[1];
 | |
| 	}
 | |
| 	$attributeSelect = new htmlSelect('lam-schema-select', $availableAttributes, $selectedAttribute);
 | |
| 	$attributeSelect->addDataAttribute('display', 'attribute');
 | |
| 	$attributeSelect->setHasDescriptiveElements(true);
 | |
| 	$attributeSelect->setSortElements(false);
 | |
| 	$row->addField($attributeSelect);
 | |
| 	$row->addVerticalSpacer('1rem');
 | |
| 
 | |
| 	foreach ($attributes as $name => $attribute) {
 | |
| 		if (!empty($selectedAttribute[0]) && ($name !== strtolower($selectedAttribute[0]))) {
 | |
| 			continue;
 | |
| 		}
 | |
| 		$row->add(new htmlSubTitle($name), 12);
 | |
| 		if (!empty($attribute->getDescription())) {
 | |
| 			$row->addLabel(new htmlOutputText(_('Description')), 'bold-mobile-only');
 | |
| 			$row->addField(new htmlOutputText($attribute->getDescription()));
 | |
| 		}
 | |
| 		$row->addLabel(new htmlOutputText(_('OID')), 'bold-mobile-only');
 | |
| 		$row->addField(new htmlOutputText($attribute->getOID()));
 | |
| 		if ($attribute->getIsObsolete()) {
 | |
| 			$row->addLabel(new htmlOutputText(_('Obsolete')), 'bold-mobile-only');
 | |
| 			$row->addField(new htmlOutputText(_('yes')));
 | |
| 		}
 | |
| 		if (!empty($attribute->getSupAttribute())) {
 | |
| 			$row->addLabel(new htmlOutputText(_('Inherits from')), 'bold-mobile-only');
 | |
| 			$row->addField(new htmlOutputText($attribute->getSupAttribute()));
 | |
| 		}
 | |
| 		if (!empty($attribute->getEquality())) {
 | |
| 			$row->addLabel(new htmlOutputText(_('Equality')), 'bold-mobile-only');
 | |
| 			$row->addField(new htmlLink($attribute->getEquality(), 'schema.php?display=rule&sel=' . rawurldecode($attribute->getEquality())));
 | |
| 		}
 | |
| 		if (!empty($attribute->getOrdering())) {
 | |
| 			$row->addLabel(new htmlOutputText(_('Ordering')), 'bold-mobile-only');
 | |
| 			$row->addField(new htmlLink($attribute->getOrdering(), 'schema.php?display=rule&sel=' . rawurldecode($attribute->getOrdering())));
 | |
| 		}
 | |
| 		if (!empty($attribute->getSubstr())) {
 | |
| 			$row->addLabel(new htmlOutputText(_('Substring Rule')), 'bold-mobile-only');
 | |
| 			$row->addField(new htmlLink($attribute->getSubstr(), 'schema.php?display=rule&sel=' . rawurldecode($attribute->getSubstr())));
 | |
| 		}
 | |
| 		if (!empty($attribute->getSyntaxOID())) {
 | |
| 			$row->addLabel(new htmlOutputText(_('Syntax')), 'bold-mobile-only');
 | |
| 			$row->addField(new htmlLink($attribute->getSyntaxOID(), 'schema.php?display=syntax&sel=' . rawurldecode($attribute->getSyntaxOID())));
 | |
| 		}
 | |
| 		$row->addLabel(new htmlOutputText(_('Single valued')), 'bold-mobile-only');
 | |
| 		$row->addField(new htmlOutputText($attribute->getIsSingleValue() ? _('yes') : _('no')));
 | |
| 		$row->addLabel(new htmlOutputText(_('Collective')), 'bold-mobile-only');
 | |
| 		$row->addField(new htmlOutputText($attribute->getIsCollective() ? _('yes') : _('no')));
 | |
| 		$row->addLabel(new htmlOutputText(_('User modification')), 'bold-mobile-only');
 | |
| 		$row->addField(new htmlOutputText($attribute->getIsNoUserModification() ? _('no') : _('yes')));
 | |
| 		if (!empty($attribute->getUsage())) {
 | |
| 			$row->addLabel(new htmlOutputText(_('Usage')), 'bold-mobile-only');
 | |
| 			$row->addField(new htmlOutputText($attribute->getUsage()));
 | |
| 		}
 | |
| 		if (!empty($attribute->getMaxLength())) {
 | |
| 			$row->addLabel(new htmlOutputText(_('Maximum length')), 'bold-mobile-only');
 | |
| 			$row->addField(new htmlOutputText($attribute->getMaxLength()));
 | |
| 		}
 | |
| 		if (!empty($attribute->getAliases())) {
 | |
| 			$row->addLabel(new htmlOutputText(_('Aliases')), 'bold-mobile-only');
 | |
| 			$aliases = new htmlGroup();
 | |
| 			foreach ($attribute->getAliases() as $alias) {
 | |
| 				$aliases->addElement(new htmlDiv(null, new htmlLink($alias, 'schema.php?display=attribute&sel=' . rawurlencode($alias))));
 | |
| 			}
 | |
| 			$row->addField($aliases);
 | |
| 		}
 | |
| 		if (!empty($attribute->getUsedInObjectClasses())) {
 | |
| 			$row->addLabel(new htmlOutputText(_('Used by object classes')), 'bold-mobile-only');
 | |
| 			$objectClasses = new htmlGroup();
 | |
| 			foreach ($attribute->getUsedInObjectClasses() as $objectClass) {
 | |
| 				$objectClasses->addElement(new htmlDiv(null, new htmlLink($objectClass, 'schema.php?display=objectClass&sel=' . rawurlencode($objectClass))));
 | |
| 			}
 | |
| 			$row->addField($objectClasses);
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| }
 | |
| 
 | |
| ?>
 |