.rst is horrible, use html 3.2 with almost all templates, ascii art included as a bonus
Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
このコミットが含まれているのは:
コミット
d230f9461b
|
@ -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/
|
134
README.rst
134
README.rst
|
@ -1,134 +0,0 @@
|
||||||
The Null Pointer
|
|
||||||
================
|
|
||||||
|
|
||||||
This is a no-bullshit file hosting and URL shortening service 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`, 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: 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 <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::
|
|
||||||
`Mosh <https://mosh.org/>`_ 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 <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.
|
|
|
@ -1,15 +1,23 @@
|
||||||
{% set pid = range(20,100)|random %}
|
<!DOCTYPE HTML "-//W3C//DTD HTML 3.2 Final//EN">
|
||||||
<pre>Process {{ pid }} stopped
|
<html>
|
||||||
* thread #1: tid = {{ pid }}, {{ "{:#018x}".format(id(g)) }}, name = 'fhost'
|
<head>
|
||||||
frame #0:
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
Process {{ pid }} stopped
|
<title>The page you were looking for doesn't exist (404)</title>
|
||||||
* 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)
|
</head>
|
||||||
frame #0: {3:#018x} fhost`get(path='{{ request.path }}') + 27 at fhost.c:139
|
<body bgcolor="#000000" text="#ffffff" link="#ffffff">
|
||||||
136 get(SrvContext *ctx, const char *path)
|
<pre>
|
||||||
137 {
|
/\_____/\
|
||||||
138 StoredObj *obj = ctx->store->query(shurl_debase(path));
|
/ o o \ ???
|
||||||
-> 139 switch (obj->type) {
|
( == ^ == )
|
||||||
140 case ObjTypeFile:
|
) (
|
||||||
141 ctx->serve_file_id(obj->id);
|
( )
|
||||||
142 break;
|
( ( ) ( ) )
|
||||||
(lldb) q</pre>
|
(__(__)___(__)__)
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
These are not the kittens you're looking for. <br>
|
||||||
|
Move along.
|
||||||
|
</p>
|
||||||
|
<a href="/">Go Back?</a>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
|
@ -1 +1,26 @@
|
||||||
|
<!DOCTYPE HTML "-//W3C//DTD HTML 3.2 Final//EN">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
||||||
|
<title>Length Required (411)</title>
|
||||||
|
</head>
|
||||||
|
<body bgcolor="#000000" text="#ffffff">
|
||||||
|
<pre>
|
||||||
|
,-. _,---._ __ / \
|
||||||
|
/ ) .-' `./ / \
|
||||||
|
( ( ,' `/ /|
|
||||||
|
\ `-" \'\ / |
|
||||||
|
`. , \ \ / |
|
||||||
|
/`. ,'-`----Y |
|
||||||
|
( ; | '
|
||||||
|
| ,-. ,-' | /
|
||||||
|
| | ( | hjw | /
|
||||||
|
) | \ `.___________|/
|
||||||
|
`--' `--'
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
Could not determine remote file size (no Content-Length in response header; shoot admin).
|
Could not determine remote file size (no Content-Length in response header; shoot admin).
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
|
|
|
@ -1 +1,20 @@
|
||||||
|
<!DOCTYPE HTML "-//W3C//DTD HTML 3.2 Final//EN">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
||||||
|
<title>Payload too large (413)</title>
|
||||||
|
</head>
|
||||||
|
<body bgcolor="#000000" text="#ffffff">
|
||||||
|
<pre>
|
||||||
|
(:`--..___...-''``-._ |`._
|
||||||
|
```--...--. . `-..__ .`/ _\
|
||||||
|
`\ ' ```--`. />
|
||||||
|
: : : `:`-'
|
||||||
|
`.:. `.._--...___ ``--...__
|
||||||
|
``--..,) ```----....__,) fl (tweeked)
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
Remote file too large ({{ request.headers["content-length"]|filesizeformat(True) }} > {{ config["MAX_CONTENT_LENGTH"]|filesizeformat(True) }}).
|
Remote file too large ({{ request.headers["content-length"]|filesizeformat(True) }} > {{ config["MAX_CONTENT_LENGTH"]|filesizeformat(True) }}).
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
|
@ -1 +1,33 @@
|
||||||
451 Unavailable For Legal Reasons
|
<!DOCTYPE HTML "-//W3C//DTD HTML 3.2 Final//EN">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
||||||
|
<title>Unavailable for legal reasons (451)</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<pre>
|
||||||
|
.___________________________________________________________________________.
|
||||||
|
| |
|
||||||
|
|___________________________________________________________________________|
|
||||||
|
| ! | | | | | |
|
||||||
|
|_____|__,________|___________|______.____}__,________}___________|_____|
|
||||||
|
| | \ \ \ \ \ | | / / / / / | |
|
||||||
|
|_________|___\_,_\___\___\.__|___|___|___|___/___/___/___/___|_________|
|
||||||
|
| | | | \/ ,".). ', \/. ', | | | |
|
||||||
|
|_____|___| |. ' ,'|// / (/ ,. ' ,\( / , | |___|_____|
|
||||||
|
| | ,| '|\/ \| \\,' ,'.' || \\,' .' ,| ' | |
|
||||||
|
|_._______| " ,|' .| \_ |\/ |#\_/#| /_|\_ |#\_/,) ',.|,' |_________|
|
||||||
|
| | | #|(,' ) \\\#\ \##/ ||/ \#\ \###/\ \/ \/.', | | |
|
||||||
|
|_____|__,| || ) | \ |/ /#/ |#( \|\\| |#/ /##( )| \\'/ |___|_____|
|
||||||
|
| | \ |.\\ |\_/#| /#)|##\ \\_/#| |######\ \\/#| | |
|
||||||
|
|_________| /\\_/# |#\##/# boba@gagme.wwa.com #@#\ /#/\ |_____.___|
|
||||||
|
| | | / ##/# ##\/#@####@@###V###\/#@####@@#Y### \ | | |
|
||||||
|
|___._|___| / :Y##@@##@##@@###@@@###@##@@###@@@###@####: \ |___|_____|
|
||||||
|
| | / :;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;: \ | |
|
||||||
|
|_________|/ :::::::::::::::::::::::::::::::::::::::: \|_________|
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
That's too bad.
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
|
@ -2,22 +2,15 @@
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<title>media.chaotic.ninja</title>
|
<title>0x0a 「null:ポインタ」</title>
|
||||||
</head>
|
</head>
|
||||||
<body bgcolor="#000000">
|
<body bgcolor="#000000">
|
||||||
<br><br><table border="2" cellpadding="12" cellspacing="0" bgcolor="#ffffff" align="center">
|
<br><br><table border="2" cellpadding="12" cellspacing="0" bgcolor="#ffffff" align="center">
|
||||||
<tr>
|
<tr>
|
||||||
<td border="0" align="center">
|
<td border="0" align="center">
|
||||||
<pre>
|
|
||||||
__ _ __ _ _
|
|
||||||
/ /_| | _____ __/ / __ _ _| | |
|
|
||||||
/ / _` |/ _ \ \ / / / '_ \| | | | | |
|
|
||||||
/ / (_| | __/\ V / /| | | | |_| | | |
|
|
||||||
/_/ \__,_|\___| \_/_/ |_| |_|\__,_|_|_|
|
|
||||||
</pre>
|
|
||||||
</td>
|
</td>
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<h1>The Chaotic Pointer</h1>
|
<h1>「null:ポインタ」</h1>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<center>
|
<center>
|
||||||
|
@ -31,7 +24,6 @@
|
||||||
</form>
|
</form>
|
||||||
Maximum file size: {{ max_size }} <br>
|
Maximum file size: {{ max_size }} <br>
|
||||||
Not allowed: {{ config["FHOST_MIME_BLACKLIST"] }} <br>
|
Not allowed: {{ config["FHOST_MIME_BLACKLIST"] }} <br>
|
||||||
Uploaded files expire after 15 days, no exceptions.
|
|
||||||
<hr>
|
<hr>
|
||||||
<form action="{{ fhost_url}}" method="POST">
|
<form action="{{ fhost_url}}" method="POST">
|
||||||
<input type="text" name="url">
|
<input type="text" name="url">
|
||||||
|
|
読み込み中…
新しいイシューから参照