1
0
قرینه از https://github.com/matomo-org/matomo.git synced 2025-08-25 00:17:37 +00:00
Files
matomo/tests/PHPUnit/Unit/Tracker/RequestSetTest.php
Stefan Giehl aa6585c860 Fix sending secure token in bulk request body & add support for "Authorization: Bearer" header (#23335)
* Centralize auth token retrival

* deprecate API\Request::isTokenAuthProvidedSecurely instead of removing it

* Add Unit tests

* Add changelog for auth header support

* Adds integration test

* Allow creating secure app specific tokens through API

* Add test for secure token in bulk tracking

* updates expected UI test files

* apply review feedback

* fix typo

Co-authored-by: caddoo <1169490+caddoo@users.noreply.github.com>

---------

Co-authored-by: caddoo <1169490+caddoo@users.noreply.github.com>
2025-06-23 15:23:45 +12:00

409 خطوط
13 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\Unit\Tracker;
use Piwik\Tests\Framework\TestCase\UnitTestCase;
use Piwik\Tracker\Request;
use Piwik\Tracker\RequestSet;
/**
* @group RequestSetTest
* @group Tracker
*/
class RequestSetTest extends UnitTestCase
{
/**
* @var TestRequestSet
*/
private $requestSet;
private $time;
public function setUp(): void
{
parent::setUp();
$this->requestSet = $this->createRequestSet();
$this->time = 1693386000;
}
private function createRequestSet()
{
return new TestRequestSet();
}
public function testInternalBuildRequestShoulBuildOneRequest()
{
$request = new Request(array('idsite' => '2'));
$request->setCurrentTimestamp($this->time);
$this->assertEquals($request, $this->buildRequest(2));
}
public function testInternalBuildRequestsShoulBuildASetOfRequests()
{
$this->assertEquals(array(), $this->buildRequests(0));
$this->assertEquals(array($this->buildRequest(1)), $this->buildRequests(1));
$this->assertEquals(array(
$this->buildRequest(1),
$this->buildRequest(2),
$this->buildRequest(3)
), $this->buildRequests(3));
}
public function testGetRequestsShouldReturnEmptyArrayIfThereAreNoRequestsInitializedYet()
{
$this->assertEquals(array(), $this->requestSet->getRequests());
}
public function testSetRequestsShouldNotFailIfEmptyArrayGiven()
{
$this->requestSet->setRequests(array());
$this->assertEquals(array(), $this->requestSet->getRequests());
}
public function testSetRequestsShouldSetAndOverwriteRequests()
{
$this->requestSet->setRequests($this->buildRequests(3));
$this->assertEquals($this->buildRequests(3), $this->requestSet->getRequests());
// overwrite
$this->requestSet->setRequests($this->buildRequests(5));
$this->assertEquals($this->buildRequests(5), $this->requestSet->getRequests());
// overwrite
$this->requestSet->setRequests($this->buildRequests(1));
$this->assertEquals($this->buildRequests(1), $this->requestSet->getRequests());
// clear
$this->requestSet->setRequests(array());
$this->assertEquals(array(), $this->requestSet->getRequests());
}
public function testSetRequestsShouldConvertNonRequestInstancesToARequestInstance()
{
$requests = array(
$this->buildRequest(5),
array('idsite' => 9),
$this->buildRequest(2),
array('idsite' => 3),
$this->buildRequest(6)
);
$this->requestSet->setRequests($requests);
$setRequests = $this->requestSet->getRequests();
$this->assertEquals($this->buildRequest(5), $setRequests[0]);
$this->assertEquals($this->buildRequest(2), $setRequests[2]);
$this->assertEquals($this->buildRequest(6), $setRequests[4]);
$this->assertTrue($setRequests[1] instanceof Request);
$this->assertEquals(array('idsite' => 9), $setRequests[1]->getParams());
$this->assertTrue($setRequests[3] instanceof Request);
$this->assertEquals(array('idsite' => 3), $setRequests[3]->getParams());
$this->assertCount(5, $setRequests);
}
public function testSetRequestsShouldIgnoreEmptyRequestsButNotArrays()
{
$request1 = $this->buildRequest(5);
$request2 = $this->buildRequest(2);
$request3 = $this->buildRequest(6);
$requests = [
$request1,
null,
$request2,
0,
$request3,
[]
];
$this->requestSet->setRequests($requests);
$expected = [$request1, $request2, $request3, new Request([])];
$this->assertEquals($expected, $this->requestSet->getRequests());
}
public function testGetNumberOfRequestsShouldReturnZeroIfNothingSet()
{
$this->assertEquals(0, $this->requestSet->getNumberOfRequests());
}
public function testGetNumberOfRequestsShouldReturnNumberOfRequests()
{
$this->requestSet->setRequests($this->buildRequests(3));
$this->assertSame(3, $this->requestSet->getNumberOfRequests());
$this->requestSet->setRequests($this->buildRequests(5));
$this->assertSame(5, $this->requestSet->getNumberOfRequests());
$this->requestSet->setRequests($this->buildRequests(1));
$this->assertSame(1, $this->requestSet->getNumberOfRequests());
}
public function testHasRequestsShouldReturnFalseIfNotInitializedYetOrNoDataSet()
{
$this->assertFalse($this->requestSet->hasRequests());
$this->requestSet->setRequests(array());
$this->assertFalse($this->requestSet->hasRequests());
}
public function testHasRequestsShouldReturnTrueIfAtLeastOneRequestIsSet()
{
$this->assertFalse($this->requestSet->hasRequests());
$this->requestSet->setRequests($this->buildRequests(1));
$this->assertTrue($this->requestSet->hasRequests());
$this->requestSet->setRequests($this->buildRequests(5));
$this->assertTrue($this->requestSet->hasRequests());
$this->requestSet->setRequests(array(null, 0));
$this->assertFalse($this->requestSet->hasRequests());
}
public function testGetTokenAuthShouldReturnEmptyStringIfNoTokenIsSetAndNoRequestParam()
{
$this->assertEquals('', $this->requestSet->getTokenAuth());
}
public function testGetTokenAuthSetTokenAuthShouldOverwriteTheToken()
{
$this->requestSet->setTokenAuth('MKyKTokenTestIn');
$this->assertEquals('MKyKTokenTestIn', $this->requestSet->getTokenAuth());
}
public function testGetTokenAuthSetTokenAuthShouldBePossibleToClearASetToken()
{
$this->requestSet->setTokenAuth('MKyKTokenTestIn');
$this->assertNotEmpty($this->requestSet->getTokenAuth());
$this->requestSet->setTokenAuth(null);
$this->assertEquals('', $this->requestSet->getTokenAuth()); // does now fallback to get param
}
public function testGetTokenAuthShouldFallbackToRequestParamIfNoTokenSet()
{
$_GET['token_auth'] = 'MyTokenAuthTest';
$this->assertSame('MyTokenAuthTest', $this->requestSet->getTokenAuth());
unset($_GET['token_auth']);
}
public function testGetEnvironmentShouldReturnCurrentServerVar()
{
$this->assertEquals(array(
'server' => $_SERVER,
'cookie' => $_COOKIE
), $this->requestSet->getEnvironment());
}
public function testIntertnalFakeEnvironmentShouldActuallyReturnAValue()
{
$myEnv = $this->getFakeEnvironment();
self::assertIsArray($myEnv);
$this->assertNotEmpty($myEnv);
}
public function testSetEnvironmentShouldOverwriteAnEnvironment()
{
$this->requestSet->setEnvironment($this->getFakeEnvironment());
$this->assertEquals($this->getFakeEnvironment(), $this->requestSet->getEnvironment());
}
public function testRestoreEnvironmentShouldRestoreAPreviouslySetEnvironment()
{
$serverBackup = $_SERVER;
$cookieBackup = $_COOKIE;
$this->requestSet->setEnvironment($this->getFakeEnvironment());
$this->requestSet->restoreEnvironment();
$this->assertEquals(array('mytest' => 'test'), $_SERVER);
$this->assertEquals(array('mytest2' => 'test2'), $_COOKIE);
$_SERVER = $serverBackup;
$_COOKIE = $cookieBackup;
}
public function testRememberEnvironmentShouldSaveCurrentEnvironment()
{
$expected = array('server' => $_SERVER, 'cookie' => $_COOKIE);
$this->requestSet->rememberEnvironment();
$this->assertEquals($expected, $this->requestSet->getEnvironment());
// should not change anything
$this->requestSet->restoreEnvironment();
$this->assertEquals($expected['server'], $_SERVER);
$this->assertEquals($expected['cookie'], $_COOKIE);
}
public function testGetStateShouldReturnCurrentStateOfRequestSet()
{
$this->requestSet->setRequests($this->buildRequests(2));
$this->requestSet->setTokenAuth('mytoken');
$state = $this->requestSet->getState();
$expectedKeys = array('requests', 'env', 'tokenAuth', 'time');
$this->assertEquals($expectedKeys, array_keys($state));
$expectedRequests = array(
array('idsite' => 1),
array('idsite' => 2)
);
$this->assertEquals($expectedRequests, $state['requests']);
$this->assertEquals('mytoken', $state['tokenAuth']);
$this->assertTrue(is_numeric($state['time']));
$this->assertEquals(array('server' => $_SERVER, 'cookie' => $_COOKIE), $state['env']);
}
public function testGetStateShouldRememberAnyAddedParamsFromRequestConstructor()
{
$_SERVER['HTTP_REFERER'] = 'test';
$requests = $this->buildRequests(1);
$this->requestSet->setRequests($requests);
$this->requestSet->setTokenAuth('mytoken');
$state = $this->requestSet->getState();
unset($_SERVER['HTTP_REFERER']);
$expectedRequests = array(
array('idsite' => 1)
);
$this->assertEquals($expectedRequests, $state['requests']);
// the actual params include an added urlref param which should NOT be in the state. otherwise we cannot detect empty requests etc
$this->assertEquals(array('idsite' => 1, 'url' => 'test'), $requests[0]->getParams());
}
public function testRestoreStateShouldRestoreRequestSet()
{
$serverBackup = $_SERVER;
$state = array(
'requests' => array(array('idsite' => 1), array('idsite' => 2), array('idsite' => 3)),
'time' => $this->time,
'tokenAuth' => 'tokenAuthRestored',
'env' => $this->getFakeEnvironment()
);
$this->requestSet->restoreState($state);
$this->assertEquals($this->getFakeEnvironment(), $this->requestSet->getEnvironment());
$this->assertEquals('tokenAuthRestored', $this->requestSet->getTokenAuth());
$expectedRequests = array(
new Request(array('idsite' => 1), 'tokenAuthRestored'),
new Request(array('idsite' => 2), 'tokenAuthRestored'),
new Request(array('idsite' => 3), 'tokenAuthRestored'),
);
$expectedRequests[0]->setCurrentTimestamp($this->time);
$expectedRequests[1]->setCurrentTimestamp($this->time);
$expectedRequests[2]->setCurrentTimestamp($this->time);
$requests = $this->requestSet->getRequests();
$this->assertEquals($expectedRequests, $requests);
// verify again just to be sure (only first one)
$this->assertEquals('tokenAuthRestored', $requests[0]->getTokenAuth());
$this->assertEquals($this->time, $requests[0]->getCurrentTimestamp());
// should not restoreEnvironment, only set the environment
$this->assertSame($serverBackup, $_SERVER);
}
public function testRestoreStateIfRequestWasEmptyShouldBeStillEmptyWhenRestored()
{
$_SERVER['HTTP_REFERER'] = 'test';
$this->requestSet->setRequests(array(new Request(array())));
$state = $this->requestSet->getState();
$requestSet = $this->createRequestSet();
$requestSet->restoreState($state);
unset($_SERVER['HTTP_REFERER']);
$requests = $requestSet->getRequests();
$this->assertTrue($requests[0]->isEmptyRequest());
}
public function testRestoreStateShouldResetTheStoredEnvironmentBeforeRestoringRequests()
{
$this->requestSet->setRequests(array(new Request(array())));
$state = $this->requestSet->getState();
$state['env']['server']['HTTP_REFERER'] = 'mytesturl';
$requestSet = $this->createRequestSet();
$requestSet->restoreState($state);
$requests = $requestSet->getRequests();
$this->assertTrue($requests[0]->isEmptyRequest());
$this->assertEquals(array('url' => 'mytesturl'), $requests[0]->getParams());
$this->assertTrue(empty($_SERVER['HTTP_REFERER']));
}
/**
* @param int $numRequests
* @return Request[]
*/
private function buildRequests($numRequests)
{
$requests = array();
for ($index = 1; $index <= $numRequests; $index++) {
$requests[] = $this->buildRequest($index);
}
return $requests;
}
private function buildRequest($idsite)
{
$request = new Request(array('idsite' => ('' . $idsite)));
$request->setCurrentTimestamp($this->time);
return $request;
}
private function getFakeEnvironment()
{
return array('server' => array('mytest' => 'test'), 'cookie' => array('mytest2' => 'test2'));
}
}
class TestRequestSet extends RequestSet
{
public function getAllSiteIdsWithinRequest()
{
return parent::getAllSiteIdsWithinRequest();
}
public function getEnvironment()
{
return parent::getEnvironment();
}
}