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
	
	 Tom MTT
						Tom MTT