diff --git a/dictionaries/en.dictionary.itop.core.php b/dictionaries/en.dictionary.itop.core.php index da2aeb4fd2..8b26efc141 100644 --- a/dictionaries/en.dictionary.itop.core.php +++ b/dictionaries/en.dictionary.itop.core.php @@ -216,15 +216,6 @@ Operators:
'Core:Context=GUI:Console' => 'Console', 'Core:Context=CRON' => 'cron', 'Core:Context=GUI:Portal' => 'Portal', - - 'Core:GetCountingUsers:Error' => 'Error while counting %1$s', - 'Core:CountingUsers:ConsoleUsers' => 'console users', - 'Core:CountingUsers:DisabledUsers' => 'disabled users', - 'Core:CountingUsers:PortalUsers' => 'portal users', - 'Core:CountingUsers:BusinessPartnerUsers' => 'business partner users', - 'Core:CountingUsers:ReadOnlyUsers' => 'read - only users', - 'Core:CountingUsers:ApplicationUsers' => 'application users', - 'Core:CountingUsers:AllUsers' => 'all users', ]); ////////////////////////////////////////////////////////////////////// diff --git a/dictionaries/fr.dictionary.itop.core.php b/dictionaries/fr.dictionary.itop.core.php index a249331655..25e31bdb7a 100644 --- a/dictionaries/fr.dictionary.itop.core.php +++ b/dictionaries/fr.dictionary.itop.core.php @@ -161,15 +161,6 @@ Opérateurs :
'Core:Context=CRON+' => 'cron', 'Core:Context=GUI:Portal' => 'Portal', 'Core:Context=GUI:Portal+' => 'GUI:Portal', - - 'Core:GetCountingUsers:Error' => 'Erreur lors du comptage des %1$s', - 'Core:CountingUsers:ConsoleUsers' => 'utilisateurs console', - 'Core:CountingUsers:DisabledUsers' => 'utilisateurs désactivés', - 'Core:CountingUsers:PortalUsers' => 'utilisateurs du portail', - 'Core:CountingUsers:BusinessPartnerUsers' => 'utilisateurs partenaires business', - 'Core:CountingUsers:ReadOnlyUsers' => 'utilisateurs en lecture seule', - 'Core:CountingUsers:ApplicationUsers' => 'utilisateurs applicatifs', - 'Core:CountingUsers:AllUsers' => 'tous les utilisateurs', ]); ////////////////////////////////////////////////////////////////////// diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index 9bc9e59445..626b2db633 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -649,7 +649,6 @@ return array( 'Combodo\\iTop\\SessionTracker\\SessionGC' => $baseDir . '/sources/SessionTracker/SessionGC.php', 'Combodo\\iTop\\SessionTracker\\SessionHandler' => $baseDir . '/sources/SessionTracker/SessionHandler.php', 'Combodo\\iTop\\SessionTracker\\iSessionHandlerExtension' => $baseDir . '/sources/SessionTracker/iSessionHandlerExtension.php', - 'Combodo\\iTop\\Users\\ITopUserCountingRepository' => $baseDir . '/sources/Users/ITopUserCountingRepository.php', 'CompileCSSService' => $baseDir . '/application/compilecssservice.class.inc.php', 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'Config' => $baseDir . '/core/config.class.inc.php', diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index edda3e727c..fe840689d7 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -1050,7 +1050,6 @@ class ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685 'Combodo\\iTop\\SessionTracker\\SessionGC' => __DIR__ . '/../..' . '/sources/SessionTracker/SessionGC.php', 'Combodo\\iTop\\SessionTracker\\SessionHandler' => __DIR__ . '/../..' . '/sources/SessionTracker/SessionHandler.php', 'Combodo\\iTop\\SessionTracker\\iSessionHandlerExtension' => __DIR__ . '/../..' . '/sources/SessionTracker/iSessionHandlerExtension.php', - 'Combodo\\iTop\\Users\\ITopUserCountingRepository' => __DIR__ . '/../..' . '/sources/Users/ITopUserCountingRepository.php', 'CompileCSSService' => __DIR__ . '/../..' . '/application/compilecssservice.class.inc.php', 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'Config' => __DIR__ . '/../..' . '/core/config.class.inc.php', diff --git a/sources/Users/ITopUserCountingRepository.php b/sources/Users/ITopUserCountingRepository.php deleted file mode 100644 index 2f5fd29c2d..0000000000 --- a/sources/Users/ITopUserCountingRepository.php +++ /dev/null @@ -1,254 +0,0 @@ -ArrayToOQLStringParameter($aExcludedUsers); - $sExcludedProfiles = $this->ArrayToOQLStringParameter($aExcludedProfiles); - $sExcludedFinalClasses = $this->ArrayToOQLStringParameter($aExcludedFinalClasses); - - $sOQLUserConsole = " - SELECT User AS u - WHERE u.status != 'disabled' - AND u.login NOT IN ($sExcludedUsers) - AND u.finalclass NOT IN ($sExcludedFinalClasses) - AND id NOT IN ( - SELECT User AS uex - JOIN URP_UserProfile AS uup ON uup.userid = uex.id - JOIN URP_Profiles AS up ON uup.profileid = up.id - WHERE up.name IN ($sExcludedProfiles)) - "; - try { - $oFilter = $bAllData ? DBObjectSearch::FromOQL_AllData($sOQLUserConsole) : DBObjectSearch::FromOQL($sOQLUserConsole); - } catch (Exception $e) { - IssueLog::Error(Dict::Format('Core:GetCountingUsers:Error', Dict::S('Core:CountingUsers:ConsoleUsers')).' - error details : '.$e->getMessage()); - throw new Exception(Dict::Format('Core:GetCountingUsers:Error', Dict::S('Core:CountingUsers:ConsoleUsers')).'.'); - } - - $aConsoleUsers = $this->GetUsersFromFilter($oFilter); - $aReadOnlyUsers = $this->GetReadOnlyUsers(); - return array_diff($aConsoleUsers, $aReadOnlyUsers); - } - - /** - * @throws Exception - */ - public function GetPortalUsers(bool $bAllData = true, array $aExcludedFinalClasses = ['UserToken', 'UserRemoteSaaS']): array - { - $sExcludedFinalClasses = $this->ArrayToOQLStringParameter($aExcludedFinalClasses); - - $sOQLPortalUser = " - SELECT User AS u - JOIN URP_UserProfile AS uup ON uup.userid = u.id - JOIN URP_Profiles AS up ON uup.profileid = up.id - WHERE up.id = '2' AND u.status != 'disabled' AND u.finalclass NOT IN ($sExcludedFinalClasses)"; - - try { - $oFilter = $bAllData ? DBObjectSearch::FromOQL_AllData($sOQLPortalUser) : DBObjectSearch::FromOQL($sOQLPortalUser); - } catch (Exception $e) { - IssueLog::Error(Dict::Format('Core:GetCountingUsers:Error', Dict::S('Core:CountingUsers:PortalUsers')).' - error details : '.$e->getMessage()); - throw new Exception(Dict::Format('Core:GetCountingUsers:Error', Dict::S('Core:CountingUsers:PortalUsers')).'.'); - } - - return $this->GetUsersFromFilter($oFilter); - } - - /** - * @throws Exception - */ - public function GetBusinessPartnerUsers(bool $bAllData = true, array $aExcludedFinalClasses = ['UserToken', 'UserRemoteSaaS']): array - { - $sExcludedFinalClasses = $this->ArrayToOQLStringParameter($aExcludedFinalClasses); - - $sOQLPortalUser = " - SELECT User AS u - JOIN URP_UserProfile AS uup ON uup.userid = u.id - JOIN URP_Profiles AS up ON uup.profileid = up.id - WHERE up.id = '40' AND u.status != 'disabled' AND u.finalclass NOT IN ($sExcludedFinalClasses)"; - - try { - $oFilter = $bAllData ? DBObjectSearch::FromOQL_AllData($sOQLPortalUser) : DBObjectSearch::FromOQL($sOQLPortalUser); - } catch (Exception $e) { - IssueLog::Error(Dict::Format('Core:GetCountingUsers:Error', Dict::S('Core:CountingUsers:BusinessPartnerUsers')).' - error details : '.$e->getMessage()); - throw new Exception(Dict::Format('Core:GetCountingUsers:Error', Dict::S('Core:CountingUsers:BusinessPartnerUsers')).'.'); - } - - return $this->GetUsersFromFilter($oFilter); - } - - /** - * @throws DictExceptionMissingString - * @throws CoreException - * @throws Exception - */ - public function GetReadOnlyUsers(bool $bAllData = true): array - { - $aReadOnlyUsers = []; - $aAllUsers = $this->GetAllUsers($bAllData); - /** @var User $oUser */ - foreach ($aAllUsers as $oUser) { - $bIsReadOnlyUser = true; - if (!$this->IsUserReadOnly($oUser, 'bizmodel') || - !$this->IsUserReadOnly($oUser, 'grant_by_profile')) { - $bIsReadOnlyUser = false; - } - if ($bIsReadOnlyUser) { - $aReadOnlyUsers[] = $oUser; - } - } - - $aUserToken = $this->GetApplicationUsers() ?? []; - - return array_diff($aReadOnlyUsers, $aUserToken); - } - - /** - * @throws Exception - */ - public function GetDisabledUsers(bool $bAllData = true): array - { - $sOQLDisabledUser = " - SELECT User AS u - WHERE u.status = 'disabled' - "; - try { - $oFilter = $bAllData ? DBObjectSearch::FromOQL_AllData($sOQLDisabledUser) : DBObjectSearch::FromOQL($sOQLDisabledUser); - } catch (Exception $e) { - IssueLog::Error(Dict::Format('Core:GetCountingUsers:Error', Dict::S('Core:CountingUsers:DisabledUsers')).' - error details : '.$e->getMessage()); - throw new Exception(Dict::Format('Core:GetCountingUsers:Error', Dict::S('Core:CountingUsers:DisabledUsers')).'.'); - } - - return $this->GetUsersFromFilter($oFilter); - } - - /** - * @throws Exception - */ - public function GetApplicationUsers(bool $bAllData = true): ?array - { - if (!MetaModel::IsValidClass('UserToken')) { - return null; - } - $sOQLApplicationUser = 'SELECT UserToken'; - try { - $oFilter = $bAllData ? DBObjectSearch::FromOQL_AllData($sOQLApplicationUser) : DBObjectSearch::FromOQL($sOQLApplicationUser); - } catch (Exception $e) { - IssueLog::Error(Dict::Format('Core:GetCountingUsers:Error', Dict::S('Core:CountingUsers:ApplicationUsers')).' - error details : '.$e->getMessage()); - throw new Exception(Dict::Format('Core:GetCountingUsers:Error', Dict::S('Core:CountingUsers:ApplicationUsers')).'.'); - } - - return $this->GetUsersFromFilter($oFilter); - } - - /** - * @throws Exception - */ - public function GetAllUsers(bool $bAllData = true): array - { - $sOqlUser = 'SELECT User'; - - try { - $oFilter = $bAllData ? DBObjectSearch::FromOQL_AllData($sOqlUser) : DBObjectSearch::FromOQL($sOqlUser); - } catch (Exception $e) { - IssueLog::Error(Dict::Format('Core:GetCountingUsers:Error', Dict::S('Core:CountingUsers:AllUsers')).' - error details : '.$e->getMessage()); - throw new Exception(Dict::Format('Core:GetCountingUsers:Error', Dict::S('Core:CountingUsers:AllUsers')).'.'); - } - - return $this->GetUsersFromFilter($oFilter); - } - - /** - * @throws CoreException - * @throws MySQLException - * @throws CoreUnexpectedValue - * @throws OQLException - * @throws ArchivedObjectException - * @throws DictExceptionUnknownLanguage - */ - private function IsUserReadOnly(User $oUser, string $sClassCategory): bool - { - foreach (MetaModel::GetClasses($sClassCategory) as $sClass) { - // no need to check stimuli for now since users can't execute any without UR_ACTION_MODIFY - if ( - UserRights::IsActionAllowed($sClass, UR_ACTION_MODIFY, null, $oUser) || - UserRights::IsActionAllowed($sClass, UR_ACTION_BULK_MODIFY, null, $oUser) || - UserRights::IsActionAllowed($sClass, UR_ACTION_DELETE, null, $oUser) || - UserRights::IsActionAllowed($sClass, UR_ACTION_BULK_DELETE, null, $oUser) || - UserRights::IsActionAllowed($sClass, UR_ACTION_CREATE, null, $oUser) - ) { - return false; - } - } - return true; - } - - /** - * @throws CoreUnexpectedValue - * @throws CoreException - * @throws MySQLException - */ - public function GetUsersFromFilter(DBObjectSearch|DBUnionSearch|null $oFilter, array $aOrderBy = [], array $aArgs = []): array - { - $aUsers = []; - if (is_null($oFilter)) { - return $aUsers; - } - $oSet = new DBObjectSet($oFilter, $aOrderBy, $aArgs); - while ($oUser = $oSet->Fetch()) { - $aUsers[] = $oUser; - } - - return $aUsers; - } - - private function ArrayToOQLStringParameter(array $aValues): string - { - $aQuotedValues = []; - foreach ($aValues as $value) { - $value = trim((string) $value); - if ($value === '') { - continue; - } - $aQuotedValues[] = "'".addslashes($value)."'"; - } - - return empty($aQuotedValues) ? "''" : implode(', ', $aQuotedValues); - } - -}