diff --git a/lam/docs/devel/upgrade.htm b/lam/docs/devel/upgrade.htm index 6c03e429..f867206a 100644 --- a/lam/docs/devel/upgrade.htm +++ b/lam/docs/devel/upgrade.htm @@ -19,6 +19,7 @@ + @@ -48,6 +49,7 @@ This is a list of API changes for all LAM releases.

5.5 -> 5.6

Functions in lib/types.inc got namespace LAM/TYPES (e.g. getTypeAlias()).
+New API to access configured account types: LAM\TYPES\TypeManager.

5.4 -> 5.5

Functions Ldap::encrypt/decrypt in ldap.inc moved to lamEncrypt/lamDecrypt in security.inc.

diff --git a/lam/templates/main_header.php b/lam/templates/main_header.php index 24113f48..456233a0 100644 --- a/lam/templates/main_header.php +++ b/lam/templates/main_header.php @@ -197,21 +197,27 @@ jQuery(document).ready(function() {
+getConfiguredTypes(); + $linkList = array(); + foreach ($types as $type) { + if ($type->isHidden()) { + continue; + } + $link = '' . + '' . $type->getId() . ' ' . + $type->getAlias() . ''; + echo '
  • '; + echo $link; + echo "
  • \n"; + } +} + diff --git a/lam/templates/profedit/profilemain.php b/lam/templates/profedit/profilemain.php index 182f99d8..7ac135d2 100644 --- a/lam/templates/profedit/profilemain.php +++ b/lam/templates/profedit/profilemain.php @@ -51,16 +51,17 @@ if (!empty($_POST)) { validateSecurityToken(); } -$types = $_SESSION['config']->get_ActiveTypes(); +$typeManager = new LAM\TYPES\TypeManager(); +$types = $typeManager->getConfiguredTypes(); $profileClasses = array(); $profileClassesTemp = array(); -for ($i = 0; $i < sizeof($types); $i++) { - if (isAccountTypeHidden($types[$i]) || !checkIfWriteAccessIsAllowed($types[$i])) { +foreach ($types as $type) { + if ($type->isHidden() || !checkIfWriteAccessIsAllowed($type->getId())) { continue; } - $profileClassesTemp[LAM\TYPES\getTypeAlias($types[$i])] = array( - 'scope' => $types[$i], - 'title' => LAM\TYPES\getTypeAlias($types[$i]), + $profileClassesTemp[$type->getAlias()] = array( + 'typeId' => $type->getId(), + 'title' => $type->getAlias(), 'profiles' => ""); } $profileClassesKeys = array_keys($profileClassesTemp); @@ -83,9 +84,9 @@ elseif (isset($_POST['createProfileButton'])) { } // check if a profile should be edited for ($i = 0; $i < sizeof($profileClasses); $i++) { - if (isset($_POST['editProfile_' . $profileClasses[$i]['scope']]) || isset($_POST['editProfile_' . $profileClasses[$i]['scope'] . '_x'])) { - metaRefresh("profilepage.php?type=" . htmlspecialchars($profileClasses[$i]['scope']) . - "&edit=" . htmlspecialchars($_POST['profile_' . $profileClasses[$i]['scope']])); + if (isset($_POST['editProfile_' . $profileClasses[$i]['typeId']]) || isset($_POST['editProfile_' . $profileClasses[$i]['typeId'] . '_x'])) { + metaRefresh("profilepage.php?type=" . htmlspecialchars($profileClasses[$i]['typeId']) . + "&edit=" . htmlspecialchars($_POST['profile_' . $profileClasses[$i]['typeId']])); exit; } } @@ -99,18 +100,19 @@ $container = new htmlTable(); $container->addElement(new htmlTitle(_("Profile editor")), true); if (isset($_POST['deleteProfile']) && ($_POST['deleteProfile'] == 'true')) { - if (isAccountTypeHidden($_POST['profileDeleteType'])) { + $type = $typeManager->getConfiguredType($_POST['profileDeleteType']); + if ($type->isHidden()) { logNewMessage(LOG_ERR, 'User tried to delete hidden account type profile: ' . $_POST['profileDeleteType']); die(); } // delete profile if (delAccountProfile($_POST['profileDeleteName'], $_POST['profileDeleteType'])) { - $message = new htmlStatusMessage('INFO', _('Deleted profile.'), LAM\TYPES\getTypeAlias($_POST['profileDeleteType']) . ': ' . htmlspecialchars($_POST['profileDeleteName'])); + $message = new htmlStatusMessage('INFO', _('Deleted profile.'), $type->getAlias() . ': ' . htmlspecialchars($_POST['profileDeleteName'])); $message->colspan = 10; $container->addElement($message, true); } else { - $message = new htmlStatusMessage('ERROR', _('Unable to delete profile!'), LAM\TYPES\getTypeAlias($_POST['profileDeleteType']) . ': ' . htmlspecialchars($_POST['profileDeleteName'])); + $message = new htmlStatusMessage('ERROR', _('Unable to delete profile!'), $type->getAlias() . ': ' . htmlspecialchars($_POST['profileDeleteName'])); $message->colspan = 10; $container->addElement($message, true); } @@ -120,12 +122,12 @@ if (isset($_POST['deleteProfile']) && ($_POST['deleteProfile'] == 'true')) { if (isset($_POST['importexport']) && ($_POST['importexport'] === '1')) { $cfg = new LAMCfgMain(); $impExpMessage = null; - if (isset($_POST['importProfiles_' . $_POST['scope']])) { + if (isset($_POST['importProfiles_' . $_POST['typeId']])) { // check master password - if (!$cfg->checkPassword($_POST['passwd_' . $_POST['scope']])) { + if (!$cfg->checkPassword($_POST['passwd_' . $_POST['typeId']])) { $impExpMessage = new htmlStatusMessage('ERROR', _('Master password is wrong!')); } - elseif (copyAccountProfiles($_POST['importProfiles_' . $_POST['scope']], $_POST['scope'])) { + elseif (copyAccountProfiles($_POST['importProfiles_' . $_POST['typeId']], $_POST['typeId'])) { $impExpMessage = new htmlStatusMessage('INFO', _('Import successful')); } } else if (isset($_POST['exportProfiles'])) { @@ -133,7 +135,7 @@ if (isset($_POST['importexport']) && ($_POST['importexport'] === '1')) { if (!$cfg->checkPassword($_POST['passwd'])) { $impExpMessage = new htmlStatusMessage('ERROR', _('Master password is wrong!')); } - elseif (copyAccountProfiles($_POST['exportProfiles'], $_POST['scope'], $_POST['destServerProfiles'])) { + elseif (copyAccountProfiles($_POST['exportProfiles'], $_POST['typeId'], $_POST['destServerProfiles'])) { $impExpMessage = new htmlStatusMessage('INFO', _('Export successful')); } } @@ -145,7 +147,7 @@ if (isset($_POST['importexport']) && ($_POST['importexport'] === '1')) { // get list of profiles for each account type for ($i = 0; $i < sizeof($profileClasses); $i++) { - $profileList = getAccountProfiles($profileClasses[$i]['scope']); + $profileList = getAccountProfiles($profileClasses[$i]['typeId']); natcasesort($profileList); $profileClasses[$i]['profiles'] = $profileList; } @@ -161,7 +163,7 @@ if (!empty($profileClasses)) { $container->addElement(new htmlSubTitle(_('Create a new profile')), true); $sortedTypes = array(); for ($i = 0; $i < sizeof($profileClasses); $i++) { - $sortedTypes[$profileClasses[$i]['title']] = $profileClasses[$i]['scope']; + $sortedTypes[$profileClasses[$i]['title']] = $profileClasses[$i]['typeId']; } natcasesort($sortedTypes); $newContainer = new htmlTable(); @@ -188,32 +190,32 @@ for ($i = 0; $i < sizeof($profileClasses); $i++) { $existingContainer->addElement(new htmlSpacer(null, '10px'), true); } - $existingContainer->addElement(new htmlImage('../../graphics/' . $profileClasses[$i]['scope'] . '.png')); + $existingContainer->addElement(new htmlImage('../../graphics/' . $profileClasses[$i]['typeId'] . '.png')); $existingContainer->addElement(new htmlSpacer('3px', null)); $existingContainer->addElement(new htmlOutputText($profileClasses[$i]['title'])); $existingContainer->addElement(new htmlSpacer('3px', null)); - $select = new htmlSelect('profile_' . $profileClasses[$i]['scope'], $profileClasses[$i]['profiles']); + $select = new htmlSelect('profile_' . $profileClasses[$i]['typeId'], $profileClasses[$i]['profiles']); $select->setWidth('15em'); $existingContainer->addElement($select); $existingContainer->addElement(new htmlSpacer('3px', null)); - $editButton = new htmlButton('editProfile_' . $profileClasses[$i]['scope'], 'edit.png', true); + $editButton = new htmlButton('editProfile_' . $profileClasses[$i]['typeId'], 'edit.png', true); $editButton->setTitle(_('Edit')); $existingContainer->addElement($editButton); $deleteLink = new htmlLink(null, '#', '../../graphics/delete.png'); $deleteLink->setTitle(_('Delete')); - $deleteLink->setOnClick("profileShowDeleteDialog('" . _('Delete') . "', '" . _('Ok') . "', '" . _('Cancel') . "', '" . $profileClasses[$i]['scope'] . "', '" . 'profile_' . $profileClasses[$i]['scope'] . "');"); + $deleteLink->setOnClick("profileShowDeleteDialog('" . _('Delete') . "', '" . _('Ok') . "', '" . _('Cancel') . "', '" . $profileClasses[$i]['typeId'] . "', '" . 'profile_' . $profileClasses[$i]['typeId'] . "');"); $existingContainer->addElement($deleteLink); if (count($configProfiles) > 1) { $importLink = new htmlLink(null, '#', '../../graphics/import.png'); $importLink->setTitle(_('Import profiles')); $importLink->setOnClick("showDistributionDialog('" . _("Import profiles") . "', '" . - _('Ok') . "', '" . _('Cancel') . "', '" . $profileClasses[$i]['scope'] . "', 'import');"); + _('Ok') . "', '" . _('Cancel') . "', '" . $profileClasses[$i]['typeId'] . "', 'import');"); $existingContainer->addElement($importLink); } $exportLink = new htmlLink(null, '#', '../../graphics/export.png'); $exportLink->setTitle(_('Export profile')); $exportLink->setOnClick("showDistributionDialog('" . _("Export profile") . "', '" . - _('Ok') . "', '" . _('Cancel') . "', '" . $profileClasses[$i]['scope'] . "', 'export', '" . 'profile_' . $profileClasses[$i]['scope'] . "', '" . $_SESSION['config']->getName() . "');"); + _('Ok') . "', '" . _('Cancel') . "', '" . $profileClasses[$i]['typeId'] . "', 'export', '" . 'profile_' . $profileClasses[$i]['typeId'] . "', '" . $_SESSION['config']->getName() . "');"); $existingContainer->addElement($exportLink); $existingContainer->addNewLine(); } @@ -228,11 +230,11 @@ echo "\n"; echo "
    \n"; for ($i = 0; $i < sizeof($profileClasses); $i++) { - $scope = $profileClasses[$i]['scope']; + $typeId = $profileClasses[$i]['typeId']; $tmpArr = array(); foreach ($configProfiles as $profile) { if ($profile != $_SESSION['config']->getName()) { - $accountProfiles = getAccountProfiles($scope, $profile); + $accountProfiles = getAccountProfiles($typeId, $profile); if (!empty($accountProfiles)) { for ($p = 0; $p < sizeof($accountProfiles); $p++) { $tmpArr[$profile][$accountProfiles[$p]] = $profile . '##' . $accountProfiles[$p]; @@ -242,13 +244,13 @@ for ($i = 0; $i < sizeof($profileClasses); $i++) { } //import dialog - echo "
    \n"; - echo "
    \n"; + echo "
    \n"; + echo "\n"; $container = new htmlTable(); $container->addElement(new htmlOutputText(_('Profiles')), true); - $select = new htmlSelect('importProfiles_' . $scope, $tmpArr, array(), count($tmpArr, 1) < 15 ? count($tmpArr, 1) : 15); + $select = new htmlSelect('importProfiles_' . $typeId, $tmpArr, array(), count($tmpArr, 1) < 15 ? count($tmpArr, 1) : 15); $select->setMultiSelect(true); $select->setHasDescriptiveElements(true); $select->setContainsOptgroups(true); @@ -260,12 +262,12 @@ for ($i = 0; $i < sizeof($profileClasses); $i++) { $container->addElement(new htmlSpacer(null, '10px'), true); $container->addElement(new htmlOutputText(_("Master password")), true); - $exportPasswd = new htmlInputField('passwd_' . $scope); + $exportPasswd = new htmlInputField('passwd_' . $typeId); $exportPasswd->setIsPassword(true); $container->addElement($exportPasswd); $container->addElement(new htmlHelpLink('236')); $container->addElement(new htmlHiddenInput('importexport', '1')); - $container->addElement(new htmlHiddenInput('scope', $scope), true); + $container->addElement(new htmlHiddenInput('typeId', $typeId), true); addSecurityTokenToMetaHTML($container); parseHtml(null, $container, array(), false, $tabindex, 'user'); diff --git a/lam/templates/profedit/profilepage.php b/lam/templates/profedit/profilepage.php index 9c2e120b..b5f57425 100644 --- a/lam/templates/profedit/profilepage.php +++ b/lam/templates/profedit/profilepage.php @@ -3,7 +3,7 @@ $Id$ This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/) - Copyright (C) 2003 - 2015 Roland Gruber + Copyright (C) 2003 - 2016 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 @@ -62,10 +62,16 @@ if (!$_SESSION['ldap'] || !$_SESSION['ldap']->server()) { } // copy type and profile name from POST to GET -if (isset($_POST['profname'])) $_GET['edit'] = $_POST['profname']; -if (isset($_POST['accounttype'])) $_GET['type'] = $_POST['accounttype']; +if (isset($_POST['profname'])) { + $_GET['edit'] = $_POST['profname']; +} +if (isset($_POST['accounttype'])) { + $_GET['type'] = $_POST['accounttype']; +} -if (isAccountTypeHidden($_GET['type']) || !checkIfWriteAccessIsAllowed($_GET['type'])) { +$typeManager = new LAM\TYPES\TypeManager(); +$type = $typeManager->getConfiguredType($_GET['type']); +if ($type->isHidden() || !checkIfWriteAccessIsAllowed($_GET['type'])) { logNewMessage(LOG_ERR, 'User tried to access hidden account type profile: ' . $_GET['type']); die(); } @@ -108,14 +114,14 @@ if (isset($_POST['save'])) { $options[$element] = explode("\r\n", $_POST[$element]); } } - + // remove double slashes if magic quotes are on if (get_magic_quotes_gpc() == 1) { foreach ($opt_keys as $element) { if (isset($options[$element][0]) && is_string($options[$element][0])) $options[$element][0] = stripslashes($options[$element][0]); } } - + // check options $errors = checkProfileOptions($_POST['accounttype'], $options); if (sizeof($errors) == 0) { // input data is valid, save profile @@ -140,15 +146,12 @@ if (sizeof($errors) > 0) { call_user_func_array('StatusMessage', $errors[$i]); } } - + // empty list of attribute types $_SESSION['profile_types'] = array(); -// check if account type is valid -$type = $_GET['type']; - // get module options -$options = getProfileOptions($type); +$options = getProfileOptions($type->getId()); // load old profile or POST values if needed $old_options = array(); @@ -169,11 +172,11 @@ if (isset($_POST['save'])) { } } elseif (isset($_GET['edit'])) { - $old_options = loadAccountProfile($_GET['edit'], $type); + $old_options = loadAccountProfile($_GET['edit'], $type->getId()); } // display formular -echo "\n"; +echo "getId() . "\" method=\"post\">\n"; echo ''; $profName = ''; @@ -192,10 +195,10 @@ $dnContent->addElement(new htmlTableExtendedInputField(_("Profile name") . '*', $dnContent->addElement(new htmlSpacer(null, '10px'), true); // suffix box // get root suffix -$rootsuffix = $_SESSION['config']->get_Suffix($type); +$rootsuffix = $type->getSuffix(); // get subsuffixes $suffixes = array('-' => '-'); -$typeObj = new $type(); +$typeObj = $type->getBaseType(); $possibleSuffixes = $typeObj->getSuffixList(); foreach ($possibleSuffixes as $suffix) { $suffixes[getAbstractDN($suffix)] = $suffix; @@ -210,7 +213,7 @@ $suffixSelect->setSortElements(false); $suffixSelect->setRightToLeftTextDirection(true); $dnContent->addElement($suffixSelect, true); // RDNs -$rdns = getRDNAttributes($type); +$rdns = getRDNAttributes($type->getId()); $selectedRDN = array(); if (isset($old_options['ldap_rdn'][0])) { $selectedRDN[] = $old_options['ldap_rdn'][0]; @@ -220,22 +223,22 @@ $dnContent->addElement(new htmlTableExtendedSelect('ldap_rdn', $rdns, $selectedR $container->addElement(new htmlFieldset($dnContent, _("General settings"), '../../graphics/logo32.png'), true); $container->addElement(new htmlSpacer(null, '15px'), true); -$_SESSION['profile_types'] = parseHtml(null, $container, $old_options, false, $tabindex, $type); +$_SESSION['profile_types'] = parseHtml(null, $container, $old_options, false, $tabindex, $type->getScope()); // display module options $modules = array_keys($options); for ($m = 0; $m < sizeof($modules); $m++) { // ignore modules without options if (sizeof($options[$modules[$m]]) < 1) continue; - $module = new $modules[$m]($type); + $module = new $modules[$m]($type->getId()); $icon = $module->getIcon(); if (($icon != null) && !(strpos($icon, 'http') === 0) && !(strpos($icon, '/') === 0)) { $icon = '../../graphics/' . $icon; } $container = new htmlTable(); - $container->addElement(new htmlFieldset($options[$modules[$m]], getModuleAlias($modules[$m], $type), $icon), true); + $container->addElement(new htmlFieldset($options[$modules[$m]], getModuleAlias($modules[$m], $type->getScope()), $icon), true); $container->addElement(new htmlSpacer(null, '15px'), true); - $_SESSION['profile_types'] = array_merge($_SESSION['profile_types'], parseHtml($modules[$m], $container, $old_options, false, $tabindex, $type)); + $_SESSION['profile_types'] = array_merge($_SESSION['profile_types'], parseHtml($modules[$m], $container, $old_options, false, $tabindex, $type->getScope())); } // profile name and submit/abort buttons @@ -246,9 +249,9 @@ $buttonTable->addElement($saveButton); $cancelButton = new htmlButton('abort', _('Cancel')); $cancelButton->setIconClass('cancelButton'); $buttonTable->addElement($cancelButton); -$buttonTable->addElement(new htmlHiddenInput('accounttype', $type)); +$buttonTable->addElement(new htmlHiddenInput('accounttype', $type->getId())); -$_SESSION['profile_types'] = array_merge($_SESSION['profile_types'], parseHtml(null, $buttonTable, $old_options, false, $tabindex, $type)); +$_SESSION['profile_types'] = array_merge($_SESSION['profile_types'], parseHtml(null, $buttonTable, $old_options, false, $tabindex, $type->getScope())); ?>