2 Commits

Author SHA1 Message Date
eleksir
fbc8445b73 Added link shortener feature.
Now app can either handle pastes or shorten links, but not both.
2017-03-18 16:14:52 +03:00
eleksir
cd72ee3124 Added tag v1.1.0 for changeset 4db108cffb1f 2017-03-18 12:21:00 +03:00
4 changed files with 177 additions and 30 deletions

View File

@@ -1 +1,2 @@
b66e758d981314bfd9de6dbfe0385785908a884c v1.0.0 b66e758d981314bfd9de6dbfe0385785908a884c v1.0.0
4db108cffb1f05d2c42ff71e22d6c2330b4f45ad v1.1.0

View File

@@ -1,9 +1,11 @@
## Paste. ## ## Paste. ##
This is pastebin replacement. It does not use ads, it is opensource it is relatively small. This is pastebin replacement. It does not use ads, it is opensource, it is relatively small.
And it has minimal pastebin API stub, at least pastebinit can paste to it with minimal config changes. And it has minimal pastebin API stub, at least pastebinit can paste to it with minimal config changes.
Besides pastebinit there are 2 cli clients available on main page of this app. Besides pastebinit there are 2 cli clients available on main page of this app.
And as a bonus this app can short links too! But it either shorts links **or** stores paste, not both at same time.
### How do I get set up? ### ### How do I get set up? ###
This paste utilizes PDO SQLite driver, well, at least for now :) and mbstrings. This paste utilizes PDO SQLite driver, well, at least for now :) and mbstrings.
@@ -11,7 +13,11 @@ Tested php versions are 5.6.30 and 7.0.12. Paste uses **paste/paste.sqlite** fil
Tested on apache/fcgid (windows) for dev and nginx/php-fpm for prod. Tested on apache/fcgid (windows) for dev and nginx/php-fpm for prod.
Default installation assumes that paste runs as / app on site, but you can change it (BASEURL) in index.php. Default installation assumes that paste runs as / app on site, but you can change it (BASEURL) in app.ini.
#### Settings for paste mode ####
edit app.ini and set correct address, base url, db path, application type (type = paste)
Nginx config snippet: Nginx config snippet:
``` ```
@@ -43,7 +49,39 @@ location / {
} }
``` ```
Database initialises automatically :) Database initializes automatically :)
#### Settings for link shortener mode ####
edit app.ini and set correct address, base url, db path, application type (type = short)
Nginx config snippet:
```
# limit links size to ~ 50k
client_max_body_size 64k;
rewrite "^/([a-z|A-Z]*)$" /index.php?$1;
location / {
root /var/www/htdocs/empty;
index index.php;
location ~ \.php$ {
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 499;
}
root /var/www/htdocs;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_pass php;
}
}
```
Database initializes automatically :)
### Contribution guidelines ### ### Contribution guidelines ###
@@ -52,7 +90,7 @@ Clean code, preferably with comments for some quirky places.
### PasteBinIt configuration ### ### PasteBinIt configuration ###
default pastebin site, __~/.pastebinit.xml__: default pastebin site, __~/.pastebinit.xml__:
``` ```xml
<pastebinit> <pastebinit>
<pastebin>http://your.site</pastebin> <pastebin>http://your.site</pastebin>
<author>Stephane Graber</author> <author>Stephane Graber</author>
@@ -61,7 +99,7 @@ default pastebin site, __~/.pastebinit.xml__:
</pastebinit> </pastebinit>
``` ```
and how to work with it __~/.pastebinit.d/your.site.conf__: and how to work with it __~/.pastebinit.d/your.site.conf__:
``` ```ini
[pastebin] [pastebin]
basename = your.site basename = your.site
regexp = http://((([a-zA-Z0-9\-_\.]*)(your\.site))) regexp = http://((([a-zA-Z0-9\-_\.]*)(your\.site)))
@@ -115,4 +153,11 @@ diff -ruN pastebin.com.conf your.site.conf
-page = /api/api_post.php -page = /api/api_post.php
+page = / +page = /
regexp = (.*) regexp = (.*)
``` ```
### TODO ###
* Make one app that shorten links, stores paste, stores pictures (yes! image hosting).
* Configurable features (not everyone wants all features enabled).
* Before implementing picture storage, there should be made authorization.
* Sane and clear API.

View File

@@ -1,15 +1,14 @@
[app] [app]
; either "paste" or "shortener" ; either "paste" or "short"
; reserved for future releases, not used
type = paste type = paste
; relative path to application, as it seen in browser ; relative path to application, as it seen in browser
; must end with '/' ; must end with '/'
baseurl = / baseurl = /
; if you decide to put images|css on separate domain, write it here ; if you decide to put images|css on separate domain, write it here
; or leave it same as siteaddress ; or leave it same as siteaddress
; for now it is only /bg_logo.png ; for now it is only /bg_logo.png for paste and /logo.png for link shortener
cdnaddress = http://127.0.0.1/ cdnaddress = http://127.0.0.1/
; hostname where app lives, with http(s) prefix ; hostname where app lives, with http(s) prefix
siteaddress = http://127.0.0.1/ siteaddress = http://127.0.0.1/
; path, where db created|stored, if not exist, it will be created ; path, where db created|stored, if not exist, it will be created
dbpath = paste/paste.sqlite dbpath = data/db.sqlite

142
index.php
View File

@@ -1,5 +1,6 @@
<?php <?php
$config = parse_ini_file("app.ini"); $config = parse_ini_file("app.ini");
define ('SITE_ADDRESS', $config["siteaddress"]); define ('SITE_ADDRESS', $config["siteaddress"]);
define ('BASEURL', $config["baseurl"]); define ('BASEURL', $config["baseurl"]);
define ('APP_ADDRESS', substr(SITE_ADDRESS, 0, -1) . BASEURL); define ('APP_ADDRESS', substr(SITE_ADDRESS, 0, -1) . BASEURL);
@@ -7,12 +8,16 @@ define ('CDN_ADDRESS', $config["cdnaddress"]);
define ('DBPATH', $config["dbpath"]); define ('DBPATH', $config["dbpath"]);
define ('KEY_MIN', 3); define ('KEY_MIN', 3);
define ('KEY_MAX', 9); define ('KEY_MAX', 9);
define ('APP_TYPE', $config["type"]);
unset ($config); unset ($config);
function showindex($text) { function showindex($text) {
header('Content-Language: en, ru'); header('Content-Language: en, ru');
header('Pragma: no-cache'); header('Pragma: no-cache');
header('Cache-Control: no-cache'); header('Cache-Control: no-cache');
if (APP_TYPE == 'paste') {
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="ru"> <html lang="ru">
@@ -33,8 +38,9 @@ function showindex($text) {
<h3>Slack Paste</h3> <h3>Slack Paste</h3>
<form method="post" action="<?php print APP_ADDRESS; ?>" enctype="multipart/form-data"> <form method="post" action="<?php print APP_ADDRESS; ?>" enctype="multipart/form-data">
<textarea name="exs" id="textbox" autofocus></textarea><br /> <textarea name="exs" id="textbox" autofocus></textarea><br />
<input type="submit" value="Post it!" style="font-size:115%;" /> for <input type="submit" value="Post it!" style="font-size:115%;" />
<select name="etime" style="font-size: 85%; text-align:left;"> for
<select name="etime" style="font-size:115%; text-align:left;">
<option value="1" style="font-size: 85%; text-align:left;">1 Hour</option> <option value="1" style="font-size: 85%; text-align:left;">1 Hour</option>
<option value="2" style="font-size: 85%; text-align:left;">12 Hours</option> <option value="2" style="font-size: 85%; text-align:left;">12 Hours</option>
<option value="3" style="font-size: 85%; text-align:left;">1 day</option> <option value="3" style="font-size: 85%; text-align:left;">1 day</option>
@@ -61,6 +67,54 @@ function showindex($text) {
</body> </body>
</html> </html>
<?php <?php
} elseif (APP_TYPE == 'short') {
?>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8" />
<style>
* {
margin: 10px;
text-align: center;
font-size: 14pt;
}
html, body {
background-color: #adc0fc; text-align: center;
}
</style>
<title>Link Shortener</title>
</head>
<body>
<img src="<?php print CDN_ADDRESS; ?>logo.png" />
<form method="post" action="<?php print APP_ADDRESS; ?>">
Shorten this link:<br />
<input type="text" maxlength="768" name="exs" style="font-size: 110%; width:45%;" autofocus/></br />
<input type="submit" value="Submit" style="font-size: 85%;" />
for
<select name="etime" style="font-size: 85%; text-align:left;">
<option value="1" style="font-size: 85%; text-align:left;">1 Hour</option>
<option value="2" style="font-size: 85%; text-align:left;">12 Hours</option>
<option value="3" style="font-size: 85%; text-align:left;">1 day</option>
<option value="4" style="font-size: 85%; text-align:left;">1 week</option>
<option value="5" style="font-size: 85%; text-align:left;">1 Month</option>
<option value="6" style="font-size: 85%; text-align:left;">3 Months</option>
<option value="7" selected style="font-size: 85%; text-align:left;">6 Months</option>
<option value="8" style="font-size: 85%; text-align:left;">1 Year</option>
<option value="9" style="font-size: 85%; text-align:left;">2 Years</option>
<option value="10" style="font-size: 85%; text-align:left;">3 Years</option>
</select>
</form>
<?php
if ($text != '') {
printf (" <table style=\"margin: 0px auto;\"><td>%s</td></table>\n", $text);
}
?>
</body>
</html>
<?php
}
} }
function eclient() { function eclient() {
@@ -303,23 +357,30 @@ function store_data($paste) {
return($id); return($id);
} }
/*
* MAIN STARTS HERE
*/
$text = ''; $text = '';
if (($_SERVER['REQUEST_METHOD'] === 'GET') or ($_SERVER['REQUEST_METHOD'] === 'HEAD')) { if (($_SERVER['REQUEST_METHOD'] === 'GET') or ($_SERVER['REQUEST_METHOD'] === 'HEAD')) {
# substr returns empty string (boolean false) on error # substr returns empty string (boolean false) on error
$str = $_SERVER['REQUEST_URI']; $str = substr($str, mb_strlen(BASEURL, 'UTF-8')); $str = $_SERVER['REQUEST_URI']; $str = substr($str, mb_strlen(BASEURL, 'UTF-8'));
if ($str == 'e') { if (APP_TYPE == 'paste') {
eclient(); if ($str == 'e') {
exit; eclient();
} elseif ($str == 'd') { exit;
dclient(); } elseif ($str == 'd') {
exit; dclient();
} exit;
}
# pastebin returns raw pate when paste' key prepended with /raw/, let's handle it # pastebin returns raw paste when paste' key prepended with /raw/, let's handle it
if (preg_match('/^raw\//', $str) == 1) { if (preg_match('/^raw\//', $str) == 1) {
$str = substr($str, mb_strlen('raw/', 'UTF-8')); $str = substr($str, mb_strlen('raw/', 'UTF-8'));
}
} }
if ((mb_strlen($str, 'UTF-8') >= KEY_MIN) and ((mb_strlen($str, 'UTF-8') <= KEY_MAX))) { if ((mb_strlen($str, 'UTF-8') >= KEY_MIN) and ((mb_strlen($str, 'UTF-8') <= KEY_MAX))) {
@@ -329,17 +390,56 @@ if (($_SERVER['REQUEST_METHOD'] === 'GET') or ($_SERVER['REQUEST_METHOD'] === 'H
if ($response === false) { if ($response === false) {
$text = 'No such paste.'; $text = 'No such paste.';
} else { } else {
header('Content-Type: text/plain'); $response = base64_decode($response);
print base64_decode($response);
exit; if (APP_TYPE == 'paste') {
header('Content-Type: text/plain');
print $response;
exit;
} elseif (APP_TYPE == 'short') {
header( "Location: " . $response, true, 301 );
}
} }
} }
} }
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') { } elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['exs']) and ($_POST['exs'] != '')) { if (isset($_POST['exs']) and ($_POST['exs'] != '')) {
$text = APP_ADDRESS . store_data(base64_encode($_POST['exs'])); if (APP_TYPE == 'short') {
} elseif (isset($_POST['api_option'])){ # some pastebin API compatibility stuff # I don't like loops :)
if ((preg_match('/^https?\:/', $_POST['exs']) == 1) or
(preg_match('/^s?ftps?\:/', $_POST['exs']) == 1) or
# Looks like shorten links other than http(s) or ftp is not good idea at all, but we CAN do this too.
(preg_match('/^ldaps?\:/', $_POST['exs']) == 1) or
(preg_match('/^ircs?\:/', $_POST['exs']) == 1) or
(preg_match('/^xmpp\:/', $_POST['exs']) == 1) or
(preg_match('/^mailto\:/', $_POST['exs']) == 1) or
(preg_match('/^rtmp\:/', $_POST['exs']) == 1) or
(preg_match('/^rtsp\:/', $_POST['exs']) == 1) or
(preg_match('/^rtp\:/', $_POST['exs']) == 1) or
(preg_match('/^soutcast\:/', $_POST['exs']) == 1) or
(preg_match('/^icecast\:/', $_POST['exs']) == 1) or
(preg_match('/^magnet\:/', $_POST['exs']) == 1) or
(preg_match('/^ed2k\:/', $_POST['exs']) == 1) or
(preg_match('/^ssh\:/', $_POST['exs']) == 1) or
(preg_match('/^svn\:/', $_POST['exs']) == 1) or
(preg_match('/^hg\:/', $_POST['exs']) == 1) or
(preg_match('/^git\:/', $_POST['exs']) == 1) or
(preg_match('/^smb\:/', $_POST['exs']) == 1) or
(preg_match('/^ipp\:/', $_POST['exs']) == 1) or
(preg_match('/^chrome\:/', $_POST['exs']) == 1) or # i'm doubt if this really working, but anyway
(preg_match('/^vivaldi\:/', $_POST['exs']) == 1) or # i'm doubt if this really working, but anyway
(preg_match('/^opera\:/', $_POST['exs']) == 1) or # i'm doubt if this really working, but anyway
(preg_match('/^about\:/', $_POST['exs']) == 1) or # i'm doubt if this really working, but anyway
(preg_match('/^skype\:/', $_POST['exs']) == 1)) {
$text = APP_ADDRESS . store_data(base64_encode($_POST['exs']));
} else {
$text = 'Unable to short your link.';
}
} elseif (APP_TYPE == 'paste') {
$text = APP_ADDRESS . store_data(base64_encode($_POST['exs']));
}
} elseif ((APP_TYPE == 'paste') and (isset($_POST['api_option']))) { # some pastebin API compatibility stuff
if ($_POST['api_option'] == 'paste') { if ($_POST['api_option'] == 'paste') {
if ((isset($_POST['api_paste_code'])) and ($_POST['api_paste_code'] != '')) { if ((isset($_POST['api_paste_code'])) and ($_POST['api_paste_code'] != '')) {
header('Content-Type: text/plain; charset=utf-8'); header('Content-Type: text/plain; charset=utf-8');
@@ -368,9 +468,11 @@ if (($_SERVER['REQUEST_METHOD'] === 'GET') or ($_SERVER['REQUEST_METHOD'] === 'H
} }
} }
} }
} else {
# ???
} }
showindex($text); showindex($text);
?>
/*
* END OF MAIN
*/
?>