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(__DIR__ . "/../../lib/security.inc");
|
|
/** access to LDAP server */
|
|
include_once(__DIR__ . "/../../lib/ldap.inc");
|
|
/** access to configuration options */
|
|
include_once(__DIR__ . "/../../lib/config.inc");
|
|
/** schema functions */
|
|
require_once(__DIR__ . "/../../lib/schema.inc");
|
|
|
|
// start session
|
|
startSecureSession();
|
|
enforceUserIsLoggedIn();
|
|
|
|
checkIfToolIsActive('toolSchemaBrowser');
|
|
|
|
setlanguage();
|
|
|
|
include __DIR__ . '/../../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 __DIR__ . '/../../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);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
?>
|