From 638c7ec684261bf25c2d82ba19e4e2b72c5a9d52 Mon Sep 17 00:00:00 2001 From: nuxsmin Date: Sat, 11 Mar 2017 13:13:45 +0100 Subject: [PATCH] * [MOD] Code refactoring for better response times * [FIX] Fixes #484. LDAP logins will be case-insensitive. Thanks to @basil-twisleton --- inc/Base.php | 2 +- inc/SP/Core/DiFactory.class.php | 16 ++-- inc/SP/Mgmt/ApiTokens/ApiToken.class.php | 1 + inc/SP/Mgmt/ApiTokens/ApiTokenBase.class.php | 33 +++---- inc/SP/Mgmt/Categories/Category.class.php | 7 +- inc/SP/Mgmt/Categories/CategoryBase.class.php | 32 +++---- .../Mgmt/CustomFields/CustomField.class.php | 42 ++++----- .../CustomFields/CustomFieldBase.class.php | 35 +------- .../CustomFields/CustomFieldDef.class.php | 25 +++--- .../CustomFieldDefSearch.class.php | 27 +++--- inc/SP/Mgmt/Customers/Customer.class.php | 7 +- inc/SP/Mgmt/Customers/CustomerBase.class.php | 33 +++---- inc/SP/Mgmt/Files/File.class.php | 2 + inc/SP/Mgmt/Files/FileBase.class.php | 32 +++---- inc/SP/Mgmt/Groups/Group.class.php | 3 +- inc/SP/Mgmt/Groups/GroupAccounts.class.php | 2 +- .../Mgmt/Groups/GroupAccountsBase.class.php | 30 +++---- inc/SP/Mgmt/Groups/GroupBase.class.php | 31 +++---- inc/SP/Mgmt/Groups/GroupUsers.class.php | 57 ++++++------ inc/SP/Mgmt/Groups/GroupUsersBase.class.php | 31 +++---- inc/SP/Mgmt/ItemBaseInterface.class.php | 73 +++++++++++++++ ...Base.class.php => ItemBaseTrait.class.php} | 23 +++-- inc/SP/Mgmt/Notices/Notice.class.php | 1 + inc/SP/Mgmt/Notices/NoticeBase.class.php | 32 +++---- inc/SP/Mgmt/Plugins/Plugin.class.php | 1 + inc/SP/Mgmt/Plugins/PluginBase.class.php | 32 +++---- inc/SP/Mgmt/Profiles/Profile.class.php | 3 +- inc/SP/Mgmt/Profiles/ProfileBase.class.php | 31 +++---- inc/SP/Mgmt/PublicLinks/PublicLink.class.php | 1 + .../Mgmt/PublicLinks/PublicLinkBase.class.php | 75 +++++++--------- inc/SP/Mgmt/Tags/Tag.class.php | 1 + inc/SP/Mgmt/Tags/TagBase.class.php | 31 +++---- inc/SP/Mgmt/Tracks/Track.class.php | 2 + inc/SP/Mgmt/Tracks/TrackBase.class.php | 32 +++---- inc/SP/Mgmt/Users/UserBase.class.php | 32 +++---- inc/SP/Mgmt/Users/UserLdap.class.php | 89 ++++++------------- inc/SP/Mgmt/Users/UserLdapSync.class.php | 5 ++ inc/SP/Mgmt/Users/UserMigrate.class.php | 1 - inc/SP/Mgmt/Users/UserPass.class.php | 37 ++++---- inc/SP/Mgmt/Users/UserPassRecover.class.php | 1 + .../Mgmt/Users/UserPassRecoverBase.class.php | 28 +++--- inc/SP/Mgmt/Users/UserPreferences.class.php | 1 + .../Mgmt/Users/UserPreferencesBase.class.php | 35 +++----- inc/SP/Mgmt/Users/UserUtil.class.php | 4 +- inc/themes/material-blue/css/styles.min.css | 2 +- js/app-requests.min.js | 2 +- 46 files changed, 431 insertions(+), 592 deletions(-) create mode 100644 inc/SP/Mgmt/ItemBaseInterface.class.php rename inc/SP/Mgmt/{ItemBase.class.php => ItemBaseTrait.class.php} (87%) diff --git a/inc/Base.php b/inc/Base.php index 2dc8b1f0..bbe56df9 100644 --- a/inc/Base.php +++ b/inc/Base.php @@ -40,7 +40,7 @@ define('LOCALES_PATH', __DIR__ . DIRECTORY_SEPARATOR . 'locales'); define('SQL_PATH', __DIR__ . DIRECTORY_SEPARATOR . 'sql'); define('LOG_FILE', __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'syspass.log'); -define('DEBUG', false); +define('DEBUG', true); // Required random_compat polyfill for random_bytes() and random_int() // @see https://github.com/paragonie/random_compat/tree/v2.0.4#random_compat diff --git a/inc/SP/Core/DiFactory.class.php b/inc/SP/Core/DiFactory.class.php index 97e492e4..4f332b07 100644 --- a/inc/SP/Core/DiFactory.class.php +++ b/inc/SP/Core/DiFactory.class.php @@ -29,7 +29,7 @@ use SP\Core\Events\EventDispatcherInterface; use SP\Core\Exceptions\InvalidClassException; use SP\Core\UI\Theme; use SP\Core\UI\ThemeInterface; -use SP\Mgmt\ItemBase; +use SP\Mgmt\ItemBaseInterface; use SP\Storage\DBStorageInterface; use SP\Storage\FileStorageInterface; use SP\Storage\MySQLHandler; @@ -51,7 +51,7 @@ class DiFactory */ private static $DBFactory; /** - * @var ItemBase[] + * @var ItemBaseInterface[] */ private static $ItemFactory = []; /** @@ -96,22 +96,24 @@ class DiFactory * * @param string $caller La clase del objeto * @param mixed $itemData Los datos del elemento - * @return ItemBase + * @return ItemBaseInterface */ public static final function getItem($caller, $itemData = null) { // error_log(count(self::$ItemFactory) . '-' . (memory_get_usage() / 1000)); try { - if (isset(self::$ItemFactory[$caller])) { - return (null !== $itemData) ? self::$ItemFactory[$caller]->setItemData($itemData) : self::$ItemFactory[$caller]; + if (!isset(self::$ItemFactory[$caller])) { + self::$ItemFactory[$caller] = new $caller($itemData); + + return self::$ItemFactory[$caller]; } + + return (null !== $itemData) ? self::$ItemFactory[$caller]->setItemData($itemData) : self::$ItemFactory[$caller]; } catch (InvalidClassException $e) { debugLog('Invalid class for item data: ' . $e->getMessage(), true); } - self::$ItemFactory[$caller] = new $caller($itemData); - return self::$ItemFactory[$caller]; } diff --git a/inc/SP/Mgmt/ApiTokens/ApiToken.class.php b/inc/SP/Mgmt/ApiTokens/ApiToken.class.php index 4c960b2e..1a45ef50 100644 --- a/inc/SP/Mgmt/ApiTokens/ApiToken.class.php +++ b/inc/SP/Mgmt/ApiTokens/ApiToken.class.php @@ -41,6 +41,7 @@ use SP\Util\Util; * Class ApiToken * * @package SP\Mgmt\ApiTokens + * @property ApiTokenData $itemData */ class ApiToken extends ApiTokenBase implements ItemInterface { diff --git a/inc/SP/Mgmt/ApiTokens/ApiTokenBase.class.php b/inc/SP/Mgmt/ApiTokens/ApiTokenBase.class.php index dcfa6ff3..b62c6627 100644 --- a/inc/SP/Mgmt/ApiTokens/ApiTokenBase.class.php +++ b/inc/SP/Mgmt/ApiTokens/ApiTokenBase.class.php @@ -26,41 +26,28 @@ namespace SP\Mgmt\ApiTokens; defined('APP_ROOT') || die(); +use SP\Core\Exceptions\InvalidClassException; use SP\DataModel\ApiTokenData; -use SP\Mgmt\ItemBase; +use SP\Mgmt\ItemBaseInterface; +use SP\Mgmt\ItemBaseTrait; /** * Class ApiTokensBase * * @package SP\Mgmt\ApiTokens */ -abstract class ApiTokenBase extends ItemBase +abstract class ApiTokenBase implements ItemBaseInterface { - /** @var ApiTokenData */ - protected $itemData; + use ItemBaseTrait; /** - * ApiTokensBase constructor. + * Inicializar la clase * - * @param $itemData - * @throws \SP\Core\Exceptions\InvalidClassException + * @return void + * @throws InvalidClassException */ - public function __construct($itemData = null) + protected function init() { - if (!$this->dataModel) { - $this->setDataModel(ApiTokenData::class); - } - - parent::__construct($itemData); - } - - /** - * Devolver los datos del elemento - * - * @return ApiTokenData - */ - public function getItemData() - { - return parent::getItemData(); + $this->setDataModel(ApiTokenData::class); } } \ No newline at end of file diff --git a/inc/SP/Mgmt/Categories/Category.class.php b/inc/SP/Mgmt/Categories/Category.class.php index cd865308..f05a61e3 100644 --- a/inc/SP/Mgmt/Categories/Category.class.php +++ b/inc/SP/Mgmt/Categories/Category.class.php @@ -27,21 +27,18 @@ namespace SP\Mgmt\Categories; defined('APP_ROOT') || die(); -use SP\Core\ActionsInterface; use SP\Core\Exceptions\SPException; use SP\DataModel\CategoryData; -use SP\DataModel\CustomFieldData; -use SP\Log\Log; -use SP\Mgmt\CustomFields\CustomField; use SP\Mgmt\ItemInterface; use SP\Mgmt\ItemSelectInterface; use SP\Mgmt\ItemTrait; use SP\Storage\DB; use SP\Storage\QueryData; - /** * Esta clase es la encargada de realizar las operaciones sobre las categorías de sysPass. + * + * @property CategoryData $itemData */ class Category extends CategoryBase implements ItemInterface, ItemSelectInterface { diff --git a/inc/SP/Mgmt/Categories/CategoryBase.class.php b/inc/SP/Mgmt/Categories/CategoryBase.class.php index 852246bb..bc05b703 100644 --- a/inc/SP/Mgmt/Categories/CategoryBase.class.php +++ b/inc/SP/Mgmt/Categories/CategoryBase.class.php @@ -26,40 +26,28 @@ namespace SP\Mgmt\Categories; defined('APP_ROOT') || die(); +use SP\Core\Exceptions\InvalidClassException; use SP\DataModel\CategoryData; -use SP\Mgmt\ItemBase; +use SP\Mgmt\ItemBaseInterface; +use SP\Mgmt\ItemBaseTrait; /** * Class CategoryBase * * @package SP\Mgmt\Categories */ -abstract class CategoryBase extends ItemBase +abstract class CategoryBase implements ItemBaseInterface { - /** @var CategoryData */ - protected $itemData; + use ItemBaseTrait; /** - * Category constructor. + * Inicializar la clase * - * @param $itemData - * @throws \SP\Core\Exceptions\InvalidClassException + * @return void + * @throws InvalidClassException */ - public function __construct($itemData = null) + protected function init() { - if (!$this->dataModel) { - $this->setDataModel(CategoryData::class); - } - - parent::__construct($itemData); - } - - /** - * Devolver los datos del elemento - * @return CategoryData - */ - public function getItemData() - { - return parent::getItemData(); + $this->setDataModel(CategoryData::class); } } \ No newline at end of file diff --git a/inc/SP/Mgmt/CustomFields/CustomField.class.php b/inc/SP/Mgmt/CustomFields/CustomField.class.php index 4916bd3c..36ee6375 100644 --- a/inc/SP/Mgmt/CustomFields/CustomField.class.php +++ b/inc/SP/Mgmt/CustomFields/CustomField.class.php @@ -2,8 +2,8 @@ /** * sysPass * - * @author nuxsmin - * @link http://syspass.org + * @author nuxsmin + * @link http://syspass.org * @copyright 2012-2017, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. @@ -40,34 +40,11 @@ use SP\Util\Util; /** * Class CustomFields para la gestión de campos personalizados de los módulos * - * @package SP + * @package SP\Mgmt\CustomFields + * @property CustomFieldData $itemData */ class CustomField extends CustomFieldBase implements ItemInterface { - /** - * @param CustomFieldData $itemData - * @param int $customFieldDefId - * @throws \SP\Core\Exceptions\SPException - * @throws \SP\Core\Exceptions\InvalidClassException - */ - public function __construct($itemData, $customFieldDefId = null) - { - $this->setDataModel(CustomFieldData::class); - - parent::__construct($itemData); - - if (null !== $customFieldDefId) { - $field = CustomFieldDef::getItem()->getById($customFieldDefId); - - $itemData->setDefinitionId($customFieldDefId); - $itemData->setModule($field->getModule()); - $itemData->setName($field->getName()); - $itemData->setType($field->getType()); - } - - $this->itemData = $itemData; - } - /** * @return mixed * @throws \SP\Core\Exceptions\QueryException @@ -381,4 +358,15 @@ class CustomField extends CustomFieldBase implements ItemInterface { // TODO: Implement getByIdBatch() method. } + + /** + * Inicializar la clase + * + * @return void + * @throws \SP\Core\Exceptions\InvalidClassException + */ + protected function init() + { + $this->setDataModel(CustomFieldData::class); + } } \ No newline at end of file diff --git a/inc/SP/Mgmt/CustomFields/CustomFieldBase.class.php b/inc/SP/Mgmt/CustomFields/CustomFieldBase.class.php index 1e4d6035..462bd761 100644 --- a/inc/SP/Mgmt/CustomFields/CustomFieldBase.class.php +++ b/inc/SP/Mgmt/CustomFields/CustomFieldBase.class.php @@ -26,42 +26,15 @@ namespace SP\Mgmt\CustomFields; defined('APP_ROOT') || die(); -use SP\DataModel\CustomFieldBaseData; -use SP\DataModel\CustomFieldData; -use SP\DataModel\CustomFieldDefData; -use SP\Mgmt\ItemBase; +use SP\Mgmt\ItemBaseInterface; +use SP\Mgmt\ItemBaseTrait; /** * Class CustomFieldsBase para la definición de campos personalizados * * @package SP */ -abstract class CustomFieldBase extends ItemBase +abstract class CustomFieldBase implements ItemBaseInterface { - /** @var CustomFieldBaseData|CustomFieldDefData|CustomFieldData */ - protected $itemData; - - /** - * Category constructor. - * - * @param CustomFieldBaseData $itemData - * @throws \SP\Core\Exceptions\InvalidClassException - */ - public function __construct($itemData = null) - { - if (!$this->dataModel) { - $this->setDataModel(CustomFieldBaseData::class); - } - - parent::__construct($itemData); - } - - /** - * Devolver los datos del elemento - * @return CustomFieldBaseData|CustomFieldDefData|CustomFieldData - */ - public function getItemData() - { - return parent::getItemData(); - } + use ItemBaseTrait; } \ No newline at end of file diff --git a/inc/SP/Mgmt/CustomFields/CustomFieldDef.class.php b/inc/SP/Mgmt/CustomFields/CustomFieldDef.class.php index 01da04b0..ce175a73 100644 --- a/inc/SP/Mgmt/CustomFields/CustomFieldDef.class.php +++ b/inc/SP/Mgmt/CustomFields/CustomFieldDef.class.php @@ -38,24 +38,12 @@ use SP\Util\Util; * Class CustomFieldDef para la gestión de definiciones de campos personalizados * * @package SP + * @property CustomFieldDefData $itemData */ class CustomFieldDef extends CustomFieldBase implements ItemInterface { use ItemTrait; - /** - * Category constructor. - * - * @param CustomFieldDefData $itemData - * @throws \SP\Core\Exceptions\InvalidClassException - */ - public function __construct($itemData = null) - { - $this->setDataModel(CustomFieldDefData::class); - - parent::__construct($itemData); - } - /** * @return mixed * @throws \SP\Core\Exceptions\SPException @@ -287,4 +275,15 @@ class CustomFieldDef extends CustomFieldBase implements ItemInterface return DB::getResultsArray($Data); } + + /** + * Inicializar la clase + * + * @return void + * @throws \SP\Core\Exceptions\InvalidClassException + */ + protected function init() + { + $this->setDataModel(CustomFieldDefData::class); + } } \ No newline at end of file diff --git a/inc/SP/Mgmt/CustomFields/CustomFieldDefSearch.class.php b/inc/SP/Mgmt/CustomFields/CustomFieldDefSearch.class.php index 579999cb..fd2553c5 100644 --- a/inc/SP/Mgmt/CustomFields/CustomFieldDefSearch.class.php +++ b/inc/SP/Mgmt/CustomFields/CustomFieldDefSearch.class.php @@ -2,8 +2,8 @@ /** * sysPass * - * @author nuxsmin - * @link http://syspass.org + * @author nuxsmin + * @link http://syspass.org * @copyright 2012-2017, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. @@ -40,18 +40,6 @@ use SP\Util\Util; */ class CustomFieldDefSearch extends CustomFieldBase implements ItemSearchInterface { - /** - * Category constructor. - * - * @param CustomFieldDefData $itemData - */ - public function __construct($itemData = null) - { - $this->setDataModel('SP\DataModel\CustomFieldDefData'); - - parent::__construct($itemData); - } - /** * @param ItemSearchData $SearchData * @return array|\SP\DataModel\CustomFieldDefData[] @@ -95,4 +83,15 @@ class CustomFieldDefSearch extends CustomFieldBase implements ItemSearchInterfac return $customFields; } + + /** + * Inicializar la clase + * + * @return void + * @throws \SP\Core\Exceptions\InvalidClassException + */ + protected function init() + { + $this->setDataModel(CustomFieldDefData::class); + } } \ No newline at end of file diff --git a/inc/SP/Mgmt/Customers/Customer.class.php b/inc/SP/Mgmt/Customers/Customer.class.php index da45997d..9b394496 100644 --- a/inc/SP/Mgmt/Customers/Customer.class.php +++ b/inc/SP/Mgmt/Customers/Customer.class.php @@ -28,13 +28,8 @@ namespace SP\Mgmt\Customers; defined('APP_ROOT') || die(); use SP\Account\AccountUtil; -use SP\Core\ActionsInterface; use SP\Core\Exceptions\SPException; -use SP\Core\Session; use SP\DataModel\CustomerData; -use SP\DataModel\CustomFieldData; -use SP\Log\Log; -use SP\Mgmt\CustomFields\CustomField; use SP\Mgmt\ItemInterface; use SP\Mgmt\ItemSelectInterface; use SP\Mgmt\ItemTrait; @@ -43,6 +38,8 @@ use SP\Storage\QueryData; /** * Esta clase es la encargada de realizar las operaciones sobre los clientes de sysPass + * + * @property CustomerData $itemData */ class Customer extends CustomerBase implements ItemInterface, ItemSelectInterface { diff --git a/inc/SP/Mgmt/Customers/CustomerBase.class.php b/inc/SP/Mgmt/Customers/CustomerBase.class.php index b9341f27..2cf09fe9 100644 --- a/inc/SP/Mgmt/Customers/CustomerBase.class.php +++ b/inc/SP/Mgmt/Customers/CustomerBase.class.php @@ -26,41 +26,28 @@ namespace SP\Mgmt\Customers; defined('APP_ROOT') || die(); +use SP\Core\Exceptions\InvalidClassException; use SP\DataModel\CustomerData; -use SP\Mgmt\ItemBase; +use SP\Mgmt\ItemBaseInterface; +use SP\Mgmt\ItemBaseTrait; /** * Class CustomerBase * * @package SP\Mgmt\Customers */ -abstract class CustomerBase extends ItemBase +abstract class CustomerBase implements ItemBaseInterface { - /** @var CustomerData */ - protected $itemData; + use ItemBaseTrait; /** - * Category constructor. + * Inicializar la clase * - * @param $itemData - * @throws \SP\Core\Exceptions\InvalidClassException + * @return void + * @throws InvalidClassException */ - public function __construct($itemData = null) + protected function init() { - if (!$this->dataModel) { - $this->setDataModel(CustomerData::class); - } - - parent::__construct($itemData); - } - - /** - * Devolver los datos del elemento - * - * @return CustomerData - */ - public function getItemData() - { - return parent::getItemData(); + $this->setDataModel(CustomerData::class); } } \ No newline at end of file diff --git a/inc/SP/Mgmt/Files/File.class.php b/inc/SP/Mgmt/Files/File.class.php index 85dfb8b0..ac4ad12d 100644 --- a/inc/SP/Mgmt/Files/File.class.php +++ b/inc/SP/Mgmt/Files/File.class.php @@ -42,6 +42,8 @@ defined('APP_ROOT') || die(); /** * Esta clase es la encargada de realizar operaciones con archivos de las cuentas de sysPass + * + * @property FileData $itemData */ class File extends FileBase implements ItemInterface, ItemSelectInterface { diff --git a/inc/SP/Mgmt/Files/FileBase.class.php b/inc/SP/Mgmt/Files/FileBase.class.php index 12541b27..10a100c9 100644 --- a/inc/SP/Mgmt/Files/FileBase.class.php +++ b/inc/SP/Mgmt/Files/FileBase.class.php @@ -24,40 +24,28 @@ namespace SP\Mgmt\Files; +use SP\Core\Exceptions\InvalidClassException; use SP\DataModel\FileData; -use SP\Mgmt\ItemBase; +use SP\Mgmt\ItemBaseInterface; +use SP\Mgmt\ItemBaseTrait; /** * Class FileBase * * @package SP\Mgmt\Files */ -abstract class FileBase extends ItemBase +abstract class FileBase implements ItemBaseInterface { - /** @var FileData */ - protected $itemData; + use ItemBaseTrait; /** - * Category constructor. + * Inicializar la clase * - * @param FileData $itemData - * @throws \SP\Core\Exceptions\InvalidClassException + * @return void + * @throws InvalidClassException */ - public function __construct($itemData = null) + protected function init() { - if (!$this->dataModel) { - $this->setDataModel(FileData::class); - } - - parent::__construct($itemData); - } - - /** - * Devolver los datos del elemento - * @return FileData - */ - public function getItemData() - { - return parent::getItemData(); + $this->setDataModel(FileData::class); } } \ No newline at end of file diff --git a/inc/SP/Mgmt/Groups/Group.class.php b/inc/SP/Mgmt/Groups/Group.class.php index 9ef68c58..c49fd89a 100644 --- a/inc/SP/Mgmt/Groups/Group.class.php +++ b/inc/SP/Mgmt/Groups/Group.class.php @@ -28,7 +28,6 @@ namespace SP\Mgmt\Groups; use SP\Core\Exceptions\SPException; use SP\DataModel\GroupData; use SP\DataModel\GroupUsersData; -use SP\Log\Log; use SP\Mgmt\ItemInterface; use SP\Mgmt\ItemSelectInterface; use SP\Mgmt\ItemTrait; @@ -39,6 +38,8 @@ defined('APP_ROOT') || die(); /** * Esta clase es la encargada de realizar las operaciones sobre los grupos de usuarios. + * + * @property GroupData $itemData */ class Group extends GroupBase implements ItemInterface, ItemSelectInterface { diff --git a/inc/SP/Mgmt/Groups/GroupAccounts.class.php b/inc/SP/Mgmt/Groups/GroupAccounts.class.php index 36bf895f..93811245 100644 --- a/inc/SP/Mgmt/Groups/GroupAccounts.class.php +++ b/inc/SP/Mgmt/Groups/GroupAccounts.class.php @@ -26,7 +26,6 @@ namespace SP\Mgmt\Groups; defined('APP_ROOT') || die(); -use SP\Core\Exceptions\SPException; use SP\DataModel\GroupAccountsData; use SP\Mgmt\ItemInterface; use SP\Mgmt\ItemTrait; @@ -37,6 +36,7 @@ use SP\Storage\QueryData; * Class GroupAccounts * * @package SP\Mgmt\Groups + * @property GroupAccountsData $itemData */ class GroupAccounts extends GroupAccountsBase implements ItemInterface { diff --git a/inc/SP/Mgmt/Groups/GroupAccountsBase.class.php b/inc/SP/Mgmt/Groups/GroupAccountsBase.class.php index be745387..8eab0489 100644 --- a/inc/SP/Mgmt/Groups/GroupAccountsBase.class.php +++ b/inc/SP/Mgmt/Groups/GroupAccountsBase.class.php @@ -24,8 +24,10 @@ namespace SP\Mgmt\Groups; +use SP\Core\Exceptions\InvalidClassException; use SP\DataModel\GroupAccountsData; -use SP\Mgmt\ItemBase; +use SP\Mgmt\ItemBaseInterface; +use SP\Mgmt\ItemBaseTrait; defined('APP_ROOT') || die(); @@ -34,30 +36,18 @@ defined('APP_ROOT') || die(); * * @package SP\Mgmt\Groups */ -abstract class GroupAccountsBase extends ItemBase +abstract class GroupAccountsBase implements ItemBaseInterface { - /** @var GroupAccountsData */ - protected $itemData; + use ItemBaseTrait; /** - * Category constructor. + * Inicializar la clase * - * @param GroupAccountsData $itemData + * @return void + * @throws InvalidClassException */ - public function __construct($itemData = null) + protected function init() { - if (!$this->dataModel) { - $this->setDataModel('SP\DataModel\GroupAccountsData'); - } - - parent::__construct($itemData); - } - - /** - * @return GroupAccountsData - */ - public function getItemData() - { - return parent::getItemData(); + $this->setDataModel(GroupAccountsData::class); } } \ No newline at end of file diff --git a/inc/SP/Mgmt/Groups/GroupBase.class.php b/inc/SP/Mgmt/Groups/GroupBase.class.php index 1e030f3d..b18cd95b 100644 --- a/inc/SP/Mgmt/Groups/GroupBase.class.php +++ b/inc/SP/Mgmt/Groups/GroupBase.class.php @@ -24,39 +24,28 @@ namespace SP\Mgmt\Groups; +use SP\Core\Exceptions\InvalidClassException; use SP\DataModel\GroupData; -use SP\Mgmt\ItemBase; +use SP\Mgmt\ItemBaseInterface; +use SP\Mgmt\ItemBaseTrait; /** * Class GroupBase * * @package SP\Mgmt\Groups */ -abstract class GroupBase extends ItemBase +abstract class GroupBase implements ItemBaseInterface { - /** @var GroupData */ - protected $itemData; + use ItemBaseTrait; /** - * Category constructor. + * Inicializar la clase * - * @param GroupData $itemData - * @throws \SP\Core\Exceptions\InvalidClassException + * @return void + * @throws InvalidClassException */ - public function __construct($itemData = null) + protected function init() { - if (!$this->dataModel) { - $this->setDataModel(GroupData::class); - } - - parent::__construct($itemData); - } - - /** - * @return GroupData - */ - public function getItemData() - { - return parent::getItemData(); + $this->setDataModel(GroupData::class); } } \ No newline at end of file diff --git a/inc/SP/Mgmt/Groups/GroupUsers.class.php b/inc/SP/Mgmt/Groups/GroupUsers.class.php index 56f4fa89..78800024 100644 --- a/inc/SP/Mgmt/Groups/GroupUsers.class.php +++ b/inc/SP/Mgmt/Groups/GroupUsers.class.php @@ -2,8 +2,8 @@ /** * sysPass * - * @author nuxsmin - * @link http://syspass.org + * @author nuxsmin + * @link http://syspass.org * @copyright 2012-2017, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. @@ -38,6 +38,7 @@ use SP\Storage\QueryData; * Class GroupUser * * @package SP\Mgmt\Groups + * @property GroupUsersData $itemData */ class GroupUsers extends GroupUsersBase implements ItemInterface, ItemSelectInterface { @@ -45,30 +46,12 @@ class GroupUsers extends GroupUsersBase implements ItemInterface, ItemSelectInte /** * @return $this - * @throws SPException + * @throws \SP\Core\Exceptions\SPException */ - public function add() + public function update() { - if (!is_array($this->itemData->getUsers()) - || count($this->itemData->getUsers()) === 0 - ) { - return $this; - } - - $query = /** @lang SQL */ - 'INSERT INTO usrToGroups (usertogroup_userId, usertogroup_groupId) VALUES ' . $this->getParamsFromArray($this->itemData->getUsers(), '(?,?)'); - - $Data = new QueryData(); - $Data->setQuery($query); - - foreach ($this->itemData->getUsers() as $user){ - $Data->addParam($user); - $Data->addParam($this->itemData->getUsertogroupGroupId()); - } - - $Data->setOnErrorMessage(__('Error al asignar los usuarios al grupo', false)); - - DB::getQuery($Data); + $this->delete($this->itemData->getUsertogroupGroupId()); + $this->add(); return $this; } @@ -95,12 +78,30 @@ class GroupUsers extends GroupUsersBase implements ItemInterface, ItemSelectInte /** * @return $this - * @throws \SP\Core\Exceptions\SPException + * @throws SPException */ - public function update() + public function add() { - $this->delete($this->itemData->getUsertogroupGroupId()); - $this->add(); + if (!is_array($this->itemData->getUsers()) + || count($this->itemData->getUsers()) === 0 + ) { + return $this; + } + + $query = /** @lang SQL */ + 'INSERT INTO usrToGroups (usertogroup_userId, usertogroup_groupId) VALUES ' . $this->getParamsFromArray($this->itemData->getUsers(), '(?,?)'); + + $Data = new QueryData(); + $Data->setQuery($query); + + foreach ($this->itemData->getUsers() as $user) { + $Data->addParam($user); + $Data->addParam($this->itemData->getUsertogroupGroupId()); + } + + $Data->setOnErrorMessage(__('Error al asignar los usuarios al grupo', false)); + + DB::getQuery($Data); return $this; } diff --git a/inc/SP/Mgmt/Groups/GroupUsersBase.class.php b/inc/SP/Mgmt/Groups/GroupUsersBase.class.php index 6d4cce52..0f762100 100644 --- a/inc/SP/Mgmt/Groups/GroupUsersBase.class.php +++ b/inc/SP/Mgmt/Groups/GroupUsersBase.class.php @@ -24,39 +24,28 @@ namespace SP\Mgmt\Groups; +use SP\Core\Exceptions\InvalidClassException; use SP\DataModel\GroupUsersData; -use SP\Mgmt\ItemBase; +use SP\Mgmt\ItemBaseInterface; +use SP\Mgmt\ItemBaseTrait; /** * Class GroupUserBase * * @package SP\Mgmt\Groups */ -abstract class GroupUsersBase extends ItemBase +abstract class GroupUsersBase implements ItemBaseInterface { - /** @var GroupUsersData */ - protected $itemData; + use ItemBaseTrait; /** - * Category constructor. + * Inicializar la clase * - * @param GroupUsersData $itemData - * @throws \SP\Core\Exceptions\InvalidClassException + * @return void + * @throws InvalidClassException */ - public function __construct($itemData = null) + protected function init() { - if (!$this->dataModel) { - $this->setDataModel(GroupUsersData::class); - } - - parent::__construct($itemData); - } - - /** - * @return GroupUsersData - */ - public function getItemData() - { - return parent::getItemData(); + $this->setDataModel(GroupUsersData::class); } } \ No newline at end of file diff --git a/inc/SP/Mgmt/ItemBaseInterface.class.php b/inc/SP/Mgmt/ItemBaseInterface.class.php new file mode 100644 index 00000000..38b2d168 --- /dev/null +++ b/inc/SP/Mgmt/ItemBaseInterface.class.php @@ -0,0 +1,73 @@ +. + */ + +namespace SP\Mgmt; + +use SP\DataModel\DataModelInterface; + +/** + * Interface ItemBaseInterface + * + * @package SP\Mgmt + */ +interface ItemBaseInterface +{ + /** + * Devolver la instancia almacenada de la clase. Si no existe, se crea + * + * @param $itemData + * @return static + */ + public static function getItem($itemData = null); + + /** + * Devolver una nueva instancia de la clase + * + * @param null $itemData + * @return static + */ + public static function getNewItem($itemData = null); + + /** + * Devolver los datos del elemento + * + * @return mixed|DataModelInterface + */ + public function getItemData(); + + /** + * Establecer los datos del elemento + * + * @param mixed|DataModelInterface $itemData + * @return static + */ + public function setItemData($itemData); + + /** + * Obtener el nombre de la clase para el modelo de datos + * + * @return string + */ + public function getDataModel(); +} \ No newline at end of file diff --git a/inc/SP/Mgmt/ItemBase.class.php b/inc/SP/Mgmt/ItemBaseTrait.class.php similarity index 87% rename from inc/SP/Mgmt/ItemBase.class.php rename to inc/SP/Mgmt/ItemBaseTrait.class.php index 16c22c6a..ec4ab31e 100644 --- a/inc/SP/Mgmt/ItemBase.class.php +++ b/inc/SP/Mgmt/ItemBaseTrait.class.php @@ -2,8 +2,8 @@ /** * sysPass * - * @author nuxsmin - * @link http://syspass.org + * @author nuxsmin + * @link http://syspass.org * @copyright 2012-2017, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. @@ -30,11 +30,11 @@ use SP\Core\Exceptions\SPException; use SP\DataModel\DataModelInterface; /** - * Class ItemBase + * Class ItemBaseTrait * * @package SP\Mgmt */ -abstract class ItemBase +trait ItemBaseTrait { /** * @var string @@ -53,6 +53,8 @@ abstract class ItemBase */ public function __construct($itemData = null) { + $this->init(); + if (null !== $itemData) { $this->setItemData($itemData); } else { @@ -100,7 +102,7 @@ abstract class ItemBase */ public final function setItemData($itemData) { - if (null !== $this->dataModel && !$itemData instanceof $this->dataModel) { + if (null !== $this->dataModel && ($itemData instanceof $this->dataModel) === false) { throw new InvalidClassException(SPException::SP_ERROR, $this->dataModel); } @@ -119,17 +121,24 @@ abstract class ItemBase /** * @param string $dataModel - * @return $this + * @return static * @throws InvalidClassException */ protected final function setDataModel($dataModel) { if (false === class_exists($dataModel)) { - throw new InvalidClassException($dataModel); + throw new InvalidClassException(SPException::SP_ERROR, $dataModel); } $this->dataModel = $dataModel; return $this; } + + /** + * Inicializar la clase + * + * @return void + */ + protected abstract function init(); } \ No newline at end of file diff --git a/inc/SP/Mgmt/Notices/Notice.class.php b/inc/SP/Mgmt/Notices/Notice.class.php index 07c16f4f..654f52eb 100644 --- a/inc/SP/Mgmt/Notices/Notice.class.php +++ b/inc/SP/Mgmt/Notices/Notice.class.php @@ -36,6 +36,7 @@ use SP\Storage\QueryData; * Class Notice * * @package SP\Mgmt\Notices + * @property NoticeData $itemData */ class Notice extends NoticeBase implements ItemInterface { diff --git a/inc/SP/Mgmt/Notices/NoticeBase.class.php b/inc/SP/Mgmt/Notices/NoticeBase.class.php index a3523d77..a699876b 100644 --- a/inc/SP/Mgmt/Notices/NoticeBase.class.php +++ b/inc/SP/Mgmt/Notices/NoticeBase.class.php @@ -26,40 +26,28 @@ namespace SP\Mgmt\Notices; defined('APP_ROOT') || die(); +use SP\Core\Exceptions\InvalidClassException; use SP\DataModel\NoticeData; -use SP\Mgmt\ItemBase; +use SP\Mgmt\ItemBaseInterface; +use SP\Mgmt\ItemBaseTrait; /** * Class NoticeBase * * @package SP\Mgmt\Notices */ -abstract class NoticeBase extends ItemBase +abstract class NoticeBase implements ItemBaseInterface { - /** @var NoticeData */ - protected $itemData; + use ItemBaseTrait; /** - * Notice constructor. + * Inicializar la clase * - * @param $itemData - * @throws \SP\Core\Exceptions\InvalidClassException + * @return void + * @throws InvalidClassException */ - public function __construct($itemData = null) + protected function init() { - if (!$this->dataModel) { - $this->setDataModel(NoticeData::class); - } - - parent::__construct($itemData); - } - - /** - * Devolver los datos del elemento - * @return NoticeData - */ - public function getItemData() - { - return parent::getItemData(); + $this->setDataModel(NoticeData::class); } } \ No newline at end of file diff --git a/inc/SP/Mgmt/Plugins/Plugin.class.php b/inc/SP/Mgmt/Plugins/Plugin.class.php index f46eaf35..fccd3cc3 100644 --- a/inc/SP/Mgmt/Plugins/Plugin.class.php +++ b/inc/SP/Mgmt/Plugins/Plugin.class.php @@ -35,6 +35,7 @@ use SP\Storage\QueryData; * Class Plugin * * @package SP\Mgmt\Plugins + * @property PluginData $itemData */ class Plugin extends PluginBase implements ItemInterface { diff --git a/inc/SP/Mgmt/Plugins/PluginBase.class.php b/inc/SP/Mgmt/Plugins/PluginBase.class.php index 2ce29761..b85981b3 100644 --- a/inc/SP/Mgmt/Plugins/PluginBase.class.php +++ b/inc/SP/Mgmt/Plugins/PluginBase.class.php @@ -26,40 +26,28 @@ namespace SP\Mgmt\Plugins; defined('APP_ROOT') || die(); +use SP\Core\Exceptions\InvalidClassException; use SP\DataModel\PluginData; -use SP\Mgmt\ItemBase; +use SP\Mgmt\ItemBaseInterface; +use SP\Mgmt\ItemBaseTrait; /** * Class CategoryBase * * @package SP\Mgmt\Categories */ -abstract class PluginBase extends ItemBase +abstract class PluginBase implements ItemBaseInterface { - /** @var PluginData */ - protected $itemData; + use ItemBaseTrait; /** - * Plugin constructor. + * Inicializar la clase * - * @param $itemData - * @throws \SP\Core\Exceptions\InvalidClassException + * @return void + * @throws InvalidClassException */ - public function __construct($itemData = null) + protected function init() { - if (!$this->dataModel) { - $this->setDataModel(PluginData::class); - } - - parent::__construct($itemData); - } - - /** - * Devolver los datos del elemento - * @return PluginData - */ - public function getItemData() - { - return parent::getItemData(); + $this->setDataModel(PluginData::class); } } \ No newline at end of file diff --git a/inc/SP/Mgmt/Profiles/Profile.class.php b/inc/SP/Mgmt/Profiles/Profile.class.php index 7d6338ff..b37aabab 100644 --- a/inc/SP/Mgmt/Profiles/Profile.class.php +++ b/inc/SP/Mgmt/Profiles/Profile.class.php @@ -38,9 +38,10 @@ use SP\Storage\DB; use SP\Storage\QueryData; use SP\Util\Util; - /** * Esta clase es la encargada de realizar las operaciones sobre los perfiles de usuarios. + * + * @property ProfileData $itemData */ class Profile extends ProfileBase implements ItemInterface, ItemSelectInterface { diff --git a/inc/SP/Mgmt/Profiles/ProfileBase.class.php b/inc/SP/Mgmt/Profiles/ProfileBase.class.php index 23cbc70f..20efcd6d 100644 --- a/inc/SP/Mgmt/Profiles/ProfileBase.class.php +++ b/inc/SP/Mgmt/Profiles/ProfileBase.class.php @@ -24,8 +24,10 @@ namespace SP\Mgmt\Profiles; +use SP\Core\Exceptions\InvalidClassException; use SP\DataModel\ProfileData; -use SP\Mgmt\ItemBase; +use SP\Mgmt\ItemBaseInterface; +use SP\Mgmt\ItemBaseTrait; defined('APP_ROOT') || die(); @@ -34,31 +36,18 @@ defined('APP_ROOT') || die(); * * @package SP */ -abstract class ProfileBase extends ItemBase +abstract class ProfileBase implements ItemBaseInterface { - /** @var ProfileData */ - protected $itemData; + use ItemBaseTrait; /** - * Category constructor. + * Inicializar la clase * - * @param ProfileData $itemData - * @throws \SP\Core\Exceptions\InvalidClassException + * @return void + * @throws InvalidClassException */ - public function __construct($itemData = null) + protected function init() { - if (!$this->dataModel) { - $this->setDataModel(ProfileData::class); - } - - parent::__construct($itemData); - } - - /** - * @return ProfileData - */ - public function getItemData() - { - return parent::getItemData(); + $this->setDataModel(ProfileData::class); } } \ No newline at end of file diff --git a/inc/SP/Mgmt/PublicLinks/PublicLink.class.php b/inc/SP/Mgmt/PublicLinks/PublicLink.class.php index 12bd68ab..3848323a 100644 --- a/inc/SP/Mgmt/PublicLinks/PublicLink.class.php +++ b/inc/SP/Mgmt/PublicLinks/PublicLink.class.php @@ -46,6 +46,7 @@ defined('APP_ROOT') || die(); * Class PublicLink para la creación de enlaces públicos * * @package SP + * @property PublicLinkBaseData $itemData */ class PublicLink extends PublicLinkBase implements ItemInterface { diff --git a/inc/SP/Mgmt/PublicLinks/PublicLinkBase.class.php b/inc/SP/Mgmt/PublicLinks/PublicLinkBase.class.php index 145bec34..35cc223e 100644 --- a/inc/SP/Mgmt/PublicLinks/PublicLinkBase.class.php +++ b/inc/SP/Mgmt/PublicLinks/PublicLinkBase.class.php @@ -30,43 +30,32 @@ use SP\Account\Account; use SP\Config\Config; use SP\Core\Crypt\Crypt; use SP\Core\Crypt\Session as CryptSession; +use SP\Core\Exceptions\InvalidClassException; use SP\Core\Exceptions\SPException; use SP\DataModel\AccountExtData; -use SP\DataModel\PublicLinkData; -use SP\Mgmt\ItemBase; use SP\DataModel\PublicLinkBaseData; +use SP\Mgmt\ItemBaseInterface; +use SP\Mgmt\ItemBaseTrait; /** * Class PublicLinks para la gestión de enlaces públicos * * @package SP + * @property PublicLinkBaseData $itemData */ -abstract class PublicLinkBase extends ItemBase +abstract class PublicLinkBase implements ItemBaseInterface { - /** @var PublicLinkData */ - protected $itemData; + use ItemBaseTrait; /** - * Category constructor. + * Inicializar la clase * - * @param PublicLinkData $itemData - * @throws \SP\Core\Exceptions\InvalidClassException + * @return void + * @throws InvalidClassException */ - public function __construct($itemData = null) + protected function init() { - if (!$this->dataModel) { - $this->setDataModel(PublicLinkBaseData::class); - } - - parent::__construct($itemData); - } - - /** - * @return PublicLinkData - */ - public function getItemData() - { - return parent::getItemData(); + $this->setDataModel(PublicLinkBaseData::class); } /** @@ -86,6 +75,26 @@ abstract class PublicLinkBase extends ItemBase $this->itemData->setPassIV($securedKey); } + /** + * Generar el hash para el enlace + * + * @param bool $refresh Si es necesario regenerar el hash + * @return string + */ + protected final function createLinkHash($refresh = false) + { + if ($refresh === true + || $this->itemData->getLinkHash() === '' + ) { + $hash = hash('sha256', uniqid('sysPassPublicLink', true)); + + $this->itemData->setPublicLinkHash($hash); + $this->itemData->setLinkHash($hash); + } + + return $this->itemData->getLinkHash(); + } + /** * Obtener los datos de una cuenta y encriptarlos para el enlace * @@ -113,30 +122,8 @@ abstract class PublicLinkBase extends ItemBase $this->itemData->setPassIV($linkSecuredKey); } - /** - * Generar el hash para el enlace - * - * @param bool $refresh Si es necesario regenerar el hash - * @return string - */ - protected final function createLinkHash($refresh = false) - { - if ($refresh === true - || $this->itemData->getLinkHash() === '' - ) { - $hash = hash('sha256', uniqid('sysPassPublicLink', true)); - - $this->itemData->setPublicLinkHash($hash); - $this->itemData->setLinkHash($hash); - } - - return $this->itemData->getLinkHash(); - } - /** * Devolver el tiempo de caducidad del enlace - * - * @return int */ protected final function calcDateExpire() { diff --git a/inc/SP/Mgmt/Tags/Tag.class.php b/inc/SP/Mgmt/Tags/Tag.class.php index eaa97c6a..69e5c7a8 100644 --- a/inc/SP/Mgmt/Tags/Tag.class.php +++ b/inc/SP/Mgmt/Tags/Tag.class.php @@ -38,6 +38,7 @@ use SP\Storage\QueryData; * Class Tags * * @package SP\Mgmt\Tags + * @property TagData $itemData */ class Tag extends TagBase implements ItemInterface, ItemSelectInterface { diff --git a/inc/SP/Mgmt/Tags/TagBase.class.php b/inc/SP/Mgmt/Tags/TagBase.class.php index 712caeb5..adc4a670 100644 --- a/inc/SP/Mgmt/Tags/TagBase.class.php +++ b/inc/SP/Mgmt/Tags/TagBase.class.php @@ -24,8 +24,10 @@ namespace SP\Mgmt\Tags; +use SP\Core\Exceptions\InvalidClassException; use SP\DataModel\TagData; -use SP\Mgmt\ItemBase; +use SP\Mgmt\ItemBaseInterface; +use SP\Mgmt\ItemBaseTrait; defined('APP_ROOT') || die(); @@ -34,31 +36,18 @@ defined('APP_ROOT') || die(); * * @package SP\Mgmt\Tags */ -class TagBase extends ItemBase +class TagBase implements ItemBaseInterface { - /** @var TagData */ - protected $itemData; + use ItemBaseTrait; /** - * Category constructor. + * Inicializar la clase * - * @param TagData $itemData - * @throws \SP\Core\Exceptions\InvalidClassException + * @return void + * @throws InvalidClassException */ - public function __construct($itemData = null) + protected function init() { - if (!$this->dataModel) { - $this->setDataModel(TagData::class); - } - - parent::__construct($itemData); - } - - /** - * @return TagData - */ - public function getItemData() - { - return parent::getItemData(); + $this->setDataModel(TagData::class); } } \ No newline at end of file diff --git a/inc/SP/Mgmt/Tracks/Track.class.php b/inc/SP/Mgmt/Tracks/Track.class.php index f312328d..2e554bf1 100644 --- a/inc/SP/Mgmt/Tracks/Track.class.php +++ b/inc/SP/Mgmt/Tracks/Track.class.php @@ -24,6 +24,7 @@ namespace SP\Mgmt\Tracks; +use SP\DataModel\TrackData; use SP\Mgmt\ItemInterface; use SP\Storage\DB; use SP\Storage\QueryData; @@ -32,6 +33,7 @@ use SP\Storage\QueryData; * Class Track * * @package SP\Mgmt\Tracks + * @property TrackData $itemData */ class Track extends TrackBase implements ItemInterface { diff --git a/inc/SP/Mgmt/Tracks/TrackBase.class.php b/inc/SP/Mgmt/Tracks/TrackBase.class.php index 04a5df1b..1ad6a0f5 100644 --- a/inc/SP/Mgmt/Tracks/TrackBase.class.php +++ b/inc/SP/Mgmt/Tracks/TrackBase.class.php @@ -26,40 +26,28 @@ namespace SP\Mgmt\Tracks; defined('APP_ROOT') || die(); +use SP\Core\Exceptions\InvalidClassException; use SP\DataModel\TrackData; -use SP\Mgmt\ItemBase; +use SP\Mgmt\ItemBaseInterface; +use SP\Mgmt\ItemBaseTrait; /** * Class TrackBase * * @package SP\Mgmt\Tracks */ -abstract class TrackBase extends ItemBase +abstract class TrackBase implements ItemBaseInterface { - /** @var TrackData */ - protected $itemData; + use ItemBaseTrait; /** - * Track constructor. + * Inicializar la clase * - * @param $itemData - * @throws \SP\Core\Exceptions\InvalidClassException + * @return void + * @throws InvalidClassException */ - public function __construct($itemData = null) + protected function init() { - if (!$this->dataModel) { - $this->setDataModel(TrackData::class); - } - - parent::__construct($itemData); - } - - /** - * Devolver los datos del elemento - * @return TrackData - */ - public function getItemData() - { - return parent::getItemData(); + $this->setDataModel(TrackData::class); } } \ No newline at end of file diff --git a/inc/SP/Mgmt/Users/UserBase.class.php b/inc/SP/Mgmt/Users/UserBase.class.php index 35ac26d2..69888760 100644 --- a/inc/SP/Mgmt/Users/UserBase.class.php +++ b/inc/SP/Mgmt/Users/UserBase.class.php @@ -26,39 +26,29 @@ namespace SP\Mgmt\Users; defined('APP_ROOT') || die(); +use SP\Core\Exceptions\InvalidClassException; use SP\DataModel\UserData; -use SP\Mgmt\ItemBase; +use SP\Mgmt\ItemBaseInterface; +use SP\Mgmt\ItemBaseTrait; /** * Class UserBase * * @package SP + * @property UserData $itemdata */ -abstract class UserBase extends ItemBase +abstract class UserBase implements ItemBaseInterface { - /** @var UserData */ - protected $itemData; + use ItemBaseTrait; /** - * Category constructor. + * Inicializar la clase * - * @param UserData $itemData - * @throws \SP\Core\Exceptions\InvalidClassException + * @return void + * @throws InvalidClassException */ - public function __construct($itemData = null) + protected function init() { - if (!$this->dataModel) { - $this->setDataModel(UserData::class); - } - - parent::__construct($itemData); - } - - /** - * @return UserData - */ - public function getItemData() - { - return parent::getItemData(); + $this->setDataModel(UserData::class); } } \ No newline at end of file diff --git a/inc/SP/Mgmt/Users/UserLdap.class.php b/inc/SP/Mgmt/Users/UserLdap.class.php index 9367a9f1..4f190191 100644 --- a/inc/SP/Mgmt/Users/UserLdap.class.php +++ b/inc/SP/Mgmt/Users/UserLdap.class.php @@ -30,7 +30,6 @@ use SP\Core\Exceptions\SPException; use SP\Core\Messages\LogMessage; use SP\Log\Email; use SP\Log\Log; -use SP\Mgmt\ItemInterface; use SP\Storage\DB; use SP\Storage\QueryData; @@ -41,7 +40,7 @@ defined('APP_ROOT') || die(); * * @package SP */ -class UserLdap extends UserBase implements ItemInterface +class UserLdap extends User { /** * Comprobar si los datos del usuario de LDAP están en la BBDD. @@ -54,7 +53,7 @@ class UserLdap extends UserBase implements ItemInterface public static function checkLDAPUserInDB($userLogin) { $query = /** @lang SQL */ - 'SELECT user_login FROM usrData WHERE user_login = ? LIMIT 1'; + 'SELECT user_login FROM usrData WHERE LOWER(user_login) = LOWER(?) LIMIT 1'; $Data = new QueryData(); $Data->setQuery($query); @@ -149,7 +148,7 @@ class UserLdap extends UserBase implements ItemInterface $query = /** @lang SQL */ 'SELECT user_login, user_email FROM usrData - WHERE UPPER(user_login) = UPPER(?) OR UPPER(user_email) = UPPER(?)'; + WHERE LOWER(user_login) = LOWER(?) OR LOWER(user_email) = LOWER(?)'; $Data = new QueryData(); $Data->setQuery($query); @@ -161,15 +160,6 @@ class UserLdap extends UserBase implements ItemInterface return $Data->getQueryNumRows() > 0; } - /** - * @param $id int - * @return mixed - */ - public function delete($id) - { - // TODO: Implement delete() method. - } - /** * @return $this * @throws \SP\Core\Exceptions\SPException @@ -183,7 +173,7 @@ class UserLdap extends UserBase implements ItemInterface user_email = ?, user_lastUpdate = NOW(), user_isLdap = 1 - WHERE user_login = ? LIMIT 1'; + WHERE LOWER(user_login) = LOWER(?) LIMIT 1'; $Data = new QueryData(); $Data->setQuery($query); @@ -199,58 +189,31 @@ class UserLdap extends UserBase implements ItemInterface } /** - * @param $id int - * @return mixed - */ - public function getById($id) - { - // TODO: Implement getById() method. - } - - /** - * @return mixed - */ - public function getAll() - { - // TODO: Implement getAll() method. - } - - /** - * @param $id int - * @return mixed - */ - public function checkInUse($id) - { - // TODO: Implement checkInUse() method. - } - - /** - * @return bool - */ - public function checkDuplicatedOnUpdate() - { - // TODO: Implement checkDuplicatedOnUpdate() method. - } - - /** - * Eliminar elementos en lote - * - * @param array $ids * @return $this + * @throws \SP\Core\Exceptions\SPException */ - public function deleteBatch(array $ids) + public function updateOnLogin() { - // TODO: Implement deleteBatch() method. - } + $query = 'UPDATE usrData SET + user_pass = ?, + user_hashSalt = \'\', + user_name = ?, + user_email = ?, + user_lastUpdate = NOW(), + user_lastLogin = NOW(), + user_isLdap = 1 + WHERE LOWER(user_login) = LOWER(?) LIMIT 1'; - /** - * Devolver los elementos con los ids especificados - * - * @param array $ids - * @return mixed - */ - public function getByIdBatch(array $ids) - { - // TODO: Implement getByIdBatch() method. + $Data = new QueryData(); + $Data->setQuery($query); + $Data->addParam(Hash::hashKey($this->itemData->getUserPass())); + $Data->addParam($this->itemData->getUserName()); + $Data->addParam($this->itemData->getUserEmail()); + $Data->addParam($this->itemData->getUserLogin()); + $Data->setOnErrorMessage(__('Error al actualizar la clave del usuario en la BBDD', false)); + + DB::getQuery($Data); + + return $this; } } \ No newline at end of file diff --git a/inc/SP/Mgmt/Users/UserLdapSync.class.php b/inc/SP/Mgmt/Users/UserLdapSync.class.php index 99316c71..14bc544f 100644 --- a/inc/SP/Mgmt/Users/UserLdapSync.class.php +++ b/inc/SP/Mgmt/Users/UserLdapSync.class.php @@ -32,6 +32,11 @@ use SP\DataModel\UserData; use SP\Log\Log; use SP\Util\Util; +/** + * Class UserLdapSync + * + * @package SP\Mgmt\Users + */ class UserLdapSync { /** diff --git a/inc/SP/Mgmt/Users/UserMigrate.class.php b/inc/SP/Mgmt/Users/UserMigrate.class.php index 8e4193fa..cb29a2e9 100644 --- a/inc/SP/Mgmt/Users/UserMigrate.class.php +++ b/inc/SP/Mgmt/Users/UserMigrate.class.php @@ -29,7 +29,6 @@ defined('APP_ROOT') || die(); use SP\Core\Crypt\Hash; use SP\Core\Exceptions\SPException; use SP\DataModel\GroupUsersData; -use SP\DataModel\UserData; use SP\DataModel\UserLoginData; use SP\Log\Email; use SP\Log\Log; diff --git a/inc/SP/Mgmt/Users/UserPass.class.php b/inc/SP/Mgmt/Users/UserPass.class.php index a821bf13..056430f3 100644 --- a/inc/SP/Mgmt/Users/UserPass.class.php +++ b/inc/SP/Mgmt/Users/UserPass.class.php @@ -32,6 +32,7 @@ use SP\Config\ConfigDB; use SP\Controller\LoginController; use SP\Core\Crypt\Crypt; use SP\Core\Crypt\Hash; +use SP\Core\Exceptions\InvalidClassException; use SP\Core\Exceptions\QueryException; use SP\Core\Exceptions\SPException; use SP\Core\Upgrade\User as UpgradeUser; @@ -48,19 +49,21 @@ use SP\Core\Crypt\Session as CryptSession; * Class UserPass para la gestión de las claves de un usuario * * @package SP + * @property UserPassData $itemData */ class UserPass extends UserBase { - // La clave maestra incorrecta const MPASS_WRONG = 0; - // La clave maestra correcta + + // La clave maestra incorrecta const MPASS_OK = 1; - // La clave maestra no está guardada + // La clave maestra correcta const MPASS_NOTSET = 2; - // La clave maestra ha cambiado + // La clave maestra no está guardada const MPASS_CHANGED = 3; - // Comprobar la clave maestra con la calve del usuario anterior + // La clave maestra ha cambiado const MPASS_CHECKOLD = 4; + // Comprobar la clave maestra con la calve del usuario anterior /** * @var bool */ @@ -70,19 +73,6 @@ class UserPass extends UserBase */ private static $clearUserMPass = ''; - /** - * Category constructor. - * - * @param UserPassData $itemData - * @throws \SP\Core\Exceptions\InvalidClassException - */ - public function __construct($itemData = null) - { - $this->setDataModel(UserPassData::class); - - parent::__construct($itemData); - } - /** * Obtener el IV del usuario a partir del Id. * @@ -334,4 +324,15 @@ class UserPass extends UserBase return $this; } + + /** + * Inicializar la clase + * + * @return void + * @throws InvalidClassException + */ + protected function init() + { + $this->setDataModel(UserPassData::class); + } } \ No newline at end of file diff --git a/inc/SP/Mgmt/Users/UserPassRecover.class.php b/inc/SP/Mgmt/Users/UserPassRecover.class.php index 539b1bb1..9f189324 100644 --- a/inc/SP/Mgmt/Users/UserPassRecover.class.php +++ b/inc/SP/Mgmt/Users/UserPassRecover.class.php @@ -37,6 +37,7 @@ defined('APP_ROOT') || die(); * Class UserPassRecover para la gestión de recuperaciones de claves de usuarios * * @package SP + * @property UserPassRecoverData $itemData */ class UserPassRecover extends UserPassRecoverBase implements ItemInterface { diff --git a/inc/SP/Mgmt/Users/UserPassRecoverBase.class.php b/inc/SP/Mgmt/Users/UserPassRecoverBase.class.php index 6a5d9812..c96717f5 100644 --- a/inc/SP/Mgmt/Users/UserPassRecoverBase.class.php +++ b/inc/SP/Mgmt/Users/UserPassRecoverBase.class.php @@ -26,36 +26,28 @@ namespace SP\Mgmt\Users; defined('APP_ROOT') || die(); +use SP\Core\Exceptions\InvalidClassException; use SP\DataModel\UserPassRecoverData; -use SP\Mgmt\ItemBase; +use SP\Mgmt\ItemBaseInterface; +use SP\Mgmt\ItemBaseTrait; /** * Class UserPassRecoverBase * * @package SP\Mgmt\Users */ -abstract class UserPassRecoverBase extends ItemBase +abstract class UserPassRecoverBase implements ItemBaseInterface { - /** @var UserPassRecoverData */ - protected $itemData; + use ItemBaseTrait; /** - * Category constructor. + * Inicializar la clase * - * @param UserPassRecoverData $itemData + * @return void + * @throws InvalidClassException */ - public function __construct($itemData = null) + protected function init() { - $this->setDataModel('SP\DataModel\UserPassRecoverData'); - - parent::__construct($itemData); - } - - /** - * @return UserPassRecoverData - */ - public function getItemData() - { - return parent::getItemData(); + $this->setDataModel(UserPassRecoverData::class); } } \ No newline at end of file diff --git a/inc/SP/Mgmt/Users/UserPreferences.class.php b/inc/SP/Mgmt/Users/UserPreferences.class.php index 7457617f..166eb2fc 100644 --- a/inc/SP/Mgmt/Users/UserPreferences.class.php +++ b/inc/SP/Mgmt/Users/UserPreferences.class.php @@ -39,6 +39,7 @@ use SP\Util\Util; * Class UsersPreferences para la gestion de las preferencias de usuarios * * @package SP + * @property UserPreferencesData $itemData */ class UserPreferences extends UserPreferencesBase implements ItemInterface { diff --git a/inc/SP/Mgmt/Users/UserPreferencesBase.class.php b/inc/SP/Mgmt/Users/UserPreferencesBase.class.php index a8eedbdd..284e7e67 100644 --- a/inc/SP/Mgmt/Users/UserPreferencesBase.class.php +++ b/inc/SP/Mgmt/Users/UserPreferencesBase.class.php @@ -2,8 +2,8 @@ /** * sysPass * - * @author nuxsmin - * @link http://syspass.org + * @author nuxsmin + * @link http://syspass.org * @copyright 2012-2017, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. @@ -26,39 +26,28 @@ namespace SP\Mgmt\Users; defined('APP_ROOT') || die(); +use SP\Core\Exceptions\InvalidClassException; use SP\DataModel\UserPreferencesData; -use SP\Mgmt\ItemBase; +use SP\Mgmt\ItemBaseInterface; +use SP\Mgmt\ItemBaseTrait; /** * Class UserPreferencesBase * * @package SP\Mgmt\Users */ -abstract class UserPreferencesBase extends ItemBase +abstract class UserPreferencesBase implements ItemBaseInterface { - /** @var UserPreferencesData */ - protected $itemData; + use ItemBaseTrait; /** - * Category constructor. + * Inicializar la clase * - * @param UserPreferencesData $itemData - * @throws \SP\Core\Exceptions\InvalidClassException + * @return void + * @throws InvalidClassException */ - public function __construct($itemData = null) + protected function init() { - if (!$this->dataModel) { - $this->setDataModel(UserPreferencesData::class); - } - - parent::__construct($itemData); - } - - /** - * @return UserPreferencesData - */ - public function getItemData() - { - return parent::getItemData(); + $this->setDataModel(UserPreferencesData::class); } } \ No newline at end of file diff --git a/inc/SP/Mgmt/Users/UserUtil.class.php b/inc/SP/Mgmt/Users/UserUtil.class.php index 6c06f834..e707bda6 100644 --- a/inc/SP/Mgmt/Users/UserUtil.class.php +++ b/inc/SP/Mgmt/Users/UserUtil.class.php @@ -51,7 +51,9 @@ class UserUtil public static function checkUserMail(UserData $UserData) { $query = /** @lang SQL */ - 'SELECT user_id FROM usrData WHERE user_login = ? AND user_email = ? LIMIT 1'; + 'SELECT user_id FROM usrData + WHERE LOWER(user_login) = LOWER(?) + AND LOWER(user_email) = LOWER(?) LIMIT 1'; $Data = new QueryData(); $Data->setQuery($query); diff --git a/inc/themes/material-blue/css/styles.min.css b/inc/themes/material-blue/css/styles.min.css index 683850cf..ef0473e7 100644 --- a/inc/themes/material-blue/css/styles.min.css +++ b/inc/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}*{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;resize:none}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}#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}#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:block}#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.login{padding-top:5%}#container.error,#container.install,#container.passreset{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 .pager{width:100%;margin-top:15px;padding:.5em;vertical-align:middle;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 .pager>div{display:inline-block;width:49%}#content .pager .pager-left{text-align:left}#content .pager .pager-right{text-align:right}#content #title{width:50%;padding:7px;margin:auto;background-color:#d9d9d9;color:#fff;font-size:17px;letter-spacing:.3em;text-align:center}#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;border:1px solid #c9c9c9;margin:0 auto;background-color:#f9f9f9}#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:30em;padding:1em;border:2px dashed #26a69a;text-align:center}#content .data .dropzone img{vertical-align:middle}#content .data .file-upload{display:none}#content .data .account-permissions{width:100%}#content .data .account-permissions fieldset{border:1px solid #c9c9c9;padding:1em}#content .data .account-permissions legend{font-weight:bold;color:#999;padding:.2em 0}#content .data .account-permissions fieldset>span{font-weight:bold;color:#999;padding:.2em 0;display:inline-block;width:100px;text-align:right}#content span.tag{margin:0 3px 3px 0;padding:.2em;background:#5c6bc0;color:#fff;border:0 solid transparent;border-radius:3px!important;-moz-border-radius:3px!important;-webkit-border-radius:3px!important}#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-wrap:wrap;justify-content:flex-start;margin:0}#content .data-header-minimal li{display:inline-flex;min-width:10em;font-weight:normal;letter-spacing:normal}#content .data-header-minimal li a{color:#b9b9b9;padding:.3em .8em}#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 1em}#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}#box-popup .list-wrap{max-height:10em;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}#box-popup{min-width:30em;max-width:60em;margin:5em auto;padding:0;background-color:#fff}#box-popup.box-password-view{min-width:30em;max-width:35em}#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}#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{min-width:10em;text-align:center;cursor:pointer}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{margin:1em auto}.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%}.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}.passLevel{width:20px;height:20px;display:inline-block;position:relative;top:2px}.passLevel.strongest{color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a;font-weight:bold}.passLevel.strongest:hover{color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a;font-weight:bold}.passLevel.strong{color:#2196f3;background-color:#e3f2fd;border:1px solid #2196f3;font-weight:bold}.passLevel.strong:hover{color:#2196f3;background-color:#e3f2fd;border:1px solid #2196f3;font-weight:bold}.passLevel.good{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;font-weight:bold}.passLevel.good:hover{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;font-weight:bold}.passLevel.weak{color:#ef5350;background-color:#ffebee;border:1px solid #ef5350;font-weight:bold}.passLevel.weak:hover{color:#ef5350;background-color:#ffebee;border:1px solid #ef5350;font-weight:bold}#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-buttons{text-align:center;padding:.5em;border-top:1px solid #c9c9c9;line-height:2.5em}.dialog-clip-copy{color:#26a69a;background-color:#e0f2f1}.help-box{display:none;background-color:#fff!important;color:#607d8b}.help-box>*{font-weight:bold}.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}.cursor-pointer{cursor:pointer}.password-actions{display:inline-block;width:12em}.password-actions>span,.password-actions i{margin-right:.6em}.custom-input-color{width:3em;height:1em;display:inline-block}.account-pass-image{height:32px;width:auto}.select-box{min-width:20em}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("../imgs/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}#login-container{width:40em;margin:0 auto;background:transparent url("../imgs/logo_full_bg.png") no-repeat top left;background-size:auto 10em}#login-container #boxSpacer{height:11em;background-color:transparent}#login-container #boxLogin{position:relative;margin:0 auto;width:100%;min-height:14em;padding:1em;background-color:#fff}#login-container #boxLogin #boxData{height:100%;min-height:14em;text-align:left;background-color:transparent}#login-container #boxLogin #boxData i{margin-right:.5em;opacity:.5}#login-container #boxLogin #boxData .extra-hidden{display:none}#login-container #boxLogin #boxButton{position:absolute;top:2em;right:2em}#login-container #boxLogin #boxActions{width:100%;text-align:right}#login-container #boxLogin #boxActions a{color:#c9c9c9}#login-container #boxLogout{margin-top:4em;width:100%}#login-container #boxLogout>div{margin:0 auto;width:250px;font-size:14px;padding:.5em;text-align:center;color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28}#login-container #boxUpdated{width:350px;margin:3em auto;font-size:14px;text-align:center;padding:.5em;color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a}#login-container #demo-info{margin:3em auto;color:#c9c9c9;border-top:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:.5em}#login-container #demo-info ul{display:flex;justify-content:space-around;list-style:none}#login-container #demo-info ul li span{margin:0 2em}@media screen and (max-width:1000px){#content #searchbox .search-filters>*{margin:.5em 1em .5em 0}#content .data-container #title,#content .tab-data #title{width:90%}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-container,#content .tab-data{width:100%}#content .data-container #title,#content .tab-data #title{width:90%}#content .data-container .selectize-control,#content .tab-data .selectize-control{width:100%}#box-popup h2>.btn-popup-close{display:inline-block}.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}*{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;resize:none}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}#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}#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:block}#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.login{padding-top:5%}#container.error,#container.install,#container.passreset{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 .pager{width:100%;margin-top:15px;padding:.5em;vertical-align:middle;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 .pager>div{display:inline-block;width:49%}#content .pager .pager-left{text-align:left}#content .pager .pager-right{text-align:right}#content #title{width:50%;padding:7px;margin:auto;background-color:#d9d9d9;color:#fff;font-size:17px;letter-spacing:.3em;text-align:center}#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;border:1px solid #c9c9c9;margin:0 auto;background-color:#f9f9f9}#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:30em;padding:1em;border:2px dashed #26a69a;text-align:center}#content .data .dropzone img{vertical-align:middle}#content .data .file-upload{display:none}#content .data .account-permissions{width:100%}#content .data .account-permissions fieldset{border:1px solid #c9c9c9;padding:1em}#content .data .account-permissions legend{font-weight:bold;color:#999;padding:.2em 0}#content .data .account-permissions fieldset>span{font-weight:bold;color:#999;padding:.2em 0;display:inline-block;width:100px;text-align:right}#content span.tag{margin:0 3px 3px 0;padding:.2em;background:#5c6bc0;color:#fff;border:0 solid transparent;border-radius:3px !important;-moz-border-radius:3px !important;-webkit-border-radius:3px !important}#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-wrap:wrap;justify-content:flex-start;margin:0}#content .data-header-minimal li{display:inline-flex;min-width:10em;font-weight:normal;letter-spacing:normal}#content .data-header-minimal li a{color:#b9b9b9;padding:.3em .8em}#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 1em}#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}#box-popup .list-wrap{max-height:10em;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}#box-popup{min-width:30em;max-width:60em;margin:5em auto;padding:0;background-color:#fff}#box-popup.box-password-view{min-width:30em;max-width:35em}#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}#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{min-width:10em;text-align:center;cursor:pointer}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{margin:1em auto}.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%}.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}.passLevel{width:20px;height:20px;display:inline-block;position:relative;top:2px}.passLevel.strongest{color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a;font-weight:bold}.passLevel.strongest:hover{color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a;font-weight:bold}.passLevel.strong{color:#2196f3;background-color:#e3f2fd;border:1px solid #2196f3;font-weight:bold}.passLevel.strong:hover{color:#2196f3;background-color:#e3f2fd;border:1px solid #2196f3;font-weight:bold}.passLevel.good{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;font-weight:bold}.passLevel.good:hover{color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28;font-weight:bold}.passLevel.weak{color:#ef5350;background-color:#ffebee;border:1px solid #ef5350;font-weight:bold}.passLevel.weak:hover{color:#ef5350;background-color:#ffebee;border:1px solid #ef5350;font-weight:bold}#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-buttons{text-align:center;padding:.5em;border-top:1px solid #c9c9c9;line-height:2.5em}.dialog-clip-copy{color:#26a69a;background-color:#e0f2f1}.help-box{display:none;background-color:#fff !important;color:#607d8b}.help-box>*{font-weight:bold}.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}.cursor-pointer{cursor:pointer}.password-actions{display:inline-block;width:12em}.password-actions>span,.password-actions i{margin-right:.6em}.custom-input-color{width:3em;height:1em;display:inline-block}.account-pass-image{height:32px;width:auto}.select-box{min-width:20em}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("../imgs/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}#login-container{width:40em;margin:0 auto;background:transparent url("../imgs/logo_full_bg.png") no-repeat top left;background-size:auto 10em}#login-container #boxSpacer{height:11em;background-color:transparent}#login-container #boxLogin{position:relative;margin:0 auto;width:100%;min-height:14em;padding:1em;background-color:#fff}#login-container #boxLogin #boxData{height:100%;min-height:14em;text-align:left;background-color:transparent}#login-container #boxLogin #boxData i{margin-right:.5em;opacity:.5}#login-container #boxLogin #boxData .extra-hidden{display:none}#login-container #boxLogin #boxButton{position:absolute;top:2em;right:2em}#login-container #boxLogin #boxActions{width:100%;text-align:right}#login-container #boxLogin #boxActions a{color:#c9c9c9}#login-container #boxLogout{margin-top:4em;width:100%}#login-container #boxLogout>div{margin:0 auto;width:250px;font-size:14px;padding:.5em;text-align:center;color:#ffca28;background-color:#fff8e1;border:1px solid #ffca28}#login-container #boxUpdated{width:350px;margin:3em auto;font-size:14px;text-align:center;padding:.5em;color:#26a69a;background-color:#e0f2f1;border:1px solid #26a69a}#login-container #demo-info{margin:3em auto;color:#c9c9c9;border-top:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;padding:.5em}#login-container #demo-info ul{display:flex;justify-content:space-around;list-style:none}#login-container #demo-info ul li span{margin:0 2em}@media screen and (max-width:1000px){#content #searchbox .search-filters>*{margin:.5em 1em .5em 0}#content .data-container #title,#content .tab-data #title{width:90%}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-container,#content .tab-data{width:100%}#content .data-container #title,#content .tab-data #title{width:90%}#content .data-container .selectize-control,#content .tab-data .selectize-control{width:100%}#box-popup h2>.btn-popup-close{display:inline-block}.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/js/app-requests.min.js b/js/app-requests.min.js index 36d379a8..e3cd582f 100644 --- a/js/app-requests.min.js +++ b/js/app-requests.min.js @@ -1,5 +1,5 @@ var $jscomp={scope:{},checkStringArgs:function(b,d,c){if(null==b)throw new TypeError("The 'this' value for String.prototype."+c+" must not be null or undefined");if(d instanceof RegExp)throw new TypeError("First argument to String.prototype."+c+" must not be a regular expression");return b+""}}; -$jscomp.defineProperty="function"==typeof Object.defineProperties?Object.defineProperty:function(b,d,c){if(c.get||c.set)throw new TypeError("ES3 does not support getters and setters.");b!=Array.prototype&&b!=Object.prototype&&(b[d]=c.value)};$jscomp.getGlobal=function(b){return"undefined"!=typeof window&&window===b?b:"undefined"!=typeof global&&null!=global?global:b};$jscomp.global=$jscomp.getGlobal(this); +$jscomp.defineProperty="function"==typeof Object.defineProperties?Object.defineProperty:function(b,d,c){if(c.get||c.set)throw new TypeError("ES3 does not support getters and setters.");b!=Array.prototype&&b!=Object.prototype&&(b[d]=c.value)};$jscomp.getGlobal=function(b){return"undefined"!=typeof window&&window===b?b:"undefined"!=typeof global?global:b};$jscomp.global=$jscomp.getGlobal(this); $jscomp.polyfill=function(b,d,c,e){if(d){c=$jscomp.global;b=b.split(".");for(e=0;e=h}},"es6-impl","es3"); sysPass.Requests=function(b){var d=b.log,c=[],e={get:function(){return c},add:function(a){var b=""===a.hash?SparkMD5.hash(JSON.stringify(a),!1):a.hash;if(0