From 8eff57a870d677cb9bcce76df8a75eccd3987023 Mon Sep 17 00:00:00 2001
From: Gergely Lekli <gl90010@930940.no-reply.drupal.org>
Date: Sat, 28 Nov 2015 20:39:40 -0800
Subject: [PATCH] Issue #2625084: Issues with message handler.

---
 nodejs.routing.yml             |  2 +-
 src/Controller/NodejsPages.php | 57 ++++++++++++++++++++++++++++++++++++++++++
 src/Form/NodejsConfigForm.php  |  8 ++++++
 src/NodejsPages.php            | 56 -----------------------------------------
 4 files changed, 66 insertions(+), 57 deletions(-)
 create mode 100644 src/Controller/NodejsPages.php
 delete mode 100644 src/NodejsPages.php

diff --git a/nodejs.routing.yml b/nodejs.routing.yml
index d8a33a0..62a6bdb 100644
--- a/nodejs.routing.yml
+++ b/nodejs.routing.yml
@@ -9,7 +9,7 @@ nodejs.message:
   path: '/nodejs/message'
   defaults:
     _title: 'Message from Node.js server'
-    _content: '\Drupal\nodejs\NodejsPages::messageHandler'
+    _controller: '\Drupal\nodejs\Controller\NodejsPages::messageHandler'
   requirements:
     _access: 'TRUE'
 
diff --git a/src/Controller/NodejsPages.php b/src/Controller/NodejsPages.php
new file mode 100644
index 0000000..3a89e97
--- /dev/null
+++ b/src/Controller/NodejsPages.php
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\nodejs\Controller\SystemController.
+ */
+
+namespace Drupal\nodejs\Controller;
+
+use Symfony\Component\HttpFoundation\JsonResponse;
+use Drupal\Component\Serialization\Json;
+
+/**
+ * Returns responses for Node.js routes.
+ */
+class NodejsPages {
+
+
+  /**
+   * @todo .
+   */
+  public function messageHandler() {
+    if (!isset($_POST['serviceKey']) || !nodejs_is_valid_service_key($_POST['serviceKey'])) {
+      return new JsonResponse(array('error' => 'Invalid service key.'));
+    }
+
+    if (!isset($_POST['messageJson'])) {
+      return new JsonResponse(array('error' => 'No message.'));
+    }
+
+    $message = Json::decode($_POST['messageJson']);
+    $response = array();
+    switch ($message['messageType']) {
+      case 'authenticate':
+        $response = nodejs_auth_check($message);
+        break;
+
+      case 'userOffline':
+        nodejs_user_set_offline($message['uid']);
+        break;
+
+      default:
+        $handlers = array();
+        foreach (module_implements('nodejs_message_callback') as $module) {
+          $function = $module . '_nodejs_message_callback';
+          $handlers += $function($message['messageType']);
+        }
+        foreach ($handlers as $callback) {
+          $callback($message, $response);
+        }
+    }
+    \Drupal::moduleHandler()->alter('nodejs_message_response', $response, $message);
+
+    return new JsonResponse($response ? $response : array('error' => 'Not implemented'));
+  }
+
+}
diff --git a/src/Form/NodejsConfigForm.php b/src/Form/NodejsConfigForm.php
index 8e3f430..73bbb64 100644
--- a/src/Form/NodejsConfigForm.php
+++ b/src/Form/NodejsConfigForm.php
@@ -55,6 +55,13 @@ class NodejsConfigForm extends ConfigFormBase {
       '#required' => TRUE,
       '#description' => t('The port of the Node.js server.'),
     );
+    $form['server']['nodejs_service_key'] = array(
+      '#type' => 'textfield',
+      '#title' => $this->t('Service Key'),
+      '#required' => TRUE,
+      '#description' => $this->t('An arbitrary string used as a secret between the node.js server and the Drupal site. This setting needs to match the Node.js server configuration.'),
+      '#default_value' => $config->get('nodejs_service_key'),
+    );
     $description = t("Enter one page per line as Drupal paths. The '*' character is a wildcard.
                       Example paths are %blog for the blog page and %blog-wildcard for every personal blog.
                       %front is the front page.",
@@ -79,6 +86,7 @@ class NodejsConfigForm extends ConfigFormBase {
       ->set('nodejs_server_host', $form_state->getValue('nodejs_server_host'))
       ->set('nodejs_server_port', $form_state->getValue('nodejs_server_port'))
       ->set('nodejs_pages', $form_state->getValue('nodejs_pages'))
+      ->set('nodejs_service_key', $form_state->getValue('nodejs_service_key'))
       ->save();
 
     parent::submitForm($form, $form_state);
diff --git a/src/NodejsPages.php b/src/NodejsPages.php
deleted file mode 100644
index 309d909..0000000
--- a/src/NodejsPages.php
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\nodejs\Controller\SystemController.
- */
-
-namespace Drupal\nodejs;
-
-use Symfony\Component\HttpFoundation\JsonResponse;
-
-/**
- * Returns responses for Node.js routes.
- */
-class NodejsPages{
-
-
-  /**
-   * @todo .
-   */
-  public function messageHandler() {
-    if (!isset($_POST['serviceKey']) || !nodejs_is_valid_service_key($_POST['serviceKey'])) {
-      return new JsonResponse(array('error' => 'Invalid service key.'));
-    }
-
-    if (!isset($_POST['messageJson'])) {
-      return new JsonResponse(array('error' => 'No message.'));
-    }
-
-    $message = drupal_json_decode($_POST['messageJson']);
-    $response = array();
-    switch ($message['messageType']) {
-      case 'authenticate':
-        $response = nodejs_auth_check($message);
-        break;
-
-      case 'userOffline':
-        nodejs_user_set_offline($message['uid']);
-        break;
-
-      default:
-        $handlers = array();
-        foreach (module_implements('nodejs_message_callback') as $module) {
-          $function = $module . '_nodejs_message_callback';
-          $handlers += $function($message['messageType']);
-        }
-        foreach ($handlers as $callback) {
-          $callback($message, $response);
-        }
-    }
-    \Drupal::moduleHandler()->alter('nodejs_message_response', $response, $message);
-
-    return new JsonResponse($response ? $response : array('error' => 'Not implemented'));
-  }
-
-}
-- 
2.2.1

