Blame


1 cfa30988 2022-08-12 mischa <?php
2 cfa30988 2022-08-12 mischa require_once './conf.php';
3 cfa30988 2022-08-12 mischa
4 cfa30988 2022-08-12 mischa define("SHORTER_NAME", "shortr");
5 04d41647 2022-08-24 mischa define("SHORTER_VERSION", "v0.4");
6 cfa30988 2022-08-12 mischa define("CHARSET", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
7 cfa30988 2022-08-12 mischa
8 cfa30988 2022-08-12 mischa $url = "";
9 cfa30988 2022-08-12 mischa $link = "";
10 cfa30988 2022-08-12 mischa $callback = "NO";
11 d2d3c30b 2022-08-28 mischa $dbh = new PDO('mysql:host='. DB_HOST . ';dbname='. DB_NAME , DB_USER, DB_PASS);
12 cfa30988 2022-08-12 mischa
13 ed72d845 2022-08-24 mischa if (DEBUG == 'true') {
14 ed72d845 2022-08-24 mischa ini_set('display_errors', 1);
15 ed72d845 2022-08-24 mischa ini_set('display_startup_errors', 1);
16 ed72d845 2022-08-24 mischa error_reporting(E_ALL);
17 ed72d845 2022-08-24 mischa } else {
18 ed72d845 2022-08-24 mischa ini_set('display_errors', 0);
19 ed72d845 2022-08-24 mischa ini_set('display_startup_errors', 0);
20 ed72d845 2022-08-24 mischa }
21 ed72d845 2022-08-24 mischa
22 c58ab04d 2022-08-24 mischa function generate_short($url, $dbh) {
23 cfa30988 2022-08-12 mischa if(!preg_match("/^((https?|ftp)[:\/\/].*\/{2,})/i",$url)) {
24 cfa30988 2022-08-12 mischa return false;
25 cfa30988 2022-08-12 mischa }
26 cfa30988 2022-08-12 mischa if (substr($url, 0, strlen(BASE_URL)) == BASE_URL){
27 cfa30988 2022-08-12 mischa return false;
28 cfa30988 2022-08-12 mischa }
29 cfa30988 2022-08-12 mischa if (!empty($_SERVER['HTTP_X_CLIENTIP'])) {
30 cfa30988 2022-08-12 mischa $clientip = $_SERVER['HTTP_X_CLIENTIP'];
31 cfa30988 2022-08-12 mischa } else {
32 cfa30988 2022-08-12 mischa $clientip = $_SERVER['REMOTE_ADDR'];
33 cfa30988 2022-08-12 mischa }
34 c58ab04d 2022-08-24 mischa $sth = $dbh->prepare("SELECT id FROM " . DB_TABLE . " WHERE url=?");
35 c58ab04d 2022-08-24 mischa $sth->bindParam(1, $url, PDO::PARAM_STR);
36 c58ab04d 2022-08-24 mischa $sth->execute();
37 c58ab04d 2022-08-24 mischa if ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
38 cfa30988 2022-08-12 mischa $hash = $row['id'];
39 cfa30988 2022-08-12 mischa } else {
40 595667d4 2022-08-24 mischa $hash = substr(str_shuffle(CHARSET), 0, HASH_LENGTH);
41 c58ab04d 2022-08-24 mischa $sth = $dbh->prepare("SELECT COUNT(*) FROM " . DB_TABLE . " WHERE id=?");
42 c58ab04d 2022-08-24 mischa $sth->bindParam(1, $hash, PDO::PARAM_STR, HASH_LENGTH);
43 c58ab04d 2022-08-24 mischa $sth->execute();
44 595667d4 2022-08-24 mischa $loop = 0;
45 c58ab04d 2022-08-24 mischa while ($sth->fetchColumn() > 0) {
46 595667d4 2022-08-24 mischa if ($loop == 10) {
47 595667d4 2022-08-24 mischa $hash = "ERROR<br />Unable to create hash!";
48 595667d4 2022-08-24 mischa break;
49 595667d4 2022-08-24 mischa }
50 595667d4 2022-08-24 mischa $hash = substr(str_shuffle(CHARSET), 0, HASH_LENGTH);
51 c58ab04d 2022-08-24 mischa $sth->bindParam(1, $hash, PDO::PARAM_STR, HASH_LENGTH);
52 c58ab04d 2022-08-24 mischa $sth->execute();
53 595667d4 2022-08-24 mischa $loop++;
54 cfa30988 2022-08-12 mischa }
55 d1f0b54f 2022-08-24 mischa try {
56 d1f0b54f 2022-08-24 mischa $sth = $dbh->prepare("INSERT INTO " . DB_TABLE . " (id, url, ip, count) VALUES (?, ?, ?, '0')");
57 d1f0b54f 2022-08-24 mischa $sth->bindParam(1, $hash, PDO::PARAM_STR, HASH_LENGTH);
58 d1f0b54f 2022-08-24 mischa $sth->bindParam(2, $url, PDO::PARAM_STR);
59 d1f0b54f 2022-08-24 mischa $sth->bindParam(3, $clientip, PDO::PARAM_STR, 255);
60 d1f0b54f 2022-08-24 mischa $sth->execute();
61 d1f0b54f 2022-08-24 mischa } catch (PDOException $e) {
62 595667d4 2022-08-24 mischa $hash = "ERROR<br />Failed to insert hash!";
63 cfa30988 2022-08-12 mischa }
64 cfa30988 2022-08-12 mischa }
65 cfa30988 2022-08-12 mischa return $hash;
66 cfa30988 2022-08-12 mischa }
67 cfa30988 2022-08-12 mischa
68 c58ab04d 2022-08-24 mischa function find_short($hash, $dbh) {
69 c58ab04d 2022-08-24 mischa $sth = $dbh->prepare("SELECT * FROM " . DB_TABLE . " WHERE id=?");
70 c58ab04d 2022-08-24 mischa $sth->bindParam(1, $hash, PDO::PARAM_STR, HASH_LENGTH);
71 c58ab04d 2022-08-24 mischa $sth->execute();
72 c58ab04d 2022-08-24 mischa if ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
73 cfa30988 2022-08-12 mischa $link = $row['url'];
74 c58ab04d 2022-08-24 mischa $sth = $dbh->prepare("UPDATE " . DB_TABLE . " SET count = count + 1 WHERE id=?");
75 c58ab04d 2022-08-24 mischa $sth->bindParam(1, $row['id'], PDO::PARAM_STR, HASH_LENGTH);
76 c58ab04d 2022-08-24 mischa $sth->execute();
77 cfa30988 2022-08-12 mischa } else {
78 cfa30988 2022-08-12 mischa $link = false;
79 cfa30988 2022-08-12 mischa }
80 cfa30988 2022-08-12 mischa return $link;
81 cfa30988 2022-08-12 mischa }
82 cfa30988 2022-08-12 mischa
83 cfa30988 2022-08-12 mischa if (isset($_POST['url'])) {
84 c05bfb5d 2022-08-12 mischa if ($_POST['url'] != '' && strlen($_POST['url']) > 0) {
85 d2d3c30b 2022-08-28 mischa $link = generate_short($_POST['url'], $dbh);
86 cfa30988 2022-08-12 mischa } else {
87 cfa30988 2022-08-12 mischa $link = false;
88 cfa30988 2022-08-12 mischa }
89 cfa30988 2022-08-12 mischa }
90 cfa30988 2022-08-12 mischa
91 cfa30988 2022-08-12 mischa if (isset($_GET['hash']) && $_GET['hash'] != '' && strlen($_GET['hash']) > 0) {
92 cfa30988 2022-08-12 mischa $path = explode('/', $_SERVER['REQUEST_URI']);
93 cfa30988 2022-08-12 mischa $uri = $path[count($path)-1];
94 cfa30988 2022-08-12 mischa if ($uri != '') {
95 d2d3c30b 2022-08-28 mischa $link = find_short($uri, $dbh);
96 cfa30988 2022-08-12 mischa if ($link != '') {
97 cfa30988 2022-08-12 mischa header("Cache-Control: no-cache, must-revalidate");
98 cfa30988 2022-08-12 mischa header("Expires: Wed, 29 Feb 1984 00:00:00 GMT");
99 cfa30988 2022-08-12 mischa header("Location: $link", TRUE, 301);
100 cfa30988 2022-08-12 mischa }
101 cfa30988 2022-08-12 mischa }
102 cfa30988 2022-08-12 mischa }
103 cfa30988 2022-08-12 mischa
104 cfa30988 2022-08-12 mischa if ($callback == 'NO') {
105 d2d3c30b 2022-08-28 mischa $sth = $dbh->query("SELECT COUNT(*) FROM ". DB_TABLE);
106 d2d3c30b 2022-08-28 mischa $count = $sth->fetchColumn();
107 cfa30988 2022-08-12 mischa ?>
108 cfa30988 2022-08-12 mischa <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
109 cfa30988 2022-08-12 mischa <html>
110 cfa30988 2022-08-12 mischa <head>
111 cfa30988 2022-08-12 mischa <title><?php print SITE_TITLE ?></title>
112 cfa30988 2022-08-12 mischa <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
113 cfa30988 2022-08-12 mischa <meta name="keywords" content="shorter url tinyurl" />
114 cfa30988 2022-08-12 mischa <meta name="viewport" content="width=device-width, initial-scale=1" />
115 cfa30988 2022-08-12 mischa <style type="text/css" media="screen">
116 cfa30988 2022-08-12 mischa body {
117 cfa30988 2022-08-12 mischa background: #282828;
118 cfa30988 2022-08-12 mischa color: #ffffff;
119 cfa30988 2022-08-12 mischa font-family: Arial,"MS Trebuchet",sans-serif;
120 cfa30988 2022-08-12 mischa font-size: 14px;
121 cfa30988 2022-08-12 mischa margin: 0;
122 cfa30988 2022-08-12 mischa padding: 0;
123 cfa30988 2022-08-12 mischa text-align: center;
124 cfa30988 2022-08-12 mischa }
125 cfa30988 2022-08-12 mischa
126 cfa30988 2022-08-12 mischa #container {
127 cfa30988 2022-08-12 mischa width: 500px;
128 cfa30988 2022-08-12 mischa margin: 0 auto;
129 cfa30988 2022-08-12 mischa padding: 20px;
130 cfa30988 2022-08-12 mischa display: block;
131 cfa30988 2022-08-12 mischa }
132 cfa30988 2022-08-12 mischa
133 cfa30988 2022-08-12 mischa #header {
134 cfa30988 2022-08-12 mischa font-size: 20px;
135 cfa30988 2022-08-12 mischa height: 100px;
136 cfa30988 2022-08-12 mischa font-variant: small-caps;
137 cfa30988 2022-08-12 mischa }
138 cfa30988 2022-08-12 mischa
139 cfa30988 2022-08-12 mischa #content form input {
140 cfa30988 2022-08-12 mischa width: 495px;
141 cfa30988 2022-08-12 mischa }
142 cfa30988 2022-08-12 mischa
143 cfa30988 2022-08-12 mischa #shorterurl_wrapper {
144 cfa30988 2022-08-12 mischa width: 500px;
145 cfa30988 2022-08-12 mischa height: 100px;
146 cfa30988 2022-08-12 mischa border: 1px dashed;
147 cfa30988 2022-08-12 mischa margin-top: 50px;
148 cfa30988 2022-08-12 mischa background-color: #383838;
149 cfa30988 2022-08-12 mischa text-align: center;
150 cfa30988 2022-08-12 mischa }
151 cfa30988 2022-08-12 mischa
152 cfa30988 2022-08-12 mischa #shorterurl {
153 cfa30988 2022-08-12 mischa margin: 30px 30px 30px 30px;
154 cfa30988 2022-08-12 mischa font-size: 25px;
155 cfa30988 2022-08-12 mischa font-family: Verdana,Arial;
156 cfa30988 2022-08-12 mischa font-weight: bold;
157 cfa30988 2022-08-12 mischa }
158 cfa30988 2022-08-12 mischa </style>
159 cfa30988 2022-08-12 mischa </head>
160 cfa30988 2022-08-12 mischa </html>
161 cfa30988 2022-08-12 mischa <body>
162 cfa30988 2022-08-12 mischa <div id="container">
163 cfa30988 2022-08-12 mischa <div id="header">
164 cfa30988 2022-08-12 mischa <h1 id="shortertitle"><i><?php print SITE_TITLE ?></i></h1>
165 cfa30988 2022-08-12 mischa </div>
166 cfa30988 2022-08-12 mischa <div id="content">
167 cfa30988 2022-08-12 mischa <form id="shorterform" method="post">
168 cfa30988 2022-08-12 mischa <input id="url" type="text" name="url" value="<?php print $url ?>" />
169 cfa30988 2022-08-12 mischa </form>
170 cfa30988 2022-08-12 mischa <div id="shorterurl_wrapper">
171 cfa30988 2022-08-12 mischa <div id="shorterurl">
172 cfa30988 2022-08-12 mischa <?php
173 cfa30988 2022-08-12 mischa if ($link === false) {
174 cfa30988 2022-08-12 mischa echo "<span style='color: red;'>Unknown / Invalid URL</span>";
175 595667d4 2022-08-24 mischa } elseif (str_contains($link, "ERROR")) {
176 595667d4 2022-08-24 mischa echo "<span style='color: red;'>$link</span>";
177 cfa30988 2022-08-12 mischa } else {
178 cfa30988 2022-08-12 mischa if ($link != '') {
179 cfa30988 2022-08-12 mischa echo "<span style='color: white;'>" . BASE_URL . $link . "</span>";
180 cfa30988 2022-08-12 mischa }
181 cfa30988 2022-08-12 mischa }
182 cfa30988 2022-08-12 mischa ?>
183 cfa30988 2022-08-12 mischa </div>
184 cfa30988 2022-08-12 mischa </div>
185 cfa30988 2022-08-12 mischa </div>
186 cfa30988 2022-08-12 mischa <p>
187 cfa30988 2022-08-12 mischa <small>Currently holding <?php print "$count" ?> entries.<br /><br /><?php print SHORTER_NAME . " " . SHORTER_VERSION ?><br /></small>
188 cfa30988 2022-08-12 mischa </p>
189 cfa30988 2022-08-12 mischa </div>
190 cfa30988 2022-08-12 mischa </body>
191 cfa30988 2022-08-12 mischa </html>
192 cfa30988 2022-08-12 mischa <?php
193 cfa30988 2022-08-12 mischa }
194 cfa30988 2022-08-12 mischa ?>