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.
This commit is contained in:
a2nr 2026-08-22 09:39:46 +07:00
parent daa813f511
commit f7fa1c70c2
2 changed files with 11 additions and 2 deletions

View File

@ -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) {

View File

@ -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))