diff --git a/README.md b/README.md new file mode 100644 index 0000000..b22911b --- /dev/null +++ b/README.md @@ -0,0 +1,148 @@ +--- +title: 「null:ポインタ」 +--- + +This is a no-bullshit file hosting and URL shortening service[1][1] that also +runs [0x0.st](https://0x0.st). Use with uWSGI. + +# Configuration + +To configure 0x0, copy `instance/config.example.py` to +`instance/config.py`, then edit it. Resonable defaults are set, but +there\'s a couple options you\'ll need to change before running 0x0 for +the first time. + +By default, the configuration is stored in the Flask instance directory. +Normally, this is in [./instance]{.title-ref}, but it might be different +for your system. For details, see [the Flask +documentation](https://flask.palletsprojects.com/en/2.0.x/config/#instance-folders). + +To customize the home and error pages, simply create a `templates` +directory in your instance directory and copy any templates you want to +modify there. + +If you are running nginx, you should use the `X-Accel-Redirect` header. +To make it work, include this in your nginx config's `server` block: + + location /up { + internal; + } + +where `/up` is whatever you've configured as `FHOST_STORAGE_PATH`. + +For all other servers, set `FHOST_USE_X_ACCEL_REDIRECT` to `False` and +`USE_X_SENDFILE` to `True`, assuming your server supports this. +Otherwise, Flask will serve the file with chunked encoding, which has +several downsides, one of them being that range requests will not work. +This is a problem for example when streaming media files: It won't be +possible to seek, and some ISOBMFF (MP4) files will not play at all. + +To make files expire, simply run `FLASK_APP=fhost flask prune` every now +and then. You can use the provided systemd unit files for this: + + 0x0-prune.service + 0x0-prune.timer + +Make sure to edit them to match your system configuration. In +particular, set the user and paths in `0x0-prune.service`. + +Before running the service for the first time and every time you update +it from this git repository, run `FLASK_APP=fhost flask db upgrade`. + +# Moderation UI + +![image](modui.webp){height="300px"} + +0x0 features a TUI program for file moderation. With it, you can view a +list of uploaded files, as well as extended information on them. It +allows you to take actions like removing files temporarily or +permanently, as well as blocking IP addresses and associated files. + +If a sufficiently recent version of python-mpv with libmpv is present +and your terminal supports it, you also get graphical file previews, +including video playback. Upstream mpv currently supports sixels and the +[kitty graphics +protocol](https://sw.kovidgoyal.net/kitty/graphics-protocol/). For this +to work, set the `MOD_PREVIEW_PROTO` option in `instance/config.py`. + +Requirements: + +- [Textual](https://textual.textualize.io/) + +Optional: + +- [python-mpv](https://github.com/jaseg/python-mpv) (graphical + previews) +- [PyAV](https://github.com/PyAV-Org/PyAV) (information on multimedia + files) +- [PyMuPDF](https://github.com/pymupdf/PyMuPDF) (previews and file + information for PDF, XPS, EPUB, MOBI and FB2) +- [libarchive-c](https://github.com/Changaco/python-libarchive-c) + (archive content listing) + +::: note +::: title +Note +::: + +[Mosh](https://mosh.org/) currently does not support sixels or kitty +graphics. +::: + +::: hint +::: title +Hint +::: + +You may need to set the `COLORTERM` environment variable to `truecolor`. +::: + +::: tip +::: title +Tip +::: + +Using compression with SSH (`-C` option) can significantly reduce the +bandwidth requirements for graphics. +::: + +# NSFW Detection + +0x0 supports classification of NSFW content via Yahoo's open\_nsfw Caffe +neural network model. This works for images and video files and requires +the following: + +- Caffe Python module (built for Python 3) +- [PyAV](https://github.com/PyAV-Org/PyAV) + +# Virus Scanning + +0x0 can scan its files with ClamAV's daemon. As this can take a long +time for larger files, this does not happen immediately but instead +every time you run the `vscan` command. It is recommended to configure a +systemd timer or cronjob to do this periodically. Examples are included: + + 0x0-vscan.service + 0x0-vscan.timer + +Remember to adjust your size limits in clamd.conf, including +`StreamMaxLength`! + +This feature requires the [clamd +module](https://pypi.org/project/clamd/). + +# Network Security Considerations + +Keep in mind that 0x0 can fetch files from URLs. This includes your +local network! You should take precautions so that this feature cannot +be abused. 0x0 does not (yet) have a way to filter remote URLs, but on +Linux, you can use firewall rules and/or namespaces. This is less +error-prone anyway. + +For instance, if you are using the excellent +[FireHOL](https://firehol.org/), it's very easy to create a group on +your system and use it as a condition in your firewall rules. You would +then run the application server under that group. + +# Credits +* All the ASCII art used on the templates was taken from https://www.asciiart.eu/ diff --git a/README.rst b/README.rst deleted file mode 100644 index ba8748a..0000000 --- a/README.rst +++ /dev/null @@ -1,134 +0,0 @@ -The Null Pointer -================ - -This is a no-bullshit file hosting and URL shortening service that also runs -`0x0.st `_. Use with uWSGI. - -Configuration -------------- - -To configure 0x0, copy ``instance/config.example.py`` to ``instance/config.py``, then edit -it. Resonable defaults are set, but there's a couple options you'll need to change -before running 0x0 for the first time. - -By default, the configuration is stored in the Flask instance directory. -Normally, this is in `./instance`, but it might be different for your system. -For details, see -`the Flask documentation `_. - -To customize the home and error pages, simply create a ``templates`` directory -in your instance directory and copy any templates you want to modify there. - -If you are running nginx, you should use the ``X-Accel-Redirect`` header. -To make it work, include this in your nginx config’s ``server`` block:: - - location /up { - internal; - } - -where ``/up`` is whatever you’ve configured as ``FHOST_STORAGE_PATH``. - -For all other servers, set ``FHOST_USE_X_ACCEL_REDIRECT`` to ``False`` and -``USE_X_SENDFILE`` to ``True``, assuming your server supports this. -Otherwise, Flask will serve the file with chunked encoding, which has several -downsides, one of them being that range requests will not work. This is a -problem for example when streaming media files: It won’t be possible to seek, -and some ISOBMFF (MP4) files will not play at all. - -To make files expire, simply run ``FLASK_APP=fhost flask prune`` every -now and then. You can use the provided systemd unit files for this:: - - 0x0-prune.service - 0x0-prune.timer - -Make sure to edit them to match your system configuration. In particular, -set the user and paths in ``0x0-prune.service``. - -Before running the service for the first time and every time you update it -from this git repository, run ``FLASK_APP=fhost flask db upgrade``. - - -Moderation UI -------------- - -.. image:: modui.webp - :height: 300 - -0x0 features a TUI program for file moderation. With it, you can view a list -of uploaded files, as well as extended information on them. It allows you to -take actions like removing files temporarily or permanently, as well as -blocking IP addresses and associated files. - -If a sufficiently recent version of python-mpv with libmpv is present and -your terminal supports it, you also get graphical file previews, including -video playback. Upstream mpv currently supports sixels and the -`kitty graphics protocol `_. -For this to work, set the ``MOD_PREVIEW_PROTO`` option in ``instance/config.py``. - -Requirements: - -* `Textual `_ - -Optional: - -* `python-mpv `_ - (graphical previews) -* `PyAV `_ - (information on multimedia files) -* `PyMuPDF `_ - (previews and file information for PDF, XPS, EPUB, MOBI and FB2) -* `libarchive-c `_ - (archive content listing) - -.. note:: - `Mosh `_ currently does not support sixels or kitty graphics. - -.. hint:: - You may need to set the ``COLORTERM`` environment variable to - ``truecolor``. - -.. tip:: - Using compression with SSH (``-C`` option) can significantly - reduce the bandwidth requirements for graphics. - - -NSFW Detection --------------- - -0x0 supports classification of NSFW content via Yahoo’s open_nsfw Caffe -neural network model. This works for images and video files and requires -the following: - -* Caffe Python module (built for Python 3) -* `PyAV `_ - - -Virus Scanning --------------- - -0x0 can scan its files with ClamAV’s daemon. As this can take a long time -for larger files, this does not happen immediately but instead every time -you run the ``vscan`` command. It is recommended to configure a systemd -timer or cronjob to do this periodically. Examples are included:: - - 0x0-vscan.service - 0x0-vscan.timer - -Remember to adjust your size limits in clamd.conf, including -``StreamMaxLength``! - -This feature requires the `clamd module `_. - - -Network Security Considerations -------------------------------- - -Keep in mind that 0x0 can fetch files from URLs. This includes your local -network! You should take precautions so that this feature cannot be abused. -0x0 does not (yet) have a way to filter remote URLs, but on Linux, you can -use firewall rules and/or namespaces. This is less error-prone anyway. - -For instance, if you are using the excellent `FireHOL `_, -it’s very easy to create a group on your system and use it as a condition -in your firewall rules. You would then run the application server under that -group. diff --git a/templates/404.html b/templates/404.html index 88ea3cc..f93ac64 100644 --- a/templates/404.html +++ b/templates/404.html @@ -1,15 +1,23 @@ -{% set pid = range(20,100)|random %} -
Process {{ pid }} stopped
-* thread #1: tid = {{ pid }}, {{ "{:#018x}".format(id(g)) }}, name = 'fhost'
-    frame #0:
-Process {{ pid }} stopped
-* thread #8: tid = {{ pid }}, {{ "{:#018x}".format(id(request)) }} fhost`get(path='{{ request.path }}') + 27 at fhost.c:139, name = 'fhost/responder', stop reason = invalid address (fault address: 0x30)
-    frame #0: {3:#018x} fhost`get(path='{{ request.path }}') + 27 at fhost.c:139
-   136   get(SrvContext *ctx, const char *path)
-   137   {
-   138       StoredObj *obj = ctx->store->query(shurl_debase(path));
--> 139       switch (obj->type) {
-   140           case ObjTypeFile:
-   141               ctx->serve_file_id(obj->id);
-   142               break;
-(lldb) q
+ + + + + The page you were looking for doesn't exist (404) + + +
+          /\_____/\
+	 /  o   o  \ ???
+	( ==  ^  == )
+	 )         (
+	(           )
+       ( (  )   (  ) )
+      (__(__)___(__)__)
+    
+

+ These are not the kittens you're looking for.
+ Move along. +

+ Go Back? + + diff --git a/templates/411.html b/templates/411.html index 8c57608..83ae3e1 100644 --- a/templates/411.html +++ b/templates/411.html @@ -1 +1,26 @@ -Could not determine remote file size (no Content-Length in response header; shoot admin). + + + + + Length Required (411) + + +
+    ,-.       _,---._ __  / \
+ /  )    .-'       `./ /   \
+(  (   ,'            `/    /|
+ \  `-"             \'\   / |
+  `.              ,  \ \ /  |
+   /`.          ,'-`----Y   |
+  (            ;        |   '
+  |  ,-.    ,-'         |  /
+  |  | (   |        hjw | /
+  )  |  \  `.___________|/
+    `--'   `--'
+    
+

+ Could not determine remote file size (no Content-Length in response header; shoot admin). +

+ + + diff --git a/templates/413.html b/templates/413.html index 0e5c32a..9088333 100644 --- a/templates/413.html +++ b/templates/413.html @@ -1 +1,20 @@ -Remote file too large ({{ request.headers["content-length"]|filesizeformat(True) }} > {{ config["MAX_CONTENT_LENGTH"]|filesizeformat(True) }}). + + + + + Payload too large (413) + + +
+      (:`--..___...-''``-._             |`._
+  ```--...--.      . `-..__      .`/ _\  
+            `\     '       ```--`.    />
+            : :   :               `:`-'
+             `.:.  `.._--...___     ``--...__      
+      ``--..,)       ```----....__,) fl (tweeked)
+    
+

+ Remote file too large ({{ request.headers["content-length"]|filesizeformat(True) }} > {{ config["MAX_CONTENT_LENGTH"]|filesizeformat(True) }}). +

+ + diff --git a/templates/451.html b/templates/451.html index 2d631a4..d818053 100644 --- a/templates/451.html +++ b/templates/451.html @@ -1 +1,33 @@ -451 Unavailable For Legal Reasons + + + + + Unavailable for legal reasons (451) + + +
+      .___________________________________________________________________________.
+|                                                                           |
+|___________________________________________________________________________|
+  |     !           |           |           |           |           |     |
+  |_____|__,________|___________|______.____}__,________}___________|_____|
+  |         |  \   \   \   \   \    |   |    /   /   /   /   /  |         |
+  |_________|___\_,_\___\___\.__|___|___|___|___/___/___/___/___|_________|
+  |     |   |      |     \/ ,".). ',     \/. ',          |      |   |     |
+  |_____|___|      |. ' ,'|// / (/ ,.  ' ,\(   / ,       |      |___|_____|
+  |         |     ,|  '|\/ \|  \\,' ,'.' ||  \\,' .'    ,|  '   |         |
+  |_._______|   " ,|' .| \_ |\/ |#\_/#| /_|\_ |#\_/,) ',.|,'    |_________|
+  |     |   |   #|(,'  )  \\\#\ \##/  ||/ \#\  \###/\ \/ \/.',  |   |     |
+  |_____|__,|   || ) | \ |/ /#/ |#( \|\\|  |#/ /##(  )|  \\'/   |___|_____|
+  |         |    \ |.\\ |\_/#| /#)|##\ \\_/#| |######\ \\/#|    |         |
+  |_________|    /\\_/# |#\##/# boba@gagme.wwa.com #@#\ /#/\    |_____.___|
+  |     |   |   /  ##/#  ##\/#@####@@###V###\/#@####@@#Y### \   |   |     |
+  |___._|___|  / :Y##@@##@##@@###@@@###@##@@###@@@###@####:  \  |___|_____|
+  |         | / :;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:  \ |         |
+      |_________|/    ::::::::::::::::::::::::::::::::::::::::     \|_________|
+    
+

+ That's too bad. +

+ + diff --git a/templates/index.html b/templates/index.html index e4777ee..91b7b17 100644 --- a/templates/index.html +++ b/templates/index.html @@ -2,22 +2,15 @@ - media.chaotic.ninja + 0x0a 「null:ポインタ」

-
-	     __  _             __           _ _ 
-	    / /_| | _____   __/ / __  _   _| | |
-	   / / _` |/ _ \ \ / / / '_ \| | | | | |
-	  / / (_| |  __/\ V / /| | | | |_| | | |
-	 /_/ \__,_|\___| \_/_/ |_| |_|\__,_|_|_|
-	  
-

The Chaotic Pointer

+

「null:ポインタ」

@@ -31,7 +24,6 @@ Maximum file size: {{ max_size }}
Not allowed: {{ config["FHOST_MIME_BLACKLIST"] }}
- Uploaded files expire after 15 days, no exceptions.