From 4259b5f2d41066fd289d9faaee4545eff0f3d299 Mon Sep 17 00:00:00 2001 From: nuxsmin Date: Mon, 26 Mar 2018 13:30:42 +0200 Subject: [PATCH] * [ADD] Option for enable/disable account's password expiry date. The expire time could be set too * [ADD] Random generated passwords can be copied to clipboard * [ADD] Random generated passwords can be viewed after being generated * [MOD] Code refactoring --- .../web/Controllers/AccountController.php | 1 - .../Controllers/ConfigAccountController.php | 62 +- .../web/Controllers/ControllerBase.php | 6 +- .../Helpers/Account/AccountHelper.php | 2 +- app/modules/web/Forms/AccountForm.php | 26 +- app/modules/web/Forms/UserForm.php | 4 +- .../web/themes/material-blue/js/app-theme.js | 138 ++--- .../themes/material-blue/js/app-theme.min.js | 37 +- .../views/account/account-editpass.inc | 53 +- .../views/account/account-history.inc | 10 +- .../views/account/account-link.inc | 18 +- .../views/account/account-permissions.inc | 24 +- .../views/account/account-request.inc | 6 +- .../material-blue/views/account/account.inc | 63 +- .../material-blue/views/account/details.inc | 23 +- .../views/account/files-list.inc | 6 +- .../views/common/aux-customfields.inc | 9 +- .../material-blue/views/config/accounts.inc | 66 ++- .../material-blue/views/itemshow/user.inc | 8 +- .../material-blue/views/itemshow/userpass.inc | 8 +- lib/SP/Account/AccountSearchItem.php | 11 +- lib/SP/Bootstrap.php | 7 +- lib/SP/Config/ConfigData.php | 46 ++ lib/SP/Core/Upgrade/Upgrade.php | 555 ------------------ lib/SP/DataModel/CustomFieldDefDataOld.php | 23 +- lib/SP/Mgmt/CustomFields/CustomField.php | 372 ------------ lib/SP/Mgmt/CustomFields/CustomFieldBase.php | 40 -- lib/SP/Mgmt/CustomFields/CustomFieldDef.php | 289 --------- .../CustomFields/CustomFieldDefSearch.php | 97 --- lib/SP/Mgmt/CustomFields/CustomFieldTypes.php | 104 ---- lib/SP/Mgmt/CustomFields/CustomFieldsUtil.php | 308 ---------- .../Services/Account/AccountSearchService.php | 1 - lib/SP/Services/Install/Installer.php | 2 +- lib/SP/Services/User/UserPassService.php | 9 +- public/js/app-main.js | 67 ++- public/js/app-main.min.js | 32 +- public/js/app-triggers.js | 14 +- public/js/app-triggers.min.js | 8 +- 38 files changed, 435 insertions(+), 2120 deletions(-) delete mode 100644 lib/SP/Core/Upgrade/Upgrade.php delete mode 100644 lib/SP/Mgmt/CustomFields/CustomField.php delete mode 100644 lib/SP/Mgmt/CustomFields/CustomFieldBase.php delete mode 100644 lib/SP/Mgmt/CustomFields/CustomFieldDef.php delete mode 100644 lib/SP/Mgmt/CustomFields/CustomFieldDefSearch.php delete mode 100644 lib/SP/Mgmt/CustomFields/CustomFieldTypes.php delete mode 100644 lib/SP/Mgmt/CustomFields/CustomFieldsUtil.php diff --git a/app/modules/web/Controllers/AccountController.php b/app/modules/web/Controllers/AccountController.php index e6332dd6..16952132 100644 --- a/app/modules/web/Controllers/AccountController.php +++ b/app/modules/web/Controllers/AccountController.php @@ -342,7 +342,6 @@ class AccountController extends ControllerBase implements CrudControllerInterfac ] ); $this->view->assign('formRoute', 'account/saveEdit'); - $this->view->assign(__FUNCTION__); $this->accountService->incrementViewCounter($id); diff --git a/app/modules/web/Controllers/ConfigAccountController.php b/app/modules/web/Controllers/ConfigAccountController.php index 666dc215..a9a83e55 100644 --- a/app/modules/web/Controllers/ConfigAccountController.php +++ b/app/modules/web/Controllers/ConfigAccountController.php @@ -2,8 +2,8 @@ /** * sysPass * - * @author nuxsmin - * @link https://syspass.org + * @author nuxsmin + * @link https://syspass.org * @copyright 2012-2018, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. @@ -52,53 +52,53 @@ class ConfigAccountController extends SimpleControllerBase $eventMessage = EventMessage::factory(); // Accounts - $globalSearchEnabled = Request::analyzeBool('globalsearch', false); - $accountPassToImageEnabled = Request::analyzeBool('account_passtoimage', false); - $accountLinkEnabled = Request::analyzeBool('account_link', false); - $accountFullGroupAccessEnabled = Request::analyzeBool('account_fullgroup_access', false); - $accountCount = Request::analyzeInt('account_count', 10); - $resultsAsCardsEnabled = Request::analyzeBool('resultsascards', false); - - $configData->setGlobalSearch($globalSearchEnabled); - $configData->setAccountPassToImage($accountPassToImageEnabled); - $configData->setAccountLink($accountLinkEnabled); - $configData->setAccountFullGroupAccess($accountFullGroupAccessEnabled); - $configData->setAccountCount($accountCount); - $configData->setResultsAsCards($resultsAsCardsEnabled); + $configData->setGlobalSearch(Request::analyzeBool('account_globalsearch', false)); + $configData->setAccountPassToImage(Request::analyzeBool('account_passtoimage', false)); + $configData->setAccountLink(Request::analyzeBool('account_link', false)); + $configData->setAccountFullGroupAccess(Request::analyzeBool('account_fullgroup_access', false)); + $configData->setAccountCount(Request::analyzeInt('account_count', 10)); + $configData->setResultsAsCards(Request::analyzeBool('account_resultsascards', false)); + $configData->setAccountExpireEnabled(Request::analyzeBool('account_expire', false)); + $configData->setAccountExpireTime(Request::analyzeInt('account_expire_time', 10368000) * 24 * 3600); // Files $filesEnabled = Request::analyzeBool('files_enabled', false); - $filesAllowedSize = Request::analyzeInt('files_allowed_size', 1024); - $filesAllowedExts = ConfigUtil::filesExtsAdapter(Request::analyzeString('files_allowed_exts')); if ($filesEnabled) { + $filesAllowedSize = Request::analyzeInt('files_allowed_size', 1024); + if ($filesAllowedSize >= 16384) { $this->returnJsonResponse(JsonResponse::JSON_ERROR, __u('El tamaño máximo por archivo es de 16MB')); - } elseif ($configData->isFilesEnabled() === false) { + } + + $configData->setFilesEnabled(true); + $configData->setFilesAllowedExts(ConfigUtil::filesExtsAdapter(Request::analyzeString('files_allowed_exts'))); + $configData->setFilesAllowedSize($filesAllowedSize); + + if ($configData->isFilesEnabled() === false) { $eventMessage->addDescription(__u('Archivos habilitados')); } } elseif ($filesEnabled === false && $configData->isFilesEnabled()) { + $configData->setFilesEnabled(false); + $eventMessage->addDescription(__u('Archivos deshabilitados')); } - $configData->setFilesEnabled($filesEnabled); - $configData->setFilesAllowedExts($filesAllowedExts); - $configData->setFilesAllowedSize($filesAllowedSize); - // Public Links $pubLinksEnabled = Request::analyzeBool('publinks_enabled', false); - $pubLinksImageEnabled = Request::analyzeBool('publinks_image_enabled', false); - $pubLinksMaxTime = Request::analyzeInt('publinks_maxtime', 10); - $pubLinksMaxViews = Request::analyzeInt('publinks_maxviews', 3); - $configData->setPublinksEnabled($pubLinksEnabled); - $configData->setPublinksImageEnabled($pubLinksImageEnabled); - $configData->setPublinksMaxTime($pubLinksMaxTime * 60); - $configData->setPublinksMaxViews($pubLinksMaxViews); + if ($pubLinksEnabled === true) { + $configData->setPublinksEnabled(true); + $configData->setPublinksImageEnabled(Request::analyzeBool('publinks_image_enabled', false)); + $configData->setPublinksMaxTime(Request::analyzeInt('publinks_maxtime', 10) * 60); + $configData->setPublinksMaxViews(Request::analyzeInt('publinks_maxviews', 3)); - if ($pubLinksEnabled === true && $configData->isPublinksEnabled() === false) { - $eventMessage->addDescription(__u('Enlaces públicos habilitados')); + if ($configData->isPublinksEnabled() === false) { + $eventMessage->addDescription(__u('Enlaces públicos habilitados')); + } } elseif ($pubLinksEnabled === false && $configData->isPublinksEnabled()) { + $configData->setPublinksEnabled(false); + $eventMessage->addDescription(__u('Enlaces públicos deshabilitados')); } diff --git a/app/modules/web/Controllers/ControllerBase.php b/app/modules/web/Controllers/ControllerBase.php index b25075fa..51780c1f 100644 --- a/app/modules/web/Controllers/ControllerBase.php +++ b/app/modules/web/Controllers/ControllerBase.php @@ -44,6 +44,7 @@ use SP\Mvc\View\Template; use SP\Providers\Auth\Browser\Browser; use SP\Services\Auth\AuthException; use SP\Services\User\UserLoginResponse; +use SP\Util\Checks; /** * Clase base para los controladores @@ -149,7 +150,7 @@ abstract class ControllerBase $this->view->setBase(strtolower($this->controllerName)); - $this->isAjax = $this->router->request()->headers()->get('X_REQUESTED_WITH') === 'XMLHttpRequest'; + $this->isAjax = Checks::isAjax($this->router); if ($this->session->isLoggedIn()) { $this->userData = clone $this->session->getUserData(); @@ -178,6 +179,9 @@ abstract class ControllerBase $this->view->assign('isDemo', $this->configData->isDemoEnabled()); $this->view->assign('icons', $this->theme->getIcons()); $this->view->assign('configData', $this->configData); + + // Pass the action name to the template as a variable + $this->view->assign($this->actionName); } /** diff --git a/app/modules/web/Controllers/Helpers/Account/AccountHelper.php b/app/modules/web/Controllers/Helpers/Account/AccountHelper.php index 6299e4fb..ca43da92 100644 --- a/app/modules/web/Controllers/Helpers/Account/AccountHelper.php +++ b/app/modules/web/Controllers/Helpers/Account/AccountHelper.php @@ -154,7 +154,7 @@ class AccountHelper extends HelperBase $this->view->assign('allowPrivateGroup', $userProfileData->isAccPrivateGroup() && $accountData->getUserGroupId() === $userData->getUserGroupId()); $this->view->assign('accountPassDate', date('Y-m-d H:i:s', $accountData->getPassDate())); - $this->view->assign('accountPassDateChange', date('Y-m-d', $accountData->getPassDateChange() ?: 0)); + $this->view->assign('accountPassDateChange', $accountData->getPassDateChange() > 0 && date('Y-m-d', $accountData->getPassDateChange() ?: 0)); $this->view->assign('linkedAccounts', $this->accountService->getLinked($this->accountId)); $this->view->assign('accountId', $accountData->getId()); diff --git a/app/modules/web/Forms/AccountForm.php b/app/modules/web/Forms/AccountForm.php index 349623e8..6fdeb6ae 100644 --- a/app/modules/web/Forms/AccountForm.php +++ b/app/modules/web/Forms/AccountForm.php @@ -80,24 +80,24 @@ class AccountForm extends FormBase implements FormInterface $this->accountRequest = new AccountRequest(); $this->accountRequest->id = $this->itemId; $this->accountRequest->name = Request::analyzeString('name'); - $this->accountRequest->clientId = Request::analyzeInt('clientId', 0); - $this->accountRequest->categoryId = Request::analyzeInt('categoryId', 0); + $this->accountRequest->clientId = Request::analyzeInt('client_id', 0); + $this->accountRequest->categoryId = Request::analyzeInt('category_id', 0); $this->accountRequest->login = Request::analyzeString('login'); $this->accountRequest->url = Request::analyzeString('url'); $this->accountRequest->notes = Request::analyzeString('notes'); $this->accountRequest->userEditId = $this->context->getUserData()->getId(); - $this->accountRequest->otherUserEdit = (int)Request::analyzeBool('otherUserEditEnabled', false); - $this->accountRequest->otherUserGroupEdit = (int)Request::analyzeBool('otherUserGroupEditEnabled', false); - $this->accountRequest->pass = Request::analyzeEncrypted('pass'); - $this->accountRequest->isPrivate = (int)Request::analyzeBool('privateEnabled', false); - $this->accountRequest->isPrivateGroup = (int)Request::analyzeBool('privateGroupEnabled', false); - $this->accountRequest->passDateChange = Request::analyzeInt('passworddatechange_unix'); - $this->accountRequest->parentId = Request::analyzeInt('parentAccountId'); - $this->accountRequest->userGroupId = Request::analyzeInt('mainUserGroupId'); + $this->accountRequest->otherUserEdit = (int)Request::analyzeBool('other_user_edit_enabled', false); + $this->accountRequest->otherUserGroupEdit = (int)Request::analyzeBool('other_usergroup_edit_enabled', false); + $this->accountRequest->pass = Request::analyzeEncrypted('password'); + $this->accountRequest->isPrivate = (int)Request::analyzeBool('private_enabled', false); + $this->accountRequest->isPrivateGroup = (int)Request::analyzeBool('private_group_enabled', false); + $this->accountRequest->passDateChange = Request::analyzeInt('password_date_expire_unix'); + $this->accountRequest->parentId = Request::analyzeInt('parent_eccount_id'); + $this->accountRequest->userGroupId = Request::analyzeInt('main_usergroup_id'); // Arrays - $accountOtherGroups = Request::analyzeArray('otherUserGroups'); - $accountOtherUsers = Request::analyzeArray('otherUsers'); + $accountOtherGroups = Request::analyzeArray('other_usergroups'); + $accountOtherUsers = Request::analyzeArray('other_users'); $accountTags = Request::analyzeArray('tags'); if ($accountOtherUsers) { @@ -126,7 +126,7 @@ class AccountForm extends FormBase implements FormInterface throw new ValidationException(__u('Es necesaria una clave')); } - if (Request::analyzeEncrypted('passR') !== $this->accountRequest->pass) { + if (Request::analyzeEncrypted('password_repeat') !== $this->accountRequest->pass) { throw new ValidationException(__u('Las claves no coinciden')); } } diff --git a/app/modules/web/Forms/UserForm.php b/app/modules/web/Forms/UserForm.php index 0d8f0ed9..43da3c12 100644 --- a/app/modules/web/Forms/UserForm.php +++ b/app/modules/web/Forms/UserForm.php @@ -97,7 +97,7 @@ class UserForm extends FormBase implements FormInterface $this->userData->setIsAdminAcc(Request::analyzeBool('adminacc', false)); $this->userData->setIsDisabled(Request::analyzeBool('disabled', false)); $this->userData->setIsChangePass(Request::analyzeBool('changepass', false)); - $this->userData->setPass(Request::analyzeEncrypted('pass')); + $this->userData->setPass(Request::analyzeEncrypted('password')); } /** @@ -137,7 +137,7 @@ class UserForm extends FormBase implements FormInterface */ protected function checkPass() { - $userPassR = Request::analyzeEncrypted('passR'); + $userPassR = Request::analyzeEncrypted('password_repeat'); if ($this->configData->isDemoEnabled()) { throw new ValidationException(__u('Ey, esto es una DEMO!!')); diff --git a/app/modules/web/themes/material-blue/js/app-theme.js b/app/modules/web/themes/material-blue/js/app-theme.js index 0edc0526..c2a34579 100644 --- a/app/modules/web/themes/material-blue/js/app-theme.js +++ b/app/modules/web/themes/material-blue/js/app-theme.js @@ -24,14 +24,14 @@ sysPass.Theme = function (Common) { "use strict"; - var log = Common.log; + const log = Common.log; /** * Funciones a realizar en peticiones AJAX * * @type {{complete: ajax.complete}} */ - var ajax = { + const ajax = { complete: function () { log.info("ajax:complete"); @@ -45,7 +45,7 @@ sysPass.Theme = function (Common) { * * @type {{show: loading.show, hide: loading.hide}} */ - var loading = { + const loading = { elems: { $wrap: $("#wrap-loading"), $loading: $("#loading") @@ -68,12 +68,12 @@ sysPass.Theme = function (Common) { }; // Función para generar claves aleatorias. - var password = function ($target) { - var i = 0; - var chars = ""; - var genPassword = ""; + const password = function ($target) { + let i = 0; + let chars = ""; + let genPassword = ""; - var getRandomChar = function (min, max) { + const getRandomChar = function (min, max) { return chars.charAt(Math.floor((Math.random() * max) + min)); }; @@ -97,43 +97,43 @@ sysPass.Theme = function (Common) { genPassword += getRandomChar(0, chars.length - 1); } - $("#viewPass").attr("title", genPassword); + $target.attr("data-pass", genPassword); - var level = zxcvbn(genPassword); + const level = zxcvbn(genPassword); Common.passwordData.passLength = genPassword.length; - if ($target) { - var $dstParent = $target.parent(); - var $targetR = $("#" + $target.attr("id") + "R"); + // if ($target) { + const $dstParent = $target.parent(); + const $targetR = $("#" + $target.attr("id") + "_repeat"); - Common.outputResult(level, $target); + Common.outputResult(level, $target); - // Actualizar los componentes de MDL - var mdl = new MaterialTextfield(); + // Actualizar los componentes de MDL + const mdl = new MaterialTextfield(); - // Poner la clave en los input y actualizar MDL - $dstParent.find("input:password").val(genPassword); - $dstParent.addClass(mdl.CssClasses_.IS_DIRTY).removeClass(mdl.CssClasses_.IS_INVALID); + // Poner la clave en los input y actualizar MDL + $dstParent.find("input:password").val(genPassword); + $dstParent.addClass(mdl.CssClasses_.IS_DIRTY).removeClass(mdl.CssClasses_.IS_INVALID); - // Poner la clave en el input de repetición y encriptarla - if ($targetR.length > 0) { - $targetR.val(genPassword).parent().addClass(mdl.CssClasses_.IS_DIRTY).removeClass(mdl.CssClasses_.IS_INVALID); - Common.encryptFormValue($targetR); - } - - // Mostar el indicador de complejidad - $dstParent.find("#passLevel").show(500); - } else { - Common.outputResult(level); - $("input:password, input.password").val(genPassword); - $("#passLevel").show(500); + // Poner la clave en el input de repetición y encriptarla + if ($targetR.length > 0) { + $targetR.val(genPassword).parent().addClass(mdl.CssClasses_.IS_DIRTY).removeClass(mdl.CssClasses_.IS_INVALID); + Common.encryptFormValue($targetR); } + + // Mostar el indicador de complejidad + $dstParent.find("#passLevel").show(500); + // } else { + // Common.outputResult(level); + // $("input:password, input.password").val(genPassword); + // $("#passLevel").show(500); + // } }; // Diálogo de configuración de complejidad de clave - var complexityDialog = function () { + const complexityDialog = function () { - var content = + const content = "
" + "
";mdlDialog().show({title:a.config().LANG[29],text:b,negative:{title:a.config().LANG[44]},positive:{title:a.config().LANG[43],onClick:function(b){b.preventDefault();a.passwordData.complexity.chars=$("#checkbox-chars").is(":checked"); +a.passwordData.complexity.numbers=$("#checkbox-numbers").is(":checked");a.passwordData.complexity.uppercase=$("#checkbox-uppercase").is(":checked");a.passwordData.complexity.symbols=$("#checkbox-symbols").is(":checked");a.passwordData.complexity.numlength=parseInt($("#passlength").val())}},cancelable:!0,contentStyle:{"max-width":"300px"},onLoaded:function(){$("#checkbox-chars").prop("checked",a.passwordData.complexity.chars);$("#checkbox-numbers").prop("checked",a.passwordData.complexity.numbers); +$("#checkbox-uppercase").prop("checked",a.passwordData.complexity.uppercase);$("#checkbox-symbols").prop("checked",a.passwordData.complexity.symbols);$("#passlength").val(a.passwordData.complexity.numlength)}})},l=function(b){b.find(".passwordfield__input").each(function(){var b=$(this);if("true"!==b.attr("data-pass-upgraded")){var d=b.parent(),e=b.attr("id"),c='\n ";d.after('
');d.next(".password-actions").prepend('').prepend('remove_red_eye').prepend(c);b.on("keyup",function(){a.checkPassLevel(b)});d=b.parent().next();d.find(".passGen").on("click",function(){g(b);b.blur()});d.find(".passComplexity").on("click",function(){h()});d.find(".showpass").on("mouseover",function(){$(this).attr("title",b.data("pass"))});d.find(".reset").on("click",function(){b.val(""); +var a=$("#"+e+"_repeat");0remove_red_eye');if(1===b.data("clipboard")){var c=$('content_paste');b.parent().after(c).after(d)}else b.parent().after(d); +d.on("mouseover",function(){d.attr("title",b.val())})})},m=function(b){f.info("setupDatePicker");var c={format:"YYYY-MM-DD",lang:a.config().LOCALE.substr(0,2),time:!1,cancelText:a.config().LANG[44],okText:a.config().LANG[43],clearText:a.config().LANG[30],nowText:a.config().LANG[56],minDate:new Date,triggerEvent:"dateIconClick"};b.find(".password-datefield__input").each(function(){var b=$(this),e=b.parent();b.bootstrapMaterialDatePicker(c);var k=e.find("input[name="+b.data("dst-unix")+"]");k.val(moment.tz(b.val(), +a.config().TIMEZONE).format("X"));e.next("i").on("click",function(){b.trigger("dateIconClick")});b.on("change",function(){k.val(moment.tz(b.val(),a.config().TIMEZONE).format("X"))})})};return{passwordDetect:l,password:g,viewsTriggers:{main:function(){var a=document.querySelector(".mdl-layout");$(".mdl-layout__drawer").find("a").click(function(){a.MaterialLayout.toggleDrawer()})},search:function(){var b=$("#frmSearch"),c=$("#res-content");b.find("button.btn-clear").on("click",function(a){$(".icon-searchfav").find("i").removeClass("mdl-color-text--amber-A200")}); +b.find(".icon-searchfav").on("click",function(){var c=$(this).find("i"),d=b.find("input[name='searchfav']");0==d.val()?(c.addClass("mdl-color-text--amber-A200"),c.attr("title",a.config().LANG[53]),d.val(1)):(c.removeClass("mdl-color-text--amber-A200"),c.attr("title",a.config().LANG[52]),d.val(0));b.submit()});var d=b.find("#tags")[0],e=b.find(".search-filters-tags"),f=b.find("i.show-filter");c.on("click","#data-search-header .sort-down,#data-search-header .sort-up",function(){var b=$(this);b.parent().find("a").addClass("filterOn"); +a.appActions().account.sort(b)}).on("click","#search-rows i.icon-favorite",function(){var b=$(this);a.appActions().account.saveFavorite(b,function(){"on"===b.data("status")?(b.addClass("mdl-color-text--amber-A100"),b.attr("title",a.config().LANG[50]),b.html("star")):(b.removeClass("mdl-color-text--amber-A100"),b.attr("title",a.config().LANG[49]),b.html("star_border"))})}).on("click","#search-rows span.tag",function(){e.is(":hidden")&&f.trigger("click");d.selectize.addItem($(this).data("tag-id"),!1)}); +f.on("click",function(){var a=$(this);e.is(":hidden")?(e.slideDown("slow"),a.html(a.data("icon-up"))):(e.slideUp("slow"),a.html(a.data("icon-down")))});-1!==d.selectedIndex&&f.trigger("click")},common:function(a){l(a);m(a)}},loading:c,ajax:{complete:function(){f.info("ajax:complete");componentHandler.upgradeDom()}},html:{getList:function(a,c){var b=$('
    '),e=$('
  • '),f=$(''),g=''+ +(void 0===c||""===c?"description":c)+"";a.forEach(function(a){var c=f.clone();c.append(g);c.append(a);a=e.clone().append(c);b.append(a)});return b},tabs:{add:function(a,c,d,e){a=$(a);var b;1===e&&(a.parent().find("#tabs-"+c).addClass("is-active"),b="is-active");a.append(''+d+"")}}}}}; diff --git a/app/modules/web/themes/material-blue/views/account/account-editpass.inc b/app/modules/web/themes/material-blue/views/account/account-editpass.inc index f8d1db6b..e3a5a2b2 100644 --- a/app/modules/web/themes/material-blue/views/account/account-editpass.inc +++ b/app/modules/web/themes/material-blue/views/account/account-editpass.inc @@ -1,7 +1,8 @@ @@ -32,10 +33,10 @@
    - - +
    @@ -54,10 +55,10 @@
    - - +
    @@ -65,10 +66,10 @@
    - - +
    @@ -76,27 +77,31 @@
    - - +
    - - - -
    - - -
    - date_range - - + isAccountExpireEnabled()): ?> + + + +
    + + + +
    + date_range + + + diff --git a/app/modules/web/themes/material-blue/views/account/account-history.inc b/app/modules/web/themes/material-blue/views/account/account-history.inc index 9ba3fcad..e5aeda1e 100644 --- a/app/modules/web/themes/material-blue/views/account/account-history.inc +++ b/app/modules/web/themes/material-blue/views/account/account-history.inc @@ -48,7 +48,7 @@
    -
    - + for="password_date_expire">
    @@ -130,7 +130,7 @@
    - - +
    @@ -41,7 +41,7 @@ - +
    @@ -52,7 +52,7 @@ - + @@ -60,10 +60,10 @@
    - - +
    @@ -87,10 +87,10 @@
    - - +
    @@ -102,7 +102,7 @@