1
0
قرینه از https://github.com/matomo-org/matomo.git synced 2025-08-22 15:07:44 +00:00
Files
matomo/tests/PHPUnit/Framework/Mock/FakeAccess.php
Jacob R 58efa69ba9 Allow filtering sites by type and by at least write access (#23422)
* Allow filtering sites by type and by at least write access

* Adding build files which were missed during add

* Build vue files

* Build vue files

* Add more filters options to SiteSeletor

* Updating screenshot for API method change

* Adding missed change

* Updating image to match CI

* Apply suggestions from code review

Co-authored-by: Stefan Giehl <stefan@matomo.org>

* Build vue files

---------

Co-authored-by: innocraft-automation <innocraft-automation@users.noreply.github.com>
Co-authored-by: Stefan Giehl <stefan@matomo.org>
2025-07-29 10:00:37 +02:00

296 خطوط
8.5 KiB
PHP

<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Tests\Framework\Mock;
use Piwik\Access;
use Piwik\Auth;
use Piwik\NoAccessException;
use Piwik\Piwik;
use Piwik\Plugins\SitesManager\API;
use Piwik\Site as PiwikSite;
/**
* FakeAccess for UnitTests
* @since 2.8.0
*/
class FakeAccess extends Access
{
public static $superUser = false;
public static $idSitesAdmin = array();
public static $idSitesWrite = array();
public static $idSitesView = array();
public static $idSitesCapabilities = array();
public static $identity = 'superUserLogin';
public static $superUserLogin = 'superUserLogin';
public static function clearAccess($superUser = false, $idSitesAdmin = array(), $idSitesView = array(), $identity = 'superUserLogin', $idSitesWrite = array(), $idSitesCapabilities = array())
{
self::$superUser = $superUser;
self::$idSitesAdmin = $idSitesAdmin;
self::$idSitesWrite = $idSitesWrite;
self::$idSitesView = $idSitesView;
self::$identity = $identity;
self::$idSitesCapabilities = $idSitesCapabilities;
}
public function getTokenAuth()
{
return null;
}
public function __construct($superUser = false, $idSitesAdmin = array(), $idSitesView = array(), $identity = 'superUserLogin', $idSitesWrite = array())
{
// couldn't use DI here as tests seem to fail cause at this time when it is called eg in
// plugins/Live/tests/System/ApiCounterTest.php the environment is not set up yet
$role = new Access\RolesProvider();
$capabilities = new Access\CapabilitiesProvider();
parent::__construct($role, $capabilities);
self::clearAccess($superUser, $idSitesAdmin, $idSitesView, $identity, $idSitesWrite);
}
public static function setIdSitesAdmin($ids)
{
self::$superUser = false;
self::$idSitesAdmin = $ids;
}
public static function setIdSitesView($ids)
{
self::$superUser = false;
self::$idSitesView = $ids;
}
public static function setIdSitesWrite($ids)
{
self::$superUser = false;
self::$idSitesWrite = $ids;
}
public function hasSuperUserAccess()
{
return self::$superUser;
}
public function checkUserHasSuperUserAccess()
{
if (!self::$superUser) {
throw new NoAccessException("checkUserHasSuperUserAccess Fake exception // string not to be tested");
}
}
public function setSuperUserAccess($bool = true)
{
self::$superUser = $bool;
}
public function reloadAccess(?Auth $auth = null)
{
return true;
}
public function checkUserHasAdminAccess($idSites)
{
if (!self::$superUser) {
$websitesAccess = self::$idSitesAdmin;
} else {
return;
}
$idSites = PiwikSite::getIdSitesFromIdSitesString($idSites);
foreach ($idSites as $idsite) {
if (!in_array($idsite, $websitesAccess)) {
throw new NoAccessException("checkUserHasAdminAccess Fake exception // string not to be tested");
}
}
}
public function checkUserHasWriteAccess($idSites)
{
if (!self::$superUser) {
$websitesAccess = array_merge(self::$idSitesWrite, self::$idSitesAdmin);
} else {
return;
}
$idSites = PiwikSite::getIdSitesFromIdSitesString($idSites);
foreach ($idSites as $idsite) {
if (!in_array($idsite, $websitesAccess)) {
throw new NoAccessException("checkUserHasWriteAccess Fake exception // string not to be tested");
}
}
}
public function checkUserHasCapability($idSites, $capability)
{
$cap = $this->capabilityProvider->getCapability($capability);
if ($cap && Piwik::isUserHasAdminAccess($idSites) && $cap->hasRoleCapability(Access\Role\Admin::ID)) {
return;
} elseif ($cap && Piwik::isUserHasWriteAccess($idSites) && $cap->hasRoleCapability(Access\Role\Write::ID)) {
return;
} elseif ($cap && Piwik::isUserHasViewAccess($idSites) && $cap->hasRoleCapability(Access\Role\View::ID)) {
return;
}
if (isset(self::$idSitesCapabilities[$capability]) && is_array(self::$idSitesCapabilities[$capability])) {
if (!is_array($idSites)) {
$idSites = array($idSites);
}
$idSites = array_map('intval', $idSites);
$idSitesCap = array_map('intval', self::$idSitesCapabilities[$capability]);
$missingSites = array_diff($idSites, $idSitesCap);
if (empty($missingSites)) {
return;
}
}
throw new NoAccessException("checkUserHasCapability " . $capability . " Fake exception // string not to be tested");
}
//means at least view access
public function checkUserHasViewAccess($idSites)
{
if (self::$superUser) {
return;
}
$websitesAccess = array_merge(self::$idSitesView, self::$idSitesWrite, self::$idSitesAdmin);
if (!is_array($idSites)) {
if ($idSites === 'all') {
$idSites = API::getInstance()->getAllSitesId();
} else {
$idSites = explode(',', $idSites);
}
}
if (empty($websitesAccess)) {
throw new NoAccessException("checkUserHasViewAccess Fake exception // string not to be tested");
}
foreach ($idSites as $idsite) {
if (!in_array($idsite, $websitesAccess)) {
throw new NoAccessException("checkUserHasViewAccess Fake exception // string not to be tested");
}
}
}
public function checkUserHasSomeViewAccess()
{
if (!self::$superUser) {
if (count(array_merge(self::$idSitesView, self::$idSitesWrite, self::$idSitesAdmin)) == 0) {
throw new NoAccessException("checkUserHasSomeViewAccess Fake exception // string not to be tested");
}
} else {
return;
}
}
//means at least admin access
public function isUserHasSomeAdminAccess()
{
if (self::$superUser) {
return true;
}
return count(self::$idSitesAdmin) > 0;
}
//means at least write access
public function isUserHasSomeWriteAccess()
{
if (self::$superUser) {
return true;
}
return count(self::$idSitesAdmin) > 0 || count(self::$idSitesWrite) > 0;
}
//means at least admin access
public function checkUserHasSomeAdminAccess()
{
if (!$this->isUserHasSomeAdminAccess()) {
throw new NoAccessException("checkUserHasSomeAdminAccess Fake exception // string not to be tested");
}
}
//means at least write access
public function checkUserHasSomeWriteAccess()
{
if (!$this->isUserHasSomeWriteAccess()) {
throw new NoAccessException("checkUserHasSomeWriteAccess Fake exception // string not to be tested");
}
}
public function getLogin()
{
return self::$identity;
}
public function getSitesIdWithAdminAccess()
{
if (self::$superUser) {
return API::getInstance()->getAllSitesId();
}
return self::$idSitesAdmin;
}
public function getSitesIdWithViewAccess()
{
if (self::$superUser) {
return API::getInstance()->getAllSitesId();
}
return self::$idSitesView;
}
public function getSitesIdWithWriteAccess()
{
if (self::$superUser) {
return API::getInstance()->getAllSitesId();
}
return self::$idSitesWrite;
}
public function getSitesIdWithAtLeastViewAccess()
{
if (self::$superUser) {
return API::getInstance()->getAllSitesId();
}
return array_merge(self::$idSitesView, self::$idSitesWrite, self::$idSitesAdmin);
}
public function getSitesIdWithAtLeastWriteAccess()
{
if (self::$superUser) {
return API::getInstance()->getAllSitesId();
}
return array_merge(self::$idSitesWrite, self::$idSitesAdmin);
}
public function getRawSitesWithSomeViewAccess($login)
{
$result = array();
foreach (array_merge(self::$idSitesView, self::$idSitesWrite, self::$idSitesAdmin) as $idSite) {
$result[] = array('idsite' => $idSite);
}
return $result;
}
}