aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/phpbb/install
diff options
context:
space:
mode:
authorMáté Bartus <mate.bartus@gmail.com>2016-02-28 00:19:24 +0100
committerMáté Bartus <mate.bartus@gmail.com>2016-02-28 14:05:07 +0100
commit062358f8b1d9a7fa3d9be97f6b58e06fea7ca844 (patch)
tree88c0da83c6a25eda15c9fd70af5dc23ae3ddb77a /phpBB/phpbb/install
parent30db51a86e009f50920f8c0c6c05da26e2b10a56 (diff)
downloadforums-062358f8b1d9a7fa3d9be97f6b58e06fea7ca844.tar
forums-062358f8b1d9a7fa3d9be97f6b58e06fea7ca844.tar.gz
forums-062358f8b1d9a7fa3d9be97f6b58e06fea7ca844.tar.bz2
forums-062358f8b1d9a7fa3d9be97f6b58e06fea7ca844.tar.xz
forums-062358f8b1d9a7fa3d9be97f6b58e06fea7ca844.zip
[ticket/14487] Try to handle connection timeouts
PHPBB3-14487
Diffstat (limited to 'phpBB/phpbb/install')
-rw-r--r--phpBB/phpbb/install/controller/timeout_check.php80
-rw-r--r--phpBB/phpbb/install/helper/iohandler/ajax_iohandler.php41
-rw-r--r--phpBB/phpbb/install/installer.php22
3 files changed, 141 insertions, 2 deletions
diff --git a/phpBB/phpbb/install/controller/timeout_check.php b/phpBB/phpbb/install/controller/timeout_check.php
new file mode 100644
index 0000000000..1c90e3caf3
--- /dev/null
+++ b/phpBB/phpbb/install/controller/timeout_check.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\install\controller;
+
+use Symfony\Component\HttpFoundation\JsonResponse;
+
+class timeout_check
+{
+ /**
+ * @var helper
+ */
+ protected $helper;
+
+ /**
+ * @var string
+ */
+ protected $phpbb_root_path;
+
+ /**
+ * Constructor
+ *
+ * @param helper $helper
+ * @param string $phpbb_root_path
+ */
+ public function __construct(helper $helper, $phpbb_root_path)
+ {
+ $this->helper = $helper;
+ $this->phpbb_root_path = $phpbb_root_path;
+ }
+
+ /**
+ * Controller for querying installer status
+ */
+ public function status()
+ {
+ $lock_file = $this->phpbb_root_path . 'store/io_lock.lock';
+ $response = new JsonResponse();
+
+ if (!file_exists($lock_file))
+ {
+ $response->setData(array(
+ 'status' => 'fail',
+ ));
+ }
+ else
+ {
+ $fp = @fopen($lock_file, 'r');
+
+ if ($fp && flock($fp, LOCK_EX | LOCK_NB))
+ {
+ $status = (filesize($lock_file) >= 2 && fread($fp, 2) === 'ok') ? 'continue' : 'fail';
+
+ $response->setData(array(
+ 'status' => $status,
+ ));
+ flock($fp, LOCK_UN);
+ fclose($fp);
+ }
+ else
+ {
+ $response->setData(array(
+ 'status' => 'running',
+ ));
+ }
+ }
+
+ return $response;
+ }
+}
diff --git a/phpBB/phpbb/install/helper/iohandler/ajax_iohandler.php b/phpBB/phpbb/install/helper/iohandler/ajax_iohandler.php
index 8c62ec7bd0..c168d26425 100644
--- a/phpBB/phpbb/install/helper/iohandler/ajax_iohandler.php
+++ b/phpBB/phpbb/install/helper/iohandler/ajax_iohandler.php
@@ -44,6 +44,11 @@ class ajax_iohandler extends iohandler_base
/**
* @var string
*/
+ protected $phpbb_root_path;
+
+ /**
+ * @var string
+ */
protected $file_status;
/**
@@ -77,14 +82,20 @@ class ajax_iohandler extends iohandler_base
protected $redirect_url;
/**
+ * @var resource
+ */
+ protected $file_lock_pointer;
+
+ /**
* Constructor
*
* @param path_helper $path_helper
* @param \phpbb\request\request_interface $request HTTP request interface
* @param \phpbb\template\template $template Template engine
* @param router $router Router
+ * @param string $root_path Path to phpBB's root
*/
- public function __construct(path_helper $path_helper, \phpbb\request\request_interface $request, \phpbb\template\template $template, router $router)
+ public function __construct(path_helper $path_helper, \phpbb\request\request_interface $request, \phpbb\template\template $template, router $router, $root_path)
{
$this->path_helper = $path_helper;
$this->request = $request;
@@ -96,6 +107,7 @@ class ajax_iohandler extends iohandler_base
$this->download = array();
$this->redirect_url = array();
$this->file_status = '';
+ $this->phpbb_root_path = $root_path;
parent::__construct();
}
@@ -433,6 +445,33 @@ class ajax_iohandler extends iohandler_base
}
/**
+ * Acquires a file lock
+ */
+ public function acquire_lock()
+ {
+ $lock_file = $this->phpbb_root_path . 'store/io_lock.lock';
+ $this->file_lock_pointer = @fopen($lock_file, 'w+');
+
+ if ($this->file_lock_pointer)
+ {
+ flock($this->file_lock_pointer, LOCK_EX);
+ }
+ }
+
+ /**
+ * Release file lock
+ */
+ public function release_lock()
+ {
+ if ($this->file_lock_pointer)
+ {
+ fwrite($this->file_lock_pointer, 'ok');
+ flock($this->file_lock_pointer, LOCK_UN);
+ fclose($this->file_lock_pointer);
+ }
+ }
+
+ /**
* Callback function for language replacing
*
* @param array $matches
diff --git a/phpBB/phpbb/install/installer.php b/phpBB/phpbb/install/installer.php
index b5709e96c7..240423ae78 100644
--- a/phpBB/phpbb/install/installer.php
+++ b/phpBB/phpbb/install/installer.php
@@ -22,6 +22,7 @@ use phpbb\install\exception\resource_limit_reached_exception;
use phpbb\install\exception\user_interaction_required_exception;
use phpbb\install\helper\config;
use phpbb\install\helper\container_factory;
+use phpbb\install\helper\iohandler\ajax_iohandler;
use phpbb\install\helper\iohandler\cli_iohandler;
use phpbb\install\helper\iohandler\iohandler_interface;
use phpbb\path_helper;
@@ -126,6 +127,11 @@ class installer
*/
public function run()
{
+ if ($this->iohandler instanceof ajax_iohandler)
+ {
+ $this->iohandler->acquire_lock();
+ }
+
// Load install progress
$this->install_config->load_config();
@@ -174,7 +180,16 @@ class installer
try
{
$iterator = $this->installer_modules->getIterator();
- $iterator->seek($module_index);
+
+ if ($module_index < $iterator->count())
+ {
+ $iterator->seek($module_index);
+ }
+ else
+ {
+ $iterator->seek($module_index - 1);
+ $iterator->next();
+ }
while ($iterator->valid())
{
@@ -256,6 +271,11 @@ class installer
$fail_cleanup = true;
}
+ if ($this->iohandler instanceof ajax_iohandler)
+ {
+ $this->iohandler->release_lock();
+ }
+
if ($install_finished)
{
// Send install finished message