Completed
Push — 3.x ( e508bd...b32bc5 )
by Jeroen
204:55 queued 139:42
created

_elgg_set_user_email()   C

Complexity

Conditions 13
Paths 16

Size

Total Lines 64
Code Lines 37

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 24
CRAP Score 17.299

Importance

Changes 0
Metric Value
cc 13
eloc 37
c 0
b 0
f 0
nc 16
nop 1
dl 0
loc 64
ccs 24
cts 34
cp 0.7059
crap 17.299
rs 6.6166

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * Elgg user settings functions.
4
 * Functions for adding and manipulating options on the user settings panel.
5
 *
6
 * @package Elgg.Core
7
 * @subpackage Settings.User
8
 */
9
10
use Elgg\Request;
11
use Elgg\Http\ResponseBuilder;
12
13
/**
14
 * Set a user's password
15
 * Returns null if no change is required
16
 * Returns true or false indicating success or failure if change was needed
17
 *
18
 * @elgg_plugin_hook usersettings:save user
19
 *
20
 * @param \Elgg\Hook $hook 'usersettings:save', 'user'
21
 *
22
 * @return bool|null|void
23
 * @since 1.8.0
24
 * @internal
25
 */
26
function _elgg_set_user_password(\Elgg\Hook $hook) {
27
28 13
	$actor = elgg_get_logged_in_user_entity();
29 13
	if (!$actor instanceof ElggUser) {
30
		return;
31
	}
32
33 13
	$user = $hook->getUserParam();
34 13
	$request = $hook->getParam('request');
35
	
36 13
	if (!$user instanceof ElggUser || !$request instanceof Request) {
37
		return;
38
	}
39
40 13
	$password = $request->getParam('password', null, false);
41 13
	$password2 = $request->getParam('password2', null, false);
42
43 13
	if (!$password) {
44 9
		return null;
45
	}
46
47 4
	if (!$actor->isAdmin() || $user->guid === $actor->guid) {
48
		// let admin user change anyone's password without knowing it except his own.
49
50 4
		$current_password = $request->getParam('current_password', null, false);
51
52
		try {
53 4
			elgg()->accounts->assertCurrentPassword($user, $current_password);
54 1
		} catch (RegistrationException $e) {
55 1
			$request->validation()->fail('password', '', elgg_echo('LoginException:ChangePasswordFailure'));
56
57 1
			return false;
58
		}
59
	}
60
61
	try {
62 3
		elgg()->accounts->assertValidPassword([$password, $password2]);
63 2
	} catch (RegistrationException $e) {
64 2
		$request->validation()->fail('password', '', $e->getMessage());
65
66 2
		return false;
67
	}
68
69 1
	$user->setPassword($password);
70 1
	_elgg_services()->persistentLogin->handlePasswordChange($user, $actor);
71
	
72 1
	if (elgg_get_config('security_notify_user_password')) {
73
		// notify the user that their password has changed
74 1
		$site = elgg_get_site_entity();
75
		
76 1
		$subject = elgg_echo('user:notification:password_change:subject', [], $user->language);
77 1
		$body = elgg_echo('user:notification:password_change:body', [
78 1
			$user->getDisplayName(),
79 1
			$site->getDisplayName(),
80 1
			elgg_generate_url('account:password:reset'),
81 1
			$site->getURL(),
82 1
		], $user->language);
83
		
84
		$params = [
85 1
			'object' => $user,
86 1
			'action' => 'password_change',
87
		];
88
		
89 1
		notify_user($user->guid, $site->guid, $subject, $body, $params, ['email']);
90
	}
91
92 1
	$request->validation()->pass('password', '', elgg_echo('user:password:success'));
93 1
}
94
95
/**
96
 * Set a user's display name
97
 * Returns null if no change is required or input is not present in the form
98
 * Returns true or false indicating success or failure if change was needed
99
 *
100
 * @elgg_plugin_hook usersettings:save user
101
 *
102
 * @param \Elgg\Hook $hook Hook
103
 *
104
 * @return bool|null
105
 * @since 1.8.0
106
 * @internal
107
 */
108
function _elgg_set_user_name(\Elgg\Hook $hook) {
109
110 13
	$user = $hook->getUserParam();
111 13
	$request = $hook->getParam('request');
112
	/* @var $request \Elgg\Request */
113
114 13
	$name = $request->getParam('name');
115 13
	if (!isset($name)) {
116 11
		return null;
117
	}
118
119 2
	$name = strip_tags($name);
120 2
	if (empty($name)) {
121 1
		$request->validation()->fail('name', $request->getParam('name'), elgg_echo('user:name:fail'));
122
123 1
		return false;
124
	}
125
126 1
	if ($name === $user->name) {
127
		return null;
128
	}
129
130 1
	$request->validation()->pass('name', $name, elgg_echo('user:name:success'));
131
132 1
	$user->name = $name;
133
134 1
}
135
136
/**
137
 * Set a user's username
138
 * Returns null if no change is required or input is not present in the form
139
 * Returns true or false indicating success or failure if change was needed
140
 *
141
 * @elgg_plugin_hook usersettings:save user
142
 *
143
 * @param \Elgg\Hook $hook Hook
144
 *
145
 * @return bool|null
146
 *
147
 * @since 3.0
148
 * @internal
149
 */
150
function _elgg_set_user_username(\Elgg\Hook $hook) {
151
152 13
	$user = $hook->getUserParam();
153 13
	$request = $hook->getParam('request');
154
	
155 13
	if (!$user instanceof ElggUser || !$request instanceof Request) {
156
		return null;
157
	}
158
159 13
	$username = $request->getParam('username');
160 13
	if (!isset($username)) {
161 11
		return null;
162
	}
163
164 2
	if (!elgg_is_admin_logged_in() && !elgg_get_config('can_change_username', false)) {
165
		return null;
166
	}
167
	
168 2
	if (!$user->canEdit()) {
169
		return null;
170
	}
171
172 2
	if ($user->username === $username) {
173
		return null;
174
	}
175
176
	// check if username is valid and does not exist
177
	try {
178 2
		elgg()->accounts->assertValidUsername($username, true);
179 1
	} catch (RegistrationException $ex) {
180 1
		$request->validation()->fail('username', $username, $ex->getMessage());
181
182 1
		return false;
183
	}
184
185 1
	$user->username = $username;
186
187 1
	$request->validation()->pass('username', $username, elgg_echo('user:username:success'));
188
189
	// correctly forward after after a username change
190
	elgg_register_plugin_hook_handler('response', 'action:usersettings/save', function (\Elgg\Hook $hook) use ($username) {
191
		$response = $hook->getValue();
192
		if (!$response instanceof ResponseBuilder) {
193
			return;
194
		}
195
196
		if ($response->getForwardURL() === REFERRER) {
197
			$response->setForwardURL(elgg_generate_url('settings:account', [
198
				'username' => $username,
199
			]));
200
		}
201
202
		return $response;
203 1
	});
204 1
}
205
206
/**
207
 * Set a user's language
208
 * Returns null if no change is required or input is not present in the form
209
 * Returns true or false indicating success or failure if change was needed
210
 *
211
 * @elgg_plugin_hook usersettings:save user
212
 *
213
 * @param \Elgg\Hook $hook Hook
214
 *
215
 * @return bool|null
216
 * @since 1.8.0
217
 * @internal
218
 */
219
function _elgg_set_user_language(\Elgg\Hook $hook) {
220
221 13
	$user = $hook->getUserParam();
222 13
	$request = $hook->getParam('request');
223
	
224 13
	if (!$user instanceof ElggUser || !$request instanceof Request) {
225
		return null;
226
	}
227
228 13
	$language = $request->getParam('language');
229 13
	if (!isset($language)) {
230 12
		return null;
231
	}
232
233 1
	if ($language === $user->language) {
234
		return null;
235
	}
236
237 1
	$user->language = $language;
238
239 1
	$request->validation()->pass('language', $language, elgg_echo('user:language:success'));
240 1
}
241
242
/**
243
 * Set a user's email address
244
 * Returns null if no change is required or input is not present in the form
245
 * Returns true or false indicating success or failure if change was needed
246
 *
247
 * @elgg_plugin_hook usersettings:save user
248
 *
249
 * @param \Elgg\Hook $hook Hook
250
 *
251
 * @return bool|null
252
 * @since 1.8.0
253
 * @internal
254
 */
255
function _elgg_set_user_email(\Elgg\Hook $hook) {
256
	
257 13
	$actor = elgg_get_logged_in_user_entity();
258 13
	if (!$actor instanceof ElggUser) {
259
		return null;
260
	}
261
262 13
	$user = $hook->getUserParam();
263 13
	$request = $hook->getParam('request');
264
	
265 13
	if (!$user instanceof ElggUser || !$request instanceof Request) {
266
		return null;
267
	}
268
269 13
	$email = $request->getParam('email');
270 13
	if (!isset($email)) {
271 10
		return null;
272
	}
273
274 3
	if (strcmp($email, $user->email) === 0) {
275
		// no change
276
		return null;
277
	}
278
279
	try {
280 3
		elgg()->accounts->assertValidEmail($email, true);
281 1
	} catch (RegistrationException $ex) {
282 1
		$request->validation()->fail('email', $email, $ex->getMessage());
283
284 1
		return false;
285
	}
286
287 2
	if (elgg()->config->security_email_require_password && $user->guid === $actor->guid) {
288
		try {
289
			// validate password
290 2
			elgg()->accounts->assertCurrentPassword($user, $request->getParam('email_password'));
291 1
		} catch (RegistrationException $e) {
292 1
			$request->validation()->fail('email', $email, elgg_echo('email:save:fail:password'));
293 1
			return false;
294
		}
295
	}
296
297 1
	$hook_params = $hook->getParams();
298 1
	$hook_params['email'] = $email;
299
300 1
	if (!elgg_trigger_plugin_hook('change:email', 'user', $hook_params, true)) {
301
		return null;
302
	}
303
	
304 1
	if (elgg()->config->security_email_require_confirmation) {
305
		// validate the new email address
306
		try {
307
			elgg()->accounts->requestNewEmailValidation($user, $email);
308
			
309
			$request->validation()->pass('email', $email, elgg_echo('account:email:request:success', [$email]));
310
			return true;
311
		} catch (InvalidParameterException $e) {
312
			$request->validation()->fail('email', $email, elgg_echo('email:save:fail:password'));
313
			return false;
314
		}
315
	}
316
	
317 1
	$user->email = $email;
318 1
	$request->validation()->pass('email', $email, elgg_echo('email:save:success'));
319 1
}
320
321
/**
322
 * Set a user's default access level
323
 * Returns null if no change is required or input is not present in the form
324
 * Returns true or false indicating success or failure if change was needed
325
 *
326
 * @elgg_plugin_hook usersettings:save user
327
 *
328
 * @param \Elgg\Hook $hook Hook
329
 *
330
 * @return bool|null
331
 * @since 1.8.0
332
 * @internal
333
 * @throws DatabaseException
334
 */
335
function _elgg_set_user_default_access(\Elgg\Hook $hook) {
336
337 13
	if (!elgg()->config->allow_user_default_access) {
338 12
		return null;
339
	}
340
341 1
	$user = $hook->getUserParam();
342 1
	$request = $hook->getParam('request');
343
	/* @var $request \Elgg\Request */
344
345 1
	$default_access = $request->getParam('default_access');
346 1
	if (!isset($default_access)) {
347
		return null;
348
	}
349
350 1
	if ($user->setPrivateSetting('elgg_default_access', $default_access)) {
351 1
		$request->validation()->pass('default_access', $default_access, elgg_echo('user:default_access:success'));
352
	} else {
353
		$request->validation()->fail('default_access', $default_access, elgg_echo(elgg_echo('user:default_access:failure')));
354
	}
355 1
}
356
357
/**
358
 * Register menu items for the user settings page menu
359
 *
360
 * @param \Elgg\Hook $hook 'register', 'menu:page'
361
 *
362
 * @return void|ElggMenuItem[]
363
 *
364
 * @internal
365
 * @since 3.0
366
 */
367
function _elgg_user_settings_menu_register(\Elgg\Hook $hook) {
368 2
	$user = elgg_get_page_owner_entity();
369 2
	if (!$user) {
370 1
		return;
371
	}
372
373 1
	if (!elgg_in_context('settings')) {
374 1
		return;
375
	}
376
	
377
	$return = $hook->getValue();
378
379
	$return[] = \ElggMenuItem::factory([
380
		'name' => '1_account',
381
		'text' => elgg_echo('usersettings:user:opt:linktext'),
382
		'href' => "settings/user/{$user->username}",
383
		'section' => 'configure',
384
	]);
385
386
	$return[] = \ElggMenuItem::factory([
387
		'name' => '1_plugins',
388
		'text' => elgg_echo('usersettings:plugins:opt:linktext'),
389
		'href' => '#',
390
		'section' => 'configure',
391
	]);
392
393
	$return[] = \ElggMenuItem::factory([
394
		'name' => '1_statistics',
395
		'text' => elgg_echo('usersettings:statistics:opt:linktext'),
396
		'href' => "settings/statistics/{$user->username}",
397
		'section' => 'configure',
398
	]);
399
400
	// register plugin user settings menu items
401
	$active_plugins = elgg_get_plugins();
402
403
	foreach ($active_plugins as $plugin) {
404
		$plugin_id = $plugin->getID();
405
		if (!elgg_view_exists("usersettings/$plugin_id/edit") && !elgg_view_exists("plugins/$plugin_id/usersettings")) {
406
			continue;
407
		}
408
409
		if (elgg_language_key_exists($plugin_id . ':usersettings:title')) {
410
			$title = elgg_echo($plugin_id . ':usersettings:title');
411
		} else {
412
			$title = $plugin->getDisplayName();
413
		}
414
415
		$return[] = \ElggMenuItem::factory([
416
			'name' => $plugin_id,
417
			'text' => $title,
418
			'href' => elgg_generate_url('settings:tools', [
419
				'username' => $user->username,
420
				'plugin_id' => $plugin_id,
421
			]),
422
			'parent_name' => '1_plugins',
423
			'section' => 'configure',
424
		]);
425
	}
426
427
	return $return;
428
}
429
430
/**
431
 * Prepares the page menu to strip out empty plugins menu item for user settings
432
 *
433
 * @param \Elgg\Hook $hook 'prepare', 'menu:page'
434
 *
435
 * @return void|array
436
 * @internal
437
 */
438
function _elgg_user_settings_menu_prepare(\Elgg\Hook $hook) {
439 3
	$value = $hook->getValue();
440 3
	if (empty($value)) {
441 1
		return;
442
	}
443
444 2
	if (!elgg_in_context("settings")) {
445 2
		return;
446
	}
447
448
	$configure = elgg_extract("configure", $value);
449
	if (empty($configure)) {
450
		return;
451
	}
452
453
	foreach ($configure as $index => $menu_item) {
454
		if (!($menu_item instanceof ElggMenuItem)) {
455
			continue;
456
		}
457
458
		if ($menu_item->getName() == "1_plugins") {
459
			if (!$menu_item->getChildren()) {
460
				// no need for this menu item if it has no children
461
				unset($value["configure"][$index]);
462
			}
463
		}
464
	}
465
466
	return $value;
467
}
468
469
/**
470
 * Initialize the user settings library
471
 *
472
 * @return void
473
 * @internal
474
 */
475
function _elgg_user_settings_init() {
476
477 110
	elgg_register_plugin_hook_handler('register', 'menu:page', '_elgg_user_settings_menu_register');
478 110
	elgg_register_plugin_hook_handler('prepare', 'menu:page', '_elgg_user_settings_menu_prepare');
479
480 110
	elgg_register_plugin_hook_handler('usersettings:save', 'user', '_elgg_set_user_language');
481 110
	elgg_register_plugin_hook_handler('usersettings:save', 'user', '_elgg_set_user_password'); // this needs to be before email change, for security reasons
482 110
	elgg_register_plugin_hook_handler('usersettings:save', 'user', '_elgg_set_user_default_access');
483 110
	elgg_register_plugin_hook_handler('usersettings:save', 'user', '_elgg_set_user_name');
484 110
	elgg_register_plugin_hook_handler('usersettings:save', 'user', '_elgg_set_user_username');
485 110
	elgg_register_plugin_hook_handler('usersettings:save', 'user', '_elgg_set_user_email');
486
487
	// extend the account settings form
488 110
	elgg_extend_view('forms/usersettings/save', 'core/settings/account/username', 100);
489 110
	elgg_extend_view('forms/usersettings/save', 'core/settings/account/name', 100);
490 110
	elgg_extend_view('forms/usersettings/save', 'core/settings/account/password', 100);
491 110
	elgg_extend_view('forms/usersettings/save', 'core/settings/account/email', 100);
492 110
	elgg_extend_view('forms/usersettings/save', 'core/settings/account/language', 100);
493 110
	elgg_extend_view('forms/usersettings/save', 'core/settings/account/default_access', 100);
494 110
}
495
496
/**
497
 * @see \Elgg\Application::loadCore Do not do work here. Just register for events.
498
 */
499
return function (\Elgg\EventsService $events, \Elgg\HooksRegistrationService $hooks) {
500 99
	$events->registerHandler('init', 'system', '_elgg_user_settings_init');
501
};
502