From 4b49bf280b08c458c5c8ec30ec39c80fab889b00 Mon Sep 17 00:00:00 2001 From: yuri Date: Thu, 28 Jan 2016 15:23:44 +0200 Subject: [PATCH] portalUserLimit --- .../Espo/Core/defaults/systemConfig.php | 1 + application/Espo/Entities/User.php | 5 ++ application/Espo/Services/User.php | 62 ++++++++++++++----- 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/application/Espo/Core/defaults/systemConfig.php b/application/Espo/Core/defaults/systemConfig.php index e929371ba6..249f26426a 100644 --- a/application/Espo/Core/defaults/systemConfig.php +++ b/application/Espo/Core/defaults/systemConfig.php @@ -93,6 +93,7 @@ return array ( 'defaultPermissions' => 'cryptKey', 'restrictedMode', 'userLimit', + 'portalUserLimit', 'stylesheet' ), 'adminItems' => diff --git a/application/Espo/Entities/User.php b/application/Espo/Entities/User.php index b457e67bbd..790d0647f9 100644 --- a/application/Espo/Entities/User.php +++ b/application/Espo/Entities/User.php @@ -41,6 +41,11 @@ class User extends \Espo\Core\Entities\Person return $this->get('isActive'); } + public function isPortalUser() + { + return $this->get('isPortalUser'); + } + public function getTeamIdList() { if (!$this->has('teamsIds')) { diff --git a/application/Espo/Services/User.php b/application/Espo/Services/User.php index 71e232b0b9..2a371779fc 100644 --- a/application/Espo/Services/User.php +++ b/application/Espo/Services/User.php @@ -262,33 +262,65 @@ class User extends Record return $user; } + protected function getInternalUserCount() + { + return $this->getEntityManager()->getRepository('User')->where(array( + 'isActive' => true, + 'isSuperAdmin' => false, + 'isPortalUser' => false, + 'id!=' => 'system' + ))->count(); + } + + protected function getPortalUserCount() + { + return $this->getEntityManager()->getRepository('User')->where(array( + 'isActive' => true, + 'isSuperAdmin' => false, + 'isPortalUser' => true, + 'id!=' => 'system' + ))->count(); + } + protected function beforeCreate(Entity $entity, array $data = array()) { if ($this->getConfig()->get('userLimit') && !$this->getUser()->get('isSuperAdmin')) { - $userCount = $this->getEntityManager()->getRepository('User')->where(array( - 'isActive' => true, - 'isSuperAdmin' => false, - 'id!=' => 'system' - ))->count(); + $userCount = $this->getInternalUserCount(); if ($userCount >= $this->getConfig()->get('userLimit')) { throw new Forbidden('User limit '.$this->getConfig()->get('userLimit').' is reached.'); } } + if ($this->getConfig()->get('portalUserLimit') && !$this->getUser()->get('isSuperAdmin')) { + $portalUserCount = $this->getPortalUserCount(); + if ($portalUserCount >= $this->getConfig()->get('portalUserLimit')) { + throw new Forbidden('Portal user limit '.$this->getConfig()->get('portalUserLimit').' is reached.'); + } + } } protected function beforeUpdate(Entity $user, array $data = array()) { if ($this->getConfig()->get('userLimit') && !$this->getUser()->get('isSuperAdmin')) { - if (!$user->isActive()) { - if (array_key_exists('isActive', $data) && $data['isActive']) { - $userCount = $this->getEntityManager()->getRepository('User')->where(array( - 'isActive' => true, - 'isSuperAdmin' => false, - 'id!=' => 'system' - ))->count(); - if ($userCount >= $this->getConfig()->get('userLimit')) { - throw new Forbidden('User limit '.$this->getConfig()->get('userLimit').' is reached.'); - } + if ( + ($user->get('isActive') && $user->isFieldChanged('isActive') && !$user->get('isPortalUser')) + || + (!$user->get('isPortalUser') && $user->isFieldChanged('isPortalUser')) + ) { + $userCount = $this->getInternalUserCount(); + if ($userCount >= $this->getConfig()->get('userLimit')) { + throw new Forbidden('User limit '.$this->getConfig()->get('userLimit').' is reached.'); + } + } + } + if ($this->getConfig()->get('portalUserLimit') && !$this->getUser()->get('isSuperAdmin')) { + if ( + ($user->get('isActive') && $user->isFieldChanged('isActive') && $user->get('isPortalUser')) + || + ($user->get('isPortalUser') && $user->isFieldChanged('isPortalUser')) + ) { + $portalUserCount = $this->getPortalUserCount(); + if ($portalUserCount >= $this->getConfig()->get('portalUserLimit')) { + throw new Forbidden('Portal user limit '.$this->getConfig()->get('portalUserLimit').' is reached.'); } } }