summaryrefslogtreecommitdiffstats
path: root/index.php
blob: 9ed2e2eae97f5a9160764bc358c59569fbe85872 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
<?php
// OPOZORILA: PROGRAM MORA BITI NUJNO POD IMENOM index.php IN POGANJATI SE MORA POD Apache 2, ki podpria RewriteEngine,
// ali pa, še bolše, s HTTp strežnikom nginx (ker je boljši). Če uporabite Apache, uporabite .htacess datoteko, za nginx pa uporabite priložen nginx conf fajl.
// Imeti moraš SQL uporabnika in bazo,
// (C) 2019 Anton Šijanec.
// inštalacija potrebuje composer. inštalirajte required dependence (dapphp/securimage)
// Uporaba dovoljena za učenje in za nekomercijalne namene, brez zaslužkov in z navedbo avtorja. Hvala!
// exit("Balkan ŠortLink je v pripravi. Pripravljen bo čez okoli 2 dni. Anton Šijanec, Projekt začet 20. januarja, predviden čas začetka obratovanja storitve
// je 23. januar 2019. Program bo odprtokoden in dostopen na mojem GitHub.com/sijanec/balkan-shortlink!");
session_start();
clearstatcache();
ini_set('display_errors', 'On'); //debug
error_reporting(0); //debug
header("Content-Type: text/html");
$nadaljuj = "ja";
require_once $_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php';
$securimage = new Securimage();

$verzija = "0.1.19.09.29";
$log .= "Verzija: " . $verzija . "\n";


// definicije - uporabniškega vnosa ne preverjam, zato si ne naredite sql vrivanja (angl. sql injection) ali vrinjanja skript (ni htmlchars sanitizacije).
// drugače pa je program dokaj varen prej vrivanjem... upajmo... vsi ostali uporabniški vnosi so sanitizirani.
$servername = "127.0.0.1"; // domena, IP naslov oziroma ime gostitelja za dostop do MySQL ali ekvivalentne SQL podatkovne baze (strežnika)
$username = "shortlink"; // uporabniško ime za dostop do strežnika SQL
$password = "antoniolukas"; // geslo za dostop do strežnika SQL
$baza = "shortlink"; // podatkovna baza SQL v katero naj pišem - naredi jo pred zagonom programa
$tabela = "links"; // tabela, ki naj jo naredim v podatkovni bazi SQL oziroma tabela v podatkovni bazi SQL, ki naj jo uporabljam
$maxlength = 9; $longurlmaxlen = 4096;
$rxshort = "/^[0-9a-z]{1,".$maxlength."}$/"; // angleško regular expression, ki naj ga uporabim za kratek niz - nujno popravi še besedilne opise. Pusti ga takega, kot je!
$domena = $_SERVER['HTTP_HOST']; // tvoja domena
$delidomene = explode(".", $domena);
end($delidomene);
switch(prev($delidomene).".".next($delidomene)){ // smart enginerring
        case "xn--jha.ga":
                $domena = "ž.ga";
                break;
        case "xn--oda.ga":
                $domena = "÷.ga";
                break;
        case "xn--e1a.ga":
                $domena = "е.ga";
                break;
}
$captcha = "ja"; // ja/ne: ali naj uporabljam captcho? potrebujete phpcaptcha.org, mapo securimage skopirajte zraven index.php (tega programa).
$kljuc = "antoniolukas"; // api kljuc, da bi treba captche
//if($_SERVER['HTTP_HOST'] == "xn--pga.ga") {
if(in_array(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2), ['sl', 'hr', 'sr', 'bs'])) {
       $securimage_folder_missing = "securimage mapa z datotekami za captcho ne obstaja. Naložite jo iz phpcaptcha.org/download in jo postavite zraven index.php, ali pa spremenite
        nastavitev captcha v konfiguracijah (definicije) iz ja na ne (ne priporočam).\n";
        $dbconn_error = "<pre>Povezava v podatkovno bazo ni uspela. <!-- Razhroščevanje: ";
        $dbconn_success = "Povezava v podatkovno bazo uspešna.\n";
        $dbuse_success = "Izbira podatkovne baze uspešna.\n";
        $dbuse_error = "Podatkovne baze ni bilo mogoče izbrati. <!-- Razhroščevanje: ";
        $tableexists = "Tabela v podatkovni bazi obstaja. Program je že bil v uporabi.\n";
        $tablenotexists = "Tabela v podatkovni bazi ne obstaja. Program je bil zagnan prvič. Poskusil jo bom narediti.\n";
        $dbtablecreate_success = "Tabela v podatkovni bazi je bila uspešno narejena.\n";
        $dbtablecreate_error = "<pre>Napaka v izdelavi tabele v podatkovni bazi! <!-- razhroščevanje: ";
        $shortlink_notexists = "Kratek URL še ne obstaja v podatkovni bazi.\n";
        $shortlink_notexists_ui = "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Napaka!</b> Kratek URL še ne obstaja v podatkovni bazi.
</div><br>";
        $form_sent = "Obrazec je bil izpolnjen, začenjam preverjanje vnosa.";
        $captcha_error = "Preverjanje človeštva (CAPTCHA) je negativno. Mogoče niste človek, zato ne bom nadaljeval.";
        $captcha_error_ui = "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Napaka preverjanja!</b> Preverjanje CAPTCHA je pokazalo negativni rezultat. Mogoče niste človek, zato ne bom nadaljeval.
</div><br>";
        $shortlinkregex_success = "Preverjanje krajšalnega niza je pozitivno. Krajševalni niz se lahko uporabi.\n";
        $captcha_success = "Preverjanje človeštva (CAPTCHA) je pozitivno. Človek ste.";
        $shortlinkregex_error = "Krajšalni niz se ne ujema z regexom " . $rxshort . ", zato ne bom nadaljeval.\n";
        $shortlinkregex_error_ui = "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Napaka vnosa!</b> Krajševalni niz se ne ujema z njegovimi pravili. Mora biti 1 do ".$maxlength." znakov dolg in lahko vsebuje male črke in številke.
</div><br>";
        $longurlregex_success = "Preverjanje dolgega URL-ja je pozitivno. Dolg URL se lahko uporabi.\n";
        $longurlregex_error = "Preverjanje dolgega URL-ja je negativno, zato ne bom nadeljeval.\n";
        $longurlregex_error_ui = "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Napaka vnosa!</b> Dolg URL se ne ujema z standardi. Poskusite ponovno. Posebni znaki v URL-ju (kot na primer š) morajo biti URL kodirani.
</div><br>";
        $longurl_too_long = "Dolg URL je predolg. Mora biti krajši od ".$longurlmaxlen." bajtov, drugače lahko pride do napak v podatkovni bazi.\n";
        $longurl_too_long_ui = "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Napaka vnosa!</b> URL je predolg. Mora biti krajši od ".$longurlmaxlen." bajtov.
</div><br>";
        $longurl_not_too_long = "Dolg URL ni predolg. To je v redu.\n";
        $shortlink_free_error_ui = "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Napaka!</b> Krajšalni tekst že obstaja v podatkovni bazi. Izberite drugega.
</div><br>";
        $shortlink_free_error = "Krajševalni tekst že obstaja v podatkovni bazi, zato ne morem nadaljevati.\n";
        $shortlink_free = "Krajševalni tekst še ne obstaja v podatkovni bazi. To je v redu.\n";
        $longurl_free_error_ui = "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Napaka!</b> Dolg URL že obstaja v podatkovni bazi. Nanj kaže <b>";
        $longurl_free_error = "Dolg URL že obstaja v podatkovni bazi, zato ne morem nadaljevati.\n";
        $longurl_free_success = "Dolg URL še ne obstaja v podatkovni bazi. To je v redu.\n";
        $url_was_not_shortened_error = "URL ni bil okrajšan. Glej napake zgoraj!";
        $unknown_database_error_ui = "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Sistemska napaka!</b> Neznana napaka podatkovne baze.
</div><br>";
        $unknown_database_error = "Neznana napaka podatkovne baze. Glej sistemske dnevnike.\n";
        $shortlink_success_ui = "<div class=alertok>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Uspešno!</b> Šortlink <b>".$domena."/".htmlspecialchars($_REQUEST['short'])."</b> je bil uspešno narejen!
</div><br>";
        $shortlink_success = "Šortlink ".$domena."/".htmlspecialchars($_REQUEST['short'])." je bil uspešno narejen!\n";
        $form_not_sent = "Obrazec ni bil izpolnjen, zato samo prikazujem stran.\n";
        $title = "ŠortLink Slav ž.ga (aka Shortlink Balkan)";
        $subtitle = "<h2 align=center>Ste kdaj hoteli narediti iz dolgega linka ŠortLink tako, da bi izgledal bolj slovansko?</h2>
<h2 align=center>Tudi če niste, je tukaj ŠortLink Balkan, edini Link Šortener, namenjen predvsem slovanskim narodom, saj za njegovo uporabo potrebujete črko Š!</h2>
<h3 align=center>Vsi Šortani linki se bodo začeli z ž.ga, na primer š.ga/tekst. Najs ane?</h3>
<h4 align=center>Šortlinker deluje v kooperaciji z ÷.ga šortlinkerjem (internacionalizirana verzija tega). Vsi šortani linki,
izdelani na ÷.ga bodo delovali tudi na š.ga in obratno. Za angleško različico odprite <a href=https://÷.ga/>÷.ga</a>.</h4>";
        $longurl_placeholder = "Vpiši dolg URL";
        $shortexpression_placeholder = "Vpiši krajšalnico";
        $captcha_placeholder = "Prepiši znake";
        $submit_value = "Skrajšaj";
        $insecure_warning = "OPOZORILO: Povezan si preko nešifrirane povezave.";
        $secure_connection = "Varna povezava je vzpostavljena.";
        $cookie_warning = "ŠortLink Slav za svoje delovanje potrebuje in uporablja sejne piškotke. Z uporabo storitve se strinajte z shranjevanjem piškotkov
v vaš brskalnik za največ 24 minut. Piškotek se uporablja samo za interni namen, torej za to, da izvemo katere črke si imel na preverjanju za ljudi (CAPTCHA)
in nikakor ne za namene vohunjenja (tracking cookies). Piškotki so vidni samo na domeni ž.ga, torej samo našemu strežniku. To sporočilo smo vam po veljavnem EU
zakonu morali pokazati, ker je strežnik lociran v Sloveniji, ki sledi EU direktivam o piškotkih, kar pomeni, da moram upoštevati te <!--glupe --> zakone.<hr><!--<b>Š.GA je bil 18. septembra preseljen na drug strežnik (zato [RELOADED]). Ker sem bil preveč len, da bi prenesel tudi dejtabejs s starimi linki, se STARI LINKI NE BODO PREUSMERILI. Če ste jih natiskali na 1000 plakatov ali če so nujno potrebni za vaš botnet CNC, me pokličite (+38664176345(8265)), da jih prenesem. Če potrebujete API dostop brez captche, prav tako pokličite, da se zmenimo!</b>-->
Administrator je Anton Luka Šijanec, kontakt: +38664176345 in sijanecantonluka+shortlink@gmail.com.
";
} else {
        $securimage_folder_missing = "securimage folder missing";
        $dbconn_error = "<pre>Connection to the database was not successful. <!-- Debug: ";
        $dbconn_success = "Connection to the database was successful.\n";
        $dbuse_success = "Database picked successfully.\n";
        $dbuse_error = "Unable to pick database. <!-- Debug: ";
        $tableexists = "Table in database already exists. Program was already ran.\n";
        $tablenotexists = "Table in database does not exist yet. Program is now being ran for the first time. Trying to create table.\n";
        $dbtablecreate_success = "Table in database was successfully created.\n";
        $dbtablecreate_error = "<pre>Error while creating database table! <!-- debug: ";
        $shortlink_notexists = "Shortlink is not present in the database yet.\n";
        $shortlink_notexists_ui = "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Error!</b> Shortlink has not been created yet.
</div><br>";
        $form_sent = "Form received, starting sanitization.";
        $captcha_error = "Anti Robot test (CAPTCHA) was not submitted correctly. Not continuing, maybe the client is a script.";
        $captcha_error_ui = "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Input error!</b> Human test CAPTCHA reported a negative. Maybe you are not human, so I will not continue. Please, try again.
</div><br>";
        $shortlinkregex_success = "Shortlink is in the correct form. We can pass on.\n";
        $captcha_success = "Captcha was successfully submitted. You are a human.";
        $shortlinkregex_error = "Shortlink does not compile with regex " . $rxshort . ", so I will not continue.\n";
        $shortlinkregex_error_ui = "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Input error!</b> Shortlink does not compile with the rules. It must be one to ".$maxlength." characters long and can only
contain lowercase letters and numbers.
</div><br>";
        $longurlregex_success = "Long URL regex check positive. Long URL can be used.\n";
        $longurlregex_error = "Long URL regex check negative, so I will not continue.\n";
        $longurlregex_error_ui = "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Input error!</b> Long URL does not compile with the rules. Try again. Special characters (such as š) have to be URL encoded.
</div><br>";
        $longurl_too_long = "Long URL is too long. It has to be shorter than ".$longurlmaxlen." bytes, otherwise it can come to database errors.\n";
        $longurl_too_long_ui = "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Input error!</b> URL is too long. It has to be shorter than ".$longurlmaxlen." bytes.
</div><br>";
        $longurl_not_too_long = "Dolg URL ni predolg. To je v redu.\n";
        $shortlink_free_error_ui = "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Error!</b> Shortlink already exists in our database. Pick something else.
</div><br>";
        $shortlink_free_error = "Shortlink already exists, so I can't continue.\n";
        $shortlink_free = "Shortlink does not exist in the database yet, so we can continue. That is ok.\n";
        $longurl_free_error_ui = "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Error!</b> Long URL is already present in database. This shortlink points to it: <b>";
        $longurl_free_error = "Long URL is already present in the database, so I can't continue.\n";
        $longurl_free_success = "Long URL is not yet present in our database. That is ok, I will continue.\n";
        $url_was_not_shortened_error = "URL was not shortened. See errors above!";
        $unknown_database_error_ui = "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>System error!</b> Unknown database error.
</div><br>";
        $unknown_database_error = "Unknown database error, see system logs.\n";
        $shortlink_success_ui = "<div class=alertok>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Success!</b> Shortlink <b>".$domena."/".htmlspecialchars($_REQUEST['short'])."</b> was successfully created!
</div><br>";
        $shortlink_success = "Shortlink ".$domena."/".htmlspecialchars($_REQUEST['short'])." was successfully created!\n";
        $form_not_sent = "Form was not sent, that is why I am just displaying the webpage.\n";
        $title = "Slavic Link Shortener";
        $subtitle = "<h2 align=center>Ever wanted a unique and cool shortlink?</h2>
<h2 align=center>Even if you didn't, this shortlink servive is truly awesome. It uses a one letter domain ÷.ga which is
accessible via a simple shortcut on all keyboard layouts.</h2>
<h3 align=center>All shorted links will start with ÷.ga/, for example ÷.ga/text. Nice, huh?</h3>
<h4 align=center>This service is cooperating with š.ga, balkan shortlinker that uses slavic letter š (š.ga). All links created there
will work here as well and vice versa. Visit <a href=https://š.ga/>š.ga</a> for slovenian version.</h4>
<h5 align=center>Note: we have noticed that some browsers show ÷ as xn--oda. This should not cause any problems.
Typing ÷.ga/link will nonetheless still work as a regular shortlink.</h5>
";
        $longurl_placeholder = "Enter long URL";
        $shortexpression_placeholder = "Enter short suffix (expression)";
        $captcha_placeholder = "Retype characters from Captcha";
        $submit_value = "Shorten";
        $insecure_warning = "WARNING: You are connected via plaintext connection.";
        $secure_connection = "Secure connection is established.";
        $cookie_warning = "We use cookies. Not for evil purposes, just for storing your session information for about 24 minutes. And
        we do respect your privacy. In fact they are only used to preserve information about captcha code generated in one request and
        resubmitted in another. Captcha code (six letter jumble) does not contain any sensible information, trust me (-;";
}

// samoinštalacija - .htaccess ne sme obstajati ob prvem zagonu (sicer se uporabi le v apache okolju)
/*
if(!file_exists(".htaccess")) {
        $htaccess = "
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?r=$1 [NC,L,QSA]
        ";
        if(file_put_contents(".htaccess", $htaccess)) {
                exit("Program je bil verjetno zagnan prvič. Izdelava .htaccess je uspela.\n");
        } else {
                $log .= "Program je bil zagnan verjetno prvič. Izdelava .htaccess ni uspela. Popravi dovoljenja mape.\n";
        }
}

if($_REQUEST['k'] == $kljuc) {
        $_SESSION['k'] = $_REQUEST['k'];
}
*/

/*
if($captcha !== "ne" && 1==0) {
/*
if(!file_exists("/securimage")) {
        exit($securimage_folder_missing);
} else {
        // okejjjjj
}
 // ne delamo več tko, zdej je composer
}
*/

// sql povezava in izbira podatkovne baze
$conn = mysqli_connect($servername, $username, $password, $baza); // naredi povezavo
if (!$conn) { // preveri povezavo
    die($dbconn_error . mysqli_connect_error() . "-->\n</pre>");
}
$log .= $dbconn_success;
if(mysqli_select_db($conn,$baza)) {
        $log .= $dbuse_success;
} else {
        die($dbuse_error . mysqli_error($conn) . "-->\n");
}





//poglej če tabela links obstaja
$alitabelaobstaja = mysqli_query($conn, 'SELECT 1 from `'.$tabela.'`');
if($alitabelaobstaja !== FALSE) {
   $log .= $tableexists;
} else {
   // ne - naredi jo!
   $log .= $tablenotexists;
$sql = 'CREATE TABLE IF NOT EXISTS `'.$tabela.'` (  `short` varchar('.$maxlength.
') COLLATE utf8_unicode_ci NOT NULL,
  `long` text('.$longurlmaxlen.') COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`short`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci';
if (mysqli_query($conn, $sql)) {
    $log .= $dbtablecreate_success;
} else {
    die($dbtablecreate_error . mysqli_error($conn) . "-->\n</pre>");
}
}


//če je potrebna preusmeritev
if(!empty($_REQUEST['r'])) {
        // preveri, če dolg niz že obstaja

$safer = mysqli_real_escape_string($conn, $_REQUEST['r']);
// joj kaj je to sranje
// echo $safer; //debug-ne, ker xss
$query = "SELECT `long` from `".$tabela."` where `short`='".$safer."';";
$result = mysqli_query($conn, $query);
echo mysqli_error($conn); //debug
if(mysqli_num_rows($result) > 0) {


        // echo array_pop(mysqli_fetch_row($result); //debug //to je to!
        $dolgkiobstaja = array_pop(mysqli_fetch_row($result)); //to je to!
        // ŠortLink obstaja, preusmerjam!
        header("Location: ".$dolgkiobstaja);
} else {
                 $log .= $shortlink_notexists;
                  $alert .= $shortlink_notexists_ui;
}
}



// če je zahteva za vpis, vpiši!
if(!empty($_REQUEST['submit'])) {
        $log .= $form_sent;


if($captcha !== "ne" && $_REQUEST['k'] !== $kljuc && $_SESSION['k'] !== $kljuc) {
        if ($securimage->check($_POST['captcha_code']) == false) {
                $log .= $captcha_error;
        $alert .= $captcha_error_ui;
   $nadaljuj = "ne";
} else {
        $log .= $captcha_success;
}
}

// regex match kratkega niza
if(preg_match($rxshort, $_REQUEST['short'])) {
        $log .= $shortlinkregex_success;
} else {
        $log .= $shortlinkregex_error;
        $nadaljuj = "ne";
                $alert .= $shortlinkregex_error_ui;
}


// preverjanje, ce je res URL
if(filter_var($_REQUEST['long'], FILTER_VALIDATE_URL)) {
        $log .= $longurlregex_success;
} else {
        $log .= $longurlregex_error;
        $nadaljuj = "ne";
        $alert .= $longurlregex_error_ui;
}


// preprecevanje sql prekoračitve
if(strlen($_REQUEST['long']) > $longurlmaxlen) { //strlen pove bajte, mb_strlen pove dolžino niza
        $log .= $longurl_too_long;
        $nadaljuj = "ne";
        $alert .= $longurl_too_long_ui; //drugače lahko pride do napak v SQL bazi podatkov
} else {
        $log .= $longurl_not_too_long;
}

if($nadaljuj == "ja") { //nadaljuj z sql stvarmi, samo, če so zgornji pogoji zadostni

//preveri, če kratek niz že obstaja
$safeshort = mysqli_real_escape_string($conn, $_REQUEST['short']);
$query = "SELECT * from `".$tabela."` where `short`='".$safeshort."';";
$result = mysqli_query($conn, $query);
if(mysqli_num_rows($result) > 0) {
         $alert .= $shortlink_free_error_ui;
         $log .= $shortlink_free_error;
         $nadaljuj = "ne";
} else {
                 $log .= $shortlink_free;
}

// preveri, če dolg niz že obstaja
$safelong = mysqli_real_escape_string($conn, $_REQUEST['long']);
$query = "SELECT `short` from `".$tabela."` where `long`='".$safelong."';";
$result = mysqli_query($conn, $query);
if(mysqli_num_rows($result) > 0) {
        // echo array_pop(mysqli_fetch_row($result); //debug //to je to!
        $kratekkiobstaja = array_pop(mysqli_fetch_row($result)); //to je to!
         $alert .= $longurl_free_error_ui.$domena."/".htmlspecialchars($kratekkiobstaja)."</b>
</div><br>";
         $log .= $longurl_free_error;
         $nadaljuj = "ne";
} else {
                 $log .= $longurl_free_success;
}

        /*
//idk ne dela -- v redu, vem zakaj: podpičje manjka! jaoooo in še `'" jaooooo sql nima ", ' je za nize, ` je za stolpce, tabele,...
$prepared = mysqli_prepare($conn, "SELECT * FROM ".$tabela." WHERE short=?");
// var_dump(mysqli_error($conn)); //debug
$binded = mysqli_stmt_bind_param($prepared, "s", $_REQUEST['short']);
// echo $binded; //debug
$executed = mysqli_stmt_execute($prepared);
echo $executed; //debug
$binded_result = mysqli_stmt_bind_result($prepared, $rezultat);
echo $rezultat; //debug
$fetched = mysqli_stmt_fetch($prepared);
echo $fetched; //debug
$result = mysqli_query($conn, $prepared);
echo mysqli_error($conn); //debug
if(mysqli_num_rows($result) == 0) {
         $log .= "Krajševalni tekst še ne obstaja v podatkovni bazi. To je v redu.\n";
} else {
         $alert .= "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Napaka!</b> Krajšalni tekst že obstaja v podatkovni bazi. Izberite drugega.
</div><br>";
         $log .= "Krajševalni tekst že obstaja v podatkovni bazi, zato ne morem nadaljevati.\n";
         $nadaljuj = "ne";
}

//preverjanje, če krajševalni niz že obstaja
$prepared = mysqli_prepare($conn, "SELECT * FROM ".$tabela." WHERE long=?");
// echo mysqli_error($conn); //debug
mysqli_stmt_bind_param($prepared, "s", $_REQUEST['long']);
$result = mysqli_query($conn);
if(mysqli_num_rows($result) == 0) {
         $log .= "Dolg URL še ne obstaja v podatkovni bazi. To je v redu.\n";
} else {
         $alert .= "<div class=alert>
  <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
<b>Napaka!</b> Dolg URL že obstaja v podatkovni bazi. Nanj vodi <b>".$domena."/".htmlspecialchars($result)."</b>.
</div><br>";
         $log .= "Dolg URL že obstaja v podatkovni bazi, zato ne morem nadaljevati. Nanj vodi ".$domena."/".htmlspecialchars($result).".\n";
         $nadaljuj = "ne";
}
*/
}




if($nadaljuj !== "ja") {
        $log .= $url_was_not_shortened_error;
} else {
$query = "INSERT INTO `".$tabela."` (`short`, `long`) VALUES ('".$safeshort."','".$safelong."');";
$result = mysqli_query($conn, $query);
// var_dump(mysqli_error($conn)); //debug


        //preveri uspeh
$query = "SELECT * FROM `".$tabela."` WHERE `short`='".$safeshort."';";
$result = mysqli_query($conn, $query);
if(mysqli_num_rows($result) == 0) {
        // var_dump(mysqli_error($conn)); //debug
         $alert .= $unknown_database_error_ui;
         $log .= $unknown_database_error;
} else {
         $alert .= $shortlink_success_ui;
         $log .= $shortlink_success;

}



        }




} else {
        $log .= $form_not_sent;
}


$print .= "
<script src=tohttps.js language=javascript type='text/javascript'></script>
<style>
html {
  color: white;
  background: black;
  font-family: monospace;
}
input {
  color: white;
  background: black;
  font-family: monospace;
}
.alert {
  opacity: 1;
  transition: opacity 0.6s; /* 600ms za izgine */
}
/* Škatla z obvestilom */
.alert {
  padding: 20px;
  background-color: #f44336; /* Rdeča */
  color: white;
  margin-bottom: 15px;
}

.alertok {
  padding: 20px;
  background-color: #43f436; /* Zelena */
  color: white;
  margin-bottom: 15px;
}

/* Gumb za zapreti */
.closebtn {
  margin-left: 15px;
  color: white;
  font-weight: bold;
  float: right;
  font-size: 22px;
  line-height: 20px;
  cursor: pointer;
  transition: 0.3s;
}

/* Ko je miška pod gumbom za zapreti */
.closebtn:hover {
  color: black;
}
</style>

<script>
// Dobi vse elemente z class=closebtn
var close = document.getElementsByClassName('closebtn');
var i;

// Pojdi čez vse gumbe za zapreti
for (i = 0; i < close.length; i++) {
  // Ko je gumb kliknjen
  close[i].onclick = function(){

    // Dobi starša od <span class=closebtn> (<div class=alert>)
    var div = this.parentElement;

    // Nastavi -prosojnost div-a na 0 (prozorna)
    div.style.opacity = 0;

    // Skrij div po 600ms (Ko izgine, izginotje je definirano tudi v CSS-ju)
    setTimeout(function(){ div.style.display = 'none'; }, 600);
  }
}


</script>
<meta name=viewport content='width=device-width, initial-scale=1.0'>
";
$print .= "
<title>".$title."</title>
<h1 align=center>".$title."</h1>
"./*$subtitle*/null."
<div align=center>
<form method=POST action=''>
        <input autocomplete=off type=url name=long placeholder='".$longurl_placeholder." ...' required=required align=center><br>
        ".$domena."/<input maxlength=".$maxlength." autocomplete=off type=text name=short placeholder='".$shortexpression_placeholder." ...' required=required align=center><br>
        <img id=captcha src=/vendor/dapphp/securimage/securimage_show.php alt='Captcha' align=center /><br>
        <input autocomplete=off type=text placeholder='".$captcha_placeholder." ...' name=captcha_code size=10 maxlength=6 align=center/><br>
        <input autocomplete=off type=submit name=submit value='".$submit_value."!' align=center>
</form>
";

if(empty($_SERVER['HTTPS'])) {
        $print .= "<br><text style=color:red;>".$insecure_warning."</text>";
} else {
        $print .="<br><text style=color:green;>".$secure_connection."</text>";
}

$print .= "
<br>
<small align=center>
".$cookie_warning."
</small>
</div>
";
//$print .= "<h4 align=center>Ker še nisem sprogramiral, ŠortLink Balkan še ne deluje. Ne uporabljaj ga, ker ne bo nič naredil.</h4>";




echo "<!--<pre>" . $log . "</pre>-->";
echo $print;
echo $alert;
?>