]> gitweb.fluxo.info Git - lorea/elgg.git/commitdiff
Fixes #4861: allow lazy-loading for static method callbacks, allow more callables
authorSteve Clay <steve@mrclay.org>
Mon, 17 Sep 2012 21:41:15 +0000 (17:41 -0400)
committerSteve Clay <steve@mrclay.org>
Thu, 15 Nov 2012 02:09:42 +0000 (21:09 -0500)
engine/classes/ElggPAM.php
engine/lib/elgglib.php
engine/lib/entities.php
engine/lib/extender.php
engine/lib/notification.php
engine/lib/pagehandler.php
engine/lib/pam.php
engine/lib/relationships.php
engine/lib/views.php
engine/lib/web_services.php

index 0681a909be94782c66b64f2a7b0191b301281454..f07095fc131277bc26ba59d6a7e312f79448ddb4 100644 (file)
@@ -53,11 +53,17 @@ class ElggPAM {
 
                foreach ($_PAM_HANDLERS[$this->policy] as $k => $v) {
                        $handler = $v->handler;
+                       if (!is_callable($handler)) {
+                               continue;
+                       }
+                       /* @var callable $handler */
+
                        $importance = $v->importance;
 
                        try {
                                // Execute the handler
-                               $result = $handler($credentials);
+                               // @todo don't assume $handler is a global function
+                               $result = call_user_func($handler, $credentials);
                                if ($result) {
                                        $authenticated = true;
                                } elseif ($result === false) {
index 26c1cccfd9c997bd08bfa91153ae88ef2b725c3b..85610f0c2dca2198a11bb52b948757c3d9005686 100644 (file)
@@ -684,7 +684,7 @@ function elgg_register_event_handler($event, $object_type, $callback, $priority
                $CONFIG->events[$event][$object_type] = array();
        }
 
-       if (!is_callable($callback)) {
+       if (!is_callable($callback, true)) {
                return FALSE;
        }
 
@@ -770,7 +770,7 @@ function elgg_trigger_event($event, $object_type, $object = null) {
        foreach ($events as $callback_list) {
                if (is_array($callback_list)) {
                        foreach ($callback_list as $callback) {
-                               if (call_user_func_array($callback, $args) === FALSE) {
+                               if (is_callable($callback) && (call_user_func_array($callback, $args) === FALSE)) {
                                        return FALSE;
                                }
                        }
@@ -863,7 +863,7 @@ function elgg_register_plugin_hook_handler($hook, $type, $callback, $priority =
                $CONFIG->hooks[$hook][$type] = array();
        }
 
-       if (!is_callable($callback)) {
+       if (!is_callable($callback, true)) {
                return FALSE;
        }
 
@@ -970,10 +970,12 @@ function elgg_trigger_plugin_hook($hook, $type, $params = null, $returnvalue = n
        foreach ($hooks as $callback_list) {
                if (is_array($callback_list)) {
                        foreach ($callback_list as $hookcallback) {
-                               $args = array($hook, $type, $returnvalue, $params);
-                               $temp_return_value = call_user_func_array($hookcallback, $args);
-                               if (!is_null($temp_return_value)) {
-                                       $returnvalue = $temp_return_value;
+                               if (is_callable($hookcallback)) {
+                                       $args = array($hook, $type, $returnvalue, $params);
+                                       $temp_return_value = call_user_func_array($hookcallback, $args);
+                                       if (!is_null($temp_return_value)) {
+                                               $returnvalue = $temp_return_value;
+                                       }
                                }
                        }
                }
index a50567d9f96dd98869454b479ac67873bd86fb12..5a5906b1f32548a2de0ced5bb0b5ee00fea45837 100644 (file)
@@ -2011,7 +2011,7 @@ function get_entity_url($entity_guid) {
 function elgg_register_entity_url_handler($entity_type, $entity_subtype, $function_name) {
        global $CONFIG;
 
-       if (!is_callable($function_name)) {
+       if (!is_callable($function_name, true)) {
                return false;
        }
 
index 43421342c454214b566f24dd49cdaa7ef800e7e3..636b711ea165c564f47f440ac44d00eae675a3ce 100644 (file)
@@ -136,7 +136,7 @@ function can_edit_extender($extender_id, $type, $user_guid = 0) {
 
        $functionname = "elgg_get_{$type}_from_id";
        if (is_callable($functionname)) {
-               $extender = $functionname($extender_id);
+               $extender = call_user_func($functionname, $extender_id);
        } else {
                return false;
        }
@@ -175,7 +175,7 @@ function elgg_register_extender_url_handler($extender_type, $extender_name, $fun
 
        global $CONFIG;
 
-       if (!is_callable($function_name)) {
+       if (!is_callable($function_name, true)) {
                return false;
        }
 
@@ -228,7 +228,7 @@ function get_extender_url(ElggExtender $extender) {
        if ($url == "") {
                $nameid = $extender->id;
                if ($type == 'volatile') {
-                       $nameid == $extender->name;
+                       $nameid = $extender->name;
                }
                $url = "export/$view/$guid/$type/$nameid/";
        }
index 18faff27ff2b74c43f77cfdba15f9573b1fcf75b..9e3c075a81e950eafc2a094a7f45fce53c78ee6e 100644 (file)
@@ -38,7 +38,7 @@ $NOTIFICATION_HANDLERS = array();
 function register_notification_handler($method, $handler, $params = NULL) {
        global $NOTIFICATION_HANDLERS;
 
-       if (is_callable($handler)) {
+       if (is_callable($handler, true)) {
                $NOTIFICATION_HANDLERS[$method] = new stdClass;
 
                $NOTIFICATION_HANDLERS[$method]->handler = $handler;
@@ -131,8 +131,9 @@ function notify_user($to, $from, $subject, $message, array $params = NULL, $meth
                                        // Extract method details from list
                                        $details = $NOTIFICATION_HANDLERS[$method];
                                        $handler = $details->handler;
+                                       /* @var callable $handler */
 
-                                       if ((!$NOTIFICATION_HANDLERS[$method]) || (!$handler)) {
+                                       if ((!$NOTIFICATION_HANDLERS[$method]) || (!$handler) || (!is_callable($handler))) {
                                                error_log(elgg_echo('NotificationException:NoHandlerFound', array($method)));
                                        }
 
@@ -140,7 +141,7 @@ function notify_user($to, $from, $subject, $message, array $params = NULL, $meth
 
                                        // Trigger handler and retrieve result.
                                        try {
-                                               $result[$guid][$method] = $handler(
+                                               $result[$guid][$method] = call_user_func($handler,
                                                        $from ? get_entity($from) : NULL,       // From entity
                                                        get_entity($guid),                                      // To entity
                                                        $subject,                                                       // The subject
index ba7518a7704535786f2dd8032a9541c6d59d2cae..a53506812f6587a8d57ad0170c33ae9422ff2daa 100644 (file)
@@ -45,7 +45,10 @@ function page_handler($handler, $page) {
        $page = $request['segments'];
 
        $result = false;
-       if (isset($CONFIG->pagehandler) && !empty($handler) && isset($CONFIG->pagehandler[$handler])) {
+       if (isset($CONFIG->pagehandler)
+                       && !empty($handler)
+                       && isset($CONFIG->pagehandler[$handler])
+                       && is_callable($CONFIG->pagehandler[$handler])) {
                $function = $CONFIG->pagehandler[$handler];
                $result = call_user_func($function, $page, $handler);
        }
@@ -76,14 +79,14 @@ function page_handler($handler, $page) {
  * @param string $handler  The page type to handle
  * @param string $function Your function name
  *
- * @return true|false Depending on success
+ * @return bool Depending on success
  */
 function elgg_register_page_handler($handler, $function) {
        global $CONFIG;
        if (!isset($CONFIG->pagehandler)) {
                $CONFIG->pagehandler = array();
        }
-       if (is_callable($function)) {
+       if (is_callable($function, true)) {
                $CONFIG->pagehandler[$handler] = $function;
                return true;
        }
index 4f9f4427832bf6a441e8b2abf7ae9866a97d1968..1c9c3bfe11666919ff7e5ea11f15f012248999a6 100644 (file)
@@ -30,7 +30,9 @@ $_PAM_HANDLERS = array();
  * failure, return false or throw an exception. Returning nothing indicates that
  * the handler wants to be skipped.
  *
- * @param string $handler    The handler function in the format
+ * Note, $handler must be string callback (not an array/Closure).
+ *
+ * @param string $handler    Callable global handler function in the format ()
  *                                  pam_handler($credentials = NULL);
  * @param string $importance The importance - "sufficient" (default) or "required"
  * @param string $policy     The policy type, default is "user"
@@ -45,7 +47,8 @@ function register_pam_handler($handler, $importance = "sufficient", $policy = "u
                $_PAM_HANDLERS[$policy] = array();
        }
 
-       if (is_callable($handler)) {
+       // @todo remove requirement that $handle be a global function
+       if (is_string($handler) && is_callable($handler, true)) {
                $_PAM_HANDLERS[$policy][$handler] = new stdClass;
 
                $_PAM_HANDLERS[$policy][$handler]->handler = $handler;
index 09d541e22309db1912ff01e2e4807b78c60efe6e..01654b1ce41717c9970f23720f568bac5bcc015b 100644 (file)
@@ -416,7 +416,7 @@ function elgg_list_entities_from_relationship_count($options) {
 function elgg_register_relationship_url_handler($relationship_type, $function_name) {
        global $CONFIG;
 
-       if (!is_callable($function_name)) {
+       if (!is_callable($function_name, true)) {
                return false;
        }
 
index 6135026a74280b31bf780dd8349e320244e1fe72..e43c29cb2e7b9021b2e98e0f2945a01967d845be 100644 (file)
@@ -1403,7 +1403,7 @@ function elgg_view_access_collections($owner_guid) {
  */
 function set_template_handler($function_name) {
        global $CONFIG;
-       if (!empty($function_name) && is_callable($function_name)) {
+       if (is_callable($function_name)) {
                $CONFIG->template_handler = $function_name;
                return true;
        }
index da3ed76a9cbfc82720058bb7468a124a2780270a..39fb0dc4451ab49df2728700e37261230311a76f 100644 (file)
@@ -232,6 +232,7 @@ function execute_method($method) {
        $function = $API_METHODS[$method]["function"];
        $serialised_parameters = trim($serialised_parameters, ", ");
 
+       // @todo document why we cannot use call_user_func_array here
        $result = eval("return $function($serialised_parameters);");
 
        // Sanity check result
@@ -1278,11 +1279,9 @@ function service_handler($handler, $request) {
                // no handlers set or bad url
                header("HTTP/1.0 404 Not Found");
                exit;
-       } else if (isset($CONFIG->servicehandler[$handler])
-       && is_callable($CONFIG->servicehandler[$handler])) {
-
+       } else if (isset($CONFIG->servicehandler[$handler]) && is_callable($CONFIG->servicehandler[$handler])) {
                $function = $CONFIG->servicehandler[$handler];
-               $function($request, $handler);
+               call_user_func($function, $request, $handler);
        } else {
                // no handler for this web service
                header("HTTP/1.0 404 Not Found");
@@ -1304,7 +1303,7 @@ function register_service_handler($handler, $function) {
        if (!isset($CONFIG->servicehandler)) {
                $CONFIG->servicehandler = array();
        }
-       if (is_callable($function)) {
+       if (is_callable($function, true)) {
                $CONFIG->servicehandler[$handler] = $function;
                return true;
        }