From f7fa1c70c2229ef225adf82e57f232c79c68192f Mon Sep 17 00:00:00 2001 From: a2nr Date: Sat, 22 Aug 2026 09:39:46 +0700 Subject: [PATCH] fix(content-editor): bersihkan tab saat pindah asset & perbaiki upload gagal 500 - Reset previewActiveTabs/previewSlides saat pindah ke asset & saat hapus file aktif, agar tab dinamis (C/Python/Circuit/Arduino/Flowchart) tidak menetap setelah berpindah konteks. - Ganti Pillow Image.verify() dengan Image.load() di validasi upload asset. verify() false-positive CRC pada chunk IDAT PNG valid -> backend 500. load() cukup membuktikan file adalah gambar yang bisa di-decode. --- frontend/src/routes/teacher/content/+page.svelte | 4 ++++ routes/content_editor.py | 9 +++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/frontend/src/routes/teacher/content/+page.svelte b/frontend/src/routes/teacher/content/+page.svelte index 5b9f625..f9e6f90 100644 --- a/frontend/src/routes/teacher/content/+page.svelte +++ b/frontend/src/routes/teacher/content/+page.svelte @@ -137,6 +137,8 @@ mgr.previewHtml = ''; mgr.previewExerciseHtml = ''; mgr.previewQuizData = []; + mgr.previewSlides = []; + mgr.previewActiveTabs = []; mgr.previewError = null; mgr.activeTab = 'editor'; } else { @@ -228,6 +230,8 @@ mgr.activePath = null; mgr.body = ''; mgr.draftId = null; + mgr.previewSlides = []; + mgr.previewActiveTabs = []; if (mgr.isMobile) mobileShowTree = true; } } else if (res.needs_force) { diff --git a/routes/content_editor.py b/routes/content_editor.py index d37b44c..5ff2938 100644 --- a/routes/content_editor.py +++ b/routes/content_editor.py @@ -454,13 +454,18 @@ def upload_asset(): # Validasi isi benar-benar gambar (bukan cuma cek ekstensi) — SVG # dikecualikan (Pillow tidak parse SVG). + # Pakai .load() (decode sungguhan)而不是 .verify(): .verify() melakukan + # CRC check strict pada IDAT yang sering FALSE-POSITIVE pada PNG valid + # (terutama PNG sederhana / hasil re-encode) → backend 500. .load() + # sudah cukup membuktikan file adalah gambar yang bisa di-decode. if ext != ".svg": try: from PIL import Image, UnidentifiedImageError - Image.open(io.BytesIO(raw)).verify() + im = Image.open(io.BytesIO(raw)) + im.load() # raises jika bukan gambar yang bisa di-decode except ImportError: pass # Pillow tidak terinstal — skip validasi gambar - except (UnidentifiedImageError, OSError): + except (UnidentifiedImageError, OSError, SyntaxError): return jsonify({"success": False, "message": "File bukan gambar yang valid"}), 400 safe_name = _re.sub(r"[^a-zA-Z0-9_.-]", "_", os.path.basename(filename))