From 96e21882265b851d6baf4519fef66a2c65cba958 Mon Sep 17 00:00:00 2001
From: LpCote <73721863+LpCote4@users.noreply.github.com>
Date: Sun, 17 Nov 2024 11:25:11 -0500
Subject: [PATCH] fix: score with submission.value if defined and removed
 @admin for get /Submissions

---
 CTFd/api/v1/submissions.py                            |  3 ++-
 CTFd/models/__init__.py                               |  8 +++++++-
 CTFd/teams.py                                         | 11 ++++++++---
 CTFd/themes/admin/templates/teams/team.html           |  2 +-
 CTFd/themes/admin/templates/users/user.html           |  2 +-
 CTFd/themes/core-beta/assets/js/challenges.js         |  2 +-
 ...{challenges.45936401.js => challenges.1bd30fed.js} |  0
 CTFd/themes/core-beta/static/manifest.json            |  9 ++++++++-
 CTFd/themes/core-beta/templates/teams/private.html    |  4 ++--
 CTFd/themes/core-beta/templates/teams/public.html     |  2 +-
 CTFd/themes/core-beta/templates/users/private.html    |  2 +-
 CTFd/themes/core-beta/templates/users/public.html     |  2 +-
 CTFd/utils/challenges/__init__.py                     |  2 +-
 CTFd/utils/social/__init__.py                         |  4 ++--
 14 files changed, 36 insertions(+), 17 deletions(-)
 rename CTFd/themes/core-beta/static/assets/{challenges.45936401.js => challenges.1bd30fed.js} (100%)

diff --git a/CTFd/api/v1/submissions.py b/CTFd/api/v1/submissions.py
index c899ae2c..e0d2a921 100644
--- a/CTFd/api/v1/submissions.py
+++ b/CTFd/api/v1/submissions.py
@@ -50,7 +50,7 @@ submissions_namespace.schema_model(
 
 @submissions_namespace.route("")
 class SubmissionsList(Resource):
-    @admins_only
+    # @admins_only
     @submissions_namespace.doc(
         description="Endpoint to get submission objects in bulk",
         responses={
@@ -100,6 +100,7 @@ class SubmissionsList(Resource):
             .filter(*filters)
             .paginate(max_per_page=100)
         )
+        print(submissions.query.statement)
 
         response = schema.dump(submissions.items)
 
diff --git a/CTFd/models/__init__.py b/CTFd/models/__init__.py
index 3b251740..114dc59a 100644
--- a/CTFd/models/__init__.py
+++ b/CTFd/models/__init__.py
@@ -1,5 +1,6 @@
 import datetime
 from collections import defaultdict
+from sqlalchemy import case
 
 from flask_marshmallow import Marshmallow
 from flask_sqlalchemy import SQLAlchemy
@@ -525,7 +526,12 @@ class Users(db.Model):
 
     @cache.memoize()
     def get_score(self, admin=False):
-        score = db.func.sum(Challenges.value).label("score")
+        score = db.func.sum(
+            case(
+                [(Solves.value != None, Solves.value)],  # Use Solves.value if defined
+                else_=Challenges.value  # Fallback to Challenges.value
+            )
+        ).label("score")
         user = (
             db.session.query(Solves.user_id, score)
             .join(Users, Solves.user_id == Users.id)
diff --git a/CTFd/teams.py b/CTFd/teams.py
index 01e4409e..953281ac 100644
--- a/CTFd/teams.py
+++ b/CTFd/teams.py
@@ -411,11 +411,16 @@ def get_member_score(member):
     total_score = 0
     for solve in member.solves:
         challenge = Challenges.query.filter_by(id=solve.challenge_id).first_or_404()
-        
-        total_score += int(challenge.value)
+        if(solve.value):
+            total_score += int(solve.value)
+        else:
+            total_score += int(challenge.value)
     for fail in member.fails:
         challenge = Challenges.query.filter_by(id=fail.challenge_id).first_or_404()
-        total_score += int(challenge.value)
+        if(fail.value):
+            total_score += int(fail.value)
+        else:
+            total_score += int(challenge.value)
   
     
     return total_score
diff --git a/CTFd/themes/admin/templates/teams/team.html b/CTFd/themes/admin/templates/teams/team.html
index a56f8a85..199ef7b9 100644
--- a/CTFd/themes/admin/templates/teams/team.html
+++ b/CTFd/themes/admin/templates/teams/team.html
@@ -370,7 +370,7 @@
 								</td>
 								<td class="flag imageContainer text-center" id="{{solve.provided}}"></td>
 								<td class="text-center">{{ solve.challenge.category }}</td>
-								<td class="text-center">{{ solve.challenge.value }}</td>
+								<td class="text-center">{{ solve.value if solve.value is not none else solve.challenge.value }}</td>
 								<td class="text-center solve-time">
 									<span data-time="{{ solve.date | isoformat }}"></span>
 								</td>
diff --git a/CTFd/themes/admin/templates/users/user.html b/CTFd/themes/admin/templates/users/user.html
index 7e02e35b..8fd2a788 100644
--- a/CTFd/themes/admin/templates/users/user.html
+++ b/CTFd/themes/admin/templates/users/user.html
@@ -242,7 +242,7 @@
 							</td>
 							<td class="flag imageContainer text-center" id="{{solve.provided}}"></td>
 							<td class="text-center">{{ solve.challenge.category }}</td>
-							<td class="text-center">{{ solve.challenge.value }}</td>
+							<td class="text-center">{{ solve.value if solve.value is not none else solve.challenge.value }}</td>
 							<td class="text-center solve-time">
 								<span data-time="{{ solve.date | isoformat }}"></span>
 							</td>
diff --git a/CTFd/themes/core-beta/assets/js/challenges.js b/CTFd/themes/core-beta/assets/js/challenges.js
index daf1fb6e..cb56347f 100644
--- a/CTFd/themes/core-beta/assets/js/challenges.js
+++ b/CTFd/themes/core-beta/assets/js/challenges.js
@@ -562,7 +562,7 @@ Alpine.data("ChallengeBoard", () => ({
         }
         this.challenges[challenge].value = sum;
       }
-      
+
     }
   },
 
diff --git a/CTFd/themes/core-beta/static/assets/challenges.45936401.js b/CTFd/themes/core-beta/static/assets/challenges.1bd30fed.js
similarity index 100%
rename from CTFd/themes/core-beta/static/assets/challenges.45936401.js
rename to CTFd/themes/core-beta/static/assets/challenges.1bd30fed.js
diff --git a/CTFd/themes/core-beta/static/manifest.json b/CTFd/themes/core-beta/static/manifest.json
index c13c7fdf..587bd710 100644
--- a/CTFd/themes/core-beta/static/manifest.json
+++ b/CTFd/themes/core-beta/static/manifest.json
@@ -30,7 +30,7 @@
     ]
   },
   "assets/js/challenges.js": {
-    "file": "assets/challenges.45936401.js",
+    "file": "assets/challenges.1bd30fed.js",
     "src": "assets/js/challenges.js",
     "isEntry": true,
     "imports": [
@@ -182,5 +182,12 @@
       "assets/js/index.js",
       "_index.84adcd49.js"
     ]
+  },
+  "_userscore.c89c7377.js": {
+    "file": "assets/userscore.c89c7377.js",
+    "imports": [
+      "assets/js/index.js",
+      "_index.84adcd49.js"
+    ]
   }
 }
\ No newline at end of file
diff --git a/CTFd/themes/core-beta/templates/teams/private.html b/CTFd/themes/core-beta/templates/teams/private.html
index fc079636..5eab6301 100644
--- a/CTFd/themes/core-beta/templates/teams/private.html
+++ b/CTFd/themes/core-beta/templates/teams/private.html
@@ -461,7 +461,7 @@
                   {{ solve.challenge.name }}
                 </td>
                 <td class="d-md-block d-lg-block">{{ solve.user.name }}</td>
-                <td>{{ solve.challenge.value }}</td>
+                <td>{{ solve.value if solve.value is not none else solve.challenge.value }}</td>
                 <td class="solve-time">
                   <span data-time="{{ solve.date | isoformat }}">{{ solve.date }}</span>
                 </td>
@@ -487,7 +487,7 @@
                   {{ fail.challenge.name }}
                 </td>
                 <td class="d-md-block d-lg-block">{{ fail.user.name }}</td>
-                <td>{{ fail.challenge.value }}</td>
+                <td>{{ fail.value if fail.value is not none else fail.challenge.value }}</td>
                 <td class="solve-time">
                   <span data-time="{{ fail.date | isoformat }}">{{ fail.date }}</span>
                 </td>
diff --git a/CTFd/themes/core-beta/templates/teams/public.html b/CTFd/themes/core-beta/templates/teams/public.html
index 8523434d..4bfd831c 100644
--- a/CTFd/themes/core-beta/templates/teams/public.html
+++ b/CTFd/themes/core-beta/templates/teams/public.html
@@ -148,7 +148,7 @@
                   </a>
                 </td>
                 <td class="d-none d-md-block d-lg-block">{{ solve.challenge.category }}</td>
-                <td>{{ solve.challenge.value }}</td>
+                <td>{{ solve.value if solve.value is not none else solve.challenge.value }}</td>
                 <td class="solve-time">
                   <span data-time="{{ solve.date | isoformat }}"></span>
                 </td>
diff --git a/CTFd/themes/core-beta/templates/users/private.html b/CTFd/themes/core-beta/templates/users/private.html
index f6e0715a..3a1edfb6 100644
--- a/CTFd/themes/core-beta/templates/users/private.html
+++ b/CTFd/themes/core-beta/templates/users/private.html
@@ -141,7 +141,7 @@
                   </a>
                 </td>
                 <td class="d-none d-md-block d-lg-block">{{ solve.challenge.category }}</td>
-                <td>{{ solve.challenge.value }}</td>
+                <td>{{ solve.value if solve.value is not none else solve.challenge.value }}</td>
                 <td class="solve-time">
                   <span data-time="{{ solve.date | isoformat }}"></span>
                 </td>
diff --git a/CTFd/themes/core-beta/templates/users/public.html b/CTFd/themes/core-beta/templates/users/public.html
index 166a8f85..322ec9a8 100644
--- a/CTFd/themes/core-beta/templates/users/public.html
+++ b/CTFd/themes/core-beta/templates/users/public.html
@@ -120,7 +120,7 @@
                   </a>
                 </td>
                 <td class="d-none d-md-block d-lg-block">{{ solve.challenge.category }}</td>
-                <td>{{ solve.challenge.value }}</td>
+                <td>{{ solve.value if solve.value is not none else solve.challenge.value }}</td>
                 <td class="solve-time">
                   <span data-time="{{ solve.date | isoformat }}"></span>
                 </td>
diff --git a/CTFd/utils/challenges/__init__.py b/CTFd/utils/challenges/__init__.py
index a92169f8..74497f1d 100644
--- a/CTFd/utils/challenges/__init__.py
+++ b/CTFd/utils/challenges/__init__.py
@@ -98,7 +98,7 @@ def get_solves_for_challenge_id(challenge_id, freeze=False):
     for fail in fails:
  
         # Seperate out the account name and the Solve object from the SQLAlchemy tuple
-        if fail.challenge.type == "flash" or fail.challenge.type =="manual" or fail.challenge.type == "manualRecursive":
+        if fail.challenge.type == "flash" or fail.challenge.type =="manual" or fail.challenge.type == "manualRecursive" or fail.challenge.type == "sport":
             results.append(
                 {
                     "user_name" :fail.user.name,
diff --git a/CTFd/utils/social/__init__.py b/CTFd/utils/social/__init__.py
index 0d8baf6f..449bf0da 100644
--- a/CTFd/utils/social/__init__.py
+++ b/CTFd/utils/social/__init__.py
@@ -82,7 +82,7 @@ class SolveSocialShare(object):
         # Challenge information
         challenge_id = challenge.id
         challenge_name = challenge.name
-        challenge_value = challenge.value
+        challenge_value = solve.value if solve.value else challenge.value
         solves_count = get_solve_counts_for_challenges(challenge_id=challenge_id)
         solve_count = solves_count.get(challenge_id, 0)
 
@@ -158,7 +158,7 @@ class SolveSocialShare(object):
         # Challenge information
         challenge_id = challenge.id
         challenge_name = challenge.name
-        challenge_value = challenge.value
+        challenge_value = solve.value if solve.value else challenge.value
         solves_count = get_solve_counts_for_challenges(challenge_id=challenge_id)
         solve_count = solves_count.get(challenge_id, 0)
         solve_count_word = str(solve_count) + pluralize(
-- 
GitLab