Passed
Push — master ( c0a3a7...3b84a4 )
by Jeroen
58:51
created

mod/legacy_urls/start.php (2 issues)

1
<?php
2
/**
3
 * Provides support for URLs no longer used in Elgg for those who bookmarked or
4
 * linked to them
5
 */
6
7
/**
8
 * Initialize the plugin
9
 *
10
 * @return void
11
 */
12
function legacy_urls_init() {
13 31
	elgg_register_page_handler('tag', 'legacy_urls_tag_handler');
14 31
	elgg_register_page_handler('pg', 'legacy_urls_pg_handler');
15 31
	elgg_register_plugin_hook_handler('route', 'blog', 'legacy_urls_blog_forward');
16 31
	elgg_register_plugin_hook_handler('route', 'bookmarks', 'legacy_urls_bookmarks_forward');
17 31
	elgg_register_plugin_hook_handler('route', 'file', 'legacy_urls_file_forward');
18 31
	elgg_register_plugin_hook_handler('route', 'groups', 'legacy_urls_groups_forward');
19 31
	elgg_register_plugin_hook_handler('route', 'settings', 'legacy_urls_settings_forward');
20 31
	elgg_register_page_handler('forum', 'legacy_urls_forum_handler');
21 31
	elgg_register_plugin_hook_handler('route', 'messageboard', 'legacy_urls_messageboard_forward');
22 31
}
23
24
/**
25
 * Redirect the requestor to the new URL
26
 * Checks the plugin setting to determine the course of action:
27
 * a) Displays an error page with the new URL
28
 * b) Forwards to the new URL and displays an error message
29
 * c) Silently forwards to the new URL
30
 *
31
 * @param string $url Relative or absolute URL
32
 *
33
 * @return void|true
34
 */
35
function legacy_urls_redirect($url) {
36
	$method = elgg_get_plugin_setting('redirect_method', 'legacy_urls');
37
38
	// we only show landing page or queue warning if html generating page
39
	$viewtype = elgg_get_viewtype();
40
	if ($viewtype != 'default' && !elgg_does_viewtype_fallback($viewtype)) {
41
		$method = 'immediate';
42
	}
43
44
	switch ($method) {
45
		case 'landing':
46
			$content = elgg_view('legacy_urls/message', ['url' => $url]);
47
			$body = elgg_view_layout('error', ['content' => $content]);
48
			echo elgg_view_page('', $body, 'error');
49
			return true;
50
			break;
51
		case 'immediate_error':
52
			// drop through after setting error message
53
			register_error(elgg_echo('changebookmark'));
54
		case 'immediate':
55
		default:
56
			$url = elgg_normalize_url($url);
57
			header("HTTP/1.1 301 Moved Permanently");
58
			header("Location: $url");
59
			exit;
0 ignored issues
show
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
60
			break;
61
	}
62
}
63
64
/**
65
 * Adds query parameters to URL for redirect
66
 *
67
 * @param string $url        The URL
68
 * @param array  $query_vars Additional query parameters in associate array
69
 *
70
 * @return string
71
 */
72
function legacy_urls_prepare_url($url, array $query_vars = []) {
73
	$params = [];
74
	// Elgg munges the request in htaccess rules so cannot use $_GET
75
	$query = parse_url(_elgg_services()->request->server->get('REQUEST_URI'), PHP_URL_QUERY);
76
	if ($query) {
77
		parse_str($query, $params);
78
	}
79
	$params = array_merge($params, $query_vars);
80
	if ($params) {
0 ignored issues
show
Bug Best Practice introduced by Cash Costello
The expression $params 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...
81
		return elgg_http_add_url_query_elements($url, $params);
82
	}
83
	
84
	return $url;
85
}
86
87
/**
88
 * Handle requests for /tag/<tag string>
89
 *
90
 * @param array $segments URL segments
91
 *
92
 * @return void|true
93
 */
94
function legacy_urls_tag_handler($segments) {
95
	$tag = $segments[0];
96
	$url = legacy_urls_prepare_url('search', ['q' => $tag]);
97
	return legacy_urls_redirect($url);
98
}
99
100
/**
101
 * Handle requests for URLs that start with /pg/
102
 *
103
 * @param array $segments URL segments
104
 *
105
 * @return void|true
106
 */
107
function legacy_urls_pg_handler($segments) {
108
	$url = implode('/', $segments);
109
	return legacy_urls_redirect(legacy_urls_prepare_url($url));
110
}
111
112
/**
113
 * Blog forwarder
114
 *
115
 * 1.0-1.7.5
116
 * Group blogs page: /blog/group:<container_guid>/
117
 * Group blog view:  /blog/group:<container_guid>/read/<guid>/<title>
118
 * 1.7.5-pre 1.8
119
 * Group blogs page: /blog/owner/group:<container_guid>/
120
 * Group blog view:  /blog/read/<guid>
121
 *
122
 * @param string $hook   "route"
123
 * @param string $type   "blog"
124
 * @param array  $result Old identifier and segments
125
 *
126
 * @return void|false
127
 */
128
function legacy_urls_blog_forward($hook, $type, $result) {
129
130
	$page = $result['segments'];
131
132
	// easier to work with and no notices
133
	$page = array_pad($page, 4, "");
134
135
	// group usernames
136
	if (preg_match('~/group\:([0-9]+)/~', "/{$page[0]}/{$page[1]}/", $matches)) {
137
		$guid = $matches[1];
138
		$entity = get_entity($guid);
139
		if (elgg_instanceof($entity, 'group')) {
140
			if (!empty($page[2])) {
141
				$url = "blog/view/$page[2]/";
142
			} else {
143
				$url = "blog/group/$guid/all";
144
			}
145
			// we drop query params because the old group URLs were invalid
146
			legacy_urls_redirect(legacy_urls_prepare_url($url));
147
			return false;
148
		}
149
	}
150
151
	if (empty($page[0])) {
152
		return;
153
	}
154
155
	if ($page[0] == "read") {
156
		$url = "blog/view/{$page[1]}/";
157
		legacy_urls_redirect(legacy_urls_prepare_url($url));
158
		return false;
159
	}
160
161
	// user usernames
162
	$user = get_user_by_username($page[0]);
163
	if (!$user) {
164
		return;
165
	}
166
167
	if (empty($page[1])) {
168
		$page[1] = 'owner';
169
	}
170
171
	switch ($page[1]) {
172
		case "read":
173
			$url = "blog/view/{$page[2]}/{$page[3]}";
174
			break;
175
		case "archive":
176
			$url = "blog/archive/{$page[0]}/{$page[2]}/{$page[3]}";
177
			break;
178
		case "friends":
179
			$url = "blog/friends/{$page[0]}";
180
			break;
181
		case "new":
182
			$url = "blog/add/$user->guid";
183
			break;
184
		case "owner":
185
			$url = "blog/owner/{$page[0]}";
186
			break;
187
	}
188
189
	if (isset($url)) {
190
		legacy_urls_redirect(legacy_urls_prepare_url($url));
191
		return false;
192
	}
193
}
194
195
/**
196
 * Bookmarks forwarder
197
 * /bookmarks/group:<group_guid>/
198
 * /bookmarks/gorup:<group_guid>/read/<guid>/
199
 * /bookmarks/read/<guid>
200
 * /bookmarks/<username>[/(items|read|inbox|friends|add|bookmarklet)/<guid>]
201
 *
202
 * @param string $hook   "route"
203
 * @param string $type   "bookmarks"
204
 * @param array  $result Old identifier and segments
205
 *
206
 * @return void|false
207
 */
208
function legacy_urls_bookmarks_forward($hook, $type, $result) {
209
210
	$page = $result['segments'];
211
212
	// easier to work with and no notices
213
	$page = array_pad($page, 4, "");
214
215
	// old group usernames
216
	if (substr_count($page[0], 'group:')) {
217
		preg_match('/group\:([0-9]+)/i', $page[0], $matches);
218
		$guid = $matches[1];
219
		$entity = get_entity($guid);
220
		if (elgg_instanceof($entity, 'group')) {
221
			if (!empty($page[2])) {
222
				$url = "bookmarks/view/$page[2]/";
223
			} else {
224
				$url = "bookmarks/group/$guid/all";
225
			}
226
			// we drop query params because the old group URLs were invalid
227
			legacy_urls_redirect(legacy_urls_prepare_url($url));
228
		}
229
	}
230
231
	if ($page[0] == "read") {
232
		$url = "bookmarks/view/{$page[1]}/";
233
		legacy_urls_redirect(legacy_urls_prepare_url($url));
234
		return false;
235
	}
236
237
	$user = get_user_by_username($page[0]);
238
	if (!$user) {
239
		return;
240
	}
241
242
	if (empty($page[1])) {
243
		$page[1] = 'items';
244
	}
245
246
	switch ($page[1]) {
247
		case "read":
248
			$url = "bookmarks/view/{$page[2]}/{$page[3]}";
249
			break;
250
		case "inbox":
251
			$url = "bookmarks/inbox/{$page[0]}";
252
			break;
253
		case "friends":
254
			$url = "bookmarks/friends/{$page[0]}";
255
			break;
256
		case "add":
257
			$url = "bookmarks/add/{$page[0]}";
258
			break;
259
		case "items":
260
			$url = "bookmarks/owner/{$page[0]}";
261
			break;
262
		case "bookmarklet":
263
			$url = "bookmarks/bookmarklet/{$page[0]}";
264
			break;
265
	}
266
267
	if (isset($url)) {
268
		legacy_urls_redirect(legacy_urls_prepare_url($url));
269
		return false;
270
	}
271
}
272
273
/**
274
 * File forwarder
275
 * /file/read/<guid>
276
 *
277
 * @param string $hook   "route"
278
 * @param string $type   "file"
279
 * @param array  $result Old identifier and segments
280
 *
281
 * @return void|false
282
 */
283
function legacy_urls_file_forward($hook, $type, $result) {
284
285
	$page = $result['segments'];
286
287
	// easier to work with and no notices
288
	$page = array_pad($page, 4, "");
289
290
	if ($page[0] == 'read') {
291
		$url = "file/view/{$page[1]}";
292
		legacy_urls_redirect(legacy_urls_prepare_url($url));
293
		return false;
294
	}
295
}
296
297
/**
298
 * Groups forwarder
299
 * /groups/<guid>
300
 * /groups/forum/<guid>
301
 *
302
 * @param string $hook   "route"
303
 * @param string $type   "groups"
304
 * @param array  $result Old identifier and segments
305
 *
306
 * @return void|false
307
 */
308
function legacy_urls_groups_forward($hook, $type, $result) {
309
310
	$page = $result['segments'];
311
312
	// easier to work with and no notices
313
	$page = array_pad($page, 4, "");
314
315
	if (is_numeric($page[0])) {
316
		$group = get_entity($page[0]);
317
		if ($group instanceof \ElggGroup) {
318
			legacy_urls_redirect(legacy_urls_prepare_url($group->getURL()));
319
			return false;
320
		}
321
	}
322
323
	if ($page[0] == 'forum') {
324
		$url = "discussion/owner/{$page[1]}";
325
		legacy_urls_redirect(legacy_urls_prepare_url($url));
326
		return false;
327
	}
328
}
329
330
/**
331
 * User settings forwarder
332
 * /settings/plugins/
333
 *
334
 * @param string $hook   "route"
335
 * @param string $type   "settings"
336
 * @param array  $result Old identifier and segments
337
 *
338
 * @return void|false
339
 */
340
function legacy_urls_settings_forward($hook, $type, $result) {
341
342
	$page = $result['segments'];
343
344
	// easier to work with and no notices
345
	$page = array_pad($page, 4, "");
346
	
347
	if ($page[0] == "plugins") {
348
		if (empty($page[2])) {
349
			$url = "settings";
350
			if (!empty($page[1])) {
351
				$url .= "/user/" . $page[1];
352
			}
353
			legacy_urls_redirect(legacy_urls_prepare_url($url));
354
			return false;
355
		}
356
	}
357
}
358
359
/**
360
 * Group forum forwarder
361
 * /forum/.*
362
 *
363
 * @param array $page URL segments
364
 *
365
 * @return bool
366
 */
367
function legacy_urls_forum_handler($page) {
368
	switch ($page[0]) {
369
		case 'topic':
370
			$url = "discussion/view/{$page[1]}/{$page[2]}";
371
			legacy_urls_redirect(legacy_urls_prepare_url($url));
372
			return true;
373
		default:
374
			return false;
375
	}
376
}
377
378
/**
379
 * Messageboard forwarder
380
 * /messageboard/!(owner|add|group)
381
 *
382
 * @param string $hook   "route"
383
 * @param string $type   "messageboard"
384
 * @param array  $result Old identifier and segments
385
 *
386
 * @return void|false
387
 */
388
function legacy_urls_messageboard_forward($hook, $type, $result) {
389
390
	$page = $result['segments'];
391
392
	// easier to work with and no notices
393
	$page = array_pad($page, 4, "");
394
395
	// if the first part is a username, forward to new format
396
	$new_section_one = ['owner', 'add', 'group'];
397
	if (isset($page[0]) && !in_array($page[0], $new_section_one) && get_user_by_username($page[0])) {
398
		$url = "messageboard/owner/{$page[0]}";
399
		legacy_urls_redirect(legacy_urls_prepare_url($url));
400
		return false;
401
	}
402
}
403
404
return function() {
405 18
	elgg_register_event_handler('init', 'system', 'legacy_urls_init');
406
};
407