diff --git a/IronMQ.class.php b/IronMQ.class.php index 5198c01..685e86f 100644 --- a/IronMQ.class.php +++ b/IronMQ.class.php @@ -56,6 +56,10 @@ function __construct($message, $properties = array()) { } } + public function encrypt($encryption_key) { + $this->body = IronMQ_Crypt::encrypt($this->body, $encryption_key); + } + public function getBody() { return $this->body; } @@ -120,6 +124,29 @@ public function asArray() { } } +class IronMQ_Crypt { + const method = 'AES-256-CBC'; + const signature = 'ENCRYPTED'; + + public static function encrypt($message, $encryption_key){ + $iv = openssl_random_pseudo_bytes(16); + + $encrypted = openssl_encrypt($message, self::method, self::keyDigest($encryption_key), 0, $iv); + + return self::signature . ":" . base64_encode($iv) . ":" . $encrypted; + } + + public static function decrypt($body, $encryption_key){ + list($signature, $iv, $message) = explode(":", $body); + + return openssl_decrypt($message, self::method, self::keyDigest($encryption_key), 0, base64_decode($iv)); + } + + private static function keyDigest($encryption_key){ + return openssl_digest($encryption_key, 'sha256', true); + } +} + class IronMQ extends IronCore { protected $client_version = '1.4.6'; @@ -238,15 +265,7 @@ public function clearQueue($queue_name) { * @return mixed */ public function postMessage($queue_name, $message, $properties = array()) { - $msg = new IronMQ_Message($message, $properties); - $req = array( - "messages" => array($msg->asArray()) - ); - $this->setCommonHeaders(); - $queue = rawurlencode($queue_name); - $url = "projects/{$this->project_id}/queues/$queue/messages"; - $res = $this->apiCall(self::POST, $url, $req); - $decoded = self::json_decode($res); + $decoded = $this->postMessages($queue_name, array($message), $properties); $decoded->id = $decoded->ids[0]; return $decoded; } @@ -274,6 +293,9 @@ public function postMessages($queue_name, $messages, $properties = array()) { ); foreach($messages as $message) { $msg = new IronMQ_Message($message, $properties); + if ($this->encryption_key){ + $msg->encrypt($this->encryption_key); + } array_push($req['messages'], $msg->asArray()); } $this->setCommonHeaders(); @@ -304,10 +326,13 @@ public function getMessages($queue_name, $count = 1, $timeout = self::GET_MESSAG $this->setJsonHeaders(); $response = $this->apiCall(self::GET, $url, $params); $result = self::json_decode($response); - if(count($result->messages) < 1) { + + $messages = $this->postProcessMessages($result->messages); + + if(count($messages) < 1) { return null; } else { - return $result->messages; + return $messages; } } @@ -375,7 +400,7 @@ public function peekMessages($queue_name, $count) { } $this->setJsonHeaders(); $response = self::json_decode($this->apiCall(self::GET, $url, $params)); - return $response->messages; + return $this->postProcessMessages($response->messages); } /** @@ -533,6 +558,16 @@ public function deleteMessagePushStatus($queue_name, $message_id, $subscription_ /* PRIVATE FUNCTIONS */ + + private function postProcessMessages($messages){ + if ($this->encryption_key){ + foreach($messages as $k => $v) { + $messages[$k]->body = IronMQ_Crypt::decrypt($v->body, $this->encryption_key); + } + } + return $messages; + } + private function setJsonHeaders(){ $this->setCommonHeaders(); } diff --git a/composer.json b/composer.json index c3596d4..65809d9 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ ], "require": { "php": ">=5.2.0", - "iron-io/iron_core": "*" + "iron-io/iron_core": ">=0.1.5" }, "autoload": { "files": ["IronMQ.class.php"] diff --git a/iron_mq.phar b/iron_mq.phar index 1a6bf4c..eced3c1 100644 Binary files a/iron_mq.phar and b/iron_mq.phar differ diff --git a/testMessages.php b/testMessages.php index 145f8de..8cec94c 100644 --- a/testMessages.php +++ b/testMessages.php @@ -8,40 +8,104 @@ #$ironmq->debug_enabled = true; $ironmq->ssl_verifypeer = false; +$queue_name = 'test-php-queue'; +$res = $ironmq->postMessage($queue_name, 'foo!'); +$res = $ironmq->postMessage('test-queue-multi', 'foo!'); + + for ($i = 0; $i < 10; $i++){ - echo "Post message:\n"; - $res = $ironmq->postMessage("test_queue", "Test Message $i"); - var_dump($res); - echo "Post messages:\n"; - $res = $ironmq->postMessages("test-queue-multi", array("Test Message $i", "Test Message $i-2")); - var_dump($res); + print "run #$i: "; + + $msg = "Test Message $i"; + + $res = $ironmq->clearQueue($queue_name); + $res = $ironmq->clearQueue('test-queue-multi'); + if ($res->msg){ + print "."; + }else{ + print 'F'; + var_dump($res); + } + + #echo "Post message:\n"; + $res = $ironmq->postMessage($queue_name, $msg); + if ($res->id && count($res->ids) == 1){ + print "."; + }else{ + print 'F'; + var_dump($res); + } + + #echo "Post messages:\n"; + $res = $ironmq->postMessages("test-queue-multi", array($msg, $msg)); + if (count($res->ids) == 2){ + print "."; + }else{ + print 'F'; + var_dump($res); + } + + #echo "Get message..\n"; + $message = $ironmq->getMessage($queue_name); + if ($message->body == $msg){ + print "."; + }else{ + print 'F'; + var_dump($message); + } + + #echo "Touch message..\n"; + $res = $ironmq->touchMessage($queue_name, $message->id); + if ($res->msg){ + print "."; + }else{ + print 'F'; + var_dump($res); + } + + #echo "Release message..\n"; + $res = $ironmq->releaseMessage($queue_name, $message->id); + if ($res->msg){ + print "."; + }else{ + print 'F'; + var_dump($res); + } - echo "Get message..\n"; - $message = $ironmq->getMessage("test_queue"); - print_r($message); + #echo "Peek message..\n"; + $res = $ironmq->peekMessage($queue_name); + if ($res->body == $msg){ + print "."; + }else{ + print 'F'; + var_dump($res); + } - echo "Touch message..\n"; - $res = $ironmq->touchMessage("test_queue", $message->id); - print_r($res); + #echo "Delete message..\n"; + $message = $ironmq->deleteMessage($queue_name, $message->id); - echo "Release message..\n"; - $res = $ironmq->releaseMessage("test_queue", $message->id); - print_r($res); + if ($message){ + print "."; + }else{ + print 'F'; + var_dump($message); + } - echo "Peek message..\n"; - $res = $ironmq->peekMessage("test_queue"); - print_r($res); - echo "Delete message..\n"; - $message = $ironmq->deleteMessage("test_queue", $message->id); - print_r($message); + $res = $ironmq->getMessage($queue_name); + if ($res === null){ + print "."; + }else{ + print 'F'; + var_dump($res); + } - $message = $ironmq->getMessage("test_queue"); - print_r($message); + echo "\n"; + $ironmq->postMessage($queue_name, $msg); + $ironmq->postMessage($queue_name, $msg); - echo "\n------$i-------\n"; }