Advertisement
Guest User

Untitled

a guest
Apr 30th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.25 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. import functools
  3. import re
  4. import datetime
  5. import os
  6. import logging
  7.  
  8. import base58
  9. import sqlalchemy
  10. from flask import (
  11. render_template_string,
  12. request,
  13. render_template,
  14. current_app,
  15. flash,
  16. redirect,
  17. url_for,
  18. session,
  19. make_response,
  20. Response,
  21. jsonify,
  22. send_from_directory,
  23. )
  24.  
  25. import base64
  26.  
  27. from flask_cors import CORS
  28. from . import bp as app # Note that app = blueprint, current_app = flask context
  29.  
  30. CORS(app)
  31.  
  32. ROOT = os.path.normpath(os.path.join(__file__, "../../../frontend/dist"))
  33.  
  34.  
  35. def get_files_for_acc(username, role):
  36. r = list(current_app.db.execute("SELECT name, content FROM files where author=%s", (username,)))
  37. if role == "Staff":
  38. r += list(current_app.db.execute("SELECT name, content FROM files where author='staff_account'"))
  39. return r
  40.  
  41.  
  42. @app.route("/", methods=["GET"])
  43. def home():
  44. return send_from_directory(f"{ROOT}", "index.html")
  45.  
  46.  
  47. @app.route("/docs/<path>", methods=["GET"])
  48. def docs_serve(path):
  49. return send_from_directory(f"/app/web/docs", path)
  50.  
  51.  
  52. @app.route("/js/<path>", methods=["GET"])
  53. def js_serve(path):
  54. return send_from_directory(f"{ROOT}/js", path)
  55.  
  56.  
  57. @app.route("/css/<path>", methods=["GET"])
  58. def css_serve(path):
  59. return send_from_directory(f"{ROOT}/css", path)
  60.  
  61.  
  62. @app.route("/img/<path>", methods=["GET"])
  63. def img_serve(path):
  64. return send_from_directory(f"{ROOT}/img", path)
  65.  
  66.  
  67. @app.route("/register", methods=["POST"])
  68. def register():
  69. payload = request.json
  70. username = payload.get("username", None)
  71. password = payload.get("password", None)
  72.  
  73. if not username or not password:
  74. return "invalid username/password", 400
  75. if username == "admin" or username == "staff_account":
  76. return "username taken", 400
  77. if current_app.db.execute("SELECT * FROM users WHERE username = %s", (username,)).first() is not None:
  78. return "username taken", 400
  79.  
  80. current_app.db.execute("INSERT INTO users VALUES(%s,%s,'User')", (username, password))
  81. session["username"] = username
  82. session["role"] = "User"
  83. return ":)", 200
  84.  
  85.  
  86. @app.route("/login", methods=["POST"])
  87. def login():
  88. p = request.json
  89. res = current_app.db.execute(
  90. "SELECT username,role FROM users WHERE username = %s AND password = %s", (p["username"], p["password"])
  91. ).first()
  92. if res is None:
  93. return "invalid username/password", 400
  94.  
  95. [username, role] = res
  96. session["username"] = username
  97. session["role"] = role
  98. return ":)", 200
  99.  
  100.  
  101. @app.route("/logout", methods=["POST"])
  102. def logout():
  103. session.clear()
  104. return ":)", 200
  105.  
  106.  
  107. @app.route("/upload", methods=["POST"])
  108. def upload():
  109. p = request.json
  110. me = session["username"]
  111. name = p["name"]
  112. text = p["text"]
  113.  
  114. if len(p["text"]) > 64:
  115. return "File contents > 64 chars", 400
  116.  
  117. if len(p["name"]) > 64:
  118. return "File name > 64 chars", 400
  119.  
  120. files = get_files_for_acc(me, session["role"])
  121.  
  122. if len(files) > 5:
  123. return "max files for acc reached", 400
  124.  
  125. if current_app.db.execute("SELECT * FROM files WHERE name = %s AND author = %s", (name, me)).first() is not None:
  126. return "file name taken", 400
  127.  
  128. current_app.db.execute("INSERT INTO files(name,content,author) VALUES(%s,%s,%s)", (name, text, me))
  129. return ":)", 200
  130.  
  131.  
  132. @app.route("/me", methods=["GET"])
  133. def me():
  134. results = get_files_for_acc(session["username"], session["role"])
  135. files = [{"name": r[0], "content": r[1]} for r in results]
  136.  
  137. if session["role"] == "Admin":
  138. files += [
  139. {
  140. "name": "BREAK2{f46728bf-0f09-4a39-822a-4cf231325e90}",
  141. "content": "cheeky, no flag tho",
  142. "author": "admin",
  143. }
  144. ]
  145. return jsonify({"username": session["username"], "role": session["role"], "files": files})
  146.  
  147.  
  148. @app.route("/admin", methods=["GET", "POST"])
  149. def admin():
  150. success = False
  151. role = session["role"]
  152. if request.method == "POST" and role == "Admin":
  153. if request.form.get("pin", "0000") == "2941":
  154. success = True
  155. return render_template("admin.html", success=success)
  156.  
  157.  
  158. @app.route("/document/<name>", methods=["GET"])
  159. def view_document(name):
  160. username = base64.b64decode(request.args["r"]).decode("utf-8")
  161.  
  162. if username == session["username"]:
  163. content = current_app.db.execute(
  164. "SELECT content FROM files WHERE name = %s AND author = %s", (name, username)
  165. ).first()
  166.  
  167. if not content and session["role"] == "Staff":
  168. content = current_app.db.execute(
  169. "SELECT content FROM files WHERE name = %s AND author = 'staff_account'", (name,)
  170. ).first()
  171.  
  172. return content[0] if content else "ruh roh"
  173.  
  174.  
  175. @app.route("/api/secret/no/really/give_staff_access")
  176. def staff_access():
  177. username = request.args["username"]
  178. current_app.db.execute("UPDATE users set role='Staff' WHERE username = %s", (username,))
  179.  
  180. session["role"] = "Staff"
  181. return ":)", 200
  182.  
  183.  
  184. @app.route("/api/peek/<username>", methods=["GET", "POST"])
  185. def peek(username):
  186. if session["role"] != "Staff" and session["role"] != "Admin":
  187. return ":(", 404
  188. rows = current_app.db.execute("SELECT id,name,author from files where author = %s", (username,))
  189. return jsonify([{"id": r[0], "name": r[1], "author": r[2]} for r in rows])
  190.  
  191.  
  192. @app.route("/api/peek/file", methods=["GET", "POST"])
  193. def peekFile():
  194. if session["role"] != "Staff" and session["role"] != "Admin":
  195. return ":(", 404
  196. file_id = request.args["file_id"]
  197. # res = current_app.db.execute("SELECT id,name,content,author from files where id = " + file_id).first()
  198. res = current_app.db.execute(
  199. "SELECT id,name,content,author from files where id = %s", (file_id)
  200. ).first()
  201.  
  202. if res is None:
  203. return ":(", 400
  204. return jsonify({"id": res[0], "name": res[1], "content": res[2], "author": res[3]})
  205.  
  206.  
  207. @app.route("/ping")
  208. def ping():
  209. return "pong"
  210.  
  211.  
  212. @app.route("/flag_debug", methods=["POST"])
  213. def flag_debug():
  214. if request.form.get("flag_secret", "") == current_app.config["FLAG_SECRET"]:
  215. return current_app.config["FLAG"]
  216. return ":(", 401
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement