diff --git a/files/routes/errors.py b/files/routes/errors.py index 484b89871..6f63c2e05 100644 --- a/files/routes/errors.py +++ b/files/routes/errors.py @@ -1,19 +1,96 @@ from files.helpers.wrappers import * from flask import * +from werkzeug.exceptions import HTTPException from urllib.parse import quote, urlencode import time from files.__main__ import app, limiter +WERKZEUG_ERROR_DESCRIPTIONS = { + 400: "The browser (or proxy) sent a request that this server could not understand.", + 401: "The server could not verify that you are authorized to access the URL requested. You either supplied the wrong credentials (e.g. a bad password), or your browser doesn't understand how to supply the credentials required.", + 403: "You don't have the permission to access the requested resource. It is either read-protected or not readable by the server.", + 404: "The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.", + 405: "The method is not allowed for the requested URL.", + 406: "The resource identified by the request is only capable of generating response entities which have content characteristics not acceptable according to the accept headers sent in the request.", + 413: "The data value transmitted exceeds the capacity limit.", + 414: "The length of the requested URL exceeds the capacity limit for this server. The request cannot be processed.", + 415: "The server does not support the media type transmitted in the request.", + 418: "This server is a teapot, not a coffee machine", + 429: "This user has exceeded an allotted request count. Try again later.", + 500: "The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.", +} +ERROR_TITLES = { + 400: "Bad Request", + 401: "Unauthorized", + 403: "Forbidden", + 404: "Not Found", + 405: "Method Not Allowed", + 406: "Too Many Pings", + 413: "Max image/audio size is 8 MB (16 MB for paypigs)", + 414: "Max video size is 32 MB (64 MB for paypigs)", + 415: "Unsupported Media Type", + 417: "Image already exists!", + 418: "WEBM videos are not allowed", + 429: "Too Many Requests", + 500: "Internal Server Error", +} + +ERROR_MSGS = { + 400: "That request was bad and you should feel bad.", + 401: "What you're trying to do requires an account. I think. The original error message said something about a castle and I hated that.", + 403: "YOU AREN'T WELCOME HERE GO AWAY", + 404: "Someone typed something wrong and it was probably you, please do better.", + 405: "idk how anyone gets this error but if you see this, remember to follow @carpathianflorist
the original error text here talked about internet gremlins and wtf", + 406: "Max limit is 5 for comments and 50 for posts", + 413: "Max image/audio size is 8 MB (16 MB for paypigs)", + 414: "Max video size is 32 MB (64 MB for paypigs)", + 415: "Please upload only Image, Video, or Audio files!", + 417: "Image already exists!", + 418: "Please convert your video to MP4 and re-upload it!", + 429: "go spam somewhere else nerd", + 500: "Hiiiii it's carp! I think this error means that there's a timeout error. And I think that means something took too long to load so it decided not to work at all. If you keep seeing this on the same page but not other pages, then something is probably wrong with that specific function. It may not be called a function, but that sounds right to me. Anyway, ping me and I'll whine to someone smarter to fix it. Don't bother them. Thanks ily <3", +} + +ERROR_MARSEYS = { + 400: "marseybrainlet", + 401: "marseydead", + 403: "marseytroll", + 404: "marseyconfused", + 405: "marseyretard", + 406: "marseyrage", + 413: "marseyretard", + 414: "marseychonker2", + 415: "marseydetective", + 418: "marseytea", + 429: "marseyrentfree", + 500: "marseycarp3", +} @app.errorhandler(400) -def error_400(e): - if request.headers.get("Authorization") or request.headers.get("xhr"): return {"error": "400 Bad Request"}, 400 - else: return render_template('errors/400.html', err=True), 400 +@app.errorhandler(403) +@app.errorhandler(404) +@app.errorhandler(405) +@app.errorhandler(406) +@app.errorhandler(413) +@app.errorhandler(414) +@app.errorhandler(415) +@app.errorhandler(417) +@app.errorhandler(418) +@app.errorhandler(429) +def error(e): + title = ERROR_TITLES.get(e.code, str(e.code)) + msg = ERROR_MSGS.get(e.code, str(e.code)) + details = e.description + if WERKZEUG_ERROR_DESCRIPTIONS.get(e.code, None) == details: + details = None + if request.headers.get("Authorization") or request.headers.get("xhr"): + return {"error": msg, "code": e.code, "details": details} + img = ERROR_MARSEYS.get(e.code, 'marseyl') + return render_template('errors/error.html', err=True, title=title, msg=msg, details=details, img=img), e.code @app.errorhandler(401) def error_401(e): - if request.headers.get("Authorization") or request.headers.get("xhr"): return {"error": "401 Not Authorized"}, 401 else: path = request.path @@ -23,75 +100,10 @@ def error_401(e): if session.get("history"): return redirect(f"/login?redirect={argval}") else: return redirect(f"/signup?redirect={argval}") -@app.errorhandler(406) -def error_406(e): - if request.headers.get("Authorization") or request.headers.get("xhr"): - return {"error": "Too many pings: max limit is 5 for comments and 50 for posts"}, 406 - else: return render_template('errors/406.html', err=True), 406 - -@app.errorhandler(403) -def error_403(e): - - description = e.description - if description == "You don't have the permission to access the requested resource. It is either read-protected or not readable by the server.": description = '' - - if request.headers.get("Authorization") or request.headers.get("xhr"): - if not description: description = "403 Forbidden" - return {"error": description}, 403 - else: - if not description: description = "YOU AREN'T WELCOME HERE GO AWAY" - return render_template('errors/403.html', description=description, err=True), 403 - - -@app.errorhandler(404) -def error_404(e): - if request.headers.get("Authorization") or request.headers.get("xhr"): return {"error": "404 Not Found"}, 404 - else: return render_template('errors/404.html', err=True), 404 - -@app.errorhandler(405) -def error_405(e): - if request.headers.get("Authorization") or request.headers.get("xhr"): return {"error": "405 Method Not Allowed"}, 405 - else: return render_template('errors/405.html', err=True), 405 - -@app.errorhandler(413) -def error_413(e): - if request.headers.get("Authorization") or request.headers.get("xhr"): - return {"error": "Max image/audio size is 8 MB (16 MB for paypigs)"}, 413 - else: return render_template('errors/413.html', err=True), 413 - -@app.errorhandler(414) -def error_414(e): - if request.headers.get("Authorization") or request.headers.get("xhr"): - return {"error": "Max video size is 32 MB (64 MB for paypigs)"}, 414 - else: return render_template('errors/414.html', err=True), 414 - -@app.errorhandler(415) -def error_415(e): - if request.headers.get("Authorization") or request.headers.get("xhr"): return {"error": "Please upload only Image, Video, or Audio files!"}, 415 - else: return render_template('errors/415.html', err=True), 415 - -@app.errorhandler(417) -def error_417(e): - return {"error": "Image already exists!"}, 417 - -@app.errorhandler(418) -def error_418(e): - if request.headers.get("Authorization") or request.headers.get("xhr"): - return {"error": "WEBM videos are not allowed, please convert your video to MP4 and re-upload it!"}, 418 - else: return render_template('errors/418.html', err=True), 418 - -@app.errorhandler(429) -def error_429(e): - if request.headers.get("Authorization") or request.headers.get("xhr"): return {"error": "429 Too Many Requests"}, 429 - else: return render_template('errors/429.html', err=True), 429 - - @app.errorhandler(500) def error_500(e): g.db.rollback() - - if request.headers.get("Authorization") or request.headers.get("xhr"): return {"error": "500 Internal Server Error"}, 500 - else: return render_template('errors/500.html', err=True), 500 + return error(e) @app.post("/allow_nsfw") diff --git a/files/templates/errors/error.html b/files/templates/errors/error.html new file mode 100644 index 000000000..147fb0f1e --- /dev/null +++ b/files/templates/errors/error.html @@ -0,0 +1,22 @@ +{% extends "default.html" %} + +{% block title %} +{{code}} {{title}} +{% endblock %} + +{% block pagetype %}error-{{code}}{% endblock %} + +{% block content %} +
+
+
+ {% if img %} + :#{{img}}: + {% endif %} +

+			

{{code}} {{title}}

+

{{msg}}

+
+
+
+{% endblock %}