diff --git a/plugins/configuration/backend/class_DebugLevelAttribute.inc b/plugins/configuration/backend/class_DebugLevelAttribute.inc new file mode 100644 index 0000000000000000000000000000000000000000..b1ac991109cf41239948ad64f61d4f6cfd742d39 --- /dev/null +++ b/plugins/configuration/backend/class_DebugLevelAttribute.inc @@ -0,0 +1,48 @@ +<?php +/* + This code is part of FusionDirectory (http://www.fusiondirectory.org/) + + Copyright (C) 2012-2019 FusionDirectory + + 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +/* Debug level is an OR combination of several values */ +class DebugLevelAttribute extends SetAttribute +{ + protected function loadAttrValue (array $attrs) + { + if (isset($attrs[$this->getLdapName()])) { + $value = $attrs[$this->getLdapName()][0]; + $this->value = []; + foreach ($this->attribute->getChoices() as $choice) { + if ($value & $choice) { + $this->value[] = $choice; + } + } + } else { + $this->resetToDefault(); + } + } + + function computeLdapValue () + { + $value = 0; + foreach ($this->value as $v) { + $value |= $v; + } + return $value; + } +} diff --git a/plugins/configuration/backend/class_configInLdap.inc b/plugins/configuration/backend/class_configInLdap.inc new file mode 100644 index 0000000000000000000000000000000000000000..8cf0034b45ef282dcfce54cfaf8bb38848e47d40 --- /dev/null +++ b/plugins/configuration/backend/class_configInLdap.inc @@ -0,0 +1,619 @@ +<?php +/* + This code is part of FusionDirectory (http://www.fusiondirectory.org/) + + Copyright (C) 2012-2019 FusionDirectory + + 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +class configInLdap extends simplePlugin +{ + static function plInfo (): array + { + return [ + 'plShortName' => _('Configuration'), + 'plTitle' => _('FusionDirectory configuration'), + 'plDescription' => _('Configuration screen of FusionDirectory'), + 'plIcon' => 'geticon.php?context=categories&icon=settings&size=48', + 'plObjectClass' => ['fusionDirectoryConf'], + 'plObjectType' => [ + 'configuration' => [ + 'name' => _('FusionDirectory configuration'), + 'filter' => 'objectClass=fusionDirectoryConf', + 'tabClass' => 'configInLdapTabs', + 'icon' => 'geticon.php?context=categories&icon=settings&size=16', + 'mainAttr' => FALSE, + 'ou' => preg_replace('/^[^,]+,/', '', CONFIGRDN) + ] + ], + 'plSection' => ['conf' => ['name' => _('Configuration'), 'priority' => 20]], + 'plManages' => ['configuration'], + 'plPriority' => 0, + + 'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo()) + ]; + } + + static function getAttributesInfo (): array + { + global $config; + + return [ + 'look_n_feel' => [ + 'name' => _('Look and feel'), + 'attrs' => [ + new SelectAttribute( + _('Language'), _('Language of the application. If \'automatic\' or not available, the one asked by the browser will be used. This setting can be overriden per user.'), + 'fdLanguage', FALSE, + [''] + ), + new SelectAttribute( + _('Theme'), _('Theme to be used'), + 'fdTheme', TRUE, + static::get_themes(), + 'breezy' + ), + new SelectAttribute( + _('Timezone'), _('Timezone to be used'), + 'fdTimezone', TRUE, + ['America/New_York'] + ), + new HiddenAttribute('fusionConfigMd5'), + new HiddenAttribute('fdIncrementalModifierStates'), + ] + ], + 'core_settings' => [ + 'name' => _('Core settings'), + 'attrs' => [ + new IntAttribute( + _('LDAP size limit'), _('Defines the number of entries to get from LDAP by default.'), + 'fdLdapSizeLimit', FALSE, + 0 /*min*/, FALSE /*no max*/, 200 + ), + new SelectAttribute( + _('Edit locking'), + _('Check if a entry currently being edited has been modified outside of FusionDirectory in the meantime.'), + 'fdModificationDetectionAttribute', FALSE, + ['', 'entryCSN', 'contextCSN'], 'entryCSN' + ), + new BooleanAttribute( + _('Enable logging'), + _('Event logging on FusionDirectory side.'), + 'fdLogging', FALSE, + TRUE + ), + new BooleanAttribute( + _('Schema validation'), + _('Enables schema checking during login.'), + 'fdSchemaCheck', FALSE, + TRUE + ), + new BooleanAttribute( + _('Wildcard foreign keys'), _('Enables wildcard searches like member=* when moving a whole department. This will open all existing groups and roles to make sure foreign keys are respected. Slow on big trees.'), + 'fdWildcardForeignKeys', FALSE, + TRUE + ), + ] + ], + 'password' => [ + 'name' => _('Password settings'), + 'attrs' => [ + new SetAttribute( + new SelectAttribute( + _('Allowed password hashes'), _('Password hashes which may be used for user passwords'), + 'fdPasswordAllowedHashes', TRUE, + ['ssha'] + ) + ), + new SelectAttribute( + _('Password default hash'), _('Default hash to be used'), + 'fdPasswordDefaultHash', TRUE, + ['ssha'] + ), + new BooleanAttribute( + _('Force default hash'), _('Force the use of the default password hash'), + 'fdForcePasswordDefaultHash' + ), + new IntAttribute( + _('Password minimum length'), _('Minimum length of user passwords'), + 'fdPasswordMinLength', FALSE, + 0 /*min*/, FALSE /*no max*/ + ), + new IntAttribute( + _('Password minimum differs'), _('Minimum number of different characters from last password'), + 'fdPasswordMinDiffer', FALSE, + 0 /*min*/, FALSE /*no max*/ + ), + new BooleanAttribute( + _('Use account expiration'), + _('Enables shadow attribute tests during the login to FusionDirectory and forces password renewal or account locking'), + 'fdHandleExpiredAccounts' + ), + new StringAttribute( + _('SASL Realm'), _('SASL Realm'), + 'fdSaslRealm' + ), + new StringAttribute( + _('SASL Exop'), _('Attribute to be stored in the userPassword attribute'), + 'fdSaslExop' + ), + ] + ], + 'login' => [ + 'name' => _('Login and session'), + 'attrs' => [ + new SelectAttribute( + _('Login attribute'), + _('Which LDAP attribute should be used as the login name during login.'), + 'fdLoginAttribute', TRUE, + ['uid', 'mail', 'uid,mail'], 'uid', + ['uid', 'mail', 'both'] + ), + new BooleanAttribute( + _('Enforce encrypted connections'), + _('Enables PHP security checks to force encrypted access (https) to the web interface.'), + 'fdForceSSL' + ), + new BooleanAttribute( + _('Warn if session is not encrypted'), + _('will display a warning to the user when http is used instead of https.'), + 'fdWarnSSL', FALSE, + TRUE + ), + new IntAttribute( + _('Session lifetime'), _('Defines when a session will expire in seconds (0 to disable).'), + 'fdSessionLifeTime', TRUE, + 0 /*min*/, FALSE /*no max*/, 1800 + ), + new SelectAttribute( + _('Login method'), + _('Which login method should be used for connecting to FusionDirectory'), + 'fdLoginMethod', TRUE + ), + new StringAttribute( + _('Header name'), _('Name of the header containing user identifier.'), + 'fdHttpHeaderAuthHeaderName', FALSE, + 'AUTH_USER' + ), + ] + ], + 'ssl' => [ + 'name' => _('SSL'), + 'attrs' => [ + new TrimmedStringAttribute( + _('Key path'), _('Path to FusionDirectory private key. Unused for now.'), + 'fdSslKeyPath', FALSE, + '/etc/ssl/private/fd.key' + ), + new TrimmedStringAttribute( + _('Certificate path'), _('Path to FusionDirectory certificate. Unused for now.'), + 'fdSslCertPath', FALSE, + '/etc/ssl/certs/fd.cert' + ), + new TrimmedStringAttribute( + _('CA certificate path'), _('Path to the CA certificate. Used for validating Argonaut Server host.'), + 'fdSslCaCertPath', FALSE, + '/etc/ssl/certs/ca.cert' + ), + ] + ], + 'cas' => [ + 'name' => _('CAS'), + 'attrs' => [ + new TrimmedStringAttribute( + _('CA certificate path'), _('Path to the CA certificate of the CAS server'), + 'fdCasServerCaCertPath', FALSE, + '/etc/ssl/certs/ca.cert' + ), + new StringAttribute( + _('Host'), _('Host of the CAS server'), + 'fdCasHost', FALSE, + 'localhost' + ), + new IntAttribute( + _('Port'), _('Port the CAS server is listening on'), + 'fdCasPort', FALSE, + 0 /*min*/, FALSE /*no max*/, 443 + ), + new StringAttribute( + _('CAS context'), _('CAS context to be used'), + 'fdCasContext', FALSE, + '/cas' + ), + new BooleanAttribute( + _('Verbose error'), _('Activate verbose errors in phpCAS. Avoid in production.'), + 'fdCasVerbose', FALSE + ), + new BooleanAttribute( + _('Library CAS 1.6'), _('Activate if library CAS >= 1.6 is being used.'), + 'fdCasLibraryBool', FALSE + ), + new StringAttribute( + _('Client service'), _('The client service name'), + 'fdCasClientServiceName', FALSE + ), + ] + ], + 'people_and_group' => [ + 'name' => _('People and group storage'), + 'class' => ['critical'], + 'attrs' => [ + new SelectAttribute( + _('People DN attribute'), _('Attribute to use at the beginning of the user dn'), + 'fdAccountPrimaryAttribute', TRUE, + ['uid', 'cn'] + ), + new StringAttribute( + _('CN pattern'), _('The pattern to use to build the common name field'), + 'fdCnPattern', TRUE, + '%givenName% %sn%' + ), + new BooleanAttribute( + _('Mandatory first name'), + _('Whether first name (givenName) should be a mandatory field on users'), + 'fdGivenNameRequired', FALSE, + TRUE + ), + new BooleanAttribute( + _('Strict naming policy'), + _('Enables strict checking of user and group names'), + 'fdStrictNamingRules', FALSE, + TRUE + ), + new StringAttribute( + _('Users RDN'), _('The branch where users are stored.'), + 'fdUserRDN', TRUE, + 'ou=people' + ), + new StringAttribute( + _('ACL role RDN'), _('The branch where ACL roles are stored.'), + 'fdAclRoleRDN', TRUE, + 'ou=aclroles' + ), + new BooleanAttribute( + _('Restrict role members'), _('When enabled only users from the same branch or members of groups from the same branch can be added to a role.'), + 'fdRestrictRoleMembers' + ), + new BooleanAttribute( + _('Separate address fields'), _('Expose street, postOfficeBox and postalCode fields instead of postalAddress.'), + 'fdSplitPostalAddress' + ), + new PostalAddressAttribute( + _('Postal address pattern'), _('When using separate address fields, you can use a pattern to fill postalAddress field.'), + 'fdPostalAddressPattern' + ), + new IntAttribute( + _('Avatar max size'), _('Maximum user picture width and height in pixels. Bigger uploaded pictures will be resized.'), + 'fdMaxAvatarSize', FALSE, + 1, FALSE, 200 + ), + ] + ], + 'debug' => [ + 'name' => _('Debugging'), + 'attrs' => [ + new BooleanAttribute( + _('Display PHP errors'), + _('Shows PHP errors in the upper part of the screen. This should be disabled in production deployments, because it may contain passwords.'), + 'fdDisplayErrors' + ), + new IntAttribute( + _('Maximum LDAP query time'), _('Stop LDAP actions if there is no answer within the specified number of seconds.'), + 'fdLdapMaxQueryTime', FALSE, + 0 /*min*/, FALSE /*no max*/ + ), + new BooleanAttribute( + _('Log LDAP statistics'), + _('Track LDAP timing statistics to the syslog. This may help to find indexing problems or bad search filters.'), + 'fdLdapStats' + ), + new DebugLevelAttribute( + new SelectAttribute( + _('Debug level'), + _('Display certain information on each page load.'), + 'fdDebugLevel', FALSE, + [DEBUG_TRACE, DEBUG_LDAP, DEBUG_DB, DEBUG_SHELL, DEBUG_POST, + DEBUG_SESSION, DEBUG_ACL, DEBUG_SI, DEBUG_MAIL], + DEBUG_TRACE, + ['Trace', 'LDAP', 'Database', 'Shell', 'POST', + 'SESSION', 'ACL', 'SI', 'Mail'] + ) + ), + new BooleanAttribute( + _('Log debug messages'), + _('Sends debug output to syslog as well'), + 'fdDebugLogging' + ), + ] + ], + 'miscellaneous' => [ + 'name' => _('Miscellaneous'), + 'attrs' => [ + new BooleanAttribute( + _('Display summary in listings'), + _('Determines whether a status bar will be shown on the bottom of lists, displaying a short summary of type and number of elements in the list.'), + 'fdListSummary', FALSE, + TRUE + ), + new BooleanAttribute( + _('Show ACL tab on all objects'), + _('For very specific ACL rights setting where you might need to give right on a single object.'), + 'fdAclTabOnObjects' + ), + new SetAttribute( + new StringAttribute( + _('Available department categories'), _('Available categories in the departments dropdown'), + 'fdDepartmentCategories', FALSE + ), + [] + ), + new OrderedArrayAttribute( + new PipeSeparatedCompositeAttribute( + _('Use this to hide some menu entry to specific groups of users'), + 'fdPluginsMenuBlacklist', + [ + new SelectAttribute( + '', _('Group or role'), + 'blacklistGroup', TRUE, + [] + ), + new SelectAttribute( + '', _('Plugin to blacklist'), + 'blacklistPlugin', TRUE, + [] + ), + ], + '', + _('Plugin menu blacklist') + ), + // no order + FALSE, + [] + ), + // Needed here for ACLs + new HiddenAttribute('fdManagementConfig'), + new IntAttribute( + _('ACL target filter limit'), _('Defines the maximum number of entries an ACL target filter is allowed to return'), + 'fdAclTargetFilterLimit', FALSE, + 0 /*min*/, FALSE /*no max*/, 100 + ), + ] + ], + ]; + } + + function __construct ($dn = NULL, $object = NULL, $parent = NULL, $mainTab = FALSE, $attributesInfo = NULL) + { + global $config; + $attributesInfo = static::getAttributesInfo(); + /* Languages */ + $languages = Language::getList(TRUE); + asort($languages); + $languages = array_merge(["" => _("Automatic")], $languages); + $attributesInfo['look_n_feel']['attrs'][0]->setChoices(array_keys($languages), array_values($languages)); + /* Timezones */ + $attributesInfo['look_n_feel']['attrs'][2]->setChoices(timezone::_get_tz_zones()); + /* Password methods */ + $methods = passwordMethod::get_available_methods(); + $methods = $methods['name']; + if (!in_array('sasl', $methods)) { + $methods[] = 'sasl'; + } + $attributesInfo['password']['attrs'][0]->attribute->setChoices($methods); + $attributesInfo['password']['attrs'][0]->setDefaultValue($methods); + $attributesInfo['password']['attrs'][0]->resetToDefault(); + $attributesInfo['password']['attrs'][1]->setChoices($methods); + /* Login methods */ + $methods = LoginMethod::getMethods(); + $attributesInfo['login']['attrs'][4]->setChoices(array_keys($methods), array_values($methods)); + + $groupsAndRoles = array_merge( + array_map( + function ($group) + { + return sprintf(_('Group %s'), $group); + }, + objects::ls('ogroup') + ), + array_map( + function ($role) + { + return sprintf(_('Role %s'), $role); + }, + objects::ls('role') + ) + ); + $attributesInfo['miscellaneous']['attrs'][3]->attribute->attributes[0]->setChoices( + array_keys($groupsAndRoles), + array_values($groupsAndRoles) + ); + $menuPlugins = []; + $plist = session::get('plist'); + foreach ($config->data['SECTIONS'] as $section => $section_infos) { + foreach ($config->data['MENU'][$section] as $info) { + if (isset($info['CLASS'])) { + list ($plHeadline, , , ) = $plist->get_infos($info['CLASS']); + $menuPlugins[$info['CLASS']] = $plHeadline; + } + } + } + asort($menuPlugins); + $attributesInfo['miscellaneous']['attrs'][3]->attribute->attributes[1]->setChoices( + array_keys($menuPlugins), + array_values($menuPlugins) + ); + + try { + parent::__construct($dn, $object, $parent, $mainTab, $attributesInfo); + } catch (NonExistingLdapNodeException $e) { + parent::__construct('new', $object, $parent, $mainTab, $attributesInfo); + $this->dn = $dn; + } + + $this->fusionConfigMd5 = md5_file(CACHE_DIR."/".CLASS_CACHE); + + $this->attributesAccess['fdForceSSL']->setManagedAttributes( + [ + 'disable' => [ + TRUE => [ + 'fdWarnSSL', + ] + ] + ] + ); + $this->attributesAccess['fdSplitPostalAddress']->setManagedAttributes( + [ + 'disable' => [ + FALSE => [ + 'fdPostalAddressPattern', + ] + ] + ] + ); + + // CAS boolean case to allow the use of CAS library >= 1.6 + $this->attributesAccess['fdCasLibraryBool']->setManagedAttributes( + [ + 'disable' => [ + FALSE => [ + 'fdCasClientServiceName', + ] + ] + ] + ); + + $this->attributesAccess['fdLoginMethod']->setManagedAttributes( + [ + 'multiplevalues' => [ + 'noncas' => [ + 'LoginPost', + 'LoginHTTPAuth', + 'LoginHTTPHeader', + ], + 'nonheader' => [ + 'LoginPost', + 'LoginCAS', + 'LoginHTTPAuth' + ], + ], + 'disable' => [ + 'noncas' => [ + 'fdCasServerCaCertPath', + 'fdCasHost', + 'fdCasPort', + 'fdCasContext', + 'fdCasVerbose', + 'fdCasClientServiceName', + 'fdCasLibraryBool' + ], + 'nonheader' => [ + 'fdHttpHeaderAuthHeaderName', + ] + ] + ] + ); + if (empty($this->attrs['fdLoginMethod'][0])) { + // Reading OBSOLETEÂ attributes from FD<1.4 to ease migration + if (isset($this->attrs['fdHttpAuthActivated'][0]) && ($this->attrs['fdHttpAuthActivated'][0] == 'TRUE')) { + $this->fdLoginMethod = 'LoginHTTPAuth'; + } elseif (isset($this->attrs['fdCasActivated'][0]) && ($this->attrs['fdCasActivated'][0] == 'TRUE')) { + $this->fdLoginMethod = 'LoginCAS'; + } elseif (isset($this->attrs['fdHttpHeaderAuthActivated'][0]) && ($this->attrs['fdHttpHeaderAuthActivated'][0] == 'TRUE')) { + $this->fdLoginMethod = 'LoginHTTPHeader'; + } + } + + $this->attributesAccess['fdPasswordDefaultHash']->setChoices( + $this->attributesAccess['fdPasswordAllowedHashes']->getValue() + ); + } + + function compute_dn (): string + { + return $this->dn; + } + + function check (): array + { + $messages = parent::check(); + if (($this->fdPasswordDefaultHash == 'sasl') && ($this->fdSaslRealm == '') && ($this->fdSaslExop == '')) { + $messages[] = new SimplePluginCheckError( + $this, + htmlescape(_('You need to fill saslRealm or saslExop in the configuration screen in order to use SASL')) + ); + } + if ($this->attributesAccess['fdLanguage']->hasChanged() && ($this->fdLanguage != '') && !Language::isAvailable($this->fdLanguage)) { + $messages[] = new SimplePluginCheckError( + $this->attributesAccess['fdLanguage'], + htmlescape(sprintf(_('It seems the selected language "%s" is not installed on the system. Please install it or select an other one.'), $this->fdLanguage)) + ); + } + + if (($this->fdLdapSizeLimit !== '') && ($this->fdLdapSizeLimit > 0)) { + $error = ldapSizeLimit::checkMaxInputVars($this->fdLdapSizeLimit); + if ($error !== FALSE) { + $messages[] = new SimplePluginCheckError( + $this->attributesAccess['fdLdapSizeLimit'], + $error->getHtmlMessage(), + $error->getCode(), + $error + ); + } + } + + return $messages; + } + + public function update (): bool + { + $res = parent::update(); + + $this->attributesAccess['fdPasswordDefaultHash']->setChoices( + $this->attributesAccess['fdPasswordAllowedHashes']->getValue() + ); + + return $res; + } + + static function get_themes () + { + $themesdir = '../ihtml/themes/'; + $themes = array_keys(session::get(IconTheme::$session_var)); + if ($dir = opendir("$themesdir")) { + while (($file = readdir($dir)) !== FALSE) { + if (is_dir("$themesdir/$file") && !preg_match("/^\./", $file)) { + $themes[] = $file; + } + } + } + return array_unique($themes); + } + + static function mainInc ($classname = NULL, $entry_dn = NULL, $tabs = TRUE, $edit_mode = TRUE, $objectType = FALSE) + { + global $config; + + if ($classname === NULL) { + $classname = get_called_class(); + } + + if ($entry_dn === NULL) { + $entry_dn = CONFIGRDN.$config->current['BASE']; + } + + parent::mainInc($classname, $entry_dn, $tabs, $edit_mode, $objectType); + } +} diff --git a/plugins/configuration/backend/class_configInLdapTabs.inc b/plugins/configuration/backend/class_configInLdapTabs.inc new file mode 100644 index 0000000000000000000000000000000000000000..243e0dcaacdf1a399bffc173fca5c7dfd5cfee97 --- /dev/null +++ b/plugins/configuration/backend/class_configInLdapTabs.inc @@ -0,0 +1,37 @@ +<?php +/* + This code is part of FusionDirectory (http://www.fusiondirectory.org/) + + Copyright (C) 2012-2019 FusionDirectory + + 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +class configInLdapTabs extends simpleTabs +{ + function save () + { + global $config; + $errors = parent::save(); + /* check_and_reload */ + $config->check_and_reload(TRUE); + /* reload plist as well as some plInfo might use $config or get_ou */ + session::un_set('plist'); + pluglist::load(); + session::un_set('passwordMethod::get_available_methods'); + + return $errors; + } +} diff --git a/plugins/configuration/backend/class_hooksConfig.inc b/plugins/configuration/backend/class_hooksConfig.inc new file mode 100644 index 0000000000000000000000000000000000000000..759543f7894e6845605a10f1a9070cd503da1d77 --- /dev/null +++ b/plugins/configuration/backend/class_hooksConfig.inc @@ -0,0 +1,113 @@ +<?php +/* + This code is part of FusionDirectory (http://www.fusiondirectory.org/) + + Copyright (C) 2012-2019 FusionDirectory + + 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +class hooksConfig extends simplePlugin +{ + static function plInfo (): array + { + return [ + 'plShortName' => _('Triggers'), + 'plTitle' => _('Triggers configuration'), + 'plPriority' => 1, + 'plObjectType' => ['configuration'], + + 'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo()) + ]; + } + + static function getAttributesInfo (): array + { + global $config; + + $plugins = []; + if (session::is_set('plist')) { + $plugins = array_keys(session::get('plist')->info); + } + sort($plugins); + + return [ + 'triggers' => [ + 'name' => _('Triggers'), + 'class' => ['fullwidth'], + 'attrs' => [ + new BooleanAttribute( + _('Display trigger output'), + _('When enabled successful trigger execution output is displayed to the user using a dialog.'), + 'fdDisplayHookOutput' + ), + new OrderedArrayAttribute( + new CompositeAttribute( + _('Triggers that are called when specific actions happens'), + 'fdTabHook', + [ + new SelectAttribute( + _('Tab'), _('The tab that this trigger concerns'), + 'triggerTab', TRUE, + $plugins + ), + new SelectAttribute( + _('Mode'), _('When to call this command'), + 'triggerMode', TRUE, + ['postcreate', 'postremove', 'postmodify', + 'precreate', 'preremove', 'premodify', 'check', + 'prelock', 'postlock', 'preunlock', 'postunlock'] + ), + new BooleanAttribute( + _('Deactivated'), _('Use this to temporarily deactivate a trigger'), + 'triggerDecativate', TRUE, + FALSE, '', + '#', '' + ), + new TextAreaAttribute( + _('Command'), _('The command that will be called'), + 'triggerCmd', TRUE + ) + ], + '/^([^\\|]+)\\|([^\\|]+)\\|(#?)(.*)$/', + '%s|%s|%s%s', + '', // acl + _('Triggers') + ), + FALSE, // non-ordered + [], + TRUE // edition + ), + ] + ], + ]; + } + + function __construct ($dn = NULL, $object = NULL, $parent = NULL, $mainTab = FALSE) + { + global $config; + + parent::__construct($dn, $object, $parent, $mainTab); + + $this->attributesAccess['fdTabHook']->setLinearRendering(FALSE); + $this->attributesAccess['fdTabHook']->setHeaders([ + _('Tab'), + _('Mode'), + _('Deactivated'), + _('Command'), + '', + ]); + } +} diff --git a/plugins/configuration/backend/class_mailTemplateConfig.inc b/plugins/configuration/backend/class_mailTemplateConfig.inc new file mode 100644 index 0000000000000000000000000000000000000000..f8e8f4cd014bbfffd137d3c0b9356ae9b8fe84cb --- /dev/null +++ b/plugins/configuration/backend/class_mailTemplateConfig.inc @@ -0,0 +1,52 @@ +<?php +/* + This code is part of FusionDirectory (http://www.fusiondirectory.org/) + Copyright (C) 2012-2022 FusionDirectory + + 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +class mailTemplateConfig extends multiPluginSection +{ + static function plInfo (): array + { + return [ + 'plShortName' => _('mail template configuration'), + 'plDescription' => _('FusionDirectory mail template plugin configuration'), + 'plObjectClass' => ['fdMailTemplateConf'], + 'plCategory' => ['configuration'], + 'plObjectType' => ['smallConfig'], + + 'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo()) + ]; + } + + static function getAttributesInfo (): array + { + return [ + 'mailTemplateConf' => [ + 'name' => _('Mail Template'), + 'attrs' => [ + new StringAttribute( + _('Mail Template RDN'), _('Branch in which mails templates will be stored'), + 'fdMailTemplateRDN', TRUE, + 'ou=mailTemplate' + ), + ] + ], + ]; + } +} + diff --git a/plugins/configuration/backend/class_mainPluginsConfig.inc b/plugins/configuration/backend/class_mainPluginsConfig.inc new file mode 100644 index 0000000000000000000000000000000000000000..47169515c6c1565cc087c260e16dfdb36a3af212 --- /dev/null +++ b/plugins/configuration/backend/class_mainPluginsConfig.inc @@ -0,0 +1,62 @@ +<?php +/* + This code is part of FusionDirectory (http://www.fusiondirectory.org/) + Copyright (C) 2012-2017 FusionDirectory + + 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +class mainPluginsConfig extends multiPluginSection +{ + static function plInfo (): array + { + return [ + 'plShortName' => _('Plugins configuration'), + 'plDescription' => _('FusionDirectory plugins configuration'), + 'plCategory' => ['configuration'], + 'plObjectClass' => ['fusionDirectoryPluginsConf'], + 'plObjectType' => ['smallConfig'], + 'plPriority' => 1, + + 'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo()) + ]; + } + + static function getAttributesInfo (): array + { + return [ + 'ogroups' => [ + 'name' => _('Object groups'), + 'attrs' => [ + new StringAttribute( + _('Groups RDN'), _('Branch in which object groups will be stored'), + 'fdOGroupRDN', TRUE, + 'ou=groups' + ), + ] + ], + 'sasl' => [ + 'name' => _('SASL'), + 'attrs' => [ + new BooleanAttribute( + _('Force asking for a password'), _('Useful if you add a trigger using password value when SASL user passwords are edited'), + 'fdForceSaslPasswordAsk', TRUE, + FALSE + ), + ] + ], + ]; + } +} diff --git a/plugins/configuration/backend/class_pluginsConfigInLdap.inc b/plugins/configuration/backend/class_pluginsConfigInLdap.inc new file mode 100644 index 0000000000000000000000000000000000000000..1fb9ea1f9b9f51225a53365ed8f52ffaaee32b40 --- /dev/null +++ b/plugins/configuration/backend/class_pluginsConfigInLdap.inc @@ -0,0 +1,40 @@ +<?php +/* + This code is part of FusionDirectory (http://www.fusiondirectory.org/) + Copyright (C) 2012-2018 FusionDirectory + + 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +class pluginsConfigInLdap extends multiPlugin +{ + protected static $tabClass = 'SMALLCONFIGTABS'; + + static function plInfo (): array + { + return [ + 'plShortName' => _('Plugins'), + 'plDescription' => _('Configuration for plugins'), + 'plPriority' => 2, + 'plObjectType' => ['configuration'], + 'plSubTabs' => 'SMALLCONFIGTABS', + + /* This is incomplete because of dynamic loading, but is enough to generate a filter for this tab */ + 'plObjectClass' => ['fusionDirectoryPluginsConf'], + + 'plProvidedAcls' => [] + ]; + } +} diff --git a/plugins/configuration/backend/class_recoveryConfig.inc b/plugins/configuration/backend/class_recoveryConfig.inc new file mode 100644 index 0000000000000000000000000000000000000000..aa0303f25a8f273dcb0d610cd969265fc15b431b --- /dev/null +++ b/plugins/configuration/backend/class_recoveryConfig.inc @@ -0,0 +1,157 @@ +<?php +/* + This code is part of FusionDirectory (http://www.fusiondirectory.org/) + Copyright (C) 2011-2016 FusionDirectory + + 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +class recoveryConfig extends simplePlugin +{ + static function plInfo (): array + { + return [ + 'plShortName' => _('Recovery'), + 'plTitle' => _('Password recovery'), + 'plDescription' => _('Settings for the password recovery feature'), + 'plObjectClass' => ['fdPasswordRecoveryConf'], + 'plPriority' => 14, + 'plObjectType' => ['configuration'], + + 'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo()) + ]; + } + + static function getAttributesInfo (): array + { + return [ + 'settings' => [ + 'name' => _('Password recovery settings'), + 'class' => ['alone'], + 'template' => get_template_path('simpleplugin_section_alone.tpl'), + 'attrs' => [ + new BooleanAttribute( + _('Activate password recovery'), + _('Whether to activate the password recovery feature or not'), + 'fdPasswordRecoveryActivated', + FALSE + ), + new MailAttribute( + _('Sender email address'), + _('Email address from which mails will be sent'), + 'fdPasswordRecoveryEmail', + TRUE, + 'to.be@chang.ed' + ), + new IntAttribute( + _('Link validity (minutes)'), + _('Number of minutes before a recovery link expires'), + 'fdPasswordRecoveryValidity', + TRUE, + 0, FALSE, 10 + ), + new StringAttribute( + _('Salt for tokens'), + _('Just a security measure, you can put anything in there, even random characters'), + 'fdPasswordRecoverySalt', + TRUE, + "SomethingSecretAndVeryLong" + ), + new BooleanAttribute( + _('Allow the use of alternate addresses'), + _('Users will also be able to enter one of their alternate addresses to recover their password'), + 'fdPasswordRecoveryUseAlternate', + FALSE + ), + new StringAttribute( + _('Login attribute'), _('Usually uid, but you can use something else for instance in case of SSO'), + 'fdPasswordRecoveryLoginAttribute', TRUE, + 'uid' + ), + ] + ], + 'first_email' => [ + 'name' => _('First email'), + 'attrs' => [ + new StringAttribute( + _('Subject'), + _('Subject of the first email'), + 'fdPasswordRecoveryMailSubject', + TRUE, + _("[FusionDirectory] Password recovery link") + ), + new TextAreaAttribute( + _('Body (first %s is login, second is link)'), + _('Body of the first email, sent when the user ask for a new password. Use %s for the login and the recovery link.'), + 'fdPasswordRecoveryMailBody', + TRUE, + _("Hello,\n\nHere is your information: \n - Login : %s\n - Link : %s\n\nThis link is only valid for 10 minutes.") + ) + ] + ], + 'second_email' => [ + 'name' => _('Second email'), + 'attrs' => [ + new StringAttribute( + _('Subject'), + _('Subject of the second email'), + 'fdPasswordRecoveryMail2Subject', + TRUE, + _("[FusionDirectory] Password recovery successful") + ), + new TextAreaAttribute( + _('Body (%s is login)'), + _('Body of the second email, sent to confirm the password has been changed. Use %s for the user login.'), + 'fdPasswordRecoveryMail2Body', + TRUE, + _("Hello,\n\nYour password has been changed.\nYour login is still %s.") + ) + ] + ] + ]; + } + + function __construct ($dn = NULL, $object = NULL, $parent = NULL, $mainTab = FALSE) + { + global $config; + // Check if token branch is here + $ldap = $config->get_ldap_link(); + $tokenBranch = get_ou('recoveryTokenRDN').get_ou('fusiondirectoryRDN').$config->current['BASE']; + $ldap->cat($tokenBranch, ['dn']); + if (!$ldap->count()) { + $ldap->cd($config->current['BASE']); + try { + $ldap->create_missing_trees($tokenBranch); + } catch (FusionDirectoryError $error) { + $error->display(); + } + fusiondirectory_log('Created token branch '.$tokenBranch); + } + + parent::__construct($dn, $object, $parent, $mainTab); + + $this->attributesAccess['fdPasswordRecoveryActivated']->setManagedAttributes( + [ + 'disable' => [ + FALSE => [ + 'fdPasswordRecoveryEmail','fdPasswordRecoveryValidity','fdPasswordRecoverySalt', + 'fdPasswordRecoveryMailSubject','fdPasswordRecoveryMailBody', + 'fdPasswordRecoveryMail2Subject','fdPasswordRecoveryMail2Body' + ] + ] + ] + ); + } +} diff --git a/plugins/configuration/backend/class_snapshotConfig.inc b/plugins/configuration/backend/class_snapshotConfig.inc new file mode 100644 index 0000000000000000000000000000000000000000..8c260e08228c0982cba47d0f110a921d1a31bf7d --- /dev/null +++ b/plugins/configuration/backend/class_snapshotConfig.inc @@ -0,0 +1,106 @@ +<?php +/* +This code is part of FusionDirectory (http://www.fusiondirectory.org/) +Copyright (C) 2012-2023 FusionDirectory + +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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +class snapshotsConfig extends simplePlugin +{ + static function plInfo (): array + { + return [ + 'plShortName' => _('Snapshots'), + 'plDescription' => _('FusionDirectory Snapshot Configuration'), + 'plObjectClass' => ['fusionDirectoryConf'], + 'plObjectType' => ['configuration'], + 'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo()) + ]; + } + + static function getAttributesInfo (): array + { + global $config; + + return [ + 'snapshotsConf' => [ + 'name' => _('Snapshots Configuration'), + 'attrs' => [ + new BooleanAttribute( + _('Enable snapshots'), _('This enables you to save certain states of entries and restore them later on.'), + 'fdEnableSnapshots', FALSE, + TRUE + ), + new BooleanAttribute( + _('Enable automatic snapshots'), _('This enables you to automatically create a snapshot upon saving if any modifications have been found.'), + 'fdEnableAutomaticSnapshots', FALSE, + FALSE + ), + new StringAttribute( + _('Snapshot base'), _('The base where snapshots should be stored inside the LDAP directory.'), + 'fdSnapshotBase', FALSE, + 'ou=snapshots,'.$config->current['BASE'] + ), + ] + ], + 'snapshotsAdvanceConf' => [ + 'name' => _('Snapshots Advance Configuration'), + 'attrs' => [ + new IntAttribute( + _('Minimum number of snapshots to be kept'), _('Set the minimum number of snapshots to be kept'), + 'fdSnapshotMinRetention', FALSE, '', FALSE, '' + ), + new IntAttribute( + _('Retention time in days'), _('Set the retention time in days for a snapshots to be kept'), + 'fdSnapshotRetentionDays', FALSE, '', FALSE, '' + ), + ] + ], + 'OriginDataSource' => [ + 'name' => _('List of available sources / origin of data'), + 'attrs' => [ + new SetAttribute( + new StringAttribute( + _('Origin / source of data'), _('Origin / Source of data'), + 'fdSnapshotSourceData', FALSE, + ) + ), + ] + ], + ]; + } + + function __construct ($dn = NULL, $object = NULL, $parent = NULL, $mainTab = FALSE) + { + global $config; + parent::__construct($dn, $object, $parent, $mainTab); + + $this->attributesAccess['fdEnableSnapshots']->setManagedAttributes( + [ + 'disable' => [ + FALSE => [ + 'fdSnapshotBase', + 'fdEnableAutomaticSnapshots', + 'fdSnapshotMinRetention', + 'fdSnapshotRetentionDays', + ] + ] + ] + ); + } + +} + diff --git a/plugins/configuration/backend/class_tasksConfig.inc b/plugins/configuration/backend/class_tasksConfig.inc new file mode 100644 index 0000000000000000000000000000000000000000..7a35d5621be8cb7bee2feb1ba040e5aec424688b --- /dev/null +++ b/plugins/configuration/backend/class_tasksConfig.inc @@ -0,0 +1,78 @@ +<?php +/* + This code is part of FusionDirectory (http://www.fusiondirectory.org/) + Copyright (C) 2012-2022 FusionDirectory + + 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +class tasksConfig extends simplePlugin +{ + static function plInfo (): array + { + return [ + 'plShortName' => _('Tasks'), + 'plDescription' => _('FusionDirectory Tasks Configuration'), + 'plObjectClass' => ['fdTasksConf'], + 'plObjectType' => ['configuration'], + 'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo()) + ]; + } + + static function getAttributesInfo (): array + { + return [ + 'tasksConf' => [ + 'name' => _('Tasks Configuration'), + 'attrs' => [ + new StringAttribute( + _('Tasks RDN'), _('Branch in which Tasks will be stored'), + 'fdTasksRDN', TRUE, + 'ou=tasks' + ), + ] + ], + 'Mail' => [ + 'name' => _('Mail Anti-Spam Configuration'), + 'attrs' => [ + new IntAttribute( + _('Last Sent Mail'), '_(Last timestamp in Unix format when last email was sent succesfully)', + 'fdTasksConfLastExecTime', FALSE, '', FALSE, '' + ), + new IntAttribute( + _('Maximum number of e-mails processed per time'), _('Select max emails to be proccessed'), + 'fdTasksConfMaxEmails', FALSE, '', FALSE, '' + ), + new IntAttribute( + _('Time interval between e-mails processing (Minutes) '), _('Select min interval time between emails processing'), + 'fdTasksConfIntervalEmails', FALSE, '', FALSE, '' + ), + ] + ], + ]; + } + + function __construct ($dn = NULL, $object = NULL, $parent = NULL, $mainTab = FALSE) + { + global $config; + parent::__construct($dn, $object, $parent, $mainTab); + + // This attribute will be updated and verified by Orchestrator + $this->attributesAccess['fdTasksConfLastExecTime']->setVisible(FALSE); + + } + +} +