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);
- }
-
-}