113 lines
2.9 KiB
Python
113 lines
2.9 KiB
Python
from __future__ import annotations
|
|
|
|
# Standard
|
|
from typing import Any
|
|
|
|
# Libraries
|
|
from flask import Flask, render_template, request, Response # type: ignore
|
|
from flask_cors import CORS # type: ignore
|
|
from flask_simple_captcha import CAPTCHA # type: ignore
|
|
from flask_limiter import Limiter # type: ignore
|
|
from flask_limiter.util import get_remote_address # type: ignore
|
|
|
|
# Modules
|
|
import db as DB
|
|
import config as Config
|
|
import procs as Procs
|
|
import bundle as Bundle
|
|
|
|
|
|
# ---
|
|
|
|
|
|
app = Flask(__name__)
|
|
|
|
# Enable all cross origin requests
|
|
CORS(app)
|
|
|
|
DB.init_app(app)
|
|
|
|
simple_captcha = CAPTCHA(config=Config.captcha)
|
|
app = simple_captcha.init_app(app)
|
|
rate_limit = f"{Config.rate_limit} per minute"
|
|
rate_limit_change = f"{Config.rate_limit_change} per minute"
|
|
|
|
limiter = Limiter(
|
|
get_remote_address,
|
|
app=app,
|
|
default_limits=[rate_limit],
|
|
storage_uri="redis://localhost:6379",
|
|
strategy="fixed-window",
|
|
)
|
|
|
|
Bundle.bundle_dashboard()
|
|
|
|
|
|
# ---
|
|
|
|
|
|
invalid = "Error: Invalid request"
|
|
|
|
|
|
@app.route("/", methods=["GET"]) # type: ignore
|
|
@limiter.limit(rate_limit) # type: ignore
|
|
def index() -> Any:
|
|
return render_template("index.html")
|
|
|
|
|
|
@app.route("/dashboard", methods=["GET"]) # type: ignore
|
|
@limiter.limit(rate_limit) # type: ignore
|
|
def dashboard() -> Any:
|
|
version = Config.manifest.get("version", "0.0.0")
|
|
return render_template("dashboard.html", version=version)
|
|
|
|
|
|
@app.route("/claim", methods=["POST", "GET"]) # type: ignore
|
|
@limiter.limit(rate_limit) # type: ignore
|
|
def claim() -> Any:
|
|
if request.method == "POST":
|
|
try:
|
|
message = Procs.claim_proc(request)
|
|
return render_template("message.html", message=message)
|
|
except Exception as e:
|
|
print(e)
|
|
return Response(invalid, mimetype=Config.text_mtype)
|
|
|
|
captcha = simple_captcha.create()
|
|
return render_template("claim.html", captcha=captcha)
|
|
|
|
|
|
@app.route("/change", methods=["POST", "GET"]) # type: ignore
|
|
@limiter.limit(rate_limit_change) # type: ignore
|
|
def change() -> Any:
|
|
if request.method == "POST":
|
|
try:
|
|
ans = Procs.change_proc(request)
|
|
return Response(ans, mimetype=Config.text_mtype)
|
|
except Exception as e:
|
|
print(e)
|
|
return Response(invalid, mimetype=Config.text_mtype)
|
|
|
|
return render_template("change.html")
|
|
|
|
|
|
@app.route("/<curl>", methods=["GET"]) # type: ignore
|
|
@limiter.limit(rate_limit) # type: ignore
|
|
def get_curl(curl) -> Any:
|
|
try:
|
|
ans = Procs.curl_proc(curl)
|
|
return Response(ans, mimetype=Config.text_mtype)
|
|
except Exception as e:
|
|
print(e)
|
|
return Response(invalid, mimetype=Config.text_mtype)
|
|
|
|
|
|
@app.route("/curls", methods=["POST"]) # type: ignore
|
|
@limiter.limit(rate_limit) # type: ignore
|
|
def get_curls() -> Any:
|
|
try:
|
|
return Procs.curls_proc(request)
|
|
except Exception as e:
|
|
print(e)
|
|
return Response(invalid, mimetype=Config.text_mtype)
|