diff --git a/.github/scripts/generate_thymeleaf_previews.py b/.github/scripts/generate_thymeleaf_previews.py
index 4e0a79250..e0aa44252 100755
--- a/.github/scripts/generate_thymeleaf_previews.py
+++ b/.github/scripts/generate_thymeleaf_previews.py
@@ -456,7 +456,6 @@ def add_static_assets_challenge58(self, content):
/* Challenge 58 specific styles */
.demo-section {{
- background: #fff3cd;
border: 1px solid #ffeaa7;
border-radius: 6px;
padding: 15px;
diff --git a/.github/workflows/github-pages-preview.yml b/.github/workflows/github-pages-preview.yml
index f42a5b0af..24533fd36 100644
--- a/.github/workflows/github-pages-preview.yml
+++ b/.github/workflows/github-pages-preview.yml
@@ -2,7 +2,6 @@ name: GitHub Pages PR Preview
on:
pull_request:
- types: [opened, synchronize, reopened, closed]
paths:
- 'src/main/resources/templates/**'
- 'src/main/resources/static/**'
diff --git a/.lycheeignore b/.lycheeignore
index 91569555d..f32f92a92 100644
--- a/.lycheeignore
+++ b/.lycheeignore
@@ -30,3 +30,6 @@ https://medium.com/sweetmeat/how-to-keep-a-downstream-git-repository-current-wit
# Issues with lychee:
https://github.com/topics/secrets-detection
+
+# Helm docs are flaky in CI (connection resets)
+https://helm.sh/docs/intro/install/
diff --git a/js/package-lock.json b/js/package-lock.json
index 27f08ceee..be142b7c7 100644
--- a/js/package-lock.json
+++ b/js/package-lock.json
@@ -1246,8 +1246,7 @@
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz",
"integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==",
"dev": true,
- "license": "Apache-2.0",
- "peer": true
+ "license": "Apache-2.0"
},
"node_modules/require-from-string": {
"version": "2.0.2",
diff --git a/pom.xml b/pom.xml
index 44b6c0f43..41f046b64 100644
--- a/pom.xml
+++ b/pom.xml
@@ -56,7 +56,7 @@
3.14.9
7.4.5
2.14.1
- 4.1.118.Final
+ 4.1.123.Final
25
3.7.1
10.0.3.0
diff --git a/src/main/resources/challenges/challenge-57/challenge-57.snippet b/src/main/resources/challenges/challenge-57/challenge-57.snippet
index e62d7c2f6..1b1c6f541 100644
--- a/src/main/resources/challenges/challenge-57/challenge-57.snippet
+++ b/src/main/resources/challenges/challenge-57/challenge-57.snippet
@@ -11,7 +11,7 @@
-
+
💡 Tip: This AI has been given specific instructions. Try exploring what it knows!
diff --git a/src/main/resources/challenges/challenge-58/challenge-58.snippet b/src/main/resources/challenges/challenge-58/challenge-58.snippet
index 679cffa0f..a8cae3301 100644
--- a/src/main/resources/challenges/challenge-58/challenge-58.snippet
+++ b/src/main/resources/challenges/challenge-58/challenge-58.snippet
@@ -2,16 +2,16 @@
🗄️ Database Connection Error Demo
This challenge demonstrates how database connection failures can expose sensitive credentials through error messages.
-
+
Try the vulnerable endpoint:
Click the button below to trigger a database connection error that exposes the connection string with embedded credentials.
🚨 Trigger Database Connection Error
-
This endpoint simulates a database connection failure that exposes the connection string with embedded credentials.
+
This endpoint simulates a database connection failure that exposes the connection string with embedded credentials.
-
+
💡 Tip: Look for the database password in the error message or application logs.
diff --git a/src/main/resources/static/css/dark.css b/src/main/resources/static/css/dark.css
index d9398ac30..9f9fd2d3d 100644
--- a/src/main/resources/static/css/dark.css
+++ b/src/main/resources/static/css/dark.css
@@ -112,3 +112,64 @@
.dark-mode .text-muted {
color: var(--bs-gray-300) !important;
}
+
+.dark-mode #llm-challenge-container {
+ background-color: #1f1f1f !important;
+ border-color: var(--bs-gray-700) !important;
+ color: var(--bs-body-color);
+}
+
+.dark-mode #llm-challenge-container h4,
+.dark-mode #llm-challenge-container p {
+ color: var(--bs-body-color);
+}
+
+.dark-mode #chat-history {
+ background-color: #1a1a1a !important;
+ border-color: var(--bs-gray-700) !important;
+}
+
+.dark-mode #chat-history .ai-message {
+ background-color: #2a2a2a !important;
+ color: var(--bs-body-color);
+}
+
+.dark-mode #chat-history .user-message {
+ background-color: #243548 !important;
+ color: var(--bs-body-color);
+}
+
+.dark-mode #llm-challenge-container input[type="text"] {
+ border-color: var(--bs-gray-700) !important;
+}
+
+.dark-mode #llm-challenge-container button {
+ background-color: var(--bs-primary) !important;
+ border-color: var(--bs-primary) !important;
+}
+
+.dark-mode #llm-challenge-container .chat-tip {
+ color: var(--bs-gray-300) !important;
+}
+
+.dark-mode #database-challenge-container {
+ background-color: #1f1f1f !important;
+ border-color: var(--bs-gray-700) !important;
+ color: var(--bs-body-color);
+}
+
+.dark-mode #database-challenge-container h4,
+.dark-mode #database-challenge-container p {
+ color: var(--bs-body-color);
+}
+
+.dark-mode #database-challenge-container .db-warning {
+ background-color: #2a2412 !important;
+ border-color: #6a5a2a !important;
+ color: var(--bs-body-color);
+}
+
+.dark-mode #database-challenge-container .db-warning-text,
+.dark-mode #database-challenge-container .db-tip {
+ color: var(--bs-gray-300) !important;
+}
diff --git a/static-site/pr-2125/pages/challenge-example.html b/static-site/pr-2125/pages/challenge-example.html
index 8ebcc57d3..1b0f1ce88 100644
--- a/static-site/pr-2125/pages/challenge-example.html
+++ b/static-site/pr-2125/pages/challenge-example.html
@@ -224,6 +224,44 @@
border-color: white;
}
+.dark-mode #llm-challenge-container {
+ background-color: #1f1f1f;
+ border-color: var(--bs-gray-700);
+ color: var(--bs-body-color);
+}
+
+.dark-mode #llm-challenge-container h4,
+.dark-mode #llm-challenge-container p {
+ color: var(--bs-body-color);
+}
+
+.dark-mode #chat-history {
+ background-color: #1a1a1a;
+ border-color: var(--bs-gray-700);
+}
+
+.dark-mode #chat-history .ai-message {
+ background-color: #2a2a2a;
+ color: var(--bs-body-color);
+}
+
+.dark-mode #chat-history .user-message {
+ background-color: #243548;
+ color: var(--bs-body-color);
+}
+
+.dark-mode .chat-input {
+ border-color: var(--bs-gray-700);
+}
+
+.dark-mode .chat-send-btn {
+ background-color: var(--bs-primary);
+}
+
+.dark-mode .chat-tip {
+ color: var(--bs-gray-300);
+}
+
/* Bootstrap CSS (minimal) */