Completed
Push — master ( 277882...5162b8 )
by mains
10s
created

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
4
include 'php/jodel-web.php';
5
6
	$config = parse_ini_file('config/config.ini.php');
7
8
9
	$location = new Location();
10
	$location->setLat($config['default_lat']);
11
	$location->setLng($config['default_lng']);
12
	$location->setCityName($config['default_location']);
13
14
	$accessToken;
15
	$accessToken_forId1;
16
	$deviceUid;
17
	$isSpider = FALSE;
18
19
	//What is dude doing with my Server?
20
	if($_SERVER['REMOTE_ADDR'] == '94.231.103.52')
21
	{
22
		echo('You are flooting my Server! Pls enable Cookies in your script and contact me: [email protected]');
23
		die();
24
	}
25
26
27
	//Check if it's a Spider or Google Bot
28
	if(botDeviceUidIsSet($config) && isUserBot())
29
	{
30
		$isSpider = TRUE;
31
		error_log('Spider or Bot checked in!');
32
		
33
		//Change this to a free device_uid listed in your DB
34
		$deviceUid = $config['botDeviceUid'];
35
		$config = NULL;
36
	}
37
	else
38
	{
39
		$config = NULL;
40
		if(!isset($_COOKIE['JodelDeviceId']) || !isDeviceUidInDatabase($db->real_escape_string($_COOKIE['JodelDeviceId'])))
41
		{
42
			$deviceUid = createAccount();
43
			setcookie('JodelDeviceId', $deviceUid, time()+60*60*24*365*10);
44
			error_log('Created account with JodelDeviceId:' . $deviceUid .  ' for [' . $_SERVER ['HTTP_USER_AGENT'] . ']');
45
			
46
		}
47
		else
48
		{
49
			$deviceUid = $db->real_escape_string($_COOKIE['JodelDeviceId']);
50
		}
51
	}
52
53
	$location = getLocationByDeviceUid($deviceUid);
54
	$newPositionStatus = $location->getCityName();
55
	$accessToken = isTokenFreshByDeviceUid($location, $deviceUid);
56
	//Acc is fresh. token and location is set
57
58
	$accessToken_forId1 = isTokenFresh($location);
59
	$deviceUid_forId1 = getDeviceUidByAccessToken($accessToken_forId1);
0 ignored issues
show
Equals sign not aligned with surrounding assignments; expected 3 spaces but found 1 space

This check looks for multiple assignments in successive lines of code. It will report an issue if the operators are not in a straight line.

To visualize

$a = "a";
$ab = "ab";
$abc = "abc";

will produce issues in the first and second line, while this second example

$a   = "a";
$ab  = "ab";
$abc = "abc";

will produce no issues.

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