diff --git a/lib/Config/PublicAPI.php b/lib/Config/PublicAPI.php index 89e5a92a53..e4b80a11a7 100644 --- a/lib/Config/PublicAPI.php +++ b/lib/Config/PublicAPI.php @@ -1,7 +1,7 @@ payload); + $queue = new Daemon($this->payload); if(method_exists($queue, $this->action)) { call_user_func( array( diff --git a/lib/Queue/Queue.php b/lib/Queue/Daemon.php similarity index 74% rename from lib/Queue/Queue.php rename to lib/Queue/Daemon.php index 93d0f6cf01..da795dea22 100644 --- a/lib/Queue/Queue.php +++ b/lib/Queue/Daemon.php @@ -8,7 +8,7 @@ require_once(ABSPATH . 'wp-includes/pluggable.php'); if(!defined('ABSPATH')) exit; -class Queue { +class Daemon { function __construct($payload = array()) { set_time_limit(0); ignore_user_abort(); @@ -18,9 +18,10 @@ class Queue { } function start() { - if(!isset($this->payload['token'])) { - $this->abortWithError('missing token'); + if(!isset($this->payload['session'])) { + $this->abortWithError('missing session ID'); } + $this->manageSession('start'); $queue = $this->queue; $queueData = $this->queueData; if(!$queue) { @@ -29,33 +30,30 @@ class Queue { $queue->value = serialize(array('status' => 'stopped')); $queue->save(); } - if(!preg_match('!stopped|paused!', $queueData['status']) - ) { + if($queueData['status'] !== 'started') { + $_SESSION['queue'] = 'started'; $queueData = array( 'status' => 'started', 'token' => $this->refreshedToken, 'executionCounter' => ($queueData['status'] === 'paused') ? $queueData['executionCounter'] - : 0, - 'log' => array( - 'token' => $this->payload['token'], - 'message' => 'started' - ) + : 0 ); + $_SESSION['queue'] = array('result' => true); + $this->manageSession('end'); $queue->value = serialize($queueData); $queue->save(); $this->callSelf(); } else { - $queueData['log'] = array( - 'token' => $this->payload['token'], - 'status' => 'already started' + $_SESSION['queue'] = array( + 'result' => false, + 'error' => 'already started' ); - $queue->value = serialize($queueData); - $queue->save(); } + $this->manageSession('end'); } - function process() { + function run() { if(!$this->queue || $this->queueData['status'] !== 'started') { $this->abortWithError('not running'); } @@ -88,7 +86,7 @@ class Queue { ); wp_remote_get( site_url() . - '/?mailpoet-api§ion=queue&action=process&payload=' . urlencode($payload), + '/?mailpoet-api§ion=queue&action=run&payload=' . urlencode($payload), $args ); exit; @@ -122,4 +120,19 @@ class Queue { function refreshToken() { return Security::generateRandomString(5); } + + function manageSession($action) { + switch ($action) { + case 'start': + if(session_id()) { + session_write_close(); + } + session_id($this->payload['session']); + session_start(); + break; + case 'end': + session_write_close(); + break; + } + } } \ No newline at end of file diff --git a/lib/Queue/Supervisor.php b/lib/Queue/Supervisor.php index 90556845e8..eb4d497fcb 100644 --- a/lib/Queue/Supervisor.php +++ b/lib/Queue/Supervisor.php @@ -4,7 +4,6 @@ namespace MailPoet\Queue; use Carbon\Carbon; use MailPoet\Config\Env; use MailPoet\Models\Setting; -use MailPoet\Util\Security; if(!defined('ABSPATH')) exit; @@ -20,8 +19,9 @@ class Supervisor { return $this->startQueue(); } else { if(!$this->forceStart && ($this->queueData['status'] === 'paused' || - $this->queueData['status'] === 'stopped' - )) { + $this->queueData['status'] === 'stopped' + ) + ) { return; } $currentTime = Carbon::now('UTC'); @@ -39,14 +39,16 @@ class Supervisor { } function startQueue() { + if(!session_id()) session_start(); + $sessionId = session_id(); + session_write_close(); $args = array( 'timeout' => 1, 'user-agent' => 'MailPoet (www.mailpoet.com)' ); - $token = Security::generateRandomString(5); $payload = json_encode( array( - 'token' => $token + 'session' => $sessionId ) ); wp_remote_get( @@ -55,8 +57,11 @@ class Supervisor { urlencode($payload), $args ); - list ($queue, $queueData) = $this->getQueue(); - return ($queueData && $queueData['token'] === $token) ? true : false; + session_start(); + $queueStatus = $_SESSION['queue']; + unset($_SESSION['queue']); + session_write_close(); + return $queueStatus; } function getQueue() { diff --git a/lib/Router/Queue.php b/lib/Router/Queue.php index 639cad4a8e..5da94f23e0 100644 --- a/lib/Router/Queue.php +++ b/lib/Router/Queue.php @@ -1,6 +1,7 @@ ($this->updateQueueStatus('paused') ? - true : - false - ) - ) - ); - } - - function stop() { - wp_send_json( - array( - 'result' => ($this->updateQueueStatus('stopped') ? - true : - false - ) - ) - ); - } - - private function updateQueueStatus($status) { - $queue = new \MailPoet\Queue\Queue(); - if(!$queue->queue || $queue->queueData['status'] !== 'started') { - return false; + function update($data) { + switch ($data['action']) { + case 'stop': + $status = 'stopped'; + break; + default: + $status = 'paused'; + break; } - $queue->queueData['status'] = $status; - $queue->queue->value = serialize($queue->queueData); - return $queue->queue->save(); + $queue = new Daemon(); + if(!$queue->queue || $queue->queueData['status'] !== 'started') { + $result = false; + } else { + $queue->queueData['status'] = $status; + $queue->queue->value = serialize($queue->queueData); + $result = $queue->queue->save(); + } + wp_send_json( + array( + 'result' => $result + ) + ); } -} +} \ No newline at end of file