Validate screenshot URLs server- and client-side
This commit is contained in:
@@ -296,6 +296,9 @@ function setupHandlers() {
|
||||
const form = e.target;
|
||||
const data = Object.fromEntries(new FormData(form).entries());
|
||||
if (!data.name) return toast("Name required", true);
|
||||
if (data.screenshotUrl && !isValidImageUrl(data.screenshotUrl)) {
|
||||
return toast("Screenshot URL must be http(s) and end with an image file.", true);
|
||||
}
|
||||
try {
|
||||
await api.createSuggestion(data);
|
||||
form.reset();
|
||||
@@ -468,6 +471,9 @@ function openEditModal(s) {
|
||||
form?.addEventListener("submit", async (e) => {
|
||||
e.preventDefault();
|
||||
const data = Object.fromEntries(new FormData(form).entries());
|
||||
if (data.screenshotUrl && !isValidImageUrl(data.screenshotUrl)) {
|
||||
return toast("Screenshot URL must be http(s) and end with an image file.", true);
|
||||
}
|
||||
if (!data.name?.trim()) return toast("Name required", true);
|
||||
try {
|
||||
await api.updateSuggestion(s.id, data);
|
||||
@@ -516,3 +522,16 @@ async function main() {
|
||||
}
|
||||
|
||||
main();
|
||||
|
||||
function isValidImageUrl(url) {
|
||||
if (!url) return true;
|
||||
try {
|
||||
const u = new URL(url);
|
||||
const allowed = ["http:", "https:"];
|
||||
if (!allowed.includes(u.protocol)) return false;
|
||||
const path = u.pathname.toLowerCase();
|
||||
return [".png", ".jpg", ".jpeg", ".gif", ".webp", ".avif"].some(ext => path.endsWith(ext));
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user