Skip to content

Commit

Permalink
Add possibility to manage and view Intranet websites (#13473)
Browse files Browse the repository at this point in the history
* Add possibility to manage and view Intranet websites #7724

* more tweaks

* ui tests

* fix some tests

* added missing name

* remove intranet setting, added test for tracking

* fix various tests

* remove test

* Update RequestProcessor.php

* Update en.json

* fix some tests

* do not throw exception if site does not exist

* seeing just now it is fine to trigger exception

* debug error

* log only certain requests

* Update piwik.php

* Update JsProxyTest.php

* trying to fix tests

* remove debug code

* trying to fix tests
  • Loading branch information
tsteur authored and diosmosis committed Oct 7, 2018
1 parent 5470c4f commit 89d8479
Show file tree
Hide file tree
Showing 41 changed files with 734 additions and 40 deletions.
1 change: 1 addition & 0 deletions config/global.ini.php
Original file line number Diff line number Diff line change
Expand Up @@ -869,6 +869,7 @@
Plugins[] = CoreAdminHome
Plugins[] = CoreHome
Plugins[] = WebsiteMeasurable
Plugins[] = IntranetMeasurable
Plugins[] = Diagnostics
Plugins[] = CoreVisualizations
Plugins[] = Proxy
Expand Down
6 changes: 0 additions & 6 deletions core/Tracker/Visit.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,6 @@ class Visit implements VisitInterface
*/
protected $visitProperties;

/**
* @var VisitorRecognizer
*/
private $visitorRecognizer;

/**
* @var ArchiveInvalidator
*/
Expand All @@ -79,7 +74,6 @@ public function __construct()
{
$requestProcessors = StaticContainer::get('Piwik\Plugin\RequestProcessors');
$this->requestProcessors = $requestProcessors->getRequestProcessors();
$this->visitorRecognizer = StaticContainer::get('Piwik\Tracker\VisitorRecognizer');
$this->visitProperties = null;
$this->userSettings = StaticContainer::get('Piwik\Tracker\Settings');
$this->invalidator = StaticContainer::get('Piwik\Archive\ArchiveInvalidator');
Expand Down
5 changes: 5 additions & 0 deletions core/Tracker/VisitorRecognizer.php
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,11 @@ public function __construct($trustCookiesOnly, $visitStandardLength, $lookbackNS
$this->eventDispatcher = $eventDispatcher;
}

public function setTrustCookiesOnly($trustCookiesOnly)
{
$this->trustCookiesOnly = $trustCookiesOnly;
}

public function findKnownVisitor($configId, VisitProperties $visitProperties, Request $request)
{
$idSite = $request->getIdSite();
Expand Down
1 change: 1 addition & 0 deletions core/Updates/3.6.1-b2.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public function getMigrations(Updater $updater)
{
return array(
$this->migration->db->addColumn('site', 'creator_login', ' VARCHAR(100) NULL'),
$this->migration->plugin->activate('IntranetMeasurable'),
);
}

Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions plugins/IntranetMeasurable/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
tests/System/processed/*xml
18 changes: 18 additions & 0 deletions plugins/IntranetMeasurable/IntranetMeasurable.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/

namespace Piwik\Plugins\IntranetMeasurable;

class IntranetMeasurable extends \Piwik\Plugin
{
public function isTrackerPlugin()
{
return true;
}

}
23 changes: 23 additions & 0 deletions plugins/IntranetMeasurable/MeasurableSettings.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/

namespace Piwik\Plugins\IntranetMeasurable;

use Piwik\Settings\Setting;

class MeasurableSettings extends \Piwik\Plugins\WebsiteMeasurable\MeasurableSettings
{
/** @var Setting */
public $trustvisitorcookies;

protected function shouldShowSettingsForType($type)
{
return $type === Type::ID;
}

}
46 changes: 46 additions & 0 deletions plugins/IntranetMeasurable/Tracker/RequestProcessor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/

namespace Piwik\Plugins\IntranetMeasurable\Tracker;

use Piwik\Container\StaticContainer;
use Piwik\Exception\UnexpectedWebsiteFoundException;
use Piwik\Plugins\IntranetMeasurable\Type;
use Piwik\Tracker\Cache;
use Piwik\Tracker\Request;

class RequestProcessor extends \Piwik\Tracker\RequestProcessor
{
private $didEnableSetting = false;
private $settingName = 'ini.Tracker.trust_visitors_cookies';

public function manipulateRequest(Request $request)
{
try {
$site = Cache::getCacheWebsiteAttributes($request->getIdSite());
} catch (UnexpectedWebsiteFoundException $e) {
return;
}
$isIntranetSite = !empty($site['type']) && $site['type'] === Type::ID;

if ($isIntranetSite && !StaticContainer::get($this->settingName)) {
$this->setTrustCookiesSetting(1);
$this->didEnableSetting = true;
} elseif ($this->didEnableSetting) {
// we reset it in case of bulk tracking with different sites etc
$this->setTrustCookiesSetting(0);
$this->didEnableSetting = false;
}
}

private function setTrustCookiesSetting($value)
{
StaticContainer::get('Piwik\Tracker\VisitorRecognizer')->setTrustCookiesOnly($value);
StaticContainer::getContainer()->set($this->settingName, $value);
}
}
20 changes: 20 additions & 0 deletions plugins/IntranetMeasurable/Type.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugins\IntranetMeasurable;

class Type extends \Piwik\Measurable\Type
{
const ID = 'intranet';
protected $name = 'IntranetMeasurable_Intranet';
protected $namePlural = 'IntranetMeasurable_Intranets';
protected $description = 'IntranetMeasurable_IntranetDescription';
protected $howToSetupUrl = '?module=CoreAdminHome&action=trackingCodeGenerator';

}

7 changes: 7 additions & 0 deletions plugins/IntranetMeasurable/lang/en.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"IntranetMeasurable": {
"Intranet": "Intranet Website",
"Intranets": "Intranet Websites",
"IntranetDescription": "An intranet measurable is just like a website but hosted on an internal network."
}
}
4 changes: 4 additions & 0 deletions plugins/IntranetMeasurable/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"name": "IntranetMeasurable",
"description": "Analytics for the web: lets you measure and analyze intranet websites."
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\IntranetMeasurable\tests\Fixtures;

use Piwik\Date;
use Piwik\Plugins\IntranetMeasurable\Type;
use Piwik\Tests\Framework\Fixture;

/**
* Generates tracker testing data for our TrackingTest
*
* This Simple fixture adds one website and tracks one visit with couple pageviews and an ecommerce conversion
*/
class IntranetSitesWithVisits extends Fixture
{
public $dateTime = '2013-01-23 01:23:45';
public $idSite = 1;
public $idSiteNotIntranet = 2;

public function setUp()
{
$this->setUpWebsites();
$this->trackVisits($this->idSite);
$this->trackVisits($this->idSiteNotIntranet);
}

public function tearDown()
{
// empty
}

private function setUpWebsites()
{
if (!self::siteCreated($this->idSite)) {
Fixture::createWebsite(
'2014-01-02 03:04:05', $ecommerce = 0, $siteName = false, $siteUrl = false,
$siteSearch = 1, $searchKeywordParameters = null,
$searchCategoryParameters = null, $timezone = null, Type::ID
);
}

if (!self::siteCreated($this->idSiteNotIntranet)) {
Fixture::createWebsite('2014-01-02 03:04:05');
}
}

private function configureSameDevice(\PiwikTracker $t)
{
// to make purpose of test more clear we configure the device partially...
$t->setIp('56.11.55.70');
$t->setResolution(500, 200);
$t->setPlugins(true, false, true, false, true);
$t->setUserAgent('Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1');

return $t;
}

protected function trackVisits($idSite)
{
// two visits... intranet will trust visitorId and generate two visits
// regular website will only generate one visit and prefer configId
$t = self::getTracker($idSite, $this->dateTime, $defaultInit = true);
$this->configureSameDevice($t);
$t->randomVisitorId = '1234567890123456';

$t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.1)->getDatetime());
$t->setUrl('http://example.com/');
self::checkResponse($t->doTrackPageView('Viewing homepage'));

$t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.2)->getDatetime());
$t->setUrl('http://example.com/sub/page');
self::checkResponse($t->doTrackPageView('Second page view'));

// different IP and different device but same visitor id... should still match this as unique visitor for intranet site
// but not the other site
$t = self::getTracker($idSite, $this->dateTime, $defaultInit = true);
$this->configureSameDevice($t);
$t->randomVisitorId = '1234567890123457';

$t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.1)->getDatetime());
$t->setUrl('http://example.com/sub/page');
self::checkResponse($t->doTrackPageView('Viewing homepage'));

$t->setForceVisitDateTime(Date::factory($this->dateTime)->addHour(0.2)->getDatetime());
$t->setUrl('http://example.com/?search=this is a site search query');
self::checkResponse($t->doTrackPageView('Site search query'));
}

}
73 changes: 73 additions & 0 deletions plugins/IntranetMeasurable/tests/System/TrackingTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/

namespace Piwik\Plugins\IntranetMeasurable\tests\System;

use Piwik\Plugins\IntranetMeasurable\tests\Fixtures\IntranetSitesWithVisits;
use Piwik\Tests\Framework\TestCase\SystemTestCase;

/**
* @group IntranetMeasurable
* @group TrackingTest
* @group Plugins
*/
class TrackingTest extends SystemTestCase
{
/**
* @var IntranetSitesWithVisits
*/
public static $fixture = null; // initialized below class definition

/**
* @dataProvider getApiForTesting
*/
public function testApi($api, $params)
{
$this->runApiTests($api, $params);
}

public function getApiForTesting()
{
$api = array(
'API.get',
);

$apiToTest = array();
$apiToTest[] = array($api,
array(
'idSite' => self::$fixture->idSite,
'date' => self::$fixture->dateTime,
'periods' => array('day'),
'testSuffix' => '_intranet'
)
);
$apiToTest[] = array($api,
array(
'idSite' => self::$fixture->idSiteNotIntranet,
'date' => self::$fixture->dateTime,
'periods' => array('day'),
'testSuffix' => '_notIntranet'
)
);

return $apiToTest;
}

public static function getOutputPrefix()
{
return '';
}

public static function getPathToTestDirectory()
{
return dirname(__FILE__);
}

}

TrackingTest::$fixture = new IntranetSitesWithVisits();
Loading

0 comments on commit 89d8479

Please sign in to comment.