From d310a10ba03da0bf4749065a166524c110abaf84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20D?= Date: Sun, 28 Jun 2020 19:38:06 +0200 Subject: [PATCH] * [MOD] Merge v3.1 changes * [ADD] Use custom ldap attributes for users or groups * [ADD] Use custom ldap filter for users or groups lookup * [MOD] Improved internal config handling by using an array instead of class properties MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rubén D --- .../Controllers/ConfigGeneralController.php | 2 +- .../web/Controllers/ConfigLdapController.php | 48 +- .../Controllers/ConfigManagerController.php | 37 +- .../web/themes/material-blue/css/styles.css | 11 +- .../themes/material-blue/css/styles.css.map | 2 +- .../themes/material-blue/css/styles.min.css | 2 +- .../web/themes/material-blue/css/styles.scss | 13 + .../material-blue/views/config/ldap.inc | 185 +++- lib/SP/Config/Config.php | 39 +- lib/SP/Config/ConfigData.php | 870 ++++++------------ lib/SP/Providers/Auth/AuthProvider.php | 21 +- lib/SP/Providers/Auth/Ldap/Ldap.php | 3 - lib/SP/Providers/Auth/Ldap/LdapInterface.php | 13 +- lib/SP/Providers/Auth/Ldap/LdapMsAds.php | 97 +- lib/SP/Providers/Auth/Ldap/LdapMsAzureAd.php | 193 ---- lib/SP/Providers/Auth/Ldap/LdapParams.php | 84 ++ lib/SP/Providers/Auth/Ldap/LdapStd.php | 116 ++- .../Services/Config/ConfigBackupService.php | 11 +- lib/SP/Services/Install/Installer.php | 11 +- lib/SP/Services/Install/MySQL.php | 17 +- lib/SP/Services/Ldap/LdapCheckService.php | 46 +- lib/SP/Services/Ldap/LdapImportService.php | 2 +- .../Services/Upgrade/UpgradeConfigService.php | 2 +- lib/SP/Storage/File/XmlHandler.php | 35 +- public/js/app-util.min.js | 8 +- tests/res/config/config.xml | 114 +-- 26 files changed, 911 insertions(+), 1071 deletions(-) delete mode 100644 lib/SP/Providers/Auth/Ldap/LdapMsAzureAd.php diff --git a/app/modules/web/Controllers/ConfigGeneralController.php b/app/modules/web/Controllers/ConfigGeneralController.php index 9fd68834..5761702b 100644 --- a/app/modules/web/Controllers/ConfigGeneralController.php +++ b/app/modules/web/Controllers/ConfigGeneralController.php @@ -76,7 +76,7 @@ final class ConfigGeneralController extends SimpleControllerBase $configData->setDebug($debugEnabled); $configData->setMaintenance($maintenanceEnabled); $configData->setCheckUpdates($checkUpdatesEnabled); - $configData->setChecknotices($checkNoticesEnabled); + $configData->setCheckNotices($checkNoticesEnabled); $configData->setEncryptSession($encryptSessionEnabled); // Events diff --git a/app/modules/web/Controllers/ConfigLdapController.php b/app/modules/web/Controllers/ConfigLdapController.php index 00a2b9ff..f8576182 100644 --- a/app/modules/web/Controllers/ConfigLdapController.php +++ b/app/modules/web/Controllers/ConfigLdapController.php @@ -84,6 +84,10 @@ final class ConfigLdapController extends SimpleControllerBase $configData->setLdapDefaultGroup($ldapDefaultGroup); $configData->setLdapDefaultProfile($ldapDefaultProfile); $configData->setLdapBindUser($ldapParams->getBindDn()); + $configData->setLdapFilterUserObject($ldapParams->getFilterUserObject()); + $configData->setLdapFilterGroupObject($ldapParams->getFilterGroupObject()); + $configData->setLdapFilterUserAttributes($ldapParams->getFilterUserAttributes()); + $configData->setLdapFilterGroupAttributes($ldapParams->getFilterGroupAttributes()); if ($ldapParams->getBindPass() !== '***') { $configData->setLdapBindPass($ldapParams->getBindPass()); @@ -124,15 +128,21 @@ final class ConfigLdapController extends SimpleControllerBase throw new ValidationException(__u('Wrong LDAP parameters')); } - return (new LdapParams()) - ->setServer($data['server']) - ->setPort(isset($data['port']) ? $data['port'] : 389) - ->setSearchBase($this->request->analyzeString('ldap_base')) - ->setGroup($this->request->analyzeString('ldap_group')) - ->setBindDn($this->request->analyzeString('ldap_binduser')) - ->setBindPass($this->request->analyzeEncrypted('ldap_bindpass')) - ->setType($this->request->analyzeInt('ldap_server_type', LdapTypeInterface::LDAP_STD)) - ->setTlsEnabled($this->request->analyzeBool('ldap_tls_enabled', false)); + $params = new LdapParams(); + $params->setServer($data['server']); + $params->setPort(isset($data['port']) ? $data['port'] : 389); + $params->setSearchBase($this->request->analyzeString('ldap_base')); + $params->setGroup($this->request->analyzeString('ldap_group')); + $params->setBindDn($this->request->analyzeString('ldap_binduser')); + $params->setBindPass($this->request->analyzeEncrypted('ldap_bindpass')); + $params->setType($this->request->analyzeInt('ldap_server_type', LdapTypeInterface::LDAP_STD)); + $params->setTlsEnabled($this->request->analyzeBool('ldap_tls_enabled', false)); + $params->setFilterUserObject($this->request->analyzeString('ldap_filter_user_object', null)); + $params->setFilterGroupObject($this->request->analyzeString('ldap_filter_group_object', null)); + $params->setFilterUserAttributes($this->request->analyzeArray('ldap_filter_user_attributes')); + $params->setFilterGroupAttributes($this->request->analyzeArray('ldap_filter_group_attributes')); + + return $params; } /** @@ -144,8 +154,14 @@ final class ConfigLdapController extends SimpleControllerBase $ldapParams = $this->getLdapParamsFromRequest(); // Valores para la configuración de LDAP - if (!($ldapParams->getServer() || $ldapParams->getSearchBase() || $ldapParams->getBindDn())) { - return $this->returnJsonResponse(JsonResponse::JSON_ERROR, __u('Missing LDAP parameters')); + if (!($ldapParams->getServer() + || $ldapParams->getSearchBase() + || $ldapParams->getBindDn()) + ) { + return $this->returnJsonResponse( + JsonResponse::JSON_ERROR, + __u('Missing LDAP parameters') + ); } $ldapCheckService = $this->dic->get(LdapCheckService::class); @@ -181,8 +197,14 @@ final class ConfigLdapController extends SimpleControllerBase $ldapParams = $this->getLdapParamsFromRequest(); // Valores para la configuración de LDAP - if (!($ldapParams->getServer() || $ldapParams->getSearchBase() || $ldapParams->getBindDn())) { - return $this->returnJsonResponse(JsonResponse::JSON_ERROR, __u('Missing LDAP parameters')); + if (!($ldapParams->getServer() + || $ldapParams->getSearchBase() + || $ldapParams->getBindDn()) + ) { + return $this->returnJsonResponse( + JsonResponse::JSON_ERROR, + __u('Missing LDAP parameters') + ); } $ldapCheckService = $this->dic->get(LdapCheckService::class); diff --git a/app/modules/web/Controllers/ConfigManagerController.php b/app/modules/web/Controllers/ConfigManagerController.php index 94aa8f53..5cf40182 100644 --- a/app/modules/web/Controllers/ConfigManagerController.php +++ b/app/modules/web/Controllers/ConfigManagerController.php @@ -43,6 +43,8 @@ use SP\Modules\Web\Controllers\Helpers\TabsHelper; use SP\Mvc\View\Components\DataTab; use SP\Mvc\View\Components\SelectItemAdapter; use SP\Plugin\PluginManager; +use SP\Providers\Auth\Ldap\LdapMsAds; +use SP\Providers\Auth\Ldap\LdapStd; use SP\Providers\Auth\Ldap\LdapTypeInterface; use SP\Providers\Log\LogInterface; use SP\Providers\Mail\MailHandler; @@ -231,9 +233,14 @@ final class ConfigManagerController extends ControllerBase $template->setBase('config'); $template->addTemplate('ldap'); - $template->assign('ldapIsAvailable', $this->extensionChecker->checkIsAvailable('ldap')); - $template->assign('userGroups', SelectItemAdapter::factory(UserGroupService::getItemsBasic())->getItemsFromModel()); - $template->assign('userProfiles', SelectItemAdapter::factory(UserProfileService::getItemsBasic())->getItemsFromModel()); + $template->assign('ldapIsAvailable', + $this->extensionChecker->checkIsAvailable('ldap')); + $template->assign('userGroups', + SelectItemAdapter::factory(UserGroupService::getItemsBasic()) + ->getItemsFromModel()); + $template->assign('userProfiles', + SelectItemAdapter::factory(UserProfileService::getItemsBasic()) + ->getItemsFromModel()); $serverTypes = [ LdapTypeInterface::LDAP_STD => 'Standard', @@ -241,7 +248,29 @@ final class ConfigManagerController extends ControllerBase LdapTypeInterface::LDAP_AZURE => 'Azure Active Directory', ]; - $template->assign('serverTypes', SelectItemAdapter::factory($serverTypes)->getItemsFromArraySelected([$this->configData->getLdapType()])); + $template->assign('serverTypes', + SelectItemAdapter::factory($serverTypes) + ->getItemsFromArraySelected([$this->configData->getLdapType()])); + + $userAttributes = array_merge( + LdapStd::DEFAULT_FILTER_USER_ATTRIBUTES, + LdapMsAds::DEFAULT_FILTER_USER_ATTRIBUTES, + $this->configData->getLdapFilterUserAttributes() + ); + + $template->assign('userAttributes', + SelectItemAdapter::factory($userAttributes) + ->getItemsFromArraySelected($this->configData->getLdapFilterUserAttributes())); + + $groupAttributes = array_merge( + LdapStd::DEFAULT_FILTER_GROUP_ATTRIBUTES, + LdapMsAds::DEFAULT_FILTER_GROUP_ATTRIBUTES, + $this->configData->getLdapFilterGroupAttributes() + ); + + $template->assign('groupAttributes', + SelectItemAdapter::factory($groupAttributes) + ->getItemsFromArraySelected($this->configData->getLdapFilterGroupAttributes())); return new DataTab(__('LDAP'), $template); } diff --git a/app/modules/web/themes/material-blue/css/styles.css b/app/modules/web/themes/material-blue/css/styles.css index dcb3316c..e2ad1de4 100644 --- a/app/modules/web/themes/material-blue/css/styles.css +++ b/app/modules/web/themes/material-blue/css/styles.css @@ -281,6 +281,14 @@ body.userpassreset { min-height: 0; margin: 5em auto; } +#content tr.header td, #box-popup tr.header td { + width: 100%; + padding: 7px; + background-color: #eceff1; + color: #607d8b; + font-size: 17px; + letter-spacing: .2em; + font-weight: bold; } #content td.descField, #box-popup td.descField { text-align: right; padding-right: 20px; @@ -1051,7 +1059,8 @@ fieldset.warning { width: 100%; /*margin: auto auto 50px;*/ line-height: 2em; - margin-bottom: 5em; } + margin-bottom: 5em; + padding-bottom: 5em; } #actions #logo { display: flex; width: 100%; diff --git a/app/modules/web/themes/material-blue/css/styles.css.map b/app/modules/web/themes/material-blue/css/styles.css.map index ce91de07..81766a5e 100644 --- a/app/modules/web/themes/material-blue/css/styles.css.map +++ b/app/modules/web/themes/material-blue/css/styles.css.map @@ -1,6 +1,6 @@ { "version": 3, -"mappings": "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", +"mappings": "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", "sources": ["_elements.scss","_base.scss","_noheader.scss","styles.scss","_login.scss"], "names": [], "file": "styles.css" diff --git a/app/modules/web/themes/material-blue/css/styles.min.css b/app/modules/web/themes/material-blue/css/styles.min.css index dc1cf4f2..d02e34f0 100644 --- a/app/modules/web/themes/material-blue/css/styles.min.css +++ b/app/modules/web/themes/material-blue/css/styles.min.css @@ -1 +1 @@ -html,body{margin:0;padding:0;text-align:left;background-color:#f5f5f5;color:#555;font-size:12px;font-weight:normal;box-sizing:border-box;max-width:100%}*{font-family:"Roboto Regular",Verdana,Tahoma,sans-serif;box-sizing:inherit}*:before,*:after{box-sizing:inherit}table{font-size:11px;border-spacing:0}table th{border-bottom:2px solid transparent;vertical-align:middle}table th .icon{width:24px;height:24px}table tr{height:20px}table tr.odd{background-color:#f9f9f9}table tr.even>td,table tr.odd>td{border-bottom:1px solid #d9d9d9 !important}table tr.even:hover,table tr.odd:hover{background-color:#e8ff99}table td{padding:3px}table td.txtCliente{font-weight:bold;text-align:center}form{font-size:11px;margin:0}input.inputImg,img.inputImg{background-color:transparent !important;width:24px !important;height:24px !important;border:0;vertical-align:middle;margin:0 .5em}input.txtFile{width:200px}input.txtLong{width:300px}textarea{width:350px}select.files{width:250px}input.spinner{width:5em}img{margin:0;padding:0;border:0;cursor:pointer}img.inputImgMini{background-color:transparent !important;width:16px !important;height:16px !important;margin:0 5px 0 5px;border:0;vertical-align:middle}i{cursor:pointer}form .form-field{display:flex;justify-content:space-between}form .form-field>label{min-width:12em;padding:.5em 0;font-size:16px;align-self:center}form .form-field>div{width:100%;align-self:center}a{text-decoration:none;color:#536dfe}a:visited{text-decoration:none;color:#536dfe}a:hover,a:active,a:focus{text-decoration:none;cursor:pointer}pre,code,samp,kbd{font-family:Consolas,"Andale Mono WT","Andale Mono","Bitstream Vera Sans Mono","Nimbus Mono L",Monaco,"Courier New",monospace;font-size:1em;direction:ltr;text-align:left;background-color:#fbfaf9;color:#333;box-shadow:inset 0 0 .3em #ccc;border-radius:2px}body.login,body.logout,body.userpassreset{background:#607d8b}body.login #wrap,body.logout #wrap,body.userpassreset #wrap{background:transparent}body.login #container,body.logout #container,body.userpassreset #container{padding-top:5%}body.login footer,body.logout footer,body.userpassreset footer{background:#78909c}body.login footer a,body.logout footer a,body.userpassreset footer a{color:#f2f2f2}#box-pub-noheader{background:transparent url("public/images/logo_full_nobg_outline.png") no-repeat top center;background-size:75% auto;width:40em;min-height:20em;margin:0 auto}#box-pub-noheader>div{width:100%;padding:1em;margin:0 auto}#box-pub-noheader .box-spacer{height:15em;background-color:transparent}#box-pub-noheader .box-header{width:100%;color:#f2f2f2;font-size:16px;font-weight:bold;text-align:center;margin:1em 0;letter-spacing:.1em;padding:.2em 0}#box-pub-noheader .box-form{-moz-box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2);box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2);background-color:#f2f2f2}#box-pub-noheader .box-form form fieldset#box-data{height:100%;min-height:14em;text-align:left;background-color:transparent;margin-bottom:2em}#box-pub-noheader .box-form form fieldset#box-data legend{width:100%;color:#607d8b;font-size:14px;font-weight:bold;text-align:center;margin:1em 0;letter-spacing:.1em;padding:.2em 0}#box-pub-noheader .box-form form fieldset#box-data .form-control>i{margin-right:.5em;opacity:.5}#box-pub-noheader .box-form form fieldset#box-data .extra-hidden{display:none}#box-pub-noheader .box-form div#box-buttons{margin-top:2em;text-align:center}@media screen and (max-width:600px){#box-pub-noheader{width:25em}#box-pub-noheader .box-spacer{height:10em}#box-pub-noheader form fieldset#box-data .mdl-textfield{width:100%}}#nojs{width:80%;text-align:center;vertical-align:middle;margin:10px auto;padding:3px;background-color:#ef5350;color:white;font-weight:bold;font-size:14px}#wrap{height:auto !important;min-height:100%;width:100%;background-color:#f5f5f5;padding-bottom:5em}#wrap-loading{position:fixed;z-index:9999;top:50%;left:50%;padding:1em;background-color:rgba(255,255,255,0.8);display:none;border-radius:5px !important;-moz-border-radius:5px !important;-webkit-border-radius:5px !important}#wrap-loading.overlay-full{top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,0.5)}#wrap-loading.overlay-full #loading{position:absolute;top:50%;left:50%}#wrap-loading.overlay-full #taskStatus{display:none}#wrap-loading #taskStatus{display:none;position:absolute;left:0;top:55%;width:100%;text-align:center;color:white;background-color:rgba(0,0,0,0.5);padding:1em 0}#container{margin:auto;width:100%}#container.error,#container.install{width:100%}#container .logo{height:64px}#container #actions-bar{z-index:100;display:flex;justify-content:space-between;position:fixed;border:0 none;top:0;left:0;width:100%;padding:1em 0;background-color:transparent}#container #actions-bar-icons{flex-grow:1;text-align:center}#container #actions-bar-logo{display:none;padding:0 .5em}#container #actions-bar-logo img{display:inline-block;width:50px;opacity:.75}#container #content{width:95%;margin:2em auto 8em auto}#container #content.public-link{width:70%;min-height:0;margin:5em auto}#content td.descField,#box-popup td.descField{text-align:right;padding-right:20px;width:25%;border-right:1px solid #d9d9d9;color:#999;font-size:12px;font-weight:bold}#content td.valField,#box-popup td.valField{padding-left:1em;width:100%}#content td.valField .lowres-title,#box-popup td.valField .lowres-title{display:none;width:100%;color:#607d8b;font-size:12px}#content td.valField .notification-description,#box-popup td.valField .notification-description{font-size:16px;max-width:100%}#content td.valField .notification-description .event-description,#content td.valField .notification-description .event-details,#box-popup td.valField .notification-description .event-description,#box-popup td.valField .notification-description .event-details{padding:.5em 0}#content td.valField .notification-description .event-description,#box-popup td.valField .notification-description .event-description{color:#5c6bc0;border-bottom:1px solid #e9e9e9}#content td.valField .notification-description .event-details .detail,#box-popup td.valField .notification-description .event-details .detail{display:flex;padding:.2em 0}#content td.valField .notification-description .event-details .detail .detail-left,#box-popup td.valField .notification-description .event-details .detail .detail-left{flex:none;width:8em;font-weight:bold}#content td.valField .notification-description .event-details .detail .detail-right,#box-popup td.valField .notification-description .event-details .detail .detail-right{flex-grow:1}#content .pager{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;justify-content:space-between;align-content:space-between;flex-wrap:wrap;width:100%;margin-top:15px;padding:.5em;font-size:11px;color:#999;background-color:#fcfcfc}#content .pager img{margin-left:5px;vertical-align:middle}#content .pager a{margin-left:5px;font-size:12px;color:#999}#content #title{width:100%;padding:7px;background-color:#d9d9d9;color:#fff;font-size:17px;letter-spacing:.2em}#content #title.titleNormal{background-color:#607d8b;color:#fff}#content .data-container{width:75%;margin:0 auto}#content fieldset.data{margin:2em auto}#content fieldset.data>legend{color:#607d8b;padding:0 .5em;font-size:1.5em}#content fieldset.data>div{display:none}#content fieldset.data>div table{width:100%}#content .data{width:100%;padding:10px;margin:0 auto;background-color:#fff;-webkit-box-shadow:2px 2px 3px -3px rgba(0,0,0,0.14);-moz-box-shadow:2px 2px 3px -3px rgba(0,0,0,0.14);box-shadow:1px 1px 2px rgba(0,0,0,0.14)}#content .data #history-icon{position:relative;top:5em;right:2em}#content .data td{text-align:left}#content .data td.descField{text-align:right}#content .data select{min-width:210px}#content .data .list-wrap{max-height:10em;overflow:auto;padding:.5em;margin:1em 0}#content .data .dropzone{width:100%;padding:1em;border:2px dashed #26a69a;text-align:center;opacity:.3}#content .data .dropzone:hover{opacity:1}#content .data .dropzone img{vertical-align:middle}#content .data .file-upload{display:none}#content .data .account-permissions{width:100%}#content .extra-info{margin-top:20px}#content #tabs fieldset{border:1px solid #c9c9c9}#content #tabs #frmConfig label{float:left}#content .tblConfig{margin-bottom:2em}#content .tblConfig td.descField{width:35%;font-size:11px;font-weight:bold}#content .tblConfig td.rowHeader{padding:5px 0 5px 0;background-color:#f5f5f5;text-align:center;font-weight:bold;border-top:15px solid #f9f9f9;border-bottom:3px solid #a9c1d7;letter-spacing:.5em;color:#696969}#content .tblConfig input.checkbox{width:15px;text-align:left;padding:0}#content .tblConfig .option-disabled{text-align:center;background-color:#fff8e1;color:#ffca28;font-weight:bold}#content h2{width:100%;height:1.5em;font-size:18px;color:white;background-color:#a9c1d7;margin:0;padding-top:.1em}#content .section{margin-top:2.5em;border-bottom:1px solid #d9d9d9;text-align:left;font-size:14px;font-weight:bold;color:#5c6bc0}#content .row_even>td{background-color:#f5f5f5}#content .row_odd>td{background-color:white}#content .data-header ul{list-style:none;width:100%;margin:0 0 10px 0;padding:0}#content .data-header li{display:inline-block;padding:.2em .5em;font-weight:bold;letter-spacing:.2em;color:#fff;text-align:center}#content .data-header li a{color:#777}#content .data-header li img{float:right;width:24px;height:24px;vertical-align:middle}#content .data-header-minimal{border-bottom:1px solid #dfdfdf}#content .data-header-minimal ul{display:flex;flex-flow:row;flex-wrap:wrap;align-content:flex-start;justify-content:space-around;margin:0}#content .data-header-minimal li{min-width:10em;font-weight:normal;letter-spacing:normal}#content .data-header-minimal li a{color:#b9b9b9;padding:.3em .8em}#content .data-header-minimal li.search-filter-spacer{flex:0 0 18em}#content .data-table{width:100%}#content .data-table td:first-of-type,#content .data-table th:first-of-type{width:5em}#content .data-table thead th{background-color:#607d8b;color:#fff}#content .data-table tbody td.cell-data{text-align:left}#content .data-table tbody td.cell-nodata{padding:0 .5em;text-align:left}#content .data-table tbody td.cell-actions{text-align:right}#content .data-table tbody td.cell-actions i{opacity:.5}#content .data-table tbody td.cell-actions i:hover{opacity:1}#content .data-rows ul{display:table;list-style:none;width:100%;margin:0 0 10px 0;padding:0;background-color:#fcfcfc}#content .data-rows li{float:left;display:block;padding:1em;color:#696969;text-align:center;min-height:2em}#content .data-rows li.cell-nodata{padding:1em 0;min-height:2em;text-align:left}#content .data-rows li.cell-actions{float:right;min-height:2em;padding:1em 0;text-align:left;background-color:#fcfcfc;width:15em}#content .data-rows li.cell-nodata img,#content .data-rows li.cell-actions img{width:24px;height:24px;margin:0 .5em}#content #resEventLog .data{width:100%}#content #resEventLog thead{text-align:center}#content #resEventLog tbody{width:100%;height:500px;overflow:auto}#content #resEventLog td{border-bottom:1px solid #d9d9d9}#content #resEventLog .cell{text-align:center}#content #resEventLog .cell-description{width:60%}#content #searchbox{background-color:#fcfcfc;vertical-align:middle;position:relative;height:auto;padding:.5em 1em;margin-bottom:2em}#content #searchbox form{display:flex;flex-wrap:wrap;justify-content:flex-start;align-items:center;text-align:left}#content #searchbox .search-filters>*{margin:0 .5em}#content #searchbox .search-filters .filter-buttons{display:inline-block}#content #searchbox .search-filters .filter-slider{width:10em}#content #searchbox .search-filters-tags{display:none;flex-grow:2}#content .btn-clear{opacity:.35;filter:alpha(opacity=35)}#content .btn-clear:hover{opacity:1;filter:alpha(opacity=100)}#content .actions-optional{display:none}#content .error{width:350px;padding:15px;margin:0 auto;text-align:center;font-size:16px;line-height:1.5em;color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28}#content .data .user-list-action,#content .data .profile-list-action,#box-popup .user-list-action,#box-popup .profile-list-action{width:75%;margin:0 auto}#content .data .list-wrap,#box-popup .list-wrap{max-height:20em;overflow:auto;padding:.5em;margin:1em 0}#content .data .list-wrap ul,#box-popup .list-wrap ul{list-style-type:none;margin:0;padding:0}#content .data .list-wrap li,#box-popup .list-wrap li{display:flex;background:#f2f2f2;padding:.5em;font-size:1em;margin-bottom:.5em}#content .data .list-wrap li:hover,#box-popup .list-wrap li:hover{background:#e8eaf6;color:#000}#content .data .list-wrap div.files-item-info,#box-popup .list-wrap div.files-item-info{flex-grow:2}#content .data .list-wrap div.files-item-info img,#box-popup .list-wrap div.files-item-info img{margin:0 .5em}#content .data .list-wrap div.files-item-actions,#box-popup .list-wrap div.files-item-actions{padding:.3em 0}#content .data .list-actions i,#box-popup .list-actions i{opacity:.5}#content .data .list-actions i:hover,#box-popup .list-actions i:hover{opacity:1}#box-popup{width:-webkit-min-content;width:-moz-min-content;width:min-content;min-width:50em;margin:5em auto;padding:0;background-color:#fff}#box-popup.box-password-view{width:-webkit-min-content;width:-moz-min-content;width:min-content;min-width:30em}#box-popup>h2{position:relative;width:100%;font-size:18px;color:#fff;background-color:#607d8b;margin:0;padding:.5em 0;line-height:1em}#box-popup>h2 .btn-popup-close{display:none;position:absolute;right:.5em;top:.2em}#box-popup>table{width:100%;padding-bottom:1em}#box-popup select{width:220px}#box-popup #resFancyAccion{display:none}#box-popup #resCheck{display:inline-block;width:80%;height:4em;padding:1em 0}#box-popup.image{background-color:transparent;max-width:100%;margin:0 auto;border-radius:0 !important;-moz-border-radius:0 !important;-webkit-border-radius:0 !important}#box-popup.image img{width:auto;margin:0 auto}#box-popup.image>div.title{background-color:#607d8b;color:#fff;padding:.5em}#box-popup.help{min-height:100px;background-color:#f5f5f5}#box-popup.help p{font-size:14px;text-align:justify;line-height:2em}#box-complexity>div{text-align:justify;line-height:1.5em;margin-top:1em}#box-upload-files>*{margin:0 auto}#debug{float:left;text-align:left}#debuginfo{width:100%;min-height:10em;padding:1em;background-color:#fff8e1;text-align:left;line-height:1.5em}#debuginfo H3{text-align:center}.popup-data{width:100%;min-width:400px;border:0;text-align:left;margin:0;padding:1em .5em}.popup-data .descField{min-width:100px}footer{display:flex;justify-content:space-between;position:fixed;bottom:0;z-index:100;width:100%;padding:.5em 0;background-color:#f5f5f5;color:#b9b9b9;font-size:1em;-webkit-box-shadow:0 -3px 2px -2px rgba(0,0,0,0.14);-moz-box-shadow:0 -3px 2px -2px rgba(0,0,0,0.14);box-shadow:0 -3px 2px -2px rgba(0,0,0,0.14)}footer .footer-parts{display:flex;justify-content:space-between}footer #footer-left{width:50%;margin:0 1em}footer #footer-right{width:50%;margin:0 1em;justify-content:flex-end;text-align:right}footer #updates,footer #notices{min-width:5em;text-align:center;cursor:pointer}footer #notices .notices-title{font-weight:bold;border-bottom:1px solid #c9c9c9;margin-bottom:1em}footer #status{margin:0 1em}footer #status>div{display:inline-block}footer #status .status-info{padding:.5em}footer #session{text-align:left;color:#999;font-size:.8em}footer a{color:#b9b9b9}footer a:visited{color:#b9b9b9}footer #project a:hover{color:#a9c1d7;border-bottom:1px solid #a9c1d7}footer #updates a:hover{color:#a9c1d7}footer img{border:0;width:16px;height:16px;vertical-align:middle}.round,.round5{border-radius:5px !important;-moz-border-radius:5px !important;-webkit-border-radius:5px !important}.midround{border-radius:0 0 10px 10px !important;-moz-border-radius:0 0 10px 10px !important;-webkit-border-radius:0 0 10px 10px !important}.midroundup{border-radius:10px 10px 0 0 !important;-moz-border-radius:10px 10px 0 0 !important;-webkit-border-radius:10px 10px 0 0 !important}.fullround{border-radius:50% !important;-moz-border-radius:50% !important;-webkit-border-radius:50% !important}.iconMini{width:16px !important;height:16px !important;vertical-align:middle}.hide{display:none !important}.btn-checks{padding:5px;margin:.2em 0;width:30em;border-bottom:1px solid #c9c9c9}.shadow{-webkit-box-shadow:2px 2px 3px -3px rgba(0,0,0,0.14);-moz-box-shadow:2px 2px 3px -3px rgba(0,0,0,0.14);box-shadow:1px 1px 2px rgba(0,0,0,0.14)}.noRes{width:60%;padding:15px;background-color:#f9f9f9;color:#a9a9a9;border:#c9c9c9 1px solid;margin:20px auto;text-align:center;font-size:16px}.header-grey{background-color:#607d8b;color:#fff;min-height:2em}.no-background{background:none !important}.action-in-box{padding:1em;text-align:right}.action-in-box ul{list-style:none;margin:0;padding:0}.tab-data{margin:2em auto 0;width:75%}.item-actions{display:flex;justify-content:flex-end;position:relative;margin:1em auto}.item-actions>div{display:inline-block}.tab-actions{margin:2em 0}.item-actions>ul,.tab-actions>ul{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;list-style:none;margin:0;padding:0}.item-actions>ul>li,.tab-actions>ul>li{width:auto;min-width:2em;margin-left:.5em}.item-actions>ul>li.datagrid-action-search,.tab-actions>ul>li.datagrid-action-search{min-width:5em}.item-actions>ul>li.datagrid-action-search form,.tab-actions>ul>li.datagrid-action-search form{width:100%}h5.datagrid-header-title{padding:.7em;border-bottom:1px solid #d9d9d9}.fullWidth{max-width:100% !important}.filter-on{color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a;padding:.3em 1em}.global-on{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;padding:.3em 1em}.opacity50{filter:alpha(opacity=50);opacity:.5}.custom-combobox{position:relative;display:inline-block}.custom-combobox input{width:80%}.custom-combobox-toggle{position:absolute;top:0;bottom:0;margin-left:-1px;padding:0;*height:1.7em;*top:.1em}.custom-combobox-input{margin:0;padding:.3em}.password-level.strongest{color:#26a69a}.password-level.strong{color:#2196f3}.password-level.good{color:#ffca28}.password-level.weak{color:#ef5350}#alert #alert-text{margin:15px auto;font-size:14px;font-weight:bold}#alert #alert-pass{width:50%;padding:10px;margin:15px auto;border:1px solid #c9c9c9;color:#555;font-weight:bold}.dialog-text,.dialog-user-text,.dialog-pass-text{font-family:Consolas,"Andale Mono WT","Andale Mono","Bitstream Vera Sans Mono","Nimbus Mono L",Monaco,"Courier New",monospace;padding:.5em;text-align:center;min-width:200px}.dialog-user-text{border-bottom:#d9d9d9 1px solid;color:#a9a9a9}.dialog-pass-text{border:transparent 1px solid;letter-spacing:.2em}.dialog-button{width:150px}.dialog-buttons{text-align:center;padding:.5em;border-top:1px solid #c9c9c9;line-height:2.5em}.dialog-clip-copy{color:#26a69a;background-color:#e0f2f1}.btn-help{cursor:pointer}.help-box{display:none;background-color:#fff !important;color:#607d8b}.help-box>*{font-weight:bold}.help-container ul{padding:0 .5em;list-style:none}.help-container ul li{padding:.5em 0}.help-container .help-text{text-align:justify;line-height:1.5em;margin-top:1em}.tooltip{width:300px;max-width:300px;background-color:#777;color:#fff;z-index:101}.tooltip-text{padding:.5em}.tooltip-text .tooltip-header{text-transform:capitalize;font-weight:bold;border-bottom:1px solid #c9c9c9}.cursor-pointer{cursor:pointer}.password-actions{display:inline-block;width:12em}.password-actions>span,.password-actions i{margin-right:.6em}.form-control{position:relative}.form-control .password-actions{position:absolute;right:0;padding:20px}.custom-input-color{width:3em;height:1em;display:inline-block}.account-pass-image{height:32px;width:auto}.select-box{min-width:300px;max-width:100%}fieldset.warning{padding:8px;border-radius:5px;color:#ef5350;background-color:#ffebee;border:1px solid #ef5350}fieldset.warning legend{color:#ef5350 !important}fieldset.warning a{color:#ef5350 !important;font-weight:bold}#actions{width:100%;line-height:2em;margin-bottom:5em}#actions #logo{display:flex;width:100%;margin-bottom:30px;color:#607d8b;align-items:center;background:url("public/images/logo_full_bg.png") left no-repeat;background-size:auto 150px;height:150px}#actions #page-title{width:100%;color:#607d8b;text-align:center}#actions #page-title h1{font-weight:bold;font-size:24px;letter-spacing:3px}#actions ul.errors{max-width:40vw;margin:0 auto;list-style:none;font-size:14px;text-align:left}#actions ul.errors>li{margin:1.5em auto;border-radius:3px;padding:1em .5em}#actions ul.errors>li.msg-critical{color:#ef5350;background-color:#ffebee;border:1px solid #ef5350}#actions ul.errors>li.msg-warning{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;color:#555}#actions ul.errors>li.msg-ok{color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a}#actions ul.errors>li>p.hint{color:#555;font-size:12px}#actions ul.errors>li>p.hint i{margin-right:.5em}#actions form{width:450px;margin:0 auto;text-align:left}#actions form fieldset{margin-bottom:2em}#actions form fieldset legend{width:100%;color:#fff;font-size:14px;font-weight:bold;text-align:center;background-color:#607d8b;margin:1em 0;letter-spacing:.2em;padding:.2em 0}#actions div.buttons{margin-top:2em;text-align:center}.center{text-align:center !important}.right{text-align:right !important}.left{text-align:left !important}.opacity50{opacity:.5 !important}.msg-option-unvailable{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;border:0;padding:.5em;text-align:center;margin:1em 0;font-size:1.5em}div.tag-list-box{margin-bottom:1em}div.tag-list-box .tag-list-header{text-align:left;border-bottom:1px solid #d9d9d9;color:#607d8b;font-size:12px;font-weight:bold;margin-bottom:.5em}div.tag-list-box .tag-list-body .tags-list-items{display:inline-block;padding:.5em;width:95%;height:3em;border-bottom:1px solid rgba(0,0,0,0.12);border-radius:3px !important;-moz-border-radius:3px !important;-webkit-border-radius:3px !important}div.tag-list-box i.select-icon{margin-right:.5em;color:#607d8b;font-size:18px}div.tag-list-box span.tag,div.tags-box span.tag{margin:0 3px 3px 0;padding:3px;background:#5c6bc0;color:#fff;border:0;border-radius:3px !important;-moz-border-radius:3px !important;-webkit-border-radius:3px !important}#box-pub-noheader #box-login{position:relative;min-height:14em}#box-pub-noheader #box-login #box-buttons{position:absolute;top:2em;right:2em}#box-pub-noheader #box-login #box-actions{width:100%;text-align:right}#box-pub-noheader #box-login #box-actions a{color:#c9c9c9}#box-pub-noheader #box-updated{width:350px;margin:3em auto;font-size:14px;text-align:center;padding:.5em;color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a}#box-pub-noheader #demo-info{padding:.5em;margin:3em auto 0 auto;color:#c9c9c9;border-top:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9}#box-pub-noheader #demo-info ul{display:flex;justify-content:space-around;list-style:none}#box-pub-noheader #demo-info ul li>span{padding:0 1em}@media screen and (max-width:600px){#box-pub-noheader #box-login #box-buttons{position:relative;top:0;right:0;text-align:right}#box-pub-noheader #box-login #box-actions{margin-top:1em}#box-pub-noheader #demo-info ul{display:flex;flex-direction:column;align-items:center;list-style:none}#box-pub-noheader #demo-info ul li{width:11em;text-align:left}#box-pub-noheader #demo-info ul li>span{padding:0 1em}}@media screen and (max-width:1000px){#content #searchbox .search-filters>*{margin:.5em 1em .5em 0}footer{display:none;justify-content:space-between;flex-wrap:wrap}footer .footer-parts{justify-content:space-between;flex-wrap:wrap}footer #footer-left,footer #footer-right{width:100%}footer .footer-parts>div{width:100%;padding:.5em 0}}@media screen and (max-width:600px){#content input,#box-popup input{width:100%}#content .mdl-textfield,#box-popup .mdl-textfield{width:100%}#content td.descField,#box-popup td.descField{display:none}#content td.valField .lowres-title,#box-popup td.valField .lowres-title{display:block}#content #searchbox .mdl-textfield{width:90%}#content #searchbox .search-text{width:90%}#content #searchbox .search-filters .selectize-control{width:100%}#content .data-header-minimal li.search-filter-spacer{display:none}#content .data-container,#content .tab-data{width:100%}#content .data-container .selectize-control,#content .tab-data .selectize-control{width:100%}#content .mdl-tabs__tab-bar{flex-wrap:wrap;height:auto}#content .pager{flex-direction:column-reverse}#content .pager>div{text-align:center;width:100%}#box-popup h2>.btn-popup-close{display:inline-block}#actions ul.errors{max-width:90vw}.mdl-data-table{table-layout:fixed;width:100%}.table-responsive td,.table-responsive th{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.table-responsive .cell-actions i{display:block !important}} \ No newline at end of file +html,body{margin:0;padding:0;text-align:left;background-color:#f5f5f5;color:#555;font-size:12px;font-weight:normal;box-sizing:border-box;max-width:100%}*{font-family:"Roboto Regular",Verdana,Tahoma,sans-serif;box-sizing:inherit}*:before,*:after{box-sizing:inherit}table{font-size:11px;border-spacing:0}table th{border-bottom:2px solid transparent;vertical-align:middle}table th .icon{width:24px;height:24px}table tr{height:20px}table tr.odd{background-color:#f9f9f9}table tr.even>td,table tr.odd>td{border-bottom:1px solid #d9d9d9 !important}table tr.even:hover,table tr.odd:hover{background-color:#e8ff99}table td{padding:3px}table td.txtCliente{font-weight:bold;text-align:center}form{font-size:11px;margin:0}input.inputImg,img.inputImg{background-color:transparent !important;width:24px !important;height:24px !important;border:0;vertical-align:middle;margin:0 .5em}input.txtFile{width:200px}input.txtLong{width:300px}textarea{width:350px}select.files{width:250px}input.spinner{width:5em}img{margin:0;padding:0;border:0;cursor:pointer}img.inputImgMini{background-color:transparent !important;width:16px !important;height:16px !important;margin:0 5px 0 5px;border:0;vertical-align:middle}i{cursor:pointer}form .form-field{display:flex;justify-content:space-between}form .form-field>label{min-width:12em;padding:.5em 0;font-size:16px;align-self:center}form .form-field>div{width:100%;align-self:center}a{text-decoration:none;color:#536dfe}a:visited{text-decoration:none;color:#536dfe}a:hover,a:active,a:focus{text-decoration:none;cursor:pointer}pre,code,samp,kbd{font-family:Consolas,"Andale Mono WT","Andale Mono","Bitstream Vera Sans Mono","Nimbus Mono L",Monaco,"Courier New",monospace;font-size:1em;direction:ltr;text-align:left;background-color:#fbfaf9;color:#333;box-shadow:inset 0 0 .3em #ccc;border-radius:2px}body.login,body.logout,body.userpassreset{background:#607d8b}body.login #wrap,body.logout #wrap,body.userpassreset #wrap{background:transparent}body.login #container,body.logout #container,body.userpassreset #container{padding-top:5%}body.login footer,body.logout footer,body.userpassreset footer{background:#78909c}body.login footer a,body.logout footer a,body.userpassreset footer a{color:#f2f2f2}#box-pub-noheader{background:transparent url("public/images/logo_full_nobg_outline.png") no-repeat top center;background-size:75% auto;width:40em;min-height:20em;margin:0 auto}#box-pub-noheader>div{width:100%;padding:1em;margin:0 auto}#box-pub-noheader .box-spacer{height:15em;background-color:transparent}#box-pub-noheader .box-header{width:100%;color:#f2f2f2;font-size:16px;font-weight:bold;text-align:center;margin:1em 0;letter-spacing:.1em;padding:.2em 0}#box-pub-noheader .box-form{-moz-box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2);box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2);background-color:#f2f2f2}#box-pub-noheader .box-form form fieldset#box-data{height:100%;min-height:14em;text-align:left;background-color:transparent;margin-bottom:2em}#box-pub-noheader .box-form form fieldset#box-data legend{width:100%;color:#607d8b;font-size:14px;font-weight:bold;text-align:center;margin:1em 0;letter-spacing:.1em;padding:.2em 0}#box-pub-noheader .box-form form fieldset#box-data .form-control>i{margin-right:.5em;opacity:.5}#box-pub-noheader .box-form form fieldset#box-data .extra-hidden{display:none}#box-pub-noheader .box-form div#box-buttons{margin-top:2em;text-align:center}@media screen and (max-width:600px){#box-pub-noheader{width:25em}#box-pub-noheader .box-spacer{height:10em}#box-pub-noheader form fieldset#box-data .mdl-textfield{width:100%}}#nojs{width:80%;text-align:center;vertical-align:middle;margin:10px auto;padding:3px;background-color:#ef5350;color:white;font-weight:bold;font-size:14px}#wrap{height:auto !important;min-height:100%;width:100%;background-color:#f5f5f5;padding-bottom:5em}#wrap-loading{position:fixed;z-index:9999;top:50%;left:50%;padding:1em;background-color:rgba(255,255,255,0.8);display:none;border-radius:5px !important;-moz-border-radius:5px !important;-webkit-border-radius:5px !important}#wrap-loading.overlay-full{top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,0.5)}#wrap-loading.overlay-full #loading{position:absolute;top:50%;left:50%}#wrap-loading.overlay-full #taskStatus{display:none}#wrap-loading #taskStatus{display:none;position:absolute;left:0;top:55%;width:100%;text-align:center;color:white;background-color:rgba(0,0,0,0.5);padding:1em 0}#container{margin:auto;width:100%}#container.error,#container.install{width:100%}#container .logo{height:64px}#container #actions-bar{z-index:100;display:flex;justify-content:space-between;position:fixed;border:0 none;top:0;left:0;width:100%;padding:1em 0;background-color:transparent}#container #actions-bar-icons{flex-grow:1;text-align:center}#container #actions-bar-logo{display:none;padding:0 .5em}#container #actions-bar-logo img{display:inline-block;width:50px;opacity:.75}#container #content{width:95%;margin:2em auto 8em auto}#container #content.public-link{width:70%;min-height:0;margin:5em auto}#content tr.header td,#box-popup tr.header td{width:100%;padding:7px;background-color:#eceff1;color:#607d8b;font-size:17px;letter-spacing:.2em;font-weight:bold}#content td.descField,#box-popup td.descField{text-align:right;padding-right:20px;width:25%;border-right:1px solid #d9d9d9;color:#999;font-size:12px;font-weight:bold}#content td.valField,#box-popup td.valField{padding-left:1em;width:100%}#content td.valField .lowres-title,#box-popup td.valField .lowres-title{display:none;width:100%;color:#607d8b;font-size:12px}#content td.valField .notification-description,#box-popup td.valField .notification-description{font-size:16px;max-width:100%}#content td.valField .notification-description .event-description,#content td.valField .notification-description .event-details,#box-popup td.valField .notification-description .event-description,#box-popup td.valField .notification-description .event-details{padding:.5em 0}#content td.valField .notification-description .event-description,#box-popup td.valField .notification-description .event-description{color:#5c6bc0;border-bottom:1px solid #e9e9e9}#content td.valField .notification-description .event-details .detail,#box-popup td.valField .notification-description .event-details .detail{display:flex;padding:.2em 0}#content td.valField .notification-description .event-details .detail .detail-left,#box-popup td.valField .notification-description .event-details .detail .detail-left{flex:none;width:8em;font-weight:bold}#content td.valField .notification-description .event-details .detail .detail-right,#box-popup td.valField .notification-description .event-details .detail .detail-right{flex-grow:1}#content .pager{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;justify-content:space-between;align-content:space-between;flex-wrap:wrap;width:100%;margin-top:15px;padding:.5em;font-size:11px;color:#999;background-color:#fcfcfc}#content .pager img{margin-left:5px;vertical-align:middle}#content .pager a{margin-left:5px;font-size:12px;color:#999}#content #title{width:100%;padding:7px;background-color:#d9d9d9;color:#fff;font-size:17px;letter-spacing:.2em}#content #title.titleNormal{background-color:#607d8b;color:#fff}#content .data-container{width:75%;margin:0 auto}#content fieldset.data{margin:2em auto}#content fieldset.data>legend{color:#607d8b;padding:0 .5em;font-size:1.5em}#content fieldset.data>div{display:none}#content fieldset.data>div table{width:100%}#content .data{width:100%;padding:10px;margin:0 auto;background-color:#fff;-webkit-box-shadow:2px 2px 3px -3px rgba(0,0,0,0.14);-moz-box-shadow:2px 2px 3px -3px rgba(0,0,0,0.14);box-shadow:1px 1px 2px rgba(0,0,0,0.14)}#content .data #history-icon{position:relative;top:5em;right:2em}#content .data td{text-align:left}#content .data td.descField{text-align:right}#content .data select{min-width:210px}#content .data .list-wrap{max-height:10em;overflow:auto;padding:.5em;margin:1em 0}#content .data .dropzone{width:100%;padding:1em;border:2px dashed #26a69a;text-align:center;opacity:.3}#content .data .dropzone:hover{opacity:1}#content .data .dropzone img{vertical-align:middle}#content .data .file-upload{display:none}#content .data .account-permissions{width:100%}#content .extra-info{margin-top:20px}#content #tabs fieldset{border:1px solid #c9c9c9}#content #tabs #frmConfig label{float:left}#content .tblConfig{margin-bottom:2em}#content .tblConfig td.descField{width:35%;font-size:11px;font-weight:bold}#content .tblConfig td.rowHeader{padding:5px 0 5px 0;background-color:#f5f5f5;text-align:center;font-weight:bold;border-top:15px solid #f9f9f9;border-bottom:3px solid #a9c1d7;letter-spacing:.5em;color:#696969}#content .tblConfig input.checkbox{width:15px;text-align:left;padding:0}#content .tblConfig .option-disabled{text-align:center;background-color:#fff8e1;color:#ffca28;font-weight:bold}#content h2{width:100%;height:1.5em;font-size:18px;color:white;background-color:#a9c1d7;margin:0;padding-top:.1em}#content .section{margin-top:2.5em;border-bottom:1px solid #d9d9d9;text-align:left;font-size:14px;font-weight:bold;color:#5c6bc0}#content .row_even>td{background-color:#f5f5f5}#content .row_odd>td{background-color:white}#content .data-header ul{list-style:none;width:100%;margin:0 0 10px 0;padding:0}#content .data-header li{display:inline-block;padding:.2em .5em;font-weight:bold;letter-spacing:.2em;color:#fff;text-align:center}#content .data-header li a{color:#777}#content .data-header li img{float:right;width:24px;height:24px;vertical-align:middle}#content .data-header-minimal{border-bottom:1px solid #dfdfdf}#content .data-header-minimal ul{display:flex;flex-flow:row;flex-wrap:wrap;align-content:flex-start;justify-content:space-around;margin:0}#content .data-header-minimal li{min-width:10em;font-weight:normal;letter-spacing:normal}#content .data-header-minimal li a{color:#b9b9b9;padding:.3em .8em}#content .data-header-minimal li.search-filter-spacer{flex:0 0 18em}#content .data-table{width:100%}#content .data-table td:first-of-type,#content .data-table th:first-of-type{width:5em}#content .data-table thead th{background-color:#607d8b;color:#fff}#content .data-table tbody td.cell-data{text-align:left}#content .data-table tbody td.cell-nodata{padding:0 .5em;text-align:left}#content .data-table tbody td.cell-actions{text-align:right}#content .data-table tbody td.cell-actions i{opacity:.5}#content .data-table tbody td.cell-actions i:hover{opacity:1}#content .data-rows ul{display:table;list-style:none;width:100%;margin:0 0 10px 0;padding:0;background-color:#fcfcfc}#content .data-rows li{float:left;display:block;padding:1em;color:#696969;text-align:center;min-height:2em}#content .data-rows li.cell-nodata{padding:1em 0;min-height:2em;text-align:left}#content .data-rows li.cell-actions{float:right;min-height:2em;padding:1em 0;text-align:left;background-color:#fcfcfc;width:15em}#content .data-rows li.cell-nodata img,#content .data-rows li.cell-actions img{width:24px;height:24px;margin:0 .5em}#content #resEventLog .data{width:100%}#content #resEventLog thead{text-align:center}#content #resEventLog tbody{width:100%;height:500px;overflow:auto}#content #resEventLog td{border-bottom:1px solid #d9d9d9}#content #resEventLog .cell{text-align:center}#content #resEventLog .cell-description{width:60%}#content #searchbox{background-color:#fcfcfc;vertical-align:middle;position:relative;height:auto;padding:.5em 1em;margin-bottom:2em}#content #searchbox form{display:flex;flex-wrap:wrap;justify-content:flex-start;align-items:center;text-align:left}#content #searchbox .search-filters>*{margin:0 .5em}#content #searchbox .search-filters .filter-buttons{display:inline-block}#content #searchbox .search-filters .filter-slider{width:10em}#content #searchbox .search-filters-tags{display:none;flex-grow:2}#content .btn-clear{opacity:.35;filter:alpha(opacity=35)}#content .btn-clear:hover{opacity:1;filter:alpha(opacity=100)}#content .actions-optional{display:none}#content .error{width:350px;padding:15px;margin:0 auto;text-align:center;font-size:16px;line-height:1.5em;color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28}#content .data .user-list-action,#content .data .profile-list-action,#box-popup .user-list-action,#box-popup .profile-list-action{width:75%;margin:0 auto}#content .data .list-wrap,#box-popup .list-wrap{max-height:20em;overflow:auto;padding:.5em;margin:1em 0}#content .data .list-wrap ul,#box-popup .list-wrap ul{list-style-type:none;margin:0;padding:0}#content .data .list-wrap li,#box-popup .list-wrap li{display:flex;background:#f2f2f2;padding:.5em;font-size:1em;margin-bottom:.5em}#content .data .list-wrap li:hover,#box-popup .list-wrap li:hover{background:#e8eaf6;color:#000}#content .data .list-wrap div.files-item-info,#box-popup .list-wrap div.files-item-info{flex-grow:2}#content .data .list-wrap div.files-item-info img,#box-popup .list-wrap div.files-item-info img{margin:0 .5em}#content .data .list-wrap div.files-item-actions,#box-popup .list-wrap div.files-item-actions{padding:.3em 0}#content .data .list-actions i,#box-popup .list-actions i{opacity:.5}#content .data .list-actions i:hover,#box-popup .list-actions i:hover{opacity:1}#box-popup{width:-webkit-min-content;width:-moz-min-content;width:min-content;min-width:50em;margin:5em auto;padding:0;background-color:#fff}#box-popup.box-password-view{width:-webkit-min-content;width:-moz-min-content;width:min-content;min-width:30em}#box-popup>h2{position:relative;width:100%;font-size:18px;color:#fff;background-color:#607d8b;margin:0;padding:.5em 0;line-height:1em}#box-popup>h2 .btn-popup-close{display:none;position:absolute;right:.5em;top:.2em}#box-popup>table{width:100%;padding-bottom:1em}#box-popup select{width:220px}#box-popup #resFancyAccion{display:none}#box-popup #resCheck{display:inline-block;width:80%;height:4em;padding:1em 0}#box-popup.image{background-color:transparent;max-width:100%;margin:0 auto;border-radius:0 !important;-moz-border-radius:0 !important;-webkit-border-radius:0 !important}#box-popup.image img{width:auto;margin:0 auto}#box-popup.image>div.title{background-color:#607d8b;color:#fff;padding:.5em}#box-popup.help{min-height:100px;background-color:#f5f5f5}#box-popup.help p{font-size:14px;text-align:justify;line-height:2em}#box-complexity>div{text-align:justify;line-height:1.5em;margin-top:1em}#box-upload-files>*{margin:0 auto}#debug{float:left;text-align:left}#debuginfo{width:100%;min-height:10em;padding:1em;background-color:#fff8e1;text-align:left;line-height:1.5em}#debuginfo H3{text-align:center}.popup-data{width:100%;min-width:400px;border:0;text-align:left;margin:0;padding:1em .5em}.popup-data .descField{min-width:100px}footer{display:flex;justify-content:space-between;position:fixed;bottom:0;z-index:100;width:100%;padding:.5em 0;background-color:#f5f5f5;color:#b9b9b9;font-size:1em;-webkit-box-shadow:0 -3px 2px -2px rgba(0,0,0,0.14);-moz-box-shadow:0 -3px 2px -2px rgba(0,0,0,0.14);box-shadow:0 -3px 2px -2px rgba(0,0,0,0.14)}footer .footer-parts{display:flex;justify-content:space-between}footer #footer-left{width:50%;margin:0 1em}footer #footer-right{width:50%;margin:0 1em;justify-content:flex-end;text-align:right}footer #updates,footer #notices{min-width:5em;text-align:center;cursor:pointer}footer #notices .notices-title{font-weight:bold;border-bottom:1px solid #c9c9c9;margin-bottom:1em}footer #status{margin:0 1em}footer #status>div{display:inline-block}footer #status .status-info{padding:.5em}footer #session{text-align:left;color:#999;font-size:.8em}footer a{color:#b9b9b9}footer a:visited{color:#b9b9b9}footer #project a:hover{color:#a9c1d7;border-bottom:1px solid #a9c1d7}footer #updates a:hover{color:#a9c1d7}footer img{border:0;width:16px;height:16px;vertical-align:middle}.round,.round5{border-radius:5px !important;-moz-border-radius:5px !important;-webkit-border-radius:5px !important}.midround{border-radius:0 0 10px 10px !important;-moz-border-radius:0 0 10px 10px !important;-webkit-border-radius:0 0 10px 10px !important}.midroundup{border-radius:10px 10px 0 0 !important;-moz-border-radius:10px 10px 0 0 !important;-webkit-border-radius:10px 10px 0 0 !important}.fullround{border-radius:50% !important;-moz-border-radius:50% !important;-webkit-border-radius:50% !important}.iconMini{width:16px !important;height:16px !important;vertical-align:middle}.hide{display:none !important}.btn-checks{padding:5px;margin:.2em 0;width:30em;border-bottom:1px solid #c9c9c9}.shadow{-webkit-box-shadow:2px 2px 3px -3px rgba(0,0,0,0.14);-moz-box-shadow:2px 2px 3px -3px rgba(0,0,0,0.14);box-shadow:1px 1px 2px rgba(0,0,0,0.14)}.noRes{width:60%;padding:15px;background-color:#f9f9f9;color:#a9a9a9;border:#c9c9c9 1px solid;margin:20px auto;text-align:center;font-size:16px}.header-grey{background-color:#607d8b;color:#fff;min-height:2em}.no-background{background:none !important}.action-in-box{padding:1em;text-align:right}.action-in-box ul{list-style:none;margin:0;padding:0}.tab-data{margin:2em auto 0;width:75%}.item-actions{display:flex;justify-content:flex-end;position:relative;margin:1em auto}.item-actions>div{display:inline-block}.tab-actions{margin:2em 0}.item-actions>ul,.tab-actions>ul{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;list-style:none;margin:0;padding:0}.item-actions>ul>li,.tab-actions>ul>li{width:auto;min-width:2em;margin-left:.5em}.item-actions>ul>li.datagrid-action-search,.tab-actions>ul>li.datagrid-action-search{min-width:5em}.item-actions>ul>li.datagrid-action-search form,.tab-actions>ul>li.datagrid-action-search form{width:100%}h5.datagrid-header-title{padding:.7em;border-bottom:1px solid #d9d9d9}.fullWidth{max-width:100% !important}.filter-on{color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a;padding:.3em 1em}.global-on{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;padding:.3em 1em}.opacity50{filter:alpha(opacity=50);opacity:.5}.custom-combobox{position:relative;display:inline-block}.custom-combobox input{width:80%}.custom-combobox-toggle{position:absolute;top:0;bottom:0;margin-left:-1px;padding:0;*height:1.7em;*top:.1em}.custom-combobox-input{margin:0;padding:.3em}.password-level.strongest{color:#26a69a}.password-level.strong{color:#2196f3}.password-level.good{color:#ffca28}.password-level.weak{color:#ef5350}#alert #alert-text{margin:15px auto;font-size:14px;font-weight:bold}#alert #alert-pass{width:50%;padding:10px;margin:15px auto;border:1px solid #c9c9c9;color:#555;font-weight:bold}.dialog-text,.dialog-user-text,.dialog-pass-text{font-family:Consolas,"Andale Mono WT","Andale Mono","Bitstream Vera Sans Mono","Nimbus Mono L",Monaco,"Courier New",monospace;padding:.5em;text-align:center;min-width:200px}.dialog-user-text{border-bottom:#d9d9d9 1px solid;color:#a9a9a9}.dialog-pass-text{border:transparent 1px solid;letter-spacing:.2em}.dialog-button{width:150px}.dialog-buttons{text-align:center;padding:.5em;border-top:1px solid #c9c9c9;line-height:2.5em}.dialog-clip-copy{color:#26a69a;background-color:#e0f2f1}.btn-help{cursor:pointer}.help-box{display:none;background-color:#fff !important;color:#607d8b}.help-box>*{font-weight:bold}.help-container ul{padding:0 .5em;list-style:none}.help-container ul li{padding:.5em 0}.help-container .help-text{text-align:justify;line-height:1.5em;margin-top:1em}.tooltip{width:300px;max-width:300px;background-color:#777;color:#fff;z-index:101}.tooltip-text{padding:.5em}.tooltip-text .tooltip-header{text-transform:capitalize;font-weight:bold;border-bottom:1px solid #c9c9c9}.cursor-pointer{cursor:pointer}.password-actions{display:inline-block;width:12em}.password-actions>span,.password-actions i{margin-right:.6em}.form-control{position:relative}.form-control .password-actions{position:absolute;right:0;padding:20px}.custom-input-color{width:3em;height:1em;display:inline-block}.account-pass-image{height:32px;width:auto}.select-box{min-width:300px;max-width:100%}fieldset.warning{padding:8px;border-radius:5px;color:#ef5350;background-color:#ffebee;border:1px solid #ef5350}fieldset.warning legend{color:#ef5350 !important}fieldset.warning a{color:#ef5350 !important;font-weight:bold}#actions{width:100%;line-height:2em;margin-bottom:5em;padding-bottom:5em}#actions #logo{display:flex;width:100%;margin-bottom:30px;color:#607d8b;align-items:center;background:url("public/images/logo_full_bg.png") left no-repeat;background-size:auto 150px;height:150px}#actions #page-title{width:100%;color:#607d8b;text-align:center}#actions #page-title h1{font-weight:bold;font-size:24px;letter-spacing:3px}#actions ul.errors{max-width:40vw;margin:0 auto;list-style:none;font-size:14px;text-align:left}#actions ul.errors>li{margin:1.5em auto;border-radius:3px;padding:1em .5em}#actions ul.errors>li.msg-critical{color:#ef5350;background-color:#ffebee;border:1px solid #ef5350}#actions ul.errors>li.msg-warning{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;color:#555}#actions ul.errors>li.msg-ok{color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a}#actions ul.errors>li>p.hint{color:#555;font-size:12px}#actions ul.errors>li>p.hint i{margin-right:.5em}#actions form{width:450px;margin:0 auto;text-align:left}#actions form fieldset{margin-bottom:2em}#actions form fieldset legend{width:100%;color:#fff;font-size:14px;font-weight:bold;text-align:center;background-color:#607d8b;margin:1em 0;letter-spacing:.2em;padding:.2em 0}#actions div.buttons{margin-top:2em;text-align:center}.center{text-align:center !important}.right{text-align:right !important}.left{text-align:left !important}.opacity50{opacity:.5 !important}.msg-option-unvailable{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;border:0;padding:.5em;text-align:center;margin:1em 0;font-size:1.5em}div.tag-list-box{margin-bottom:1em}div.tag-list-box .tag-list-header{text-align:left;border-bottom:1px solid #d9d9d9;color:#607d8b;font-size:12px;font-weight:bold;margin-bottom:.5em}div.tag-list-box .tag-list-body .tags-list-items{display:inline-block;padding:.5em;width:95%;height:3em;border-bottom:1px solid rgba(0,0,0,0.12);border-radius:3px !important;-moz-border-radius:3px !important;-webkit-border-radius:3px !important}div.tag-list-box i.select-icon{margin-right:.5em;color:#607d8b;font-size:18px}div.tag-list-box span.tag,div.tags-box span.tag{margin:0 3px 3px 0;padding:3px;background:#5c6bc0;color:#fff;border:0;border-radius:3px !important;-moz-border-radius:3px !important;-webkit-border-radius:3px !important}#box-pub-noheader #box-login{position:relative;min-height:14em}#box-pub-noheader #box-login #box-buttons{position:absolute;top:2em;right:2em}#box-pub-noheader #box-login #box-actions{width:100%;text-align:right}#box-pub-noheader #box-login #box-actions a{color:#c9c9c9}#box-pub-noheader #box-updated{width:350px;margin:3em auto;font-size:14px;text-align:center;padding:.5em;color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a}#box-pub-noheader #demo-info{padding:.5em;margin:3em auto 0 auto;color:#c9c9c9;border-top:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9}#box-pub-noheader #demo-info ul{display:flex;justify-content:space-around;list-style:none}#box-pub-noheader #demo-info ul li>span{padding:0 1em}@media screen and (max-width:600px){#box-pub-noheader #box-login #box-buttons{position:relative;top:0;right:0;text-align:right}#box-pub-noheader #box-login #box-actions{margin-top:1em}#box-pub-noheader #demo-info ul{display:flex;flex-direction:column;align-items:center;list-style:none}#box-pub-noheader #demo-info ul li{width:11em;text-align:left}#box-pub-noheader #demo-info ul li>span{padding:0 1em}}@media screen and (max-width:1000px){#content #searchbox .search-filters>*{margin:.5em 1em .5em 0}footer{display:none;justify-content:space-between;flex-wrap:wrap}footer .footer-parts{justify-content:space-between;flex-wrap:wrap}footer #footer-left,footer #footer-right{width:100%}footer .footer-parts>div{width:100%;padding:.5em 0}}@media screen and (max-width:600px){#content input,#box-popup input{width:100%}#content .mdl-textfield,#box-popup .mdl-textfield{width:100%}#content td.descField,#box-popup td.descField{display:none}#content td.valField .lowres-title,#box-popup td.valField .lowres-title{display:block}#content #searchbox .mdl-textfield{width:90%}#content #searchbox .search-text{width:90%}#content #searchbox .search-filters .selectize-control{width:100%}#content .data-header-minimal li.search-filter-spacer{display:none}#content .data-container,#content .tab-data{width:100%}#content .data-container .selectize-control,#content .tab-data .selectize-control{width:100%}#content .mdl-tabs__tab-bar{flex-wrap:wrap;height:auto}#content .pager{flex-direction:column-reverse}#content .pager>div{text-align:center;width:100%}#box-popup h2>.btn-popup-close{display:inline-block}#actions ul.errors{max-width:90vw}.mdl-data-table{table-layout:fixed;width:100%}.table-responsive td,.table-responsive th{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.table-responsive .cell-actions i{display:block !important}} \ No newline at end of file diff --git a/app/modules/web/themes/material-blue/css/styles.scss b/app/modules/web/themes/material-blue/css/styles.scss index aab4b687..4635b042 100644 --- a/app/modules/web/themes/material-blue/css/styles.scss +++ b/app/modules/web/themes/material-blue/css/styles.scss @@ -119,6 +119,18 @@ } #content, #box-popup { + tr.header { + td { + width: 100%; + padding: 7px; + background-color: $color-bluegrey-bg; + color: $color-bluegrey-fg; + font-size: 17px; + letter-spacing: .2em; + font-weight: bold; + } + } + td.descField { text-align: right; padding-right: 20px; @@ -1208,6 +1220,7 @@ fieldset.warning { /*margin: auto auto 50px;*/ line-height: 2em; margin-bottom: 5em; + padding-bottom: 5em; #logo { display: flex; diff --git a/app/modules/web/themes/material-blue/views/config/ldap.inc b/app/modules/web/themes/material-blue/views/config/ldap.inc index 80e1f234..2d4cb32f 100644 --- a/app/modules/web/themes/material-blue/views/config/ldap.inc +++ b/app/modules/web/themes/material-blue/views/config/ldap.inc @@ -92,7 +92,10 @@ use SP\Mvc\View\Template; + value="getId(); ?>" + isSelected() ? 'selected' : ''; ?>> + getName(); ?> + @@ -101,7 +104,9 @@ use SP\Mvc\View\Template;
getIconHelp()->getIcon(); ?>
+ class="icon material-icons getIconHelp()->getClass(); ?>"> + getIconHelp()->getIcon(); ?> +

@@ -134,7 +139,9 @@ use SP\Mvc\View\Template;

getIconHelp()->getIcon(); ?>
+ class="icon material-icons getIconHelp()->getClass(); ?>"> + getIconHelp()->getIcon(); ?> +

@@ -166,7 +173,9 @@ use SP\Mvc\View\Template;

getIconHelp()->getIcon(); ?>
+ class="icon material-icons getIconHelp()->getClass(); ?>"> + getIconHelp()->getIcon(); ?> +

@@ -187,7 +196,9 @@ use SP\Mvc\View\Template;

getLdapBindPass()): ?>
getIconWarning()->getIcon(); ?>
+ class="icon material-icons getIconWarning()->getClass(); ?>"> + getIconWarning()->getIcon(); ?> +

@@ -201,7 +212,9 @@ use SP\Mvc\View\Template;

getIconHelp()->getIcon(); ?>
+ class="icon material-icons getIconHelp()->getClass(); ?>"> + getIconHelp()->getIcon(); ?> +

@@ -233,7 +246,9 @@ use SP\Mvc\View\Template;

getIconHelp()->getIcon(); ?>
+ class="icon material-icons getIconHelp()->getClass(); ?>"> + getIconHelp()->getIcon(); ?> +

@@ -269,7 +284,9 @@ use SP\Mvc\View\Template;

getIconHelp()->getIcon(); ?>
+ class="icon material-icons getIconHelp()->getClass(); ?>"> + getIconHelp()->getIcon(); ?> +

@@ -286,7 +303,10 @@ use SP\Mvc\View\Template; + value="getId(); ?>" + getId() === $configData->getLdapDefaultGroup() ? 'selected' : ''; ?>> + getName(); ?> + @@ -295,7 +315,9 @@ use SP\Mvc\View\Template;

getIconHelp()->getIcon(); ?>
+ class="icon material-icons getIconHelp()->getClass(); ?>"> + getIconHelp()->getIcon(); ?> +

@@ -312,7 +334,132 @@ use SP\Mvc\View\Template; + value="getId(); ?>" + getId() === $configData->getLdapDefaultProfile()) ? 'selected' : ''; ?>> + getName(); ?> + + + + + + + + + + + + + +

+ getIconHelp()->getIcon(); ?> +
+
+

+ +

+

+ +

+
    +
  • + (|(objectClass=inetOrgPerson)(objectClass=person)(objectClass=simpleSecurityObject)) +
  • +
  • (objectClass=inetOrgPerson)
  • +
+
+ + +
+ + +
+ + + + + + +
+ getIconHelp()->getIcon(); ?> +
+
+

+ +

+

+ +

+
    +
  • + (|(objectClass=groupOfNames)(objectClass=groupOfUniqueNames)(objectClass=group)) +
  • +
  • (objectClass=groupOfNames)
  • +
+
+ + +
+ + +
+ + + + + + + + +
+ + + + + + + + + + +
+ + @@ -359,7 +506,9 @@ use SP\Mvc\View\Template;
getIconHelp()->getIcon(); ?>
+ class="icon material-icons getIconHelp()->getClass(); ?>"> + getIconHelp()->getIcon(); ?> +

@@ -384,7 +533,9 @@ use SP\Mvc\View\Template;

getIconHelp()->getIcon(); ?>
+ class="icon material-icons getIconHelp()->getClass(); ?>"> + getIconHelp()->getIcon(); ?> +

@@ -431,7 +582,9 @@ use SP\Mvc\View\Template;

getIconHelp()->getIcon(); ?>
+ class="icon material-icons getIconHelp()->getClass(); ?>"> + getIconHelp()->getIcon(); ?> +

@@ -454,7 +607,9 @@ use SP\Mvc\View\Template;

getIconHelp()->getIcon(); ?>
+ class="icon material-icons getIconHelp()->getClass(); ?>"> + getIconHelp()->getIcon(); ?> +

diff --git a/lib/SP/Config/Config.php b/lib/SP/Config/Config.php index a1d78ccc..d05b6c52 100644 --- a/lib/SP/Config/Config.php +++ b/lib/SP/Config/Config.php @@ -27,7 +27,7 @@ namespace SP\Config; use Defuse\Crypto\Exception\EnvironmentIsBrokenException; use Exception; use Psr\Container\ContainerInterface; -use ReflectionObject; +use SP\Core\AppInfoInterface; use SP\Core\Context\ContextInterface; use SP\Core\Exceptions\ConfigException; use SP\Services\Config\ConfigBackupService; @@ -107,6 +107,12 @@ final class Config ) { $this->configData = $this->fileCache->load(); + if ($this->configData->count() === 0) { + $this->fileCache->delete(); + $this->initialize(); + return; + } + logger('Config cache loaded'); } else { if (file_exists($this->fileStorage->getFileHandler()->getFile())) { @@ -160,21 +166,28 @@ final class Config * @throws FileException */ public function loadConfigFromFile() + { + return $this->configMapper($this->fileStorage->load('config')->getItems()); + } + + /** + * Map the config array keys with ConfigData class setters + * + * @param array $items + * + * @return ConfigData + */ + private function configMapper(array $items) { $configData = new ConfigData(); - // Mapear el array de elementos de configuración con las propiedades de la clase configData - $items = $this->fileStorage->load('config')->getItems(); - $reflectionObject = new ReflectionObject($configData); + foreach ($items as $item => $value) { + $methodName = 'set' . ucfirst($item); - foreach ($reflectionObject->getProperties() as $property) { - $property->setAccessible(true); - - if (isset($items[$property->getName()])) { - $property->setValue($configData, $items[$property->getName()]); + if (method_exists($configData, $methodName)) { + $configData->$methodName($value); } - $property->setAccessible(false); } return $configData; @@ -197,10 +210,12 @@ final class Config } $configData->setConfigDate(time()); - $configData->setConfigSaver($this->context->getUserData()->getLogin() ?: 'sysPass'); + $configData->setConfigSaver($this->context->getUserData()->getLogin() ?: AppInfoInterface::APP_NAME); $configData->setConfigHash(); - $this->fileStorage->save($configData, 'config'); + // Save only attributes to avoid a parent attributes node within the XML + $this->fileStorage->save($configData->getAttributes(), 'config'); + // Save the class object (serialized) $this->fileCache->save($configData); $this->configData = $configData; diff --git a/lib/SP/Config/ConfigData.php b/lib/SP/Config/ConfigData.php index 92de9aca..af1e7971 100644 --- a/lib/SP/Config/ConfigData.php +++ b/lib/SP/Config/ConfigData.php @@ -25,409 +25,56 @@ namespace SP\Config; use JsonSerializable; +use SP\Core\DataCollection; /** * Class configData * * @package SP\Config */ -final class ConfigData implements JsonSerializable +final class ConfigData extends DataCollection implements JsonSerializable { - /** - * @var string - */ - private $upgradeKey; - /** - * @var bool - */ - private $dokuwikiEnabled = false; - /** - * @var string - */ - private $dokuwikiUrl; - /** - * @var string - */ - private $dokuwikiUrlBase; - /** - * @var string - */ - private $dokuwikiUser; - /** - * @var string - */ - private $dokuwikiPass; - /** - * @var string - */ - private $dokuwikiNamespace; - /** - * @var int - */ - private $ldapDefaultGroup; - /** - * @var int - */ - private $ldapDefaultProfile; - /** - * @var bool - */ - private $proxyEnabled = false; - /** - * @var string - */ - private $proxyServer; - /** - * @var int - */ - private $proxyPort = 8080; - /** - * @var string - */ - private $proxyUser; - /** - * @var string - */ - private $proxyPass; - /** - * @var int - */ - private $publinksMaxViews = 3; - /** - * @var int - */ - private $publinksMaxTime = 600; - /** - * @var bool - */ - private $publinksEnabled = false; - /** - * @var int - */ - private $accountCount = 12; - /** - * @var bool - */ - private $accountLink = true; - /** - * @var bool - */ - private $checkUpdates = false; - /** - * @var bool - */ - private $checknotices = false; - /** - * @var string - */ - private $configHash; - /** - * @var string - */ - private $dbHost; - /** - * @var string - */ - private $dbSocket; - /** - * @var string - */ - private $dbName; - /** - * @var string - */ - private $dbPass; - /** - * @var string - */ - private $dbUser; - /** - * @var int - */ - private $dbPort = 3306; - /** - * @var bool - */ - private $debug = false; - /** - * @var bool - */ - private $demoEnabled = false; - /** - * @var array - */ - private $filesAllowedExts = []; - /** - * @var array - */ - private $filesAllowedMime = []; - /** - * @var int - */ - private $filesAllowedSize = 1024; - /** - * @var bool - */ - private $filesEnabled = true; - /** - * @var bool - */ - private $globalSearch = true; - /** - * @var bool - */ - private $installed = false; - /** - * @var string - */ - private $ldapBase; - /** - * @var string - */ - private $ldapBindUser; - /** - * @var string - */ - private $ldapBindPass; - /** - * @var string - */ - private $ldapProxyUser; - /** - * @var bool - */ - private $ldapEnabled = false; - /** - * @var bool - */ - private $ldapAds = false; - /** - * @var int - */ - private $ldapType; - /** - * @var string - */ - private $ldapGroup; - /** - * @var string - */ - private $ldapServer; - /** - * @var bool - */ - private $logEnabled = true; - /** - * @var array - */ - private $logEvents = []; - /** - * @var bool - */ - private $mailAuthenabled = false; - /** - * @var bool - */ - private $mailEnabled = false; - /** - * @var string - */ - private $mailFrom; - /** - * @var string - */ - private $mailPass; - /** - * @var int - */ - private $mailPort = 25; - /** - * @var bool - */ - private $mailRequestsEnabled = false; - /** - * @var string - */ - private $mailSecurity; - /** - * @var string - */ - private $mailServer; - /** - * @var string - */ - private $mailUser; - /** - * @var array - */ - private $mailRecipients = []; - /** - * @var array - */ - private $mailEvents = []; - /** - * @var bool - */ - private $maintenance = false; - /** - * @var string - */ - private $passwordSalt; - /** - * @var bool - */ - private $resultsAsCards = false; - /** - * @var int - */ - private $sessionTimeout = 300; - /** - * @var string - */ - private $siteLang; - /** - * @var string - */ - private $siteTheme = 'material-blue'; - /** - * @var string - */ - private $configVersion; - /** - * @var string - */ - private $appVersion; - /** - * @var string - */ - private $databaseVersion; - /** - * @var bool - */ - private $wikiEnabled = false; - /** - * @var array - */ - private $wikiFilter = []; - /** - * @var string - */ - private $wikiPageurl; - /** - * @var string - */ - private $wikiSearchurl; - /** - * @var int - */ - private $configDate = 0; - /** - * @var bool - */ - private $publinksImageEnabled = false; - /** - * @var string - */ - private $backup_hash; - /** - * @var string - */ - private $export_hash; - /** - * @var bool - */ - private $httpsEnabled = false; - /** - * @var bool - */ - private $syslogEnabled = false; - /** - * @var bool - */ - private $syslogRemoteEnabled = false; - /** - * @var string - */ - private $syslogServer; - /** - * @var int - */ - private $syslogPort = 514; - /** - * @var bool - */ - private $accountPassToImage = false; - /** - * @var string - */ - private $configSaver; - /** - * @var bool - */ - private $encryptSession = false; - /** - * @var bool - */ - private $accountFullGroupAccess = false; - /** - * @var bool - */ - private $authBasicEnabled = true; - /** - * @var bool - */ - private $authBasicAutoLoginEnabled = true; - /** - * @var string - */ - private $authBasicDomain; - /** - * @var int - */ - private $ssoDefaultGroup; - /** - * @var int - */ - private $ssoDefaultProfile; - /** - * @var bool - */ - private $accountExpireEnabled = false; - /** - * @var int - */ - private $accountExpireTime = 10368000; - /** - * @var bool - */ - private $ldapTlsEnabled = false; - /** - * @var string - */ - private $applicationUrl; + const PUBLIC_LINK_MAX_VIEWS = 3; + const PUBLIC_LINK_MAX_TIME = 600; + const ACCOUNT_COUNT = 12; + const DB_PORT = 3306; + const FILES_ALLOWED_SIZE = 1024; + const MAIL_PORT = 587; + const SESSION_TIMEOUT = 300; + const SITE_THEME = 'material-blue'; + const SYSLOG_PORT = 514; + const ACCOUNT_EXPIRE_TIME = 10368000; /** * @return array */ - public function getLogEvents() + public function getAttributes(): array { - return is_array($this->logEvents) ? $this->logEvents : []; + return $this->attributes; + } + + /** + * @return array + */ + public function getLogEvents(): array + { + return $this->get('logEvents', []); } /** * @param array $logEvents */ - public function setLogEvents(array $logEvents) + public function setLogEvents($logEvents) { - $this->logEvents = $logEvents; + $this->set('logEvents', $logEvents ?: []); } /** * @return boolean */ - public function isDokuwikiEnabled() + public function isDokuwikiEnabled(): bool { - return $this->dokuwikiEnabled; + return $this->get('dokuwikiEnabled', false); } /** @@ -437,7 +84,7 @@ final class ConfigData implements JsonSerializable */ public function setDokuwikiEnabled($dokuwikiEnabled) { - $this->dokuwikiEnabled = (bool)$dokuwikiEnabled; + $this->set('dokuwikiEnabled', (bool)$dokuwikiEnabled); return $this; } @@ -447,7 +94,7 @@ final class ConfigData implements JsonSerializable */ public function getDokuwikiUrl() { - return $this->dokuwikiUrl; + return $this->get('dokuwikiUrl'); } /** @@ -457,7 +104,7 @@ final class ConfigData implements JsonSerializable */ public function setDokuwikiUrl($dokuwikiUrl) { - $this->dokuwikiUrl = $dokuwikiUrl; + $this->set('dokuwikiUrl', $dokuwikiUrl); return $this; } @@ -467,7 +114,7 @@ final class ConfigData implements JsonSerializable */ public function getDokuwikiUrlBase() { - return $this->dokuwikiUrlBase; + return $this->get('dokuwikiUrlBase'); } /** @@ -477,7 +124,7 @@ final class ConfigData implements JsonSerializable */ public function setDokuwikiUrlBase($dokuwikiUrlBase) { - $this->dokuwikiUrlBase = $dokuwikiUrlBase; + $this->set('dokuwikiUrlBase', $dokuwikiUrlBase); return $this; } @@ -487,7 +134,7 @@ final class ConfigData implements JsonSerializable */ public function getDokuwikiUser() { - return $this->dokuwikiUser; + return $this->get('dokuwikiUser'); } /** @@ -497,7 +144,7 @@ final class ConfigData implements JsonSerializable */ public function setDokuwikiUser($dokuwikiUser) { - $this->dokuwikiUser = $dokuwikiUser; + $this->set('dokuwikiUser', $dokuwikiUser); return $this; } @@ -507,7 +154,7 @@ final class ConfigData implements JsonSerializable */ public function getDokuwikiPass() { - return $this->dokuwikiPass; + return $this->get('dokuwikiPass'); } /** @@ -517,7 +164,7 @@ final class ConfigData implements JsonSerializable */ public function setDokuwikiPass($dokuwikiPass) { - $this->dokuwikiPass = $dokuwikiPass; + $this->set('dokuwikiPass', $dokuwikiPass); return $this; } @@ -527,7 +174,7 @@ final class ConfigData implements JsonSerializable */ public function getDokuwikiNamespace() { - return $this->dokuwikiNamespace; + return $this->get('dokuwikiNamespace'); } /** @@ -537,7 +184,7 @@ final class ConfigData implements JsonSerializable */ public function setDokuwikiNamespace($dokuwikiNamespace) { - $this->dokuwikiNamespace = $dokuwikiNamespace; + $this->set('dokuwikiNamespace', $dokuwikiNamespace); return $this; } @@ -545,9 +192,9 @@ final class ConfigData implements JsonSerializable /** * @return int */ - public function getLdapDefaultGroup() + public function getLdapDefaultGroup(): int { - return (int)$this->ldapDefaultGroup; + return (int)$this->get('ldapDefaultGroup'); } /** @@ -557,7 +204,7 @@ final class ConfigData implements JsonSerializable */ public function setLdapDefaultGroup($ldapDefaultGroup) { - $this->ldapDefaultGroup = (int)$ldapDefaultGroup; + $this->set('ldapDefaultGroup', (int)$ldapDefaultGroup); return $this; } @@ -565,9 +212,9 @@ final class ConfigData implements JsonSerializable /** * @return int */ - public function getLdapDefaultProfile() + public function getLdapDefaultProfile(): int { - return (int)$this->ldapDefaultProfile; + return (int)$this->get('ldapDefaultProfile'); } /** @@ -577,7 +224,7 @@ final class ConfigData implements JsonSerializable */ public function setLdapDefaultProfile($ldapDefaultProfile) { - $this->ldapDefaultProfile = (int)$ldapDefaultProfile; + $this->set('ldapDefaultProfile', (int)$ldapDefaultProfile); return $this; } @@ -587,7 +234,7 @@ final class ConfigData implements JsonSerializable */ public function isProxyEnabled() { - return $this->proxyEnabled; + return $this->get('proxyEnabled', false); } /** @@ -597,7 +244,7 @@ final class ConfigData implements JsonSerializable */ public function setProxyEnabled($proxyEnabled) { - $this->proxyEnabled = (bool)$proxyEnabled; + $this->set('proxyEnabled', (bool)$proxyEnabled); return $this; } @@ -607,7 +254,7 @@ final class ConfigData implements JsonSerializable */ public function getProxyServer() { - return $this->proxyServer; + return $this->get('proxyServer'); } /** @@ -617,7 +264,7 @@ final class ConfigData implements JsonSerializable */ public function setProxyServer($proxyServer) { - $this->proxyServer = $proxyServer; + $this->set('proxyServer', $proxyServer); return $this; } @@ -627,7 +274,7 @@ final class ConfigData implements JsonSerializable */ public function getProxyPort() { - return $this->proxyPort; + return $this->get('proxyPort', 8080); } /** @@ -637,7 +284,7 @@ final class ConfigData implements JsonSerializable */ public function setProxyPort($proxyPort) { - $this->proxyPort = (int)$proxyPort; + $this->set('proxyPort', (int)$proxyPort); return $this; } @@ -647,7 +294,7 @@ final class ConfigData implements JsonSerializable */ public function getProxyUser() { - return $this->proxyUser; + return $this->get('proxyUser'); } /** @@ -657,7 +304,7 @@ final class ConfigData implements JsonSerializable */ public function setProxyUser($proxyUser) { - $this->proxyUser = $proxyUser; + $this->set('proxyUser', $proxyUser); return $this; } @@ -667,7 +314,7 @@ final class ConfigData implements JsonSerializable */ public function getProxyPass() { - return $this->proxyPass; + return $this->get('proxyPass'); } /** @@ -677,7 +324,7 @@ final class ConfigData implements JsonSerializable */ public function setProxyPass($proxyPass) { - $this->proxyPass = $proxyPass; + $this->set('proxyPass', $proxyPass); return $this; } @@ -687,7 +334,7 @@ final class ConfigData implements JsonSerializable */ public function getPublinksMaxViews() { - return $this->publinksMaxViews; + return $this->get('publinksMaxViews', self::PUBLIC_LINK_MAX_VIEWS); } @@ -698,7 +345,7 @@ final class ConfigData implements JsonSerializable */ public function setPublinksMaxViews($publinksMaxViews) { - $this->publinksMaxViews = (int)$publinksMaxViews; + $this->set('publinksMaxViews', (int)$publinksMaxViews); return $this; } @@ -708,7 +355,7 @@ final class ConfigData implements JsonSerializable */ public function getPublinksMaxTime() { - return $this->publinksMaxTime; + return $this->get('publinksMaxTime', self::PUBLIC_LINK_MAX_TIME); } /** @@ -718,7 +365,7 @@ final class ConfigData implements JsonSerializable */ public function setPublinksMaxTime($publinksMaxTime) { - $this->publinksMaxTime = (int)$publinksMaxTime; + $this->set('publinksMaxTime', (int)$publinksMaxTime); return $this; } @@ -728,7 +375,7 @@ final class ConfigData implements JsonSerializable */ public function isSyslogEnabled() { - return $this->syslogEnabled; + return $this->get('syslogEnabled', false); } /** @@ -738,7 +385,7 @@ final class ConfigData implements JsonSerializable */ public function setSyslogEnabled($syslogEnabled) { - $this->syslogEnabled = (bool)$syslogEnabled; + $this->set('syslogEnabled', (bool)$syslogEnabled); return $this; } @@ -748,7 +395,7 @@ final class ConfigData implements JsonSerializable */ public function isSyslogRemoteEnabled() { - return $this->syslogRemoteEnabled; + return $this->get('syslogRemoteEnabled', false); } /** @@ -758,7 +405,7 @@ final class ConfigData implements JsonSerializable */ public function setSyslogRemoteEnabled($syslogRemoteEnabled) { - $this->syslogRemoteEnabled = (bool)$syslogRemoteEnabled; + $this->set('syslogRemoteEnabled', (bool)$syslogRemoteEnabled); return $this; } @@ -768,7 +415,7 @@ final class ConfigData implements JsonSerializable */ public function getSyslogServer() { - return $this->syslogServer; + return $this->get('syslogServer'); } /** @@ -778,7 +425,7 @@ final class ConfigData implements JsonSerializable */ public function setSyslogServer($syslogServer) { - $this->syslogServer = $syslogServer; + $this->set('syslogServer', $syslogServer); return $this; } @@ -788,7 +435,7 @@ final class ConfigData implements JsonSerializable */ public function getSyslogPort() { - return $this->syslogPort; + return $this->get('syslogPort', self::SYSLOG_PORT); } /** @@ -798,7 +445,7 @@ final class ConfigData implements JsonSerializable */ public function setSyslogPort($syslogPort) { - $this->syslogPort = (int)$syslogPort; + $this->set('syslogPort', (int)$syslogPort); return $this; } @@ -808,7 +455,7 @@ final class ConfigData implements JsonSerializable */ public function getBackupHash() { - return $this->backup_hash; + return $this->get('backup_hash'); } /** @@ -818,7 +465,7 @@ final class ConfigData implements JsonSerializable */ public function setBackupHash($backup_hash) { - $this->backup_hash = $backup_hash; + $this->set('backup_hash', $backup_hash); return $this; } @@ -828,7 +475,7 @@ final class ConfigData implements JsonSerializable */ public function getExportHash() { - return $this->export_hash; + return $this->get('export_hash'); } /** @@ -838,7 +485,7 @@ final class ConfigData implements JsonSerializable */ public function setExportHash($export_hash) { - $this->export_hash = $export_hash; + $this->set('export_hash', $export_hash); return $this; } @@ -848,7 +495,7 @@ final class ConfigData implements JsonSerializable */ public function getLdapBindUser() { - return $this->ldapBindUser; + return $this->get('ldapBindUser'); } /** @@ -858,7 +505,7 @@ final class ConfigData implements JsonSerializable */ public function setLdapBindUser($ldapBindUser) { - $this->ldapBindUser = $ldapBindUser; + $this->set('ldapBindUser', $ldapBindUser); return $this; } @@ -868,7 +515,7 @@ final class ConfigData implements JsonSerializable */ public function getLdapProxyUser() { - return $this->ldapProxyUser; + return $this->get('ldapProxyUser'); } /** @@ -878,7 +525,7 @@ final class ConfigData implements JsonSerializable */ public function setLdapProxyUser($ldapProxyUser) { - $this->ldapProxyUser = $ldapProxyUser; + $this->get('ldapProxyUser', $ldapProxyUser); return $this; } @@ -888,7 +535,7 @@ final class ConfigData implements JsonSerializable */ public function getAccountCount() { - return $this->accountCount; + return $this->get('accountCount', self::ACCOUNT_COUNT); } /** @@ -898,7 +545,7 @@ final class ConfigData implements JsonSerializable */ public function setAccountCount($accountCount) { - $this->accountCount = (int)$accountCount; + $this->set('accountCount', (int)$accountCount); return $this; } @@ -908,7 +555,7 @@ final class ConfigData implements JsonSerializable */ public function isAccountLink() { - return $this->accountLink; + return $this->get('accountLink', true); } /** @@ -918,7 +565,7 @@ final class ConfigData implements JsonSerializable */ public function setAccountLink($accountLink) { - $this->accountLink = (bool)$accountLink; + $this->set('accountLink', (bool)$accountLink); return $this; } @@ -928,7 +575,7 @@ final class ConfigData implements JsonSerializable */ public function isCheckUpdates() { - return $this->checkUpdates; + return $this->get('checkUpdates', false); } /** @@ -938,7 +585,7 @@ final class ConfigData implements JsonSerializable */ public function setCheckUpdates($checkUpdates) { - $this->checkUpdates = (bool)$checkUpdates; + $this->set('checkUpdates', (bool)$checkUpdates); return $this; } @@ -948,7 +595,7 @@ final class ConfigData implements JsonSerializable */ public function getConfigHash() { - return $this->configHash; + return $this->get('configHash'); } /** @@ -956,7 +603,7 @@ final class ConfigData implements JsonSerializable */ public function setConfigHash() { - $this->configHash = sha1(serialize($this)); + $this->set('configHash', sha1(serialize($this->attributes))); return $this; } @@ -966,7 +613,7 @@ final class ConfigData implements JsonSerializable */ public function getDbHost() { - return $this->dbHost; + return $this->get('dbHost'); } /** @@ -976,7 +623,7 @@ final class ConfigData implements JsonSerializable */ public function setDbHost($dbHost) { - $this->dbHost = $dbHost; + $this->set('dbHost', $dbHost); return $this; } @@ -986,7 +633,7 @@ final class ConfigData implements JsonSerializable */ public function getDbName() { - return $this->dbName; + return $this->get('dbName'); } /** @@ -996,7 +643,7 @@ final class ConfigData implements JsonSerializable */ public function setDbName($dbName) { - $this->dbName = $dbName; + $this->set('dbName', $dbName); return $this; } @@ -1006,7 +653,7 @@ final class ConfigData implements JsonSerializable */ public function getDbPass() { - return $this->dbPass; + return $this->get('dbPass'); } /** @@ -1016,7 +663,7 @@ final class ConfigData implements JsonSerializable */ public function setDbPass($dbPass) { - $this->dbPass = $dbPass; + $this->set('dbPass', $dbPass); return $this; } @@ -1026,7 +673,7 @@ final class ConfigData implements JsonSerializable */ public function getDbUser() { - return $this->dbUser; + return $this->get('dbUser'); } /** @@ -1036,7 +683,7 @@ final class ConfigData implements JsonSerializable */ public function setDbUser($dbUser) { - $this->dbUser = $dbUser; + $this->set('dbUser', $dbUser); return $this; } @@ -1046,7 +693,7 @@ final class ConfigData implements JsonSerializable */ public function isDebug() { - return $this->debug; + return $this->get('debug', false); } /** @@ -1056,7 +703,7 @@ final class ConfigData implements JsonSerializable */ public function setDebug($debug) { - $this->debug = (bool)$debug; + $this->set('debug', (bool)$debug); return $this; } @@ -1066,7 +713,7 @@ final class ConfigData implements JsonSerializable */ public function isDemoEnabled() { - return $this->demoEnabled; + return $this->get('demoEnabled', false); } /** @@ -1076,7 +723,7 @@ final class ConfigData implements JsonSerializable */ public function setDemoEnabled($demoEnabled) { - $this->demoEnabled = (bool)$demoEnabled; + $this->set('demoEnabled', (bool)$demoEnabled); return $this; } @@ -1084,9 +731,9 @@ final class ConfigData implements JsonSerializable /** * @return array */ - public function getFilesAllowedExts() + public function getFilesAllowedExts(): array { - return (array)$this->filesAllowedExts; + return $this->get('filesAllowedExts', []); } /** @@ -1094,7 +741,7 @@ final class ConfigData implements JsonSerializable */ public function getFilesAllowedSize() { - return $this->filesAllowedSize; + return $this->get('filesAllowedSize', self::FILES_ALLOWED_SIZE); } /** @@ -1104,7 +751,7 @@ final class ConfigData implements JsonSerializable */ public function setFilesAllowedSize($filesAllowedSize) { - $this->filesAllowedSize = (int)$filesAllowedSize; + $this->set('filesAllowedSize', (int)$filesAllowedSize); return $this; } @@ -1114,7 +761,7 @@ final class ConfigData implements JsonSerializable */ public function isFilesEnabled() { - return $this->filesEnabled; + return $this->get('filesEnabled', true); } /** @@ -1124,7 +771,7 @@ final class ConfigData implements JsonSerializable */ public function setFilesEnabled($filesEnabled) { - $this->filesEnabled = (bool)$filesEnabled; + $this->set('filesEnabled', (bool)$filesEnabled); return $this; } @@ -1134,7 +781,7 @@ final class ConfigData implements JsonSerializable */ public function isGlobalSearch() { - return $this->globalSearch; + return $this->get('globalSearch', true); } /** @@ -1144,7 +791,7 @@ final class ConfigData implements JsonSerializable */ public function setGlobalSearch($globalSearch) { - $this->globalSearch = (bool)$globalSearch; + $this->set('globalSearch', (bool)$globalSearch); return $this; } @@ -1154,7 +801,7 @@ final class ConfigData implements JsonSerializable */ public function isInstalled() { - return $this->installed; + return $this->get('installed', false); } /** @@ -1164,7 +811,7 @@ final class ConfigData implements JsonSerializable */ public function setInstalled($installed) { - $this->installed = (bool)$installed; + $this->set('installed', (bool)$installed); return $this; } @@ -1174,7 +821,7 @@ final class ConfigData implements JsonSerializable */ public function getLdapBase() { - return $this->ldapBase; + return $this->get('ldapBase'); } /** @@ -1184,7 +831,7 @@ final class ConfigData implements JsonSerializable */ public function setLdapBase($ldapBase) { - $this->ldapBase = $ldapBase; + $this->set('ldapBase', $ldapBase); return $this; } @@ -1194,7 +841,7 @@ final class ConfigData implements JsonSerializable */ public function isLdapEnabled() { - return $this->ldapEnabled; + return $this->get('ldapEnabled', false); } /** @@ -1204,7 +851,7 @@ final class ConfigData implements JsonSerializable */ public function setLdapEnabled($ldapEnabled) { - $this->ldapEnabled = (bool)$ldapEnabled; + $this->set('ldapEnabled', (bool)$ldapEnabled); return $this; } @@ -1214,7 +861,7 @@ final class ConfigData implements JsonSerializable */ public function getLdapGroup() { - return $this->ldapGroup; + return $this->get('ldapGroup'); } /** @@ -1224,7 +871,7 @@ final class ConfigData implements JsonSerializable */ public function setLdapGroup($ldapGroup) { - $this->ldapGroup = $ldapGroup; + $this->set('ldapGroup', $ldapGroup); return $this; } @@ -1234,7 +881,7 @@ final class ConfigData implements JsonSerializable */ public function getLdapServer() { - return $this->ldapServer; + return $this->get('ldapServer'); } /** @@ -1244,7 +891,7 @@ final class ConfigData implements JsonSerializable */ public function setLdapServer($ldapServer) { - $this->ldapServer = $ldapServer; + $this->set('ldapServer', $ldapServer); return $this; } @@ -1254,7 +901,7 @@ final class ConfigData implements JsonSerializable */ public function isLogEnabled() { - return $this->logEnabled; + return $this->get('logEnabled', true); } /** @@ -1264,7 +911,7 @@ final class ConfigData implements JsonSerializable */ public function setLogEnabled($logEnabled) { - $this->logEnabled = (bool)$logEnabled; + $this->set('logEnabled', (bool)$logEnabled); return $this; } @@ -1274,7 +921,7 @@ final class ConfigData implements JsonSerializable */ public function isMailAuthenabled() { - return $this->mailAuthenabled; + return $this->get('mailAuthenabled', false); } /** @@ -1284,7 +931,7 @@ final class ConfigData implements JsonSerializable */ public function setMailAuthenabled($mailAuthenabled) { - $this->mailAuthenabled = (bool)$mailAuthenabled; + $this->set('mailAuthenabled', (bool)$mailAuthenabled); return $this; } @@ -1294,7 +941,7 @@ final class ConfigData implements JsonSerializable */ public function isMailEnabled() { - return $this->mailEnabled; + return $this->get('mailEnabled', false); } /** @@ -1304,7 +951,7 @@ final class ConfigData implements JsonSerializable */ public function setMailEnabled($mailEnabled) { - $this->mailEnabled = (bool)$mailEnabled; + $this->set('mailEnabled', (bool)$mailEnabled); return $this; } @@ -1314,7 +961,7 @@ final class ConfigData implements JsonSerializable */ public function getMailFrom() { - return $this->mailFrom; + return $this->get('mailFrom'); } /** @@ -1324,7 +971,7 @@ final class ConfigData implements JsonSerializable */ public function setMailFrom($mailFrom) { - $this->mailFrom = $mailFrom; + $this->set('mailFrom', $mailFrom); return $this; } @@ -1334,7 +981,7 @@ final class ConfigData implements JsonSerializable */ public function getMailPass() { - return $this->mailPass; + return $this->get('mailPass'); } /** @@ -1344,7 +991,7 @@ final class ConfigData implements JsonSerializable */ public function setMailPass($mailPass) { - $this->mailPass = $mailPass; + $this->set('mailPass', $mailPass); return $this; } @@ -1354,7 +1001,7 @@ final class ConfigData implements JsonSerializable */ public function getMailPort() { - return $this->mailPort; + return $this->get('mailPort', self::MAIL_PORT); } /** @@ -1364,7 +1011,7 @@ final class ConfigData implements JsonSerializable */ public function setMailPort($mailPort) { - $this->mailPort = (int)$mailPort; + $this->set('mailPort', (int)$mailPort); return $this; } @@ -1374,7 +1021,7 @@ final class ConfigData implements JsonSerializable */ public function isMailRequestsEnabled() { - return $this->mailRequestsEnabled; + return $this->get('mailRequestsEnabled', false); } /** @@ -1384,7 +1031,7 @@ final class ConfigData implements JsonSerializable */ public function setMailRequestsEnabled($mailRequestsEnabled) { - $this->mailRequestsEnabled = (bool)$mailRequestsEnabled; + $this->set('mailRequestsEnabled', (bool)$mailRequestsEnabled); return $this; } @@ -1394,7 +1041,7 @@ final class ConfigData implements JsonSerializable */ public function getMailSecurity() { - return $this->mailSecurity; + return $this->get('mailSecurity'); } /** @@ -1404,7 +1051,7 @@ final class ConfigData implements JsonSerializable */ public function setMailSecurity($mailSecurity) { - $this->mailSecurity = $mailSecurity; + $this->set('mailSecurity', $mailSecurity); return $this; } @@ -1414,7 +1061,7 @@ final class ConfigData implements JsonSerializable */ public function getMailServer() { - return $this->mailServer; + return $this->get('mailServer'); } /** @@ -1424,7 +1071,7 @@ final class ConfigData implements JsonSerializable */ public function setMailServer($mailServer) { - $this->mailServer = $mailServer; + $this->set('mailServer', $mailServer); return $this; } @@ -1434,7 +1081,7 @@ final class ConfigData implements JsonSerializable */ public function getMailUser() { - return $this->mailUser; + return $this->get('mailUser'); } /** @@ -1444,7 +1091,7 @@ final class ConfigData implements JsonSerializable */ public function setMailUser($mailUser) { - $this->mailUser = $mailUser; + $this->set('mailUser', $mailUser); return $this; } @@ -1454,7 +1101,7 @@ final class ConfigData implements JsonSerializable */ public function isMaintenance() { - return (bool)$this->maintenance; + return $this->get('maintenance', false); } /** @@ -1464,7 +1111,7 @@ final class ConfigData implements JsonSerializable */ public function setMaintenance($maintenance) { - $this->maintenance = (bool)$maintenance; + $this->set('maintenance', (bool)$maintenance); return $this; } @@ -1474,7 +1121,7 @@ final class ConfigData implements JsonSerializable */ public function getPasswordSalt() { - return $this->passwordSalt; + return $this->get('passwordSalt'); } /** @@ -1484,7 +1131,7 @@ final class ConfigData implements JsonSerializable */ public function setPasswordSalt($passwordSalt) { - $this->passwordSalt = $passwordSalt; + $this->set('passwordSalt', $passwordSalt); return $this; } @@ -1494,7 +1141,7 @@ final class ConfigData implements JsonSerializable */ public function isResultsAsCards() { - return $this->resultsAsCards; + return $this->get('resultsAsCards', false); } /** @@ -1504,7 +1151,7 @@ final class ConfigData implements JsonSerializable */ public function setResultsAsCards($resultsAsCards) { - $this->resultsAsCards = (bool)$resultsAsCards; + $this->set('resultsAsCards', (bool)$resultsAsCards); return $this; } @@ -1514,7 +1161,7 @@ final class ConfigData implements JsonSerializable */ public function getSessionTimeout() { - return $this->sessionTimeout; + return $this->get('sessionTimeout', self::SESSION_TIMEOUT); } /** @@ -1524,7 +1171,7 @@ final class ConfigData implements JsonSerializable */ public function setSessionTimeout($sessionTimeout) { - $this->sessionTimeout = (int)$sessionTimeout; + $this->set('sessionTimeout', (int)$sessionTimeout); return $this; } @@ -1534,7 +1181,7 @@ final class ConfigData implements JsonSerializable */ public function getSiteLang() { - return $this->siteLang; + return $this->get('siteLang'); } /** @@ -1544,7 +1191,7 @@ final class ConfigData implements JsonSerializable */ public function setSiteLang($siteLang) { - $this->siteLang = $siteLang; + $this->set('siteLang', $siteLang); return $this; } @@ -1554,7 +1201,7 @@ final class ConfigData implements JsonSerializable */ public function getSiteTheme() { - return $this->siteTheme; + return $this->get('siteTheme', self::SITE_THEME); } /** @@ -1564,17 +1211,17 @@ final class ConfigData implements JsonSerializable */ public function setSiteTheme($siteTheme) { - $this->siteTheme = $siteTheme; + $this->set('siteTheme', $siteTheme); return $this; } /** - * @return int + * @return string */ public function getConfigVersion() { - return (string)$this->configVersion; + return (string)$this->get('configVersion'); } /** @@ -1584,7 +1231,7 @@ final class ConfigData implements JsonSerializable */ public function setConfigVersion($configVersion) { - $this->configVersion = $configVersion; + $this->set('configVersion', $configVersion); return $this; } @@ -1594,7 +1241,7 @@ final class ConfigData implements JsonSerializable */ public function isWikiEnabled() { - return $this->wikiEnabled; + return $this->get('wikiEnabled', false); } /** @@ -1604,7 +1251,7 @@ final class ConfigData implements JsonSerializable */ public function setWikiEnabled($wikiEnabled) { - $this->wikiEnabled = (bool)$wikiEnabled; + $this->set('wikiEnabled', (bool)$wikiEnabled); return $this; } @@ -1614,7 +1261,7 @@ final class ConfigData implements JsonSerializable */ public function getWikiFilter() { - return is_array($this->wikiFilter) ? $this->wikiFilter : []; + return $this->get('wikiFilter', []); } /** @@ -1624,7 +1271,7 @@ final class ConfigData implements JsonSerializable */ public function setWikiFilter($wikiFilter) { - $this->wikiFilter = $wikiFilter; + $this->set('wikiFilter', $wikiFilter ?: []); return $this; } @@ -1634,7 +1281,7 @@ final class ConfigData implements JsonSerializable */ public function getWikiPageurl() { - return $this->wikiPageurl; + return $this->get('wikiPageurl'); } /** @@ -1644,7 +1291,7 @@ final class ConfigData implements JsonSerializable */ public function setWikiPageurl($wikiPageurl) { - $this->wikiPageurl = $wikiPageurl; + $this->set('wikiPageurl', $wikiPageurl); return $this; } @@ -1654,7 +1301,7 @@ final class ConfigData implements JsonSerializable */ public function getWikiSearchurl() { - return $this->wikiSearchurl; + return $this->get('wikiSearchurl'); } /** @@ -1664,27 +1311,7 @@ final class ConfigData implements JsonSerializable */ public function setWikiSearchurl($wikiSearchurl) { - $this->wikiSearchurl = $wikiSearchurl; - - return $this; - } - - /** - * @return boolean - */ - public function isLdapAds() - { - return $this->ldapAds; - } - - /** - * @param boolean $ldapAds - * - * @return $this - */ - public function setLdapAds($ldapAds) - { - $this->ldapAds = (bool)$ldapAds; + $this->set('wikiSearchurl', $wikiSearchurl); return $this; } @@ -1694,7 +1321,7 @@ final class ConfigData implements JsonSerializable */ public function getLdapBindPass() { - return $this->ldapBindPass; + return $this->get('ldapBindPass'); } /** @@ -1704,7 +1331,7 @@ final class ConfigData implements JsonSerializable */ public function setLdapBindPass($ldapBindPass) { - $this->ldapBindPass = $ldapBindPass; + $this->set('ldapBindPass', $ldapBindPass); return $this; } @@ -1714,7 +1341,7 @@ final class ConfigData implements JsonSerializable */ public function isPublinksImageEnabled() { - return $this->publinksImageEnabled; + return $this->get('publinksImageEnabled', false); } /** @@ -1724,7 +1351,7 @@ final class ConfigData implements JsonSerializable */ public function setPublinksImageEnabled($publinksImageEnabled) { - $this->publinksImageEnabled = (bool)$publinksImageEnabled; + $this->set('publinksImageEnabled', (bool)$publinksImageEnabled); return $this; } @@ -1734,7 +1361,7 @@ final class ConfigData implements JsonSerializable */ public function isHttpsEnabled() { - return $this->httpsEnabled; + return $this->get('httpsEnabled', false); } /** @@ -1744,7 +1371,7 @@ final class ConfigData implements JsonSerializable */ public function setHttpsEnabled($httpsEnabled) { - $this->httpsEnabled = (bool)$httpsEnabled; + $this->set('httpsEnabled', (bool)$httpsEnabled); return $this; } @@ -1754,7 +1381,7 @@ final class ConfigData implements JsonSerializable */ public function isChecknotices() { - return $this->checknotices; + return $this->get('checkNotices', false); } /** @@ -1762,9 +1389,9 @@ final class ConfigData implements JsonSerializable * * @return $this */ - public function setChecknotices($checknotices) + public function setCheckNotices($checknotices) { - $this->checknotices = $checknotices; + $this->set('checkNotices', $checknotices); return $this; } @@ -1774,7 +1401,7 @@ final class ConfigData implements JsonSerializable */ public function isAccountPassToImage() { - return $this->accountPassToImage; + return $this->get('accountPassToImage', false); } /** @@ -1784,7 +1411,7 @@ final class ConfigData implements JsonSerializable */ public function setAccountPassToImage($accountPassToImage) { - $this->accountPassToImage = (bool)$accountPassToImage; + $this->set('accountPassToImage', (bool)$accountPassToImage); return $this; } @@ -1794,7 +1421,7 @@ final class ConfigData implements JsonSerializable */ public function getUpgradeKey() { - return $this->upgradeKey; + return $this->get('upgradeKey'); } /** @@ -1804,7 +1431,7 @@ final class ConfigData implements JsonSerializable */ public function setUpgradeKey($upgradeKey) { - $this->upgradeKey = $upgradeKey; + $this->set('upgradeKey', $upgradeKey); return $this; } @@ -1814,7 +1441,7 @@ final class ConfigData implements JsonSerializable */ public function getDbPort() { - return $this->dbPort; + return $this->get('dbPort', self::DB_PORT); } /** @@ -1824,7 +1451,7 @@ final class ConfigData implements JsonSerializable */ public function setDbPort($dbPort) { - $this->dbPort = (int)$dbPort; + $this->set('dbPort', (int)$dbPort); return $this; } @@ -1834,7 +1461,7 @@ final class ConfigData implements JsonSerializable */ public function isPublinksEnabled() { - return $this->publinksEnabled; + return $this->get('publinksEnabled', false); } /** @@ -1844,7 +1471,7 @@ final class ConfigData implements JsonSerializable */ public function setPublinksEnabled($publinksEnabled) { - $this->publinksEnabled = (bool)$publinksEnabled; + $this->set('publinksEnabled', (bool)$publinksEnabled); return $this; } @@ -1859,7 +1486,7 @@ final class ConfigData implements JsonSerializable */ public function jsonSerialize() { - return get_object_vars($this); + return $this->attributes; } /** @@ -1867,7 +1494,7 @@ final class ConfigData implements JsonSerializable */ public function getConfigSaver() { - return $this->configSaver; + return $this->get('configSaver'); } /** @@ -1877,7 +1504,7 @@ final class ConfigData implements JsonSerializable */ public function setConfigSaver($configSaver) { - $this->configSaver = $configSaver; + $this->set('configSaver', $configSaver); return $this; } @@ -1887,7 +1514,7 @@ final class ConfigData implements JsonSerializable */ public function getDbSocket() { - return $this->dbSocket; + return $this->get('dbSocket'); } /** @@ -1895,7 +1522,7 @@ final class ConfigData implements JsonSerializable */ public function setDbSocket($dbSocket) { - $this->dbSocket = $dbSocket; + $this->set('dbSocket', $dbSocket); } /** @@ -1903,7 +1530,7 @@ final class ConfigData implements JsonSerializable */ public function isEncryptSession() { - return (bool)$this->encryptSession; + return (bool)$this->get('encryptSession', false); } /** @@ -1913,7 +1540,7 @@ final class ConfigData implements JsonSerializable */ public function setEncryptSession($encryptSession) { - $this->encryptSession = (bool)$encryptSession; + $this->set('encryptSession', (bool)$encryptSession); return $this; } @@ -1923,7 +1550,7 @@ final class ConfigData implements JsonSerializable */ public function isAccountFullGroupAccess() { - return (bool)$this->accountFullGroupAccess; + return (bool)$this->get('accountFullGroupAccess', false); } /** @@ -1933,7 +1560,7 @@ final class ConfigData implements JsonSerializable */ public function setAccountFullGroupAccess($accountFullGroupAccess) { - $this->accountFullGroupAccess = (bool)$accountFullGroupAccess; + $this->set('accountFullGroupAccess', (bool)$accountFullGroupAccess); return $this; } @@ -1943,7 +1570,7 @@ final class ConfigData implements JsonSerializable */ public function isAuthBasicEnabled() { - return (bool)$this->authBasicEnabled; + return (bool)$this->get('authBasicEnabled', true); } /** @@ -1951,7 +1578,7 @@ final class ConfigData implements JsonSerializable */ public function setAuthBasicEnabled($authBasicEnabled) { - $this->authBasicEnabled = $authBasicEnabled; + $this->set('authBasicEnabled', $authBasicEnabled); } /** @@ -1959,7 +1586,7 @@ final class ConfigData implements JsonSerializable */ public function getAuthBasicDomain() { - return $this->authBasicDomain; + return $this->get('authBasicDomain'); } /** @@ -1967,7 +1594,7 @@ final class ConfigData implements JsonSerializable */ public function setAuthBasicDomain($authBasicDomain) { - $this->authBasicDomain = $authBasicDomain; + $this->set('authBasicDomain', $authBasicDomain); } /** @@ -1975,7 +1602,7 @@ final class ConfigData implements JsonSerializable */ public function isAuthBasicAutoLoginEnabled() { - return (bool)$this->authBasicAutoLoginEnabled; + return (bool)$this->get('authBasicAutoLoginEnabled', true); } /** @@ -1983,7 +1610,7 @@ final class ConfigData implements JsonSerializable */ public function setAuthBasicAutoLoginEnabled($authBasicAutoLoginEnabled) { - $this->authBasicAutoLoginEnabled = $authBasicAutoLoginEnabled; + $this->set('authBasicAutoLoginEnabled', $authBasicAutoLoginEnabled); } /** @@ -1991,7 +1618,7 @@ final class ConfigData implements JsonSerializable */ public function getSsoDefaultGroup() { - return $this->ssoDefaultGroup; + return $this->get('ssoDefaultGroup'); } /** @@ -1999,7 +1626,7 @@ final class ConfigData implements JsonSerializable */ public function setSsoDefaultGroup($ssoDefaultGroup) { - $this->ssoDefaultGroup = $ssoDefaultGroup; + $this->set('ssoDefaultGroup', $ssoDefaultGroup); } /** @@ -2007,7 +1634,7 @@ final class ConfigData implements JsonSerializable */ public function getSsoDefaultProfile() { - return $this->ssoDefaultProfile; + return $this->get('ssoDefaultProfile'); } /** @@ -2015,7 +1642,7 @@ final class ConfigData implements JsonSerializable */ public function setSsoDefaultProfile($ssoDefaultProfile) { - $this->ssoDefaultProfile = $ssoDefaultProfile; + $this->set('ssoDefaultProfile', $ssoDefaultProfile); } /** @@ -2023,15 +1650,15 @@ final class ConfigData implements JsonSerializable */ public function getMailRecipients() { - return (array)$this->mailRecipients; + return $this->get('mailRecipients', []); } /** * @param array $mailRecipients */ - public function setMailRecipients(array $mailRecipients) + public function setMailRecipients($mailRecipients) { - $this->mailRecipients = $mailRecipients; + $this->set('mailRecipients', $mailRecipients ?: []); } /** @@ -2039,15 +1666,15 @@ final class ConfigData implements JsonSerializable */ public function getMailEvents() { - return is_array($this->mailEvents) ? $this->mailEvents : []; + return $this->get('mailEvents', []); } /** * @param array $mailEvents */ - public function setMailEvents(array $mailEvents) + public function setMailEvents($mailEvents) { - $this->mailEvents = $mailEvents; + $this->set('mailEvents', $mailEvents ?: []); } /** @@ -2055,7 +1682,7 @@ final class ConfigData implements JsonSerializable */ public function getDatabaseVersion() { - return (string)$this->databaseVersion; + return (string)$this->get('databaseVersion'); } /** @@ -2065,7 +1692,7 @@ final class ConfigData implements JsonSerializable */ public function setDatabaseVersion($databaseVersion) { - $this->databaseVersion = $databaseVersion; + $this->set('databaseVersion', $databaseVersion); return $this; } @@ -2075,7 +1702,7 @@ final class ConfigData implements JsonSerializable */ public function getConfigDate() { - return $this->configDate; + return (int)$this->get('configDate'); } /** @@ -2085,7 +1712,7 @@ final class ConfigData implements JsonSerializable */ public function setConfigDate($configDate) { - $this->configDate = (int)$configDate; + $this->set('configDate', (int)$configDate); return $this; } @@ -2095,7 +1722,7 @@ final class ConfigData implements JsonSerializable */ public function isAccountExpireEnabled() { - return (int)$this->accountExpireEnabled; + return (bool)$this->get('accountExpireEnabled', false); } /** @@ -2105,7 +1732,7 @@ final class ConfigData implements JsonSerializable */ public function setAccountExpireEnabled($accountExpireEnabled) { - $this->accountExpireEnabled = $accountExpireEnabled; + $this->set('accountExpireEnabled', $accountExpireEnabled); return $this; } @@ -2115,7 +1742,7 @@ final class ConfigData implements JsonSerializable */ public function getAccountExpireTime() { - return $this->accountExpireTime; + return $this->get('accountExpireTime', self::ACCOUNT_EXPIRE_TIME); } /** @@ -2125,7 +1752,7 @@ final class ConfigData implements JsonSerializable */ public function setAccountExpireTime($accountExpireTime) { - $this->accountExpireTime = (int)$accountExpireTime; + $this->set('accountExpireTime', (int)$accountExpireTime); return $this; } @@ -2135,7 +1762,7 @@ final class ConfigData implements JsonSerializable */ public function isLdapTlsEnabled(): bool { - return (bool)$this->ldapTlsEnabled; + return $this->get('ldapTlsEnabled', false); } /** @@ -2143,7 +1770,7 @@ final class ConfigData implements JsonSerializable */ public function setLdapTlsEnabled(bool $ldapTlsEnabled) { - $this->ldapTlsEnabled = (int)$ldapTlsEnabled; + $this->set('ldapTlsEnabled', (int)$ldapTlsEnabled); } /** @@ -2151,15 +1778,15 @@ final class ConfigData implements JsonSerializable */ public function getFilesAllowedMime(): array { - return (array)$this->filesAllowedMime; + return $this->get('filesAllowedMime', []); } /** * @param array $filesAllowedMime */ - public function setFilesAllowedMime(array $filesAllowedMime) + public function setFilesAllowedMime($filesAllowedMime) { - $this->filesAllowedMime = $filesAllowedMime; + $this->set('filesAllowedMime', $filesAllowedMime ?: []); } /** @@ -2167,15 +1794,15 @@ final class ConfigData implements JsonSerializable */ public function getLdapType() { - return (int)$this->ldapType; + return (int)$this->get('ldapType'); } /** * @param int $ldapType */ - public function setLdapType(int $ldapType) + public function setLdapType($ldapType) { - $this->ldapType = $ldapType; + $this->set('ldapType', (int)$ldapType); } /** @@ -2183,7 +1810,7 @@ final class ConfigData implements JsonSerializable */ public function getAppVersion() { - return $this->appVersion; + return $this->get('appVersion'); } /** @@ -2191,7 +1818,7 @@ final class ConfigData implements JsonSerializable */ public function setAppVersion(string $appVersion) { - $this->appVersion = $appVersion; + $this->set('appVersion', $appVersion); } /** @@ -2199,7 +1826,7 @@ final class ConfigData implements JsonSerializable */ public function getApplicationUrl() { - return $this->applicationUrl; + return $this->get('applicationUrl'); } /** @@ -2207,6 +1834,71 @@ final class ConfigData implements JsonSerializable */ public function setApplicationUrl(string $applicationUrl = null) { - $this->applicationUrl = $applicationUrl ? rtrim($applicationUrl, '/') : null; + $this->set('applicationUrl', $applicationUrl ? rtrim($applicationUrl, '/') : null); } + + /** + * @return string + */ + public function getLdapFilterUserObject() + { + return $this->get('ldapFilterUserObject'); + } + + /** + * @param string $filter + */ + public function setLdapFilterUserObject($filter) + { + $this->set('ldapFilterUserObject', $filter); + } + + /** + * @return string + */ + public function getLdapFilterGroupObject() + { + return $this->get('ldapFilterGroupObject'); + } + + /** + * @param string $filter + */ + public function setLdapFilterGroupObject($filter) + { + $this->set('ldapFilterGroupObject', $filter); + } + + /** + * @return array|null + */ + public function getLdapFilterUserAttributes() + { + return $this->get('ldapFilterUserAttributes'); + } + + /** + * @param array $attributes + */ + public function setLdapFilterUserAttributes($attributes) + { + $this->set('ldapFilterUserAttributes', $attributes ?: []); + } + + /** + * @return array|null + */ + public function getLdapFilterGroupAttributes() + { + return $this->get('ldapFilterGroupAttributes'); + } + + /** + * @param array $attributes + */ + public function setLdapFilterGroupAttributes($attributes) + { + $this->set('ldapFilterGroupAttributes', $attributes ?: []); + } + } diff --git a/lib/SP/Providers/Auth/AuthProvider.php b/lib/SP/Providers/Auth/AuthProvider.php index d2d0b56b..21603772 100644 --- a/lib/SP/Providers/Auth/AuthProvider.php +++ b/lib/SP/Providers/Auth/AuthProvider.php @@ -108,7 +108,6 @@ final class AuthProvider extends Provider * Autentificación de usuarios con LDAP. * * @return bool|LdapAuthData - * @throws AuthException * @throws LdapException */ public function authLdap() @@ -138,14 +137,18 @@ final class AuthProvider extends Provider { $data = LdapParams::getServerAndPort($this->configData->getLdapServer()); - $ldapParams = (new LdapParams()) - ->setServer($data['server']) - ->setPort(isset($data['port']) ? $data['port'] : 389) - ->setSearchBase($this->configData->getLdapBase()) - ->setGroup($this->configData->getLdapGroup()) - ->setBindDn($this->configData->getLdapBindUser()) - ->setBindPass($this->configData->getLdapBindPass()) - ->setType($this->configData->getLdapType()); + $ldapParams = new LdapParams(); + $ldapParams->setServer($data['server']); + $ldapParams->setPort(isset($data['port']) ? $data['port'] : 389); + $ldapParams->setSearchBase($this->configData->getLdapBase()); + $ldapParams->setGroup($this->configData->getLdapGroup()); + $ldapParams->setBindDn($this->configData->getLdapBindUser()); + $ldapParams->setBindPass($this->configData->getLdapBindPass()); + $ldapParams->setType($this->configData->getLdapType()); + $ldapParams->setFilterUserObject($this->configData->getLdapFilterUserObject()); + $ldapParams->setFilterGroupObject($this->configData->getLdapFilterGroupObject()); + $ldapParams->setFilterUserAttributes($this->configData->getLdapFilterUserAttributes()); + $ldapParams->setFilterGroupAttributes($this->configData->getLdapFilterGroupAttributes()); return new LdapAuth( Ldap::factory( diff --git a/lib/SP/Providers/Auth/Ldap/Ldap.php b/lib/SP/Providers/Auth/Ldap/Ldap.php index ebdd2a9c..688c85b3 100644 --- a/lib/SP/Providers/Auth/Ldap/Ldap.php +++ b/lib/SP/Providers/Auth/Ldap/Ldap.php @@ -102,9 +102,6 @@ abstract class Ldap implements LdapInterface case LdapTypeInterface::LDAP_ADS: return new LdapMsAds($ldapConnection, $eventDispatcher); break; - case LdapTypeInterface::LDAP_AZURE; - return new LdapMsAzureAd($ldapConnection, $eventDispatcher); - break; } throw new LdapException(__u('LDAP type not set')); diff --git a/lib/SP/Providers/Auth/Ldap/LdapInterface.php b/lib/SP/Providers/Auth/Ldap/LdapInterface.php index 372c3645..1920d815 100644 --- a/lib/SP/Providers/Auth/Ldap/LdapInterface.php +++ b/lib/SP/Providers/Auth/Ldap/LdapInterface.php @@ -44,11 +44,20 @@ interface LdapInterface public function getUserDnFilter(string $userLogin): string; /** - * Devolver el filtro para comprobar la pertenecia al grupo + * Return the filter to check the group membership from user's attributes * * @return string */ - public function getGroupMembershipFilter(): string; + public function getGroupMembershipIndirectFilter(): string; + + /** + * Return the filter to check the group membership from group's attributes + * + * @param string $userDn + * + * @return string + */ + public function getGroupMembershipDirectFilter(string $userDn = null): string; /** * Buscar al usuario en un grupo. diff --git a/lib/SP/Providers/Auth/Ldap/LdapMsAds.php b/lib/SP/Providers/Auth/Ldap/LdapMsAds.php index 2778055e..31273805 100644 --- a/lib/SP/Providers/Auth/Ldap/LdapMsAds.php +++ b/lib/SP/Providers/Auth/Ldap/LdapMsAds.php @@ -38,66 +38,82 @@ use SP\Http\Address; */ final class LdapMsAds extends Ldap { - const FILTER_USER_OBJECT = '(&(!(UserAccountControl:1.2.840.113556.1.4.804:=34))(|(objectCategory=person)(objectClass=user)))'; - const FILTER_GROUP_OBJECT = '(objectCategory=group)'; - const FILTER_USER_ATTRIBUTES = ['samaccountname', 'cn', 'uid', 'userPrincipalName']; - const FILTER_GROUP_ATTRIBUTES = ['memberOf', 'groupMembership', 'memberof:1.2.840.113556.1.4.1941:']; + const DEFAULT_FILTER_USER_OBJECT = '(&(!(UserAccountControl:1.2.840.113556.1.4.804:=34))(|(objectCategory=person)(objectClass=user)))'; + const DEFAULT_FILTER_GROUP_OBJECT = '(objectCategory=group)'; + const DEFAULT_FILTER_USER_ATTRIBUTES = ['samaccountname', 'cn', 'uid', 'userPrincipalName']; + const DEFAULT_FILTER_GROUP_ATTRIBUTES = ['memberOf', 'groupMembership', 'memberof:1.2.840.113556.1.4.1941:']; /** - * Devolver el filtro para comprobar la pertenecia al grupo - * - * @return string + * @inheritDoc * @throws SPException */ - public function getGroupMembershipFilter(): string + public function getGroupMembershipIndirectFilter(): string { + $filter = $this->getUserObjectFilter(); + if (empty($this->ldapParams->getGroup())) { - return self::FILTER_USER_OBJECT; + return $filter; + } + + if (empty($this->ldapParams->getFilterGroupAttributes())) { + $attributes = self::DEFAULT_FILTER_GROUP_ATTRIBUTES; + } else { + $attributes = $this->ldapParams->getFilterGroupAttributes(); } return '(&(|' . LdapUtil::getAttributesForFilter( - self::FILTER_GROUP_ATTRIBUTES, + $attributes, $this->getGroupDn()) . ')' - . self::FILTER_USER_OBJECT + . $filter . ')'; } /** - * Obtener el filtro para buscar el usuario - * - * @param string $userLogin - * * @return string */ + private function getUserObjectFilter() + { + if (empty($this->ldapParams->getFilterUserObject())) { + return self::DEFAULT_FILTER_USER_OBJECT; + } + + return $this->ldapParams->getFilterUserObject(); + } + + /** + * O@inheritDoc + */ public function getUserDnFilter(string $userLogin): string { + if (empty($this->ldapParams->getFilterUserAttributes())) { + $attributes = self::DEFAULT_FILTER_USER_ATTRIBUTES; + } else { + $attributes = $this->ldapParams->getFilterUserAttributes(); + } + return '(&(|' - . LdapUtil::getAttributesForFilter(self::FILTER_USER_ATTRIBUTES, $userLogin) + . LdapUtil::getAttributesForFilter($attributes, $userLogin) . ')' - . self::FILTER_USER_OBJECT + . $this->getUserObjectFilter() . ')'; } /** - * Devolver el filtro para objetos del tipo grupo - * - * @return string + * @inheritDoc */ public function getGroupObjectFilter(): string { - return self::FILTER_GROUP_OBJECT; + if (empty($this->ldapParams->getFilterGroupObject())) { + return self::DEFAULT_FILTER_GROUP_OBJECT; + } + + return $this->ldapParams->getFilterGroupObject(); } /** - * Buscar al usuario en un grupo. - * - * @param string $userDn - * @param string $userLogin - * @param array $groupsDn - * - * @return bool + * @inheritDoc * @throws LdapException */ public function isUserInGroup(string $userDn, string $userLogin, array $groupsDn): bool @@ -130,9 +146,7 @@ final class LdapMsAds extends Ldap private function checkUserInGroupByFilter(string $userLogin, string $userDn): bool { $groupDn = $this->getGroupDn(); - $filter = '(|' - . LdapUtil::getAttributesForFilter(self::FILTER_GROUP_ATTRIBUTES, $groupDn) - . ')'; + $filter = $this->getGroupMembershipDirectFilter(); $searchResults = $this->ldapActions->getObjects($filter, ['dn'], $userDn); @@ -159,9 +173,24 @@ final class LdapMsAds extends Ldap } /** - * Obtener el servidor de LDAP a utilizar - * - * @return mixed + * @inheritDoc + * @throws LdapException + */ + public function getGroupMembershipDirectFilter(string $userDn = null): string + { + if (empty($this->ldapParams->getFilterGroupAttributes())) { + $attributes = self::DEFAULT_FILTER_GROUP_ATTRIBUTES; + } else { + $attributes = $this->ldapParams->getFilterGroupAttributes(); + } + + return '(|' + . LdapUtil::getAttributesForFilter($attributes, $this->getGroupDn()) + . ')'; + } + + /** + * @inheritDoc */ protected function pickServer() { diff --git a/lib/SP/Providers/Auth/Ldap/LdapMsAzureAd.php b/lib/SP/Providers/Auth/Ldap/LdapMsAzureAd.php deleted file mode 100644 index e54c4b07..00000000 --- a/lib/SP/Providers/Auth/Ldap/LdapMsAzureAd.php +++ /dev/null @@ -1,193 +0,0 @@ -. - */ - -namespace SP\Providers\Auth\Ldap; - -use SP\Core\Events\Event; -use SP\Core\Events\EventMessage; -use SP\Core\Exceptions\SPException; -use SP\Http\Address; - -/** - * Class LdapMsAzureAd - * - * LDAP authentication based on Azure Active Directory - * - * @package SP\Auth\Ldap - */ -final class LdapMsAzureAd extends Ldap -{ - const FILTER_USER_OBJECT = '(|(objectCategory=person)(objectClass=user))'; - const FILTER_GROUP_OBJECT = '(objectCategory=group)'; - const FILTER_USER_ATTRIBUTES = ['samaccountname', 'cn', 'uid', 'userPrincipalName']; - const FILTER_GROUP_ATTRIBUTES = ['memberOf', 'groupMembership', 'memberof:1.2.840.113556.1.4.1941:']; - - /** - * Devolver el filtro para comprobar la pertenecia al grupo - * - * @return string - * @throws SPException - */ - public function getGroupMembershipFilter(): string - { - if (empty($this->ldapParams->getGroup())) { - return self::FILTER_USER_OBJECT; - } - - return '(&(|' - . LdapUtil::getAttributesForFilter( - self::FILTER_GROUP_ATTRIBUTES, - $this->getGroupDn()) - . ')' - . self::FILTER_USER_OBJECT - . ')'; - } - - /** - * Obtener el filtro para buscar el usuario - * - * @param string $userLogin - * - * @return string - */ - public function getUserDnFilter(string $userLogin): string - { - return '(&(|' - . LdapUtil::getAttributesForFilter(self::FILTER_USER_ATTRIBUTES, $userLogin) - . ')' - . self::FILTER_USER_OBJECT - . ')'; - } - - /** - * Devolver el filtro para objetos del tipo grupo - * - * @return string - */ - public function getGroupObjectFilter(): string - { - return self::FILTER_GROUP_OBJECT; - } - - /** - * Buscar al usuario en un grupo. - * - * @param string $userDn - * @param string $userLogin - * @param array $groupsDn - * - * @return bool - * @throws LdapException - */ - public function isUserInGroup(string $userDn, string $userLogin, array $groupsDn): bool - { - // Comprobar si está establecido el filtro de grupo o el grupo coincide con - // los grupos del usuario - if (empty($this->ldapParams->getGroup()) - || $this->ldapParams->getGroup() === '*' - || in_array($this->getGroupDn(), $groupsDn) - ) { - $this->eventDispatcher->notifyEvent('ldap.check.group', - new Event($this, EventMessage::factory() - ->addDescription(__u('User in group verified')) - ->addDetail(__u('User'), $userLogin) - ->addDetail(__u('Group'), $this->ldapParams->getGroup()))); - - return true; - } - - return $this->checkUserInGroupByFilter($userLogin, $userDn); - } - - /** - * @param string $userLogin - * @param string $userDn - * - * @return bool - * @throws LdapException - */ - private function checkUserInGroupByFilter(string $userLogin, string $userDn): bool - { - $groupDn = $this->getGroupDn(); - - $filter = '(|' - . LdapUtil::getAttributesForFilter(self::FILTER_GROUP_ATTRIBUTES, $groupDn) - . ')'; - - $searchResults = $this->ldapActions->getObjects($filter, ['dn'], $userDn); - - if (isset($searchResults['count']) - && (int)$searchResults['count'] === 0 - ) { - $this->eventDispatcher->notifyEvent('ldap.check.group', - new Event($this, EventMessage::factory() - ->addDescription(__u('User does not belong to the group')) - ->addDetail(__u('User'), $userLogin) - ->addDetail(__u('Group'), $groupDn) - ->addDetail('LDAP FILTER', $filter))); - - return false; - } - - $this->eventDispatcher->notifyEvent('ldap.check.group', - new Event($this, EventMessage::factory() - ->addDescription(__u('User in group verified')) - ->addDetail(__u('User'), $userLogin) - ->addDetail(__u('Group'), $groupDn))); - - return true; - } - - /** - * Obtener el servidor de LDAP a utilizar - * - * @return mixed - */ - protected function pickServer() - { - $server = $this->ldapParams->getServer(); - - if (preg_match(Address::PATTERN_IP_ADDRESS, $server)) { - return $server; - } - - $dnsServerQuery = '_msdcs' . substr($server, strpos($server, '.')); - - logger(sprintf('Querying DNS zone: %s', $dnsServerQuery)); - - $records = dns_get_record($dnsServerQuery, DNS_NS); - - if (empty($records)) { - return $server; - } - - $adServers = []; - - foreach ($records as $record) { - $adServers[] = $record['target']; - }; - - return count($adServers) > 0 ? array_rand($adServers) : $server; - } -} diff --git a/lib/SP/Providers/Auth/Ldap/LdapParams.php b/lib/SP/Providers/Auth/Ldap/LdapParams.php index d96cc9b9..b12a04b8 100644 --- a/lib/SP/Providers/Auth/Ldap/LdapParams.php +++ b/lib/SP/Providers/Auth/Ldap/LdapParams.php @@ -65,6 +65,22 @@ final class LdapParams * @var bool */ protected $tlsEnabled = false; + /** + * @var string + */ + protected $filterUserObject; + /** + * @var string + */ + protected $filterGroupObject; + /** + * @var array + */ + protected $filterUserAttributes; + /** + * @var array + */ + protected $filterGroupAttributes; /** * Devolver el puerto del servidor si está establecido @@ -78,6 +94,74 @@ final class LdapParams return preg_match('#' . self::REGEX_SERVER . '#i', $server, $matches) ? $matches : false; } + /** + * @return string + */ + public function getFilterUserObject(): ?string + { + return $this->filterUserObject; + } + + /** + * @param string $filterUserObject + */ + public function setFilterUserObject(string $filterUserObject = null) + { + if (!empty($filterUserObject)) { + $this->filterUserObject = $filterUserObject; + } + } + + /** + * @return string + */ + public function getFilterGroupObject(): ?string + { + return $this->filterGroupObject; + } + + /** + * @param string $filterGroupObject + */ + public function setFilterGroupObject(string $filterGroupObject = null) + { + if (!empty($filterGroupObject)) { + $this->filterGroupObject = $filterGroupObject; + } + } + + /** + * @return array + */ + public function getFilterUserAttributes(): ?array + { + return $this->filterUserAttributes; + } + + /** + * @param array $filterUserAttributes + */ + public function setFilterUserAttributes(array $filterUserAttributes = null) + { + $this->filterUserAttributes = $filterUserAttributes; + } + + /** + * @return array + */ + public function getFilterGroupAttributes(): ?array + { + return $this->filterGroupAttributes; + } + + /** + * @param array $filterGroupAttributes + */ + public function setFilterGroupAttributes(array $filterGroupAttributes = null) + { + $this->filterGroupAttributes = $filterGroupAttributes; + } + /** * @return int */ diff --git a/lib/SP/Providers/Auth/Ldap/LdapStd.php b/lib/SP/Providers/Auth/Ldap/LdapStd.php index b353d42b..1af7b134 100644 --- a/lib/SP/Providers/Auth/Ldap/LdapStd.php +++ b/lib/SP/Providers/Auth/Ldap/LdapStd.php @@ -26,7 +26,6 @@ namespace SP\Providers\Auth\Ldap; use SP\Core\Events\Event; use SP\Core\Events\EventMessage; -use SP\Core\Exceptions\SPException; /** * Class LdapStd @@ -37,65 +36,71 @@ use SP\Core\Exceptions\SPException; */ final class LdapStd extends Ldap { - const FILTER_USER_OBJECT = '(|(objectClass=inetOrgPerson)(objectClass=person)(objectClass=simpleSecurityObject))'; - const FILTER_GROUP_OBJECT = '(|(objectClass=groupOfNames)(objectClass=groupOfUniqueNames)(objectClass=group))'; - const FILTER_USER_ATTRIBUTES = ['samaccountname', 'cn', 'uid', 'userPrincipalName']; - const FILTER_GROUP_ATTRIBUTES = ['memberOf', 'groupMembership']; + const DEFAULT_FILTER_USER_OBJECT = '(|(objectClass=inetOrgPerson)(objectClass=person)(objectClass=simpleSecurityObject))'; + const DEFAULT_FILTER_GROUP_OBJECT = '(|(objectClass=groupOfNames)(objectClass=groupOfUniqueNames)(objectClass=group))'; + const DEFAULT_FILTER_USER_ATTRIBUTES = ['samaccountname', 'cn', 'uid', 'userPrincipalName']; + const DEFAULT_FILTER_GROUP_ATTRIBUTES = ['memberOf', 'groupMembership']; /** - * Devolver el filtro para objetos del tipo grupo - * - * @return string + * @inheritDoc + * @throws LdapException */ - public function getGroupObjectFilter(): string + public function getGroupMembershipIndirectFilter(): string { - return self::FILTER_GROUP_OBJECT; - } + $filter = $this->getUserObjectFilter(); - /** - * Devolver el filtro para comprobar la pertenecia al grupo - * - * @return string - * @throws SPException - */ - public function getGroupMembershipFilter(): string - { if (empty($this->ldapParams->getGroup())) { - return self::FILTER_USER_OBJECT; + return $filter; + } + + if (empty($this->ldapParams->getFilterGroupAttributes())) { + $attributes = self::DEFAULT_FILTER_GROUP_ATTRIBUTES; + } else { + $attributes = $this->ldapParams->getFilterGroupAttributes(); } return '(&(|' . LdapUtil::getAttributesForFilter( - self::FILTER_GROUP_ATTRIBUTES, + $attributes, $this->getGroupDn()) - . ')' . self::FILTER_USER_OBJECT + . ')' . $filter . ')'; } /** - * Obtener el filtro para buscar el usuario - * - * @param string $userLogin - * - * @return mixed + * @return string + */ + private function getUserObjectFilter() + { + if (empty($this->ldapParams->getFilterUserObject())) { + return self::DEFAULT_FILTER_USER_OBJECT; + } + + return $this->ldapParams->getFilterUserObject(); + } + + /** + * @inheritDoc */ public function getUserDnFilter(string $userLogin): string { + if (empty($this->ldapParams->getFilterUserAttributes())) { + $attributes = self::DEFAULT_FILTER_USER_ATTRIBUTES; + } else { + $attributes = $this->ldapParams->getFilterUserAttributes(); + } + + $filter = $this->getUserObjectFilter(); + return '(&(|' - . LdapUtil::getAttributesForFilter(self::FILTER_USER_ATTRIBUTES, $userLogin) + . LdapUtil::getAttributesForFilter($attributes, $userLogin) . ')' - . self::FILTER_USER_OBJECT + . $filter . ')'; } /** - * Buscar al usuario en un grupo. - * - * @param string $userDn - * @param string $userLogin - * @param array $groupsDn - * - * @return bool + * @inheritDoc * @throws LdapException */ public function isUserInGroup(string $userDn, string $userLogin, array $groupsDn): bool @@ -126,12 +131,7 @@ final class LdapStd extends Ldap */ private function checkUserInGroupByFilter(string $userDn): bool { - $groupName = ldap_escape($this->getGroupFromParams(), null, LDAP_ESCAPE_FILTER); - $userDN = ldap_escape($userDn, null, LDAP_ESCAPE_FILTER); - $filter = '(&(cn=' . $groupName . ')' - . '(|(memberUid=' . $userDN . ')(member=' . $userDN . ')(uniqueMember=' . $userDN . '))' - . self::FILTER_GROUP_OBJECT - . ')'; + $filter = $this->getGroupMembershipDirectFilter($userDn); $searchResults = $this->ldapActions->getObjects($filter, ['dn']); @@ -142,7 +142,7 @@ final class LdapStd extends Ldap new Event($this, EventMessage::factory() ->addDescription(__u('User does not belong to the group')) ->addDetail(__u('User'), $userDn) - ->addDetail(__u('Group'), $groupName) + ->addDetail(__u('Group'), $this->getGroupFromParams()) ->addDetail('LDAP FILTER', $filter))); return false; @@ -151,6 +151,36 @@ final class LdapStd extends Ldap return true; } + /** + * @inheritDoc + */ + public function getGroupMembershipDirectFilter(string $userDn = null): string + { + $groupName = ldap_escape($this->getGroupFromParams(), null, LDAP_ESCAPE_FILTER); + $member = $userDn !== null ? ldap_escape($userDn, null, LDAP_ESCAPE_FILTER) : '*'; + + if (empty($groupName)) { + return $this->getUserObjectFilter(); + } + + return '(&(cn=' . $groupName . ')' + . '(|(memberUid=' . $member . ')(member=' . $member . ')(uniqueMember=' . $member . '))' + . $this->getGroupObjectFilter() + . ')'; + } + + /** + * @inheritDoc + */ + public function getGroupObjectFilter(): string + { + if (empty($this->ldapParams->getFilterGroupObject())) { + return self::DEFAULT_FILTER_GROUP_OBJECT; + } + + return $this->ldapParams->getFilterGroupObject(); + } + /** * Obtener el servidor de LDAP a utilizar * diff --git a/lib/SP/Services/Config/ConfigBackupService.php b/lib/SP/Services/Config/ConfigBackupService.php index c67dab6f..8b31fcfc 100644 --- a/lib/SP/Services/Config/ConfigBackupService.php +++ b/lib/SP/Services/Config/ConfigBackupService.php @@ -24,8 +24,6 @@ namespace SP\Services\Config; -use DI\DependencyException; -use DI\NotFoundException; use Exception; use RuntimeException; use SP\Config\ConfigData; @@ -95,16 +93,13 @@ final class ConfigBackupService extends Service /** * @return ConfigData - * @throws ServiceException - * @throws DependencyException - * @throws NotFoundException * @throws FileException + * @throws ServiceException */ public function restore() { - return $this->config->saveConfig(Util::unserialize( - ConfigData::class, - $this->getBackup()) + return $this->config->saveConfig( + Util::unserialize(ConfigData::class, $this->getBackup()) )->getConfigData(); } diff --git a/lib/SP/Services/Install/Installer.php b/lib/SP/Services/Install/Installer.php index 7da4009e..07ebf9c6 100644 --- a/lib/SP/Services/Install/Installer.php +++ b/lib/SP/Services/Install/Installer.php @@ -225,8 +225,15 @@ final class Installer extends Service $address = $this->request->getServer('SERVER_ADDR'); } - $this->installData->setDbAuthHost($address); - $this->installData->setDbAuthHostDns(gethostbyaddr($address)); + // Check whether sysPass is running on docker. Not so accurate, + // but avoid some overhead from parsing /proc/self/cgroup + if (getenv('SYSPASS_DIR') !== false) { + $this->installData->setDbAuthHost('%'); + } else { + $this->installData->setDbAuthHost($address); + $this->installData->setDbAuthHostDns(gethostbyaddr($address)); + } + } else { $this->installData->setDbAuthHost('localhost'); } diff --git a/lib/SP/Services/Install/MySQL.php b/lib/SP/Services/Install/MySQL.php index 935ce371..9db20da7 100644 --- a/lib/SP/Services/Install/MySQL.php +++ b/lib/SP/Services/Install/MySQL.php @@ -167,10 +167,21 @@ final class MySQL implements DatabaseSetupInterface $dbc = $this->mysqlHandler->getConnectionSimple(); - $dbc->exec(sprintf($query, $dbc->quote($user), $this->installData->getDbAuthHost(), $dbc->quote($pass))); + $dbc->exec( + sprintf($query, + $dbc->quote($user), + $this->installData->getDbAuthHost(), + $dbc->quote($pass)) + ); - if ($this->installData->getDbAuthHost() !== $this->installData->getDbAuthHostDns()) { - $dbc->exec(sprintf($query, $dbc->quote($user), $this->installData->getDbAuthHostDns(), $dbc->quote($pass))); + if (!empty($this->installData->getDbAuthHostDns()) + && $this->installData->getDbAuthHost() !== $this->installData->getDbAuthHostDns()) { + $dbc->exec( + sprintf($query, + $dbc->quote($user), + $this->installData->getDbAuthHostDns(), + $dbc->quote($pass)) + ); } $dbc->exec('FLUSH PRIVILEGES'); diff --git a/lib/SP/Services/Ldap/LdapCheckService.php b/lib/SP/Services/Ldap/LdapCheckService.php index 2cc0cce9..92383800 100644 --- a/lib/SP/Services/Ldap/LdapCheckService.php +++ b/lib/SP/Services/Ldap/LdapCheckService.php @@ -63,19 +63,34 @@ final class LdapCheckService extends Service $data = ['count' => 0, 'results' => []]; + $indirectFilterItems = $this->ldapResultsMapper( + $ldapActions->getObjects( + $this->ldap->getGroupMembershipIndirectFilter(), ['dn']) + ); + + $directFilterItems = $this->ldapResultsMapper( + $ldapActions->getObjects( + $this->ldap->getGroupMembershipDirectFilter(), + ['member', 'memberUid', 'uniqueMember']), + ['member', 'memberUid', 'uniqueMember'] + ); + + $userItems = array_unique(array_merge($indirectFilterItems, $directFilterItems)); + $data['results'][] = [ 'icon' => 'person', - 'items' => $this->ldapResultsMapper( - $ldapActions->getObjects( - $this->ldap->getGroupMembershipFilter(), ['dn'])) + 'items' => array_values($userItems) ]; if ($includeGroups) { + $groupItems = $this->ldapResultsMapper( + $ldapActions->getObjects( + $this->ldap->getGroupObjectFilter(), ['dn']) + ); + $data['results'][] = [ 'icon' => 'group', - 'items' => $this->ldapResultsMapper( - $ldapActions->getObjects( - $this->ldap->getGroupObjectFilter(), ['dn'])) + 'items' => $groupItems ]; } @@ -89,20 +104,26 @@ final class LdapCheckService extends Service /** * Obtener los datos de una búsqueda de LDAP de un atributo * - * @param array $data - * @param string $attribute + * @param array $data + * @param array $attributes * * @return array */ - public function ldapResultsMapper($data, $attribute = 'dn') + public function ldapResultsMapper($data, $attributes = ['dn']) { $out = []; foreach ($data as $result) { if (is_array($result)) { foreach ($result as $ldapAttribute => $value) { - if (strtolower($ldapAttribute) === $attribute) { - $out[] = $value; + if (in_array(strtolower($ldapAttribute), $attributes)) { + if (is_array($value)) { + unset($value['count']); + + $out = array_merge($out, $value); + } else { + $out[] = $value; + } } } } @@ -120,7 +141,8 @@ final class LdapCheckService extends Service public function getObjectsByFilter($filter) { $objects = $this->ldapResultsMapper( - $this->ldap->getLdapActions()->getObjects($filter, ['dn'])); + $this->ldap->getLdapActions()->getObjects($filter, ['dn']) + ); return [ 'count' => count($objects), diff --git a/lib/SP/Services/Ldap/LdapImportService.php b/lib/SP/Services/Ldap/LdapImportService.php index dab890a7..af66662c 100644 --- a/lib/SP/Services/Ldap/LdapImportService.php +++ b/lib/SP/Services/Ldap/LdapImportService.php @@ -176,7 +176,7 @@ final class LdapImportService extends Service if (empty($ldapImportParams->filter)) { $objects = $ldap->getLdapActions() - ->getObjects($ldap->getGroupMembershipFilter()); + ->getObjects($ldap->getGroupMembershipIndirectFilter()); } else { $objects = $ldap->getLdapActions() ->getObjects($ldapImportParams->filter); diff --git a/lib/SP/Services/Upgrade/UpgradeConfigService.php b/lib/SP/Services/Upgrade/UpgradeConfigService.php index 67d2346a..a5752c78 100644 --- a/lib/SP/Services/Upgrade/UpgradeConfigService.php +++ b/lib/SP/Services/Upgrade/UpgradeConfigService.php @@ -320,7 +320,7 @@ final class UpgradeConfigService extends Service implements UpgradeInterface private function upgrade_300_18112501($version) { if ($this->configData->isLdapEnabled()) { - if ($this->configData->isLdapAds()) { + if ($this->configData->get('ldapAds')) { $this->configData->setLdapType(LdapTypeInterface::LDAP_ADS); } else { $this->configData->setLdapType(LdapTypeInterface::LDAP_STD); diff --git a/lib/SP/Storage/File/XmlHandler.php b/lib/SP/Storage/File/XmlHandler.php index ca5ba428..459b86f1 100644 --- a/lib/SP/Storage/File/XmlHandler.php +++ b/lib/SP/Storage/File/XmlHandler.php @@ -117,14 +117,24 @@ final class XmlHandler implements XmlFileStorageInterface /** @var DOMElement $node */ foreach ($nodeList as $node) { if ($node->nodeType === XML_ELEMENT_NODE) { - if (is_object($node->childNodes) && $node->childNodes->length > 1) { - if ($node->hasAttribute('multiple') && (int)$node->getAttribute('multiple') === 1) { + if (is_object($node->childNodes) + && $node->childNodes->length > 1 + ) { + if ($node->hasAttribute('multiple') + && (int)$node->getAttribute('multiple') === 1 + ) { $nodes[] = $this->readChildNodes($node->childNodes); + + } elseif ($node->hasAttribute('class')) { + $nodes[$node->nodeName] = $this->readChildNodes($node->childNodes); + $nodes[$node->nodeName]['__class__'] = (string)$node->getAttribute('class');; } else { $nodes[$node->nodeName] = $this->readChildNodes($node->childNodes); } } else { - $val = is_numeric($node->nodeValue) && strpos($node->nodeValue, '.') === false ? (int)$node->nodeValue : $node->nodeValue; + $val = is_numeric($node->nodeValue) + && strpos($node->nodeValue, '.') === false + ? (int)$node->nodeValue : $node->nodeValue; if ($node->nodeName === 'item') { $nodes[] = $val; @@ -184,10 +194,10 @@ final class XmlHandler implements XmlFileStorageInterface * Crear los nodos hijos recursivamente a partir de un array multidimensional * * @param mixed $items - * @param DOMNode $Node + * @param DOMNode $node * @param null $type */ - protected function writeChildNodes($items, DOMNode $Node, $type = null) + protected function writeChildNodes($items, DOMNode $node, $type = null) { foreach ($this->analyzeItems($items) as $key => $value) { if (is_int($key)) { @@ -201,12 +211,13 @@ final class XmlHandler implements XmlFileStorageInterface $this->writeChildNodes($value, $newNode, $key); } else if (is_object($value)) { $newNode->setAttribute('class', get_class($value)); - $newNode->appendChild($this->Dom->createTextNode(base64_encode(serialize($value)))); + $this->writeChildNodes($value, $newNode, $key); +// $newNode->appendChild($this->Dom->createTextNode(base64_encode(serialize($value)))); } else { $newNode->appendChild($this->Dom->createTextNode(trim($value))); } - $Node->appendChild($newNode); + $node->appendChild($newNode); } } @@ -216,7 +227,7 @@ final class XmlHandler implements XmlFileStorageInterface * @param mixed $items * @param bool $serialize * - * @return array + * @return array|string */ protected function analyzeItems($items, $serialize = false) { @@ -244,15 +255,17 @@ final class XmlHandler implements XmlFileStorageInterface protected function analyzeObject($object) { $items = []; - $Reflection = new ReflectionObject($object); + $reflection = new ReflectionObject($object); - foreach ($Reflection->getProperties() as $property) { + foreach ($reflection->getProperties() as $property) { $property->setAccessible(true); $value = $property->getValue($object); if (is_bool($value)) { $items[$property->getName()] = (int)$value; - } elseif (is_numeric($value) && strpos($value, '.') === false) { + } elseif (is_numeric($value) + && strpos($value, '.') === false + ) { $items[$property->getName()] = (int)$value; } else { $items[$property->getName()] = $value; diff --git a/public/js/app-util.min.js b/public/js/app-util.min.js index 87ecd260..08199207 100644 --- a/public/js/app-util.min.js +++ b/public/js/app-util.min.js @@ -5,10 +5,10 @@ $jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var a=$jscomp.global. $jscomp.initSymbolAsyncIterator=function(){$jscomp.initSymbol();var a=$jscomp.global.Symbol.asyncIterator;a||(a=$jscomp.global.Symbol.asyncIterator=$jscomp.global.Symbol("asyncIterator"));$jscomp.initSymbolAsyncIterator=function(){}};$jscomp.arrayIterator=function(a){var d=0;return $jscomp.iteratorPrototype(function(){return d",number:"1234567890",char:"abcdefghijklmnopqrstuvwxyz"}},random:function(b){a.info("password:random");var c="";this.config.complexity.symbols&&(c+=this.config.charset.special);this.config.complexity.numbers&&(c+=this.config.charset.number);this.config.complexity.chars&&(c+=this.config.charset.char, -this.config.complexity.uppercase&&(c+=this.config.charset.char.toUpperCase()));var f=function(){for(var a="",b=0;b++",number:"1234567890",char:"abcdefghijklmnopqrstuvwxyz"}},random:function(b){a.info("password:random");var c="";this.config.complexity.symbols&&(c+=this.config.charset.special);this.config.complexity.numbers&&(c+=this.config.charset.number);this.config.complexity.chars&&(c+=this.config.charset.char,this.config.complexity.uppercase&& +(c+=this.config.charset.char.toUpperCase()));var f=function(){for(var a="",b=0;b++").html(a).text()},resizeImage:function(a){var b=.9*$(window).width(),d=.9*$(window).height(),e={width:a.width(),height:a.height()},g={calc:0,main:0,secondary:0,factor:.9,rel:e.width/e.height},h=function(a){a.main>a.secondary?a.calc=a.main/a.rel:a.maina.secondary&&(a.main*=a.factor,h(a));return a},k=function(){g.main=b;g.secondary=d;var c=h(g);a.css({width:c.main, height:c.calc});e.width=c.main;e.height=c.calc},l=function(){g.main=d;g.secondary=b;var c=h(g);a.css({width:c.calc,height:c.main});e.width=c.calc;e.height=c.main};e.width>b?k():e.height>d&&l();return e},fileUpload:function(b){var c=function(a){var b=$("#fileUploadForm");!1===a&&b.hide();a=b.find("input[type='file']");a.on("change",function(){"function"===typeof e.beforeSendAction&&e.beforeSendAction();h(this.files)});return a},d={actionId:b.data("action-id"),itemId:b.data("item-id"),sk:sysPassApp.sk.get()}, diff --git a/tests/res/config/config.xml b/tests/res/config/config.xml index c32eabcc..ebc62a81 100644 --- a/tests/res/config/config.xml +++ b/tests/res/config/config.xml @@ -1,111 +1,9 @@ - 12 - 0 - 10368000 - 0 - 1 - 0 - - - 1 - - 1 - 77242242eb45a80c6d2250b888737fb9ec9b9ab9 - 0 - 0 - 1556226660 - 48130d9595d219e17939525bad0b9c2448daa05d - sysPass - - - - - - 3306 - - - 0 - 0 - 0 - - - - - - 0 - 6f303a9e955657c510e1c8da0418bb474a22486e - - PDF - JPG - GIF - PNG - ODT - ODS - DOC - DOCX - XLS - XSL - VSD - TXT - CSV - BAK - - - 1024 - 1 - 1 - 0 - 0 - 0 - - - - 2 - 2 - 0 - - - - 0 - - 1 - - 0 - 0 - - - - 25 - - 0 - - - - 0 - fd1058ca0bbaf967d08184ed22ee2c8d5675ca0c9d569c1f237f23fefadf - 0 - - 8080 - - - 0 - 0 - 600 - 3 - 0 - 300 - - material-blue - 3 - 3 - 0 - 514 - 0 - - - 0 - - - + + 1584025638 + 501c9ad829417b77a3168bab78003294422f74ee + sysPass + 321933b882ccd226f99b1fee8c247740afa6b578 +