diff options
Diffstat (limited to 'engine/lib')
-rw-r--r-- | engine/lib/elgglib.php | 679 |
1 files changed, 338 insertions, 341 deletions
diff --git a/engine/lib/elgglib.php b/engine/lib/elgglib.php index ff7886561..1b078fde7 100644 --- a/engine/lib/elgglib.php +++ b/engine/lib/elgglib.php @@ -100,47 +100,6 @@ function forward($location = "") { } /** - * Returns the current page's complete URL. - * - * The current URL is assembled using the network's wwwroot and the request URI - * in $_SERVER as populated by the web server. This function will include - * any schemes, usernames and passwords, and ports. - * - * @return string The current page URL. - */ -function current_page_url() { - global $CONFIG; - - $url = parse_url($CONFIG->wwwroot); - - $page = $url['scheme'] . "://"; - - // user/pass - if ((isset($url['user'])) && ($url['user'])) { - $page .= $url['user']; - } - if ((isset($url['pass'])) && ($url['pass'])) { - $page .= ":" . $url['pass']; - } - if ((isset($url['user']) && $url['user']) || - (isset($url['pass']) && $url['pass'])) { - $page .= "@"; - } - - $page .= $url['host']; - - if ((isset($url['port'])) && ($url['port'])) { - $page .= ":" . $url['port']; - } - - $page = trim($page, "/"); - - $page .= $_SERVER['REQUEST_URI']; - - return $page; -} - -/** * Returns the HTML for "likes" and "like this" on entities. * * @param ElggEntity $entity The entity to like @@ -1301,100 +1260,44 @@ function callpath_gatekeeper($path, $include_subdirs = true, $strict_mode = fals } /** - * Return the state of a php.ini setting. - * - * Normalizes the setting to bool. + * Returns the current page's complete URL. * - * @param string $ini_get_arg The INI setting + * The current URL is assembled using the network's wwwroot and the request URI + * in $_SERVER as populated by the web server. This function will include + * any schemes, usernames and passwords, and ports. * - * @return true|false Depending on whether it's on or off + * @return string The current page URL. */ -function ini_get_bool($ini_get_arg) { - $temp = ini_get($ini_get_arg); +function current_page_url() { + global $CONFIG; - if ($temp == '1' or strtolower($temp) == 'on') { - return true; - } - return false; -} + $url = parse_url($CONFIG->wwwroot); -/** - * Returns a PHP INI setting in bytes. - * - * @tip Use this for arithmetic when determining if a file can be uploaded. - * - * @param str $setting The php.ini setting - * - * @return int - * @since 1.7.0 - * @link http://www.php.net/manual/en/function.ini-get.php - */ -function elgg_get_ini_setting_in_bytes($setting) { - // retrieve INI setting - $val = ini_get($setting); + $page = $url['scheme'] . "://"; - // convert INI setting when shorthand notation is used - $last = strtolower($val[strlen($val) - 1]); - switch($last) { - case 'g': - $val *= 1024; - case 'm': - $val *= 1024; - case 'k': - $val *= 1024; + // user/pass + if ((isset($url['user'])) && ($url['user'])) { + $page .= $url['user']; } - - // return byte value - return $val; -} - -/** - * Returns true is string is not empty, false, or null. - * - * Function to be used in array_filter which returns true if $string is not null. - * - * @param string $string The string to test - * - * @return bool - * @todo This is used once in metadata.php. Use a lambda function instead. - */ -function is_not_null($string) { - if (($string === '') || ($string === false) || ($string === null)) { - return false; + if ((isset($url['pass'])) && ($url['pass'])) { + $page .= ":" . $url['pass']; + } + if ((isset($url['user']) && $url['user']) || + (isset($url['pass']) && $url['pass'])) { + $page .= "@"; } - return true; -} - + $page .= $url['host']; -/** - * Normalise the singular keys in an options array to plural keys. - * - * Used in elgg_get_entities*() functions to support shortcutting plural - * names by singular names. - * - * @param array $options The options array. $options['keys'] = 'values'; - * @param array $singulars A list of sinular words to pluralize by adding 's'. - * - * @return array - * @since 1.7.0 - */ -function elgg_normalise_plural_options_array($options, $singulars) { - foreach ($singulars as $singular) { - $plural = $singular . 's'; + if ((isset($url['port'])) && ($url['port'])) { + $page .= ":" . $url['port']; + } - if (array_key_exists($singular, $options)) { - if ($options[$singular] === ELGG_ENTITIES_ANY_VALUE) { - $options[$plural] = $options[$singular]; - } else { - $options[$plural] = array($options[$singular]); - } - } + $page = trim($page, "/"); - unset($options[$singular]); - } + $page .= $_SERVER['REQUEST_URI']; - return $options; + return $page; } /** @@ -1421,30 +1324,6 @@ function full_url() { } /** - * Does nothing. - * - * @deprecated 1.7 - * @return 0 - */ -function test_ip() { - elgg_deprecated_notice('test_ip() was removed because of licensing issues.', 1.7); - - return 0; -} - -/** - * Does nothing. - * - * @return bool - * @deprecated 1.7 - */ -function is_ip_in_array() { - elgg_deprecated_notice('is_ip_in_array() was removed because of licensing issues.', 1.7); - - return false; -} - -/** * Builds a URL from the a parts array like one returned by {@link parse_url()}. * * @note If only partial information is passed, a partial URL will be returned. @@ -1529,7 +1408,6 @@ function elgg_validate_action_url($url) { return elgg_add_action_tokens_to_url($url); } - /** * Removes an element from a URL's query string. * @@ -1589,6 +1467,104 @@ function elgg_http_add_url_query_elements($url, array $elements) { } /** + * Test if two URLs are functionally identical. + * + * @tip If $ignore_params is used, neither the name nor its value will be considered when comparing. + * + * @tip The order of GET params doesn't matter. + * + * @param string $url1 First URL + * @param string $url2 Second URL + * @param array $ignore_params GET params to ignore in the comparison + * + * @return BOOL + * @since 1.8 + */ +function elgg_http_url_is_identical($url1, $url2, $ignore_params = array('offset', 'limit')) { + global $CONFIG; + + // if the server portion is missing but it starts with / then add the url in. + if (elgg_substr($url1, 0, 1) == '/') { + $url1 = $CONFIG->url . ltrim($url1, '/'); + } + + if (elgg_substr($url1, 0, 1) == '/') { + $url2 = $CONFIG->url . ltrim($url2, '/'); + } + + // @todo - should probably do something with relative URLs + + if ($url1 == $url2) { + return TRUE; + } + + $url1_info = parse_url($url1); + $url2_info = parse_url($url2); + + $url1_info['path'] = trim($url1_info['path'], '/'); + $url2_info['path'] = trim($url2_info['path'], '/'); + + // compare basic bits + $parts = array('scheme', 'host', 'path'); + + foreach ($parts as $part) { + if ((isset($url1_info[$part]) && isset($url2_info[$part])) + && $url1_info[$part] != $url2_info[$part]) { + return FALSE; + } elseif (isset($url1_info[$part]) && !isset($url2_info[$part])) { + return FALSE; + } elseif (!isset($url1_info[$part]) && isset($url2_info[$part])) { + return FALSE; + } + } + + // quick compare of get params + if (isset($url1_info['query']) && isset($url2_info['query']) + && $url1_info['query'] == $url2_info['query']) { + return TRUE; + } + + // compare get params that might be out of order + $url1_params = array(); + $url2_params = array(); + + if (isset($url1_info['query'])) { + if ($url1_info['query'] = html_entity_decode($url1_info['query'])) { + $url1_params = elgg_parse_str($url1_info['query']); + } + } + + if (isset($url2_info['query'])) { + if ($url2_info['query'] = html_entity_decode($url2_info['query'])) { + $url2_params = elgg_parse_str($url2_info['query']); + } + } + + // drop ignored params + foreach ($ignore_params as $param) { + if (isset($url1_params[$param])) { + unset($url1_params[$param]); + } + if (isset($url2_params[$param])) { + unset($url2_params[$param]); + } + } + + // array_diff_assoc only returns the items in arr1 that aren't in arrN + // but not the items that ARE in arrN but NOT in arr1 + // if arr1 is an empty array, this function will return 0 no matter what. + // since we only care if they're different and not how different, + // add the results together to get a non-zero (ie, different) result + $diff_count = count(array_diff_assoc($url1_params, $url2_params)); + $diff_count += count(array_diff_assoc($url2_params, $url1_params)); + if ($diff_count > 0) { + return FALSE; + } + + return TRUE; +} + +/** * Load all the REQUEST variables into the sticky form cache * * Call this from an action when you want all your submitted variables @@ -1715,218 +1691,241 @@ function elgg_set_active_sticky_form($form_name) { } /** - * Serve javascript pages. + * Checks for $array[$key] and returns its value if it exists, else + * returns $default. * - * Searches for views under js/ and outputs them with special - * headers for caching control. + * Shorthand for $value = (isset($array['key'])) ? $array['key'] : 'default'; * - * @param array $page The page array + * @param string $key The key to check. + * @param array $array The array to check against. + * @param mixed $default Default value to return if nothing is found. * * @return void - * @elgg_pagehandler js + * @since 1.8 */ -function js_page_handler($page) { - if (is_array($page) && sizeof($page)) { - $js = str_replace('.js', '', $page[0]); - $return = elgg_view('js/' . $js); - - header('Content-type: text/javascript'); - header('Expires: ' . date('r', time() + 864000)); - header("Pragma: public"); - header("Cache-Control: public"); - header("Content-Length: " . strlen($return)); - - echo $return; - exit; - } +function elgg_get_array_value($key, array $array, $default = NULL) { + return (isset($array[$key])) ? $array[$key] : $default; } /** - * Emits a shutdown:system event upon PHP shutdown, but before database connections are dropped. + * Sorts a 3d array by specific element. * - * @tip Register for the shutdown:system event to perform functions at the end of page loads. + * @warning Will re-index numeric indexes. * - * @warning Using this event to perform long-running functions is not very - * useful. Servers will hold pages until processing is done before sending - * them out to the browser. + * @note This operates the same as the built-in sort functions. + * It sorts the array and returns a bool for success. * - * @return void - * @see register_shutdown_hook() + * Do this: elgg_sort_3d_array_by_value($my_array); + * Not this: $my_array = elgg_sort_3d_array_by_value($my_array); + * + * @param array &$array Array to sort + * @param string $element Element to sort by + * @param int $sort_order PHP sort order + * {@see http://us2.php.net/array_multisort} + * @param int $sort_type PHP sort type + * {@see http://us2.php.net/sort} + * + * @return bool */ -function _elgg_shutdown_hook() { - global $START_MICROTIME; +function elgg_sort_3d_array_by_value(&$array, $element, $sort_order = SORT_ASC, +$sort_type = SORT_LOCALE_STRING) { - trigger_elgg_event('shutdown', 'system'); + $sort = array(); - $time = (float)(microtime(TRUE) - $START_MICROTIME); - // demoted to NOTICE from DEBUG so javascript is not corrupted - elgg_log("Page {$_SERVER['REQUEST_URI']} generated in $time seconds", 'NOTICE'); + foreach ($array as $k => $v) { + if (isset($v[$element])) { + $sort[] = strtolower($v[$element]); + } else { + $sort[] = NULL; + } + }; + + return array_multisort($sort, $sort_order, $sort_type, $array); } /** - * Elgg's main init. + * Return the state of a php.ini setting. * - * Handles core actions for comments and likes, the JS pagehandler, and the shutdown function. + * Normalizes the setting to bool. * - * @elgg_event_handler init system - * @return void + * @param string $ini_get_arg The INI setting + * + * @return true|false Depending on whether it's on or off */ -function elgg_init() { - global $CONFIG; - - register_action('comments/add'); - register_action('comments/delete'); - register_action('likes/add'); - register_action('likes/delete'); - - register_page_handler('js', 'js_page_handler'); - - // Trigger the shutdown:system event upon PHP shutdown. - register_shutdown_function('_elgg_shutdown_hook'); +function ini_get_bool($ini_get_arg) { + $temp = ini_get($ini_get_arg); - // Sets a blacklist of words in the current language. - // This is a comma separated list in word:blacklist. - // @todo possibly deprecate - $CONFIG->wordblacklist = array(); - $list = explode(',', elgg_echo('word:blacklist')); - if ($list) { - foreach ($list as $l) { - $CONFIG->wordblacklist[] = trim($l); - } + if ($temp == '1' or strtolower($temp) == 'on') { + return true; } + return false; } /** - * Intercepts the index page when Walled Garden mode is enabled. + * Returns a PHP INI setting in bytes. * - * @link http://docs.elgg.org/Tutorials/WalledGarden - * @elgg_plugin_hook index system - * @return void + * @tip Use this for arithmetic when determining if a file can be uploaded. + * + * @param str $setting The php.ini setting + * + * @return int + * @since 1.7.0 + * @link http://www.php.net/manual/en/function.ini-get.php */ -function elgg_walled_garden_index() { - $login = elgg_view('account/forms/login_walled_garden'); +function elgg_get_ini_setting_in_bytes($setting) { + // retrieve INI setting + $val = ini_get($setting); - page_draw('', $login, 'page_shells/walled_garden'); + // convert INI setting when shorthand notation is used + $last = strtolower($val[strlen($val) - 1]); + switch($last) { + case 'g': + $val *= 1024; + case 'm': + $val *= 1024; + case 'k': + $val *= 1024; + } - // @hack Index must exit to keep plugins from continuing to extend - exit; + // return byte value + return $val; } /** - * Adds unit tests for the general API. + * Returns true is string is not empty, false, or null. * - * @param string $hook unit_test - * @param string $type system - * @param array $value array of test files - * @param array $params empty + * Function to be used in array_filter which returns true if $string is not null. * - * @elgg_plugin_hook unit_tests system - * @return void + * @param string $string The string to test + * + * @return bool + * @todo This is used once in metadata.php. Use a lambda function instead. */ -function elgg_api_test($hook, $type, $value, $params) { - global $CONFIG; - $value[] = $CONFIG->path . 'engine/tests/api/entity_getter_functions.php'; - $value[] = $CONFIG->path . 'engine/tests/api/helpers.php'; - $value[] = $CONFIG->path . 'engine/tests/regression/trac_bugs.php'; - return $value; +function is_not_null($string) { + if (($string === '') || ($string === false) || ($string === null)) { + return false; + } + + return true; } /** - * Test if two URLs are functionally identical. - * - * @tip If $ignore_params is used, neither the name nor its value will be considered when comparing. + * Normalise the singular keys in an options array to plural keys. * - * @tip The order of GET params doesn't matter. + * Used in elgg_get_entities*() functions to support shortcutting plural + * names by singular names. * - * @param string $url1 First URL - * @param string $url2 Second URL - * @param array $ignore_params GET params to ignore in the comparison + * @param array $options The options array. $options['keys'] = 'values'; + * @param array $singulars A list of sinular words to pluralize by adding 's'. * - * @return BOOL - * @since 1.8 + * @return array + * @since 1.7.0 */ -function elgg_http_url_is_identical($url1, $url2, $ignore_params = array('offset', 'limit')) { - global $CONFIG; +function elgg_normalise_plural_options_array($options, $singulars) { + foreach ($singulars as $singular) { + $plural = $singular . 's'; - // if the server portion is missing but it starts with / then add the url in. - if (elgg_substr($url1, 0, 1) == '/') { - $url1 = $CONFIG->url . ltrim($url1, '/'); - } + if (array_key_exists($singular, $options)) { + if ($options[$singular] === ELGG_ENTITIES_ANY_VALUE) { + $options[$plural] = $options[$singular]; + } else { + $options[$plural] = array($options[$singular]); + } + } - if (elgg_substr($url1, 0, 1) == '/') { - $url2 = $CONFIG->url . ltrim($url2, '/'); + unset($options[$singular]); } - // @todo - should probably do something with relative URLs + return $options; +} - if ($url1 == $url2) { - return TRUE; - } +/** + * Does nothing. + * + * @deprecated 1.7 + * @return 0 + */ +function test_ip() { + elgg_deprecated_notice('test_ip() was removed because of licensing issues.', 1.7); - $url1_info = parse_url($url1); - $url2_info = parse_url($url2); + return 0; +} - $url1_info['path'] = trim($url1_info['path'], '/'); - $url2_info['path'] = trim($url2_info['path'], '/'); +/** + * Does nothing. + * + * @return bool + * @deprecated 1.7 + */ +function is_ip_in_array() { + elgg_deprecated_notice('is_ip_in_array() was removed because of licensing issues.', 1.7); - // compare basic bits - $parts = array('scheme', 'host', 'path'); + return false; +} - foreach ($parts as $part) { - if ((isset($url1_info[$part]) && isset($url2_info[$part])) - && $url1_info[$part] != $url2_info[$part]) { - return FALSE; - } elseif (isset($url1_info[$part]) && !isset($url2_info[$part])) { - return FALSE; - } elseif (!isset($url1_info[$part]) && isset($url2_info[$part])) { - return FALSE; - } - } +/** + * Emits a shutdown:system event upon PHP shutdown, but before database connections are dropped. + * + * @tip Register for the shutdown:system event to perform functions at the end of page loads. + * + * @warning Using this event to perform long-running functions is not very + * useful. Servers will hold pages until processing is done before sending + * them out to the browser. + * + * @return void + * @see register_shutdown_hook() + */ +function _elgg_shutdown_hook() { + global $START_MICROTIME; - // quick compare of get params - if (isset($url1_info['query']) && isset($url2_info['query']) - && $url1_info['query'] == $url2_info['query']) { - return TRUE; - } + trigger_elgg_event('shutdown', 'system'); - // compare get params that might be out of order - $url1_params = array(); - $url2_params = array(); + $time = (float)(microtime(TRUE) - $START_MICROTIME); + // demoted to NOTICE from DEBUG so javascript is not corrupted + elgg_log("Page {$_SERVER['REQUEST_URI']} generated in $time seconds", 'NOTICE'); +} - if (isset($url1_info['query'])) { - if ($url1_info['query'] = html_entity_decode($url1_info['query'])) { - $url1_params = elgg_parse_str($url1_info['query']); - } - } +/** + * Serve javascript pages. + * + * Searches for views under js/ and outputs them with special + * headers for caching control. + * + * @param array $page The page array + * + * @return void + * @elgg_pagehandler js + */ +function js_page_handler($page) { + if (is_array($page) && sizeof($page)) { + $js = str_replace('.js', '', $page[0]); + $return = elgg_view('js/' . $js); - if (isset($url2_info['query'])) { - if ($url2_info['query'] = html_entity_decode($url2_info['query'])) { - $url2_params = elgg_parse_str($url2_info['query']); - } - } + header('Content-type: text/javascript'); + header('Expires: ' . date('r', time() + 864000)); + header("Pragma: public"); + header("Cache-Control: public"); + header("Content-Length: " . strlen($return)); - // drop ignored params - foreach ($ignore_params as $param) { - if (isset($url1_params[$param])) { - unset($url1_params[$param]); - } - if (isset($url2_params[$param])) { - unset($url2_params[$param]); - } + echo $return; + exit; } +} - // array_diff_assoc only returns the items in arr1 that aren't in arrN - // but not the items that ARE in arrN but NOT in arr1 - // if arr1 is an empty array, this function will return 0 no matter what. - // since we only care if they're different and not how different, - // add the results together to get a non-zero (ie, different) result - $diff_count = count(array_diff_assoc($url1_params, $url2_params)); - $diff_count += count(array_diff_assoc($url2_params, $url1_params)); - if ($diff_count > 0) { - return FALSE; - } +/** + * Intercepts the index page when Walled Garden mode is enabled. + * + * @link http://docs.elgg.org/Tutorials/WalledGarden + * @elgg_plugin_hook index system + * @return void + */ +function elgg_walled_garden_index() { + $login = elgg_view('account/forms/login_walled_garden'); - return TRUE; + page_draw('', $login, 'page_shells/walled_garden'); + + // @hack Index must exit to keep plugins from continuing to extend + exit; } /** @@ -1952,59 +1951,57 @@ function elgg_walled_garden() { } /** - * Checks for $array[$key] and returns its value if it exists, else - * returns $default. - * - * Shorthand for $value = (isset($array['key'])) ? $array['key'] : 'default'; + * Elgg's main init. * - * @param string $key The key to check. - * @param array $array The array to check against. - * @param mixed $default Default value to return if nothing is found. + * Handles core actions for comments and likes, the JS pagehandler, and the shutdown function. * + * @elgg_event_handler init system * @return void - * @since 1.8 */ -function elgg_get_array_value($key, array $array, $default = NULL) { - return (isset($array[$key])) ? $array[$key] : $default; +function elgg_init() { + global $CONFIG; + + register_action('comments/add'); + register_action('comments/delete'); + register_action('likes/add'); + register_action('likes/delete'); + + register_page_handler('js', 'js_page_handler'); + + // Trigger the shutdown:system event upon PHP shutdown. + register_shutdown_function('_elgg_shutdown_hook'); + + // Sets a blacklist of words in the current language. + // This is a comma separated list in word:blacklist. + // @todo possibly deprecate + $CONFIG->wordblacklist = array(); + $list = explode(',', elgg_echo('word:blacklist')); + if ($list) { + foreach ($list as $l) { + $CONFIG->wordblacklist[] = trim($l); + } + } } /** - * Sorts a 3d array by specific element. - * - * @warning Will re-index numeric indexes. - * - * @note This operates the same as the built-in sort functions. - * It sorts the array and returns a bool for success. - * - * Do this: elgg_sort_3d_array_by_value($my_array); - * Not this: $my_array = elgg_sort_3d_array_by_value($my_array); + * Adds unit tests for the general API. * - * @param array &$array Array to sort - * @param string $element Element to sort by - * @param int $sort_order PHP sort order - * {@see http://us2.php.net/array_multisort} - * @param int $sort_type PHP sort type - * {@see http://us2.php.net/sort} + * @param string $hook unit_test + * @param string $type system + * @param array $value array of test files + * @param array $params empty * - * @return bool + * @elgg_plugin_hook unit_tests system + * @return void */ -function elgg_sort_3d_array_by_value(&$array, $element, $sort_order = SORT_ASC, -$sort_type = SORT_LOCALE_STRING) { - - $sort = array(); - - foreach ($array as $k => $v) { - if (isset($v[$element])) { - $sort[] = strtolower($v[$element]); - } else { - $sort[] = NULL; - } - }; - - return array_multisort($sort, $sort_order, $sort_type, $array); +function elgg_api_test($hook, $type, $value, $params) { + global $CONFIG; + $value[] = $CONFIG->path . 'engine/tests/api/entity_getter_functions.php'; + $value[] = $CONFIG->path . 'engine/tests/api/helpers.php'; + $value[] = $CONFIG->path . 'engine/tests/regression/trac_bugs.php'; + return $value; } - /**#@+ * Controlls access levels on ElggEntity entities, metadata, and annotations. * |