]>
git.immae.eu Git - github/shaarli/Shaarli.git/blob - application/ApplicationUtils.php
3 * Shaarli (application) utilities
7 private static $GIT_URL = 'https://raw.githubusercontent.com/shaarli/Shaarli';
8 private static $GIT_BRANCH = 'master';
9 private static $VERSION_FILE = 'shaarli_version.php';
10 private static $VERSION_START_TAG = '<?php /* ';
11 private static $VERSION_END_TAG = ' */ ?>';
14 * Gets the latest version code from the Git repository
16 * The code is read from the raw content of the version file on the Git server.
18 * @return mixed the version code from the repository if available, else 'false'
20 public static function getLatestGitVersionCode($url, $timeout=2)
22 list($headers, $data) = get_http_url($url, $timeout);
24 if (strpos($headers[0], '200 OK') === false) {
25 error_log('Failed to retrieve ' . $url);
30 array(self
::$VERSION_START_TAG, self
::$VERSION_END_TAG, PHP_EOL
),
37 * Checks if a new Shaarli version has been published on the Git repository
39 * Updates checks are run periodically, according to the following criteria:
40 * - the update checks are enabled (install, global config);
41 * - the user is logged in (or this is an open instance);
42 * - the last check is older than a given interval;
43 * - the check is non-blocking if the HTTPS connection to Git fails;
44 * - in case of failure, the update file's modification date is updated,
45 * to avoid intempestive connection attempts.
47 * @param string $currentVersion the current version code
48 * @param string $updateFile the file where to store the latest version code
49 * @param int $checkInterval the minimum interval between update checks (in seconds
50 * @param bool $enableCheck whether to check for new versions
51 * @param bool $isLoggedIn whether the user is logged in
53 * @return mixed the new version code if available and greater, else 'false'
55 public static function checkUpdate(
56 $currentVersion, $updateFile, $checkInterval, $enableCheck, $isLoggedIn)
59 // Do not check versions for visitors
63 if (empty($enableCheck)) {
64 // Do not check if the user doesn't want to
68 if (is_file($updateFile) && (filemtime($updateFile) > time() - $checkInterval)) {
69 // Shaarli has checked for updates recently - skip HTTP query
70 $latestKnownVersion = file_get_contents($updateFile);
72 if (version_compare($latestKnownVersion, $currentVersion) == 1) {
73 return $latestKnownVersion;
78 // Late Static Binding allows overriding within tests
79 // See http://php.net/manual/en/language.oop5.late-static-bindings.php
80 $latestVersion = static::getLatestGitVersionCode(
81 self
::$GIT_URL . '/' . self
::$GIT_BRANCH . '/' . self
::$VERSION_FILE
84 if (! $latestVersion) {
85 // Only update the file's modification date
86 file_put_contents($updateFile, $currentVersion);
90 // Update the file's content and modification date
91 file_put_contents($updateFile, $latestVersion);
93 if (version_compare($latestVersion, $currentVersion) == 1) {
94 return $latestVersion;
101 * Checks the PHP version to ensure Shaarli can run
103 * @param string $minVersion minimum PHP required version
104 * @param string $curVersion current PHP version (use PHP_VERSION)
106 * @throws Exception the PHP version is not supported
108 public static function checkPHPVersion($minVersion, $curVersion)
110 if (version_compare($curVersion, $minVersion) < 0) {
112 'Your PHP version is obsolete!'
113 .' Shaarli requires at least PHP '.$minVersion.', and thus cannot run.'
114 .' Your PHP version has known security vulnerabilities and should be'
115 .' updated as soon as possible.'
121 * Checks Shaarli has the proper access permissions to its resources
123 * @param array $globalConfig The $GLOBALS['config'] array
125 * @return array A list of the detected configuration issues
127 public static function checkResourcePermissions($globalConfig)
131 // Check script and template directories are readable
136 $globalConfig['RAINTPL_TPL']
138 if (! is_readable(realpath($path))) {
139 $errors[] = '"'.$path.'" directory is not readable';
143 // Check cache and data directories are readable and writeable
145 $globalConfig['CACHEDIR'],
146 $globalConfig['DATADIR'],
147 $globalConfig['PAGECACHE'],
148 $globalConfig['RAINTPL_TMP']
150 if (! is_readable(realpath($path))) {
151 $errors[] = '"'.$path.'" directory is not readable';
153 if (! is_writable(realpath($path))) {
154 $errors[] = '"'.$path.'" directory is not writable';
158 // Check configuration files are readable and writeable
160 $globalConfig['CONFIG_FILE'],
161 $globalConfig['DATASTORE'],
162 $globalConfig['IPBANS_FILENAME'],
163 $globalConfig['LOG_FILE'],
164 $globalConfig['UPDATECHECK_FILENAME']
166 if (! is_file(realpath($path))) {
167 # the file may not exist yet
171 if (! is_readable(realpath($path))) {
172 $errors[] = '"'.$path.'" file is not readable';
174 if (! is_writable(realpath($path))) {
175 $errors[] = '"'.$path.'" file is not writable';