Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fbc8445b73 | ||
|
|
cd72ee3124 |
1
.hgtags
1
.hgtags
@@ -1 +1,2 @@
|
||||
b66e758d981314bfd9de6dbfe0385785908a884c v1.0.0
|
||||
4db108cffb1f05d2c42ff71e22d6c2330b4f45ad v1.1.0
|
||||
|
||||
57
README.md
57
README.md
@@ -1,9 +1,11 @@
|
||||
## 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.
|
||||
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? ###
|
||||
|
||||
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.
|
||||
|
||||
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:
|
||||
```
|
||||
@@ -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 ###
|
||||
|
||||
@@ -52,7 +90,7 @@ Clean code, preferably with comments for some quirky places.
|
||||
### PasteBinIt configuration ###
|
||||
|
||||
default pastebin site, __~/.pastebinit.xml__:
|
||||
```
|
||||
```xml
|
||||
<pastebinit>
|
||||
<pastebin>http://your.site</pastebin>
|
||||
<author>Stephane Graber</author>
|
||||
@@ -61,7 +99,7 @@ default pastebin site, __~/.pastebinit.xml__:
|
||||
</pastebinit>
|
||||
```
|
||||
and how to work with it __~/.pastebinit.d/your.site.conf__:
|
||||
```
|
||||
```ini
|
||||
[pastebin]
|
||||
basename = 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 = /
|
||||
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.
|
||||
|
||||
7
app.ini
7
app.ini
@@ -1,15 +1,14 @@
|
||||
[app]
|
||||
; either "paste" or "shortener"
|
||||
; reserved for future releases, not used
|
||||
; either "paste" or "short"
|
||||
type = paste
|
||||
; relative path to application, as it seen in browser
|
||||
; must end with '/'
|
||||
baseurl = /
|
||||
; if you decide to put images|css on separate domain, write it here
|
||||
; 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/
|
||||
; hostname where app lives, with http(s) prefix
|
||||
siteaddress = http://127.0.0.1/
|
||||
; path, where db created|stored, if not exist, it will be created
|
||||
dbpath = paste/paste.sqlite
|
||||
dbpath = data/db.sqlite
|
||||
|
||||
142
index.php
142
index.php
@@ -1,5 +1,6 @@
|
||||
<?php
|
||||
$config = parse_ini_file("app.ini");
|
||||
|
||||
define ('SITE_ADDRESS', $config["siteaddress"]);
|
||||
define ('BASEURL', $config["baseurl"]);
|
||||
define ('APP_ADDRESS', substr(SITE_ADDRESS, 0, -1) . BASEURL);
|
||||
@@ -7,12 +8,16 @@ define ('CDN_ADDRESS', $config["cdnaddress"]);
|
||||
define ('DBPATH', $config["dbpath"]);
|
||||
define ('KEY_MIN', 3);
|
||||
define ('KEY_MAX', 9);
|
||||
define ('APP_TYPE', $config["type"]);
|
||||
|
||||
unset ($config);
|
||||
|
||||
function showindex($text) {
|
||||
header('Content-Language: en, ru');
|
||||
header('Pragma: no-cache');
|
||||
header('Cache-Control: no-cache');
|
||||
|
||||
if (APP_TYPE == 'paste') {
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
@@ -33,8 +38,9 @@ function showindex($text) {
|
||||
<h3>Slack Paste</h3>
|
||||
<form method="post" action="<?php print APP_ADDRESS; ?>" enctype="multipart/form-data">
|
||||
<textarea name="exs" id="textbox" autofocus></textarea><br />
|
||||
<input type="submit" value="Post it!" style="font-size:115%;" /> for
|
||||
<select name="etime" style="font-size: 85%; text-align:left;">
|
||||
<input type="submit" value="Post it!" style="font-size:115%;" />
|
||||
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="2" style="font-size: 85%; text-align:left;">12 Hours</option>
|
||||
<option value="3" style="font-size: 85%; text-align:left;">1 day</option>
|
||||
@@ -61,6 +67,54 @@ function showindex($text) {
|
||||
</body>
|
||||
</html>
|
||||
<?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() {
|
||||
@@ -303,23 +357,30 @@ function store_data($paste) {
|
||||
return($id);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* MAIN STARTS HERE
|
||||
*/
|
||||
|
||||
$text = '';
|
||||
|
||||
if (($_SERVER['REQUEST_METHOD'] === 'GET') or ($_SERVER['REQUEST_METHOD'] === 'HEAD')) {
|
||||
# substr returns empty string (boolean false) on error
|
||||
$str = $_SERVER['REQUEST_URI']; $str = substr($str, mb_strlen(BASEURL, 'UTF-8'));
|
||||
|
||||
if ($str == 'e') {
|
||||
eclient();
|
||||
exit;
|
||||
} elseif ($str == 'd') {
|
||||
dclient();
|
||||
exit;
|
||||
}
|
||||
if (APP_TYPE == 'paste') {
|
||||
if ($str == 'e') {
|
||||
eclient();
|
||||
exit;
|
||||
} elseif ($str == 'd') {
|
||||
dclient();
|
||||
exit;
|
||||
}
|
||||
|
||||
# pastebin returns raw pate when paste' key prepended with /raw/, let's handle it
|
||||
if (preg_match('/^raw\//', $str) == 1) {
|
||||
$str = substr($str, mb_strlen('raw/', 'UTF-8'));
|
||||
# pastebin returns raw paste when paste' key prepended with /raw/, let's handle it
|
||||
if (preg_match('/^raw\//', $str) == 1) {
|
||||
$str = substr($str, mb_strlen('raw/', 'UTF-8'));
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
$text = 'No such paste.';
|
||||
} else {
|
||||
header('Content-Type: text/plain');
|
||||
print base64_decode($response);
|
||||
exit;
|
||||
$response = base64_decode($response);
|
||||
|
||||
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') {
|
||||
if (isset($_POST['exs']) and ($_POST['exs'] != '')) {
|
||||
$text = APP_ADDRESS . store_data(base64_encode($_POST['exs']));
|
||||
} elseif (isset($_POST['api_option'])){ # some pastebin API compatibility stuff
|
||||
if (APP_TYPE == 'short') {
|
||||
# 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 ((isset($_POST['api_paste_code'])) and ($_POST['api_paste_code'] != '')) {
|
||||
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);
|
||||
?>
|
||||
|
||||
/*
|
||||
* END OF MAIN
|
||||
*/
|
||||
?>
|
||||
|
||||
Reference in New Issue
Block a user