Skip to content

update package security#1046

Open
pandigresik wants to merge 1 commit into
rilis-devfrom
fix/security_update
Open

update package security#1046
pandigresik wants to merge 1 commit into
rilis-devfrom
fix/security_update

Conversation

@pandigresik

@pandigresik pandigresik commented May 29, 2026

Copy link
Copy Markdown
Contributor

PR #1110 — Security Update Packages & Build System Fix

Branch: fix/security_updaterilis-dev


Deskripsi Singkat

Memperbarui package NPM dan Composer yang memiliki celah keamanan (CVE), serta melakukan penyesuaian kode akibat breaking changes dari upgrade major tersebut. Update ini mencakup:

  • Vite v4 → v7 dan laravel-vite-plugin v0 → v2 — membutuhkan konfigurasi build
  • Intervention/Image v2 → v3 — API berubah total, migrasi seluruh pemanggilan
  • Summernote 0.8.20 → 0.9.1 via override (CVE fix)
  • Perbaikan runtime error pada bundle Vite (require is not defined, $(...).select2 is not a function, dual jQuery)
  • Penambahan konfigurasi CSP untuk Leaflet map source

Perubahan yang Dilakukan

1. Update Dependensi Composer

Package Versi Lama Versi Baru Alasan
alexusmai/laravel-file-manager ^3.0 ^3.3.2 Security patch
intervention/image ^2.7 ^3.11 Major upgrade (security + feature)
intervention/image-laravel ^1.5 Baru — Laravel integration untuk v3
mews/captcha ^3.3 ^3.4 Security patch
mews/purifier ^3.4 ^3.4 (lock update) Sub-dependencies update
  • Seluruh transitive dependency ikut ter-update (Symfony, Guzzle, Laravel framework, dll.)
  • Ditambahkan script post-install-cmd untuk publish laravel assets

2. Update Dependensi NPM

Package Versi Lama Versi Baru Alasan
vite ^4.0.0 ^7.0.0 Major upgrade (CVE, performa)
laravel-vite-plugin ^0.7.2 ^2.0.0 Major upgrade (kompatibilitas Vite 7)
summernote (override) 0.8.20 0.9.1 CVE fix via admin-lte override
PostCSS, nanoid, sass, dll. berbagai latest Transitive security patches

3. Migrasi Intervention/Image v2 → v3 (Breaking Changes)

File berubah:

  • app/Helpers/general.php
  • app/Http/Controllers/Api/IdentitasController.php
  • config/app.php
  • config/image.php (baru)

Perubahan API:

Image::make($path)              → Image::read($path)
->resize(W, H, Closure)         → ->scale(width: W, height: H)
->save($path, '100', 'png')     → ->save($path, quality: 100)

4. Konfigurasi Vite — CommonJS & Build Fixes

File berubah: vite.config.js, vite.config-web.js

  • commonjsOptions baru — menangani module CJS (select2, jsvalidation, daterangepicker) agar require() ditransformasi dengan benar
    • include: [/node_modules/, /select2-bridge/, /jsvalidation/]
    • transformMixedEsModules: true
    • defaultIsModuleExports: true
  • Inject plugin exclude['**/node_modules/select2/**'] mencegah double jQuery injection ke select2
  • splitVendorChunkPlugin() dihapus — sudah deprecated di Vite 5+
  • Chunk DataTables — digabung ke chunk admin-lte (dari sebelumnya terpisah datatables) untuk mengatasi circular dependency dan urutan load

5. Perbaikan Loading jQuery Plugins

File berubah: resources/js/bootstrap.js, resources/js/web.js, file baru resources/js/select2-bridge.cjs

Select2:

  • Sebelumnya: import 'select2/dist/js/select2.full.min' (side-effect, factory tidak pernah dipanggil)
  • Sekarang:
    • bootstrap.js: import via bridge select2-bridge.cjs, lalu select2Factory(window, $)
    • web.js: import select2 from 'select2/...' lalu select2(window, $)
  • Bridge .cjs memastikan Rollup/CJS plugin memproses file ini sebagai CommonJS

DataTables:

  • Impor diubah dari .min.js.mjs (ESM native) untuk tree-shaking lebih baik
  • Menambahkan datatables.net-responsive dan datatables.net-select yang sebelumnya tidak diimpor
  • CSS responsive datatables ditambahkan ke app.scss

Dual jQuery (Penyebab $(...).daterangepicker is not a function):

  • (Sudah diperbaiki di PR terpisah sebelumnya — tag <script src="vendor/jquery/jquery.min.js"> dipindah ke dalam blok @if(!mix))

6. Security Policy

File: app/Policies/CustomCSPPolicy.php

  • Menambahkan connect-src untuk https://unpkg.com/leaflet@1.9.4/dist/leaflet.js.map

7. Public Vendor Assets

File baru: public/vendor/jquery/

  • jQuery (regular & slim, minified & full, source map)
  • Untuk fallback saat AdminLTE tidak menggunakan Vite/Laravel Mix

8. Rebuilt Asset Bundles

public/build/ dan public/build-web/ di-rebuild dengan Vite 7, menghasilkan ulang:

  • admin-lte-*.js, app-*.js, tinymce-*.js, web-*.js
  • Semua CSS, font, dan asset lainnya
  • Manifest diperbarui

Alasan Perubahan

  1. CVE pada summernote 0.8.20 — Package ini adalah dependensi admin-lte yang tidak bisa diupgrade langsung. Menggunakan overrides di package.json untuk memaksa summernote ke 0.9.1
  2. CVE pada Vite 4.x — Berbagai celah keamanan pada Vite dan transitive dependencies (postcss, nanoid, dll.) yang hanya tersedia di versi terbaru
  3. Vite 4 EOL — Vite 4 sudah end-of-life, migrasi ke Vite 7 diperlukan untuk mendapatkan security patch berkelanjutan
  4. Intervention/Image v2 EOL — Versi 2 sudah tidak di-maintain, migrasi ke v3 dengan API baru
  5. Runtime error bundle — Build dengan Vite 7 tanpa commonjsOptions menghasilkan require is not defined untuk module CJS (select2, jsvalidation). Konfigurasi CJS plugin diperlukan
  6. Dual jQuery instance — jQuery dari <script> tag berbeda instance dengan jQuery dari Vite bundle, menyebabkan plugin jQuery tidak terdaftar pada instance yang benar
  7. Circular dependency DataTables — DataTables dan AdminLTE saling dependen, dipisah chunk menyebabkan error loading

Dampak Perubahan

Positif

  • ✅ Semua package dengan CVE teratasi
  • ✅ Build time lebih cepat (Vite 7 memiliki performa lebih baik)
  • ✅ Bundle size lebih optimal (ESM imports, tree-shaking)
  • ✅ Runtime error require is not defined hilang
  • ✅ jQuery plugins (select2, datalist, daterangepicker) berfungsi normal
  • ✅ Summernote diamankan tanpa harus upgrade admin-lte

Risiko

  • ⚠️ Intervention/Image v3 memiliki API berbeda — perlu testing upload logo & favicon
  • ⚠️ Vite 7 menggunakan Rollup 4 — format output chunk berubah, pastikan cache busting berfungsi
  • ⚠️ splitVendorChunkPlugin dihapus — vendor chunking mungkin berbeda
  • ⚠️ DataTables chunk digabung ke admin-lte — ukuran chunk admin-lte bertambah

Testing Checklist

Build & Deploy

  • npm run build berhasil tanpa error
  • npm run build-web berhasil tanpa error
  • Asset manifest terbaca dengan benar
  • Cache busting (hash filename) berfungsi
  • Tidak ada file asset yang corrupt

Upload & Image Processing

  • Upload logo identitas berhasil
  • Resize logo ke 150x150 berfungsi
  • Generate favicons (16, 32, 96, 180, 192, 512) berfungsi
  • Upload favicon berhasil

Halaman dengan jQuery Plugins

  • Dasbor — date range picker berfungsi
  • Halaman dengan select2 — dropdown pencarian berfungsi
  • Halaman dengan DataTables — tabel interaktif berfungsi (sort, search, pagination)
  • Halaman dengan DataTables responsive — kolom collapse di mobile berfungsi
  • Halaman dengan daterangepicker — date filter berfungsi

Web Build (Public Facing)

  • build-web — halaman publik tidak error
  • Select2 di halaman publik berfungsi
  • Chart.js di halaman publik tidak error

Summernote

  • Editor summernote di halaman admin berfungsi
  • File upload via summernote berfungsi

Security

  • CSP tidak memblokir leaflet map
  • Tidak ada package dengan CVE high/critical tersisa (verifikasi dengan npm audit / composer audit)

Regression

  • Halaman login berfungsi
  • Halaman admin dengan AdminLTE layout tidak rusak
  • Alpine.js komponen berfungsi
  • SweetAlert2 modal berfungsi
  • Axios request menyertakan CSRF token

Screenshots / Video

simplescreenrecorder-2026-05-29_09.08.12.mp4
simplescreenrecorder-2026-05-29_09.09.35.mp4
simplescreenrecorder-2026-05-29_09.07.22.mp4

@pandigresik pandigresik requested a review from affandii06 May 29, 2026 02:19
@github-actions

Copy link
Copy Markdown

🔄 AI PR Review sedang antri di server...

Proses review akan segera dimulai di background — hasil akan muncul sebagai komentar setelah selesai.
Powered by CrewAI · PR #1046

@affandii06 affandii06 added this to the M2 OpenKab 2607 milestone Jun 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants