3
$Id: modules.inc 4767 2013-02-23 17:10:43Z gruberroland $
3
$Id: modules.inc 4906 2013-05-09 19:10:35Z gruberroland $
5
5
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
6
6
Copyright (C) 2003 - 2013 Roland Gruber
63
63
* @return string alias name
65
65
function getModuleAlias($name, $scope) {
66
$module = new $name($scope);
66
$module = moduleCache::getModule($name, $scope);
67
67
return $module->get_alias();
75
75
* @return boolean true if base module
77
77
function is_base_module($name, $scope) {
78
$module = new $name($scope);
78
$module = moduleCache::getModule($name, $scope);
79
79
return $module->is_base_module();
90
90
$filters = array();
92
92
for ($i = 0; $i < sizeof($mods); $i++) {
93
$module = new $mods[$i]($scope);
93
$module = moduleCache::getModule($mods[$i], $scope);
94
94
$modinfo = $module->get_ldap_filter();
95
95
if (isset($modinfo['or'])) $filters['or'][] = $modinfo['or'];
96
96
if (isset($modinfo['and'])) $filters['and'][] = $modinfo['and'];
142
142
$attrs_high = array();
143
143
for ($i = 0; $i < sizeof($mods); $i++) {
144
144
// get list of attributes
145
$module = new $mods[$i]($scope);
145
$module = moduleCache::getModule($mods[$i], $scope);
146
146
$attrs = $module->get_RDNAttributes();
147
147
$keys = array_keys($attrs);
148
148
// sort attributes
187
187
function getModulesDependencies($scope) {
188
188
$mods = getAvailableModules($scope);
189
189
for ($i = 0; $i < sizeof($mods); $i++) {
190
$module = new $mods[$i]($scope);
190
$module = moduleCache::getModule($mods[$i], $scope);
191
191
$return[$mods[$i]] = $module->get_dependencies();
271
271
while ($entry = $dir->read())
272
272
if ((substr($entry, strlen($entry) - 4, 4) == '.inc') && is_file($dirname . '/'.$entry)) {
273
273
$entry = substr($entry, 0, strpos($entry, '.'));
274
$temp = new $entry($scope);
274
$temp = moduleCache::getModule($entry, $scope);
275
275
if ($mustSupportAdminInterface && !$temp->supportsAdminInterface()) {
292
292
$mods = $_SESSION['config']->get_AccountModules($scope);
293
293
$return = array();
294
294
for ($i = 0; $i < sizeof($mods); $i++) {
295
$module = new $mods[$i]($scope);
295
$module = moduleCache::getModule($mods[$i], $scope);
296
296
$return[$mods[$i]] = $module->get_profileOptions();
309
309
$mods = $_SESSION['config']->get_AccountModules($scope);
310
310
$return = array();
311
311
for ($i = 0; $i < sizeof($mods); $i++) {
312
$module = new $mods[$i]($scope);
312
$module = moduleCache::getModule($mods[$i], $scope);
313
313
$temp = $module->check_profileOptions($options);
314
314
$return = array_merge($return, $temp);
326
326
$return = array();
327
327
$modules = array_keys($scopes);
328
328
for ($i = 0; $i < sizeof($modules); $i++) {
329
$m = new $modules[$i]('none');
329
$m = moduleCache::getModule($modules[$i], 'none');
330
330
$return[$modules[$i]] = $m->get_configOptions($scopes[$modules[$i]], $scopes);
343
343
$return = array();
344
344
$modules = array_keys($scopes);
345
345
for ($i = 0; $i < sizeof($modules); $i++) {
346
$m = new $modules[$i]('none');
346
$m = moduleCache::getModule($modules[$i], 'none');
347
347
$errors = $m->check_configOptions($scopes[$modules[$i]], $options);
348
348
if (isset($errors) && is_array($errors)) {
349
349
$return = array_merge($return, $errors);
370
370
return $helpArray[$helpID];
372
$moduleObject = new $module((($scope != '') ? $scope : 'none'));
375
$moduleObject = moduleCache::getModule($module, $scope);
373
376
return $moduleObject->get_help($helpID);
383
386
$mods = $_SESSION['config']->get_AccountModules($scope);
384
387
$return = array();
385
388
for ($i = 0; $i < sizeof($mods); $i++) {
386
$module = new $mods[$i]($scope);
389
$module = moduleCache::getModule($mods[$i], $scope);
387
390
$fields = $module->get_pdfFields();
388
391
$return[$mods[$i]] = array();
389
392
if (is_array($fields)) {
421
424
function getUploadColumns($scope, $selectedModules) {
422
425
$return = array();
423
426
for ($i = 0; $i < sizeof($selectedModules); $i++) {
424
$module = new $selectedModules[$i]($scope);
427
$module = moduleCache::getModule($selectedModules[$i], $scope);
425
428
$return[$selectedModules[$i]] = $module->get_uploadColumns($selectedModules);
445
448
$predepends = array();
446
449
// get dependencies
447
450
for ($i = 0; $i < sizeof($unOrdered); $i++) {
448
$mod = new $unOrdered[$i]($scope);
451
$mod = moduleCache::getModule($unOrdered[$i], $scope);
449
452
$predepends[$unOrdered[$i]] = $mod->get_uploadPreDepends();
451
454
// first all modules without predepends can be ordered
488
491
$partialAccounts = array();
489
492
for ($i = 0; $i < sizeof($data); $i++) $partialAccounts[$i]['objectClass'] = array();
490
493
for ($i = 0; $i < sizeof($ordered); $i++) {
491
$module = new $ordered[$i]($scope);
494
$module = moduleCache::getModule($ordered[$i], $scope);
492
495
$errors = $module->build_uploadAccounts($data, $ids, $partialAccounts, $selectedModules);
493
496
if (sizeof($errors) > 0) {
494
497
array_unshift($errors, array("INFO", _("Displayed account numbers start at \"0\". Add 2 to get the row in your spreadsheet."), ""));
515
518
$messages = array();
516
519
for ($i = 0; $i < sizeof($selectedModules); $i++) {
517
520
$activeModule = $selectedModules[$i];
518
$module = new $activeModule($scope);
521
$module = moduleCache::getModule($activeModule, $scope);
519
522
$messages = array_merge($messages, $module->doUploadPreActions($attributes));
521
524
return $messages;
551
554
$_SESSION['mass_postActions'][$activeModule] = array();
553
556
// let first module do one post action
554
$module = new $activeModule($scope);
557
$module = moduleCache::getModule($activeModule, $scope);
555
558
$return = $module->doUploadPostActions($data, $ids, $failed, $_SESSION['mass_postActions'][$activeModule], $accounts);
556
559
// remove active module from list if already finished
557
560
if ($return['status'] == 'finished') {
580
583
for ($i = 0; $i < sizeof($scopes); $i++) {
581
584
$mods = $_SESSION['config']->get_AccountModules($scopes[$i]);
582
585
for ($m = 0; $m < sizeof($mods); $m++) {
583
$module = new $mods[$m]($scopes[$i]);
586
$module = moduleCache::getModule($mods[$m], $scopes[$i]);
584
587
$ext = $module->getRequiredExtensions();
585
588
for ($e = 0; $e < sizeof($ext); $e++) {
586
589
if (!in_array($ext[$e], $extList)) $extList[] = $ext[$e];
651
654
$message .= '<br><br><hr class="dotted">' . _('Technical name') . ': <i>' . $entry['attr'] . '</i>';
653
656
// replace special characters
654
$message = str_replace(array("'", '"', "\n"), array("\\'", '"', ''), $message);
655
$title = str_replace(array("'", '"', "\n"), array("\\'", '"', ''), $title);
656
echo "<a href=\"" . $helpPath . "help.php?module=$module&HelpNumber=". $number . "&scope=" . $scope . "\" ";
657
$message = preg_replace('/[\\\\]{2}/', '\\\\', $message);
658
$title = preg_replace('/[\\\\]{2}/', '\\\\', $title);
659
$message = str_replace(array('\\', "'", '"', "\n"), array('\\\\', "\\'", '"', ''), $message);
660
$title = str_replace(array('\\', "'", '"', "\n"), array('\\\\', "\\'", '"', ''), $title);
661
echo "<a class=\"margin2\" href=\"" . $helpPath . "help.php?module=$module&HelpNumber=". $number . "&scope=" . $scope . "\" ";
657
662
echo "target=\"help\" ";
658
663
echo "onmouseover=\"Tip('" . $message . "', TITLE, '" . $title . "')\" onmouseout=\"UnTip()\">";
659
664
echo "<img class=\"align-middle\" width=16 height=16 src=\"../$helpPath/graphics/help.png\" alt=\"" . _('Help') . "\" title=\"" . _('Help') . "\">";
748
753
private $titleBarSubtitle = null;
749
754
/** send password via mail */
750
755
private $sendPasswordViaMail = null;
756
/** send password via mail to this alternate address */
757
private $sendPasswordViaMailAlternateAddress = null;
753
760
* Returns the account module with the given class name
787
794
* It prints the HTML code of each account page.
789
796
function continue_main() {
797
$oldPage = $this->current_page;
798
$oldSubpage = $this->subpage;
790
800
$result = array();
791
801
$stopProcessing = false; // when set to true, no module options are displayed
792
802
$errorsOccured = false;
923
933
$this->titleBarSubtitle = $typeObject->getTitleBarSubtitle($this);
924
934
// prints a module content page
925
935
$this->printModuleContent($result, $stopProcessing);
936
if (!$errorsOccured && ($oldPage == $this->current_page) && ($oldSubpage == $this->subpage)
937
&& isset($_POST['scrollPositionTop']) && isset($_POST['scrollPositionLeft'])) {
938
// scroll to last position
939
echo '<script type="text/javascript">
940
jQuery(document).ready(function() {
941
jQuery(window).scrollTop(' . $_POST['scrollPositionTop'] . ');
942
jQuery(window).scrollLeft('. $_POST['scrollPositionLeft'] . ');
946
$this->printPageFooter();
1040
1059
$container->addElement(new htmlHelpLink('406'), true);
1042
1061
if (isLAMProVersion() && isset($this->attributes_orig['mail'][0])) {
1043
$container->addElement(new htmlTableExtendedInputCheckbox('lamPasswordChangeSendMail', false, _('Send via mail')));
1062
$pwdMailCheckbox = new htmlTableExtendedInputCheckbox('lamPasswordChangeSendMail', false, _('Send via mail'));
1063
$pwdMailCheckbox->setTableRowsToShow(array('lamPasswordChangeSendMailAddress'));
1064
$container->addElement($pwdMailCheckbox);
1044
1065
$container->addElement(new htmlHelpLink('407'), true);
1066
$container->addElement(new htmlTableExtendedInputField(_('Alternate recipient'), 'lamPasswordChangeSendMailAddress', '', '410'));
1046
1068
$container->addElement(new htmlSpacer(null, '10px'), true);
1047
1069
// password modules
1135
1157
if (isLAMProVersion() && $sendMail) {
1136
1158
$this->sendPasswordViaMail = $password1;
1159
if (!empty($input['sendMailAlternateAddress'])) {
1160
if (!get_preg($input['sendMailAlternateAddress'], 'email')) {
1161
$return['messages'] .= StatusMessage('ERROR', _('Alternate recipient'), _('Please enter a valid email address!'), array(), true);
1162
$return['errorsOccured'] = 'true';
1164
$this->sendPasswordViaMailAlternateAddress = $input['sendMailAlternateAddress'];
1138
1167
if ($return['errorsOccured'] == 'false') {
1139
1168
$return['messages'] .= StatusMessage('INFO', _('The new password will be stored in the directory after you save this account.'), '', array(), true);
1225
1254
private function printPageHeader() {
1226
1255
include '../main_header.php';
1227
echo '<script type="text/javascript">';
1228
echo 'jQuery(document).ready(function() {';
1229
echo ' jQuery("#inputForm").validationEngine();';
1232
echo "<form id=\"inputForm\" enctype=\"multipart/form-data\" action=\"edit.php\" method=\"post\">\n";
1256
echo '<script type="text/javascript">
1257
jQuery(document).ready(function() {
1258
jQuery("#inputForm").validationEngine();
1261
echo "<form id=\"inputForm\" enctype=\"multipart/form-data\" action=\"edit.php\" method=\"post\" onSubmit=\"saveScrollPosition('inputForm')\">\n";
1278
1307
$type = new $this->type();
1279
1308
$buttonGroup = new htmlGroup();
1280
$createButton = new htmlButton('accountContainerCreateAgain', $type->LABEL_CREATE_ANOTHER_ACCOUNT);
1281
$createButton->setIconClass('createButton');
1282
$buttonGroup->addElement($createButton);
1283
$buttonGroup->addElement(new htmlSpacer('10px', null));
1309
if (checkIfNewEntriesAreAllowed($this->type)) {
1310
$createButton = new htmlButton('accountContainerCreateAgain', $type->LABEL_CREATE_ANOTHER_ACCOUNT);
1311
$createButton->setIconClass('createButton');
1312
$buttonGroup->addElement($createButton);
1313
$buttonGroup->addElement(new htmlSpacer('10px', null));
1284
1315
$pdfButton = new htmlButton('accountContainerCreatePDF', _('Create PDF file'));
1285
1316
$pdfButton->setIconClass('pdfButton');
1286
1317
$buttonGroup->addElement($pdfButton);
1491
1522
foreach ($modules as $module) {
1492
1523
if (!isset($this->module[$module])) {
1493
$this->module[$module] = new $module($this->type);
1524
$this->module[$module] = moduleCache::getModule($module, $this->type);
1494
1525
$this->module[$module]->init($this->base);
1496
1527
$this->module[$module]->load_attributes($attr);
1520
1551
$aliases = array();
1521
1552
$ldapAttributesTemp = array();
1522
1553
foreach ($modules as $module) {
1523
$moduleObj = new $module($this->type);
1554
$moduleObj = moduleCache::getModule($module, $this->type);
1524
1555
$objectClasses = array_merge($objectClasses, $moduleObj->getManagedObjectClasses());
1525
1556
$aliases = array_merge($aliases, $moduleObj->getLDAPAliases());
1526
1557
$ldapAttributesTemp = array_merge($ldapAttributesTemp, $moduleObj->getManagedAttributes());
1591
1622
$this->lastLoadedProfile = 'default';
1592
1623
$modules = $_SESSION['config']->get_AccountModules($this->type);
1593
1624
foreach ($modules as $module) {
1594
$this->module[$module] = new $module($this->type);
1625
$this->module[$module] = moduleCache::getModule($module, $this->type);
1595
1626
$this->module[$module]->init($this->base);
1597
1628
// sort module buttons
1780
1811
for ($i=0; $i<count($DNs); $i++) {
1781
1812
if (!$stopprocessing) {
1782
1813
logNewMessage(LOG_DEBUG, 'Attribute changes for ' . $DNs[$i] . ":\n" . print_r($attributes[$DNs[$i]], true));
1783
// modify attributes
1814
// modify attributesabnahme
1784
1815
if (isset($attributes[$DNs[$i]]['modify']) && !$stopprocessing) {
1785
1816
$success = @ldap_mod_replace($_SESSION['ldap']->server(), $DNs[$i], $attributes[$DNs[$i]]['modify']);
1786
1817
if (!$success) {
1787
logNewMessage(LOG_ERR, '[' . $ldapUser .'] Unable to modify attributes from DN: ' . $DNs[$i] . ' (' . ldap_err2str(ldap_errno($_SESSION['ldap']->server())) . ').');
1788
$errors[] = array('ERROR', sprintf(_('Was unable to modify attributes from DN: %s.'), $DNs[$i]), ldap_error($_SESSION['ldap']->server()));
1818
logNewMessage(LOG_ERR, '[' . $ldapUser .'] Unable to modify attributes of DN: ' . $DNs[$i] . ' (' . ldap_err2str(ldap_errno($_SESSION['ldap']->server())) . ').');
1819
$errors[] = array('ERROR', sprintf(_('Was unable to modify attributes of DN: %s.'), $DNs[$i]), ldap_error($_SESSION['ldap']->server()));
1789
1820
$stopprocessing = true;
1826
1857
// send password mail
1827
1858
if (!$stopprocessing && isLAMProVersion() && ($this->sendPasswordViaMail != null)) {
1828
$mailMessages = sendPasswordMail($this->sendPasswordViaMail, $prePostModifyAttributes);
1859
$mailMessages = sendPasswordMail($this->sendPasswordViaMail, $prePostModifyAttributes, $this->sendPasswordViaMailAlternateAddress);
1829
1860
if (sizeof($mailMessages) > 0) {
1830
1861
$errors = array_merge($errors, $mailMessages);
1832
1863
$this->sendPasswordViaMail = null;
1864
$this->sendPasswordViaMailAlternateAddress = null;
1834
1866
if (!$stopprocessing) {
1835
1867
// post modify actions