aboutsummaryrefslogtreecommitdiff
path: root/paste-cgi.py
diff options
context:
space:
mode:
authorCirakg <cirakg@cirakg.xyz>2025-04-13 19:29:30 +0200
committerCirakg <cirakg@cirakg.xyz>2025-04-13 19:29:30 +0200
commit483d55fc933e427df817e5d7804db234deffc612 (patch)
tree91b079e920b865dc91534dafc22760a81c00b569 /paste-cgi.py
parent2c9a02ab93d4d3c7011ed9ea90c136b8fdad1531 (diff)
feat: Implement dirty get.
Diffstat (limited to 'paste-cgi.py')
-rw-r--r--paste-cgi.py167
1 files changed, 145 insertions, 22 deletions
diff --git a/paste-cgi.py b/paste-cgi.py
index cf8a922..88bd802 100644
--- a/paste-cgi.py
+++ b/paste-cgi.py
@@ -4,6 +4,7 @@ import sys
import random
import string
import json
+from datetime import datetime, timezone, timedelta
CWD = os.getcwd()
@@ -28,6 +29,13 @@ class SubmitConstants:
TITLE: str = "title"
EXPIRATION: str = "expiration"
PASTED_TEXT: str = "pasted_text"
+ DATE_CREATED: str = "date_created"
+
+
+def convert(obj):
+ if isinstance(obj, datetime):
+ return obj.isoformat()
+ raise TypeError("Type not serializable")
def check_working_dir(allowed_dir):
@@ -130,34 +138,145 @@ def return_favicon_svg():
def submit(post_data):
+ if not os.path.exists(DATABASE_DIRECTORY):
+ os.makedirs(DATABASE_DIRECTORY)
+ full_path = ""
+ while True:
+ random_id = generate_random_string()
+ full_path = os.path.join(DATABASE_DIRECTORY, f"{random_id}.json")
+ if not os.path.exists(full_path):
+ break
+
+ data = {
+ SubmitConstants.TYPE: post_data[SubmitConstants.TYPE],
+ SubmitConstants.TITLE: post_data[SubmitConstants.TITLE],
+ SubmitConstants.EXPIRATION: post_data[SubmitConstants.EXPIRATION],
+ SubmitConstants.PASTED_TEXT: post_data[SubmitConstants.PASTED_TEXT],
+ SubmitConstants.DATE_CREATED: datetime.now(timezone.utc),
+ }
+
+ with open(full_path, "w") as json_file:
+ json.dump(data, json_file, indent=4, default=convert)
+
+ print("Content-Type: application/json")
+ print("")
+ print(json.dumps({"id": random_id}))
+
+
+def handle_data(data):
+ expiry = data[SubmitConstants.EXPIRATION]
+ date = datetime.fromisoformat(data[SubmitConstants.DATE_CREATED])
+ date_now = datetime.now(timezone.utc)
+
+ deleted = False
+ delete_after_read = False
+
+ if expiry == "never":
+ pass
+ elif expiry == "burn_after_read":
+ deleted = False
+ delete_after_read = True
+ elif expiry == "10_minutes":
+ if date + timedelta(minutes=10) <= date_now:
+ deleted = True
+ elif expiry == "1_hour":
+ if date + timedelta(hours=1) <= date_now:
+ deleted = True
+ elif expiry == "1_week":
+ if date + timedelta(weeks=1) <= date_now:
+ deleted = True
+ elif expiry == "2_weeks":
+ if date + timedelta(weeks=2) <= date_now:
+ deleted = True
+ elif expiry == "1_month":
+ if date + timedelta(days=30) <= date_now:
+ deleted = True
+ elif expiry == "6_months":
+ if date + timedelta(days=180) <= date_now:
+ deleted = True
+ elif expiry == "1_year":
+ if date + timedelta(days=365) <= date_now:
+ deleted = True
+
+ return delete_after_read, deleted
+
+
+def return_paste(query_string):
+ if query_string is None or not query_string.startswith("id="):
+ print("Content-Type: text/plain")
+ print("")
+ print(query_string)
+ sys.exit(0)
+
+ id = query_string.split("=")
+ if len(id) != 2:
+ print("Content-Type: text/plain")
+ print("")
+ print(query_string)
+ sys.exit(0)
+
+ id = id[1]
+
+ full_path = os.path.join(DATABASE_DIRECTORY, f"{id}.json")
+ directory = os.path.dirname(full_path)
+ os.chdir(directory)
+
+ if os.getcwd() != DATABASE_DIRECTORY:
+ print("Content-Type: text/plain")
+ print("")
+ print("NICE TRY")
+ sys.exit(0)
+
+ if not os.path.exists(full_path):
+ print("Status: 404 Not Found")
+ print("Content-Type: text/plain")
+ print("")
+ print("File not found")
+ print(full_path)
+ sys.exit(0)
+
+ with open(full_path, "r") as file:
+ data = json.load(file)
+
try:
- if not os.path.exists(DATABASE_DIRECTORY):
- os.makedirs(DATABASE_DIRECTORY)
- full_path = ""
- while True:
- random_id = generate_random_string()
- full_path = os.path.join(DATABASE_DIRECTORY, f"{random_id}.json")
- if not os.path.exists(full_path):
- break
-
- data = {
- SubmitConstants.TYPE: post_data[SubmitConstants.TYPE],
- SubmitConstants.TITLE: post_data[SubmitConstants.TITLE],
- SubmitConstants.EXPIRATION: post_data[SubmitConstants.EXPIRATION],
- SubmitConstants.PASTED_TEXT: post_data[SubmitConstants.PASTED_TEXT],
- }
-
- with open(full_path, "w") as json_file:
- json.dump(data, json_file, indent=4)
+ delete_after_read, deleted = handle_data(data)
+
+ if deleted:
+ os.remove(full_path)
+ print("Status: 404 Not Found")
+ print("Content-Type: text/plain")
+ print("")
+ print("File not found")
print("Content-Type: application/json")
print("")
- print(json.dumps({"id": random_id}))
- except Exception as e:
+ print(json.dumps(data, default=convert))
+
+ if delete_after_read:
+ os.remove(full_path)
+
+ sys.exit(0)
+ except Exception:
+ print("Status: 404 Not Found")
print("Content-Type: text/plain")
print("")
- print(str(e))
- sys.exit(0)
+ print("File not found")
+
+
+def return_get():
+ try:
+ with open("get.html", "r") as file:
+ get_html = file.read()
+
+ print("Content-Type: text/html")
+ print("")
+ print(get_html)
+
+ except Exception:
+ print("Status: 404 Not Found")
+ print("Content-Type: text/html")
+ print("")
+ print("<html><body><h1>404 Not Found</h1></body></html>")
allowed_dir = os.environ.get("ALLOWED_DIR", None)
@@ -180,6 +299,10 @@ if method == "GET":
return_pico_css()
elif script_name == "/favicon.svg":
return_favicon_svg()
+ elif script_name == "/get":
+ return_get()
+ elif script_name == "/paste":
+ return_paste(query_string)
elif method == "POST":
post_data = sys.stdin.read(content_length)
post_data = json.loads(post_data)