feat: README and LICENSE
This commit is contained in:
commit
146b2241f5
2 changed files with 320 additions and 0 deletions
29
LICENSE
Normal file
29
LICENSE
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
Copyright (c) 2022
|
||||||
|
Tom MTT. <tom@heimdall.pm>
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
3. Neither the name of the copyright holder nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||||
|
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
291
README.md
Normal file
291
README.md
Normal file
|
@ -0,0 +1,291 @@
|
||||||
|
# feuille
|
||||||
|
|
||||||
|
**feuille** is a fast, dead-simple socket-based pastebin that allows a
|
||||||
|
user to send text, logs or code to your server. It focuses on speed,
|
||||||
|
code quality, and security.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Table of Contents</summary>
|
||||||
|
<ol>
|
||||||
|
<li><a href="#usage">Usage</a></li>
|
||||||
|
<li>
|
||||||
|
<a href="#installation">Installation</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#dependencies">Dependencies</a></li>
|
||||||
|
<li><a href="#build">Build</a></li>
|
||||||
|
<li><a href="#configuration">Configuration</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#help">Help</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#how-do-i-make-feuille-run-at-startup">How do I make feuille run at startup?</a></li>
|
||||||
|
<li><a href="#how-do-i-remove-expired-pastes-after-some-time">How do I remove expired pastes after some time?</a></li>
|
||||||
|
<li><a href="#how-can-i-send-pastes-directly-from-my-website-instead-of-using-netcat">How can I send pastes directly from my website (instead of using netcat)?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#authors">Authors</a></li>
|
||||||
|
<li><a href="#license">License</a></li>
|
||||||
|
<li><a href="#acknowledgments">Acknowledgments</a></li>
|
||||||
|
</ol>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
You'll need either `nc` or nmap's `ncat`.
|
||||||
|
|
||||||
|
The former is probably already available on your system, but lacks
|
||||||
|
some features, which will make you wait for the timeout before
|
||||||
|
getting a link to the paste (usually 4 seconds).
|
||||||
|
|
||||||
|
The latter will have to be installed manually but is more featureful
|
||||||
|
and will get a link instantly once everything is sent. It works the
|
||||||
|
exact same way as `nc`.
|
||||||
|
|
||||||
|
*Choose your weapon wisely.*
|
||||||
|
|
||||||
|
Assuming you're using my personal pastebin instance,
|
||||||
|
[heimdall.pm](https://bin.heimdall.pm/), you can upload text, code or
|
||||||
|
logs like this:
|
||||||
|
|
||||||
|
```console
|
||||||
|
// sending text
|
||||||
|
$ echo Hello, World! | nc heimdall.pm 8888
|
||||||
|
https://bin.heimdall.pm/abcd
|
||||||
|
|
||||||
|
// sending files
|
||||||
|
$ cat feuille.c | nc heimdall.pm 8888
|
||||||
|
https://bin.heimdall.pm/efgh
|
||||||
|
```
|
||||||
|
|
||||||
|
*This truly is the joy of Unix pipes.*
|
||||||
|
|
||||||
|
Once you received the link to your paste, you can send it to someone,
|
||||||
|
browse it or `curl` it, like this:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ curl https://bin.heimdall.pm/abcd
|
||||||
|
Hello, World!
|
||||||
|
|
||||||
|
$ curl https://bin.heimdall.pm/efgh
|
||||||
|
/*
|
||||||
|
* feuille.c
|
||||||
|
* Main source file.
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
Want to push the concept further? You can send encrypted files, too!
|
||||||
|
You'll need `gpg` for this. `-c` means encryption using a password,
|
||||||
|
`-ao tmp.pgp` means ASCII output to file `tmp.pgp`.
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ cat secret.txt | gpg -cao tmp.pgp
|
||||||
|
$ cat tmp.pgp | nc heimdall.pm 8888
|
||||||
|
https://bin.heimdall.pm/ijkl
|
||||||
|
```
|
||||||
|
|
||||||
|
You can then retrieve it and decrypt it using `curl` and `gpg` again,
|
||||||
|
like this:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ curl https://bin.heimdall.pm/ijkl | gpg -d
|
||||||
|
```
|
||||||
|
|
||||||
|
(Obviously, you'll have to type the right password.)
|
||||||
|
|
||||||
|
But, all those commands are really cumbersome, aren't they?
|
||||||
|
Guess what? We made aliases!
|
||||||
|
|
||||||
|
Put those into your `~/.{ba,z,k}shrc`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
alias pst="$NC heimdall.pm 8888"
|
||||||
|
alias spst="gpg -cao tmp.pgp && cat tmp.pgp | $NC heimdall.pm 8888 && rm tmp.pgp"
|
||||||
|
```
|
||||||
|
|
||||||
|
Now, you can use **feuille** like this:
|
||||||
|
|
||||||
|
```console
|
||||||
|
// plain
|
||||||
|
$ echo Hello, World! | pst
|
||||||
|
https://bin.heimdall.pm/mnop
|
||||||
|
|
||||||
|
// encrypted
|
||||||
|
$ echo da sup3r sekr1t | spst
|
||||||
|
https://bin.heimdall.pm/qrst
|
||||||
|
```
|
||||||
|
|
||||||
|
For a complete list of aliases, see
|
||||||
|
[here](https://basedwa.re/tmtt/feuille/src/branch/main/misc/aliases)
|
||||||
|
and either put those in your `~/.{ba,z,k}shrc` or source it.
|
||||||
|
|
||||||
|
That sould be it. Have fun!
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
* Focuses on speed,
|
||||||
|
* Multi-threaded (using `fork`)
|
||||||
|
* Only does what it needs to do
|
||||||
|
|
||||||
|
* code quality,
|
||||||
|
* Readable, documented code
|
||||||
|
* With future contributors / maintainers in mind
|
||||||
|
|
||||||
|
* and security
|
||||||
|
* `chroot`s in the output folder
|
||||||
|
* Drops root privileges once they're no longer needed
|
||||||
|
* Uses OS-specific security measures (like OpenBSD's `pledge`)
|
||||||
|
|
||||||
|
* Plenty of auxiliary files (see
|
||||||
|
[misc/](https://basedwa.re/tmtt/feuille/src/branch/main/misc),
|
||||||
|
[cgi/](https://basedwa.re/tmtt/feuille/src/branch/main/cgi) and
|
||||||
|
[cron/](https://basedwa.re/tmtt/feuille/src/branch/main/cron))
|
||||||
|
* A list of aliases for your users' `~/.{ba,z,k}shrc`
|
||||||
|
* A CGI script that lets the user send pastes directly from your
|
||||||
|
website
|
||||||
|
* A sample HTML form for your CGI script
|
||||||
|
* A cron job that deletes expired pastes
|
||||||
|
* A cron job that runs **feuille** at startup
|
||||||
|
|
||||||
|
* Lots of options (see [configuration](#configuration))
|
||||||
|
* Works on nearly all POSIX-compliant OSes
|
||||||
|
* Can be run in the background and as a service
|
||||||
|
* IPv6-enabled
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### Dependencies
|
||||||
|
|
||||||
|
You'll need a working *POSIX-compliant system* such as Linux, OpenBSD
|
||||||
|
or FreeBSD, a C99 compiler (GCC, Clang...) and a POSIX-Make
|
||||||
|
implementation.
|
||||||
|
|
||||||
|
You'll probably want an HTTP / Gopher / Gemini / ... server to serve
|
||||||
|
the pastes on the web, such as OpenBSD's httpd or Apache. Just make
|
||||||
|
your server serve the folder feuille's using, there are plenty of
|
||||||
|
tutorials on the web.
|
||||||
|
|
||||||
|
If you wish to make modifications to the manpage, you'll need pandoc
|
||||||
|
to convert the markdown file into a man-compatible format.
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
**feuille** needs to be built from source.
|
||||||
|
|
||||||
|
To do so, you'll first need to clone the repository.
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ git clone https://basedwa.re/tmtt/feuille
|
||||||
|
$ cd feuille
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, simply run:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ make
|
||||||
|
$ sudo make install
|
||||||
|
```
|
||||||
|
|
||||||
|
If you wish to make a debug build, you can set `DEBUG` to whatever
|
||||||
|
comes to your mind.
|
||||||
|
|
||||||
|
You can also set `CC` to the compiler of your liking, like `clang` or
|
||||||
|
`pcc`.
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ make DEBUG=yes CC=clang
|
||||||
|
```
|
||||||
|
|
||||||
|
In order to compile CGI script(s), run:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ make cgi
|
||||||
|
```
|
||||||
|
|
||||||
|
`ADDR` and `PORT` can be set to the address and port on which
|
||||||
|
**feuille** listens, respectively.
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
For a complete list of options and examples, please see the manpage,
|
||||||
|
either on your computer by doing `man feuille` or on the
|
||||||
|
[online wiki](https://basedwa.re/tmtt/feuille/wiki/Manpage).
|
||||||
|
|
||||||
|
## Help
|
||||||
|
|
||||||
|
* [How do I make feuille run at startup?](#how-do-i-make-feuille-run-at-startup)
|
||||||
|
* [How do I remove expired pastes after some time?](#how-do-i-remove-expired-pastes-after-some-time)
|
||||||
|
* [How can I send pastes directly from my website (instead of using netcat)?](#how-can-i-send-pastes-directly-from-my-website-instead-of-using-netcat)
|
||||||
|
|
||||||
|
### How do I make feuille run at startup?
|
||||||
|
|
||||||
|
You can put that in your crontab (by doing `sudo crontab -e`).
|
||||||
|
It will start **feuille** every time the system starts.
|
||||||
|
No need for some fancy service file :DDD
|
||||||
|
|
||||||
|
Obviously, you can put some options after `feuille`, like `-o
|
||||||
|
/var/feuille` or `-v`.
|
||||||
|
|
||||||
|
```
|
||||||
|
@reboot feuille
|
||||||
|
```
|
||||||
|
|
||||||
|
See
|
||||||
|
[cron/startup.cron](https://basedwa.re/tmtt/feuille/src/branch/main/cron/startup.cron)
|
||||||
|
if you'd like to download the cron job.
|
||||||
|
|
||||||
|
### How do I remove expired pastes after some time?
|
||||||
|
|
||||||
|
You can put that in your crontab (by doing `sudo crontab -e`).
|
||||||
|
It will delete all files in `/var/www/htdocs/feuille` that are at least 7
|
||||||
|
days old.
|
||||||
|
|
||||||
|
Don't forget to change the folder to the one **feuille**'s using and
|
||||||
|
eventually `+7` to the maximum file age you'd like to use.
|
||||||
|
|
||||||
|
```
|
||||||
|
0 0 * * * find /var/www/htdocs/feuille -type f -mtime +7 -exec rm {} +
|
||||||
|
```
|
||||||
|
|
||||||
|
See
|
||||||
|
[cron/purge.cron](https://basedwa.re/tmtt/feuille/src/branch/main/cron/purge.cron)
|
||||||
|
if you'd like to download the cron job.
|
||||||
|
|
||||||
|
### How can I send pastes directly from my website (instead of using netcat)?
|
||||||
|
|
||||||
|
We made a CGI script for that. First, you need to build it:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ make cgi
|
||||||
|
```
|
||||||
|
|
||||||
|
`ADDR` and `PORT` can be set to the address and port on which
|
||||||
|
**feuille** listens, respectively.
|
||||||
|
|
||||||
|
Once it's done, you can put `./web/cgi/feuille.cgi` in your website's
|
||||||
|
`cgi-bin` folder (usually somewhere like
|
||||||
|
`/var/www/htdocs/my.paste.bin/cgi-bin`) and configure your web server
|
||||||
|
to execute CGI scripts.
|
||||||
|
|
||||||
|
You can then create an HTML form that will send a POST request to the
|
||||||
|
CGI script. The form must have `enctype="text/plain"` and must contain
|
||||||
|
only one input or textarea. See
|
||||||
|
[web/cgi/form.html](https://basedwa.re/tmtt/feuille/src/branch/main/cgi/form.html)
|
||||||
|
for a sample form.
|
||||||
|
|
||||||
|
## Authors
|
||||||
|
|
||||||
|
Tom MTT. <tom@heimdall.pm>
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Copyright © 2022 Tom MTT. <tom@heimdall.pm>
|
||||||
|
This program is free software, licensed under the 3-Clause BSD License.
|
||||||
|
See LICENSE for more information.
|
||||||
|
|
||||||
|
## Acknowledgments
|
||||||
|
|
||||||
|
Heavily inspired by [fiche](https://github.com/solusipse/fiche).
|
||||||
|
|
||||||
|
I entirely "rewrote" fiche from scratch because I wasn't happy with
|
||||||
|
some of its features and its overall code quality.
|
Reference in a new issue