diff options
Diffstat (limited to 'engine')
| -rw-r--r-- | engine/handlers/cache_handler.php | 7 | ||||
| -rw-r--r-- | engine/lib/actions.php | 17 | ||||
| -rw-r--r-- | engine/lib/annotations.php | 16 | ||||
| -rw-r--r-- | engine/lib/cache.php | 2 | ||||
| -rw-r--r-- | engine/lib/elgglib.php | 2 | ||||
| -rw-r--r-- | engine/lib/entities.php | 24 | ||||
| -rw-r--r-- | engine/lib/languages.php | 39 | ||||
| -rw-r--r-- | engine/lib/metadata.php | 17 | ||||
| -rw-r--r-- | engine/lib/metastrings.php | 5 | ||||
| -rw-r--r-- | engine/lib/pageowner.php | 1 | ||||
| -rw-r--r-- | engine/lib/relationships.php | 4 | ||||
| -rw-r--r-- | engine/lib/upgrade.php | 3 | ||||
| -rw-r--r-- | engine/lib/upgrades/2013030600-1.8.13-update_user_location-8999eb8bf1bdd9a3.php | 26 | ||||
| -rw-r--r-- | engine/lib/user_settings.php | 4 | ||||
| -rw-r--r-- | engine/lib/web_services.php | 6 | ||||
| -rw-r--r-- | engine/tests/api/entity_getter_functions.php | 64 | 
16 files changed, 190 insertions, 47 deletions
diff --git a/engine/handlers/cache_handler.php b/engine/handlers/cache_handler.php index 7706c2c92..9848d3531 100644 --- a/engine/handlers/cache_handler.php +++ b/engine/handlers/cache_handler.php @@ -93,7 +93,12 @@ if (file_exists($filename)) {  	// someone trying to access a non-cached file or a race condition with cache flushing  	mysql_close($mysql_dblink);  	require_once(dirname(dirname(__FILE__)) . "/start.php"); -	elgg_regenerate_simplecache(); + +	global $CONFIG; +	if (!isset($CONFIG->views->simplecache[$view])) { +		header("HTTP/1.1 404 Not Found"); +		exit; +	}  	elgg_set_viewtype($viewtype);  	$contents = elgg_view($view); diff --git a/engine/lib/actions.php b/engine/lib/actions.php index 53b185dea..f78ca63df 100644 --- a/engine/lib/actions.php +++ b/engine/lib/actions.php @@ -65,12 +65,11 @@ function action($action, $forwarder = "") {  	// @todo REMOVE THESE ONCE #1509 IS IN PLACE.  	// Allow users to disable plugins without a token in order to  	// remove plugins that are incompatible. -	// Login and logout are for convenience. +	// Logout for convenience.  	// file/download (see #2010)  	$exceptions = array(  		'admin/plugins/disable',  		'logout', -		'login',  		'file/download',  	); @@ -252,10 +251,20 @@ function validate_action_token($visibleerrors = TRUE, $token = NULL, $ts = NULL)  					register_error(elgg_echo('actiongatekeeper:pluginprevents'));  				}  			} else if ($visibleerrors) { -				register_error(elgg_echo('actiongatekeeper:timeerror')); +				// this is necessary because of #5133 +				if (elgg_is_xhr()) { +					register_error(elgg_echo('js:security:token_refresh_failed', array(elgg_get_site_url()))); +				} else { +					register_error(elgg_echo('actiongatekeeper:timeerror')); +				}  			}  		} else if ($visibleerrors) { -			register_error(elgg_echo('actiongatekeeper:tokeninvalid')); +			// this is necessary because of #5133 +			if (elgg_is_xhr()) { +				register_error(elgg_echo('js:security:token_refresh_failed', array(elgg_get_site_url()))); +			} else { +				register_error(elgg_echo('actiongatekeeper:tokeninvalid')); +			}  		}  	} else {  		if (! empty($_SERVER['CONTENT_LENGTH']) && empty($_POST)) { diff --git a/engine/lib/annotations.php b/engine/lib/annotations.php index f40a2cc6f..bd5ea1a1f 100644 --- a/engine/lib/annotations.php +++ b/engine/lib/annotations.php @@ -200,6 +200,18 @@ function update_annotation($annotation_id, $name, $value, $value_type, $owner_gu   * @since 1.8.0   */  function elgg_get_annotations(array $options = array()) { + +	// @todo remove support for count shortcut - see #4393 +	if (isset($options['__egefac']) && $options['__egefac']) { +		unset($options['__egefac']); +	} else { +		// support shortcut of 'count' => true for 'annotation_calculation' => 'count' +		if (isset($options['count']) && $options['count']) { +			$options['annotation_calculation'] = 'count'; +			unset($options['count']); +		}		 +	} +	  	$options['metastring_type'] = 'annotations';  	return elgg_get_metastring_based_objects($options);  } @@ -425,6 +437,10 @@ function elgg_get_entities_from_annotation_calculation($options) {  	$options['callback'] = 'entity_row_to_elggstar'; +	// see #4393 +	// @todo remove after the 'count' shortcut is removed from elgg_get_annotations() +	$options['__egefac'] = true; +  	return elgg_get_annotations($options);  } diff --git a/engine/lib/cache.php b/engine/lib/cache.php index 74644019c..59359124e 100644 --- a/engine/lib/cache.php +++ b/engine/lib/cache.php @@ -444,7 +444,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)); +			elgg_save_system_cache("$lang.lang", serialize($map));  		}  	}  } diff --git a/engine/lib/elgglib.php b/engine/lib/elgglib.php index 4cac79a22..74b70f9fb 100644 --- a/engine/lib/elgglib.php +++ b/engine/lib/elgglib.php @@ -1438,7 +1438,7 @@ function elgg_http_remove_url_query_element($url, $element) {  	}  	$url_array['query'] = http_build_query($query); -	$string = elgg_http_build_url($url_array); +	$string = elgg_http_build_url($url_array, false);  	return $string;  } diff --git a/engine/lib/entities.php b/engine/lib/entities.php index 25c927ac6..156eec040 100644 --- a/engine/lib/entities.php +++ b/engine/lib/entities.php @@ -1219,14 +1219,24 @@ function elgg_get_entity_type_subtype_where_sql($table, $types, $subtypes, $pair  			$subtype_ids = array();  			if ($subtypes) {  				foreach ($subtypes as $subtype) { -					// check that the subtype is valid (with ELGG_ENTITIES_NO_VALUE being a valid subtype) -					// @todo simplify this logic -					if (ELGG_ENTITIES_NO_VALUE === $subtype || $subtype_id = get_subtype_id($type, $subtype)) { -						$subtype_ids[] = (ELGG_ENTITIES_NO_VALUE === $subtype) ? ELGG_ENTITIES_NO_VALUE : $subtype_id; -					} else { -						$valid_subtypes_count--; -						elgg_log("Type-subtype '$type:$subtype' does not exist!", 'NOTICE'); +					// check that the subtype is valid +					if (!$subtype && ELGG_ENTITIES_NO_VALUE === $subtype) { +						// subtype value is 0 +						$subtype_ids[] = ELGG_ENTITIES_NO_VALUE; +					} elseif (!$subtype) { +						// subtype is ignored. +						// this handles ELGG_ENTITIES_ANY_VALUE, '', and anything falsy that isn't 0  						continue; +					} else { +						$subtype_id = get_subtype_id($type, $subtype); +						 +						if ($subtype_id) { +							$subtype_ids[] = $subtype_id; +						} else { +							$valid_subtypes_count--; +							elgg_log("Type-subtype '$type:$subtype' does not exist!", 'NOTICE'); +							continue; +						}  					}  				} diff --git a/engine/lib/languages.php b/engine/lib/languages.php index 3c231d964..17db14d98 100644 --- a/engine/lib/languages.php +++ b/engine/lib/languages.php @@ -146,7 +146,7 @@ function _elgg_load_translations() {  		$loaded = true;  		$languages = array_unique(array('en', get_current_language()));  		foreach ($languages as $language) { -			$data = elgg_load_system_cache("$language.php"); +			$data = elgg_load_system_cache("$language.lang");  			if ($data) {  				add_translation($language, unserialize($data));  			} else { @@ -227,23 +227,37 @@ function register_translations($path, $load_all = false) {  /**   * Reload all translations from all registered paths.   * - * This is only called by functions which need to know all possible translations, namely the - * statistic gathering ones. + * This is only called by functions which need to know all possible translations.   *   * @todo Better on demand loading based on language_paths array   * - * @return bool + * @return void   */  function reload_all_translations() {  	global $CONFIG;  	static $LANG_RELOAD_ALL_RUN;  	if ($LANG_RELOAD_ALL_RUN) { -		return null; +		return;  	} -	foreach ($CONFIG->language_paths as $path => $dummy) { -		register_translations($path, true); +	if ($CONFIG->i18n_loaded_from_cache) { +		$cache = elgg_get_system_cache(); +		$cache_dir = $cache->getVariable("cache_path"); +		$filenames = elgg_get_file_list($cache_dir, array(), array(), array(".lang")); +		foreach ($filenames as $filename) { +			if (preg_match('/([a-z]+)\.[^.]+$/', $filename, $matches)) { +				$language = $matches[1]; +				$data = elgg_load_system_cache("$language.lang"); +				if ($data) { +					add_translation($language, unserialize($data)); +				} +			} +		} +	} else { +		foreach ($CONFIG->language_paths as $path => $dummy) { +			register_translations($path, true); +		}  	}  	$LANG_RELOAD_ALL_RUN = true; @@ -335,14 +349,3 @@ function get_missing_language_keys($language) {  	return false;  } - -/** - * Initialize the language library - * @access private - */ -function elgg_languages_init() { -	$lang = get_current_language(); -	elgg_register_simplecache_view("js/languages/$lang"); -} - -elgg_register_event_handler('init', 'system', 'elgg_languages_init'); diff --git a/engine/lib/metadata.php b/engine/lib/metadata.php index 2fa491963..305e9918b 100644 --- a/engine/lib/metadata.php +++ b/engine/lib/metadata.php @@ -281,6 +281,14 @@ $access_id = ACCESS_PRIVATE, $allow_multiple = false) {   * @since 1.8.0   */  function elgg_get_metadata(array $options = array()) { + +	// @todo remove support for count shortcut - see #4393 +	// support shortcut of 'count' => true for 'metadata_calculation' => 'count' +	if (isset($options['count']) && $options['count']) { +		$options['metadata_calculation'] = 'count'; +		unset($options['count']); +	} +  	$options['metastring_type'] = 'metadata';  	return elgg_get_metastring_based_objects($options);  } @@ -302,11 +310,14 @@ function elgg_delete_metadata(array $options) {  	if (!elgg_is_valid_options_for_batch_operation($options, 'metadata')) {  		return false;  	} +	$options['metastring_type'] = 'metadata'; +	$result = elgg_batch_metastring_based_objects($options, 'elgg_batch_delete_callback', false); +	// This moved last in case an object's constructor sets metadata. Currently the batch +	// delete process has to create the entity to delete its metadata. See #5214  	elgg_get_metadata_cache()->invalidateByOptions('delete', $options); -	$options['metastring_type'] = 'metadata'; -	return elgg_batch_metastring_based_objects($options, 'elgg_batch_delete_callback', false); +	return $result;  }  /** @@ -774,10 +785,10 @@ function string_to_tag_array($string) {  		$ar = explode(",", $string);  		$ar = array_map('trim', $ar);  		$ar = array_filter($ar, 'is_not_null'); +		$ar = array_map('strip_tags', $ar);  		return $ar;  	}  	return false; -  }  /** diff --git a/engine/lib/metastrings.php b/engine/lib/metastrings.php index 76c4bd8c4..f49b4a163 100644 --- a/engine/lib/metastrings.php +++ b/engine/lib/metastrings.php @@ -389,11 +389,6 @@ function elgg_get_metastring_based_objects($options) {  	$selects = $options['selects']; -	// allow count shortcut -	if ($options['count']) { -		$options['metastring_calculation'] = 'count'; -	} -  	// For performance reasons we don't want the joins required for metadata / annotations  	// unless we're going through one of their callbacks.  	// this means we expect the functions passing different callbacks to pass their required joins. diff --git a/engine/lib/pageowner.php b/engine/lib/pageowner.php index bf5901aad..7e8e6e430 100644 --- a/engine/lib/pageowner.php +++ b/engine/lib/pageowner.php @@ -113,6 +113,7 @@ function default_page_owner_handler($hook, $entity_type, $returnvalue, $params)  		}  		if ($user = get_user_by_username($username)) { +			elgg_set_ignore_access($ia);  			return $user->getGUID();  		}  	} diff --git a/engine/lib/relationships.php b/engine/lib/relationships.php index c1a7cc080..fe0b8364d 100644 --- a/engine/lib/relationships.php +++ b/engine/lib/relationships.php @@ -109,7 +109,7 @@ function add_entity_relationship($guid_one, $relationship, $guid_two) {   * @param string $relationship The type of relationship   * @param int    $guid_two     The GUID of the entity the relationship is with   * - * @return object|false Depending on success + * @return ElggRelationship|false Depending on success   */  function check_entity_relationship($guid_one, $relationship, $guid_two) {  	global $CONFIG; @@ -123,7 +123,7 @@ function check_entity_relationship($guid_one, $relationship, $guid_two) {  			AND relationship='$relationship'  			AND guid_two=$guid_two limit 1"; -	$row = get_data_row($query); +	$row = row_to_elggrelationship(get_data_row($query));  	if ($row) {  		return $row;  	} diff --git a/engine/lib/upgrade.php b/engine/lib/upgrade.php index 2883dc509..d684af862 100644 --- a/engine/lib/upgrade.php +++ b/engine/lib/upgrade.php @@ -17,6 +17,9 @@   * @access private   */  function upgrade_code($version, $quiet = FALSE) { +	// do not remove - upgrade scripts depend on this +	global $CONFIG; +	  	$version = (int) $version;  	$upgrade_path = elgg_get_config('path') . 'engine/lib/upgrades/';  	$processed_upgrades = elgg_get_processed_upgrades(); diff --git a/engine/lib/upgrades/2013030600-1.8.13-update_user_location-8999eb8bf1bdd9a3.php b/engine/lib/upgrades/2013030600-1.8.13-update_user_location-8999eb8bf1bdd9a3.php new file mode 100644 index 000000000..b38eb5100 --- /dev/null +++ b/engine/lib/upgrades/2013030600-1.8.13-update_user_location-8999eb8bf1bdd9a3.php @@ -0,0 +1,26 @@ +<?php +/** + * Elgg 1.8.14 upgrade 2013030600 + * update_user_location + * + * Before Elgg 1.8, a location like "London, England" would be stored as an array. + * This script turns that back into a string. + */ + +global $DB_QUERY_CACHE; + +$ia = elgg_set_ignore_access(true); +$options = array( +	'type' => 'user', +	'limit' => 0, +); +$batch = new ElggBatch('elgg_get_entities', $options); + +foreach ($batch as $entity) { +	$DB_QUERY_CACHE = array(); +	 +	if (is_array($entity->location)) { +		$entity->location = implode(', ', $entity->location); +	} +} +elgg_set_ignore_access($ia); diff --git a/engine/lib/user_settings.php b/engine/lib/user_settings.php index cca5359a4..3466c25f9 100644 --- a/engine/lib/user_settings.php +++ b/engine/lib/user_settings.php @@ -265,9 +265,9 @@ function elgg_set_user_default_access() {   * @access private   */  function usersettings_pagesetup() { -	if (elgg_get_context() == "settings") { -		$user = elgg_get_page_owner_entity(); +	$user = elgg_get_page_owner_entity(); +	if ($user && elgg_get_context() == "settings") {  		$params = array(  			'name' => '1_account',  			'text' => elgg_echo('usersettings:user:opt:linktext'), diff --git a/engine/lib/web_services.php b/engine/lib/web_services.php index b6289184a..b440e3afb 100644 --- a/engine/lib/web_services.php +++ b/engine/lib/web_services.php @@ -1267,14 +1267,14 @@ function service_handler($handler, $request) {  	$request = explode('/', $request);  	// after the handler, the first identifier is response format -	// ex) http://example.org/services/api/rest/xml/?method=test +	// ex) http://example.org/services/api/rest/json/?method=test  	$response_format = array_shift($request);  	// Which view - xml, json, ...  	if ($response_format && elgg_is_valid_view_type($response_format)) {  		elgg_set_viewtype($response_format);  	} else { -		// default to xml -		elgg_set_viewtype("xml"); +		// default to json +		elgg_set_viewtype("json");  	}  	if (!isset($CONFIG->servicehandler) || empty($handler)) { diff --git a/engine/tests/api/entity_getter_functions.php b/engine/tests/api/entity_getter_functions.php index 6f7a6145e..7bf8ef04a 100644 --- a/engine/tests/api/entity_getter_functions.php +++ b/engine/tests/api/entity_getter_functions.php @@ -2729,6 +2729,36 @@ class ElggCoreEntityGetterFunctionsTest extends ElggCoreUnitTest {  		}  	} +	public function testElggGetEntitiesFromAnnotationCalculationCount() { +		// add two annotations with a unique name to an entity +		// then count the number of entities with that annotation name + +		$subtypes = $this->getRandomValidSubtypes(array('object'), 1); +		$name = 'test_annotation_' . rand(0, 9999); +		$values = array(); +		$options = array( +			'type' => 'object', +			'subtypes' => $subtypes, +			'limit' => 1 +		); +		$es = elgg_get_entities($options); +		$entity = $es[0]; +		$value = rand(0, 9999); +		$entity->annotate($name, $value); +		$value = rand(0, 9999); +		$entity->annotate($name, $value); + +		$options = array( +			'type' => 'object', +			'subtypes' => $subtypes, +			'annotation_name' => $name, +			'calculation' => 'count', +			'count' => true, +		); +		$count = (int)elgg_get_entities_from_annotation_calculation($options); +		$this->assertEqual(1, $count); +	} +  	public function testElggGetAnnotationsAnnotationNames() {  		$options = array('annotation_names' => array());  		$a_e_map = array(); @@ -2817,4 +2847,38 @@ class ElggCoreEntityGetterFunctionsTest extends ElggCoreUnitTest {  		$entities = elgg_get_entities($options);  		$this->assertFalse($entities);  	} + +	public function testEGEEmptySubtypePlurality() { +		$options = array( +			'type' => 'user', +			'subtypes' => '' +		); + +		$entities = elgg_get_entities($options); +		$this->assertTrue(is_array($entities)); + +		$options = array( +			'type' => 'user', +			'subtype' => '' +		); + +		$entities = elgg_get_entities($options); +		$this->assertTrue(is_array($entities)); + +		$options = array( +			'type' => 'user', +			'subtype' => array('') +		); + +		$entities = elgg_get_entities($options); +		$this->assertTrue(is_array($entities)); + +		$options = array( +			'type' => 'user', +			'subtypes' => array('') +		); + +		$entities = elgg_get_entities($options); +		$this->assertTrue(is_array($entities)); +	}  }  | 
