LDAPAccountManager/lam/templates/schema/schema.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);
}
}
}
?>