clean __init.py__

This commit is contained in:
Denis Lehmann 2022-04-25 21:50:07 +02:00
parent bb3dc639d2
commit c64a2eab15
2 changed files with 111 additions and 110 deletions

112
raincloud/__init__.py Executable file → Normal file
View file

@ -1,111 +1,3 @@
#!/usr/bin/env python from raincloud.raincloud import create_app
from hmac import compare_digest as compare_hash __all__ = ["create_app"]
from flask import (
Flask,
abort,
redirect,
render_template,
request,
send_from_directory,
session,
url_for,
)
from raincloud.directory_handler import DirectoryHandler, RaincloudIOException
from raincloud.session_handler import SessionHandler
from werkzeug.utils import secure_filename
import crypt
import werkzeug
def create_app(base_path, secret_key, cloud_name="raincloud"):
# Create app
app = Flask(__name__)
app.config["SECRET_KEY"] = secret_key
# Create handlers
dh = DirectoryHandler(base_path)
sh = SessionHandler()
@app.route("/<directory>", methods=["GET", "POST"])
@app.route("/<directory>/<path:filename>", methods=["GET"])
def directory(directory, filename=None):
try:
# Clean sessions
sh.clean_sessions()
# Logout
if request.method == "POST" and "logout" in request.form:
sh.delete_session(session[directory])
return redirect(url_for("directory", directory=directory))
config = dh.get_config(directory)
if config["hashed_password"]:
authenticated = (
True
if directory in session
and sh.validate_session(directory, session[directory])
else False
)
if not authenticated:
if request.method == "POST":
if compare_hash(
config["hashed_password"],
crypt.crypt(
request.form["password"], config["hashed_password"]
),
):
id_ = sh.create_session_id()
session[directory] = id_
sh.add_session(directory, id_)
return redirect(url_for("directory", directory=directory))
else:
return render_template(
"authenticate.html",
cloud_name=cloud_name,
config=config,
)
if request.method == "GET":
# List
if not filename:
files = dh.get_files(directory)
return render_template(
"directory.html",
cloud_name=cloud_name,
config=config,
files=files,
)
# Download
else:
if config["download"] and filename != "rc.toml":
return send_from_directory(
dh.get_absolute_path(directory), filename
)
else:
abort(404)
# Upload
elif request.method == "POST":
if config["upload"]:
f = request.files["file"]
filename = secure_filename(f.filename)
if filename != "rc.toml":
dh.save_to_directory(f, directory, filename)
# Reload
return redirect(url_for("directory", directory=directory))
else:
abort(403)
except RaincloudIOException as e:
print(e)
abort(404)
return app

109
raincloud/raincloud.py Executable file
View file

@ -0,0 +1,109 @@
from hmac import compare_digest as compare_hash
from flask import (
Flask,
abort,
redirect,
render_template,
request,
send_from_directory,
session,
url_for,
)
from raincloud.directory_handler import DirectoryHandler, RaincloudIOException
from raincloud.session_handler import SessionHandler
from werkzeug.utils import secure_filename
import crypt
import werkzeug
def create_app(base_path, secret_key, cloud_name="raincloud"):
# Create app
app = Flask(__name__)
app.config["SECRET_KEY"] = secret_key
# Create handlers
dh = DirectoryHandler(base_path)
sh = SessionHandler()
@app.route("/<directory>", methods=["GET", "POST"])
@app.route("/<directory>/<path:filename>", methods=["GET"])
def directory(directory, filename=None):
try:
# Clean sessions
sh.clean_sessions()
# Logout
if request.method == "POST" and "logout" in request.form:
sh.delete_session(session[directory])
return redirect(url_for("directory", directory=directory))
config = dh.get_config(directory)
if config["hashed_password"]:
authenticated = (
True
if directory in session
and sh.validate_session(directory, session[directory])
else False
)
if not authenticated:
if request.method == "POST":
if compare_hash(
config["hashed_password"],
crypt.crypt(
request.form["password"], config["hashed_password"]
),
):
id_ = sh.create_session_id()
session[directory] = id_
sh.add_session(directory, id_)
return redirect(url_for("directory", directory=directory))
else:
return render_template(
"authenticate.html",
cloud_name=cloud_name,
config=config,
)
if request.method == "GET":
# List
if not filename:
files = dh.get_files(directory)
return render_template(
"directory.html",
cloud_name=cloud_name,
config=config,
files=files,
)
# Download
else:
if config["download"] and filename != "rc.toml":
return send_from_directory(
dh.get_absolute_path(directory), filename
)
else:
abort(404)
# Upload
elif request.method == "POST":
if config["upload"]:
f = request.files["file"]
filename = secure_filename(f.filename)
if filename != "rc.toml":
dh.save_to_directory(f, directory, filename)
# Reload
return redirect(url_for("directory", directory=directory))
else:
abort(403)
except RaincloudIOException as e:
print(e)
abort(404)
return app