Passed
Push — 3.0 ( f60a73...a99576 )
by Jeroen
69:39 queued 12s
created

actions/entity/delete.php (3 issues)

1
<?php
2
/**
3
 * Default entity delete action
4
 */
5
$guid = (int) get_input('guid');
6
$entity = get_entity($guid);
7
8
if (!$entity instanceof ElggEntity) {
1 ignored issue
show
$entity is always a sub-type of ElggEntity.
Loading history...
9
	return elgg_error_response(elgg_echo('entity:delete:item_not_found'));
10
}
11
12
if (!$entity->canDelete() || $entity instanceof ElggPlugin || $entity instanceof ElggSite) {
13
	return elgg_error_response(elgg_echo('entity:delete:permission_denied'));
14
}
15
16
set_time_limit(0);
17
18
// determine what name to show on success
19
$display_name = $entity->getDisplayName() ?: elgg_echo('entity:delete:item');
20
21
$type = $entity->getType();
22
$subtype = $entity->getSubtype();
23
$container = $entity->getContainerEntity();
24
25
if (!$entity->delete()) {
26
	return elgg_error_response(elgg_echo('entity:delete:fail', [$display_name]));
27
}
28
29
// determine forward URL
30
$forward_url = elgg_normalize_site_url(get_input('forward_url'));
31
if (!$forward_url) {
32
	$forward_url = REFERER;
33
	$referrer_url = $_SERVER['HTTP_REFERER'] ?: '';
34
	$site_url = elgg_get_site_url();
35
	
36
	$find_forward_url = function (ElggEntity $container = null) use ($type, $subtype) {
37
		$routes = _elgg_services()->routes;
38
		
39
		// check if there is a collection route (eg. blog/owner/username)
40
		$route_name = false;
41
		if ($container instanceof ElggUser) {
42
			$route_name = "collection:{$type}:{$subtype}:owner";
43
		} elseif ($container instanceof ElggGroup) {
44
			$route_name = "collection:{$type}:{$subtype}:group";
45
		}
46
		
47
		if ($route_name && $routes->get($route_name)) {
48
			$params = $routes->resolveRouteParameters($route_name, $container);
49
			
50
			return elgg_generate_url($route_name, $params);
1 ignored issue
show
It seems like $params can also be of type false; however, parameter $parameters of elgg_generate_url() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

50
			return elgg_generate_url($route_name, /** @scrutinizer ignore-type */ $params);
Loading history...
51
		}
52
		
53
		// no route found, fallback to container url
54
		if ($container instanceof ElggEntity) {
55
			return $container->getURL();
56
		}
57
		
58
		// no container
59
		return '';
60
	};
61
	
62
	if ($referrer_url && 0 == strpos($referrer_url, $site_url)) {
63
		// referer is on current site
64
		$referrer_path = substr($referrer_url, strlen($site_url));
65
		$segments = explode('/', $referrer_path);
66
		
67
		if (in_array($guid, $segments)) {
68
			// referrer URL contains a reference to the entity that will be deleted
69
			$forward_url = $find_forward_url($container);
70
		}
71
	} elseif ($container) {
1 ignored issue
show
$container is of type ElggEntity, thus it always evaluated to true.
Loading history...
72
		$forward_url = $find_forward_url($container);
73
	}
74
}
75
76
$success_keys = [
77
	"entity:delete:$type:$subtype:success",
78
	"entity:delete:$type:success",
79
	"entity:delete:success",
80
];
81
82
$message = '';
83
foreach ($success_keys as $success_key) {
84
	if (elgg_language_key_exists($success_key)) {
85
		$message = elgg_echo($success_key, [$display_name]);
86
		break;
87
	}
88
}
89
90
return elgg_ok_response('', $message, $forward_url);
91