blob: 21a51af3487f49ade41ea71c83d78ad754306aa1 (
plain)
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
|
<?php
/**
* Piwik - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik;
use Piwik\Container\StaticContainer;
/**
* Class to check if a newer version of Piwik is available
*/
class UpdateCheck
{
const CHECK_INTERVAL = 28800; // every 8 hours
const UI_CLICK_CHECK_INTERVAL = 10; // every 10s when user clicks UI link
const LAST_TIME_CHECKED = 'UpdateCheck_LastTimeChecked';
const LATEST_VERSION = 'UpdateCheck_LatestVersion';
const SOCKET_TIMEOUT = 2;
/**
* Check for a newer version
*
* @param bool $force Force check
* @param int $interval Interval used for update checks
*/
public static function check($force = false, $interval = null)
{
if (!SettingsPiwik::isAutoUpdateEnabled()) {
return;
}
if ($interval === null) {
$interval = self::CHECK_INTERVAL;
}
$lastTimeChecked = Option::get(self::LAST_TIME_CHECKED);
if ($force
|| $lastTimeChecked === false
|| time() - $interval > $lastTimeChecked
) {
// set the time checked first, so that parallel Piwik requests don't all trigger the http requests
Option::set(self::LAST_TIME_CHECKED, time(), $autoLoad = 1);
$latestVersion = self::getLatestAvailableVersionNumber();
$latestVersion = trim((string) $latestVersion);
if (!preg_match('~^[0-9][0-9a-zA-Z_.-]*$~D', $latestVersion)) {
$latestVersion = '';
}
Option::set(self::LATEST_VERSION, $latestVersion);
}
}
/**
* Get the latest available version number for the currently active release channel. Eg '2.15.0-b4' or '2.15.0'.
* Should return a semantic version number in format MAJOR.MINOR.PATCH (http://semver.org/).
* Returns an empty string in case one cannot connect to the remote server.
* @return string
*/
private static function getLatestAvailableVersionNumber()
{
$releaseChannels = StaticContainer::get('\Piwik\Plugin\ReleaseChannels');
$channel = $releaseChannels->getActiveReleaseChannel();
$url = $channel->getUrlToCheckForLatestAvailableVersion();
try {
$latestVersion = Http::sendHttpRequest($url, self::SOCKET_TIMEOUT);
} catch (\Exception $e) {
// e.g., disable_functions = fsockopen; allow_url_open = Off
$latestVersion = '';
}
return $latestVersion;
}
/**
* Returns the latest available version number. Does not perform a check whether a later version is available.
*
* @return false|string
*/
public static function getLatestVersion()
{
return Option::get(self::LATEST_VERSION);
}
/**
* Returns version number of a newer Piwik release.
*
* @return string|bool false if current version is the latest available,
* or the latest version number if a newest release is available
*/
public static function isNewestVersionAvailable()
{
$latestVersion = self::getLatestVersion();
if (!empty($latestVersion)
&& version_compare(Version::VERSION, $latestVersion) == -1
) {
return $latestVersion;
}
return false;
}
}
|