Completed
Push — master ( edc3df...ad03c5 )
by mains
06:18 queued 03:38
created

index.php (2 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
error_reporting(-1);
3
include 'php/jodel-web.php';
4
5
	$location = new Location();
6
	$location->setLat('52.5134288');
7
	$location->setLng('13.2746394');
8
	$location->setCityName('Berlin');
9
10
	$accessToken;
11
	$accessToken_forId1;
12
	$deviceUid;
13
14
	if(!isset($_COOKIE["JodelDeviceId"]))
15
	{
16
		$deviceUid = createAccount();
17
		setcookie('JodelDeviceId', $deviceUid, time()+60*60*24*365*10);
18
		error_log('Created account with JodelDeviceId:' . $deviceUid .  ' for [' . $_SERVER['REMOTE_ADDR'] . '][' . $_SERVER ['HTTP_USER_AGENT'] . ']');
19
		
20
	}
21
	else
22
	{
23
		$deviceUid = $db->real_escape_string($_COOKIE["JodelDeviceId"]);
24
	}
25
26
	$location = getLocationByDeviceUid($deviceUid);
27
	$newPositionStatus = $location->getCityName();
28
	$accessToken = isTokenFreshByDeviceUid($location, $deviceUid);
29
	//Acc is fresh. token and location is set
30
31
	$accessToken_forId1 = isTokenFresh($location);
32
33
34
	//Set View
35
	if(isset($_GET['view']))
36
	{
37
		switch ($_GET['view']) {
38
			case 'comment':
39
				$view = 'comment';
40
				break;
41
			
42
			case 'upVote':
43
				$view = 'upVote';
44
				break;
45
46
			default:
47
				$view = 'time';
48
				break;
49
		}
50
	}
51
	else
52
	{
53
		$view = 'time';
54
	}
55
	
56
	//Set Location
57
	if(isset($_GET['city'])) {
58
		$url = 'https://maps.googleapis.com/maps/api/geocode/json?address=' . htmlspecialchars($_GET['city']) . '&key=AIzaSyCwhnja-or07012HqrhPW7prHEDuSvFT4w';
59
		$result = Requests::post($url);
60
		if(json_decode($result->body, true)['status'] == 'ZERO_RESULTS' || json_decode($result->body, true)['status'] == 'INVALID_REQUEST')
61
		{
62
			$newPositionStatus = "0 results";
63
		}
64
		else
65
		{
66
			$name = json_decode($result->body, true)['results']['0']['address_components']['0']['long_name'];
67
			$lat = json_decode($result->body, true)['results']['0']['geometry']['location']['lat'];
68
			$lng = json_decode($result->body, true)['results']['0']['geometry']['location']['lng'];
69
70
			$location = new Location();
71
			$location->setLat($lat);
72
			$location->setLng($lng);
73
			$location->setCityName($name);
74
			$accountCreator = new UpdateLocation();
75
			$accountCreator->setLocation($location);
76
			$accountCreator->setAccessToken($accessToken);
77
			$data = $accountCreator->execute();
78
79
			//safe location to db
80
			if($data == "Success")
81
			{
82
				$result = $db->query("UPDATE accounts 
83
						SET name='" . $name . "',
84
							lat='" . $lat . "',
85
							lng='" . $lng . "'
86
						WHERE access_token='" . $accessToken . "'");
87
88
				if($result === false)
89
				{
90
						echo "Updating location failed: (" . $db->errno . ") " . $db->error;
91
				}
92
				else
93
				{
94
					$newPositionStatus = $name;
95
					error_log('User with JodelDeviceId:' . $deviceUid .  ' [' . $_SERVER['REMOTE_ADDR'] . '][' . $_SERVER ['HTTP_USER_AGENT']; . '] changed to Location: ' . $name);
0 ignored issues
show
It is generally recommended to place each PHP statement on a line by itself.

Let’s take a look at an example:

// Bad
$a = 5; $b = 6; $c = 7;

// Good
$a = 5;
$b = 6;
$c = 7;
Loading history...
This code did not parse for me. Apparently, there is an error somewhere around this line:

Syntax error, unexpected ';', expecting ',' or ')'
Loading history...
96
				}
97
			}
98
		}
99
	}
100
	
101
	//Vote
102
	if(isset($_GET['vote']) && isset($_GET['postID'])) {
103
		if($_GET['vote'] == "up") {
104
			$accountCreator = new Upvote();
105
		}
106
		else if($_GET['vote'] == "down") {
107
			$accountCreator = new Downvote();
108
		}
109
		$accountCreator->setAccessToken($accessToken_forId1);
110
		$accountCreator->postId = $_GET['postID'];
111
		$data = $accountCreator->execute();
112
113
		header("Location: index.php#postId-" . htmlspecialchars($_GET['postID']));
114
		die();
115
	}
116
	
117
	
118
	//SendJodel
119
	if(isset($_POST['message'])) {
120
		$accountCreator = new SendJodel();
121
122
		if(isset($_POST['ancestor']))
123
		{
124
			$ancestor = $_POST['ancestor'];
125
			$accountCreator->ancestor = $ancestor;
126
		}
127
		if(isset($_POST['color']))
128
		{
129
			$color = $_POST['color'];
130
			switch ($color) {
131
				case '8ABDB0':
132
					$color = '8ABDB0';
133
					break;
134
				case '9EC41C':
135
					$color = '9EC41C';
136
					break;
137
				case '06A3CB':
138
					$color = '06A3CB';
139
					break;
140
				case 'FFBA00':
141
					$color = 'FFBA00';
142
					break;
143
				case 'DD5F5F':
144
					$color = 'DD5F5F';
145
					break;
146
				case 'FF9908':
147
					$color = 'FF9908';
148
					break;
149
				
150
				default:
151
					$color = '8ABDB0';
152
					break;
153
			}
154
			$accountCreator->color = $color;
155
		}
156
		
157
		//$location = getLocationByAccessToken($accessToken);
158
159
		$accountCreatorLocation = new UpdateLocation();
160
		$accountCreatorLocation->setLocation($location);
161
		$accountCreatorLocation->setAccessToken($accessToken_forId1);
162
		$data = $accountCreatorLocation->execute();
163
		
164
		$accountCreator->location = $location;
165
		
166
		$accountCreator->setAccessToken($accessToken_forId1);
167
		$data = $accountCreator->execute();
168
169
		if(isset($_POST['ancestor']))
170
		{
171
			$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
172
			header('Location: ' . $actual_link . '#postId-' . htmlspecialchars($data['post_id']));
173
			exit;
174
		}
175
		else
176
		{
177
			header('Location: ./');
178
			exit;
179
		}
180
	}
181
?>
182
<!DOCTYPE html>
183
<html lang="en">
184
	<head>
185
		<title>JodelBlue - Web-App and Browser-Client</title>
186
		
187
		<meta charset="utf-8">
188
		<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
189
		<meta http-equiv="x-ua-compatible" content="ie=edge">
190
		
191
		<meta name="description" content="JodelBlue is a Web-App and Browser-Client for the Jodel App. No registration required! Browse Jodels all over the world. Send your own Jodels or upvote others.">
192
		<meta name="keywords" content="jodelblue, jodel, blue, webclient, web, client, web-app, browser, app">
193
		
194
		<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/css/bootstrap.min.css" integrity="sha384-AysaV+vQoT3kOAXZkl02PThvDr8HYKPZhNT5h/CXfBThSRXQ6jW5DO2ekP5ViFdi" crossorigin="anonymous">
195
		<link rel="stylesheet" href="css/font-awesome.min.css">
196
		<link rel="stylesheet" href="style.css" type="text/css">
197
		
198
		<link rel="shortcut icon" type="image/x-icon" href="./img/favicon/favicon.ico">
199
		<link rel="icon" type="image/x-icon" href="./img/favicon/favicon.ico">
200
		<link rel="icon" type="image/gif" href="./img/favicon/favicon.gif">
201
		<link rel="icon" type="image/png" href="./img/favicon/favicon.png">
202
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon.png">
203
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-57x57.png" sizes="57x57">
204
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-60x60.png" sizes="60x60">
205
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-72x72.png" sizes="72x72">
206
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-76x76.png" sizes="76x76">
207
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-114x114.png" sizes="114x114">
208
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-120x120.png" sizes="120x120">
209
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-128x128.png" sizes="128x128">
210
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-144x144.png" sizes="144x144">
211
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-152x152.png" sizes="152x152">
212
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-180x180.png" sizes="180x180">
213
		<link rel="apple-touch-icon" href="./img/favicon/apple-touch-icon-precomposed.png">
214
		<link rel="icon" type="image/png" href="./img/favicon/favicon-16x16.png" sizes="16x16">
215
		<link rel="icon" type="image/png" href="./img/favicon/favicon-32x32.png" sizes="32x32">
216
		<link rel="icon" type="image/png" href="./img/favicon/favicon-96x96.png" sizes="96x96">
217
		<link rel="icon" type="image/png" href="./img/favicon/favicon-160x160.png" sizes="160x160">
218
		<link rel="icon" type="image/png" href="./img/favicon/favicon-192x192.png" sizes="192x192">
219
		<link rel="icon" type="image/png" href="./img/favicon/favicon-196x196.png" sizes="196x196">
220
		<meta name="msapplication-TileImage" content="./img/favicon/win8-tile-144x144.png"> 
221
		<meta name="msapplication-TileColor" content="#5682a3"> 
222
		<meta name="msapplication-navbutton-color" content="#5682a3"> 
223
		<meta name="application-name" content="JodelBlue"/> 
224
		<meta name="msapplication-tooltip" content="JodelBlue"/> 
225
		<meta name="apple-mobile-web-app-title" content="JodelBlue"/> 
226
		<meta name="msapplication-square70x70logo" content="./img/favicon/win8-tile-70x70.png"> 
227
		<meta name="msapplication-square144x144logo" content="./img/favicon/win8-tile-144x144.png"> 
228
		<meta name="msapplication-square150x150logo" content="./img/favicon/win8-tile-150x150.png"> 
229
		<meta name="msapplication-wide310x150logo" content="./img/favicon/win8-tile-310x150.png"> 
230
		<meta name="msapplication-square310x310logo" content="./img/favicon/win8-tile-310x310.png"> 
231
	</head>
232
	
233
	<body>
234
		<header>
235
			<nav class="navbar navbar-full navbar-dark navbar-fixed-top">
236
				<div class="container">					
237
						<?php
238
							if(isset($_GET['postID']) && isset($_GET['getPostDetails']))
239
							{
240
								echo '<a id="comment-back" href="index.php?view=' . $view . '#postId-' . htmlspecialchars($_GET['postID']) . '">';
241
								echo '<i class="fa fa-angle-left fa-3x"></i>';
242
								echo '</a>';
243
								echo '<h1>';
244
								echo '<a href="index.php?getPostDetails=' . htmlspecialchars($_GET['getPostDetails']) . '&postID=' . htmlspecialchars($_GET['postID']) . '" class="spinnable">';
245
							}
246
							else
247
							{
248
								echo '<h1>';	
249
								echo '<a href="./" class="spinnable">';
250
							}
251
						?>
252
						JodelBlue <i class="fa fa-refresh fa-1x"></i></a>
253
					</h1>					
254
				</div>
255
			</nav>
256
		</header>
257
		
258
		<div class="mainContent container">		
259
			<div class="content row">
260
				<article class="topContent col-sm-8">
261
262
					<content id="posts">
263
						<?php
264
							$posts;
265
266
							//Get Post Details
267
							if(isset($_GET['postID']) && isset($_GET['getPostDetails']))
268
							{
269
								$userHandleBuffer = [];
270
271
								$accountCreator = new GetPostDetails();
272
								$accountCreator->setAccessToken($accessToken);
273
								$data = $accountCreator->execute();
274
								
275
								$posts[0] = $data;
276
								if(array_key_exists('children', $data)) {
277
									foreach($data['children'] as $key => $child)
278
									{
279
										
280
										if(!$child["parent_creator"] == 1)
281
										{
282
											$numberForUser = array_search($child['user_handle'], $userHandleBuffer);
283
											if($numberForUser === FALSE)
284
											{
285
												array_push($userHandleBuffer, $child['user_handle']);
286
												$data['children'][$key]['user_handle'] = count($userHandleBuffer);
287
											}
288
											else
289
											{
290
												$data['children'][$key]['user_handle'] = $numberForUser + 1;
291
											}
292
										}
293
294
										array_push($posts, $data['children'][$key]);
295
									}
296
									$loops = $data['child_count'] + 1;
297
								}
298
								else
299
								{
300
									$loops = 1;
301
								}
302
								$isDetailedView = TRUE;
303
							}
304
							//Get Posts
305
							else
306
							{
307
								$version = 'v2';
308
								if($view=='comment')
309
								{
310
									$url = "/v2/posts/location/discussed/";
311
								}
312
								else
313
								{
314
									if($view=='upVote')
315
									{
316
										$url = "/v2/posts/location/popular/";
317
									}
318
									else
319
									{
320
										$url = "/v3/posts/location/combo/";
321
										$version = 'v3';
322
									}
323
								}
324
325
								if($version == 'v3')
326
								{
327
									$posts = getPosts($lastPostId, $accessToken, $url, $version)['recent'];
328
								}
329
								else
330
								{
331
									$posts = getPosts($lastPostId, $accessToken, $url, $version)['posts'];
332
								}
333
								$loops = 29;
334
								$isDetailedView = FALSE;
335
							}
336
							
337
338
							for($i = 0; $i<$loops; $i++)
339
							{
340
								if(array_key_exists($i, $posts))
341
								{
342
									$lastPostId = $posts[$i]['post_id'];
343
344
									jodelToHtml($posts[$i], $view, $isDetailedView);
345
								}
346
							} ?>
347
348
					</content>
349
					
350
					<?php if(!isset($_GET['postID']) && !isset($_GET['getPostDetails'])) { ?>
351
						<p id="loading">
352
							Loading…
353
						</p>
354
					<?php } ?>
355
				</article>
356
			
357
				<aside class="topSidebar col-sm-4 sidebar-outer">
358
					<div class="fixed">
359
						<article>
360
							<div>
361
								<h2>Position</h2>
362
								<form method="get">
363
									<input type="text" id="city" name="city" placeholder="<?php if(isset($newPositionStatus)) echo $newPositionStatus; ?>" required>
364
365
									<input type="submit" value="Set Location" /> 
366
								</form>
367
							</div>
368
						</article>
369
370
						<article>
371
							<div>
372
								<h2>Karma</h2>
373
								<?php echo getKarma($accessToken_forId1); ?>
374
							</div>
375
						</article>
376
377
						<article>
378
							<div>
379
								<?php if(isset($_GET['postID']) && isset($_GET['getPostDetails'])) { ?>
380
								<h2>Comment on Jodel</h2>
381
								<form method="POST">				
382
										<input type="hidden" name="ancestor" value="<?php echo htmlspecialchars($_GET['postID']);?>" />
383
										<textarea id="message" name="message" placeholder="Send a comment on a Jodel to all students within 10km" required></textarea> 
384
									<br />
385
									<input type="submit" value="SEND" /> 
386
								</form>
387
									<?php } else { ?>
388
								<h2>New Jodel</h2>
389
								<form method="POST">
390
									<textarea id="message" name="message" placeholder="Send a Jodel to all students within 10km" required></textarea> 
391
									<br />
392
									<select id="postColorPicker" name="color">
393
										<option value="06A3CB">Blue</option>
394
										<option value="8ABDB0">Teal</option>
395
										<option value="9EC41C">Green</option>
396
										<option value="FFBA00">Yellow</option>
397
										<option value="DD5F5F">Red</option>
398
										<option value="FF9908">Orange</option>
399
									</select> 
400
									<br />
401
									<input type="submit" value="SEND" /> 
402
								</form>
403
								<?php } ?>
404
							</div>
405
						</article>
406
							
407
						<article>
408
							<div>
409
								<h2>Login</h2>
410
							</div>
411
						</article>
412
					</div>
413
				</aside>
414
			</div>
415
			<div id="sortJodelBy" class="row">
416
				<div class="col-sm-12">
417
					<div class="row">
418
						<div class="col-sm-3">
419
							<a href="index.php" <?php if($view=='time') echo 'class="active"';?>><i class="fa fa-clock-o fa-3x"></i></a>
420
						</div>
421
						<div class="col-sm-3">
422
							<a href="index.php?view=comment" <?php if($view=='comment') echo 'class="active"';?>><i class="fa fa-commenting-o fa-3x"></i></a>
423
						</div>
424
						<div class="col-sm-3">
425
							<a href="index.php?view=upVote" <?php if($view=='upVote') echo 'class="active"';?>><i class="fa fa-angle-up fa-3x"></i></a>
426
						</div>
427
						<div class="col-sm-3">
428
							<nav>
429
								<a href="./about-us.html">about us</a>
430
							</nav>
431
						</div>
432
					</div>
433
				</div>	
434
			</div>
435
		</div>
436
		
437
		
438
		<!-- jQuery, Tether, Bootstrap JS and own-->
439
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js" integrity="sha384-3ceskX3iaEnIogmQchP8opvBy3Mi7Ce34nWjpBIwVTHfGYWQS9jwHDVRnpKKHJg7" crossorigin="anonymous"></script>
440
    	<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.3.7/js/tether.min.js" integrity="sha384-XTs3FgkjiBgo8qjEjBk0tGmf3wPrWtA6coPfQDfFEY8AnYJwjalXCiosYRBIBZX8" crossorigin="anonymous"></script>
441
    	<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.5/js/bootstrap.min.js" integrity="sha384-BLiI7JTZm+JWlgKa0M0kGRpJbF2J8q+qreVrKBC47e3K6BW78kGLrCkeRX6I9RoK" crossorigin="anonymous"></script>
442
    	<script src="js/jQueryEmoji.js"></script>
443
444
		<script>
445
			//BackButton
446
			function goBack()
447
			{
448
				window.history.back();
449
			}
450
451
			$(document).ready(function()
452
			{
453
454
455
				//Transform UTF-8 Emoji to img
456
				$('.jodel > content').Emoji();
457
458
				$('a').on('click', function(){
459
				    $('a').removeClass('selected');
460
				    $(this).addClass('selected');
461
				});
462
463
				function scrollToAnchor(aid){
464
				    var aTag = $("article[id='"+ aid +"']");
465
				    $('html,body').animate({scrollTop: aTag.offset().top-90},'slow');
466
				}
467
468
				<?php if(!isset($_GET['postID']) && !isset($_GET['getPostDetails'])) { ?>
469
470
				
471
472
473
474
				var win = $(window);
475
				var lastPostId = "<?php echo $lastPostId; ?>";
476
				var view = "<?php echo $view; ?>"
477
				var old_lastPostId = "";
478
				var morePostsAvailable = true;
479
480
				if(window.location.hash)
481
				{
482
					var hash = window.location.hash.slice(1);
483
484
					if(!$("article[id='"+ hash +"']").length)
485
					{
486
						for (var i = 5; i >= 0; i--)
487
						{
488
							if(!$("article[id='"+ hash +"']").length)
489
							{
490
								$.ajax({
491
									url: 'get-posts-ajax.php?lastPostId=' + lastPostId + '&view=' + view,
492
									dataType: 'html',
493
									async: false,
494
									success: function(html) {
495
										var div = document.createElement('div');
496
										div.innerHTML = html;
497
										var elements = div.childNodes;
498
										old_lastPostId = lastPostId;
499
										lastPostId = elements[3].textContent;
500
										lastPostId = lastPostId.replace(/\s+/g, '');
501
										//alert('Neu: ' + lastPostId + " Alt: " + old_lastPostId);
502
										if(lastPostId == old_lastPostId) {
503
											
504
											//morePostsAvailable = false;
505
										}
506
										else {
507
											//alert(elements[3].textContent);
508
											$('#posts').append(elements[1].innerHTML);
509
											$('#posts').hide().show(0);
510
										}
511
										$('#loading').hide();
512
									}
513
								});
514
515
								$('.jodel > content').Emoji();
516
							}
517
							
518
						}
519
						scrollToAnchor(hash);
520
521
					}						
522
				}
523
524
				// Each time the user scrolls
525
				win.scroll(function() {
526
527
528
					// End of the document reached?
529
					if (($(document).height() - win.height() == win.scrollTop()) && morePostsAvailable) {
530
						$('#loading').show();
531
532
						
533
						
534
						$.ajax({
535
							url: 'get-posts-ajax.php?lastPostId=' + lastPostId + '&view=' + view,
536
							dataType: 'html',
537
							async: false,
538
							success: function(html) {
539
								var div = document.createElement('div');
540
								div.innerHTML = html;
541
								var elements = div.childNodes;
542
								old_lastPostId = lastPostId;
543
								lastPostId = elements[3].textContent;
544
								lastPostId = lastPostId.replace(/\s+/g, '');
545
								//alert('Neu: ' + lastPostId + " Alt: " + old_lastPostId);
546
								if(lastPostId == old_lastPostId)
547
								{
548
									
549
									//morePostsAvailable = false;
550
								}
551
								else
552
								{
553
									//alert(elements[3].textContent);
554
									$('#posts').append(elements[1].innerHTML);
555
								}
556
								$('#loading').hide();
557
							}
558
						});
559
560
						$('.jodel > content').Emoji();
561
					}
562
				});
563
			<?php } ?>
564
			});	
565
566
		</script>
567
	</body>
568
</html>
569
570