diff options
Diffstat (limited to 'application')
-rw-r--r-- | application/bookmark/BookmarkIO.php | 22 | ||||
-rw-r--r-- | application/front/controller/admin/ServerController.php | 7 | ||||
-rw-r--r-- | application/front/controller/visitor/InstallController.php | 7 | ||||
-rw-r--r-- | application/helper/ApplicationUtils.php | 16 |
4 files changed, 48 insertions, 4 deletions
diff --git a/application/bookmark/BookmarkIO.php b/application/bookmark/BookmarkIO.php index c78dbe41..8439d470 100644 --- a/application/bookmark/BookmarkIO.php +++ b/application/bookmark/BookmarkIO.php | |||
@@ -4,6 +4,7 @@ declare(strict_types=1); | |||
4 | 4 | ||
5 | namespace Shaarli\Bookmark; | 5 | namespace Shaarli\Bookmark; |
6 | 6 | ||
7 | use malkusch\lock\exception\LockAcquireException; | ||
7 | use malkusch\lock\mutex\Mutex; | 8 | use malkusch\lock\mutex\Mutex; |
8 | use malkusch\lock\mutex\NoMutex; | 9 | use malkusch\lock\mutex\NoMutex; |
9 | use Shaarli\Bookmark\Exception\DatastoreNotInitializedException; | 10 | use Shaarli\Bookmark\Exception\DatastoreNotInitializedException; |
@@ -80,7 +81,7 @@ class BookmarkIO | |||
80 | } | 81 | } |
81 | 82 | ||
82 | $content = null; | 83 | $content = null; |
83 | $this->mutex->synchronized(function () use (&$content) { | 84 | $this->synchronized(function () use (&$content) { |
84 | $content = file_get_contents($this->datastore); | 85 | $content = file_get_contents($this->datastore); |
85 | }); | 86 | }); |
86 | 87 | ||
@@ -119,11 +120,28 @@ class BookmarkIO | |||
119 | 120 | ||
120 | $data = self::$phpPrefix . base64_encode(gzdeflate(serialize($links))) . self::$phpSuffix; | 121 | $data = self::$phpPrefix . base64_encode(gzdeflate(serialize($links))) . self::$phpSuffix; |
121 | 122 | ||
122 | $this->mutex->synchronized(function () use ($data) { | 123 | $this->synchronized(function () use ($data) { |
123 | file_put_contents( | 124 | file_put_contents( |
124 | $this->datastore, | 125 | $this->datastore, |
125 | $data | 126 | $data |
126 | ); | 127 | ); |
127 | }); | 128 | }); |
128 | } | 129 | } |
130 | |||
131 | /** | ||
132 | * Wrapper applying mutex to provided function. | ||
133 | * If the lock can't be acquired (e.g. some shared hosting provider), we execute the function without mutex. | ||
134 | * | ||
135 | * @see https://github.com/shaarli/Shaarli/issues/1650 | ||
136 | * | ||
137 | * @param callable $function | ||
138 | */ | ||
139 | protected function synchronized(callable $function): void | ||
140 | { | ||
141 | try { | ||
142 | $this->mutex->synchronized($function); | ||
143 | } catch (LockAcquireException $exception) { | ||
144 | $function(); | ||
145 | } | ||
146 | } | ||
129 | } | 147 | } |
diff --git a/application/front/controller/admin/ServerController.php b/application/front/controller/admin/ServerController.php index fabeaf2f..4b74f4a9 100644 --- a/application/front/controller/admin/ServerController.php +++ b/application/front/controller/admin/ServerController.php | |||
@@ -39,11 +39,16 @@ class ServerController extends ShaarliAdminController | |||
39 | $currentVersion = $currentVersion === 'dev' ? $currentVersion : 'v' . $currentVersion; | 39 | $currentVersion = $currentVersion === 'dev' ? $currentVersion : 'v' . $currentVersion; |
40 | $phpEol = new \DateTimeImmutable(ApplicationUtils::getPhpEol(PHP_VERSION)); | 40 | $phpEol = new \DateTimeImmutable(ApplicationUtils::getPhpEol(PHP_VERSION)); |
41 | 41 | ||
42 | $permissions = array_merge( | ||
43 | ApplicationUtils::checkResourcePermissions($this->container->conf), | ||
44 | ApplicationUtils::checkDatastoreMutex() | ||
45 | ); | ||
46 | |||
42 | $this->assignView('php_version', PHP_VERSION); | 47 | $this->assignView('php_version', PHP_VERSION); |
43 | $this->assignView('php_eol', format_date($phpEol, false)); | 48 | $this->assignView('php_eol', format_date($phpEol, false)); |
44 | $this->assignView('php_has_reached_eol', $phpEol < new \DateTimeImmutable()); | 49 | $this->assignView('php_has_reached_eol', $phpEol < new \DateTimeImmutable()); |
45 | $this->assignView('php_extensions', ApplicationUtils::getPhpExtensionsRequirement()); | 50 | $this->assignView('php_extensions', ApplicationUtils::getPhpExtensionsRequirement()); |
46 | $this->assignView('permissions', ApplicationUtils::checkResourcePermissions($this->container->conf)); | 51 | $this->assignView('permissions', $permissions); |
47 | $this->assignView('release_url', $releaseUrl); | 52 | $this->assignView('release_url', $releaseUrl); |
48 | $this->assignView('latest_version', $latestVersion); | 53 | $this->assignView('latest_version', $latestVersion); |
49 | $this->assignView('current_version', $currentVersion); | 54 | $this->assignView('current_version', $currentVersion); |
diff --git a/application/front/controller/visitor/InstallController.php b/application/front/controller/visitor/InstallController.php index bf965929..418d4a49 100644 --- a/application/front/controller/visitor/InstallController.php +++ b/application/front/controller/visitor/InstallController.php | |||
@@ -56,11 +56,16 @@ class InstallController extends ShaarliVisitorController | |||
56 | 56 | ||
57 | $phpEol = new \DateTimeImmutable(ApplicationUtils::getPhpEol(PHP_VERSION)); | 57 | $phpEol = new \DateTimeImmutable(ApplicationUtils::getPhpEol(PHP_VERSION)); |
58 | 58 | ||
59 | $permissions = array_merge( | ||
60 | ApplicationUtils::checkResourcePermissions($this->container->conf), | ||
61 | ApplicationUtils::checkDatastoreMutex() | ||
62 | ); | ||
63 | |||
59 | $this->assignView('php_version', PHP_VERSION); | 64 | $this->assignView('php_version', PHP_VERSION); |
60 | $this->assignView('php_eol', format_date($phpEol, false)); | 65 | $this->assignView('php_eol', format_date($phpEol, false)); |
61 | $this->assignView('php_has_reached_eol', $phpEol < new \DateTimeImmutable()); | 66 | $this->assignView('php_has_reached_eol', $phpEol < new \DateTimeImmutable()); |
62 | $this->assignView('php_extensions', ApplicationUtils::getPhpExtensionsRequirement()); | 67 | $this->assignView('php_extensions', ApplicationUtils::getPhpExtensionsRequirement()); |
63 | $this->assignView('permissions', ApplicationUtils::checkResourcePermissions($this->container->conf)); | 68 | $this->assignView('permissions', $permissions); |
64 | 69 | ||
65 | $this->assignView('pagetitle', t('Install Shaarli')); | 70 | $this->assignView('pagetitle', t('Install Shaarli')); |
66 | 71 | ||
diff --git a/application/helper/ApplicationUtils.php b/application/helper/ApplicationUtils.php index 212dd8e2..a6c03aae 100644 --- a/application/helper/ApplicationUtils.php +++ b/application/helper/ApplicationUtils.php | |||
@@ -3,6 +3,8 @@ | |||
3 | namespace Shaarli\Helper; | 3 | namespace Shaarli\Helper; |
4 | 4 | ||
5 | use Exception; | 5 | use Exception; |
6 | use malkusch\lock\exception\LockAcquireException; | ||
7 | use malkusch\lock\mutex\FlockMutex; | ||
6 | use Shaarli\Config\ConfigManager; | 8 | use Shaarli\Config\ConfigManager; |
7 | 9 | ||
8 | /** | 10 | /** |
@@ -252,6 +254,20 @@ class ApplicationUtils | |||
252 | return $errors; | 254 | return $errors; |
253 | } | 255 | } |
254 | 256 | ||
257 | public static function checkDatastoreMutex(): array | ||
258 | { | ||
259 | $mutex = new FlockMutex(fopen(SHAARLI_MUTEX_FILE, 'r'), 2); | ||
260 | try { | ||
261 | $mutex->synchronized(function () { | ||
262 | return true; | ||
263 | }); | ||
264 | } catch (LockAcquireException $e) { | ||
265 | $errors[] = t('Lock can not be acquired on the datastore. You might encounter concurrent access issues.'); | ||
266 | } | ||
267 | |||
268 | return $errors ?? []; | ||
269 | } | ||
270 | |||
255 | /** | 271 | /** |
256 | * Returns a salted hash representing the current Shaarli version. | 272 | * Returns a salted hash representing the current Shaarli version. |
257 | * | 273 | * |