Added main backend components
This commit is contained in:
375
server.py
Executable file
375
server.py
Executable file
@@ -0,0 +1,375 @@
|
||||
#!/bin/python3
|
||||
|
||||
from flask import Flask, request, render_template, Response, send_file, g, url_for, redirect, make_response
|
||||
from random import randint
|
||||
import requests
|
||||
import datetime
|
||||
import smtplib
|
||||
import flask
|
||||
import time
|
||||
import os
|
||||
import json
|
||||
|
||||
app = Flask(__name__, static_url_path="", static_folder="static", template_folder="templates")
|
||||
|
||||
app.config['msgTime'] = datetime.datetime.now()
|
||||
app.config['reloadTime'] = datetime.datetime.now()
|
||||
|
||||
|
||||
weekday = [
|
||||
"Mon", "Tue", "Wed", "Thu",
|
||||
"Fri", "Sat", "Sun"
|
||||
]
|
||||
|
||||
def getIpInfo(ip):
|
||||
try:
|
||||
endpoint = f'https://ipinfo.io/{ip}/json'
|
||||
response = requests.get(endpoint, verify = True)
|
||||
|
||||
if response.status_code != 200:
|
||||
return None
|
||||
|
||||
return response.json()
|
||||
except:
|
||||
return None
|
||||
|
||||
|
||||
def logConnection(req:request, site:str):
|
||||
|
||||
scraper = False
|
||||
ipInfo = getIpInfo(request.remote_addr);
|
||||
|
||||
logStr = f"{ req.remote_addr } connected on '{ time.asctime() }' to '{ site }' with user-agent '{ req.user_agent }'"
|
||||
|
||||
logFile = open(f"log/{datetime.datetime.now().strftime('%d.%m.%Y')}.log", "a")
|
||||
|
||||
try:
|
||||
logStr += f"\n^\tIP Country: '{ipInfo['country']}'\t"
|
||||
logStr += f"Region: '{ipInfo['region']}'\t"
|
||||
logStr += f"City: '{ipInfo['city']}'\t"
|
||||
logStr += f"Org: '{ipInfo['org']}'\t"
|
||||
|
||||
for i in app.config["config"]["blacklist"]:
|
||||
if ipInfo['org'].lower().find(i.lower()) != -1:
|
||||
scraper = True
|
||||
logFile.write("Scraper detected, redirecting that fucko\n")
|
||||
|
||||
logStr += f"Hostname: '{ipInfo['hostname']}'"
|
||||
|
||||
|
||||
except:
|
||||
logStr += "\n^\tError with IP-Info getter"
|
||||
|
||||
logFile.write(f"{logStr}\n\n")
|
||||
logFile.close()
|
||||
|
||||
if scraper:
|
||||
flask.abort(406)
|
||||
|
||||
def generateNavbar(selectedElement):
|
||||
return render_template("inline/navbar.html", navContent=app.config["config"]["navbar"], navSel=selectedElement,
|
||||
randomQuote=app.config["quote"][0],
|
||||
todos=app.config["todo"],
|
||||
updates=app.config["updates"],
|
||||
rndShit=app.config["random"][randint(0, len(app.config["random"])-1)])
|
||||
|
||||
|
||||
def generateFooter():
|
||||
updTime = datetime.datetime.fromtimestamp(os.path.getmtime("static/docs/config.json"))
|
||||
timeStr = f"{updTime.day}.{updTime.month}.{updTime.year} ({weekday[updTime.weekday()]})"
|
||||
|
||||
return render_template("inline/footer.html", buttons=app.config["config"]["buttons"], updated=timeStr)
|
||||
|
||||
|
||||
def generateStyle():
|
||||
style = """
|
||||
<style>
|
||||
:root {
|
||||
--main-bg-color: #fed6af;
|
||||
--main-bg-end-color: #ffffee;
|
||||
--main-color: #ffffff;
|
||||
--main-fg-color: #800000;
|
||||
--main-title-fg-color: #800000;
|
||||
|
||||
--title-align: left;
|
||||
--border-style: solid;
|
||||
--border-width: 0px;
|
||||
|
||||
--button-border-width: 1px;
|
||||
--button-border-style: solid;
|
||||
--button-selected-style: ridge;
|
||||
|
||||
--optional-link-background: #00000000;
|
||||
|
||||
--font-family: Arial, Helvetica, sans-serif;
|
||||
--font-size: 13px;
|
||||
|
||||
--background-image: url(../images/fade.png);
|
||||
}
|
||||
|
||||
</style>
|
||||
"""
|
||||
|
||||
return style
|
||||
|
||||
def getMultiples(i) -> str: #lol
|
||||
ret = "s"
|
||||
if i == 1:
|
||||
ret = ""
|
||||
return ret
|
||||
|
||||
|
||||
@app.errorhandler(406)
|
||||
def not_found_error(error):
|
||||
return render_template("scraper.html"), 406
|
||||
|
||||
@app.before_request
|
||||
def reload_jsons(anyway=False):
|
||||
|
||||
try:
|
||||
test = app.config["config"]["navbar"]
|
||||
except:
|
||||
anyway = True
|
||||
|
||||
if anyway or (datetime.datetime.now() - app.config['reloadTime']).seconds > 5:
|
||||
todoRaw = open("static/docs/todo.json", "r")
|
||||
app.config["todo"] = json.load(todoRaw)["todo"]
|
||||
|
||||
randomRaw = open("static/docs/random.json", "r")
|
||||
app.config["random"] = json.load(randomRaw)["rnd"]
|
||||
|
||||
quoteRaw = open("static/docs/lessons.json", "r")
|
||||
app.config["quote"] = json.load(quoteRaw)["lessons"]
|
||||
|
||||
funRaw = open("static/docs/funfacts.json", "r")
|
||||
app.config["fun"] = json.load(funRaw)["funfacts"]
|
||||
|
||||
updatesRaw = open("static/docs/updates.json", "r")
|
||||
app.config["updates"] = json.load(updatesRaw)["updates"]
|
||||
|
||||
photobookRaw = open("static/docs/photobook.json", "r")
|
||||
app.config["photobook"] = json.load(photobookRaw)["photobook"]
|
||||
|
||||
configRaw = open("static/docs/config.json", "r")
|
||||
app.config["config"] = json.load(configRaw)
|
||||
|
||||
passwordRaw = open("static/docs/mailpassword", "r")
|
||||
app.config["password"] = passwordRaw.readlines()[0].replace("\n", "")
|
||||
|
||||
todoRaw.close()
|
||||
randomRaw.close()
|
||||
quoteRaw.close()
|
||||
funRaw.close()
|
||||
updatesRaw.close()
|
||||
photobookRaw.close()
|
||||
configRaw.close()
|
||||
passwordRaw.close()
|
||||
|
||||
app.config["reloadTime"] = datetime.datetime.now()
|
||||
|
||||
print("Reloaded JSON's")
|
||||
|
||||
if not anyway:
|
||||
if request.method == "POST":
|
||||
if "test" in request.form:
|
||||
print("bruh")
|
||||
|
||||
|
||||
@app.route("/", methods=["GET", "POST"])
|
||||
def homepage():
|
||||
logConnection(request, "homepage");
|
||||
|
||||
diff = datetime.datetime.now() - datetime.datetime(2006, 3, 30)
|
||||
error = ""
|
||||
textinput = ""
|
||||
TEXTLEN = app.config["config"]["Textlength"]
|
||||
RATELIM = app.config["config"]["Ratelimit"]
|
||||
|
||||
if request.method == "POST":
|
||||
textinput = request.form["textvalue"]
|
||||
|
||||
if "send" in request.form:
|
||||
if (datetime.datetime.now() - app.config['msgTime']).seconds < RATELIM:
|
||||
waitTime = RATELIM - ((datetime.datetime.now() - app.config['msgTime']).seconds)
|
||||
error = f"Messages are rate limited. Please wait {waitTime} second{getMultiples(waitTime)} before trying again."
|
||||
|
||||
elif len(textinput) > TEXTLEN :
|
||||
remChars = len(textinput) - TEXTLEN
|
||||
error = f"Your text is too long. Trim by {remChars} char{getMultiples(remChars)}."
|
||||
|
||||
elif len(textinput) < 3:
|
||||
error = "Too short lol"
|
||||
|
||||
else:
|
||||
msg = open(f"messages/{datetime.datetime.now().strftime('%d.%m.%Y - %H:%M:%S')} : {request.remote_addr}", "w")
|
||||
|
||||
txt = f"IP: '{request.remote_addr}' with user-agent '{request.user_agent}' wrote:\n\n----------\n\n{textinput}\n\n--------\n\n"
|
||||
msg.write(txt)
|
||||
|
||||
info = ""
|
||||
try:
|
||||
info = getIpInfo(request.remote_addr)
|
||||
msg.write(str(info))
|
||||
except:
|
||||
None
|
||||
|
||||
msg.close();
|
||||
|
||||
|
||||
s = smtplib.SMTP("mail.weingardt.dev", 587)
|
||||
s.starttls()
|
||||
s.login("messages", app.config["password"])
|
||||
|
||||
try:
|
||||
s.sendmail("messages@weingardt.dev", "gabriel@weingardt.dev", f"Subject: NEW MESSAGE FUCKO\n\n{txt}\n\n{info}")
|
||||
except:
|
||||
s.sendmail("messages@weingardt.dev", "gabriel@weingardt.dev", f"Subject: NEW MESSAGE BUT KINDOF BROKEN\n\nIdk, failed to send mail but u got a message")
|
||||
|
||||
s.quit()
|
||||
|
||||
textinput = ""
|
||||
error = "Message send!"
|
||||
|
||||
app.config['msgTime'] = datetime.datetime.now()
|
||||
|
||||
elif "clear" in request.form:
|
||||
textinput = ""
|
||||
error = ""
|
||||
|
||||
|
||||
return render_template("home.html", style=generateStyle(), navbar=generateNavbar("Home"), footer=generateFooter(),
|
||||
lol="nope", errorValue=error, textvalue=textinput, textlength=TEXTLEN, ageinsert=f"{int(diff.days / 30 / 12)}")
|
||||
|
||||
|
||||
@app.route("/me")
|
||||
def me():
|
||||
logConnection(request, "me");
|
||||
|
||||
# Epic Birthday leak
|
||||
diff = datetime.datetime.now() - datetime.datetime(2006, 3, 30)
|
||||
|
||||
return render_template("me.html", style=generateStyle(), navbar=generateNavbar("Me"), footer=generateFooter(),
|
||||
ageinsert=f"{int(diff.days / 30 / 12)}",
|
||||
funfact=app.config["fun"][randint(0, len(app.config["fun"])-1)])
|
||||
|
||||
|
||||
|
||||
@app.route("/photobook/<pagenr>")
|
||||
def photobook(pagenr="0"):
|
||||
def generateContent(index) -> str:
|
||||
ret = ""
|
||||
style = "photo"
|
||||
|
||||
if len(app.config["photobook"][index]) == 4:
|
||||
style = app.config["photobook"][index][3]
|
||||
|
||||
for i in app.config["photobook"][index][2]:
|
||||
ret += f'<a href="../images/photobook/{ i }"><img src="../images/photobook/{ i }" class="{style}" loading="lazy"></a>'
|
||||
|
||||
|
||||
return ret
|
||||
|
||||
pagecarry = int(pagenr.split("&")[0])
|
||||
|
||||
nextDisabled = ""
|
||||
previousDisabled = ""
|
||||
|
||||
if pagenr.find("++") != -1:
|
||||
return redirect(url_for("photobook", pagenr=str(pagecarry + 1)))
|
||||
elif pagenr.find("--") != -1:
|
||||
return redirect(url_for("photobook", pagenr=str(pagecarry - 1)))
|
||||
elif pagenr.find("rnd") != -1:
|
||||
return redirect(url_for("photobook", pagenr=str(randint(0, int(((len(app.config["photobook"]) - 1 )/2)) ))))
|
||||
|
||||
logConnection(request, f"photobook/{pagecarry}")
|
||||
|
||||
if pagecarry < 1:
|
||||
previousDisabled = "disabled"
|
||||
if pagecarry >= (len(app.config["photobook"])/2) - 1:
|
||||
nextDisabled = "disabled"
|
||||
|
||||
leftDate = ""
|
||||
rightDate = ""
|
||||
leftDesc = ""
|
||||
rightDesc = ""
|
||||
leftContent = ""
|
||||
rightContent= ""
|
||||
|
||||
for i in range(pagecarry*2, (pagecarry*2)+2):
|
||||
if i >= len(app.config["photobook"]):
|
||||
break
|
||||
|
||||
if i % 2 == 0:
|
||||
leftDate = app.config["photobook"][i][0]
|
||||
leftDesc = app.config["photobook"][i][1]
|
||||
leftContent = generateContent(i)
|
||||
else:
|
||||
rightDate = app.config["photobook"][i][0]
|
||||
rightDesc = app.config["photobook"][i][1]
|
||||
rightContent = generateContent(i)
|
||||
|
||||
return render_template("photobook.html", nextDisabled=nextDisabled, previousDisabled=previousDisabled,
|
||||
pageLeftDate=leftDate, pageRightDate=rightDate,
|
||||
pageLeftDesc=leftDesc, pageRightDesc=rightDesc,
|
||||
contentLeftInsert=leftContent, contentRightInsert=rightContent)
|
||||
|
||||
@app.route("/photobook")
|
||||
def photobook_redirect():
|
||||
return redirect(url_for("photobook", pagenr="0"))
|
||||
|
||||
@app.route("/info")
|
||||
def info():
|
||||
logConnection(request, "info")
|
||||
return render_template("info.html", style=generateStyle(), navbar=generateNavbar("Info"), footer=generateFooter())
|
||||
|
||||
|
||||
@app.route("/ls7")
|
||||
def ls7():
|
||||
logConnection(request, "ls7.html")
|
||||
return render_template("ls7.html")
|
||||
|
||||
|
||||
@app.route("/projects")
|
||||
def projects():
|
||||
logConnection(request, "projects")
|
||||
return render_template("projects.html", style=generateStyle(), navbar=generateNavbar("Projects"), footer=generateFooter())
|
||||
|
||||
|
||||
@app.route("/posts")
|
||||
def posts():
|
||||
logConnection(request, "posts")
|
||||
return render_template("posts.html", style=generateStyle(), navbar=generateNavbar("Posts"), footer=generateFooter())
|
||||
|
||||
|
||||
@app.route("/misc")
|
||||
def misc():
|
||||
logConnection(request, "misc")
|
||||
return render_template("misc.html", style=generateStyle(), navbar=generateNavbar("Misc"), footer=generateFooter())
|
||||
|
||||
@app.route("/lessons")
|
||||
def lessons():
|
||||
logConnection(request, "lessons")
|
||||
|
||||
return render_template("lessons.html", style=generateStyle(), randomQuote=app.config["quote"])
|
||||
|
||||
@app.route("/ssup")
|
||||
def ssup():
|
||||
logConnection(request, "ssup")
|
||||
|
||||
return render_template("ssup.html", style=generateStyle(), navbar=generateNavbar("Projects"), footer=generateFooter())
|
||||
|
||||
@app.route("/changestyle", methods=["GET","POST"])
|
||||
def changeStyle():
|
||||
resp = make_response("Set style cookie")
|
||||
|
||||
if request.method == "POST":
|
||||
if "change" in request.form:
|
||||
print(request.form["stylebox"])
|
||||
#resp.set_cookie("style", request.form["stylebox"])
|
||||
|
||||
return resp
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
reload_jsons(True)
|
||||
app.run(host="0.0.0.0")
|
Reference in New Issue
Block a user