diff options
Diffstat (limited to 'engine')
69 files changed, 620 insertions, 379 deletions
| diff --git a/engine/classes/ElggAnnotation.php b/engine/classes/ElggAnnotation.php index 511b5151f..175e7049d 100644 --- a/engine/classes/ElggAnnotation.php +++ b/engine/classes/ElggAnnotation.php @@ -11,6 +11,9 @@   * @package    Elgg.Core   * @subpackage DataModel.Annotations   * @link       http://docs.elgg.org/DataModel/Annotations + * + * @property string $value_type + * @property string $enabled   */  class ElggAnnotation extends ElggExtender { @@ -56,6 +59,8 @@ class ElggAnnotation extends ElggExtender {  	 * Save this instance  	 *  	 * @return int an object id +	 * +	 * @throws IOException  	 */  	function save() {  		if ($this->id > 0) { diff --git a/engine/classes/ElggAttributeLoader.php b/engine/classes/ElggAttributeLoader.php index 602bb8bae..2d1c1abde 100644 --- a/engine/classes/ElggAttributeLoader.php +++ b/engine/classes/ElggAttributeLoader.php @@ -148,11 +148,11 @@ class ElggAttributeLoader {  				if (!is_callable($this->primary_loader)) {  					throw new LogicException('Primary attribute loader must be callable');  				} -				if (!$this->requires_access_control) { +				if ($this->requires_access_control) { +					$fetched = (array) call_user_func($this->primary_loader, $row['guid']); +				} else {  					$ignoring_access = elgg_set_ignore_access(); -				} -				$fetched = (array) call_user_func($this->primary_loader, $row['guid']); -				if (!$this->requires_access_control) { +					$fetched = (array) call_user_func($this->primary_loader, $row['guid']);  					elgg_set_ignore_access($ignoring_access);  				}  				if (!$fetched) { diff --git a/engine/classes/ElggAutoP.php b/engine/classes/ElggAutoP.php index 89d77e583..f3c7cc972 100644 --- a/engine/classes/ElggAutoP.php +++ b/engine/classes/ElggAutoP.php @@ -117,6 +117,8 @@ class ElggAutoP {  		// serialize back to HTML  		$html = $this->_doc->saveHTML(); +		// Note: we create <autop> elements, which will later be converted to paragraphs +  		// split AUTOPs into multiples at /\n\n+/  		$html = preg_replace('/(' . $this->_unique . 'NL){2,}/', '</autop><autop>', $html);  		$html = str_replace(array($this->_unique . 'BR', $this->_unique . 'NL', '<br>'),  @@ -134,6 +136,7 @@ class ElggAutoP {  		// strip AUTOPs that only have comments/whitespace  		foreach ($this->_xpath->query('//autop') as $autop) { +			/* @var DOMElement $autop */  			$hasContent = false;  			if (trim($autop->textContent) !== '') {  				$hasContent = true; @@ -146,17 +149,19 @@ class ElggAutoP {  				}  			}  			if (!$hasContent) { -				// strip w/ preg_replace later (faster than moving nodes out) +				// mark to be later replaced w/ preg_replace (faster than moving nodes out)  				$autop->setAttribute("r", "1");  			}  		} -		// remove a single AUTOP inside certain elements +		// If a DIV contains a single AUTOP, remove it  		foreach ($this->_xpath->query('//div') as $el) { +			/* @var DOMElement $el */  			$autops = $this->_xpath->query('./autop', $el);  			if ($autops->length === 1) { -				// strip w/ preg_replace later (faster than moving nodes out) -				$autops->item(0)->setAttribute("r", "1"); +				$firstAutop = $autops->item(0); +				/* @var DOMElement $firstAutop */ +				$firstAutop->setAttribute("r", "1");  			}  		} @@ -185,7 +190,7 @@ class ElggAutoP {  	 * @param DOMElement $el  	 */  	protected function _addParagraphs(DOMElement $el) { -		// no need to recurse, just queue up +		// no need to call recursively, just queue up  		$elsToProcess = array($el);  		$inlinesToProcess = array();  		while ($el = array_shift($elsToProcess)) { @@ -216,12 +221,12 @@ class ElggAutoP {  				$isElement = ($node->nodeType === XML_ELEMENT_NODE);  				if ($isElement) { -					$elName = $node->nodeName; +					$isBlock = in_array($node->nodeName, $this->_blocks); +				} else { +					$isBlock = false;  				} -				$isBlock = ($isElement && in_array($elName, $this->_blocks));  				if ($alterInline) { -					$isInline = $isElement && ! $isBlock;  					$isText = ($node->nodeType === XML_TEXT_NODE);  					$isLastInline = (! $node->nextSibling  								   || ($node->nextSibling->nodeType === XML_ELEMENT_NODE diff --git a/engine/classes/ElggBatch.php b/engine/classes/ElggBatch.php index c1a77a0d9..5d59425d0 100644 --- a/engine/classes/ElggBatch.php +++ b/engine/classes/ElggBatch.php @@ -296,7 +296,8 @@ class ElggBatch  	 * Increment the offset from the original options array? Setting to  	 * false is required for callbacks that delete rows.  	 * -	 * @param bool $increment +	 * @param bool $increment Set to false when deleting data +	 * @return void  	 */  	public function setIncrementOffset($increment = true) {  		$this->incrementOffset = (bool) $increment; diff --git a/engine/classes/ElggData.php b/engine/classes/ElggData.php index 3470ee1cf..426248ca3 100644 --- a/engine/classes/ElggData.php +++ b/engine/classes/ElggData.php @@ -5,6 +5,9 @@   *   * @package    Elgg.Core   * @subpackage DataModel + * + * @property int $owner_guid + * @property int $time_created   */  abstract class ElggData implements  	Loggable,	// Can events related to this object class be logged @@ -33,14 +36,12 @@ abstract class ElggData implements  	 *                        Passing false returns false.  Core constructors always pass false.  	 *                        Does nothing either way since attributes are initialized by the time  	 *                        this is called. -	 * @return false|void False is +	 * @return void  	 * @deprecated 1.8 Use initializeAttributes()  	 */  	protected function initialise_attributes($pre18_api = true) {  		if ($pre18_api) {  			elgg_deprecated_notice('initialise_attributes() is deprecated by initializeAttributes()', 1.8); -		} else { -			return false;  		}  	} @@ -111,7 +112,7 @@ abstract class ElggData implements  	 * @param string $name  The attribute to set  	 * @param mixed  $value The value to set it to  	 * -	 * @return The success of your set funtion? +	 * @return bool The success of your set function?  	 */  	abstract protected function set($name, $value); @@ -195,7 +196,7 @@ abstract class ElggData implements  	 *  	 * @see Iterator::current()  	 * -	 * @return void +	 * @return mixed  	 */  	public function current() {  		return current($this->attributes); @@ -206,7 +207,7 @@ abstract class ElggData implements  	 *  	 * @see Iterator::key()  	 * -	 * @return void +	 * @return string  	 */  	public function key() {  		return key($this->attributes); @@ -228,7 +229,7 @@ abstract class ElggData implements  	 *  	 * @see Iterator::valid()  	 * -	 * @return void +	 * @return bool  	 */  	public function valid() {  		return $this->valid; @@ -266,12 +267,13 @@ abstract class ElggData implements  	 *  	 * @param mixed $key Name  	 * -	 * @return void +	 * @return mixed  	 */  	public function offsetGet($key) {  		if (array_key_exists($key, $this->attributes)) {  			return $this->attributes[$key];  		} +		return null;  	}  	/** diff --git a/engine/classes/ElggDiskFilestore.php b/engine/classes/ElggDiskFilestore.php index 7aace43ba..7374aad35 100644 --- a/engine/classes/ElggDiskFilestore.php +++ b/engine/classes/ElggDiskFilestore.php @@ -60,6 +60,7 @@ class ElggDiskFilestore extends ElggFilestore {  		$path = substr($fullname, 0, $ls);  		$name = substr($fullname, $ls); +		// @todo $name is unused, remove it or do we need to fix something?  		// Try and create the directory  		try { @@ -108,7 +109,7 @@ class ElggDiskFilestore extends ElggFilestore {  	 *  	 * @param resource $f      File pointer resource  	 * @param int      $length The number of bytes to read -	 * @param inf      $offset The number of bytes to start after +	 * @param int      $offset The number of bytes to start after  	 *  	 * @return mixed Contents of file or false on fail.  	 */ @@ -198,6 +199,7 @@ class ElggDiskFilestore extends ElggFilestore {  	 * @param ElggFile $file File object  	 *  	 * @return string The full path of where the file is stored +	 * @throws InvalidParameterException  	 */  	public function getFilenameOnFilestore(ElggFile $file) {  		$owner_guid = $file->getOwnerGuid(); @@ -315,8 +317,6 @@ class ElggDiskFilestore extends ElggFilestore {  		} else {  			return str_split($string);  		} - -		return false;  	}  	/** @@ -324,7 +324,7 @@ class ElggDiskFilestore extends ElggFilestore {  	 *  	 * @param int $identifier The guide of the entity to store the data under.  	 * -	 * @return str The path where the entity's data will be stored. +	 * @return string The path where the entity's data will be stored.  	 * @deprecated 1.8 Use ElggDiskFilestore::makeFileMatrix()  	 */  	protected function make_file_matrix($identifier) { @@ -338,7 +338,7 @@ class ElggDiskFilestore extends ElggFilestore {  	 *  	 * @param int $guid The guide of the entity to store the data under.  	 * -	 * @return str The path where the entity's data will be stored. +	 * @return string The path where the entity's data will be stored.  	 */  	protected function makeFileMatrix($guid) {  		$entity = get_entity($guid); @@ -363,7 +363,7 @@ class ElggDiskFilestore extends ElggFilestore {  	 *  	 * @param int $guid The entity to contrust a matrix for  	 * -	 * @return str The +	 * @return string The  	 */  	protected function user_file_matrix($guid) {  		elgg_deprecated_notice('ElggDiskFilestore::user_file_matrix() is deprecated by ::makeFileMatrix()', 1.8); diff --git a/engine/classes/ElggEntity.php b/engine/classes/ElggEntity.php index 929abceb2..f44e73023 100644 --- a/engine/classes/ElggEntity.php +++ b/engine/classes/ElggEntity.php @@ -34,6 +34,7 @@   * @property int    $access_id      Specifies the visibility level of this entity   * @property int    $time_created   A UNIX timestamp of when the entity was created (read-only, set on first save)   * @property int    $time_updated   A UNIX timestamp of when the entity was last updated (automatically updated on save) + * @property-read string $enabled   */  abstract class ElggEntity extends ElggData implements  	Notable,    // Calendar interface @@ -940,7 +941,7 @@ abstract class ElggEntity extends ElggData implements  	 * @param ElggMetadata $metadata  The piece of metadata to specifically check  	 * @param int          $user_guid The user GUID, optionally (default: logged in user)  	 * -	 * @return true|false +	 * @return bool  	 */  	function canEditMetadata($metadata = null, $user_guid = 0) {  		return can_edit_entity_metadata($this->getGUID(), $user_guid, $metadata); @@ -1668,9 +1669,11 @@ abstract class ElggEntity extends ElggData implements  	/**  	 * Import data from an parsed ODD xml data array.  	 * -	 * @param array $data XML data +	 * @param ODD $data XML data  	 *  	 * @return true +	 * +	 * @throws InvalidParameterException  	 */  	public function import(ODD $data) {  		if (!($data instanceof ODDEntity)) { @@ -1732,8 +1735,6 @@ abstract class ElggEntity extends ElggData implements  	 * @return array  	 */  	public function getTags($tag_names = NULL) { -		global $CONFIG; -  		if ($tag_names && !is_array($tag_names)) {  			$tag_names = array($tag_names);  		} diff --git a/engine/classes/ElggExtender.php b/engine/classes/ElggExtender.php index d94bad837..25aba354f 100644 --- a/engine/classes/ElggExtender.php +++ b/engine/classes/ElggExtender.php @@ -171,7 +171,7 @@ abstract class ElggExtender extends ElggData {  	public function export() {  		$uuid = get_uuid_from_object($this); -		$meta = new ODDMetadata($uuid, guid_to_uuid($this->entity_guid), $this->attributes['name'], +		$meta = new ODDMetaData($uuid, guid_to_uuid($this->entity_guid), $this->attributes['name'],  			$this->attributes['value'], $this->attributes['type'], guid_to_uuid($this->owner_guid));  		$meta->setAttribute('published', date("r", $this->time_created)); diff --git a/engine/classes/ElggFile.php b/engine/classes/ElggFile.php index f21621ffd..3e9c24c17 100644 --- a/engine/classes/ElggFile.php +++ b/engine/classes/ElggFile.php @@ -93,6 +93,7 @@ class ElggFile extends ElggObject {  			$container_guid = $this->container_guid;  		}  		$fs = $this->getFilestore(); +		// @todo add getSize() to ElggFilestore  		return $fs->getSize($prefix, $container_guid);  	} @@ -127,9 +128,11 @@ class ElggFile extends ElggObject {  	 * @param mixed $default A default. Useful to pass what the browser thinks it is.  	 * @since 1.7.12  	 * +	 * @note If $file is provided, this may be called statically +	 *  	 * @return mixed Detected type on success, false on failure.  	 */ -	static function detectMimeType($file = null, $default = null) { +	public function detectMimeType($file = null, $default = null) {  		if (!$file) {  			if (isset($this) && $this->filename) {  				$file = $this->filename; @@ -178,6 +181,8 @@ class ElggFile extends ElggObject {  	 * @param string $mode Either read/write/append  	 *  	 * @return resource File handler +	 * +	 * @throws IOException|InvalidParameterException  	 */  	public function open($mode) {  		if (!$this->getFilename()) { @@ -285,6 +290,7 @@ class ElggFile extends ElggObject {  	public function seek($position) {  		$fs = $this->getFilestore(); +		// @todo add seek() to ElggFilestore  		return $fs->seek($this->handle, $position);  	} @@ -347,6 +353,8 @@ class ElggFile extends ElggObject {  	 * a filestore as recorded in metadata or the system default.  	 *  	 * @return ElggFilestore +	 * +	 * @throws ClassNotFoundException  	 */  	protected function getFilestore() {  		// Short circuit if already set. @@ -359,7 +367,6 @@ class ElggFile extends ElggObject {  		// need to get all filestore::* metadata because the rest are "parameters" that  		// get passed to filestore::setParameters()  		if ($this->guid) { -			$db_prefix = elgg_get_config('dbprefix');  			$options = array(  				'guid' => $this->guid,  				'where' => array("n.string LIKE 'filestore::%'"), @@ -388,6 +395,7 @@ class ElggFile extends ElggObject {  			$this->filestore = new $filestore();  			$this->filestore->setParameters($parameters); +			// @todo explain why $parameters will always be set here (PhpStorm complains)  		}  		// this means the entity hasn't been saved so fallback to default diff --git a/engine/classes/ElggFileCache.php b/engine/classes/ElggFileCache.php index 34178d452..e654f1db2 100644 --- a/engine/classes/ElggFileCache.php +++ b/engine/classes/ElggFileCache.php @@ -13,6 +13,8 @@ class ElggFileCache extends ElggCache {  	 * @param string $cache_path The cache path.  	 * @param int    $max_age    Maximum age in seconds, 0 if no limit.  	 * @param int    $max_size   Maximum size of cache in seconds, 0 if no limit. +	 * +	 * @throws ConfigurationException  	 */  	function __construct($cache_path, $max_age = 0, $max_size = 0) {  		$this->setVariable("cache_path", $cache_path); diff --git a/engine/classes/ElggGroup.php b/engine/classes/ElggGroup.php index ea257f368..61f699f1a 100644 --- a/engine/classes/ElggGroup.php +++ b/engine/classes/ElggGroup.php @@ -32,7 +32,7 @@ class ElggGroup extends ElggEntity  	 * @param mixed $guid If an int, load that GUID.  	 * 	If an entity table db row, then will load the rest of the data.  	 * -	 * @throws Exception if there was a problem creating the group. +	 * @throws IOException|InvalidParameterException if there was a problem creating the group.  	 */  	function __construct($guid = null) {  		$this->initializeAttributes(); @@ -220,6 +220,7 @@ class ElggGroup extends ElggEntity  	 * @return array|false  	 */  	public function getObjects($subtype = "", $limit = 10, $offset = 0) { +		// @todo are we deprecating this method, too?  		return get_objects_in_group($this->getGUID(), $subtype, 0, 0, "", $limit, $offset, false);  	} @@ -233,6 +234,7 @@ class ElggGroup extends ElggEntity  	 * @return array|false  	 */  	public function getFriendsObjects($subtype = "", $limit = 10, $offset = 0) { +		// @todo are we deprecating this method, too?  		return get_objects_in_group($this->getGUID(), $subtype, 0, 0, "", $limit, $offset, false);  	} @@ -244,6 +246,7 @@ class ElggGroup extends ElggEntity  	 * @return array|false  	 */  	public function countObjects($subtype = "") { +		// @todo are we deprecating this method, too?  		return get_objects_in_group($this->getGUID(), $subtype, 0, 0, "", 10, 0, true);  	} @@ -284,7 +287,7 @@ class ElggGroup extends ElggEntity  	 *  	 * @return bool  	 */ -	public function isMember($user = 0) { +	public function isMember($user = null) {  		if (!($user instanceof ElggUser)) {  			$user = elgg_get_logged_in_user_entity();  		} diff --git a/engine/classes/ElggMemcache.php b/engine/classes/ElggMemcache.php index d9539b9cb..91d50ab89 100644 --- a/engine/classes/ElggMemcache.php +++ b/engine/classes/ElggMemcache.php @@ -32,6 +32,8 @@ class ElggMemcache extends ElggSharedMemoryCache {  	 *  	 * @param string $namespace The namespace for this cache to write to -  	 * note, namespaces of the same name are shared! +	 * +	 * @throws ConfigurationException  	 */  	function __construct($namespace = 'default') {  		global $CONFIG; diff --git a/engine/classes/ElggMenuBuilder.php b/engine/classes/ElggMenuBuilder.php index d9a704dd9..f6ec9dcd3 100644 --- a/engine/classes/ElggMenuBuilder.php +++ b/engine/classes/ElggMenuBuilder.php @@ -8,6 +8,9 @@   */  class ElggMenuBuilder { +	/** +	 * @var ElggMenuItem[] +	 */  	protected $menu = array();  	protected $selected = null; @@ -15,7 +18,7 @@ class ElggMenuBuilder {  	/**  	 * ElggMenuBuilder constructor  	 * -	 * @param array $menu Array of ElggMenuItem objects +	 * @param ElggMenuItem[] $menu Array of ElggMenuItem objects  	 */  	public function __construct(array $menu) {  		$this->menu = $menu; @@ -107,6 +110,7 @@ class ElggMenuBuilder {  			$children = array();  			// divide base nodes from children  			foreach ($section as $menu_item) { +				/* @var ElggMenuItem $menu_item */  				$parent_name = $menu_item->getParentName();  				if (!$parent_name) {  					$parents[$menu_item->getName()] = $menu_item; @@ -118,6 +122,7 @@ class ElggMenuBuilder {  			// attach children to parents  			$iteration = 0;  			$current_gen = $parents; +			$next_gen = null;  			while (count($children) && $iteration < 5) {  				foreach ($children as $index => $menu_item) {  					$parent_name = $menu_item->getParentName(); @@ -216,12 +221,12 @@ class ElggMenuBuilder {  				array_push($stack, $root);  				while (!empty($stack)) {  					$node = array_pop($stack); +					/* @var ElggMenuItem $node */  					$node->sortChildren($sort_callback);  					$children = $node->getChildren();  					if ($children) {  						$stack = array_merge($stack, $children);  					} -					$p = count($stack);  				}  			}  		} @@ -269,6 +274,8 @@ class ElggMenuBuilder {  	 * @param ElggMenuItem $a  	 * @param ElggMenuItem $b  	 * @return bool +	 * +	 * @todo change name to compareByPriority  	 */  	public static function compareByWeight($a, $b) {  		$aw = $a->getWeight(); diff --git a/engine/classes/ElggMetadata.php b/engine/classes/ElggMetadata.php index 7f45dc3ea..3a8e2d817 100644 --- a/engine/classes/ElggMetadata.php +++ b/engine/classes/ElggMetadata.php @@ -6,6 +6,10 @@   *   * @package    Elgg.Core   * @subpackage Metadata + * + * @property string $value_type + * @property int $owner_guid + * @property string $enabled   */  class ElggMetadata extends ElggExtender { diff --git a/engine/classes/ElggPlugin.php b/engine/classes/ElggPlugin.php index 8f71b79a8..ae447bddb 100644 --- a/engine/classes/ElggPlugin.php +++ b/engine/classes/ElggPlugin.php @@ -145,7 +145,7 @@ class ElggPlugin extends ElggObject {  	/**  	 * Sets the location of this plugin.  	 * -	 * @param path $id The path to the plugin's dir. +	 * @param string $id The path to the plugin's dir.  	 * @return bool  	 */  	public function setID($id) { @@ -597,6 +597,8 @@ class ElggPlugin extends ElggObject {  	 * Checks if this plugin can be activated on the current  	 * Elgg installation.  	 * +	 * @todo remove $site_guid param or implement it +	 *  	 * @param mixed $site_guid Optional site guid  	 * @return bool  	 */ diff --git a/engine/classes/ElggPluginPackage.php b/engine/classes/ElggPluginPackage.php index 2dc4bdb3d..209242288 100644 --- a/engine/classes/ElggPluginPackage.php +++ b/engine/classes/ElggPluginPackage.php @@ -100,7 +100,6 @@ class ElggPluginPackage {  	 * @param string $plugin   The ID (directory name) or full path of the plugin.  	 * @param bool   $validate Automatically run isValid()?  	 * -	 * @return true  	 * @throws PluginException  	 */  	public function __construct($plugin, $validate = true) { @@ -213,6 +212,7 @@ class ElggPluginPackage {  			return false;  		} +		// Note: $conflicts and $requires are not unused. They're called dynamically  		$conflicts = $this->getManifest()->getConflicts();  		$requires = $this->getManifest()->getRequires();  		$provides = $this->getManifest()->getProvides(); @@ -330,8 +330,10 @@ class ElggPluginPackage {  	 * @return bool|array  	 */  	public function checkDependencies($full_report = false) { +		// Note: $conflicts and $requires are not unused. They're called dynamically  		$requires = $this->getManifest()->getRequires();  		$conflicts = $this->getManifest()->getConflicts(); +  		$enabled_plugins = elgg_get_plugins('active');  		$this_id = $this->getID();  		$report = array(); @@ -368,6 +370,7 @@ class ElggPluginPackage {  		$check_types = array('requires', 'conflicts');  		if ($full_report) { +			// Note: $suggests is not unused. It's called dynamically  			$suggests = $this->getManifest()->getSuggests();  			$check_types[] = 'suggests';  		} diff --git a/engine/classes/ElggPriorityList.php b/engine/classes/ElggPriorityList.php index 8a3b836a8..b5f8fe163 100644 --- a/engine/classes/ElggPriorityList.php +++ b/engine/classes/ElggPriorityList.php @@ -89,7 +89,7 @@   *	return true;   * }   * - * @package Elgg.Core + * @package    Elgg.Core   * @subpackage Helpers   */  class ElggPriorityList @@ -126,7 +126,9 @@ class ElggPriorityList  	 *                        maintains its priority and the new element is to the next available  	 *                        slot, taking into consideration all previously registered elements.  	 *                        Negative elements are accepted. +	 * @param bool  $exact    unused  	 * @return int            The priority of the added element. +	 * @todo remove $exact or implement it. Note we use variable name strict below.  	 */  	public function add($element, $priority = null, $exact = false) {  		if ($priority !== null && !is_numeric($priority)) { @@ -146,7 +148,8 @@ class ElggPriorityList  	 * @warning The element must have the same attributes / values. If using $strict, it must have  	 *          the same types. array(10) will fail in strict against array('10') (str vs int).  	 * -	 * @param type $element +	 * @param mixed $element The element to remove from the list +	 * @param bool  $strict  Whether to check the type of the element match  	 * @return bool  	 */  	public function remove($element, $strict = false) { @@ -162,10 +165,10 @@ class ElggPriorityList  	/**  	 * Move an existing element to a new priority.  	 * -	 * @param mixed  $current_priority -	 * @param int    $new_priority -	 * -	 * @return int The new priority. +	 * @param mixed  $element      The element to move +	 * @param int    $new_priority The new priority for the element +	 * @param bool   $strict       Whether to check the type of the element match +	 * @return bool  	 */  	public function move($element, $new_priority, $strict = false) {  		$new_priority = (int) $new_priority; @@ -200,12 +203,12 @@ class ElggPriorityList  	 *  	 * If no user function is provided the elements are sorted by priority registered.  	 * -	 * The callback function should accept the array of elements as the first argument and should -	 * return a sorted array. +	 * The callback function should accept the array of elements as the first  +	 * argument and should return a sorted array.  	 *  	 * This function can be called multiple times.  	 * -	 * @param type $callback +	 * @param callback $callback The callback for sorting. Numeric sorting is the default.  	 * @return bool  	 */  	public function sort($callback = null) { @@ -268,7 +271,7 @@ class ElggPriorityList  	/**  	 * Returns the element at $priority.  	 * -	 * @param int $priority +	 * @param int $priority The priority  	 * @return mixed The element or false on fail.  	 */  	public function getElement($priority) { diff --git a/engine/classes/ElggRelationship.php b/engine/classes/ElggRelationship.php index efc0f7eff..d2e88882a 100644 --- a/engine/classes/ElggRelationship.php +++ b/engine/classes/ElggRelationship.php @@ -71,6 +71,7 @@ class ElggRelationship extends ElggData implements  	 * Save the relationship  	 *  	 * @return int the relationship id +	 * @throws IOException  	 */  	public function save() {  		if ($this->id > 0) { @@ -145,7 +146,7 @@ class ElggRelationship extends ElggData implements  	 * @param ODD $data ODD data  	 * @return bool -	 * @throws ImportException +	 * @throws ImportException|InvalidParameterException  	 */  	public function import(ODD $data) {  		if (!($data instanceof ODDRelationship)) { @@ -179,6 +180,8 @@ class ElggRelationship extends ElggData implements  				return true;  			}  		} + +		return false;  	}  	// SYSTEM LOG INTERFACE //////////////////////////////////////////////////////////// diff --git a/engine/classes/ElggSite.php b/engine/classes/ElggSite.php index 1fe49b85c..1a34df195 100644 --- a/engine/classes/ElggSite.php +++ b/engine/classes/ElggSite.php @@ -381,7 +381,9 @@ class ElggSite extends ElggEntity {  				elgg_register_plugin_hook_handler('index', 'system', 'elgg_walled_garden_index', 1);  				if (!$this->isPublicPage()) { -					$_SESSION['last_forward_from'] = current_page_url(); +					if (!elgg_is_xhr()) { +						$_SESSION['last_forward_from'] = current_page_url(); +					}  					register_error(elgg_echo('loggedinrequired'));  					forward();  				} @@ -443,8 +445,6 @@ class ElggSite extends ElggEntity {  		// include a hook for plugin authors to include public pages  		$plugins = elgg_trigger_plugin_hook('public_pages', 'walled_garden', NULL, array()); -		// lookup admin-specific public pages -  		// allow public pages  		foreach (array_merge($defaults, $plugins) as $public) {  			$pattern = "`^{$CONFIG->url}$public/*$`i"; diff --git a/engine/classes/ElggWidget.php b/engine/classes/ElggWidget.php index 99708f66a..c123e5032 100644 --- a/engine/classes/ElggWidget.php +++ b/engine/classes/ElggWidget.php @@ -7,6 +7,11 @@   *   * @package    Elgg.Core   * @subpackage Widgets + * + * @property-read string $handler internal, do not use + * @property-read string $column internal, do not use + * @property-read string $order internal, do not use + * @property-read string $context internal, do not use   */  class ElggWidget extends ElggObject { diff --git a/engine/classes/ElggXMLElement.php b/engine/classes/ElggXMLElement.php index 65a13912c..4e4b7e63c 100644 --- a/engine/classes/ElggXMLElement.php +++ b/engine/classes/ElggXMLElement.php @@ -32,7 +32,7 @@ class ElggXMLElement {  	}  	/** -	 * @return array:string The attributes +	 * @return string[] The attributes  	 */  	public function getAttributes() {  		//include namespace declarations as attributes @@ -64,7 +64,7 @@ class ElggXMLElement {  	}  	/** -	 * @return array:ElggXMLElement Child elements +	 * @return ElggXMLElement[] Child elements  	 */  	public function getChildren() {  		$children = $this->_element->children(); diff --git a/engine/classes/ODDMetaData.php b/engine/classes/ODDMetaData.php index 58862e0fb..09b653582 100644 --- a/engine/classes/ODDMetaData.php +++ b/engine/classes/ODDMetaData.php @@ -10,12 +10,12 @@ class ODDMetaData extends ODD {  	/**  	 * New ODD metadata  	 * -	 * @param unknown_type $uuid        Unique ID -	 * @param unknown_type $entity_uuid Another unique ID -	 * @param unknown_type $name        Name -	 * @param unknown_type $value       Value -	 * @param unknown_type $type        Type -	 * @param unknown_type $owner_uuid  Owner ID +	 * @param string $uuid        Unique ID +	 * @param string $entity_uuid Another unique ID +	 * @param string $name        Name +	 * @param string $value       Value +	 * @param string $type        Type +	 * @param string $owner_uuid  Owner ID  	 */  	function __construct($uuid, $entity_uuid, $name, $value, $type = "", $owner_uuid = "") {  		parent::__construct(); @@ -31,7 +31,7 @@ class ODDMetaData extends ODD {  	/**  	 * Returns 'metadata'  	 * -	 * @return 'metadata' +	 * @return string 'metadata'  	 */  	protected function getTagName() {  		return "metadata"; diff --git a/engine/classes/ODDRelationship.php b/engine/classes/ODDRelationship.php index 2906b1c73..8b1fe217b 100644 --- a/engine/classes/ODDRelationship.php +++ b/engine/classes/ODDRelationship.php @@ -10,9 +10,9 @@ class ODDRelationship extends ODD {  	/**  	 * New ODD Relationship  	 * -	 * @param unknown_type $uuid1 First UUID -	 * @param unknown_type $type  Type of telationship -	 * @param unknown_type $uuid2 Second UUId +	 * @param string $uuid1 First UUID +	 * @param string $type  Type of telationship +	 * @param string $uuid2 Second UUId  	 */  	function __construct($uuid1, $type, $uuid2) {  		parent::__construct(); @@ -25,7 +25,7 @@ class ODDRelationship extends ODD {  	/**  	 * Returns 'relationship'  	 * -	 * @return 'relationship' +	 * @return string 'relationship'  	 */  	protected function getTagName() {  		return "relationship"; 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/access.php b/engine/lib/access.php index f7d3bf7ea..de0693ea8 100644 --- a/engine/lib/access.php +++ b/engine/lib/access.php @@ -1015,6 +1015,10 @@ function access_init() {   *   * Returns true to override the access system or null if no change is needed.   * + * @param string $hook + * @param string $type + * @param bool $value + * @param array $params   * @return true|null   * @access private   */ @@ -1047,6 +1051,13 @@ function elgg_override_permissions($hook, $type, $value, $params) {  /**   * Runs unit tests for the entities object. + * + * @param string $hook + * @param string $type + * @param array $value + * @param array $params + * @return array + *   * @access private   */  function access_test($hook, $type, $value, $params) { 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/admin.php b/engine/lib/admin.php index 35ab5599d..ec19a5476 100644 --- a/engine/lib/admin.php +++ b/engine/lib/admin.php @@ -346,7 +346,7 @@ function elgg_admin_add_plugin_settings_menu() {  	$active_plugins = elgg_get_plugins('active');  	if (!$active_plugins) {  		// nothing added because no items -		return FALSE; +		return;  	}  	foreach ($active_plugins as $plugin) { @@ -380,6 +380,7 @@ function elgg_admin_add_plugin_settings_menu() {   */  function elgg_admin_sort_page_menu($hook, $type, $return, $params) {  	$configure_items = $return['configure']; +	/* @var ElggMenuItem[] $configure_items */  	foreach ($configure_items as $menu_item) {  		if ($menu_item->getName() == 'settings') {  			$settings = $menu_item; @@ -387,6 +388,7 @@ function elgg_admin_sort_page_menu($hook, $type, $return, $params) {  	}  	// keep the basic and advanced settings at the top +	/* @var ElggMenuItem $settings */  	$children = $settings->getChildren();  	$site_settings = array_splice($children, 0, 2);  	usort($children, array('ElggMenuBuilder', 'compareByText')); @@ -552,7 +554,7 @@ function admin_plugin_screenshot_page_handler($pages) {   *	* COPYRIGHT.txt   *	* LICENSE.txt   * - * @param type $page + * @param array $pages   * @return bool   * @access private   */ @@ -615,7 +617,11 @@ function admin_markdown_page_handler($pages) {  /**   * Adds default admin widgets to the admin dashboard.   * - * @return void + * @param string $event + * @param string $type + * @param ElggUser $user + * + * @return null|true   * @access private   */  function elgg_add_admin_widgets($event, $type, $user) { @@ -637,6 +643,7 @@ function elgg_add_admin_widgets($event, $type, $user) {  			$guid = elgg_create_widget($user->getGUID(), $handler, 'admin');  			if ($guid) {  				$widget = get_entity($guid); +				/* @var ElggWidget $widget */  				$widget->move($column, $position);  			}  		} diff --git a/engine/lib/annotations.php b/engine/lib/annotations.php index 3b9f84703..bd5ea1a1f 100644 --- a/engine/lib/annotations.php +++ b/engine/lib/annotations.php @@ -17,6 +17,7 @@   */  function row_to_elggannotation($row) {  	if (!($row instanceof stdClass)) { +		// @todo should throw in this case?  		return $row;  	} @@ -30,7 +31,7 @@ function row_to_elggannotation($row) {   *   * @param int $id The id of the annotation object being retrieved.   * - * @return false|ElggAnnotation + * @return ElggAnnotation|false   */  function elgg_get_annotation_from_id($id) {  	return elgg_get_metastring_based_object_from_id($id, 'annotations'); @@ -195,10 +196,22 @@ function update_annotation($annotation_id, $name, $value, $value_type, $owner_gu   *                                   for the proper use of the "calculation" option.   *   * - * @return mixed + * @return ElggAnnotation[]|mixed   * @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);  } @@ -424,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);  } @@ -441,19 +458,20 @@ function elgg_list_entities_from_annotation_calculation($options) {  }  /** - * Handler called by trigger_plugin_hook on the "export" event. + * Export the annotations for the specified entity   *   * @param string $hook        'export' - * @param string $entity_type 'all' + * @param string $type        'all'   * @param mixed  $returnvalue Default return value - * @param mixed  $params      List of params to export + * @param mixed  $params      Parameters determining what annotations to export   *   * @elgg_plugin_hook export all   * - * @return mixed + * @return array + * @throws InvalidParameterException   * @access private   */ -function export_annotation_plugin_hook($hook, $entity_type, $returnvalue, $params) { +function export_annotation_plugin_hook($hook, $type, $returnvalue, $params) {  	// Sanity check values  	if ((!is_array($params)) && (!isset($params['guid']))) {  		throw new InvalidParameterException(elgg_echo('InvalidParameterException:GUIDNotForExport')); @@ -464,12 +482,12 @@ function export_annotation_plugin_hook($hook, $entity_type, $returnvalue, $param  	}  	$guid = (int)$params['guid']; -	$name = $params['name']; +	$options = array('guid' => $guid, 'limit' => 0); +	if (isset($params['name'])) { +		$options['annotation_name'] = $params['name']; +	} -	$result = elgg_get_annotations(array( -		'guid' => $guid, -		'limit' => 0 -	)); +	$result = elgg_get_annotations($options);  	if ($result) {  		foreach ($result as $r) { @@ -541,6 +559,7 @@ function elgg_comment_url_handler(ElggAnnotation $comment) {  	if ($entity) {  		return $entity->getURL() . '#item-annotation-' . $comment->id;  	} +	return "";  }  /** @@ -557,6 +576,12 @@ function elgg_register_annotation_url_handler($extender_name = "all", $function_  /**   * Register annotation unit tests + * + * @param string $hook + * @param string $type + * @param array $value + * @param array $params + * @return array   * @access private   */  function annotations_test($hook, $type, $value, $params) { diff --git a/engine/lib/cache.php b/engine/lib/cache.php index be1c43e14..59359124e 100644 --- a/engine/lib/cache.php +++ b/engine/lib/cache.php @@ -125,7 +125,7 @@ function elgg_get_filepath_cache() {   * @access private   */  function elgg_filepath_cache_reset() { -	return elgg_reset_system_cache(); +	elgg_reset_system_cache();  }  /**   * @access private @@ -143,13 +143,13 @@ function elgg_filepath_cache_load($type) {   * @access private   */  function elgg_enable_filepath_cache() { -	return elgg_enable_system_cache(); +	elgg_enable_system_cache();  }  /**   * @access private   */  function elgg_disable_filepath_cache() { -	return elgg_disable_system_cache(); +	elgg_disable_system_cache();  }  /* Simplecache */ @@ -222,7 +222,7 @@ function elgg_get_simplecache_url($type, $view) {  /**   * Regenerates the simple cache.   * - * @warning This does not invalidate the cache, but actively resets it. + * @warning This does not invalidate the cache, but actively rebuilds it.   *   * @param string $viewtype Optional viewtype to regenerate. Defaults to all valid viewtypes.   * @@ -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/calendar.php b/engine/lib/calendar.php index 9a06c5292..e6f95934c 100644 --- a/engine/lib/calendar.php +++ b/engine/lib/calendar.php @@ -39,6 +39,8 @@ function get_day_end($day = null, $month = null, $year = null) {  /**   * Return the notable entities for a given time period.   * + * @todo this function also accepts an array(type => subtypes) for 3rd arg. Should we document this? + *   * @param int     $start_time     The start time as a unix timestamp.   * @param int     $end_time       The end time as a unix timestamp.   * @param string  $type           The type of entity (eg "user", "object" etc) diff --git a/engine/lib/configuration.php b/engine/lib/configuration.php index b10e51130..a0f297f0c 100644 --- a/engine/lib/configuration.php +++ b/engine/lib/configuration.php @@ -36,6 +36,7 @@ function elgg_get_site_url($site_guid = 0) {  	if (!$site instanceof ElggSite) {  		return false;  	} +	/* @var ElggSite $site */  	return $site->url;  } @@ -138,7 +139,7 @@ function elgg_set_config($name, $value) {  /**   * Save a configuration setting   * - * @param string $name      Configuration name (cannot be greater than 32 characters) + * @param string $name      Configuration name (cannot be greater than 255 characters)   * @param mixed  $value     Configuration value. Should be string for installation setting   * @param int    $site_guid NULL for installation setting, 0 for default site   * @@ -173,7 +174,7 @@ function elgg_save_config($name, $value, $site_guid = 0) {  /**   * Check that installation has completed and the database is populated.   * - * @throws InstallationException + * @throws InstallationException|DatabaseException   * @return void   * @access private   */ @@ -181,7 +182,7 @@ function verify_installation() {  	global $CONFIG;  	if (isset($CONFIG->installed)) { -		return $CONFIG->installed; +		return;  	}  	try { @@ -227,9 +228,9 @@ function datalist_get($name) {  	$name = trim($name); -	// cannot store anything longer than 32 characters in db, so catch here -	if (elgg_strlen($name) > 32) { -		elgg_log("The name length for configuration variables cannot be greater than 32", "ERROR"); +	// cannot store anything longer than 255 characters in db, so catch here +	if (elgg_strlen($name) > 255) { +		elgg_log("The name length for configuration variables cannot be greater than 255", "ERROR");  		return false;  	} @@ -286,7 +287,7 @@ function datalist_get($name) {  function datalist_set($name, $value) {  	global $CONFIG, $DATALIST_CACHE; -	// cannot store anything longer than 32 characters in db, so catch before we set +	// cannot store anything longer than 255 characters in db, so catch before we set  	if (elgg_strlen($name) > 255) {  		elgg_log("The name length for configuration variables cannot be greater than 255", "ERROR");  		return false; @@ -332,7 +333,7 @@ function datalist_set($name, $value) {   * This will cause the run once function to be run on all installations.  To perform   * additional upgrades, create new functions for each release.   * - * @warning The function name cannot be longer than 32 characters long due to + * @warning The function name cannot be longer than 255 characters long due to   * the current schema for the datalist table.   *   * @internal A datalist entry $functioname is created with the value of time(). @@ -407,7 +408,7 @@ function unset_config($name, $site_guid = 0) {   * @param string $value     Its value   * @param int    $site_guid Optionally, the GUID of the site (current site is assumed by default)   * - * @return 0 + * @return bool   * @todo The config table doens't have numeric primary keys so insert_data returns 0.   * @todo Use "INSERT ... ON DUPLICATE KEY UPDATE" instead of trying to delete then add.   * @see unset_config() @@ -419,9 +420,9 @@ function set_config($name, $value, $site_guid = 0) {  	$name = trim($name); -	// cannot store anything longer than 32 characters in db, so catch before we set -	if (elgg_strlen($name) > 32) { -		elgg_log("The name length for configuration variables cannot be greater than 32", "ERROR"); +	// cannot store anything longer than 255 characters in db, so catch before we set +	if (elgg_strlen($name) > 255) { +		elgg_log("The name length for configuration variables cannot be greater than 255", "ERROR");  		return false;  	} diff --git a/engine/lib/cron.php b/engine/lib/cron.php index f7a032f4a..4f3d05b93 100644 --- a/engine/lib/cron.php +++ b/engine/lib/cron.php @@ -26,11 +26,10 @@ function cron_init() {   * @param array $page Pages   *   * @return bool + * @throws CronException   * @access private   */  function cron_page_handler($page) { -	global $CONFIG; -  	if (!isset($page[0])) {  		forward();  	} @@ -51,7 +50,6 @@ function cron_page_handler($page) {  	$params['time'] = time();  	// Data to return to -	$std_out = "";  	$old_stdout = "";  	ob_start(); diff --git a/engine/lib/database.php b/engine/lib/database.php index 7d90b30b8..2b348366d 100644 --- a/engine/lib/database.php +++ b/engine/lib/database.php @@ -17,7 +17,9 @@   * $DB_QUERY_CACHE[$query] => array(result1, result2, ... resultN)   * </code>   * - * @global array $DB_QUERY_CACHE + * @warning be array this var may be an array or ElggStaticVariableCache depending on when called :( + * + * @global ElggStaticVariableCache|array $DB_QUERY_CACHE   */  global $DB_QUERY_CACHE;  $DB_QUERY_CACHE = array(); @@ -48,7 +50,7 @@ $DB_DELAYED_QUERIES = array();   * Each database link created with establish_db_link($name) is stored in   * $dblink as $dblink[$name] => resource.  Use get_db_link($name) to retrieve it.   * - * @global array $dblink + * @global resource[] $dblink   */  global $dblink;  $dblink = array(); @@ -72,11 +74,12 @@ $dbcalls = 0;   * resource. eg "read", "write", or "readwrite".   *   * @return void + * @throws DatabaseException   * @access private   */  function establish_db_link($dblinkname = "readwrite") {  	// Get configuration, and globalise database link -	global $CONFIG, $dblink, $DB_QUERY_CACHE, $dbcalls; +	global $CONFIG, $dblink, $DB_QUERY_CACHE;  	if ($dblinkname != "readwrite" && isset($CONFIG->db[$dblinkname])) {  		if (is_array($CONFIG->db[$dblinkname])) { @@ -120,6 +123,8 @@ function establish_db_link($dblinkname = "readwrite") {  	// Set up cache if global not initialized and query cache not turned off  	if ((!$DB_QUERY_CACHE) && (!$db_cache_off)) { +		// @todo everywhere else this is assigned to array(), making it dangerous to call +		// object methods on this. We should consider making this an plain array  		$DB_QUERY_CACHE = new ElggStaticVariableCache('db_query_cache');  	}  } @@ -134,7 +139,7 @@ function establish_db_link($dblinkname = "readwrite") {   * @access private   */  function setup_db_connections() { -	global $CONFIG, $dblink; +	global $CONFIG;  	if (!empty($CONFIG->db->split)) {  		establish_db_link('read'); @@ -197,7 +202,7 @@ function db_delayedexecution_shutdown_hook() {   *   * @param string $dblinktype The type of link we want: "read", "write" or "readwrite".   * - * @return object Database link + * @return resource Database link   * @access private   */  function get_db_link($dblinktype) { @@ -216,7 +221,7 @@ function get_db_link($dblinktype) {  /**   * Execute an EXPLAIN for $query.   * - * @param str   $query The query to explain + * @param string $query The query to explain   * @param mixed $link  The database link resource to user.   *   * @return mixed An object of the query's result, or FALSE @@ -240,14 +245,14 @@ function explain_query($query, $link) {   * {@link $dbcalls} is incremented and the query is saved into the {@link $DB_QUERY_CACHE}.   *   * @param string $query  The query - * @param link   $dblink The DB link + * @param resource   $dblink The DB link   * - * @return The result of mysql_query() + * @return resource result of mysql_query()   * @throws DatabaseException   * @access private   */  function execute_query($query, $dblink) { -	global $CONFIG, $dbcalls; +	global $dbcalls;  	if ($query == NULL) {  		throw new DatabaseException(elgg_echo('DatabaseException:InvalidQuery')); @@ -275,7 +280,7 @@ function execute_query($query, $dblink) {   * the raw result from {@link mysql_query()}.   *   * @param string   $query   The query to execute - * @param resource $dblink  The database link to use or the link type (read | write) + * @param resource|string $dblink  The database link to use or the link type (read | write)   * @param string   $handler A callback function to pass the results array to   *   * @return true @@ -386,7 +391,7 @@ function get_data_row($query, $callback = "") {   * @access private   */  function elgg_query_runner($query, $callback = null, $single = false) { -	global $CONFIG, $DB_QUERY_CACHE; +	global $DB_QUERY_CACHE;  	// Since we want to cache results of running the callback, we need to  	// need to namespace the query with the callback and single result request. @@ -410,7 +415,7 @@ function elgg_query_runner($query, $callback = null, $single = false) {  		// test for callback once instead of on each iteration.  		// @todo check profiling to see if this needs to be broken out into -		// explicit cases instead of checking in the interation. +		// explicit cases instead of checking in the iteration.  		$is_callable = is_callable($callback);  		while ($row = mysql_fetch_object($result)) {  			if ($is_callable) { @@ -451,7 +456,7 @@ function elgg_query_runner($query, $callback = null, $single = false) {   * @access private   */  function insert_data($query) { -	global $CONFIG, $DB_QUERY_CACHE; +	global $DB_QUERY_CACHE;  	elgg_log("DB query $query", 'NOTICE'); @@ -459,6 +464,7 @@ function insert_data($query) {  	// Invalidate query cache  	if ($DB_QUERY_CACHE) { +		/* @var ElggStaticVariableCache $DB_QUERY_CACHE */  		$DB_QUERY_CACHE->clear();  	} @@ -482,7 +488,7 @@ function insert_data($query) {   * @access private   */  function update_data($query) { -	global $CONFIG, $DB_QUERY_CACHE; +	global $DB_QUERY_CACHE;  	elgg_log("DB query $query", 'NOTICE'); @@ -490,6 +496,7 @@ function update_data($query) {  	// Invalidate query cache  	if ($DB_QUERY_CACHE) { +		/* @var ElggStaticVariableCache $DB_QUERY_CACHE */  		$DB_QUERY_CACHE->clear();  		elgg_log("Query cache invalidated", 'NOTICE');  	} @@ -512,7 +519,7 @@ function update_data($query) {   * @access private   */  function delete_data($query) { -	global $CONFIG, $DB_QUERY_CACHE; +	global $DB_QUERY_CACHE;  	elgg_log("DB query $query", 'NOTICE'); @@ -520,6 +527,7 @@ function delete_data($query) {  	// Invalidate query cache  	if ($DB_QUERY_CACHE) { +		/* @var ElggStaticVariableCache $DB_QUERY_CACHE */  		$DB_QUERY_CACHE->clear();  		elgg_log("Query cache invalidated", 'NOTICE');  	} @@ -638,7 +646,7 @@ function run_sql_script($scriptlocation) {  			$statement = str_replace("prefix_", $CONFIG->dbprefix, $statement);  			if (!empty($statement)) {  				try { -					$result = update_data($statement); +					update_data($statement);  				} catch (DatabaseException $e) {  					$errors[] = $e->getMessage();  				} diff --git a/engine/lib/deprecated-1.8.php b/engine/lib/deprecated-1.8.php index 4b9d41543..2b4ffcc4f 100644 --- a/engine/lib/deprecated-1.8.php +++ b/engine/lib/deprecated-1.8.php @@ -87,7 +87,7 @@ function list_entities_from_access_id($access_id, $entity_type = "", $entity_sub  	elgg_deprecated_notice("All list_entities* functions were deprecated in 1.8.  Use elgg_list_entities* instead.", 1.8);  	echo elgg_list_entities_from_access_id(array('access_id' => $access_id, -		'types' => $entity_type, 'subtypes' => $entity_subtype, 'owner_guids' => $owner_guid, +		'type' => $entity_type, 'subtype' => $entity_subtype, 'owner_guids' => $owner_guid,  		'limit' => $limit, 'full_view' => $fullview, 'list_type_toggle' => $listtypetoggle,  		'pagination' => $pagination,));  } @@ -1314,8 +1314,8 @@ function list_entities_from_metadata($meta_name, $meta_value = "", $entity_type  	$options = array(  		'metadata_name' => $meta_name,  		'metadata_value' => $meta_value, -		'types' => $entity_type, -		'subtypes' => $entity_subtype, +		'type' => $entity_type, +		'subtype' => $entity_subtype,  		'limit' => $limit,  		'offset' => $offset,  		'count' => TRUE, @@ -2120,8 +2120,8 @@ $fullview = true, $listtypetoggle = false, $pagination = true, $order_by = '') {  		'relationship' => $relationship,  		'relationship_guid' => $relationship_guid,  		'inverse_relationship' => $inverse_relationship, -		'types' => $type, -		'subtypes' => $subtype, +		'type' => $type, +		'subtype' => $subtype,  		'owner_guid' => $owner_guid,  		'order_by' => $order_by,  		'limit' => $limit, @@ -2566,9 +2566,9 @@ $owner_guid = "", $owner_relationship = "") {  				'relationship' => $owner_relationship,  				'relationship_guid' => $owner_guid[0],  				'inverse_relationship' => FALSE, -				'types' => 'user', -				'subtypes' => $subtype, -				'limit' => 9999)) +				'type' => 'user', +				'subtype' => $subtype, +				'limit' => false))  			) {  				$friendsarray = array(); @@ -2721,8 +2721,8 @@ function get_site_collections($site_guid, $subtype = "", $limit = 10, $offset =  		'relationship' => 'member_of_site',  		'relationship_guid' => $site_guid,  		'inverse_relationship' => TRUE, -		'types' => 'collection', -		'subtypes' => $subtype, +		'type' => 'collection', +		'subtype' => $subtype,  		'limit' => $limit,  		'offset' => $offset  	)); diff --git a/engine/lib/elgglib.php b/engine/lib/elgglib.php index 540605876..74b70f9fb 100644 --- a/engine/lib/elgglib.php +++ b/engine/lib/elgglib.php @@ -124,11 +124,10 @@ function elgg_load_library($name) {   * @param string $location URL to forward to browser to. Can be path relative to the network's URL.   * @param string $reason   Short explanation for why we're forwarding   * - * @return False False if headers have been sent. Terminates execution if forwarding. + * @return false False if headers have been sent. Terminates execution if forwarding. + * @throws SecurityException   */  function forward($location = "", $reason = 'system') { -	global $CONFIG; -  	if (!headers_sent()) {  		if ($location === REFERER) {  			$location = $_SERVER['HTTP_REFERER']; @@ -384,7 +383,7 @@ function elgg_load_external_file($type, $name) {  		$item->url = '';  		$item->location = ''; -		$priority = $CONFIG->externals[$type]->add($item); +		$CONFIG->externals[$type]->add($item);  		$CONFIG->externals_map[$type][$name] = $item;  	}  } @@ -528,7 +527,7 @@ function sanitise_filepath($path, $append_slash = TRUE) {   * @param string $register Types of message: "error", "success" (default: success)   * @param bool   $count    Count the number of messages (default: false)   * - * @return true|false|array Either the array of messages, or a response regarding + * @return bool|array Either the array of messages, or a response regarding   *                          whether the message addition was successful.   * @todo Clean up. Separate registering messages and retrieving them.   */ @@ -562,7 +561,7 @@ function system_messages($message = null, $register = "success", $count = false)  			return sizeof($_SESSION['msg'][$register]);  		} else {  			$count = 0; -			foreach ($_SESSION['msg'] as $register => $submessages) { +			foreach ($_SESSION['msg'] as $submessages) {  				$count += sizeof($submessages);  			}  			return $count; @@ -839,7 +838,7 @@ function elgg_trigger_event($event, $object_type, $object = null) {   *   * @param string   $hook     The name of the hook   * @param string   $type     The type of the hook - * @param callback $callback The name of a valid function or an array with object and method + * @param callable $callback The name of a valid function or an array with object and method   * @param int      $priority The priority - 500 is default, lower numbers called first   *   * @return bool @@ -885,7 +884,7 @@ function elgg_register_plugin_hook_handler($hook, $type, $callback, $priority =   *   * @param string   $hook        The name of the hook   * @param string   $entity_type The name of the type of entity (eg "user", "object" etc) - * @param callback $callback    The PHP callback to be removed + * @param callable $callback    The PHP callback to be removed   *   * @return void   * @since 1.8.0 @@ -1060,6 +1059,7 @@ function _elgg_php_exception_handler($exception) {   * @param array  $vars     An array that points to the active symbol table where error occurred   *   * @return true + * @throws Exception   * @access private   * @todo Replace error_log calls with elgg_log calls.   */ @@ -1292,8 +1292,6 @@ function elgg_deprecated_notice($msg, $dep_version, $backtrace_level = 1) {   * @return string The current page URL.   */  function current_page_url() { -	global $CONFIG; -  	$url = parse_url(elgg_get_site_url());  	$page = $url['scheme'] . "://"; @@ -1354,7 +1352,7 @@ function full_url() {   * @param array $parts       Associative array of URL components like parse_url() returns   * @param bool  $html_encode HTML Encode the url?   * - * @return str Full URL + * @return string Full URL   * @since 1.7.0   */  function elgg_http_build_url(array $parts, $html_encode = TRUE) { @@ -1385,10 +1383,10 @@ function elgg_http_build_url(array $parts, $html_encode = TRUE) {   * add tokens to the action.  The form view automatically handles   * tokens.   * - * @param str  $url         Full action URL + * @param string  $url         Full action URL   * @param bool $html_encode HTML encode the url? (default: false)   * - * @return str URL with action tokens + * @return string URL with action tokens   * @since 1.7.0   * @link http://docs.elgg.org/Tutorials/Actions   */ @@ -1440,17 +1438,17 @@ 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;  }  /**   * Adds an element or elements to a URL's query string.   * - * @param str   $url      The URL + * @param string $url      The URL   * @param array $elements Key/value pairs to add to the URL   * - * @return str The new URL with the query strings added + * @return string The new URL with the query strings added   * @since 1.7.0   */  function elgg_http_add_url_query_elements($url, array $elements) { @@ -1487,8 +1485,6 @@ function elgg_http_add_url_query_elements($url, array $elements) {   * @since 1.8.0   */  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.  	// @todo use elgg_normalize_url()  	if (elgg_substr($url1, 0, 1) == '/') { @@ -1627,7 +1623,7 @@ $sort_type = SORT_LOCALE_STRING) {  	$sort = array(); -	foreach ($array as $k => $v) { +	foreach ($array as $v) {  		if (isset($v[$element])) {  			$sort[] = strtolower($v[$element]);  		} else { @@ -1646,7 +1642,7 @@ $sort_type = SORT_LOCALE_STRING) {   *   * @param string $ini_get_arg The INI setting   * - * @return true|false Depending on whether it's on or off + * @return bool Depending on whether it's on or off   */  function ini_get_bool($ini_get_arg) {  	$temp = strtolower(ini_get($ini_get_arg)); @@ -1662,7 +1658,7 @@ function ini_get_bool($ini_get_arg) {   *   * @tip Use this for arithmetic when determining if a file can be uploaded.   * - * @param str $setting The php.ini setting + * @param string $setting The php.ini setting   *   * @return int   * @since 1.7.0 @@ -1677,8 +1673,10 @@ function elgg_get_ini_setting_in_bytes($setting) {  	switch($last) {  		case 'g':  			$val *= 1024; +			// fallthrough intentional  		case 'm':  			$val *= 1024; +			// fallthrough intentional  		case 'k':  			$val *= 1024;  	} @@ -1835,7 +1833,7 @@ function elgg_ajax_page_handler($page) {   *   * @param array $page The page array   * - * @return void + * @return bool   * @elgg_pagehandler css   * @access private   */ @@ -1899,6 +1897,7 @@ function elgg_cacheable_view_page_handler($page, $type) {  		echo $return;  		return true;  	} +	return false;  }  /** @@ -2220,7 +2219,7 @@ function elgg_init() {   * @param array  $params empty   *   * @elgg_plugin_hook unit_tests system - * @return void + * @return array   * @access private   */  function elgg_api_test($hook, $type, $value, $params) { @@ -2232,7 +2231,7 @@ function elgg_api_test($hook, $type, $value, $params) {  }  /**#@+ - * Controlls access levels on ElggEntity entities, metadata, and annotations. + * Controls access levels on ElggEntity entities, metadata, and annotations.   *   * @var int   */ @@ -2266,7 +2265,7 @@ define('ELGG_ENTITIES_NO_VALUE', 0);   * referring page.   *   * @see forward - * @var unknown_type + * @var int -1   */  define('REFERRER', -1); diff --git a/engine/lib/entities.php b/engine/lib/entities.php index ce736ce05..156eec040 100644 --- a/engine/lib/entities.php +++ b/engine/lib/entities.php @@ -531,6 +531,7 @@ function can_write_to_container($user_guid = 0, $container_guid = 0, $type = 'al  		// If still not approved, see if the user is a member of the group  		// @todo this should be moved to the groups plugin/library  		if (!$return && $user && $container instanceof ElggGroup) { +			/* @var ElggGroup $container */  			if ($container->isMember($user)) {  				$return = true;  			} @@ -1119,16 +1120,17 @@ function _elgg_fetch_entities_from_sql($sql) {  	// Do secondary queries and merge rows  	if ($lookup_types) {  		$dbprefix = elgg_get_config('dbprefix'); -	} -	foreach ($lookup_types as $type => $guids) { -		$set = "(" . implode(',', $guids) . ")"; -		$sql = "SELECT * FROM {$dbprefix}{$type}s_entity WHERE guid IN $set"; -		$secondary_rows = get_data($sql); -		if ($secondary_rows) { -			foreach ($secondary_rows as $secondary_row) { -				$key = $guid_to_key[$secondary_row->guid]; -				// cast to arrays to merge then cast back -				$rows[$key] = (object)array_merge((array)$rows[$key], (array)$secondary_row); + +		foreach ($lookup_types as $type => $guids) { +			$set = "(" . implode(',', $guids) . ")"; +			$sql = "SELECT * FROM {$dbprefix}{$type}s_entity WHERE guid IN $set"; +			$secondary_rows = get_data($sql); +			if ($secondary_rows) { +				foreach ($secondary_rows as $secondary_row) { +					$key = $guid_to_key[$secondary_row->guid]; +					// cast to arrays to merge then cast back +					$rows[$key] = (object)array_merge((array)$rows[$key], (array)$secondary_row); +				}  			}  		}  	} @@ -1217,13 +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) -					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; +						}  					}  				} @@ -1459,11 +1472,13 @@ function elgg_list_entities(array $options = array(), $getter = 'elgg_get_entiti   *   * @tip Use this to generate a list of archives by month for when entities were added or updated.   * + * @todo document how to pass in array for $subtype + *   * @warning Months are returned in the form YYYYMM.   *   * @param string $type           The type of entity   * @param string $subtype        The subtype of entity - * @param int    $container_guid The container GUID that the entinties belong to + * @param int    $container_guid The container GUID that the entities belong to   * @param int    $site_guid      The site GUID   * @param string $order_by       Order_by SQL order by clause   * @@ -2413,6 +2428,7 @@ function elgg_instanceof($entity, $type = NULL, $subtype = NULL, $class = NULL)  	$return = ($entity instanceof ElggEntity);  	if ($type) { +		/* @var ElggEntity $entity */  		$return = $return && ($entity->getType() == $type);  	} diff --git a/engine/lib/export.php b/engine/lib/export.php index ae9be95ce..ecc894e63 100644 --- a/engine/lib/export.php +++ b/engine/lib/export.php @@ -11,7 +11,7 @@   *   * @param mixed $object The object either an ElggEntity, ElggRelationship or ElggExtender   * - * @return the UUID or false + * @return string|false the UUID or false   */  function get_uuid_from_object($object) {  	if ($object instanceof ElggEntity) { @@ -40,8 +40,6 @@ function get_uuid_from_object($object) {   * @return string   */  function guid_to_uuid($guid) { -	global $CONFIG; -  	return elgg_get_site_url()  . "export/opendd/$guid/";  } @@ -53,8 +51,6 @@ function guid_to_uuid($guid) {   * @return bool   */  function is_uuid_this_domain($uuid) { -	global $CONFIG; -  	if (strpos($uuid, elgg_get_site_url()) === 0) {  		return true;  	} @@ -67,7 +63,7 @@ function is_uuid_this_domain($uuid) {   *   * @param string $uuid A unique ID   * - * @return mixed + * @return ElggEntity|false   */  function get_entity_from_uuid($uuid) {  	$uuid = sanitise_string($uuid); @@ -117,18 +113,19 @@ function _process_element(ODD $odd) {  	global $IMPORTED_DATA, $IMPORTED_OBJECT_COUNTER;  	// See if anyone handles this element, return true if it is. +	$to_be_serialised = null;  	if ($odd) {  		$handled = elgg_trigger_plugin_hook("import", "all", array("element" => $odd), $to_be_serialised); -	} -	// If not, then see if any of its sub elements are handled -	if ($handled) { -		// Increment validation counter -		$IMPORTED_OBJECT_COUNTER ++; -		// Return the constructed object -		$IMPORTED_DATA[] = $handled; +		// If not, then see if any of its sub elements are handled +		if ($handled) { +			// Increment validation counter +			$IMPORTED_OBJECT_COUNTER ++; +			// Return the constructed object +			$IMPORTED_DATA[] = $handled; -		return true; +			return true; +		}  	}  	return false; @@ -167,7 +164,7 @@ function exportAsArray($guid) {   *   * @param int $guid The GUID.   * - * @return xml + * @return string XML   * @see ElggEntity for an example of its usage.   * @access private   */ @@ -184,7 +181,7 @@ function export($guid) {   * @param string $xml XML string   *   * @return bool - * @throws Exception if there was a problem importing the data. + * @throws ImportException if there was a problem importing the data.   * @access private   */  function import($xml) { diff --git a/engine/lib/extender.php b/engine/lib/extender.php index 538f601e1..8756e051b 100644 --- a/engine/lib/extender.php +++ b/engine/lib/extender.php @@ -86,6 +86,7 @@ function oddmetadata_to_elggextender(ElggEntity $entity, ODDMetaData $element) {   * @return null   * @elgg_plugin_hook_handler volatile metadata   * @todo investigate more. + * @throws ImportException   * @access private   */  function import_extender_plugin_hook($hook, $entity_type, $returnvalue, $params) { @@ -94,6 +95,7 @@ function import_extender_plugin_hook($hook, $entity_type, $returnvalue, $params)  	$tmp = NULL;  	if ($element instanceof ODDMetaData) { +		/* @var ODDMetaData $element */  		// Recall entity  		$entity_uuid = $element->getAttribute('entity_uuid');  		$entity = get_entity_from_uuid($entity_uuid); diff --git a/engine/lib/filestore.php b/engine/lib/filestore.php index 93a127257..a3c7ba439 100644 --- a/engine/lib/filestore.php +++ b/engine/lib/filestore.php @@ -308,8 +308,6 @@ function get_image_resize_parameters($width, $height, $options) {  function file_delete($guid) {  	if ($file = get_entity($guid)) {  		if ($file->canEdit()) { -			$container = get_entity($file->container_guid); -  			$thumbnail = $file->thumbnail;  			$smallthumb = $file->smallthumb;  			$largethumb = $file->largethumb; @@ -383,7 +381,7 @@ function file_get_general_file_type($mimetype) {  /**   * Delete a directory and all its contents   * - * @param str $directory Directory to delete + * @param string $directory Directory to delete   *   * @return bool   */ @@ -500,7 +498,7 @@ function filestore_init() {  /**   * Unit tests for files   * - * @param sting  $hook   unit_test + * @param string  $hook   unit_test   * @param string $type   system   * @param mixed  $value  Array of tests   * @param mixed  $params Params diff --git a/engine/lib/group.php b/engine/lib/group.php index 5a38e1ea6..624029d98 100644 --- a/engine/lib/group.php +++ b/engine/lib/group.php @@ -170,7 +170,7 @@ function get_group_members($group_guid, $limit = 10, $offset = 0, $site_guid = 0  		'relationship' => 'member',  		'relationship_guid' => $group_guid,  		'inverse_relationship' => TRUE, -		'types' => 'user', +		'type' => 'user',  		'limit' => $limit,  		'offset' => $offset,  		'count' => $count, diff --git a/engine/lib/input.php b/engine/lib/input.php index 6d1646e1a..2d9bae4dd 100644 --- a/engine/lib/input.php +++ b/engine/lib/input.php @@ -226,6 +226,8 @@ function elgg_clear_sticky_value($form_name, $variable) {  /**   * Page handler for autocomplete endpoint.   * + * @todo split this into functions/objects, this is way too big + *   * /livesearch?q=<query>   *   * Other options include: @@ -233,6 +235,7 @@ function elgg_clear_sticky_value($form_name, $variable) {   *     match_owner int    0/1   *     limit       int    default is 10   * + * @param array $page   * @return string JSON string is returned and then exit   * @access private   */ @@ -265,10 +268,8 @@ function input_livesearch_page_handler($page) {  	}  	if (get_input('match_owner', false)) { -		$owner_guid = $user->getGUID();  		$owner_where = 'AND e.owner_guid = ' . $user->getGUID();  	} else { -		$owner_guid = null;  		$owner_where = '';  	} @@ -289,7 +290,9 @@ function input_livesearch_page_handler($page) {  				if ($entities = get_data($query)) {  					foreach ($entities as $entity) { +						// @todo use elgg_get_entities (don't query in a loop!)  						$entity = get_entity($entity->guid); +						/* @var ElggUser $entity */  						if (!$entity) {  							continue;  						} @@ -338,7 +341,9 @@ function input_livesearch_page_handler($page) {  				";  				if ($entities = get_data($query)) {  					foreach ($entities as $entity) { +						// @todo use elgg_get_entities (don't query in a loop!)  						$entity = get_entity($entity->guid); +						/* @var ElggGroup $entity */  						if (!$entity) {  							continue;  						} @@ -385,7 +390,9 @@ function input_livesearch_page_handler($page) {  				if ($entities = get_data($query)) {  					foreach ($entities as $entity) { +						// @todo use elgg_get_entities (don't query in a loop!)  						$entity = get_entity($entity->guid); +						/* @var ElggUser $entity */  						if (!$entity) {  							continue;  						} diff --git a/engine/lib/languages.php b/engine/lib/languages.php index 98006f7cd..17db14d98 100644 --- a/engine/lib/languages.php +++ b/engine/lib/languages.php @@ -77,7 +77,7 @@ function elgg_echo($message_key, $args = array(), $language = "") {   * @param string $country_code   Standard country code (eg 'en', 'nl', 'es')   * @param array  $language_array Formatted array of strings   * - * @return true|false Depending on success + * @return bool Depending on success   */  function add_translation($country_code, $language_array) {  	global $CONFIG; @@ -104,8 +104,6 @@ function add_translation($country_code, $language_array) {   * @return string The language code for the site/user or "en" if not set   */  function get_current_language() { -	global $CONFIG; -  	$language = get_language();  	if (!$language) { @@ -148,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 { @@ -177,7 +175,7 @@ function _elgg_load_translations() {   * @param bool   $load_all If true all languages are loaded, if   *                         false only the current language + en are loaded   * - * @return void + * @return bool success   */  function register_translations($path, $load_all = false) {  	global $CONFIG; @@ -229,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; @@ -337,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/location.php b/engine/lib/location.php index 5b889509b..b319bb3bb 100644 --- a/engine/lib/location.php +++ b/engine/lib/location.php @@ -101,7 +101,7 @@ function elgg_get_entities_from_location(array $options = array()) {  	$long_min = $long - $long_distance;  	$long_max = $long + $long_distance; -	$where = array(); +	$wheres = array();  	$wheres[] = "lat_name.string='geo:lat'";  	$wheres[] = "lat_value.string >= $lat_min";  	$wheres[] = "lat_value.string <= $lat_max"; diff --git a/engine/lib/mb_wrapper.php b/engine/lib/mb_wrapper.php index c2f5503e0..68fa69005 100644 --- a/engine/lib/mb_wrapper.php +++ b/engine/lib/mb_wrapper.php @@ -11,7 +11,7 @@ if (is_callable('mb_internal_encoding')) {   * NOTE: This differs from parse_str() by returning the results   * instead of placing them in the local scope!   * - * @param str $str The string + * @param string $str The string   *   * @return array   * @since 1.7.0 diff --git a/engine/lib/metadata.php b/engine/lib/metadata.php index f76c20f24..305e9918b 100644 --- a/engine/lib/metadata.php +++ b/engine/lib/metadata.php @@ -277,10 +277,18 @@ $access_id = ACCESS_PRIVATE, $allow_multiple = false) {   *                                   all metadata that match the query instead of returning   *                                   ElggMetadata objects.   * - * @return mixed + * @return ElggMetadata[]|mixed   * @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;  }  /** @@ -412,7 +423,7 @@ function elgg_enable_metadata(array $options) {   *   *  metadata_owner_guids => NULL|ARR guids for metadata owners   * - * @return mixed If count, int. If not count, array. false on errors. + * @return ElggEntity[]|mixed If count, int. If not count, array. false on errors.   * @since 1.7.0   */  function elgg_get_entities_from_metadata(array $options = array()) { @@ -461,7 +472,7 @@ function elgg_get_entities_from_metadata(array $options = array()) {   * @param array|null $order_by_metadata Array of names / direction   * @param array|null $owner_guids       Array of owner GUIDs   * - * @return FALSE|array False on fail, array('joins', 'wheres') + * @return false|array False on fail, array('joins', 'wheres')   * @since 1.7.0   * @access private   */ @@ -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 cf6dd4d98..f49b4a163 100644 --- a/engine/lib/metastrings.php +++ b/engine/lib/metastrings.php @@ -67,7 +67,7 @@ function get_metastring_id($string, $case_sensitive = TRUE) {  	}  	$row = FALSE; -	$metaStrings = get_data($query, "entity_row_to_elggstar"); +	$metaStrings = get_data($query);  	if (is_array($metaStrings)) {  		if (sizeof($metaStrings) > 1) {  			$ids = array(); @@ -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. @@ -520,9 +515,6 @@ function elgg_get_metastring_sql($table, $names = null, $values = null,  	$db_prefix = elgg_get_config('dbprefix'); -	// join counter for incremental joins. -	$i = 1; -  	// binary forces byte-to-byte comparision of strings, making  	// it case- and diacritical-mark- sensitive.  	// only supported on values. @@ -663,9 +655,10 @@ function elgg_normalize_metastrings_options(array $options = array()) {   *   * @param int    $id      The object's ID   * @param string $enabled Value to set to: yes or no - * @param string $type    The type of table to use: metadata or anntations + * @param string $type    The type of table to use: metadata or annotations   *   * @return bool + * @throws InvalidParameterException   * @since 1.8.0   * @access private   */ @@ -740,7 +733,7 @@ function elgg_batch_metastring_based_objects(array $options, $callback, $inc_off   *   * @param int    $id   The metastring-based object's ID   * @param string $type The type: annotation or metadata - * @return mixed + * @return ElggMetadata|ElggAnnotation   *   * @since 1.8.0   * @access private @@ -806,6 +799,7 @@ function elgg_delete_metastring_based_object_by_id($id, $type) {  			}  			if ($metabyname_memcache) { +				// @todo why name_id? is that even populated?  				$metabyname_memcache->delete("{$obj->entity_guid}:{$obj->name_id}");  			}  		} diff --git a/engine/lib/navigation.php b/engine/lib/navigation.php index 86624cd7c..118a7214c 100644 --- a/engine/lib/navigation.php +++ b/engine/lib/navigation.php @@ -126,6 +126,7 @@ function elgg_unregister_menu_item($menu_name, $item_name) {  	}  	foreach ($CONFIG->menus[$menu_name] as $index => $menu_object) { +		/* @var ElggMenuItem $menu_object */  		if ($menu_object->getName() == $item_name) {  			unset($CONFIG->menus[$menu_name][$index]);  			return true; @@ -151,7 +152,8 @@ function elgg_is_menu_item_registered($menu_name, $item_name) {  		return false;  	} -	foreach ($CONFIG->menus[$menu_name] as $index => $menu_object) { +	foreach ($CONFIG->menus[$menu_name] as $menu_object) { +		/* @var ElggMenuItem $menu_object */  		if ($menu_object->getName() == $item_name) {  			return true;  		} @@ -311,8 +313,8 @@ function elgg_site_menu_setup($hook, $type, $return, $params) {  	// check if we have anything selected  	$selected = false; -	foreach ($return as $section_name => $section) { -		foreach ($section as $key => $item) { +	foreach ($return as $section) { +		foreach ($section as $item) {  			if ($item->getSelected()) {  				$selected = true;  				break 2; @@ -345,6 +347,7 @@ function elgg_site_menu_setup($hook, $type, $return, $params) {  function elgg_river_menu_setup($hook, $type, $return, $params) {  	if (elgg_is_logged_in()) {  		$item = $params['item']; +		/* @var ElggRiverItem $item */  		$object = $item->getObjectEntity();  		// comments and non-objects cannot be commented on or liked  		if (!elgg_in_context('widgets') && $item->annotation_id == 0) { @@ -388,6 +391,7 @@ function elgg_entity_menu_setup($hook, $type, $return, $params) {  	}  	$entity = $params['entity']; +	/* @var ElggEntity $entity */  	$handler = elgg_extract('handler', $params, false);  	// access @@ -433,6 +437,7 @@ function elgg_entity_menu_setup($hook, $type, $return, $params) {  function elgg_widget_menu_setup($hook, $type, $return, $params) {  	$widget = $params['entity']; +	/* @var ElggWidget $widget */  	$show_edit = elgg_extract('show_edit', $params, true);  	$collapse = array( @@ -481,6 +486,7 @@ function elgg_widget_menu_setup($hook, $type, $return, $params) {   */  function elgg_annotation_menu_setup($hook, $type, $return, $params) {  	$annotation = $params['annotation']; +	/* @var ElggAnnotation $annotation */  	if ($annotation->name == 'generic_comment' && $annotation->canEdit()) {  		$url = elgg_http_add_url_query_elements('action/comments/delete', array( diff --git a/engine/lib/notification.php b/engine/lib/notification.php index 9e3c075a8..b6399b3c6 100644 --- a/engine/lib/notification.php +++ b/engine/lib/notification.php @@ -86,7 +86,7 @@ function unregister_notification_handler($method) {   * @throws NotificationException   */  function notify_user($to, $from, $subject, $message, array $params = NULL, $methods_override = "") { -	global $NOTIFICATION_HANDLERS, $CONFIG; +	global $NOTIFICATION_HANDLERS;  	// Sanitise  	if (!is_array($to)) { @@ -174,7 +174,8 @@ function get_user_notification_settings($user_guid = 0) {  		$user_guid = elgg_get_logged_in_user_guid();  	} -	// @todo: holy crap, really? +	// @todo: there should be a better way now that metadata is cached. E.g. just query for MD names, then +	// query user object directly  	$all_metadata = elgg_get_metadata(array(  		'guid' => $user_guid,  		'limit' => 0 @@ -237,6 +238,7 @@ function set_user_notification_setting($user_guid, $method, $value) {   * @param array      $params  Optional parameters (none taken in this instance)   *   * @return bool + * @throws NotificationException   * @access private   */  function email_notify_handler(ElggEntity $from, ElggUser $to, $subject, $message, @@ -263,7 +265,7 @@ array $params = NULL) {  	$to = $to->email;  	// From -	$site = get_entity($CONFIG->site_guid); +	$site = elgg_get_site_entity();  	// If there's an email address, use it - but only if its not from a user.  	if (!($from instanceof ElggUser) && $from->email) {  		$from = $from->email; @@ -288,6 +290,7 @@ array $params = NULL) {   * @param array  $params  Optional parameters (none used in this function)   *   * @return bool + * @throws NotificationException   * @since 1.7.2   */  function elgg_send_email($from, $to, $subject, $body, array $params = NULL) { @@ -344,6 +347,8 @@ function elgg_send_email($from, $to, $subject, $body, array $params = NULL) {  	// Sanitise subject by stripping line endings  	$subject = preg_replace("/(\r\n|\r|\n)/", " ", $subject); +	// this is because Elgg encodes everything and matches what is done with body +	$subject = html_entity_decode($subject, ENT_COMPAT, 'UTF-8'); // Decode any html entities  	if (is_callable('mb_encode_mimeheader')) {  		$subject = mb_encode_mimeheader($subject, "UTF-8", "B");  	} @@ -422,7 +427,7 @@ function register_notification_object($entity_type, $object_subtype, $language_n   * @param int $user_guid   The GUID of the user who wants to follow a user's content   * @param int $author_guid The GUID of the user whose content the user wants to follow   * - * @return true|false Depending on success + * @return bool Depending on success   */  function register_notification_interest($user_guid, $author_guid) {  	return add_entity_relationship($user_guid, 'notify', $author_guid); @@ -434,7 +439,7 @@ function register_notification_interest($user_guid, $author_guid) {   * @param int $user_guid   The GUID of the user who is following a user's content   * @param int $author_guid The GUID of the user whose content the user wants to unfollow   * - * @return true|false Depending on success + * @return bool Depending on success   */  function remove_notification_interest($user_guid, $author_guid) {  	return remove_entity_relationship($user_guid, 'notify', $author_guid); @@ -450,12 +455,13 @@ function remove_notification_interest($user_guid, $author_guid) {   * @param string $object_type mixed   * @param mixed  $object      The object created   * - * @return void + * @return bool   * @access private   */  function object_notifications($event, $object_type, $object) {  	// We only want to trigger notification events for ElggEntities  	if ($object instanceof ElggEntity) { +		/* @var ElggEntity $object */  		// Get config data  		global $CONFIG, $SESSION, $NOTIFICATION_HANDLERS; @@ -492,9 +498,10 @@ function object_notifications($event, $object_type, $object) {  					'relationship' => 'notify' . $method,  					'relationship_guid' => $object->container_guid,  					'inverse_relationship' => TRUE, -					'types' => 'user', -					'limit' => 99999 +					'type' => 'user', +					'limit' => false  				)); +				/* @var ElggUser[] $interested_users */  				if ($interested_users && is_array($interested_users)) {  					foreach ($interested_users as $user) { diff --git a/engine/lib/objects.php b/engine/lib/objects.php index e5e8f67c4..ff3cc733f 100644 --- a/engine/lib/objects.php +++ b/engine/lib/objects.php @@ -93,16 +93,16 @@ function get_object_sites($object_guid, $limit = 10, $offset = 0) {  	return elgg_get_entities_from_relationship(array(  		'relationship' => 'member_of_site',  		'relationship_guid' => $object_guid, -		'types' => 'site', +		'type' => 'site',  		'limit' => $limit, -		'offset' => $offset +		'offset' => $offset,  	));  }  /**   * Runs unit tests for ElggObject   * - * @param sting  $hook   unit_test + * @param string  $hook   unit_test   * @param string $type   system   * @param mixed  $value  Array of tests   * @param mixed  $params Params diff --git a/engine/lib/output.php b/engine/lib/output.php index 9295f2173..da8e1ab86 100644 --- a/engine/lib/output.php +++ b/engine/lib/output.php @@ -12,7 +12,7 @@   *   * @param string $text The input string   * - * @return string The output stirng with formatted links + * @return string The output string with formatted links   **/  function parse_urls($text) {  	// @todo this causes problems with <attr = "val"> @@ -224,7 +224,6 @@ function elgg_normalize_url($url) {  	$php_5_3_0_to_5_3_2 = version_compare(PHP_VERSION, '5.3.0', '>=') &&  			version_compare(PHP_VERSION, '5.3.3', '<'); -	$validated = false;  	if ($php_5_2_13_and_below || $php_5_3_0_to_5_3_2) {  		$tmp_address = str_replace("-", "", $url);  		$validated = filter_var($tmp_address, FILTER_VALIDATE_URL); @@ -421,7 +420,7 @@ function _elgg_html_decode($string) {  /**   * Unit tests for Output   * - * @param sting  $hook   unit_test + * @param string  $hook   unit_test   * @param string $type   system   * @param mixed  $value  Array of tests   * @param mixed  $params Params diff --git a/engine/lib/pageowner.php b/engine/lib/pageowner.php index 94765feee..7fd79e68a 100644 --- a/engine/lib/pageowner.php +++ b/engine/lib/pageowner.php @@ -39,7 +39,7 @@ function elgg_get_page_owner_guid($guid = 0) {   *   * @note Access is disabled when getting the page owner entity.   * - * @return ElggEntity|false The current page owner or false if none. + * @return ElggUser|ElggGroup|false The current page owner or false if none.   *   * @since 1.8.0   */ @@ -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();  		}  	} @@ -140,7 +141,7 @@ function default_page_owner_handler($hook, $entity_type, $returnvalue, $params)  			switch ($segments[1]) {  				case 'owner':  				case 'friends': -					$user = get_user_by_username($segments[2]); +					$user = get_user_by_username(urldecode($segments[2]));  					if ($user) {  						elgg_set_ignore_access($ia);  						return $user->getGUID(); diff --git a/engine/lib/plugins.php b/engine/lib/plugins.php index 94aff277e..f281b1416 100644 --- a/engine/lib/plugins.php +++ b/engine/lib/plugins.php @@ -91,7 +91,9 @@ function elgg_get_plugin_ids_in_dir($dir = null) {   * @access private   */  function elgg_generate_plugin_entities() { +	// @todo $site unused, can remove?  	$site = get_config('site'); +  	$dir = elgg_get_plugins_path();  	$db_prefix = elgg_get_config('dbprefix'); @@ -107,6 +109,7 @@ function elgg_generate_plugin_entities() {  	$old_access = access_get_show_hidden_status();  	access_show_hidden_entities(true);  	$known_plugins = elgg_get_entities_from_relationship($options); +	/* @var ElggPlugin[] $known_plugins */  	if (!$known_plugins) {  		$known_plugins = array(); @@ -138,7 +141,7 @@ function elgg_generate_plugin_entities() {  			$index = $id_map[$plugin_id];  			$plugin = $known_plugins[$index];  			// was this plugin deleted and its entity disabled? -			if ($plugin->enabled != 'yes') { +			if (!$plugin->isEnabled()) {  				$plugin->enable();  				$plugin->deactivate();  				$plugin->setPriority('last'); @@ -192,7 +195,7 @@ function _elgg_cache_plugin_by_id(ElggPlugin $plugin) {   * Returns an ElggPlugin object with the path $path.   *   * @param string $plugin_id The id (dir name) of the plugin. NOT the guid. - * @return mixed ElggPlugin or false. + * @return ElggPlugin|false   * @since 1.8.0   */  function elgg_get_plugin_from_id($plugin_id) { @@ -260,6 +263,8 @@ function elgg_get_max_plugin_priority() {  	$data = get_data($q);  	if ($data) {  		$max = $data[0]->max; +	} else { +		$max = 1;  	}  	// can't have a priority of 0. @@ -306,8 +311,6 @@ function elgg_is_active_plugin($plugin_id, $site_guid = null) {   * @access private   */  function elgg_load_plugins() { -	global $CONFIG; -  	$plugins_path = elgg_get_plugins_path();  	$start_flags =	ELGG_PLUGIN_INCLUDE_START  					| ELGG_PLUGIN_REGISTER_VIEWS @@ -360,7 +363,7 @@ function elgg_load_plugins() {   *   * @param string $status      The status of the plugins. active, inactive, or all.   * @param mixed  $site_guid   Optional site guid - * @return array + * @return ElggPlugin[]   * @since 1.8.0   * @access private   */ @@ -441,6 +444,7 @@ function elgg_set_plugin_priorities(array $order) {  	// though we do start with 1  	$order = array_values($order); +	$missing_plugins = array();  	foreach ($plugins as $plugin) {  		$plugin_id = $plugin->getID(); @@ -639,19 +643,18 @@ function elgg_get_plugins_provides($type = null, $name = null) {   * @access private   */  function elgg_check_plugins_provides($type, $name, $version = null, $comparison = 'ge') { -	if (!$provided = elgg_get_plugins_provides($type, $name)) { +	$provided = elgg_get_plugins_provides($type, $name); +	if (!$provided) {  		return array(  			'status' => false,  			'version' => ''  		);  	} -	if ($provided) { -		if ($version) { -			$status = version_compare($provided['version'], $version, $comparison); -		} else { -			$status = true; -		} +	if ($version) { +		$status = version_compare($provided['version'], $version, $comparison); +	} else { +		$status = true;  	}  	return array( @@ -861,9 +864,9 @@ function elgg_set_plugin_user_setting($name, $value, $user_guid = null, $plugin_  /**   * Unsets a user-specific plugin setting   * - * @param str $name      Name of the setting + * @param string $name      Name of the setting   * @param int $user_guid Defaults to logged in user - * @param str $plugin_id Defaults to contextual plugin name + * @param string $plugin_id Defaults to contextual plugin name   *   * @return bool   * @since 1.8.0 @@ -1087,7 +1090,7 @@ function plugin_run_once() {  /**   * Runs unit tests for the entity objects.   * - * @param sting  $hook   unit_test + * @param string  $hook   unit_test   * @param string $type   system   * @param mixed  $value  Array of tests   * @param mixed  $params Params diff --git a/engine/lib/relationships.php b/engine/lib/relationships.php index 01654b1ce..fe0b8364d 100644 --- a/engine/lib/relationships.php +++ b/engine/lib/relationships.php @@ -12,7 +12,7 @@   *   * @param stdClass $row Database row from the relationship table   * - * @return stdClass or ElggMetadata + * @return ElggRelationship|stdClass   * @access private   */  function row_to_elggrelationship($row) { @@ -28,7 +28,7 @@ function row_to_elggrelationship($row) {   *   * @param int $id The ID of a relationship   * - * @return mixed + * @return ElggRelationship|false   */  function get_relationship($id) {  	global $CONFIG; @@ -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;  	} @@ -220,7 +220,7 @@ function remove_entity_relationships($guid_one, $relationship = "", $inverse = f   * @param int  $guid                 The GUID of the relationship owner   * @param bool $inverse_relationship Inverse relationship owners?   * - * @return mixed + * @return ElggRelationship[]   */  function get_entity_relationships($guid, $inverse_relationship = FALSE) {  	global $CONFIG; @@ -259,7 +259,7 @@ function get_entity_relationships($guid, $inverse_relationship = FALSE) {   *   * 	inverse_relationship => BOOL Inverse the relationship   * - * @return mixed If count, int. If not count, array. false on errors. + * @return ElggEntity[]|mixed If count, int. If not count, array. false on errors.   * @since 1.7.0   */  function elgg_get_entities_from_relationship($options) { @@ -316,7 +316,7 @@ function elgg_get_entities_from_relationship($options) {   *                                     Provide in table.column format.   * @param string $relationship         Relationship string   * @param int    $relationship_guid    Entity guid to check - * @param string $inverse_relationship Inverse relationship check? + * @param bool $inverse_relationship Inverse relationship check?   *   * @return mixed   * @since 1.7.0 @@ -381,7 +381,7 @@ function elgg_list_entities_from_relationship(array $options = array()) {   *   * @param array $options An options array compatible with   *                       elgg_get_entities_from_relationship() - * @return mixed int If count, int. If not count, array. false on errors. + * @return ElggEntity[]|mixed int If count, int. If not count, array. false on errors.   * @since 1.8.0   */  function elgg_get_entities_from_relationship_count(array $options = array()) { @@ -398,7 +398,7 @@ function elgg_get_entities_from_relationship_count(array $options = array()) {   *   * @param array $options Options array   * - * @return array + * @return string   * @since 1.8.0   */  function elgg_list_entities_from_relationship_count($options) { @@ -499,7 +499,7 @@ function already_attached($guid_one, $guid_two) {   * @param int    $guid Entity GUID   * @param string $type The type of object to return e.g. 'file', 'friend_of' etc   * - * @return an array of objects + * @return ElggEntity[]   * @access private   */  function get_attachments($guid, $type = "") { @@ -507,7 +507,7 @@ function get_attachments($guid, $type = "") {  					'relationship' => 'attached',  					'relationship_guid' => $guid,  					'inverse_relationship' => false, -					'types' => $type, +					'type' => $type,  					'subtypes' => '',  					'owner_guid' => 0,  					'order_by' => 'time_created desc', @@ -571,9 +571,8 @@ function import_relationship_plugin_hook($hook, $entity_type, $returnvalue, $par  	if ($element instanceof ODDRelationship) {  		$tmp = new ElggRelationship();  		$tmp->import($element); - -		return $tmp;  	} +	return $tmp;  }  /** @@ -586,11 +585,10 @@ function import_relationship_plugin_hook($hook, $entity_type, $returnvalue, $par   *   * @elgg_event_handler export all   * @return mixed + * @throws InvalidParameterException   * @access private   */  function export_relationship_plugin_hook($hook, $entity_type, $returnvalue, $params) { -	global $CONFIG; -  	// Sanity check values  	if ((!is_array($params)) && (!isset($params['guid']))) {  		throw new InvalidParameterException(elgg_echo('InvalidParameterException:GUIDNotForExport')); @@ -624,9 +622,9 @@ function export_relationship_plugin_hook($hook, $entity_type, $returnvalue, $par   * @access private   */  function relationship_notification_hook($event, $type, $object) { - +	/* @var ElggRelationship $object */  	$user_one = get_entity($object->guid_one); -	$user_two = get_entity($object->guid_two); +	/* @var ElggUser $user_one */  	return notify_user($object->guid_two,  			$object->guid_one, diff --git a/engine/lib/river.php b/engine/lib/river.php index 33f34360e..f2ec1e101 100644 --- a/engine/lib/river.php +++ b/engine/lib/river.php @@ -500,6 +500,7 @@ function elgg_get_river_type_subtype_where_sql($table, $types, $subtypes, $pairs  		return '';  	} +	$wheres = array();  	$types_wheres = array();  	$subtypes_wheres = array(); @@ -644,7 +645,7 @@ function update_river_access_by_object($object_guid, $access_id) {  }  /** - * Page handler for activiy + * Page handler for activity   *   * @param array $page   * @return bool @@ -663,10 +664,6 @@ function elgg_river_page_handler($page) {  	}  	set_input('page_type', $page_type); -	// content filter code here -	$entity_type = ''; -	$entity_subtype = ''; -  	require_once("{$CONFIG->path}pages/river.php");  	return true;  } diff --git a/engine/lib/sessions.php b/engine/lib/sessions.php index 72ca0a1c2..a34c2045b 100644 --- a/engine/lib/sessions.php +++ b/engine/lib/sessions.php @@ -286,8 +286,6 @@ function check_rate_limit_exceeded($user_guid) {   * @throws LoginException   */  function login(ElggUser $user, $persistent = false) { -	global $CONFIG; -  	// User is banned, return false.  	if ($user->isBanned()) {  		throw new LoginException(elgg_echo('LoginException:BannedUser')); @@ -334,8 +332,6 @@ function login(ElggUser $user, $persistent = false) {   * @return bool   */  function logout() { -	global $CONFIG; -  	if (isset($_SESSION['user'])) {  		if (!elgg_trigger_event('logout', 'user', $_SESSION['user'])) {  			return false; @@ -616,10 +612,8 @@ function _elgg_session_destroy($id) {  		global $sess_save_path;  		$sess_file = "$sess_save_path/sess_$id"; -		return(@unlink($sess_file)); +		return @unlink($sess_file);  	} - -	return false;  }  /** diff --git a/engine/lib/sites.php b/engine/lib/sites.php index d9eb2d25e..3de0eccc2 100644 --- a/engine/lib/sites.php +++ b/engine/lib/sites.php @@ -26,7 +26,7 @@ function elgg_get_site_entity($site_guid = 0) {  		$site = get_entity($site_guid);  	} -	if($site instanceof ElggSite){ +	if ($site instanceof ElggSite) {  		$result = $site;  	} @@ -118,8 +118,6 @@ function create_site_entity($guid, $name, $description, $url) {   * @return bool   */  function add_site_user($site_guid, $user_guid) { -	global $CONFIG; -  	$site_guid = (int)$site_guid;  	$user_guid = (int)$user_guid; @@ -150,8 +148,6 @@ function remove_site_user($site_guid, $user_guid) {   * @return mixed   */  function add_site_object($site_guid, $object_guid) { -	global $CONFIG; -  	$site_guid = (int)$site_guid;  	$object_guid = (int)$object_guid; @@ -192,8 +188,8 @@ function get_site_objects($site_guid, $subtype = "", $limit = 10, $offset = 0) {  		'relationship' => 'member_of_site',  		'relationship_guid' => $site_guid,  		'inverse_relationship' => TRUE, -		'types' => 'object', -		'subtypes' => $subtype, +		'type' => 'object', +		'subtype' => $subtype,  		'limit' => $limit,  		'offset' => $offset  	)); @@ -242,7 +238,7 @@ function get_site_domain($guid) {  /**   * Unit tests for sites   * - * @param sting  $hook   unit_test + * @param string $hook   unit_test   * @param string $type   system   * @param mixed  $value  Array of tests   * @param mixed  $params Params diff --git a/engine/lib/statistics.php b/engine/lib/statistics.php index 5ee640549..0c9a3c945 100644 --- a/engine/lib/statistics.php +++ b/engine/lib/statistics.php @@ -101,9 +101,10 @@ function get_online_users() {  	if ($objects) {  		return elgg_view_entity_list($objects, array(  			'count' => $count, -			'limit' => 10 +			'limit' => 10,  		));  	} +	return '';  }  /** diff --git a/engine/lib/system_log.php b/engine/lib/system_log.php index 53fa24557..5a153afb2 100644 --- a/engine/lib/system_log.php +++ b/engine/lib/system_log.php @@ -10,6 +10,8 @@  /**   * Retrieve the system log based on a number of parameters.   * + * @todo too many args, and the first arg is too confusing + *   * @param int|array $by_user    The guid(s) of the user(s) who initiated the event.   *                              Use 0 for unowned entries. Anything else falsey means anyone.   * @param string    $event      The event you are searching on. @@ -22,12 +24,12 @@   * @param int       $timebefore Lower time limit   * @param int       $timeafter  Upper time limit   * @param int       $object_id  GUID of an object - * @param str       $ip_address The IP address. + * @param string    $ip_address The IP address.   * @return mixed   */ -function get_system_log($by_user = "", $event = "", $class = "", $type = "", $subtype = "", -$limit = 10, $offset = 0, $count = false, $timebefore = 0, $timeafter = 0, $object_id = 0, -$ip_address = false) { +function get_system_log($by_user = "", $event = "", $class = "", $type = "", $subtype = "", $limit = 10, +						$offset = 0, $count = false, $timebefore = 0, $timeafter = 0, $object_id = 0, +						$ip_address = "") {  	global $CONFIG; @@ -166,6 +168,7 @@ function system_log($object, $event) {  	if ($object instanceof Loggable) { +		/* @var ElggEntity|ElggExtender $object */  		if (datalist_get('version') < 2012012000) {  			// this is a site that doesn't have the ip_address column yet  			return; diff --git a/engine/lib/tags.php b/engine/lib/tags.php index a0887d0f3..586a9b9e4 100644 --- a/engine/lib/tags.php +++ b/engine/lib/tags.php @@ -48,7 +48,7 @@ function calculate_tag_size($min, $max, $number_of_tags, $buckets = 6) {   * @param array $tags    The array of tags.   * @param int   $buckets The number of buckets   * - * @return An associated array of tags with a weighting, this can then be mapped to a display class. + * @return array An associated array of tags with a weighting, this can then be mapped to a display class.   * @access private   */  function generate_tag_cloud(array $tags, $buckets = 6) { @@ -114,8 +114,8 @@ function generate_tag_cloud(array $tags, $buckets = 6) {   *   * 	joins => array() Additional joins   * - * @return 	false/array - if no tags or error, false - * 			otherwise, array of objects with ->tag and ->total values + * @return 	object[]|false If no tags or error, false + * 						   otherwise, array of objects with ->tag and ->total values   * @since 1.7.1   */  function elgg_get_tags(array $options = array()) { @@ -172,6 +172,7 @@ function elgg_get_tags(array $options = array()) {  	// catch for tags that were spaces  	$wheres[] = "msv.string != ''"; +	$sanitised_tags = array();  	foreach ($options['tag_names'] as $tag) {  		$sanitised_tags[] = '"' . sanitise_string($tag) . '"';  	} diff --git a/engine/lib/upgrade.php b/engine/lib/upgrade.php index f4f4b16f5..d684af862 100644 --- a/engine/lib/upgrade.php +++ b/engine/lib/upgrade.php @@ -17,8 +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(); @@ -291,7 +292,6 @@ function elgg_upgrade_bootstrap_17_to_18() {  		'2011010101.php',  	); -	$upgrades_17 = array();  	$upgrade_files = elgg_get_upgrade_files();  	$processed_upgrades = array(); @@ -360,6 +360,7 @@ function _elgg_upgrade_is_locked() {  	// Invalidate query cache  	if ($DB_QUERY_CACHE) { +		/* @var ElggStaticVariableCache $DB_QUERY_CACHE */  		$DB_QUERY_CACHE->clear();  		elgg_log("Query cache invalidated", 'NOTICE');  	} 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/upgrades/create_upgrade.php b/engine/lib/upgrades/create_upgrade.php index 3652e18a2..b34f31b7e 100644 --- a/engine/lib/upgrades/create_upgrade.php +++ b/engine/lib/upgrades/create_upgrade.php @@ -93,7 +93,7 @@ if (!$h) {  	die("Could not open file $upgrade_file");  } -if (!fputs($h, $upgrade_code)) { +if (!fwrite($h, $upgrade_code)) {  	die("Could not write to $upgrade_file");  } else {  	elgg_set_version_dot_php_version($upgrade_version); @@ -128,8 +128,9 @@ function elgg_set_version_dot_php_version($version) {  	rewind($h); -	fputs($h, $out); +	fwrite($h, $out);  	fclose($h); +	return true;  }  /** diff --git a/engine/lib/user_settings.php b/engine/lib/user_settings.php index e4069fb53..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'), @@ -332,6 +332,7 @@ function usersettings_page_handler($page) {  		require $path;  		return true;  	} +	return false;  }  /** diff --git a/engine/lib/users.php b/engine/lib/users.php index 95ef9d176..4a585c07f 100644 --- a/engine/lib/users.php +++ b/engine/lib/users.php @@ -290,7 +290,7 @@ function remove_user_admin($user_guid) {   * @param int $limit     Number of results to return   * @param int $offset    Any indexing offset   * - * @return false|array On success, an array of ElggSites + * @return ElggSite[]|false On success, an array of ElggSites   */  function get_user_sites($user_guid, $limit = 10, $offset = 0) {  	$user_guid = (int)$user_guid; @@ -302,7 +302,7 @@ function get_user_sites($user_guid, $limit = 10, $offset = 0) {  		'relationship' => 'member_of_site',  		'relationship_guid' => $user_guid,  		'inverse_relationship' => FALSE, -		'types' => 'site', +		'type' => 'site',  		'limit' => $limit,  		'offset' => $offset,  	)); @@ -343,8 +343,6 @@ function user_add_friend($user_guid, $friend_guid) {   * @return bool Depending on success   */  function user_remove_friend($user_guid, $friend_guid) { -	global $CONFIG; -  	$user_guid = (int) $user_guid;  	$friend_guid = (int) $friend_guid; @@ -379,7 +377,7 @@ function user_is_friend($user_guid, $friend_guid) {   * @param int    $limit     Number of results to return (default 10)   * @param int    $offset    Indexing offset, if any   * - * @return false|array Either an array of ElggUsers or false, depending on success + * @return ElggUser[]|false Either an array of ElggUsers or false, depending on success   */  function get_user_friends($user_guid, $subtype = ELGG_ENTITIES_ANY_VALUE, $limit = 10,  $offset = 0) { @@ -387,8 +385,8 @@ $offset = 0) {  	return elgg_get_entities_from_relationship(array(  		'relationship' => 'friend',  		'relationship_guid' => $user_guid, -		'types' => 'user', -		'subtypes' => $subtype, +		'type' => 'user', +		'subtype' => $subtype,  		'limit' => $limit,  		'offset' => $offset  	)); @@ -402,7 +400,7 @@ $offset = 0) {   * @param int    $limit     Number of results to return (default 10)   * @param int    $offset    Indexing offset, if any   * - * @return false|array Either an array of ElggUsers or false, depending on success + * @return ElggUser[]|false Either an array of ElggUsers or false, depending on success   */  function get_user_friends_of($user_guid, $subtype = ELGG_ENTITIES_ANY_VALUE, $limit = 10,  $offset = 0) { @@ -411,8 +409,8 @@ $offset = 0) {  		'relationship' => 'friend',  		'relationship_guid' => $user_guid,  		'inverse_relationship' => TRUE, -		'types' => 'user', -		'subtypes' => $subtype, +		'type' => 'user', +		'subtype' => $subtype,  		'limit' => $limit,  		'offset' => $offset  	)); @@ -428,7 +426,7 @@ $offset = 0) {   * @param int    $timelower The earliest time the entity can have been created. Default: all   * @param int    $timeupper The latest time the entity can have been created. Default: all   * - * @return false|array An array of ElggObjects or false, depending on success + * @return ElggObject[]|false An array of ElggObjects or false, depending on success   */  function get_user_friends_objects($user_guid, $subtype = ELGG_ENTITIES_ANY_VALUE, $limit = 10,  $offset = 0, $timelower = 0, $timeupper = 0) { @@ -560,7 +558,7 @@ function get_user_by_username($username) {  	// Caching  	if ((isset($USERNAME_TO_GUID_MAP_CACHE[$username])) -	&& (retrieve_cached_entity($USERNAME_TO_GUID_MAP_CACHE[$username]))) { +			&& (retrieve_cached_entity($USERNAME_TO_GUID_MAP_CACHE[$username]))) {  		return retrieve_cached_entity($USERNAME_TO_GUID_MAP_CACHE[$username]);  	} @@ -675,25 +673,22 @@ function find_active_users($seconds = 600, $limit = 10, $offset = 0, $count = fa   * @return bool   */  function send_new_password_request($user_guid) { -	global $CONFIG; -  	$user_guid = (int)$user_guid;  	$user = get_entity($user_guid); -	if ($user) { +	if ($user instanceof ElggUser) {  		// generate code  		$code = generate_random_cleartext_password();  		$user->setPrivateSetting('passwd_conf_code', $code); -  		// generate link -		$link = $CONFIG->site->url . "resetpassword?u=$user_guid&c=$code"; +		$link = elgg_get_site_url() . "resetpassword?u=$user_guid&c=$code";  		// generate email  		$email = elgg_echo('email:resetreq:body', array($user->name, $_SERVER['REMOTE_ADDR'], $link)); -		return notify_user($user->guid, $CONFIG->site->guid, -			elgg_echo('email:resetreq:subject'), $email, NULL, 'email'); +		return notify_user($user->guid, elgg_get_site_entity()->guid, +			elgg_echo('email:resetreq:subject'), $email, array(), 'email');  	}  	return false; @@ -713,8 +708,7 @@ function force_user_password_reset($user_guid, $password) {  	global $CONFIG;  	$user = get_entity($user_guid); - -	if ($user) { +	if ($user instanceof ElggUser) {  		$salt = generate_random_cleartext_password(); // Reset the salt  		$user->salt = $salt; @@ -742,7 +736,7 @@ function execute_new_password_request($user_guid, $conf_code) {  	$user_guid = (int)$user_guid;  	$user = get_entity($user_guid); -	if ($user) { +	if ($user instanceof ElggUser) {  		$saved_code = $user->getPrivateSetting('passwd_conf_code');  		if ($saved_code && $saved_code == $conf_code) { @@ -756,7 +750,7 @@ function execute_new_password_request($user_guid, $conf_code) {  				$email = elgg_echo('email:resetpassword:body', array($user->name, $password));  				return notify_user($user->guid, $CONFIG->site->guid, -					elgg_echo('email:resetpassword:subject'), $email, NULL, 'email'); +					elgg_echo('email:resetpassword:subject'), $email, array(), 'email');  			}  		}  	} @@ -841,7 +835,7 @@ function validate_username($username) {  	for ($n = 0; $n < strlen($blacklist2); $n++) {  		if (strpos($username, $blacklist2[$n]) !== false) {  			$msg = elgg_echo('registration:invalidchars', array($blacklist2[$n], $blacklist2)); -			$msg = htmlentities($msg, ENT_COMPAT, 'UTF-8'); +			$msg = htmlspecialchars($msg, ENT_QUOTES, 'UTF-8');  			throw new RegistrationException($msg);  		}  	} @@ -908,13 +902,11 @@ function validate_email_address($address) {   * @param string $invitecode            An invite code from a friend   *   * @return int|false The new user's GUID; false on failure + * @throws RegistrationException   */  function register_user($username, $password, $name, $email,  $allow_multiple_emails = false, $friend_guid = 0, $invitecode = '') { -	// Load the configuration -	global $CONFIG; -  	// no need to trim password.  	$username = trim($username);  	$name = trim(strip_tags($name)); @@ -1031,7 +1023,7 @@ function elgg_get_user_validation_status($user_guid) {  		'metadata_name' => 'validated'  	));  	if ($md == false) { -		return; +		return null;  	}  	if ($md[0]->value) { @@ -1067,10 +1059,10 @@ function collections_submenu_items() {   * @return bool   * @access private   */ -function friends_page_handler($page_elements, $handler) { +function friends_page_handler($segments, $handler) {  	elgg_set_context('friends'); -	if (isset($page_elements[0]) && $user = get_user_by_username($page_elements[0])) { +	if (isset($segments[0]) && $user = get_user_by_username($segments[0])) {  		elgg_set_page_owner_guid($user->getGUID());  	}  	if (elgg_get_logged_in_user_guid() == elgg_get_page_owner_guid()) { @@ -1197,13 +1189,11 @@ function set_last_login($user_guid) {   * @param string   $object_type user   * @param ElggUser $object      User object   * - * @return bool + * @return void   * @access private   */  function user_create_hook_add_site_relationship($event, $object_type, $object) { -	global $CONFIG; - -	add_entity_relationship($object->getGUID(), 'member_of_site', $CONFIG->site->getGUID()); +	add_entity_relationship($object->getGUID(), 'member_of_site', elgg_get_site_entity()->guid);  }  /** @@ -1233,6 +1223,7 @@ function user_avatar_hook($hook, $entity_type, $returnvalue, $params) {   */  function elgg_user_hover_menu($hook, $type, $return, $params) {  	$user = $params['entity']; +	/* @var ElggUser $user */  	if (elgg_is_logged_in()) {  		if (elgg_get_logged_in_user_guid() != $user->guid) { @@ -1309,7 +1300,12 @@ function elgg_user_hover_menu($hook, $type, $return, $params) {  /**   * Setup the menu shown with an entity   * + * @param string $hook + * @param string $type + * @param array $return + * @param array $params   * @return array + *   * @access private   */  function elgg_users_setup_entity_menu($hook, $type, $return, $params) { @@ -1321,6 +1317,7 @@ function elgg_users_setup_entity_menu($hook, $type, $return, $params) {  	if (!elgg_instanceof($entity, 'user')) {  		return $return;  	} +	/* @var ElggUser $entity */  	if ($entity->isBanned()) {  		$banned = elgg_echo('banned'); @@ -1334,9 +1331,10 @@ function elgg_users_setup_entity_menu($hook, $type, $return, $params) {  	} else {  		$return = array();  		if (isset($entity->location)) { +			$location = htmlspecialchars($entity->location, ENT_QUOTES, 'UTF-8', false);  			$options = array(  				'name' => 'location', -				'text' => "<span>$entity->location</span>", +				'text' => "<span>$location</span>",  				'href' => false,  				'priority' => 150,  			); @@ -1587,7 +1585,7 @@ function users_init() {  /**   * Runs unit tests for ElggObject   * - * @param sting  $hook   unit_test + * @param string $hook   unit_test   * @param string $type   system   * @param mixed  $value  Array of tests   * @param mixed  $params Params diff --git a/engine/lib/views.php b/engine/lib/views.php index 01291b889..cfceccec0 100644 --- a/engine/lib/views.php +++ b/engine/lib/views.php @@ -1308,7 +1308,7 @@ function elgg_view_form($action, $form_vars = array(), $body_vars = array()) {  /**   * View an item in a list   * - * @param object $item ElggEntity or ElggAnnotation + * @param ElggEntity|ElggAnnotation $item   * @param array  $vars Additional parameters for the rendering   *   * @return string @@ -1451,17 +1451,13 @@ function elgg_get_views($dir, $base) {   */  function elgg_view_tree($view_root, $viewtype = "") {  	global $CONFIG; -	static $treecache; +	static $treecache = array();  	// Get viewtype  	if (!$viewtype) {  		$viewtype = elgg_get_viewtype();  	} -	// Has the treecache been initialised? -	if (!isset($treecache)) { -		$treecache = array(); -	}  	// A little light internal caching  	if (!empty($treecache[$view_root])) {  		return $treecache[$view_root]; diff --git a/engine/lib/web_services.php b/engine/lib/web_services.php index c8e4a13cc..b440e3afb 100644 --- a/engine/lib/web_services.php +++ b/engine/lib/web_services.php @@ -178,7 +178,7 @@ function authenticate_method($method) {  	// check if user authentication is required  	if ($API_METHODS[$method]["require_user_auth"] == true) {  		if ($user_auth_result == false) { -			throw new APIException($user_pam->getFailureMessage()); +			throw new APIException($user_pam->getFailureMessage(), ErrorResult::$RESULT_FAIL_AUTHTOKEN);  		}  	} @@ -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 -	$reponse_format = array_shift($request); +	// ex) http://example.org/services/api/rest/json/?method=test +	$response_format = array_shift($request);  	// Which view - xml, json, ... -	if ($reponse_format) { -		elgg_set_viewtype($reponse_format); +	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/lib/widgets.php b/engine/lib/widgets.php index d73dd6330..86b3e8219 100644 --- a/engine/lib/widgets.php +++ b/engine/lib/widgets.php @@ -158,7 +158,7 @@ function elgg_register_widget_type($handler, $name, $description, $context = "al  	$handlerobj = new stdClass;  	$handlerobj->name = $name;  	$handlerobj->description = $description; -	$handlerobj->context = explode(",", $context); +	$handlerobj->context = is_array($context) ? $context : explode(",", $context);  	$handlerobj->multiple = $multiple;  	$CONFIG->widgets->handlers[$handler] = $handlerobj; @@ -336,7 +336,7 @@ function elgg_default_widgets_init() {   *   * @param string $event  The event   * @param string $type   The type of object - * @param object $entity The entity being created + * @param ElggEntity $entity The entity being created   * @return void   * @access private   */ @@ -372,6 +372,7 @@ function elgg_create_default_widgets($event, $type, $entity) {  				);  				$widgets = elgg_get_entities_from_private_settings($options); +				/* @var ElggWidget[] $widgets */  				foreach ($widgets as $widget) {  					// change the container and owner diff --git a/engine/lib/xml.php b/engine/lib/xml.php index ff82d7e8a..497459d83 100644 --- a/engine/lib/xml.php +++ b/engine/lib/xml.php @@ -104,7 +104,7 @@ function serialise_array_to_xml(array $data, $n = 0) {   *   * @param string $xml The XML   * - * @return object + * @return ElggXMLElement   */  function xml_to_object($xml) {  	return new ElggXMLElement($xml); diff --git a/engine/tests/api/entity_getter_functions.php b/engine/tests/api/entity_getter_functions.php index 9db248de9..7bf8ef04a 100644 --- a/engine/tests/api/entity_getter_functions.php +++ b/engine/tests/api/entity_getter_functions.php @@ -426,7 +426,7 @@ class ElggCoreEntityGetterFunctionsTest extends ElggCoreUnitTest {  		$options = array(  			'types' => $types, -			'subtypes' => $subtype +			'subtype' => $subtype  		);  		$es = elgg_get_entities($options); @@ -2648,7 +2648,7 @@ class ElggCoreEntityGetterFunctionsTest extends ElggCoreUnitTest {  			$name = 'test_annotation_' . rand(0, 9999);  			$values = array();  			$options = array( -				'types' => 'object', +				'type' => 'object',  				'subtypes' => $subtypes,  				'limit' => 5  			); @@ -2687,7 +2687,7 @@ class ElggCoreEntityGetterFunctionsTest extends ElggCoreUnitTest {  			$order = array_keys($values);  			$options = array( -				'types' => 'object', +				'type' => 'object',  				'subtypes' => $subtypes,  				'limit' => 5,  				'annotation_name' => $name, @@ -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)); +	}  } | 
