aboutsummaryrefslogtreecommitdiff
path: root/fhost.py
diff options
context:
space:
mode:
Diffstat (limited to 'fhost.py')
-rwxr-xr-xfhost.py203
1 files changed, 39 insertions, 164 deletions
diff --git a/fhost.py b/fhost.py
index 03a12e1..b6fcdd6 100755
--- a/fhost.py
+++ b/fhost.py
@@ -1,5 +1,6 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
+# https://stackoverflow.com/a/34831345/3569534
"""
Copyright © 2020 Mia Herkt
@@ -21,7 +22,7 @@
from flask import Flask, abort, escape, make_response, redirect, request, send_from_directory, url_for, Response
from flask_sqlalchemy import SQLAlchemy
-from flask_script import Manager
+from flask_script import Manager, Server
from flask_migrate import Migrate, MigrateCommand
from hashlib import sha256
from humanize import naturalsize
@@ -68,6 +69,13 @@ app.config["FHOST_UPLOAD_BLACKLIST"] = "tornodes.txt"
app.config["NSFW_DETECT"] = False
app.config["NSFW_THRESHOLD"] = 0.608
+# read config file
+app.config.from_pyfile("hex-zero.conf", silent=True)
+
+# read html template file
+with open(app.config["FHOST_FRONTPAGE"], "r") as j:
+ frontpagestring = j.read()
+
if app.config["NSFW_DETECT"]:
from nsfw_detect import NSFWDetector
nsfw = NSFWDetector()
@@ -124,11 +132,13 @@ class File(db.Model):
def geturl(self):
n = self.getname()
+ o = n
if self.nsfw_score and self.nsfw_score > app.config["NSFW_THRESHOLD"]:
- return url_for("get", path=n, _external=True, _anchor="nsfw") + "\n"
+ o = url_for("get", path=n, _external=True, _anchor="nsfw") + "\n"
else:
- return url_for("get", path=n, _external=True) + "\n"
+ o = url_for("get", path=n, _external=True) + "\n"
+ return o.replace("http://" + app.config["APP_HOST_LISTEN"] + ":" + str(app.config["APP_PORT"]),app.config["APP_URL"])
def pprint(self):
print("url: {}".format(self.getname()))
@@ -142,6 +152,7 @@ def getpath(fn):
return os.path.join(app.config["FHOST_STORAGE_PATH"], fn)
def fhost_url(scheme=None):
+ return app.config["APP_URL"]
if not scheme:
return url_for(".fhost", _external=True).rstrip("/")
else:
@@ -328,6 +339,19 @@ def get(path):
abort(404)
+@app.route("/dump_files/")
+@app.route("/dump_files/<int:start>")
+def dump_files(start=0):
+ meta = "#FORMAT: BEACON\n#PREFIX: {}/\n\n".format(fhost_url("https"))
+
+ def gen():
+ yield meta
+
+ for file in File.query.order_by(File.id.asc()).offset(start):
+ yield file.getname() + "|" + str(file.id) + "\n"
+
+ return Response(gen(), mimetype="text/plain")
+
@app.route("/dump_urls/")
@app.route("/dump_urls/<int:start>")
def dump_urls(start=0):
@@ -352,7 +376,11 @@ def fhost():
out = None
if "file" in request.files:
- out = store_file(request.files["file"], request.remote_addr)
+ if app.config["USE_HTTP_X_FORWARDED_FOR"]:
+ stored_ip_address = request.environ["HTTP_X_FORWARDED_FOR"]
+ else:
+ stored_ip_address = request.remote_addr
+ out = store_file(request.files["file"], stored_ip_address)
elif "url" in request.form:
out = store_url(request.form["url"], request.remote_addr)
elif "shorten" in request.form:
@@ -375,153 +403,12 @@ def fhost():
if maxsizehalf.is_integer():
maxsizehalf = int(maxsizehalf)
- return """<!DOCTYPE html>
-<html lang="en">
- <head>
- <title>{6}</title>
- <meta http-equiv="content-type" content="text/html; charset=utf-8" />
- <meta name="description" content="envs.sh | Null Pointer" />
- <link rel="stylesheet" href="https://envs.net/css/css_style.css" />
- </head>
- <body id="body" class="dark-mode">
- <div class="clear" style="min-width: 1150px;">
-
- <div id="main">
-<div class="block">
-<h1><em>envs.sh &#124; THE NULL POINTER</em></h1>
-<h2><em>file hosting and URL shortening service.</em></h2>
-<br />
-</div>
-
-<h2>USAGE</h2>
-<pre>
-HTTP POST files here:
- <code>curl -F'file=&#64;yourfile.png' {0}</code>
-post your text directly:
- <code>echo "text here" | curl -F'file=@-;' {0}</code>
-you can also POST remote URLs:
- <code>curl -F'url=https://example.com/image.jpg' {0}</code>
-or you can shorten URLs:
- <code>curl -F'shorten=http://example.com/some/long/url' {0}</code>
-
-file URLs are valid for at least 30 days and up to a year (see below).
-shortened URLs do not expire.
-not allowed: {5}
-maximum file size: {1}
-</pre>
-<br />
-
-<h2>ACCEPTABLE USE POLICY</h2>
-<pre>
-please do not post any informations that
-may violate law (login/password lists, email lists, personal information).
-
-envs.sh is NOT a platform for:
-</pre>
-<br />
-<ul>
- <li>child pornography</li>
- <li>malware, including “potentially unwanted applications”</li>
- <li>botnet command and control schemes involving this service</li>
- <li>anything even remotely related to crypto currencies</li>
- <li>hosting your backups</li>
- <li>spamming the service with CI build artifacts</li>
- <li>piracy</li>
- <li>alt-right shitposting</li>
-</ul>
-<br />
-<h2>REQUIREMENTS</h2>
-<pre>
-there is only one thing you need to use this service - curl.
-curl is available on most platforms, including Windows, Mac OS X and Linux.
-
-if you run a server and like this site, clone it! centralization is bad.
-<small><a href="https://github.com/envs-net/0x0" target="_blank">https://github.com/envs-net/0x0</a></small>
-you can also support it financially via liberapay.
-<a href="https://en.liberapay.com/envs.net/donate" target="_blank" style="border-bottom-color: transparent;"><img src="https://img.shields.io/liberapay/receives/envs.net.svg?logo=liberapay" alt="img_shield_receives_via_liberapay"></a>
-</pre>
-<br />
-
-<h2>ALIAS</h2>
-<pre>
-to make your life easier, you can add aliases to your <code>.bash_aliases</code> on Linux
-and <code>.bash_profile</code> on Mac OS X. just remember to reset your terminal session after that.
-<code>0file&#40;&#41; &#123; curl -F"file=&#64;&#36;1" {0} ; &#125;
-0pb&#40;&#41; &#123; curl -F"file=@-;" {0} ; &#125;
-0url&#40;&#41; &#123; curl -F"url=&#36;1" {0} ; &#125;
-0short&#40;&#41; &#123; curl -F"shorten=&#36;1" {0} ; &#125;</code>
-
-now you can use:
-<code>0file "yourfile.png"
-&#35; or
-echo "text here" | 0pb</code>
-
-<em>if you want a nice wrapper, try <a href="https://git.envs.net/envs/pb">~tomasino's pb</a></em>
-</pre>
-<br />
-
-<h2>FILE RETENTION PERIOD</h2>
-<pre>
-retention = min_age + (-max_age + min_age) * pow((file_size / max_size - 1), 3)
-
- days
- 365 | \\
- | \\
- | \\
- | \\
- | \\
- | \\
- | ..
- | \\
- 197.5 | ----------..-------------------------------------------
- | ..
- | \\
- | ..
- | ...
- | ..
- | ...
- | ....
- | ......
- 30 | ....................
- 0{2}{3}
- {4}
-</pre>
-<br />
-
-<h2>ABUSE</h2>
-<pre>
-if you would like to request permanent deletion, please
-send an email to <a href="mailto:hostmaster@envs.net?subject=Abuse%200x0%20-%20envs.sh" target="_blank">hostmaster&#64;envs.net</a>.
-
-please allow up to 24 hours for a response.
-</pre>
- </div>
-
-<!-- UPLOAD -->
-
- <div id="sidebar">
-<div class="block">
-<h2>UPLOAD DIRECTLY</h2>
-<br />
-<form action="{0}" method="POST" enctype="multipart/form-data">
-<label>File:</label><br />
-<input class="form-control" type="file" name="file" style="width:250px;"><br />
-<input class="form-control" type="submit" value="Submit">
-</form>
-</div>
- </div>
-
- <footer><pre class="clean">a <a href="https://envs.net/">envs.net</a> service&nbsp;&#124;&nbsp;by <a href="https://envs.net/~creme/">&#126;creme</a>&nbsp;&#124;&nbsp;<a href="https://envs.net/impressum/">impressum</a></pre></footer>
-
- </div>
-
- </body>
-</html>
-
-""".format(fhost_url(),
+ # python-interpreted variables
+ return frontpagestring.format(fhost_url(),
maxsize, str(maxsizehalf).rjust(27), str(maxsizenum).rjust(27),
maxsizeunit.rjust(54),
- ", ".join(app.config["FHOST_MIME_BLACKLIST"]),fhost_url().split("/",2)[2])
+ ", ".join(app.config["FHOST_MIME_BLACKLIST"]),fhost_url().split("/",2)[2],
+ app.config["APP_URL"], app.config["ADMIN_EMAIL"])
@app.route("/robots.txt")
def robots():
@@ -541,21 +428,7 @@ def segfault(e):
@app.errorhandler(404)
def notfound(e):
- return u"""<pre>Process {0} stopped
-* thread #1: tid = {0}, {1:#018x}, name = '{2}'
- frame #0:
-Process {0} stopped
-* thread #8: tid = {0}, {3:#018x} fhost`get(path='{4}') + 27 at fhost.c:139, name = 'fhost/responder', stop reason = invalid address (fault address: 0x30)
- frame #0: {3:#018x} fhost`get(path='{4}') + 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>
-""".format(os.getpid(), id(app), "fhost", id(get), escape(request.path)), e.code
+ return make_response("404 File not found: {0}/{1}".format(fhost_url(),request.path.lstrip("/")),404)
@manager.command
def debug():
@@ -667,4 +540,6 @@ def querybl(nsfw=False, removed=False):
f.pprint()
if __name__ == "__main__":
+ # allow port adjustment
+ manager.add_command('runserver', Server(host=app.config["APP_HOST_LISTEN"], port=app.config["APP_PORT"]))
manager.run()
bgstack15