Issues (2473)

Branch: master

Security Analysis    no vulnerabilities found

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

engine/classes/ElggGroup.php (16 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
/**
4
 * Class representing a container for other elgg entities.
5
 *
6
 * @package    Elgg.Core
7
 * @subpackage Groups
8
 * 
9
 * @property string $name        A short name that captures the purpose of the group
10
 * @property string $description A longer body of content that gives more details about the group
11
 */
12
class ElggGroup extends \ElggEntity
13
	implements Friendable {
14
15
	const CONTENT_ACCESS_MODE_UNRESTRICTED = 'unrestricted';
16
	const CONTENT_ACCESS_MODE_MEMBERS_ONLY = 'members_only';
17
18
	/**
19
	 * Sets the type to group.
20
	 *
21
	 * @return void
22
	 */
23 1 View Code Duplication
	protected function initializeAttributes() {
0 ignored issues
show
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
24 1
		parent::initializeAttributes();
25
26 1
		$this->attributes['type'] = "group";
27 1
		$this->attributes += self::getExternalAttributes();
28 1
		$this->tables_split = 2;
29 1
	}
30
31
	/**
32
	 * Get default values for attributes stored in a separate table
33
	 *
34
	 * @return array
35
	 * @access private
36
	 *
37
	 * @see \Elgg\Database\EntityTable::getEntities
38
	 */
39 1
	final public static function getExternalAttributes() {
40
		return [
41 1
			'name' => null,
42 1
			'description' => null,
43 1
		];
44
	}
45
46
	/**
47
	 * Construct a new group entity
48
	 *
49
	 * Plugin developers should only use the constructor to create a new entity.
50
	 * To retrieve entities, use get_entity() and the elgg_get_entities* functions.
51
	 *
52
	 * @param \stdClass $row Database row result. Default is null to create a new group.
53
	 *
54
	 * @throws IOException|InvalidParameterException if there was a problem creating the group.
55
	 */
56 1 View Code Duplication
	public function __construct($row = null) {
0 ignored issues
show
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
57 1
		$this->initializeAttributes();
58
59
		// compatibility for 1.7 api.
60 1
		$this->initialise_attributes(false);
0 ignored issues
show
Deprecated Code introduced by
The method ElggData::initialise_attributes() has been deprecated with message: 1.8 Use initializeAttributes()

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
61
62 1
		if (!empty($row)) {
63
			// Is $guid is a entity table DB row
64
			if ($row instanceof \stdClass) {
65
				// Load the rest
66
				if (!$this->load($row)) {
67
					$msg = "Failed to load new " . get_class() . " for GUID:" . $row->guid;
68
					throw new \IOException($msg);
69
				}
70
			} else if ($row instanceof \ElggGroup) {
71
				// $row is an \ElggGroup so this is a copy constructor
72
				elgg_deprecated_notice('This type of usage of the \ElggGroup constructor was deprecated. Please use the clone method.', 1.7);
73
				foreach ($row->attributes as $key => $value) {
74
					$this->attributes[$key] = $value;
75
				}
76
			} else if (is_numeric($row)) {
77
				// $row is a GUID so load entity
78
				elgg_deprecated_notice('Passing a GUID to constructor is deprecated. Use get_entity()', 1.9);
79
				if (!$this->load($row)) {
80
					throw new \IOException("Failed to load new " . get_class() . " from GUID:" . $row);
81
				}
82
			} else {
83
				throw new \InvalidParameterException("Unrecognized value passed to constuctor.");
84
			}
85
		}
86 1
	}
87
88
	/**
89
	 * {@inheritdoc}
90
	 */
91
	public function getDisplayName() {
92
		return $this->name;
93
	}
94
	
95
	/**
96
	 * {@inheritdoc}
97
	 */
98
	public function setDisplayName($displayName) {
99
		$this->name = $displayName;
100
	}
101
102
	/**
103
	 * Add an \ElggObject to this group.
104
	 *
105
	 * @param \ElggObject $object The object.
106
	 *
107
	 * @return bool
108
	 */
109 1
	public function addObjectToGroup(\ElggObject $object) {
110 1
		$object->container_guid = $this->guid;
111
		return $object->save();
112
	}
113
114
	/**
115
	 * Remove an object from this containing group and sets the container to be
116
	 * object's owner
117
	 *
118
	 * @param \ElggObject $object The object.
119
	 *
120
	 * @return bool
121
	 */
122
	public function removeObjectFromGroup($object) {
123
		if (is_numeric($object)) {
124
			elgg_deprecated_notice('\ElggGroup::removeObjectFromGroup() takes an \ElggObject not a guid.', 1.9);
125
			$object = get_entity($object);
126
			if (!elgg_instanceof($object, 'object')) {
127
				return false;
128
			}
129
		}
130
131
		$object->container_guid = $object->owner_guid;
132
		return $object->save();
133
	}
134
135
	/**
136
	 * Wrapper around \ElggEntity::__get()
137
	 *
138
	 * @see \ElggEntity::__get()
139
	 *
140
	 * @param string $name Name
141
	 * @return mixed
142
	 * @todo deprecate appending group to username. Was a hack used for creating
143
	 * URLs for group content. We stopped using the hack in 1.8.
144
	 */
145
	public function __get($name) {
146
		if ($name == 'username') {
147
			return 'group:' . $this->getGUID();
148
		}
149
		return parent::__get($name);
150
	}
151
152
	/**
153
	 * Wrapper around \ElggEntity::get()
154
	 *
155
	 * @param string $name Name
156
	 * @return mixed
157
	 * @deprecated 1.9
158
	 */
159
	public function get($name) {
160
		elgg_deprecated_notice("Use -> instead of get()", 1.9);
161
		return $this->__get($name);
162
	}
163
164
	/**
165
	 * Start friendable compatibility block:
166
	 *
167
	 * 	public function addFriend($friend_guid);
168
		public function removeFriend($friend_guid);
169
		public function isFriend();
170
		public function isFriendsWith($user_guid);
171
		public function isFriendOf($user_guid);
172
		public function getFriends($subtype = "", $limit = 10, $offset = 0);
173
		public function getFriendsOf($subtype = "", $limit = 10, $offset = 0);
174
		public function getObjects($subtype="", $limit = 10, $offset = 0);
175
		public function getFriendsObjects($subtype = "", $limit = 10, $offset = 0);
176
		public function countObjects($subtype = "");
177
	 */
178
179
	/**
180
	 * For compatibility with Friendable.
181
	 *
182
	 * Join a group when you friend \ElggGroup.
183
	 *
184
	 * @param int $friend_guid The GUID of the user joining the group.
185
	 *
186
	 * @return bool
187
	 * @deprecated 1.9 Use \ElggGroup::join()
188
	 */
189
	public function addFriend($friend_guid) {
190
		elgg_deprecated_notice("\ElggGroup::addFriend() is deprecated. Use \ElggGroup::join()", 1.9);
191
		$user = get_user($friend_guid);
192
		return $user ? $this->join($user) : false;
0 ignored issues
show
$user of type object<ElggEntity> is not a sub-type of object<ElggUser>. It seems like you assume a child class of the class ElggEntity to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
Bug Compatibility introduced by
The expression $user ? $this->join($user) : false; of type boolean|integer adds the type integer to the return on line 192 which is incompatible with the return type declared by the interface Friendable::addFriend of type boolean.
Loading history...
193
	}
194
195
	/**
196
	 * For compatibility with Friendable
197
	 *
198
	 * Leave group when you unfriend \ElggGroup.
199
	 *
200
	 * @param int $friend_guid The GUID of the user leaving.
201
	 *
202
	 * @return bool
203
	 * @deprecated 1.9 Use \ElggGroup::leave()
204
	 */
205
	public function removeFriend($friend_guid) {
206
		elgg_deprecated_notice("\ElggGroup::removeFriend() is deprecated. Use \ElggGroup::leave()", 1.9);
207
		$user = get_user($friend_guid);
208
		return $user ? $this->leave($user) : false;
0 ignored issues
show
$user of type object<ElggEntity> is not a sub-type of object<ElggUser>. It seems like you assume a child class of the class ElggEntity to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
209
	}
210
211
	/**
212
	 * For compatibility with Friendable
213
	 *
214
	 * Friending a group adds you as a member
215
	 *
216
	 * @return bool
217
	 * @deprecated 1.9 Use \ElggGroup::isMember()
218
	 */
219
	public function isFriend() {
220
		elgg_deprecated_notice("\ElggGroup::isFriend() is deprecated. Use \ElggGroup::isMember()", 1.9);
221
		return $this->isMember();
222
	}
223
224
	/**
225
	 * For compatibility with Friendable
226
	 *
227
	 * @param int $user_guid The GUID of a user to check.
228
	 *
229
	 * @return bool
230
	 * @deprecated 1.9 Use \ElggGroup::isMember()
231
	 */
232
	public function isFriendsWith($user_guid) {
233
		elgg_deprecated_notice("\ElggGroup::isFriendsWith() is deprecated. Use \ElggGroup::isMember()", 1.9);
234
		$user = get_user($user_guid);
235
		return $user ? $this->isMember($user) : false;
0 ignored issues
show
$user is of type object<ElggEntity>, but the function expects a null|object<ElggUser>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
236
	}
237
238
	/**
239
	 * For compatibility with Friendable
240
	 *
241
	 * @param int $user_guid The GUID of a user to check.
242
	 *
243
	 * @return bool
244
	 * @deprecated 1.9 Use \ElggGroup::isMember()
245
	 */
246
	public function isFriendOf($user_guid) {
247
		elgg_deprecated_notice("\ElggGroup::isFriendOf() is deprecated. Use \ElggGroup::isMember()", 1.9);
248
		$user = get_user($user_guid);
249
		return $user ? $this->isMember($user) : false;
0 ignored issues
show
$user is of type object<ElggEntity>, but the function expects a null|object<ElggUser>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
250
	}
251
252
	/**
253
	 * For compatibility with Friendable
254
	 *
255
	 * @param string $subtype The GUID of a user to check.
256
	 * @param int    $limit   Limit
257
	 * @param int    $offset  Offset
258
	 *
259
	 * @return bool
260
	 * @deprecated 1.9 Use \ElggGroup::getMembers()
261
	 */
262
	public function getFriends($subtype = "", $limit = 10, $offset = 0) {
263
		elgg_deprecated_notice("\ElggGroup::getFriends() is deprecated. Use \ElggGroup::getMembers()", 1.9);
264
		return get_group_members($this->getGUID(), $limit, $offset);
0 ignored issues
show
Bug Compatibility introduced by
The expression get_group_members($this-...ID(), $limit, $offset); of type false|integer|array adds the type integer to the return on line 264 which is incompatible with the return type declared by the interface Friendable::getFriends of type array|false.
Loading history...
265
	}
266
267
	/**
268
	 * For compatibility with Friendable
269
	 *
270
	 * @param string $subtype The GUID of a user to check.
271
	 * @param int    $limit   Limit
272
	 * @param int    $offset  Offset
273
	 *
274
	 * @return bool
275
	 * @deprecated 1.9 Use \ElggGroup::getMembers()
276
	 */
277
	public function getFriendsOf($subtype = "", $limit = 10, $offset = 0) {
278
		elgg_deprecated_notice("\ElggGroup::getFriendsOf() is deprecated. Use \ElggGroup::getMembers()", 1.9);
279
		return get_group_members($this->getGUID(), $limit, $offset);
0 ignored issues
show
Bug Compatibility introduced by
The expression get_group_members($this-...ID(), $limit, $offset); of type false|integer|array adds the type integer to the return on line 279 which is incompatible with the return type declared by the interface Friendable::getFriendsOf of type array|false.
Loading history...
280
	}
281
282
	/**
283
	 * Get objects contained in this group.
284
	 *
285
	 * @param string $subtype Entity subtype
286
	 * @param int    $limit   Limit
287
	 * @param int    $offset  Offset
288
	 *
289
	 * @return array|false
290
	 * @deprecated 1.9 Use elgg_get_entities()
291
	 */
292
	public function getObjects($subtype = "", $limit = 10, $offset = 0) {
293
		elgg_deprecated_notice("\ElggGroup::getObjects() is deprecated. Use elgg_get_entities()", 1.9);
294
		return get_objects_in_group($this->getGUID(), $subtype, 0, 0, "", $limit, $offset, false);
295
	}
296
297
	/**
298
	 * For compatibility with Friendable
299
	 *
300
	 * @param string $subtype Entity subtype
301
	 * @param int    $limit   Limit
302
	 * @param int    $offset  Offset
303
	 *
304
	 * @return array|false
305
	 * @deprecated 1.9 Use elgg_get_entities()
306
	 */
307
	public function getFriendsObjects($subtype = "", $limit = 10, $offset = 0) {
308
		elgg_deprecated_notice("\ElggGroup::getFriendsObjects() is deprecated. Use elgg_get_entities()", 1.9);
309
		return get_objects_in_group($this->getGUID(), $subtype, 0, 0, "", $limit, $offset, false);
310
	}
311
312
	/**
313
	 * For compatibility with Friendable
314
	 *
315
	 * @param string $subtype Subtype of entities
316
	 *
317
	 * @return array|false
318
	 * @deprecated 1.9 Use elgg_get_entities()
319
	 */
320
	public function countObjects($subtype = "") {
321
		elgg_deprecated_notice("\ElggGroup::countObjects() is deprecated. Use elgg_get_entities()", 1.9);
322
		return get_objects_in_group($this->getGUID(), $subtype, 0, 0, "", 10, 0, true);
0 ignored issues
show
Bug Best Practice introduced by
The return type of return get_objects_in_gr...0, 0, '', 10, 0, true); (array|false) is incompatible with the return type declared by the interface Friendable::countObjects of type integer.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
323
	}
324
325
	/**
326
	 * End friendable compatibility block
327
	 */
328
329
	/**
330
	 * Get an array of group members.
331
	 *
332
	 * @param array $options Options array. See elgg_get_entities_from_relationships
333
	 *                       for a complete list. Common ones are 'limit', 'offset',
334
	 *                       and 'count'. Options set automatically are 'relationship',
335
	 *                       'relationship_guid', 'inverse_relationship', and 'type'. This argument
336
	 *                       used to set the limit (deprecated usage)
337
	 * @param int   $offset  Offset (deprecated)
338
	 * @param bool  $count   Count (deprecated)
339
	 *
340
	 * @return array
341
	 */
342
	public function getMembers($options = array(), $offset = 0, $count = false) {
343
		if (!is_array($options)) {
344
			elgg_deprecated_notice('\ElggGroup::getMembers() takes an options array.', 1.9);
345
			$options = array(
346
				'relationship' => 'member',
347
				'relationship_guid' => $this->getGUID(),
348
				'inverse_relationship' => true,
349
				'type' => 'user',
350
				'limit' => $options,
351
				'offset' => $offset,
352
				'count' => $count,
353
			);
354 View Code Duplication
		} else {
355
			$options['relationship'] = 'member';
356
			$options['relationship_guid'] = $this->getGUID();
357
			$options['inverse_relationship'] = true;
358
			$options['type'] = 'user';
359
		}
360
361
		return elgg_get_entities_from_relationship($options);
362
	}
363
364
	/**
365
	 * Returns whether the current group has open membership or not.
366
	 *
367
	 * @return bool
368
	 */
369
	public function isPublicMembership() {
370
		return ($this->membership == ACCESS_PUBLIC);
371
	}
372
373
	/**
374
	 * Return the content access mode used by group_gatekeeper()
375
	 *
376
	 * @return string One of CONTENT_ACCESS_MODE_* constants
377
	 * @access private
378
	 * @since 1.9.0
379
	 */
380
	public function getContentAccessMode() {
381
		$mode = $this->content_access_mode;
382
383
		if (!is_string($mode)) {
384
			// fallback to 1.8 default behavior
385
			if ($this->isPublicMembership()) {
386
				$mode = self::CONTENT_ACCESS_MODE_UNRESTRICTED;
387
			} else {
388
				$mode = self::CONTENT_ACCESS_MODE_MEMBERS_ONLY;
389
			}
390
			$this->content_access_mode = $mode;
391
		}
392
393
		// only support two modes for now
394
		if ($mode === self::CONTENT_ACCESS_MODE_MEMBERS_ONLY) {
395
			return $mode;
396
		}
397
		return self::CONTENT_ACCESS_MODE_UNRESTRICTED;
398
	}
399
400
	/**
401
	 * Set the content access mode used by group_gatekeeper()
402
	 *
403
	 * @param string $mode One of CONTENT_ACCESS_MODE_* constants
404
	 * @return void
405
	 * @access private
406
	 * @since 1.9.0
407
	 */
408
	public function setContentAccessMode($mode) {
409
		// only support two modes for now
410
		if ($mode !== self::CONTENT_ACCESS_MODE_MEMBERS_ONLY) {
411
			$mode = self::CONTENT_ACCESS_MODE_UNRESTRICTED;
412
		}
413
414
		$this->content_access_mode = $mode;
415
	}
416
417
	/**
418
	 * Is the given user a member of this group?
419
	 *
420
	 * @param \ElggUser $user The user. Default is logged in user.
421
	 *
422
	 * @return bool
423
	 */
424
	public function isMember(\ElggUser $user = null) {
425
		if ($user == null) {
426
			$user = _elgg_services()->session->getLoggedInUser();
427
		}
428
		if (!$user) {
429
			return false;
430
		}
431
432
		$result = (bool)check_entity_relationship($user->guid, 'member', $this->guid);
433
434
		$params = array(
435
			'user' => $user,
436
			'group' => $this,
437
		);
438
		return _elgg_services()->hooks->trigger('is_member', 'group', $params, $result);
439
	}
440
441
	/**
442
	 * Join a user to this group.
443
	 *
444
	 * @param \ElggUser $user User joining the group.
445
	 *
446
	 * @return bool Whether joining was successful.
447
	 */
448
	public function join(\ElggUser $user) {
449
		$result = add_entity_relationship($user->guid, 'member', $this->guid);
450
	
451
		if ($result) {
452
			$params = array('group' => $this, 'user' => $user);
453
			_elgg_services()->events->trigger('join', 'group', $params);
454
		}
455
	
456
		return $result;
457
	}
458
459
	/**
460
	 * Remove a user from the group.
461
	 *
462
	 * @param \ElggUser $user User to remove from the group.
463
	 *
464
	 * @return bool Whether the user was removed from the group.
465
	 */
466
	public function leave(\ElggUser $user) {
467
		// event needs to be triggered while user is still member of group to have access to group acl
468
		$params = array('group' => $this, 'user' => $user);
469
		_elgg_services()->events->trigger('leave', 'group', $params);
470
471
		return remove_entity_relationship($user->guid, 'member', $this->guid);
472
	}
473
474
	/**
475
	 * Load the \ElggGroup data from the database
476
	 *
477
	 * @param mixed $guid GUID of an \ElggGroup entity or database row from entity table
478
	 *
479
	 * @return bool
480
	 */
481 View Code Duplication
	protected function load($guid) {
0 ignored issues
show
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
482
		$attr_loader = new \Elgg\AttributeLoader(get_class(), 'group', $this->attributes);
483
		$attr_loader->requires_access_control = !($this instanceof \ElggPlugin);
484
		$attr_loader->secondary_loader = 'get_group_entity_as_row';
485
486
		$attrs = $attr_loader->getRequiredAttributes($guid);
487
		if (!$attrs) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $attrs of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
488
			return false;
489
		}
490
491
		$this->attributes = $attrs;
492
		$this->tables_loaded = 2;
493
		$this->loadAdditionalSelectValues($attr_loader->getAdditionalSelectValues());
494
		_elgg_cache_entity($this);
495
496
		return true;
497
	}
498
499
	/**
500
	 * {@inheritdoc}
501
	 */
502
	protected function update() {
503
		global $CONFIG;
504
		
505
		if (!parent::update()) {
506
			return false;
507
		}
508
		
509
		$guid = (int)$this->guid;
510
		$name = sanitize_string($this->name);
511
		$description = sanitize_string($this->description);
512
		
513
		$query = "UPDATE {$CONFIG->dbprefix}groups_entity set"
514
			. " name='$name', description='$description' where guid=$guid";
515
516
		return $this->getDatabase()->updateData($query) !== false;
517
	}
518
	
519
	/**
520
	 * {@inheritdoc}
521
	 */
522 View Code Duplication
	protected function create() {
0 ignored issues
show
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
523
		global $CONFIG;
524
		
525
		$guid = parent::create();
526
		if (!$guid) {
527
			// @todo this probably means permission to create entity was denied
528
			// Is returning false the correct thing to do
529
			return false;
530
		}
531
		
532
		$name = sanitize_string($this->name);
533
		$description = sanitize_string($this->description);
534
535
		$query = "INSERT into {$CONFIG->dbprefix}groups_entity"
536
			. " (guid, name, description) values ($guid, '$name', '$description')";
537
538
		$result = $this->getDatabase()->insertData($query);
539
		if ($result === false) {
540
			// TODO(evan): Throw an exception here?
541
			return false;
542
		}
543
		
544
		return $guid;
545
	}
546
547
	/**
548
	 * {@inheritdoc}
549
	 */
550 View Code Duplication
	protected function prepareObject($object) {
0 ignored issues
show
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
551
		$object = parent::prepareObject($object);
552
		$object->name = $this->getDisplayName();
553
		$object->description = $this->description;
554
		unset($object->read_access);
555
		return $object;
556
	}
557
558
559
	// EXPORTABLE INTERFACE ////////////////////////////////////////////////////////////
560
561
	/**
562
	 * Return an array of fields which can be exported.
563
	 *
564
	 * @return array
565
	 * @deprecated 1.9 Use toObject()
566
	 */
567
	public function getExportableValues() {
568
		return array_merge(parent::getExportableValues(), array(
0 ignored issues
show
Deprecated Code introduced by
The method ElggEntity::getExportableValues() has been deprecated with message: 1.9 Use toObject()

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
569
			'name',
570
			'description',
571
		));
572
	}
573
574
	/**
575
	 * Can a user comment on this group?
576
	 *
577
	 * @see \ElggEntity::canComment()
578
	 *
579
	 * @param int $user_guid User guid (default is logged in user)
580
	 * @return bool
581
	 * @since 1.8.0
582
	 */
583
	public function canComment($user_guid = 0) {
584
		$result = parent::canComment($user_guid);
585
		if ($result !== null) {
586
			return $result;
587
		}
588
		return false;
589
	}
590
}
591