.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 %}
|
||||
<pre>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</pre>
|
||||
<!DOCTYPE HTML "-//W3C//DTD HTML 3.2 Final//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>The page you were looking for doesn't exist (404)</title>
|
||||
</head>
|
||||
<body bgcolor="#000000" text="#ffffff" link="#ffffff">
|
||||
<pre>
|
||||
/\_____/\
|
||||
/ o o \ ???
|
||||
( == ^ == )
|
||||
) (
|
||||
( )
|
||||
( ( ) ( ) )
|
||||
(__(__)___(__)__)
|
||||
</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 @@
|
|||
Could not determine remote file size (no Content-Length in response header; shoot admin).
|
||||
<!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).
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
|
|
@ -1 +1,20 @@
|
|||
Remote file too large ({{ request.headers["content-length"]|filesizeformat(True) }} > {{ config["MAX_CONTENT_LENGTH"]|filesizeformat(True) }}).
|
||||
<!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) }}).
|
||||
</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>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>media.chaotic.ninja</title>
|
||||
<title>0x0a 「null:ポインタ」</title>
|
||||
</head>
|
||||
<body bgcolor="#000000">
|
||||
<br><br><table border="2" cellpadding="12" cellspacing="0" bgcolor="#ffffff" align="center">
|
||||
<tr>
|
||||
<td border="0" align="center">
|
||||
<pre>
|
||||
__ _ __ _ _
|
||||
/ /_| | _____ __/ / __ _ _| | |
|
||||
/ / _` |/ _ \ \ / / / '_ \| | | | | |
|
||||
/ / (_| | __/\ V / /| | | | |_| | | |
|
||||
/_/ \__,_|\___| \_/_/ |_| |_|\__,_|_|_|
|
||||
</pre>
|
||||
</td>
|
||||
<td align="center">
|
||||
<h1>The Chaotic Pointer</h1>
|
||||
<h1>「null:ポインタ」</h1>
|
||||
</td>
|
||||
<td>
|
||||
<center>
|
||||
|
@ -31,7 +24,6 @@
|
|||
</form>
|
||||
Maximum file size: {{ max_size }} <br>
|
||||
Not allowed: {{ config["FHOST_MIME_BLACKLIST"] }} <br>
|
||||
Uploaded files expire after 15 days, no exceptions.
|
||||
<hr>
|
||||
<form action="{{ fhost_url}}" method="POST">
|
||||
<input type="text" name="url">
|
||||
|
|
読み込み中…
新しいイシューから参照