From f2bfcbfba2629a21a1ad1de75b6ec1c3671bf3cb Mon Sep 17 00:00:00 2001
From: LpCote <73721863+LpCote4@users.noreply.github.com>
Date: Tue, 14 Jan 2025 09:20:33 -0500
Subject: [PATCH] fix image type with old post method

---
 CTFd/api/v1/files.py           |  2 +-
 CTFd/utils/uploads/__init__.py | 52 ++++++++++++++++++++++++++++++++++
 2 files changed, 53 insertions(+), 1 deletion(-)

diff --git a/CTFd/api/v1/files.py b/CTFd/api/v1/files.py
index 0a042fee..11a9621e 100644
--- a/CTFd/api/v1/files.py
+++ b/CTFd/api/v1/files.py
@@ -336,7 +336,7 @@ class FilesList(Resource):
         for f in files:
             # uploads.upload_file(file=f, chalid=req.get('challenge'))
             try:
-                obj = uploads.upload_file(file=f, **form_args)
+                obj = uploads.old_upload_file(file=f, **form_args)
             except ValueError as e:
                 return {
                     "success": False,
diff --git a/CTFd/utils/uploads/__init__.py b/CTFd/utils/uploads/__init__.py
index a5d7a9e4..cd9bb231 100644
--- a/CTFd/utils/uploads/__init__.py
+++ b/CTFd/utils/uploads/__init__.py
@@ -112,6 +112,58 @@ def upload_file(*args, **kwargs):
     return file_row
 
 
+def old_upload_file(*args, **kwargs):
+    file_obj = kwargs.get("file")
+    challenge_id = kwargs.get("challenge_id") or kwargs.get("challenge")
+    page_id = kwargs.get("page_id") or kwargs.get("page")
+    file_type = kwargs.get("type", "standard")
+    location = kwargs.get("location")
+
+    # Validate location and default filename to uploaded file's name
+    parent = None
+    filename = file_obj.filename
+    if location:
+        path = Path(location)
+        if len(path.parts) != 2:
+            raise ValueError(
+                "Location must contain two parts, a directory and a filename"
+            )
+        # Allow location to override the directory and filename
+        parent = path.parts[0]
+        filename = path.parts[1]
+        location = parent + "/" + filename
+
+    model_args = {"type": file_type, "location": location}
+
+    model = Files
+    if file_type == "challenge":
+        model = ChallengeFiles
+        model_args["challenge_id"] = challenge_id
+    if file_type == "page":
+        model = PageFiles
+        model_args["page_id"] = page_id
+
+    # Hash is calculated before upload since S3 file upload closes file object
+    sha1sum = hash_file(fp=file_obj)
+
+    uploader = get_uploader()
+    location = uploader.upload(file_obj=file_obj, filename=filename, path=parent)
+
+    model_args["location"] = location
+    model_args["sha1sum"] = sha1sum
+
+    existing_file = Files.query.filter_by(location=location).first()
+    if existing_file:
+        for k, v in model_args.items():
+            setattr(existing_file, k, v)
+        db.session.commit()
+        file_row = existing_file
+    else:
+        file_row = model(**model_args)
+        db.session.add(file_row)
+        db.session.commit()
+    return file_row
+
 def hash_file(fp, algo="sha1"):
     fp.seek(0)
     if algo == "sha1":
-- 
GitLab