diff options
Diffstat (limited to 'engine/lib')
| -rw-r--r-- | engine/lib/actions.php | 59 | ||||
| -rw-r--r-- | engine/lib/admin.php | 3 | ||||
| -rw-r--r-- | engine/lib/cache.php | 1 | ||||
| -rw-r--r-- | engine/lib/configuration.php | 4 | ||||
| -rw-r--r-- | engine/lib/database.php | 4 | ||||
| -rw-r--r-- | engine/lib/elgglib.php | 49 | ||||
| -rw-r--r-- | engine/lib/entities.php | 23 | ||||
| -rw-r--r-- | engine/lib/extender.php | 5 | ||||
| -rw-r--r-- | engine/lib/filestore.php | 6 | ||||
| -rw-r--r-- | engine/lib/input.php | 6 | ||||
| -rw-r--r-- | engine/lib/languages.php | 164 | ||||
| -rw-r--r-- | engine/lib/metadata.php | 13 | ||||
| -rw-r--r-- | engine/lib/navigation.php | 15 | ||||
| -rw-r--r-- | engine/lib/notification.php | 16 | ||||
| -rw-r--r-- | engine/lib/output.php | 18 | ||||
| -rw-r--r-- | engine/lib/pagehandler.php | 14 | ||||
| -rw-r--r-- | engine/lib/plugins.php | 4 | ||||
| -rw-r--r-- | engine/lib/relationships.php | 9 | ||||
| -rw-r--r-- | engine/lib/river.php | 12 | ||||
| -rw-r--r-- | engine/lib/sessions.php | 11 | ||||
| -rw-r--r-- | engine/lib/statistics.php | 4 | ||||
| -rw-r--r-- | engine/lib/system_log.php | 13 | ||||
| -rw-r--r-- | engine/lib/users.php | 9 | ||||
| -rw-r--r-- | engine/lib/views.php | 8 | 
24 files changed, 278 insertions, 192 deletions
| diff --git a/engine/lib/actions.php b/engine/lib/actions.php index c6613e6d6..53b185dea 100644 --- a/engine/lib/actions.php +++ b/engine/lib/actions.php @@ -82,44 +82,28 @@ function action($action, $forwarder = "") {  	$forwarder = str_replace(elgg_get_site_url(), "", $forwarder);  	$forwarder = str_replace("http://", "", $forwarder);  	$forwarder = str_replace("@", "", $forwarder); -  	if (substr($forwarder, 0, 1) == "/") {  		$forwarder = substr($forwarder, 1);  	} -	if (isset($CONFIG->actions[$action])) { -		if (elgg_is_admin_logged_in() || ($CONFIG->actions[$action]['access'] !== 'admin')) { -			if (elgg_is_logged_in() || ($CONFIG->actions[$action]['access'] === 'public')) { - -				// Trigger action event -				// @todo This is only called before the primary action is called. -				$event_result = true; -				$event_result = elgg_trigger_plugin_hook('action', $action, null, $event_result); - -				// Include action -				// Event_result being false doesn't produce an error -				// since i assume this will be handled in the hook itself. -				// @todo make this better! -				if ($event_result) { -					if (!include($CONFIG->actions[$action]['file'])) { -						register_error(elgg_echo('actionnotfound', array($action))); -					} -				} -			} else { -				register_error(elgg_echo('actionloggedout')); +	if (!isset($CONFIG->actions[$action])) { +		register_error(elgg_echo('actionundefined', array($action))); +	} elseif (!elgg_is_admin_logged_in() && ($CONFIG->actions[$action]['access'] === 'admin')) { +		register_error(elgg_echo('actionunauthorized')); +	} elseif (!elgg_is_logged_in() && ($CONFIG->actions[$action]['access'] !== 'public')) { +		register_error(elgg_echo('actionloggedout')); +	} else { +		// Returning falsy doesn't produce an error +		// We assume this will be handled in the hook itself. +		if (elgg_trigger_plugin_hook('action', $action, null, true)) { +			if (!include($CONFIG->actions[$action]['file'])) { +				register_error(elgg_echo('actionnotfound', array($action)));  			} -		} else { -			register_error(elgg_echo('actionunauthorized'));  		} -	} else { -		register_error(elgg_echo('actionundefined', array($action)));  	} -	if (!empty($forwarder)) { -		forward($forwarder); -	} else { -		forward(REFERER); -	} +	$forwarder = empty($forwarder) ? REFERER : $forwarder; +	forward($forwarder);  }  /** @@ -273,8 +257,19 @@ function validate_action_token($visibleerrors = TRUE, $token = NULL, $ts = NULL)  		} else if ($visibleerrors) {  			register_error(elgg_echo('actiongatekeeper:tokeninvalid'));  		} -	} else if ($visibleerrors) { -		register_error(elgg_echo('actiongatekeeper:missingfields')); +	} else { +		if (! empty($_SERVER['CONTENT_LENGTH']) && empty($_POST)) { +			// The size of $_POST or uploaded file has exceed the size limit +			$error_msg = elgg_trigger_plugin_hook('action_gatekeeper:upload_exceeded_msg', 'all', array( +				'post_size' => $_SERVER['CONTENT_LENGTH'], +				'visible_errors' => $visibleerrors, +			), elgg_echo('actiongatekeeper:uploadexceeded')); +		} else { +			$error_msg = elgg_echo('actiongatekeeper:missingfields'); +		} +		if ($visibleerrors) { +			register_error($error_msg); +		}  	}  	return FALSE; diff --git a/engine/lib/admin.php b/engine/lib/admin.php index 928101fc5..b65d98c95 100644 --- a/engine/lib/admin.php +++ b/engine/lib/admin.php @@ -244,6 +244,7 @@ function admin_init() {  	elgg_register_action('profile/fields/delete', '', 'admin');  	elgg_register_action('profile/fields/reorder', '', 'admin'); +	elgg_register_simplecache_view('css/admin');  	elgg_register_simplecache_view('js/admin');  	$url = elgg_get_simplecache_url('js', 'admin');  	elgg_register_js('elgg.admin', $url); @@ -571,7 +572,7 @@ function admin_markdown_page_handler($pages) {  	if (!$plugin) {  		$error = elgg_echo('admin:plugins:markdown:unknown_plugin');  		$body = elgg_view_layout('admin', array('content' => $error, 'title' => $error)); -		echo elgg_view_page($title, $body, 'admin'); +		echo elgg_view_page($error, $body, 'admin');  		return true;  	} diff --git a/engine/lib/cache.php b/engine/lib/cache.php index c117b9ec9..be1c43e14 100644 --- a/engine/lib/cache.php +++ b/engine/lib/cache.php @@ -442,6 +442,7 @@ function _elgg_cache_init() {  	}  	if ($CONFIG->system_cache_enabled && !$CONFIG->i18n_loaded_from_cache) { +		reload_all_translations();  		foreach ($CONFIG->translations as $lang => $map) {  			elgg_save_system_cache("$lang.php", serialize($map));  		} diff --git a/engine/lib/configuration.php b/engine/lib/configuration.php index 9bf1529d6..305aa00b6 100644 --- a/engine/lib/configuration.php +++ b/engine/lib/configuration.php @@ -476,10 +476,12 @@ function get_config($name, $site_guid = 0) {  			break;  	} +	// @todo these haven't really been implemented in Elgg 1.8. Complete in 1.9.  	// show dep message  	if ($new_name) { +	//	$msg = "Config value $name has been renamed as $new_name";  		$name = $new_name; -		elgg_deprecated_notice($msg, $dep_version); +	//	elgg_deprecated_notice($msg, $dep_version);  	}  	// decide from where to return the value diff --git a/engine/lib/database.php b/engine/lib/database.php index cc2b99f6a..7d90b30b8 100644 --- a/engine/lib/database.php +++ b/engine/lib/database.php @@ -253,6 +253,10 @@ function execute_query($query, $dblink) {  		throw new DatabaseException(elgg_echo('DatabaseException:InvalidQuery'));  	} +	if (!is_resource($dblink)) { +		throw new DatabaseException(elgg_echo('DatabaseException:InvalidDBLink')); +	} +  	$dbcalls++;  	$result = mysql_query($query, $dblink); diff --git a/engine/lib/elgglib.php b/engine/lib/elgglib.php index b55958a6c..3026a78e3 100644 --- a/engine/lib/elgglib.php +++ b/engine/lib/elgglib.php @@ -1053,6 +1053,7 @@ function _elgg_php_exception_handler($exception) {   *   * @return true   * @access private + * @todo Replace error_log calls with elgg_log calls.   */  function _elgg_php_error_handler($errno, $errmsg, $filename, $linenum, $vars) {  	$error = date("Y-m-d H:i:s (T)") . ": \"$errmsg\" in file $filename (line $linenum)"; @@ -1068,6 +1069,7 @@ function _elgg_php_error_handler($errno, $errmsg, $filename, $linenum, $vars) {  		case E_WARNING :  		case E_USER_WARNING : +		case E_RECOVERABLE_ERROR: // (e.g. type hint violation)  			error_log("PHP WARNING: $error");  			break; @@ -1092,8 +1094,8 @@ function _elgg_php_error_handler($errno, $errmsg, $filename, $linenum, $vars) {   *   * @note No messages will be displayed unless debugging has been enabled.   * - * @param str $message User message - * @param str $level   NOTICE | WARNING | ERROR | DEBUG + * @param string $message User message + * @param string $level   NOTICE | WARNING | ERROR | DEBUG   *   * @return bool   * @since 1.7.0 @@ -1263,7 +1265,7 @@ function elgg_deprecated_notice($msg, $dep_version, $backtrace_level = 1) {  	$msg .= implode("<br /> -> ", $stack); -	elgg_dump($msg, elgg_is_admin_logged_in(), 'WARNING'); +	elgg_log($msg, 'WARNING');  	return true;  } @@ -1576,7 +1578,11 @@ function elgg_http_url_is_identical($url1, $url2, $ignore_params = array('offset   * @return void   * @since 1.8.0   */ -function elgg_extract($key, array $array, $default = NULL, $strict = true) { +function elgg_extract($key, array $array, $default = null, $strict = true) { +	if (!is_array($array)) { +		return $default; +	} +  	if ($strict) {  		return (isset($array[$key])) ? $array[$key] : $default;  	} else { @@ -2014,10 +2020,20 @@ function elgg_is_valid_options_for_batch_operation($options, $type) {   *   * @link http://docs.elgg.org/Tutorials/WalledGarden   * @elgg_plugin_hook index system + * + * @param string $hook   The name of the hook + * @param string $type   The type of hook + * @param bool   $value  Has a plugin already rendered an index page? + * @param array  $params Array of parameters (should be empty)   * @return bool   * @access private   */ -function elgg_walled_garden_index() { +function elgg_walled_garden_index($hook, $type, $value, $params) { +	if ($value) { +		// do not create a second index page so return +		return; +	} +  	elgg_load_css('elgg.walled_garden');  	elgg_load_js('elgg.walled_garden'); @@ -2082,6 +2098,22 @@ function elgg_walled_garden() {  }  /** + * Remove public access for walled gardens + * + * @param string $hook + * @param string $type + * @param array $accesses + * @return array + * @access private + */ +function _elgg_walled_garden_remove_public_access($hook, $type, $accesses) { +	if (isset($accesses[ACCESS_PUBLIC])) { +		unset($accesses[ACCESS_PUBLIC]); +	} +	return $accesses; +} + +/**   * Boots the engine   *   * 1. sets error handlers @@ -2104,11 +2136,13 @@ function _elgg_engine_boot() {  	_elgg_load_application_config(); -	register_translations(dirname(dirname(dirname(__FILE__))) . "/languages/"); -  	_elgg_load_site_config(); +	_elgg_session_boot(); +  	_elgg_load_cache(); + +	_elgg_load_translations();  }  /** @@ -2137,6 +2171,7 @@ function elgg_init() {  	elgg_register_js('jquery.easing', 'vendors/jquery/jquery.easing.1.3.packed.js');  	elgg_register_js('elgg.avatar_cropper', 'js/lib/ui.avatar_cropper.js');  	elgg_register_js('jquery.imgareaselect', 'vendors/jquery/jquery.imgareaselect-0.9.8/scripts/jquery.imgareaselect.min.js'); +	elgg_register_js('elgg.ui.river', 'js/lib/ui.river.js');  	elgg_register_css('jquery.imgareaselect', 'vendors/jquery/jquery.imgareaselect-0.9.8/css/imgareaselect-deprecated.css'); diff --git a/engine/lib/entities.php b/engine/lib/entities.php index b8ebbd68a..3896cd58f 100644 --- a/engine/lib/entities.php +++ b/engine/lib/entities.php @@ -326,6 +326,10 @@ function add_subtype($type, $subtype, $class = "") {  /**   * Removes a registered ElggEntity type, subtype, and classname.   * + * @warning You do not want to use this function. If you want to unregister + * a class for a subtype, use update_subtype(). Using this function will + * permanently orphan all the objects created with the specified subtype. + *   * @param string $type    Type   * @param string $subtype Subtype   * @@ -344,7 +348,7 @@ function remove_subtype($type, $subtype) {  }  /** - * Update a registered ElggEntity type, subtype, and classname + * Update a registered ElggEntity type, subtype, and class name   *   * @param string $type    Type   * @param string $subtype Subtype @@ -353,7 +357,7 @@ function remove_subtype($type, $subtype) {   * @return bool   */  function update_subtype($type, $subtype, $class = '') { -	global $CONFIG; +	global $CONFIG, $SUBTYPE_CACHE;  	if (!$id = get_subtype_id($type, $subtype)) {  		return FALSE; @@ -361,10 +365,16 @@ function update_subtype($type, $subtype, $class = '') {  	$type = sanitise_string($type);  	$subtype = sanitise_string($subtype); -	return update_data("UPDATE {$CONFIG->dbprefix}entity_subtypes +	$result = update_data("UPDATE {$CONFIG->dbprefix}entity_subtypes  		SET type = '$type', subtype = '$subtype', class = '$class'  		WHERE id = $id  	"); + +	if ($result && isset($SUBTYPE_CACHE[$id])) { +		$SUBTYPE_CACHE[$id]->class = $class; +	} + +	return $result;  }  /** @@ -943,11 +953,11 @@ function elgg_get_entities(array $options = array()) {  	}  	if (!$options['count']) { -		if ($options['group_by'] = sanitise_string($options['group_by'])) { +		if ($options['group_by']) {  			$query .= " GROUP BY {$options['group_by']}";  		} -		if ($options['order_by'] = sanitise_string($options['order_by'])) { +		if ($options['order_by']) {  			$query .= " ORDER BY {$options['order_by']}";  		} @@ -1493,6 +1503,7 @@ function enable_entity($guid, $recursive = true) {  						'relationship' => 'disabled_with',  						'relationship_guid' => $entity->guid,  						'inverse_relationship' => true, +						'limit' => 0,  					));  					foreach ($disabled_with_it as $e) { @@ -1808,7 +1819,7 @@ function import_entity_plugin_hook($hook, $entity_type, $returnvalue, $params) {  		if ($tmp) {  			// Make sure its saved  			if (!$tmp->save()) { -				elgg_echo('ImportException:ProblemSaving', array($element->getAttribute('uuid'))); +				$msg = elgg_echo('ImportException:ProblemSaving', array($element->getAttribute('uuid')));  				throw new ImportException($msg);  			} diff --git a/engine/lib/extender.php b/engine/lib/extender.php index ffd3c1357..43421342c 100644 --- a/engine/lib/extender.php +++ b/engine/lib/extender.php @@ -105,6 +105,7 @@ function import_extender_plugin_hook($hook, $entity_type, $returnvalue, $params)  		// Save  		if (!$entity->save()) { +			$attr_name = $element->getAttribute('name');  			$msg = elgg_echo('ImportException:ProblemUpdatingMeta', array($attr_name, $entity_uuid));  			throw new ImportException($msg);  		} @@ -120,7 +121,7 @@ function import_extender_plugin_hook($hook, $entity_type, $returnvalue, $params)   * @param string $type        'metadata' or 'annotation'   * @param int    $user_guid   The GUID of the user   * - * @return true|false + * @return bool   */  function can_edit_extender($extender_id, $type, $user_guid = 0) {  	if (!elgg_is_logged_in()) { @@ -155,7 +156,7 @@ function can_edit_extender($extender_id, $type, $user_guid = 0) {  	}  	// Trigger plugin hooks -	$params = array('entity' => $entity, 'user' => $user); +	$params = array('entity' => $extender->getEntity(), 'user' => $user);  	return elgg_trigger_plugin_hook('permissions_check', $type, $params, false);  } diff --git a/engine/lib/filestore.php b/engine/lib/filestore.php index 86f6d9baa..93a127257 100644 --- a/engine/lib/filestore.php +++ b/engine/lib/filestore.php @@ -149,6 +149,12 @@ $x1 = 0, $y1 = 0, $x2 = 0, $y2 = 0, $upscale = FALSE) {  		return FALSE;  	} +	// color transparencies white (default is black) +	imagefilledrectangle( +		$new_image, 0, 0, $params['newwidth'], $params['newheight'], +		imagecolorallocate($new_image, 255, 255, 255) +	); +  	$rtn_code = imagecopyresampled(	$new_image,  									$original_image,  									0, diff --git a/engine/lib/input.php b/engine/lib/input.php index dda8211b6..6d1646e1a 100644 --- a/engine/lib/input.php +++ b/engine/lib/input.php @@ -283,7 +283,7 @@ function input_livesearch_page_handler($page) {  					WHERE e.guid = ue.guid  						AND e.enabled = 'yes'  						AND ue.banned = 'no' -						AND (ue.name LIKE '$q%' OR ue.username LIKE '$q%') +						AND (ue.name LIKE '$q%' OR ue.name LIKE '% $q%' OR ue.username LIKE '$q%')  					LIMIT $limit  				"; @@ -333,7 +333,7 @@ function input_livesearch_page_handler($page) {  					WHERE e.guid = ge.guid  						AND e.enabled = 'yes'  						$owner_where -						AND (ge.name LIKE '$q%' OR ge.description LIKE '%$q%') +						AND (ge.name LIKE '$q%' OR ge.name LIKE '% $q%' OR ge.description LIKE '% $q%')  					LIMIT $limit  				";  				if ($entities = get_data($query)) { @@ -379,7 +379,7 @@ function input_livesearch_page_handler($page) {  						AND e.guid = ue.guid  						AND e.enabled = 'yes'  						AND ue.banned = 'no' -						AND (ue.name LIKE '$q%' OR ue.username LIKE '$q%') +						AND (ue.name LIKE '$q%' OR ue.name LIKE '% $q%' OR ue.username LIKE '$q%')  					LIMIT $limit  				"; diff --git a/engine/lib/languages.php b/engine/lib/languages.php index 7a508d298..98006f7cd 100644 --- a/engine/lib/languages.php +++ b/engine/lib/languages.php @@ -8,6 +8,65 @@   */  /** + * Given a message key, returns an appropriately translated full-text string + * + * @param string $message_key The short message code + * @param array  $args        An array of arguments to pass through vsprintf(). + * @param string $language    Optionally, the standard language code + *                            (defaults to site/user default, then English) + * + * @return string Either the translated string, the English string, + * or the original language string. + */ +function elgg_echo($message_key, $args = array(), $language = "") { +	global $CONFIG; + +	static $CURRENT_LANGUAGE; + +	// old param order is deprecated +	if (!is_array($args)) { +		elgg_deprecated_notice( +			'As of Elgg 1.8, the 2nd arg to elgg_echo() is an array of string replacements and the 3rd arg is the language.', +			1.8 +		); + +		$language = $args; +		$args = array(); +	} + +	if (!isset($CONFIG->translations)) { +		// this means we probably had an exception before translations were initialized +		register_translations(dirname(dirname(dirname(__FILE__))) . "/languages/"); +	} + +	if (!$CURRENT_LANGUAGE) { +		$CURRENT_LANGUAGE = get_language(); +	} +	if (!$language) { +		$language = $CURRENT_LANGUAGE; +	} + +	if (isset($CONFIG->translations[$language][$message_key])) { +		$string = $CONFIG->translations[$language][$message_key]; +	} else if (isset($CONFIG->translations["en"][$message_key])) { +		$string = $CONFIG->translations["en"][$message_key]; +		$lang = $CONFIG->translations["en"][$language]; +		elgg_log(sprintf('Missing %s translation for "%s" language key', $lang, $message_key), 'NOTICE'); +	} else { +		$string = $message_key; +		elgg_log(sprintf('Missing English translation for "%s" language key', $message_key), 'NOTICE'); +	} + +	// only pass through if we have arguments to allow backward compatibility +	// with manual sprintf() calls. +	if ($args) { +		$string = vsprintf($string, $args); +	} + +	return $string; +} + +/**   * Add a translation.   *   * Translations are arrays in the Zend Translation array format, eg: @@ -82,56 +141,34 @@ function get_language() {  	return false;  } -/** - * Given a message shortcode, returns an appropriately translated full-text string - * - * @param string $message_key The short message code - * @param array  $args        An array of arguments to pass through vsprintf(). - * @param string $language    Optionally, the standard language code - *                            (defaults to site/user default, then English) - * - * @return string Either the translated string, the English string, - * or the original language string. - */ -function elgg_echo($message_key, $args = array(), $language = "") { +function _elgg_load_translations() {  	global $CONFIG; -	static $CURRENT_LANGUAGE; - -	// old param order is deprecated -	if (!is_array($args)) { -		elgg_deprecated_notice( -			'As of Elgg 1.8, the 2nd arg to elgg_echo() is an array of string replacements and the 3rd arg is the language.', -			1.8 -		); - -		$language = $args; -		$args = array(); -	} +	if ($CONFIG->system_cache_enabled) { +		$loaded = true; +		$languages = array_unique(array('en', get_current_language())); +		foreach ($languages as $language) { +			$data = elgg_load_system_cache("$language.php"); +			if ($data) { +				add_translation($language, unserialize($data)); +			} else { +				$loaded = false; +			} +		} -	if (!$CURRENT_LANGUAGE) { -		$CURRENT_LANGUAGE = get_language(); -	} -	if (!$language) { -		$language = $CURRENT_LANGUAGE; +		if ($loaded) { +			$CONFIG->i18n_loaded_from_cache = true; +			// this is here to force  +			$CONFIG->language_paths[dirname(dirname(dirname(__FILE__))) . "/languages/"] = true; +			return; +		}  	} -	if (isset($CONFIG->translations[$language][$message_key])) { -		$string = $CONFIG->translations[$language][$message_key]; -	} else if (isset($CONFIG->translations["en"][$message_key])) { -		$string = $CONFIG->translations["en"][$message_key]; -	} else { -		$string = $message_key; -	} +	// load core translations from languages directory +	register_translations(dirname(dirname(dirname(__FILE__))) . "/languages/"); +} -	// only pass through if we have arguments to allow backward compatibility -	// with manual sprintf() calls. -	if ($args) { -		$string = vsprintf($string, $args); -	} -	return $string; -}  /**   * When given a full path, finds translation files and loads them @@ -145,16 +182,9 @@ function elgg_echo($message_key, $args = array(), $language = "") {  function register_translations($path, $load_all = false) {  	global $CONFIG; -	static $load_from_cache; -	static $cache_loaded_langs; -	if (!isset($load_from_cache)) { -		$load_from_cache = $CONFIG->system_cache_enabled; -		$cache_loaded_langs = array(); -	} -  	$path = sanitise_filepath($path); -	// Make a note of this path just in case we need to register this language later +	// Make a note of this path just incase we need to register this language later  	if (!isset($CONFIG->language_paths)) {  		$CONFIG->language_paths = array();  	} @@ -162,6 +192,7 @@ function register_translations($path, $load_all = false) {  	// Get the current language based on site defaults and user preference  	$current_language = get_current_language(); +	elgg_log("Translations loaded from: $path");  	// only load these files unless $load_all is true.  	$load_language_files = array( @@ -171,32 +202,6 @@ function register_translations($path, $load_all = false) {  	$load_language_files = array_unique($load_language_files); -	if ($load_from_cache && !$load_all) { -		// load language files from cache -		$data = array(); -		foreach ($load_language_files as $lang_file) { -			$lang = substr($lang_file, 0, strpos($lang_file, '.')); -			if (!isset($cache_loaded_langs[$lang])) { -				$data[$lang] = elgg_load_system_cache($lang_file); -				if ($data[$lang]) { -					$cache_loaded_langs[$lang] = true; -				} else { -					// this language file not cached yet -					$load_from_cache = false; -				} -			} -		} - -		// are we still suppose to load from cache -		if ($load_from_cache) { -			foreach ($data as $lang => $map) { -				add_translation($lang, unserialize($map)); -			} -			$CONFIG->i18n_loaded_from_cache = true; -			return true; -		} -	} -  	$handle = opendir($path);  	if (!$handle) {  		elgg_log("Could not open language path: $path", 'ERROR'); @@ -218,11 +223,6 @@ function register_translations($path, $load_all = false) {  		}  	} -	elgg_log("Translations loaded from: $path"); - -	// make sure caching code saves language data if system cache is on -	$CONFIG->i18n_loaded_from_cache = false; -  	return $return;  } diff --git a/engine/lib/metadata.php b/engine/lib/metadata.php index 0ff3a43dc..77fa30e41 100644 --- a/engine/lib/metadata.php +++ b/engine/lib/metadata.php @@ -361,13 +361,24 @@ function elgg_enable_metadata(array $options) {   * options available to elgg_get_entities().  Supports   * the singular option shortcut.   * - * NB: Using metadata_names and metadata_values results in a + * @note Using metadata_names and metadata_values results in a   * "names IN (...) AND values IN (...)" clause.  This is subtly   * differently than default multiple metadata_name_value_pairs, which use   * "(name = value) AND (name = value)" clauses.   *   * When in doubt, use name_value_pairs.   * + * To ask for entities that do not have a metadata value, use a custom + * where clause like this: + * + * 	$options['wheres'][] = "NOT EXISTS ( + *			SELECT 1 FROM {$dbprefix}metadata md + *			WHERE md.entity_guid = e.guid + *				AND md.name_id = $name_metastring_id + *				AND md.value_id = $value_metastring_id)"; + * + * Note the metadata name and value has been denormalized in the above example. + *   * @see elgg_get_entities   *   * @param array $options Array in format: diff --git a/engine/lib/navigation.php b/engine/lib/navigation.php index a7984ce5a..10b11acfe 100644 --- a/engine/lib/navigation.php +++ b/engine/lib/navigation.php @@ -230,7 +230,7 @@ function elgg_pop_breadcrumb() {  	global $CONFIG;  	if (is_array($CONFIG->breadcrumbs)) { -		array_pop($CONFIG->breadcrumbs); +		return array_pop($CONFIG->breadcrumbs);  	}  	return FALSE; @@ -335,6 +335,19 @@ function elgg_river_menu_setup($hook, $type, $return, $params) {  				$return[] = ElggMenuItem::factory($options);  			}  		} +		 +		if (elgg_is_admin_logged_in()) { +			$options = array( +				'name' => 'delete', +				'href' => "action/river/delete?id=$item->id", +				'text' => elgg_view_icon('delete'), +				'title' => elgg_echo('delete'), +				'confirm' => elgg_echo('deleteconfirm'), +				'is_action' => true, +				'priority' => 200, +			); +			$return[] = ElggMenuItem::factory($options); +		}  	}  	return $return; diff --git a/engine/lib/notification.php b/engine/lib/notification.php index 5a2f5f8ac..18faff27f 100644 --- a/engine/lib/notification.php +++ b/engine/lib/notification.php @@ -480,8 +480,8 @@ function object_notifications($event, $object_type, $object) {  		}  		if (isset($CONFIG->register_objects[$object_type][$object_subtype])) { -			$descr = $CONFIG->register_objects[$object_type][$object_subtype]; -			$string = $descr . ": " . $object->getURL(); +			$subject = $CONFIG->register_objects[$object_type][$object_subtype]; +			$string = $subject . ": " . $object->getURL();  			// Get users interested in content from this person and notify them  			// (Person defined by container_guid so we can also subscribe to groups if we want) @@ -500,16 +500,16 @@ function object_notifications($event, $object_type, $object) {  						if ($user instanceof ElggUser && !$user->isBanned()) {  							if (($user->guid != $SESSION['user']->guid) && has_access_to_entity($object, $user)  							&& $object->access_id != ACCESS_PRIVATE) { -								$methodstring = elgg_trigger_plugin_hook('notify:entity:message', $object->getType(), array( +								$body = elgg_trigger_plugin_hook('notify:entity:message', $object->getType(), array(  									'entity' => $object,  									'to_entity' => $user,  									'method' => $method), $string); -								if (empty($methodstring) && $methodstring !== false) { -									$methodstring = $string; +								if (empty($body) && $body !== false) { +									$body = $string;  								} -								if ($methodstring !== false) { -									notify_user($user->guid, $object->container_guid, $descr, $methodstring, -										NULL, array($method)); +								if ($body !== false) { +									notify_user($user->guid, $object->container_guid, $subject, $body, +										null, array($method));  								}  							}  						} diff --git a/engine/lib/output.php b/engine/lib/output.php index b1245a924..7bfc4be6e 100644 --- a/engine/lib/output.php +++ b/engine/lib/output.php @@ -310,19 +310,11 @@ function elgg_get_friendly_title($title) {  		return $result;  	} -	// @todo not using this because of locale concerns -	//$title = iconv('UTF-8', 'ASCII//TRANSLIT', $title); - -	// @todo this uses a utf8 character class. can use if -	// we want to support utf8 in the url. -	//$title = preg_replace('/[^\p{L}\- ]/u', '', $title); - -	// use A-Za-z0-9_ instead of \w because \w is locale sensitive -	$title = preg_replace("/[^A-Za-z0-9_\- ]/", "", $title); -	$title = str_replace(" ", "-", $title); -	$title = str_replace("--", "-", $title); -	$title = trim($title); -	$title = elgg_strtolower($title); +	// handle some special cases +	$title = str_replace('&', 'and', $title); + +	$title = ElggTranslit::urlize($title); +  	return $title;  } diff --git a/engine/lib/pagehandler.php b/engine/lib/pagehandler.php index a675d976a..ba7518a77 100644 --- a/engine/lib/pagehandler.php +++ b/engine/lib/pagehandler.php @@ -31,18 +31,18 @@ function page_handler($handler, $page) {  	}  	// return false to stop processing the request (because you handled it) -	// return a new $params array if you want to route the request differently -	$params = array( +	// return a new $request array if you want to route the request differently +	$request = array(  		'handler' => $handler,  		'segments' => $page,  	); -	$params = elgg_trigger_plugin_hook('route', $handler, NULL, $params); -	if ($params === false) { +	$request = elgg_trigger_plugin_hook('route', $handler, null, $request); +	if ($request === false) {  		return true;  	} -	$handler = $params['handler']; -	$page = $params['segments']; +	$handler = $request['handler']; +	$page = $request['segments'];  	$result = false;  	if (isset($CONFIG->pagehandler) && !empty($handler) && isset($CONFIG->pagehandler[$handler])) { @@ -129,7 +129,7 @@ function elgg_error_page_handler($hook, $type, $result, $params) {  		$content = elgg_view("errors/default", $params);  	}  	$body = elgg_view_layout('error', array('content' => $content)); -	echo elgg_view_page($title, $body, 'error'); +	echo elgg_view_page('', $body, 'error');  	exit;  } diff --git a/engine/lib/plugins.php b/engine/lib/plugins.php index 39a76db5d..d5cd4fe76 100644 --- a/engine/lib/plugins.php +++ b/engine/lib/plugins.php @@ -311,6 +311,10 @@ function elgg_load_plugins() {  		$start_flags = $start_flags & ~ELGG_PLUGIN_REGISTER_VIEWS;  	} +	if (elgg_get_config('i18n_loaded_from_cache')) { +		$start_flags = $start_flags & ~ELGG_PLUGIN_REGISTER_LANGUAGES; +	} +  	$return = true;  	$plugins = elgg_get_plugins('active');  	if ($plugins) { diff --git a/engine/lib/relationships.php b/engine/lib/relationships.php index f50c4a485..09d541e22 100644 --- a/engine/lib/relationships.php +++ b/engine/lib/relationships.php @@ -239,6 +239,15 @@ function get_entity_relationships($guid, $inverse_relationship = FALSE) {   * Also accepts all options available to elgg_get_entities() and   * elgg_get_entities_from_metadata().   * + * To ask for entities that do not have a particulat relationship to an entity, + * use a custom where clause like the following: + * + * 	$options['wheres'][] = "NOT EXISTS ( + *			SELECT 1 FROM {$db_prefix}entity_relationships + *				WHERE guid_one = e.guid + *				AND relationship = '$relationship' + *		)"; + *   * @see elgg_get_entities   * @see elgg_get_entities_from_metadata   * diff --git a/engine/lib/river.php b/engine/lib/river.php index 547d9495e..b717a7756 100644 --- a/engine/lib/river.php +++ b/engine/lib/river.php @@ -55,7 +55,7 @@ $posted = 0, $annotation_id = 0) {  	$posted = sanitise_int($posted);  	$annotation_id = sanitise_int($annotation_id); -	$params = array( +	$values = array(  		'type' => $type,  		'subtype' => $subtype,  		'action_type' => $action_type, @@ -68,13 +68,13 @@ $posted = 0, $annotation_id = 0) {  	);  	// return false to stop insert -	$params = elgg_trigger_plugin_hook('creating', 'river', null, $params); -	if ($params == false) { +	$values = elgg_trigger_plugin_hook('creating', 'river', null, $values); +	if ($values == false) {  		// inserting did not fail - it was just prevented  		return true;  	} -	extract($params); +	extract($values);  	// Attempt to save river item; return success status  	$id = insert_data("insert into {$CONFIG->dbprefix}river " . @@ -643,9 +643,11 @@ function elgg_river_init() {  	elgg_register_page_handler('activity', 'elgg_river_page_handler');  	$item = new ElggMenuItem('activity', elgg_echo('activity'), 'activity');  	elgg_register_menu_item('site', $item); - +	  	elgg_register_widget_type('river_widget', elgg_echo('river:widget:title'), elgg_echo('river:widget:description')); +	elgg_register_action('river/delete', '', 'admin'); +  	elgg_register_plugin_hook_handler('unit_test', 'system', 'elgg_river_test');  } diff --git a/engine/lib/sessions.php b/engine/lib/sessions.php index 419d36707..72ca0a1c2 100644 --- a/engine/lib/sessions.php +++ b/engine/lib/sessions.php @@ -376,14 +376,10 @@ function logout() {   *   * @uses $_SESSION   * - * @param string $event       Event name - * @param string $object_type Object type - * @param mixed  $object      Object - *   * @return bool   * @access private   */ -function _elgg_session_boot($event, $object_type, $object) { +function _elgg_session_boot() {  	global $DB_PREFIX, $CONFIG;  	// Use database for sessions @@ -464,9 +460,6 @@ function _elgg_session_boot($event, $object_type, $object) {  		return false;  	} -	// Since we have loaded a new user, this user may have different language preferences -	register_translations(dirname(dirname(dirname(__FILE__))) . "/languages/"); -  	return true;  } @@ -658,5 +651,3 @@ function _elgg_session_gc($maxlifetime) {  	return true;  } - -elgg_register_event_handler('boot', 'system', '_elgg_session_boot', 2); diff --git a/engine/lib/statistics.php b/engine/lib/statistics.php index e1f95ed97..5ee640549 100644 --- a/engine/lib/statistics.php +++ b/engine/lib/statistics.php @@ -95,8 +95,8 @@ function get_number_users($show_deactivated = false) {   * @return string    */  function get_online_users() { -	$count = find_active_users(600, 10, $offset, true); -	$objects = find_active_users(600, 10, $offset); +	$count = find_active_users(600, 10, 0, true); +	$objects = find_active_users(600, 10);  	if ($objects) {  		return elgg_view_entity_list($objects, array( diff --git a/engine/lib/system_log.php b/engine/lib/system_log.php index 28d90be56..53fa24557 100644 --- a/engine/lib/system_log.php +++ b/engine/lib/system_log.php @@ -156,9 +156,8 @@ function get_object_from_log_entry($entry_id) {   * This is called by the event system and should not be called directly.   *   * @param object $object The object you're talking about. - * @param string $event  String The event being logged - * - * @return mixed + * @param string $event  The event being logged + * @return void   */  function system_log($object, $event) {  	global $CONFIG; @@ -166,6 +165,12 @@ function system_log($object, $event) {  	static $cache_size = 0;  	if ($object instanceof Loggable) { + +		if (datalist_get('version') < 2012012000) { +			// this is a site that doesn't have the ip_address column yet +			return; +		} +  		// reset cache if it has grown too large  		if (!is_array($log_cache) || $cache_size > 500) {  			$log_cache = array(); @@ -213,8 +218,6 @@ function system_log($object, $event) {  			$log_cache[$time][$object_id][$event] = true;  			$cache_size += 1;  		} - -		return true;  	}  } diff --git a/engine/lib/users.php b/engine/lib/users.php index e209f2c38..527eff3cd 100644 --- a/engine/lib/users.php +++ b/engine/lib/users.php @@ -136,7 +136,6 @@ function ban_user($user_guid, $reason = "") {  	global $CONFIG;  	$user_guid = (int)$user_guid; -	$reason = sanitise_string($reason);  	$user = get_entity($user_guid); @@ -810,6 +809,12 @@ function validate_username($username) {  		$msg = elgg_echo('registration:usernametooshort', array($CONFIG->minusername));  		throw new RegistrationException($msg);  	} +	 +	// username in the database has a limit of 128 characters +	if (strlen($username) > 128) { +		$msg = elgg_echo('registration:usernametoolong', array(128)); +		throw new RegistrationException($msg); +	}  	// Blacklist for bad characters (partially nicked from mediawiki)  	$blacklist = '/[' . @@ -1556,7 +1561,7 @@ function users_init() {  	elgg_register_action('friends/remove');  	elgg_register_action('avatar/upload');  	elgg_register_action('avatar/crop'); -	elgg_register_action('avatar/revert'); +	elgg_register_action('avatar/remove');  	elgg_register_action('profile/edit');  	elgg_register_action('friends/collections/add'); diff --git a/engine/lib/views.php b/engine/lib/views.php index 1b013be6f..b00334062 100644 --- a/engine/lib/views.php +++ b/engine/lib/views.php @@ -303,7 +303,7 @@ function elgg_set_view_location($view, $location, $viewtype = '') {  /**   * Returns whether the specified view exists   * - * @note If $recurse is strue, also checks if a view exists only as an extension. + * @note If $recurse is true, also checks if a view exists only as an extension.   *   * @param string $view     The view name   * @param string $viewtype If set, forces the viewtype @@ -403,7 +403,7 @@ function elgg_view($view, $vars = array(), $bypass = false, $debug = false, $vie  	$view_orig = $view;  	// Trigger the pagesetup event -	if (!isset($CONFIG->pagesetupdone)) { +	if (!isset($CONFIG->pagesetupdone) && $CONFIG->boot_complete) {  		$CONFIG->pagesetupdone = true;  		elgg_trigger_event('pagesetup', 'system');  	} @@ -1224,12 +1224,12 @@ function elgg_view_image_block($image, $body, $vars = array()) {   * @param string $type  The type of module (main, info, popup, aside, etc.)   * @param string $title A title to put in the header   * @param string $body  Content of the module - * @param string $vars  Additional parameters for the module + * @param array  $vars  Additional parameters for the module   *   * @return string   * @since 1.8.0   */ -function elgg_view_module($type, $title, $body, $vars = array()) { +function elgg_view_module($type, $title, $body, array $vars = array()) {  	$vars['class'] = elgg_extract('class', $vars, '') . " elgg-module-$type";  	$vars['title'] = $title; | 
