1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
|
<?php
/**
* Piwik - Open source web analytics
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html Gpl v3 or later
* @version $Id: Tracker.php 575 2008-07-26 23:08:32Z matt $
*
* @package Piwik_Tracker
*/
/**
* Class used by the logging script piwik.php called by the javascript tag.
* Handles the visitor & his/her actions on the website, saves the data in the DB,
* saves information in the cookie, etc.
*
* We try to include as little files as possible (no dependency on 3rd party modules).
*
* @package Piwik_Tracker
*/
class Piwik_Tracker
{
protected $stateValid = self::STATE_NOTHING_TO_NOTICE;
protected $urlToRedirect;
/**
* @var Piwik_Tracker_Db
*/
static protected $db = null;
const STATE_NOTHING_TO_NOTICE = 1;
const STATE_TO_REDIRECT_URL = 2;
const STATE_LOGGING_DISABLE = 10;
const STATE_NO_GET_VARIABLE = 11;
const COOKIE_INDEX_IDVISITOR = 1;
const COOKIE_INDEX_TIMESTAMP_LAST_ACTION = 2;
const COOKIE_INDEX_TIMESTAMP_FIRST_ACTION = 3;
const COOKIE_INDEX_ID_VISIT = 4;
const COOKIE_INDEX_ID_LAST_ACTION = 5;
const COOKIE_INDEX_REFERER_ID_VISIT = 6;
const COOKIE_INDEX_REFERER_TIMESTAMP = 7;
const COOKIE_INDEX_REFERER_TYPE = 8;
const COOKIE_INDEX_REFERER_NAME = 9;
const COOKIE_INDEX_REFERER_KEYWORD = 10;
const COOKIE_INDEX_VISITOR_RETURNING = 11;
public function __construct() {}
public function main()
{
$this->init();
if( $this->isVisitValid() )
{
try {
self::connectDatabase();
$visit = $this->getNewVisitObject();
$visit->handle();
unset($visit);
} catch (PDOException $e) {
printDebug($e->getMessage());
$this->setState(self::STATE_LOGGING_DISABLE);
}
}
$this->end();
}
/**
* Returns the date in the "Y-m-d H:i:s" PHP format
* @return string
*/
public static function getDatetimeFromTimestamp($timestamp)
{
return date("Y-m-d H:i:s", $timestamp);
}
protected function init()
{
$this->loadTrackerPlugins();
$this->handleDisabledTracker();
$this->handleEmptyGetVariable();
$this->handleDownloadRedirect();
$this->handleOutlinkRedirect();
}
// display the logo or pixel 1*1 GIF
// or a marketing page if no parameters in the url
// or redirect to a url
// or load a URL (rss feed) (forward the cookie as well)
protected function end()
{
switch($this->getState())
{
case self::STATE_LOGGING_DISABLE:
printDebug("Logging disabled, display transparent logo");
$this->outputTransparentGif();
break;
case self::STATE_NO_GET_VARIABLE:
printDebug("No get variables => Piwik page");
echo "<a href='index.php'>Piwik</a> is a free open source <a href='http://piwik.org'>web analytics</a> alternative to Google analytics.";
break;
case self::STATE_TO_REDIRECT_URL:
$this->sendHeader('Location: ' . $this->getUrlToRedirect());
break;
case self::STATE_NOTHING_TO_NOTICE:
default:
printDebug("Nothing to notice => default behaviour");
$this->outputTransparentGif();
break;
}
printDebug("End of the page.");
if($GLOBALS['DEBUGPIWIK'] === true)
{
Piwik::printSqlProfilingReportTracker(self::$db);
}
self::disconnectDatabase();
}
public static function connectPiwikTrackerDb()
{
$db = null;
$configDb = Piwik_Tracker_Config::getInstance()->database;
if(!isset($configDb['port']))
{
// before 0.2.4 there is no port specified in config file
$configDb['port'] = '3306';
}
$db = new Piwik_Tracker_Db( $configDb['host'],
$configDb['username'],
$configDb['password'],
$configDb['dbname'],
$configDb['port'] );
$db->connect();
return $db;
}
public static function connectDatabase()
{
if( !is_null(self::$db))
{
return;
}
$db = null;
Piwik_PostEvent('Tracker.createDatabase', $db);
if(is_null($db))
{
$db = self::connectPiwikTrackerDb();
}
self::$db = $db;
}
/**
* @return Piwik_Tracker_Db
*/
public static function getDatabase()
{
return self::$db;
}
public static function disconnectDatabase()
{
if(isset(self::$db))
{
self::$db->disconnect();
}
}
/**
* Returns the Tracker_Visit object.
* This method can be overwritten to use a different Tracker_Visit object
*
* @return Piwik_Tracker_Visit
*/
protected function getNewVisitObject()
{
$visit = null;
Piwik_PostEvent('Tracker.getNewVisitObject', $visit);
if(is_null($visit))
{
$visit = new Piwik_Tracker_Visit();
}
elseif(!($visit instanceof Piwik_Tracker_Visit_Interface ))
{
throw new Exception("The Visit object set in the plugin must implement Piwik_Tracker_Visit_Interface");
}
return $visit;
}
protected function outputTransparentGif()
{
if( !isset($GLOBALS['DEBUGPIWIK']) || !$GLOBALS['DEBUGPIWIK'] )
{
$trans_gif_64 = "R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==";
header("Content-type: image/gif");
print(base64_decode($trans_gif_64));
}
}
protected function sendHeader($header)
{
header($header);
}
private function isVisitValid()
{
return $this->stateValid !== self::STATE_LOGGING_DISABLE
&& $this->stateValid !== self::STATE_NO_GET_VARIABLE;
}
private function getState()
{
return $this->stateValid;
}
private function setUrlToRedirect( $url )
{
$this->urlToRedirect = $url;
}
private function getUrlToRedirect()
{
return $this->urlToRedirect;
}
private function setState( $value )
{
$this->stateValid = $value;
}
private function loadTrackerPlugins()
{
try{
$pluginsTracker = Piwik_Tracker_Config::getInstance()->Plugins_Tracker;
if(is_array($pluginsTracker)
&& count($pluginsTracker) != 0)
{
Piwik_PluginsManager::getInstance()->doNotLoadAlwaysActivatedPlugins();
Piwik_PluginsManager::getInstance()->setPluginsToLoad( $pluginsTracker['Plugins_Tracker'] );
printDebug("Loading plugins: { ". implode(",", $pluginsTracker['Plugins_Tracker']) . "}");
}
} catch(Exception $e) {
printDebug("ERROR: ".$e->getMessage());
}
}
private function handleDownloadRedirect()
{
$downloadVariableName = Piwik_Tracker_Config::getInstance()->Tracker['download_url_var_name'];
$urlDownload = Piwik_Common::getRequestVar( $downloadVariableName, '', 'string');
if( !empty($urlDownload) )
{
if( Piwik_Common::getRequestVar( 'redirect', 1, 'int') == 1)
{
$this->setState( self::STATE_TO_REDIRECT_URL );
}
$this->setUrlToRedirect ( $urlDownload );
}
}
private function handleOutlinkRedirect()
{
$outlinkVariableName = Piwik_Tracker_Config::getInstance()->Tracker['outlink_url_var_name'];
$urlOutlink = Piwik_Common::getRequestVar( $outlinkVariableName, '', 'string');
if( !empty($urlOutlink) )
{
if( Piwik_Common::getRequestVar( 'redirect', 1, 'int') == 1)
{
$this->setState( self::STATE_TO_REDIRECT_URL );
}
$this->setUrlToRedirect ( $urlOutlink);
}
}
private function handleEmptyGetVariable()
{
if( count($_GET) == 0)
{
$this->setState(self::STATE_NO_GET_VARIABLE);
}
}
private function handleDisabledTracker()
{
$saveStats = Piwik_Tracker_Config::getInstance()->Tracker['record_statistics'];
if($saveStats == 0)
{
$this->setState(self::STATE_LOGGING_DISABLE);
}
}
}
function printDebug( $info = '' )
{
if(isset($GLOBALS['DEBUGPIWIK']) && $GLOBALS['DEBUGPIWIK'])
{
if(is_array($info))
{
print("<PRE>");
print(var_export($info,true));
print("</PRE>");
}
else
{
print($info . "<br>\n");
}
}
}
|