initial commit
|
@ -0,0 +1,13 @@
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteBase /
|
||||||
|
RewriteRule ^error[0-9]+\.html - [PT,L,QSA]
|
||||||
|
RewriteRule ^website/.* - [PT,L,QSA]
|
||||||
|
RewriteRule ^admin/.* - [PT,L,QSA]
|
||||||
|
RewriteRule ^api/(.*) - [PT,L,QSA]
|
||||||
|
RewriteRule ^api.php$ api/plain.php [QSA,L]
|
||||||
|
RewriteCond $0 !.+\.php$
|
||||||
|
RewriteRule ^([0-9a-z]+)(\.[a-z]+)? expand.php?id=$1&ext=$2
|
||||||
|
|
||||||
|
ErrorDocument 404 /error404.html
|
||||||
|
ErrorDocument 403 /error403.html
|
||||||
|
ErrorDocument 500 /error500.html
|
|
@ -0,0 +1,4 @@
|
||||||
|
AuthType Basic
|
||||||
|
AuthName "Service-Bereich"
|
||||||
|
AuthUserFile /var/www/mod4.cc/u/admin/.htusers
|
||||||
|
Require valid-user
|
|
@ -0,0 +1,2 @@
|
||||||
|
jcoder:Fg3Ktv3chlhtA
|
||||||
|
jsilence:2/vwYRREnHZmc
|
|
@ -0,0 +1,74 @@
|
||||||
|
<?php
|
||||||
|
include_once(dirname(__FILE__).'/../lib/functions.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/../lib/config.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/../lib/UrlShortener.class.php');
|
||||||
|
|
||||||
|
$urlShortener = new UrlShortener();
|
||||||
|
|
||||||
|
$linkData = $urlShortener->getStatsLinkData(-1);
|
||||||
|
|
||||||
|
echo "<" . "?xml version=\"1.0\"?".">\n";
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>URL Shortener - Admin</title>
|
||||||
|
<link rel="stylesheet" href="reset.css" type="text/css" />
|
||||||
|
<link rel="stylesheet" href="style.1.css" type="text/css" />
|
||||||
|
<script src="../website/jquery-1.4.3.min.js" type="text/javascript"></script>
|
||||||
|
<script src="../website/jquery.cookie.js" type="text/javascript"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="navigation" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div style="padding:20px;">
|
||||||
|
Navigation:
|
||||||
|
<a href="index.php" class="navlink">Overview</a>
|
||||||
|
<a href="all-ids.php" class="navlink hl">All IDs</a>
|
||||||
|
<a href="custom-ids.php" class="navlink">Custom IDs</a>
|
||||||
|
<a href="normal-ids.php" class="navlink">Normal IDs</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="main" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div style="padding:20px;">
|
||||||
|
<?php
|
||||||
|
if (count($linkData) > 0) {
|
||||||
|
?>
|
||||||
|
<div class="captioned">All links:</div>
|
||||||
|
<table summary="all links">
|
||||||
|
<tr>
|
||||||
|
<th>Short ID</th>
|
||||||
|
<th>Long link</th>
|
||||||
|
<th>Last clicked at</th>
|
||||||
|
<th>Number of visits</th>
|
||||||
|
</tr>
|
||||||
|
<?php
|
||||||
|
for ($i = 0; $i < count($linkData); $i++) {
|
||||||
|
$oneLink = $linkData[$i];
|
||||||
|
?>
|
||||||
|
<tr>
|
||||||
|
<td><a href="<?= (SERVICE_BASE_URL . $oneLink['id']) ?>"><?= $oneLink['id'] ?></a></td>
|
||||||
|
<td><?= $oneLink['url'] ?></td>
|
||||||
|
<td><?= $oneLink['date'] ?></td>
|
||||||
|
<td><?= $oneLink['visited'] ?></td>
|
||||||
|
</tr>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</table>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,74 @@
|
||||||
|
<?php
|
||||||
|
include_once(dirname(__FILE__).'/../lib/functions.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/../lib/config.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/../lib/UrlShortener.class.php');
|
||||||
|
|
||||||
|
$urlShortener = new UrlShortener();
|
||||||
|
|
||||||
|
$linkData = $urlShortener->getStatsLinkData(1);
|
||||||
|
|
||||||
|
echo "<" . "?xml version=\"1.0\"?".">\n";
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>URL Shortener - Admin</title>
|
||||||
|
<link rel="stylesheet" href="reset.css" type="text/css" />
|
||||||
|
<link rel="stylesheet" href="style.1.css" type="text/css" />
|
||||||
|
<script src="../website/jquery-1.4.3.min.js" type="text/javascript"></script>
|
||||||
|
<script src="../website/jquery.cookie.js" type="text/javascript"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="navigation" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div style="padding:20px;">
|
||||||
|
Navigation:
|
||||||
|
<a href="index.php" class="navlink">Overview</a>
|
||||||
|
<a href="all-ids.php" class="navlink">All IDs</a>
|
||||||
|
<a href="custom-ids.php" class="navlink hl">Custom IDs</a>
|
||||||
|
<a href="normal-ids.php" class="navlink">Normal IDs</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="main" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div style="padding:20px;">
|
||||||
|
<?php
|
||||||
|
if (count($linkData) > 0) {
|
||||||
|
?>
|
||||||
|
<div class="captioned">All links:</div>
|
||||||
|
<table summary="all links">
|
||||||
|
<tr>
|
||||||
|
<th>Short ID</th>
|
||||||
|
<th>Long link</th>
|
||||||
|
<th>Last clicked at</th>
|
||||||
|
<th>Number of visits</th>
|
||||||
|
</tr>
|
||||||
|
<?php
|
||||||
|
for ($i = 0; $i < count($linkData); $i++) {
|
||||||
|
$oneLink = $linkData[$i];
|
||||||
|
?>
|
||||||
|
<tr>
|
||||||
|
<td><a href="<?= (SERVICE_BASE_URL . $oneLink['id']) ?>"><?= $oneLink['id'] ?></a></td>
|
||||||
|
<td><?= $oneLink['url'] ?></td>
|
||||||
|
<td><?= $oneLink['date'] ?></td>
|
||||||
|
<td><?= $oneLink['visited'] ?></td>
|
||||||
|
</tr>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</table>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,96 @@
|
||||||
|
<?php
|
||||||
|
include_once(dirname(__FILE__).'/../lib/functions.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/../lib/config.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/../lib/UrlShortener.class.php');
|
||||||
|
|
||||||
|
$urlShortener = new UrlShortener();
|
||||||
|
|
||||||
|
$countByType = $urlShortener->getStatsCountByType();
|
||||||
|
$lastTenActive = $urlShortener->getStatsListActiveLinks(10);
|
||||||
|
|
||||||
|
echo "<" . "?xml version=\"1.0\"?".">\n";
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>URL Shortener - Admin</title>
|
||||||
|
<link rel="stylesheet" href="reset.css" type="text/css" />
|
||||||
|
<link rel="stylesheet" href="style.1.css" type="text/css" />
|
||||||
|
<script src="../website/jquery-1.4.3.min.js" type="text/javascript"></script>
|
||||||
|
<script src="../website/jquery.cookie.js" type="text/javascript"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="navigation" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div style="padding:20px;">
|
||||||
|
Navigation:
|
||||||
|
<a href="index.php" class="navlink hl">Overview</a>
|
||||||
|
<a href="all-ids.php" class="navlink">All IDs</a>
|
||||||
|
<a href="custom-ids.php" class="navlink">Custom IDs</a>
|
||||||
|
<a href="normal-ids.php" class="navlink">Normal IDs</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="main" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div style="padding:20px;">
|
||||||
|
<?php
|
||||||
|
if ($countByType != NULL) {
|
||||||
|
?>
|
||||||
|
<div class="captioned">Number of links:</div>
|
||||||
|
<table summary="number of links">
|
||||||
|
<tr>
|
||||||
|
<td class="right">Number of links with <b>normal</b> short id:</td>
|
||||||
|
<td><b><?= $countByType[0]['cnt'] ?></b></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="right">Number of links with <b>custom</b> short id:</td>
|
||||||
|
<td><b><?= $countByType[1]['cnt'] ?></b></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="right"><b>Total</b> number of links:</td>
|
||||||
|
<td><b><?= ($countByType[0]['cnt'] + $countByType[1]['cnt']) ?></b></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
if (count($lastTenActive) > 0) {
|
||||||
|
?>
|
||||||
|
<div class="captioned">Last 10 active links:</div>
|
||||||
|
<table summary="last ten active links">
|
||||||
|
<tr>
|
||||||
|
<th>#</th>
|
||||||
|
<th>Short ID</th>
|
||||||
|
<th>Long link</th>
|
||||||
|
<th>Last clicked at</th>
|
||||||
|
<th>Number of visits</th>
|
||||||
|
</tr>
|
||||||
|
<?php
|
||||||
|
for ($i = 0; $i < count($lastTenActive); $i++) {
|
||||||
|
$oneLink = $lastTenActive[$i];
|
||||||
|
?>
|
||||||
|
<tr>
|
||||||
|
<td><?= $i ?></td>
|
||||||
|
<td><a href="<?= (SERVICE_BASE_URL . $oneLink['id']) ?>"><?= $oneLink['id'] ?></a></td>
|
||||||
|
<td><?= $oneLink['url'] ?></td>
|
||||||
|
<td><?= $oneLink['date'] ?></td>
|
||||||
|
<td><?= $oneLink['visited'] ?></td>
|
||||||
|
</tr>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</table>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,74 @@
|
||||||
|
<?php
|
||||||
|
include_once(dirname(__FILE__).'/../lib/functions.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/../lib/config.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/../lib/UrlShortener.class.php');
|
||||||
|
|
||||||
|
$urlShortener = new UrlShortener();
|
||||||
|
|
||||||
|
$linkData = $urlShortener->getStatsLinkData(0);
|
||||||
|
|
||||||
|
echo "<" . "?xml version=\"1.0\"?".">\n";
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>URL Shortener - Admin</title>
|
||||||
|
<link rel="stylesheet" href="reset.css" type="text/css" />
|
||||||
|
<link rel="stylesheet" href="style.1.css" type="text/css" />
|
||||||
|
<script src="../website/jquery-1.4.3.min.js" type="text/javascript"></script>
|
||||||
|
<script src="../website/jquery.cookie.js" type="text/javascript"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="navigation" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div style="padding:20px;">
|
||||||
|
Navigation:
|
||||||
|
<a href="index.php" class="navlink">Overview</a>
|
||||||
|
<a href="all-ids.php" class="navlink">All IDs</a>
|
||||||
|
<a href="custom-ids.php" class="navlink">Custom IDs</a>
|
||||||
|
<a href="normal-ids.php" class="navlink hl">Normal IDs</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="main" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div style="padding:20px;">
|
||||||
|
<?php
|
||||||
|
if (count($linkData) > 0) {
|
||||||
|
?>
|
||||||
|
<div class="captioned">All links:</div>
|
||||||
|
<table summary="all links">
|
||||||
|
<tr>
|
||||||
|
<th>Short ID</th>
|
||||||
|
<th>Long link</th>
|
||||||
|
<th>Last clicked at</th>
|
||||||
|
<th>Number of visits</th>
|
||||||
|
</tr>
|
||||||
|
<?php
|
||||||
|
for ($i = 0; $i < count($linkData); $i++) {
|
||||||
|
$oneLink = $linkData[$i];
|
||||||
|
?>
|
||||||
|
<tr>
|
||||||
|
<td><a href="<?= (SERVICE_BASE_URL . $oneLink['id']) ?>"><?= $oneLink['id'] ?></a></td>
|
||||||
|
<td><?= $oneLink['url'] ?></td>
|
||||||
|
<td><?= $oneLink['date'] ?></td>
|
||||||
|
<td><?= $oneLink['visited'] ?></td>
|
||||||
|
</tr>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</table>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,53 @@
|
||||||
|
/**
|
||||||
|
* CSS reset from
|
||||||
|
* http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/
|
||||||
|
*
|
||||||
|
* removed: small, sup, sub, th, td, tr
|
||||||
|
*/
|
||||||
|
|
||||||
|
html, body, div, span, applet, object, iframe,
|
||||||
|
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||||
|
a, abbr, acronym, address, big, cite, code,
|
||||||
|
del, dfn, em, font, img, ins, kbd, q, s, samp,
|
||||||
|
strike, strong, tt, var,
|
||||||
|
dl, dt, dd, ol, ul, li,
|
||||||
|
fieldset, form, label, legend,
|
||||||
|
table, caption, tbody, tfoot, thead {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
outline: 0;
|
||||||
|
font-weight: inherit;
|
||||||
|
font-style: inherit;
|
||||||
|
font-size: 100%;
|
||||||
|
font-family: inherit;
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
/* remember to define focus styles! */
|
||||||
|
:focus {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
line-height: 1;
|
||||||
|
color: black;
|
||||||
|
background: white;
|
||||||
|
}
|
||||||
|
ol, ul {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
/* tables still need 'cellspacing="0"' in the markup */
|
||||||
|
table {
|
||||||
|
border-collapse: separate;
|
||||||
|
border-spacing: 0;
|
||||||
|
}
|
||||||
|
caption, th, td {
|
||||||
|
text-align: left;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
blockquote:before, blockquote:after,
|
||||||
|
q:before, q:after {
|
||||||
|
content: "";
|
||||||
|
}
|
||||||
|
blockquote, q {
|
||||||
|
quotes: "" "";
|
||||||
|
}
|
|
@ -0,0 +1,187 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: Verdana, Helvetica, sans-serif;
|
||||||
|
font-size: 10pt;
|
||||||
|
color: #444444;
|
||||||
|
}
|
||||||
|
|
||||||
|
.italic {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pagearea {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contentwidth {
|
||||||
|
width: 870px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.right {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header {
|
||||||
|
}
|
||||||
|
|
||||||
|
#caption {
|
||||||
|
background-color: #b7caf8;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main {
|
||||||
|
}
|
||||||
|
|
||||||
|
#features {
|
||||||
|
}
|
||||||
|
|
||||||
|
#options {
|
||||||
|
}
|
||||||
|
|
||||||
|
#featureinfo {
|
||||||
|
}
|
||||||
|
|
||||||
|
.contentblock {
|
||||||
|
width: 960px;
|
||||||
|
margin: 0 auto;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header .contentblock {
|
||||||
|
height: 50px;
|
||||||
|
text-align: right;
|
||||||
|
background-color: #f4f4f4;
|
||||||
|
}
|
||||||
|
|
||||||
|
#caption .contentblock {
|
||||||
|
height: 240px;
|
||||||
|
background-image: url(caption_bluesky.jpg);
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
#caption .contentblock a {
|
||||||
|
font-size: 32pt;
|
||||||
|
color: #ffffff;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main .contentblock {
|
||||||
|
margin-top: 10px;
|
||||||
|
background-color: #f4f4f4;
|
||||||
|
padding-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.formrow {
|
||||||
|
padding-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
input.biginput {
|
||||||
|
font-size: 24pt;
|
||||||
|
}
|
||||||
|
input.mediuminput {
|
||||||
|
font-size: 16pt;
|
||||||
|
color: #888888;
|
||||||
|
}
|
||||||
|
button.bigbutton {
|
||||||
|
font-size: 24pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
.errormsg {
|
||||||
|
padding: 8px;
|
||||||
|
font-size: 16pt;
|
||||||
|
color: #ff4c4c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result {
|
||||||
|
border: 1px solid #888888;
|
||||||
|
padding: 8px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
background-color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result strong {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result .longurl {
|
||||||
|
font-family: 'Courier New', Courier, monospace;
|
||||||
|
font-size: 12pt;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result .shorturl {
|
||||||
|
font-family: 'Courier New', Courier, monospace;
|
||||||
|
font-size: 16pt;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#features .contentblock {
|
||||||
|
background-color: #f4f4f4;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#features .contentblock ul {
|
||||||
|
margin-left: 15px;
|
||||||
|
}
|
||||||
|
#features .contentblock li {
|
||||||
|
list-style-type: disc;
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#options .contentblock {
|
||||||
|
margin-top: 10px;
|
||||||
|
background-color: #f4f4f4;
|
||||||
|
}
|
||||||
|
|
||||||
|
#featureinfo .contentblock {
|
||||||
|
margin-top: 10px;
|
||||||
|
background-color: #e1e7e7;
|
||||||
|
}
|
||||||
|
|
||||||
|
#featureinfo .contentblock ul {
|
||||||
|
margin-left: 15px;
|
||||||
|
}
|
||||||
|
#featureinfo .contentblock li {
|
||||||
|
list-style-type: disc;
|
||||||
|
margin-left: 5px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#featureinfo .contentblock code {
|
||||||
|
font-family: 'Courier New', Courier, monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
#navigation {
|
||||||
|
}
|
||||||
|
#navigation .contentblock {
|
||||||
|
margin-top: 10px;
|
||||||
|
background-color: #f4f4f4;
|
||||||
|
padding-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#navigation .contentblock .navlink {
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
#navigation .contentblock .hl {
|
||||||
|
background-color: #e1e7e7;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main .contentblock td,
|
||||||
|
#main .contentblock th {
|
||||||
|
border: 1px solid #888888;
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main .contentblock table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main .contentblock .captioned {
|
||||||
|
letter-spacing: 0.15em;
|
||||||
|
font-style: italic;
|
||||||
|
font-size: 1.2em;
|
||||||
|
margin-top: 20px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
include_once(dirname(__FILE__).'/../lib/config.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/../lib/functions.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/../lib/UrlShortener.class.php');
|
||||||
|
|
||||||
|
$urlShortener = new UrlShortener();
|
||||||
|
|
||||||
|
$urlParam = getRequestParameter("url");
|
||||||
|
|
||||||
|
header("Content-type: text/plain");
|
||||||
|
if (strlen($urlParam) == 0) {
|
||||||
|
echo "";
|
||||||
|
} else {
|
||||||
|
if (str_startswith($urlParam, SERVICE_BASE_URL) == true) {
|
||||||
|
// expand
|
||||||
|
$shortId = substr($urlParam, strlen(SERVICE_BASE_URL));
|
||||||
|
$expandedEntry = $urlShortener->expandUrl($shortId, true);
|
||||||
|
if ($expandedEntry != NULL) {
|
||||||
|
echo $expandedEntry['url'];
|
||||||
|
} else {
|
||||||
|
echo "";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// shorten
|
||||||
|
$shortId = $urlShortener->shortenUrl($urlParam, NULL);
|
||||||
|
if ($shortId != NULL) {
|
||||||
|
echo SERVICE_BASE_URL . $shortId;
|
||||||
|
} else {
|
||||||
|
echo "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>URL Shortener - Error</title>
|
||||||
|
<style type="text/css">
|
||||||
|
<!--
|
||||||
|
body {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
#main {
|
||||||
|
width: 600px;
|
||||||
|
margin: 200px auto;
|
||||||
|
font-family: Georgia, 'Times New Roman', Times, sans-serif;
|
||||||
|
font-size: 32pt;
|
||||||
|
font-style: italic;
|
||||||
|
color: #888888;
|
||||||
|
}
|
||||||
|
//-->
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="main">
|
||||||
|
Error: the requested page could not be displayed.
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,28 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>URL Shortener - Error</title>
|
||||||
|
<style type="text/css">
|
||||||
|
<!--
|
||||||
|
body {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
#main {
|
||||||
|
width: 600px;
|
||||||
|
margin: 200px auto;
|
||||||
|
font-family: Georgia, 'Times New Roman', Times, sans-serif;
|
||||||
|
font-size: 32pt;
|
||||||
|
font-style: italic;
|
||||||
|
color: #888888;
|
||||||
|
}
|
||||||
|
//-->
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="main">
|
||||||
|
Error: the requested page could not be displayed.
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,28 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>URL Shortener - Error</title>
|
||||||
|
<style type="text/css">
|
||||||
|
<!--
|
||||||
|
body {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
#main {
|
||||||
|
width: 600px;
|
||||||
|
margin: 200px auto;
|
||||||
|
font-family: Georgia, 'Times New Roman', Times, sans-serif;
|
||||||
|
font-size: 32pt;
|
||||||
|
font-style: italic;
|
||||||
|
color: #888888;
|
||||||
|
}
|
||||||
|
//-->
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="main">
|
||||||
|
Error: the requested page could not be displayed.
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,90 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
include_once(dirname(__FILE__).'/./lib/functions.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/./lib/UrlShortener.class.php');
|
||||||
|
include_once(dirname(__FILE__).'/./lib/Image/QRCode.php');
|
||||||
|
|
||||||
|
$urlShortener = new UrlShortener();
|
||||||
|
|
||||||
|
|
||||||
|
$shortid = getRequestParameter("id");
|
||||||
|
$shortext = getRequestParameter("ext");
|
||||||
|
if (str_startswith($shortext, ".") == true) {
|
||||||
|
$shortext = strtolower(substr($shortext, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
$calledUrl = SERVICE_BASE_URL . $shortid;
|
||||||
|
|
||||||
|
$expandedEntry = $urlShortener->expandUrl($shortid, true);
|
||||||
|
$warnCookie = false;
|
||||||
|
if (isset($_COOKIE['warn']) == true) {
|
||||||
|
$warnCookie = ($_COOKIE['warn'] == "true");
|
||||||
|
}
|
||||||
|
|
||||||
|
$resultCode = -1;
|
||||||
|
$resultMessage = NULL;
|
||||||
|
$resultUrl = NULL;
|
||||||
|
|
||||||
|
if ($expandedEntry == NULL) {
|
||||||
|
$resultCode = 404;
|
||||||
|
$resultMessage = "NOT_FOUND";
|
||||||
|
$resultUrl = NULL;
|
||||||
|
} else {
|
||||||
|
$resultCode = 200;
|
||||||
|
$resultMessage = "OK";
|
||||||
|
$resultUrl = $expandedEntry['url'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (($shortext == "text") || ($shortext == "txt") || ($shortext == "plain")) {
|
||||||
|
header("Content-type: text/plain");
|
||||||
|
echo $resultUrl;
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
if ($shortext == "json") {
|
||||||
|
// prevent caching
|
||||||
|
header('Cache-Control: no-cache, must-revalidate');
|
||||||
|
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
|
||||||
|
header('Content-type: application/json');
|
||||||
|
echo '{ "status_code": ' . $resultCode . ', "data": { "expand": [ { "short_url": "' . $calledUrl . '", "global_hash": "' . $shortid . '", "long_url": "' . $resultUrl . '", "user_hash": "' . $shortid . '" } ] }, "status_text": "' . $resultMessage . '" }';
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($shortext == "xml") {
|
||||||
|
header("Content-type: application/xml");
|
||||||
|
echo '<'.'?xml version="1.0" encoding="UTF-8"?'.'>' . "\n";
|
||||||
|
echo '<response>' . "\n";
|
||||||
|
echo '<status_code>' . $resultCode . '</status_code>' . "\n";
|
||||||
|
echo '<status_txt>' . $resultMessage . '</status_txt>' . "\n";
|
||||||
|
echo '<data>' . "\n";
|
||||||
|
if ($resultCode == 200) {
|
||||||
|
echo '<entry>' . "\n";
|
||||||
|
echo ' <short_url>' . $calledUrl . '</short_url>' . "\n";
|
||||||
|
echo ' <long_url>' . $resultUrl . '</long_url>' . "\n";
|
||||||
|
echo ' <user_hash>' . $shortid . '</user_hash>' . "\n";
|
||||||
|
echo ' <global_hash>' . $shortid . '</global_hash>' . "\n";
|
||||||
|
echo '</entry>' . "\n";
|
||||||
|
}
|
||||||
|
echo '</data>' . "\n";
|
||||||
|
echo '</response>';
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (($shortext == "qrcode") || ($shortext == "qr")) {
|
||||||
|
header("Content-type: image/png");
|
||||||
|
$qr = new Image_QRCode();
|
||||||
|
$codeData = $calledUrl;
|
||||||
|
$qr->makeCode($codeData);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($resultCode == 200) {
|
||||||
|
if ($warnCookie == true) {
|
||||||
|
include('expand_warnpage.php');
|
||||||
|
} else {
|
||||||
|
header("Location: " . $resultUrl);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
include('expand_notfound.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
|
@ -0,0 +1,82 @@
|
||||||
|
<?php
|
||||||
|
include_once(dirname(__FILE__).'/./lib/functions.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/./lib/config.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/./lib/UrlShortener.class.php');
|
||||||
|
|
||||||
|
echo "<" . "?xml version=\"1.0\"?".">\n";
|
||||||
|
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>URL Shortener</title>
|
||||||
|
<link rel="stylesheet" href="website/reset.css" type="text/css" />
|
||||||
|
<link rel="stylesheet" href="website/style.1.css" type="text/css" />
|
||||||
|
<script src="website/jquery-1.4.3.min.js" type="text/javascript"></script>
|
||||||
|
<script src="website/jquery.cookie.js" type="text/javascript"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
<!--
|
||||||
|
var warningCookieEnabled = null;
|
||||||
|
$(document).ready(function() {
|
||||||
|
$('#warningcookie').show();
|
||||||
|
var warnCookieValue = $.cookie('warn');
|
||||||
|
if (warnCookieValue == null) {
|
||||||
|
warnCookieValue = "false";
|
||||||
|
}
|
||||||
|
warningCookieEnabled = warnCookieValue;
|
||||||
|
if (warnCookieValue == "true") {
|
||||||
|
$('#cookie_image').attr('src', 'website/16_accept.png');
|
||||||
|
$('#cookie_message').html('Warning enabled.');
|
||||||
|
$('#cookie_link').html('Click to disable warning.');
|
||||||
|
} else {
|
||||||
|
$('#cookie_image').attr('src', 'website/16_delete.png');
|
||||||
|
$('#cookie_message').html('Warning disabled.');
|
||||||
|
$('#cookie_link').html('Click to enable warning.');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
function toggleWarning() {
|
||||||
|
if (warningCookieEnabled == "true") {
|
||||||
|
warningCookieEnabled = "false";
|
||||||
|
$.cookie('warn', 'false', { expires: 365, path: '/' });
|
||||||
|
$('#cookie_image').attr('src', 'website/16_delete.png');
|
||||||
|
$('#cookie_message').html('Warning disabled.');
|
||||||
|
$('#cookie_link').html('Click to enable warning.');
|
||||||
|
} else {
|
||||||
|
warningCookieEnabled = "true";
|
||||||
|
$.cookie('warn', 'true', { expires: 365, path: '/' });
|
||||||
|
$('#cookie_image').attr('src', 'website/16_accept.png');
|
||||||
|
$('#cookie_message').html('Warning enabled.');
|
||||||
|
$('#cookie_link').html('Click to disable warning.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//-->
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="caption" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div style="padding-top:170px;padding-right:30px;"><a href="index.php">URL Shortener</a></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="main" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div style="padding:20px;">
|
||||||
|
<div class="errormsg">The requested short URL does not exist.</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="footer" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div id="warningcookie" style="display:none;padding:20px;">
|
||||||
|
<img src="16_blank.png" id="cookie_image" alt="" /> <span id="cookie_message"></span> <a href="javascript:void(0);" id="cookie_link" onclick="toggleWarning();"></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,86 @@
|
||||||
|
<?php
|
||||||
|
include_once(dirname(__FILE__).'/./lib/functions.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/./lib/config.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/./lib/UrlShortener.class.php');
|
||||||
|
|
||||||
|
echo "<" . "?xml version=\"1.0\"?".">\n";
|
||||||
|
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>URL Shortener</title>
|
||||||
|
<link rel="stylesheet" href="website/reset.css" type="text/css" />
|
||||||
|
<link rel="stylesheet" href="website/style.1.css" type="text/css" />
|
||||||
|
<script src="website/jquery-1.4.3.min.js" type="text/javascript"></script>
|
||||||
|
<script src="website/jquery.cookie.js" type="text/javascript"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
<!--
|
||||||
|
var warningCookieEnabled = null;
|
||||||
|
$(document).ready(function() {
|
||||||
|
$('#warningcookie').show();
|
||||||
|
var warnCookieValue = $.cookie('warn');
|
||||||
|
if (warnCookieValue == null) {
|
||||||
|
warnCookieValue = "false";
|
||||||
|
}
|
||||||
|
warningCookieEnabled = warnCookieValue;
|
||||||
|
if (warnCookieValue == "true") {
|
||||||
|
$('#cookie_image').attr('src', 'website/16_accept.png');
|
||||||
|
$('#cookie_message').html('Warning enabled.');
|
||||||
|
$('#cookie_link').html('Click to disable warning.');
|
||||||
|
} else {
|
||||||
|
$('#cookie_image').attr('src', 'website/16_delete.png');
|
||||||
|
$('#cookie_message').html('Warning disabled.');
|
||||||
|
$('#cookie_link').html('Click to enable warning.');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
function toggleWarning() {
|
||||||
|
if (warningCookieEnabled == "true") {
|
||||||
|
warningCookieEnabled = "false";
|
||||||
|
$.cookie('warn', 'false', { expires: 365, path: '/' });
|
||||||
|
$('#cookie_image').attr('src', 'website/16_delete.png');
|
||||||
|
$('#cookie_message').html('Warning disabled.');
|
||||||
|
$('#cookie_link').html('Click to enable warning.');
|
||||||
|
} else {
|
||||||
|
warningCookieEnabled = "true";
|
||||||
|
$.cookie('warn', 'true', { expires: 365, path: '/' });
|
||||||
|
$('#cookie_image').attr('src', 'website/16_accept.png');
|
||||||
|
$('#cookie_message').html('Warning enabled.');
|
||||||
|
$('#cookie_link').html('Click to disable warning.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//-->
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="caption" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div style="padding-top:170px;padding-right:30px;"><a href="index.php">URL Shortener</a></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="main" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div style="padding:20px;">
|
||||||
|
<div style="margin-bottom:20px;">You have enabled URL previews.</div>
|
||||||
|
<div class="result contentwidth">
|
||||||
|
<div class="shorturl"><a href="<?php echo $resultUrl; ?>">Click here to continue...</a></div>
|
||||||
|
<div class="longurl"><strong>URL:</strong> <?php echo $resultUrl; ?></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="footer" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div id="warningcookie" style="display:none;padding:20px;">
|
||||||
|
<img src="16_blank.png" id="cookie_image" alt="" /> <span id="cookie_message"></span> <a href="javascript:void(0);" id="cookie_link" onclick="toggleWarning();"></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,196 @@
|
||||||
|
<?php
|
||||||
|
session_start();
|
||||||
|
|
||||||
|
include_once(dirname(__FILE__).'/./lib/functions.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/./lib/config.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/./lib/UrlShortener.class.php');
|
||||||
|
include_once(dirname(__FILE__).'/./lib/Captcha.class.php');
|
||||||
|
|
||||||
|
$msgError = NULL;
|
||||||
|
$msgLong = NULL;
|
||||||
|
$msgShort = NULL;
|
||||||
|
|
||||||
|
$urlShortener = new UrlShortener();
|
||||||
|
$captcha = new Captcha();
|
||||||
|
|
||||||
|
$longurl = getRequestParameter("longurl");
|
||||||
|
$plain = getRequestParameter("plain");
|
||||||
|
if (strlen($longurl) > 0) {
|
||||||
|
$captchaInput = getRequestParameter($_SESSION['CAPTCHA_FIELD']);
|
||||||
|
$captchaValid = false;
|
||||||
|
if (empty($captchaInput) == false) {
|
||||||
|
$captchaValid = $captcha->validateCaptcha($captchaInput);
|
||||||
|
}
|
||||||
|
if ($captchaValid == true) {
|
||||||
|
$shortId = $urlShortener->shortenUrl($longurl, $plain);
|
||||||
|
if ($shortId == NULL) {
|
||||||
|
$msgError = "The given URL could not be shortened.";
|
||||||
|
} else {
|
||||||
|
$msgShort = SERVICE_BASE_URL . $shortId;
|
||||||
|
$msgLong = $longurl;
|
||||||
|
$longurl = "";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$msgError = "Captcha invalid. Are sure you're not a bot?";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$displayCaptcha = $captcha->generateAndUseCaptcha();
|
||||||
|
$statsOverview = $urlShortener->getStatisticsOverview();
|
||||||
|
|
||||||
|
echo "<" . "?xml version=\"1.0\"?".">\n";
|
||||||
|
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>URL Shortener</title>
|
||||||
|
<link rel="stylesheet" href="website/reset.css" type="text/css" />
|
||||||
|
<link rel="stylesheet" href="website/style.1.css" type="text/css" />
|
||||||
|
<script src="website/jquery-1.4.3.min.js" type="text/javascript"></script>
|
||||||
|
<script src="website/jquery.cookie.js" type="text/javascript"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
<!--
|
||||||
|
function enableOptionalForm() {
|
||||||
|
$("#optionalFormEnabler").hide();
|
||||||
|
$("#optionalFormData").show();
|
||||||
|
}
|
||||||
|
function preventDoubleSubmit() {
|
||||||
|
$("shortenUrlButton").disable();
|
||||||
|
}
|
||||||
|
var warningCookieEnabled = null;
|
||||||
|
$(document).ready(function() {
|
||||||
|
$('#warningcookie').show();
|
||||||
|
var warnCookieValue = $.cookie('warn');
|
||||||
|
if (warnCookieValue == null) {
|
||||||
|
warnCookieValue = "false";
|
||||||
|
}
|
||||||
|
warningCookieEnabled = warnCookieValue;
|
||||||
|
if (warnCookieValue == "true") {
|
||||||
|
$('#cookie_image').attr('src', 'website/16_accept.png');
|
||||||
|
$('#cookie_message').html('Warning enabled.');
|
||||||
|
$('#cookie_link').html('Click to disable warning.');
|
||||||
|
} else {
|
||||||
|
$('#cookie_image').attr('src', 'website/16_delete.png');
|
||||||
|
$('#cookie_message').html('Warning disabled.');
|
||||||
|
$('#cookie_link').html('Click to enable warning.');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
function toggleWarning() {
|
||||||
|
if (warningCookieEnabled == "true") {
|
||||||
|
warningCookieEnabled = "false";
|
||||||
|
$.cookie('warn', 'false', { expires: 365, path: '/' });
|
||||||
|
$('#cookie_image').attr('src', 'website/16_delete.png');
|
||||||
|
$('#cookie_message').html('Warning disabled.');
|
||||||
|
$('#cookie_link').html('Click to enable warning.');
|
||||||
|
} else {
|
||||||
|
warningCookieEnabled = "true";
|
||||||
|
$.cookie('warn', 'true', { expires: 365, path: '/' });
|
||||||
|
$('#cookie_image').attr('src', 'website/16_accept.png');
|
||||||
|
$('#cookie_message').html('Warning enabled.');
|
||||||
|
$('#cookie_link').html('Click to disable warning.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function show(elem) {
|
||||||
|
$('#'+elem).show();
|
||||||
|
var x = $('#'+elem).offset().top - 100; // 100 provides buffer in viewport
|
||||||
|
$('html,body').animate({scrollTop: x}, 500);
|
||||||
|
}
|
||||||
|
//-->
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="caption" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div style="padding-top:170px;padding-right:30px;"><a href="index.php">URL Shortener</a></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="main" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div style="padding:20px;">
|
||||||
|
<?php
|
||||||
|
if ($msgError != NULL) {
|
||||||
|
?>
|
||||||
|
<div class="errormsg"><?php echo $msgError; ?></div>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
if (($msgLong != NULL) || ($msgShort != NULL)) {
|
||||||
|
?>
|
||||||
|
<div class="result contentwidth">
|
||||||
|
<div class="shorturl"><strong>Short URL:</strong> <?php echo $msgShort; ?></div>
|
||||||
|
<div class="longurl"><strong>Original URL:</strong> <?php echo $msgLong; ?></div>
|
||||||
|
</div>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<form action="index.php" method="post">
|
||||||
|
<div class="formrow">URL to shorten</div>
|
||||||
|
<div class="formrow"><input type="text" name="longurl" value="<?php echo empty($longurl) ? "" : $longurl; ?>" class="biginput contentwidth" /></div>
|
||||||
|
<div class="formrow">Please answer: <?php echo $displayCaptcha; ?> <input type="text" name="<?php echo $_SESSION['CAPTCHA_FIELD']; ?>" value="" class="mediuminput" /></div>
|
||||||
|
<div class="formrow" id="optionalFormEnabler"><a href="javascript:void(0);" onclick="enableOptionalForm();">show optional information</a></div>
|
||||||
|
<div id="optionalFormData" style="display:none;">
|
||||||
|
<div class="formrow italic">optional: custum short id</div>
|
||||||
|
<div class="formrow"><input type="text" name="plain" value="" class="mediuminput" style="width:435px;" /></div>
|
||||||
|
</div>
|
||||||
|
<div class="formrow">
|
||||||
|
<button class="bigbutton" id="shortenUrlButton" name="shortenUrlButton" onclick="preventDoubleSubmit();" type="submit">Shorten URL!</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="features" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div style="padding: 20px;">
|
||||||
|
Key features:
|
||||||
|
<ul>
|
||||||
|
<li>API and data structure compatible to urlShort (by mavrev.org)</li>
|
||||||
|
<li>extended API with different output formats like XML, JSON, plain text and even QR-Code images</li>
|
||||||
|
</ul>
|
||||||
|
<a href="javascript:void(0);" onclick="show('featureinfo');">see more infos...</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="options" class="pagearea">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div id="warningcookie" style="display:none;padding:20px;">
|
||||||
|
<img src="16_blank.png" id="cookie_image" alt="" /> <span id="cookie_message"></span> <a href="javascript:void(0);" id="cookie_link" onclick="toggleWarning();"></a>
|
||||||
|
<?php
|
||||||
|
if ($statsOverview != NULL) {
|
||||||
|
echo "<span style=\"margin-left:240px;font-style:italic;\">" . $statsOverview['count_ids'] . " links shortened, " . $statsOverview['sum_visited'] . " hits</span>";
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="featureinfo" class="pagearea" style="display:none;">
|
||||||
|
<div class="contentblock">
|
||||||
|
<div style="padding: 20px;">
|
||||||
|
This Url Shortener provides the basic functions like shortening and expanding links.<br />
|
||||||
|
It is works on the same data structure and provides the same API (see <sup><small>*)</small></sup> below) as urlShort (by mavrev.org)<br />
|
||||||
|
You can enable a preview: if you visit a short URL, then you are not automatically redirected to the target page
|
||||||
|
but you get to see the full link and you can go here manually (this preview is set using a browser cookie).<br />
|
||||||
|
<br />
|
||||||
|
<b>API</b><br />
|
||||||
|
<ul>
|
||||||
|
<li>To expand <sup><small>*)</small></sup> a link:<br /><code><?php echo SERVICE_BASE_URL; ?>/api.php?url=<i><?php echo SERVICE_BASE_URL; ?>SHORT_ID</i></code></li>
|
||||||
|
<li>To expand a link and go to the web page:<br /><code><?php echo SERVICE_BASE_URL; ?><i>SHORT_ID</i></code></li>
|
||||||
|
<li>To expand a link to text:<br /><code><?php echo SERVICE_BASE_URL; ?><i>SHORT_ID.txt</i></code></li>
|
||||||
|
<li>To expand a link to xml:<br /><code><?php echo SERVICE_BASE_URL; ?><i>SHORT_ID.xml</i></code></li>
|
||||||
|
<li>To expand a link to json:<br /><code><?php echo SERVICE_BASE_URL; ?><i>SHORT_ID.json</i></code></li>
|
||||||
|
<li>To display a link as QR-Code (links to short URL):<br /><code><?php echo SERVICE_BASE_URL; ?><i>SHORT_ID.qr</i></code></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,2 @@
|
||||||
|
Order deny, allow
|
||||||
|
Deny from all
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Base class for storages
|
||||||
|
*/
|
||||||
|
|
||||||
|
abstract class AbstractStorage {
|
||||||
|
|
||||||
|
abstract function getEntryByUrl($url);
|
||||||
|
|
||||||
|
abstract function reserveId($userShortId, $url);
|
||||||
|
|
||||||
|
abstract function getEntryById($shortId);
|
||||||
|
|
||||||
|
abstract function markVisited($shortId);
|
||||||
|
|
||||||
|
abstract function getStatisticsOverview();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Captcha logic class
|
||||||
|
*/
|
||||||
|
|
||||||
|
include_once(dirname(__FILE__).'/./config.inc.php');
|
||||||
|
|
||||||
|
class Captcha {
|
||||||
|
|
||||||
|
private $calcOps;
|
||||||
|
|
||||||
|
function __construct() {
|
||||||
|
$this->calcOps = array("+", "-", "*");
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateAndUseCaptcha() {
|
||||||
|
$rndType = rand(1, 100);
|
||||||
|
if ($rndType > 0) {
|
||||||
|
// build numeric question
|
||||||
|
$useOp = $this->calcOps[rand(0, 2)];
|
||||||
|
$firstNum = 0;
|
||||||
|
$secondNum = 0;
|
||||||
|
if ($useOp == "*") {
|
||||||
|
$firstNum = rand(0, 9);
|
||||||
|
$secondNum = rand(0, 15);
|
||||||
|
} else {
|
||||||
|
$firstNum = rand(0, 100);
|
||||||
|
$secondNum = rand(0, 100);
|
||||||
|
}
|
||||||
|
$calc = 0;
|
||||||
|
if ($useOp == "+") {
|
||||||
|
$calc = $firstNum + $secondNum;
|
||||||
|
} else if ($useOp == "-") {
|
||||||
|
$calc = $firstNum - $secondNum;
|
||||||
|
} else if ($useOp == "*") {
|
||||||
|
$calc = $firstNum * $secondNum;
|
||||||
|
}
|
||||||
|
$mathStr = "" . $firstNum . " " . $useOp . " " . $secondNum;
|
||||||
|
$_SESSION['CAPTCHA_QUESTION'] = $mathStr;
|
||||||
|
$_SESSION['CAPTCHA_VALUE'] = $calc;
|
||||||
|
// field name
|
||||||
|
$fieldname = chr(rand(65, 90)) . dechex(rand());
|
||||||
|
$_SESSION['CAPTCHA_FIELD'] = $fieldname;
|
||||||
|
return $mathStr;
|
||||||
|
} else {
|
||||||
|
// use pooled question
|
||||||
|
// TODO currently not supported due to missing logic which language to use
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateCaptcha($inputStr) {
|
||||||
|
if (empty($inputStr) == true) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (isset($_SESSION['CAPTCHA_VALUE']) == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$valueInSession = $_SESSION['CAPTCHA_VALUE'];
|
||||||
|
return ($inputStr == $valueInSession . "");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Class to increase an ID
|
||||||
|
*/
|
||||||
|
|
||||||
|
class IdIncreaser {
|
||||||
|
|
||||||
|
private $chars = "0123456789abcdefghijklmnopqrstuvwxyz";
|
||||||
|
private $c = NULL;
|
||||||
|
|
||||||
|
function __construct($current, $alphabet = "") {
|
||||||
|
if (strlen($alphabet) > 0) {
|
||||||
|
$this->chars = $alphabet;
|
||||||
|
}
|
||||||
|
$this->c = new OneChar($current, $this->chars);
|
||||||
|
}
|
||||||
|
|
||||||
|
function increase() {
|
||||||
|
$this->c->increase();
|
||||||
|
}
|
||||||
|
|
||||||
|
function build() {
|
||||||
|
return $this->c->build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class OneChar {
|
||||||
|
|
||||||
|
private $chars;
|
||||||
|
private $otherChar = NULL;
|
||||||
|
private $pos = 0;
|
||||||
|
|
||||||
|
function __construct($s, $ch) {
|
||||||
|
$this->chars = $ch;
|
||||||
|
$current = substr($s, -1, 1);
|
||||||
|
$this->pos = strpos($this->chars, $current);
|
||||||
|
$s = substr($s, 0, strlen($s)-1);
|
||||||
|
if (strlen($s) > 0) {
|
||||||
|
$this->otherChar = new OneChar($s, $ch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function increase() {
|
||||||
|
$this->pos = $this->pos + 1;
|
||||||
|
if ($this->pos >= strlen($this->chars)) {
|
||||||
|
$this->pos = 0;
|
||||||
|
if ($this->otherChar != NULL) {
|
||||||
|
$this->otherChar->increase();
|
||||||
|
} else {
|
||||||
|
$this->otherChar = new OneChar($this->chars[0], $this->chars);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function build() {
|
||||||
|
if ($this->otherChar != NULL) {
|
||||||
|
return $this->otherChar->build() . $this->chars[$this->pos];
|
||||||
|
}
|
||||||
|
return $this->chars[$this->pos];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Image_QRCode - QR 2D barcode generator
|
||||||
|
*
|
||||||
|
* Image_QRCode - QR 2D barcode generator
|
||||||
|
*
|
||||||
|
* PHP version 5
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
* 02111-1307 USA
|
||||||
|
*
|
||||||
|
* @category Images
|
||||||
|
* @package Image_QRCode
|
||||||
|
* @author Y.Swetake <swe@venus.dti.ne.jp>
|
||||||
|
* @author Rich Sage <rich.sage@gmail.com>
|
||||||
|
* @copyright 2009 Y.Swetake
|
||||||
|
* @copyright 2009 R.Sage
|
||||||
|
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
|
||||||
|
* @version SVN: $Id$
|
||||||
|
* @link http://code.google.com/p/pearqrcode/
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for exceptions in PEAR
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once 'PEAR/Exception.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Image_QRCode_Exception
|
||||||
|
*
|
||||||
|
* @category Image
|
||||||
|
* @package Image_QRCode
|
||||||
|
* @author Y.Swetake <swe@venus.dti.ne.jp>
|
||||||
|
* @author Rich Sage <rich.sage@gmail.com>
|
||||||
|
* @license http://www.gnu.org/licenses/lgpl-2.1.txt GNU LGPL
|
||||||
|
* @version Release: 0.1
|
||||||
|
* @link http://code.google.com/p/pearqrcode/
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Image_QRCode_Exception extends PEAR_Exception
|
||||||
|
{
|
||||||
|
}
|
||||||
|
?>
|
After Width: | Height: | Size: 851 B |
After Width: | Height: | Size: 848 B |
After Width: | Height: | Size: 137 B |
After Width: | Height: | Size: 227 B |
After Width: | Height: | Size: 223 B |
After Width: | Height: | Size: 224 B |
After Width: | Height: | Size: 225 B |
After Width: | Height: | Size: 232 B |
After Width: | Height: | Size: 233 B |
After Width: | Height: | Size: 231 B |
After Width: | Height: | Size: 228 B |
After Width: | Height: | Size: 238 B |
After Width: | Height: | Size: 242 B |
After Width: | Height: | Size: 155 B |
After Width: | Height: | Size: 239 B |
After Width: | Height: | Size: 255 B |
After Width: | Height: | Size: 241 B |
After Width: | Height: | Size: 236 B |
After Width: | Height: | Size: 263 B |
After Width: | Height: | Size: 262 B |
After Width: | Height: | Size: 258 B |
After Width: | Height: | Size: 257 B |
After Width: | Height: | Size: 252 B |
After Width: | Height: | Size: 248 B |
After Width: | Height: | Size: 154 B |
After Width: | Height: | Size: 275 B |
After Width: | Height: | Size: 271 B |
After Width: | Height: | Size: 283 B |
After Width: | Height: | Size: 265 B |
After Width: | Height: | Size: 268 B |
After Width: | Height: | Size: 261 B |
After Width: | Height: | Size: 282 B |
After Width: | Height: | Size: 286 B |
After Width: | Height: | Size: 285 B |
After Width: | Height: | Size: 278 B |
After Width: | Height: | Size: 161 B |
After Width: | Height: | Size: 277 B |
After Width: | Height: | Size: 160 B |
After Width: | Height: | Size: 165 B |
After Width: | Height: | Size: 204 B |
After Width: | Height: | Size: 222 B |
After Width: | Height: | Size: 223 B |
|
@ -0,0 +1,188 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Storage using a database
|
||||||
|
*/
|
||||||
|
|
||||||
|
include_once(dirname(__FILE__).'/./config.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/./IdIncreaser.class.php');
|
||||||
|
include_once(dirname(__FILE__).'/./AbstractStorage.class.php');
|
||||||
|
|
||||||
|
class MySQLDbStorage extends AbstractStorage {
|
||||||
|
|
||||||
|
private $dbconn = NULL;
|
||||||
|
|
||||||
|
function __construct() {
|
||||||
|
try {
|
||||||
|
$this->dbconn = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_DATABASE, DB_USER, DB_PASS);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function __destruct() {
|
||||||
|
}
|
||||||
|
|
||||||
|
function getEntryByUrl($url) {
|
||||||
|
if ($this->dbconn == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
$sqlStr = "SELECT * FROM " . DB_TABLE . " WHERE url = :searchUrl AND text = 0";
|
||||||
|
$stmt = $this->dbconn->prepare($sqlStr, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
|
||||||
|
$stmt->execute(array(':searchUrl' => $url));
|
||||||
|
$res = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
$stmt->closeCursor();
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
function reserveId($userShortId, $url) {
|
||||||
|
if ($this->dbconn == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tmpId = $userShortId;
|
||||||
|
|
||||||
|
if ($tmpId != NULL) {
|
||||||
|
// try to allocate entry with that id
|
||||||
|
$sqlStr = "INSERT INTO " . DB_TABLE . " (id, url, text) VALUES (:insertId, :theUrl, 1)";
|
||||||
|
$stmt = $this->dbconn->prepare($sqlStr);
|
||||||
|
if (!$stmt->execute(array(':insertId' => $tmpId, ':theUrl' => $url))) {
|
||||||
|
// not successful, so set tmpId to null which generates a new id
|
||||||
|
$tmpId = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($tmpId == NULL) {
|
||||||
|
// find new unused id
|
||||||
|
$sqlStr = "SELECT id FROM " . DB_TABLE . " WHERE text = 0 ORDER BY date DESC LIMIT 1";
|
||||||
|
$stmt = $this->dbconn->prepare($sqlStr, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
|
||||||
|
$stmt->execute();
|
||||||
|
$foundLastRes = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
$stmt->closeCursor();
|
||||||
|
$foundLast = $foundLastRes['id'];
|
||||||
|
$idIncreaser = new IdIncreaser($foundLast, "");
|
||||||
|
$reservedId = NULL;
|
||||||
|
$sqlStr2 = "INSERT INTO " . DB_TABLE . " (id, url) VALUES (:reserveId, :theUrl)";
|
||||||
|
$stmt2 = $this->dbconn->prepare($sqlStr2);
|
||||||
|
do {
|
||||||
|
$idIncreaser->increase();
|
||||||
|
$nextId = $idIncreaser->build();
|
||||||
|
if ($stmt2->execute(array(':reserveId' => $nextId, ':theUrl' => $url))) {
|
||||||
|
$reservedId = $nextId;
|
||||||
|
}
|
||||||
|
} while ($reservedId == NULL);
|
||||||
|
$tmpId = $reservedId;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $tmpId;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getEntryById($shortId) {
|
||||||
|
if (empty($shortId) == true) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if ($this->dbconn == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
$sqlStr = "SELECT * FROM " . DB_TABLE . " WHERE id = :searchId";
|
||||||
|
$stmt = $this->dbconn->prepare($sqlStr, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
|
||||||
|
$stmt->execute(array(':searchId' => $shortId));
|
||||||
|
$foundRes = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
$stmt->closeCursor();
|
||||||
|
return $foundRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
function markVisited($shortId) {
|
||||||
|
if (empty($shortId) == true) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ($this->dbconn == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$sqlStr = "UPDATE urls SET visited = visited + 1 WHERE id = :visitedUrl";
|
||||||
|
$stmt = $this->dbconn->prepare($sqlStr);
|
||||||
|
$stmt->execute(array(':visitedUrl' => $shortId));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStatisticsOverview() {
|
||||||
|
if ($this->dbconn == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
$sqlStr = "SELECT count(id) AS count_ids, sum(visited) AS sum_visited FROM urls";
|
||||||
|
$stmt = $this->dbconn->prepare($sqlStr, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
|
||||||
|
$stmt->execute();
|
||||||
|
$foundRes = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
$stmt->closeCursor();
|
||||||
|
return $foundRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getRandomLink() {
|
||||||
|
if ($this->dbconn == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
$sqlStr = "SELECT * FROM urls WHERE text = 0 ORDER by rand() LIMIT 1";
|
||||||
|
$stmt = $this->dbconn->prepare($sqlStr, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
|
||||||
|
$stmt->execute();
|
||||||
|
$foundRes = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
$stmt->closeCursor();
|
||||||
|
return $foundRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStatsCountByType() {
|
||||||
|
if ($this->dbconn == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
$sqlStr = "SELECT count(id) AS cnt, text FROM urls GROUP BY text ORDER BY text";
|
||||||
|
$stmt = $this->dbconn->prepare($sqlStr, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
|
||||||
|
$stmt->execute();
|
||||||
|
$res = $stmt->fetchAll();
|
||||||
|
$stmt->closeCursor();
|
||||||
|
if (count($res) != 2) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStatsAllLinksByType($t) {
|
||||||
|
if ($this->dbconn == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
$limitTo = "";
|
||||||
|
if ($t >= 0) {
|
||||||
|
$limitTo = "WHERE text = " . $t . " ";
|
||||||
|
}
|
||||||
|
$sqlStr = "SELECT * FROM urls " . $limitTo . "ORDER BY visited DESC";
|
||||||
|
$stmt = $this->dbconn->prepare($sqlStr, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
|
||||||
|
$stmt->execute();
|
||||||
|
$res = $stmt->fetchAll();
|
||||||
|
$stmt->closeCursor();
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStatsListActiveLinks($cnt) {
|
||||||
|
if ($this->dbconn == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
$sqlStr = "SELECT * FROM urls ORDER BY date DESC LIMIT " . ($cnt+0);
|
||||||
|
$stmt = $this->dbconn->prepare($sqlStr, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
|
||||||
|
$stmt->execute();
|
||||||
|
$res = $stmt->fetchAll();
|
||||||
|
$stmt->closeCursor();
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStatsLinkData($t) {
|
||||||
|
if ($this->dbconn == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
$limitTo = "";
|
||||||
|
if ($t >= 0) {
|
||||||
|
$limitTo = "WHERE text = " . $t . " ";
|
||||||
|
}
|
||||||
|
$sqlStr = "SELECT * FROM urls " . $limitTo . "ORDER BY visited DESC LIMIT 10000";
|
||||||
|
$stmt = $this->dbconn->prepare($sqlStr, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
|
||||||
|
$stmt->execute();
|
||||||
|
$res = $stmt->fetchAll();
|
||||||
|
$stmt->closeCursor();
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,107 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* URL Shortener logic
|
||||||
|
*/
|
||||||
|
|
||||||
|
include_once(dirname(__FILE__).'/./config.inc.php');
|
||||||
|
include_once(dirname(__FILE__).'/./MySQLDbStorage.class.php');
|
||||||
|
|
||||||
|
class UrlShortener {
|
||||||
|
|
||||||
|
private $storage;
|
||||||
|
|
||||||
|
function __construct() {
|
||||||
|
$this->storage = new MySQLDbStorage();
|
||||||
|
}
|
||||||
|
|
||||||
|
function shortenUrl($urlToShorten, $shortId = NULL) {
|
||||||
|
if (empty($urlToShorten) == true) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if ($this->checkUrlPattern($urlToShorten) == false) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if ($this->checkUserShortId($shortId) == false) {
|
||||||
|
$shortId = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if this url has been shortened before
|
||||||
|
$existingEntry = $this->storage->getEntryByUrl($urlToShorten);
|
||||||
|
if (empty($existingEntry) == false) {
|
||||||
|
if (empty($shortId) == true) {
|
||||||
|
return $existingEntry['id'];
|
||||||
|
}
|
||||||
|
if ($shortId == $existingEntry['id']) {
|
||||||
|
return $existingEntry['id'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// assign URL
|
||||||
|
$newId = $this->storage->reserveId($shortId, $urlToShorten);
|
||||||
|
return $newId;
|
||||||
|
}
|
||||||
|
|
||||||
|
function expandUrl($urlToExpand, $markVisited = false) {
|
||||||
|
$shortUrl = $urlToExpand;
|
||||||
|
if (str_startswith($shortUrl, SERVICE_BASE_URL)) {
|
||||||
|
$shortUrl = substr($shortUrl, strlen(SERVICE_BASE_URL));
|
||||||
|
}
|
||||||
|
$foundEntry = $this->storage->getEntryById($shortUrl);
|
||||||
|
if (($foundEntry != NULL) && ($markVisited == true)) {
|
||||||
|
$this->storage->markVisited($foundEntry['id']);
|
||||||
|
// increase counter in object
|
||||||
|
$foundEntry['visited']++;
|
||||||
|
}
|
||||||
|
return $foundEntry;
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkUrlPattern($urlToCheck) {
|
||||||
|
if (empty($urlToCheck) == true) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$urlToCheck = strtolower($urlToCheck);
|
||||||
|
$supportedSchemas = array("http://", "https://", "mailto:");
|
||||||
|
foreach ($supportedSchemas as $oneSchema) {
|
||||||
|
if (str_startswith($urlToCheck, $oneSchema)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkUserShortId($shortidToCheck) {
|
||||||
|
// check pattern
|
||||||
|
if (preg_match("/[a-zA-Z0-9_-]+/", $shortidToCheck) != 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// check against blacklist
|
||||||
|
|
||||||
|
// allow all short ids
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStatisticsOverview() {
|
||||||
|
return $this->storage->getStatisticsOverview();
|
||||||
|
}
|
||||||
|
|
||||||
|
function getRandomLink() {
|
||||||
|
return $this->storage->getRandomLink();
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStatsCountByType() {
|
||||||
|
return $this->storage->getStatsCountByType();
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStatsAllLinksByType($t) {
|
||||||
|
return $this->storage->getStatsAllLinksByType($t);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStatsListActiveLinks($cnt = 10) {
|
||||||
|
return $this->storage->getStatsListActiveLinks($cnt);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStatsLinkData($t = -1) {
|
||||||
|
return $this->storage->getStatsLinkData($t);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* configuration settings
|
||||||
|
*/
|
||||||
|
|
||||||
|
define('DB_HOST', '');
|
||||||
|
define('DB_USER', '');
|
||||||
|
define('DB_PASS', '');
|
||||||
|
define('DB_DATABASE', '');
|
||||||
|
define('DB_TABLE', 'urls');
|
||||||
|
|
||||||
|
define('SERVICE_BASE_URL', 'http://example.com/');
|