Issue #2113611 by mstef: [Fatal error] hook_requirements() not returning anything 6.x-3.x 6.x-3.3
authormikestefff
Thu, 17 Oct 2013 02:02:54 +0000 (02:02 +0000)
committerChris Johnson
Thu, 17 Oct 2013 02:02:54 +0000 (02:02 +0000)
context.api.php
context.install
context_ui/context_ui.module
plugins/context_condition.inc
plugins/context_reaction_block.inc
plugins/context_reaction_menu.inc
tests/context.reactions.test

index 03f0563..04dc442 100644 (file)
@@ -104,3 +104,14 @@ function hook_context_load_alter(&$context) {
     );
   }
 }
+
+/**
+ * Allows for finer grained access mechanisms to using the json
+ * rendering capabilities of the block reaction when a user isn't
+ * granted the administer contexts or context ajax block access
+ * permission
+ * @param $block_id
+ *   ID of block in module-delta format
+ */
+function hook_context_allow_ajax_block_access($block_id) {
+}
index b1af4b1..d2e4c4c 100644 (file)
@@ -1,5 +1,20 @@
 <?php
 
+
+/**
+ * Implementation of hook_requirements().
+ */
+function context_requirements($phase) {
+  $requirements = array();
+  $t = get_t();
+  // Test PHP version
+  if (!function_exists('json_decode')) {
+    $requirements['php_context']['description'] = $t('Your PHP installation is too old. Context requires at least PHP %version or installation of the json library (%path)', array('%version' =>  '5.1.0', '%path' => 'http://pecl.php.net/package/json'));
+    $requirements['php_context']['severity'] = REQUIREMENT_ERROR;
+  }
+  return $requirements;
+}
+
 /**
  * Implementation of hook_install().
  */
index d6b0a48..aa0ff59 100644 (file)
@@ -273,3 +273,10 @@ function context_ui_settings(&$form_state) {
 function context_ui_settings_submit($form, &$form_state) {
   variable_set('menu_rebuild_needed', TRUE);
 }
+
+/**
+ * Implements hook_perm
+ */
+function context_perm() {
+  return array('context ajax block access');
+}
index f4a5e5a..95951d9 100644 (file)
@@ -89,7 +89,7 @@ class context_condition {
   /**
    * Context editor form for conditions.
    */
-  function editor_form($context) {
+  function editor_form($context = NULL) {
     $form = array();
     if (!empty($this->values)) {
       $options = $this->condition_values();
index 7aaedae..a0537ea 100644 (file)
@@ -501,50 +501,9 @@ class context_reaction_block extends context_reaction {
     if (function_exists('json_decode')) {
       return json_decode($json, $assoc);
     }
-    return context_reaction_block::_json_decode($json);
-  }
-
-  /**
-   * From http://www.php.net/manual/en/function.json-decode.php#91216
-   * with modifications for consistency with output of json_decode().
-   *
-   * Original author: walidator.info 2009.
-   */
-  static function _json_decode($json) {
-    $comment = false;
-    $out = '$x = ';
-    for ($i=0; $i < strlen($json); $i++) {
-      if (!$comment) {
-        switch ($json[$i]) {
-          case '{':
-            $out .= ' (object) array(';
-            break;
-          case '}':
-            $out .= ')';
-            break;
-          case '[':
-            $out .= ' array(';
-            break;
-          case ']':
-            $out .= ')';
-            break;
-          case ':';
-            $out .= '=>';
-            break;
-          default:
-            $out .= $json[$i];
-            break;
-        }
-      }
-      else {
-        $out .= $json[$i];
-      }
-      if ($json[$i] == '"') {
-        $comment = !$comment;
-      }
+    else {
+      watchdog('context', 'Please upgrade your PHP version to one that supports json_decode.');
     }
-    eval($out . ';');
-    return $x;
   }
 
   /**
@@ -554,8 +513,14 @@ class context_reaction_block extends context_reaction {
   function render_ajax($param) {
     // Besure the page isn't a 404 or 403.
     $headers = drupal_set_header();
-    foreach (explode("\n", $headers) as $header) {
-      if ($header == "HTTP/1.1 404 Not Found" || $header == "HTTP/1.1 403 Forbidden") {
+
+    // Support for Pressflow drupal_set_header.
+    if (!is_array($headers)) {
+      $headers = explode("\n", $headers);
+    }
+
+    foreach ($headers as $header) {
+      if (strpos($header, "404 Not Found") !== FALSE || strpos($header, "403 Forbidden") !== FALSE) {
         return;
       }
     }
@@ -566,6 +531,11 @@ class context_reaction_block extends context_reaction {
     if (strpos($param, ',') !== FALSE) {
       list($bid, $context) = explode(',', $param);
       list($module, $delta) = explode('-', $bid, 2);
+      // Check token to make sure user has access to block.
+      if (!(user_access('context ajax block access') || $this->context_block_ajax_rendering_allowed($bid))) {
+        echo drupal_to_js(array('status' => 0));
+        exit;
+      }
 
       // Ensure $bid is valid.
       $info = $this->get_blocks();
@@ -606,4 +576,18 @@ class context_reaction_block extends context_reaction {
     echo drupal_to_js(array('status' => 0));
     exit;
   }
+
+  /**
+   * Allow modules to selectively allow ajax rendering of a specific block
+   */
+  private function context_block_ajax_rendering_allowed($bid) {
+    $allowed = FALSE;
+    foreach (module_invoke_all('context_allow_ajax_block_access', $bid) as $module_allow) {
+      $allowed = $allow || $module_allow;
+      if ($allowed) {
+        break;
+      }
+    }
+    return $allowed;
+  }
 }
index a817e92..7a2336c 100644 (file)
@@ -48,7 +48,7 @@ class context_reaction_menu extends context_reaction {
    * If primary + secondary links are pointed at the same menu, provide
    * contextual trailing by default.
    */
-  function execute(&$vars) {
+  function execute(&$vars = NULL) {
     if (variable_get('menu_primary_links_source', 'primary-links') == variable_get('menu_secondary_links_source', 'secondary-links')) {
       $vars['primary_links'] = theme_get_setting('toggle_primary_links') ? $this->menu_navigation_links(variable_get('menu_primary_links_source', 'primary-links')) : $vars['primary_links'];
       $vars['secondary_links'] = theme_get_setting('toggle_secondary_links') ? $this->menu_navigation_links(variable_get('menu_secondary_links_source', 'secondary-links'), 1) : $vars['secondary_links'];
index 974a694..3803c51 100644 (file)
@@ -54,6 +54,8 @@ class ContextReactionBlockAjaxTest extends DrupalWebTestCase {
 
   function setUp() {
     parent::setUp('context', 'ctools');
+    $admin_user = $this->drupalCreateUser(array('context ajax block access'));
+    $this->drupalLogin($admin_user);
   }
 
   function test() {
@@ -66,6 +68,28 @@ class ContextReactionBlockAjaxTest extends DrupalWebTestCase {
   }
 }
 
+class ContextReactionBlockAjaxAccessTest extends DrupalWebTestCase {
+  function getInfo() {
+    return array(
+      'name' => t('Reaction: block ajax access'),
+      'description' => t('Test block reaction ajax access behavior.'),
+      'group' => t('Context'),
+    );
+  }
+
+  function setUp() {
+    parent::setUp('context', 'context_ui', 'ctools');
+  }
+
+  function test() {
+    $this->drupalGet('node', array(
+      'query' => array('context_block' => 'user-3,testcontext')
+    ));
+
+    $this->assertText('"status": 0');
+  }
+}
+
 class ContextReactionMenuTest extends DrupalWebTestCase {
   function getInfo() {
     return array(