Lewati ke konten utama

Upgrade ke Rilis 2026

Rilis 2026 "Hero" memperbaiki banyak bug yang ditemukan saat review menyeluruh terhadap FastPlaz/src dan tools/src. Sebagian besar perbaikan tidak terlihat dari sisi aplikasi, tapi beberapa di antaranya bisa mengubah perilaku aplikasi yang sudah ada. Cek daftar berikut sebelum upgrade.

Cara Upgrade​

cd fastplaz
git pull

Lalu compile ulang package-nya di Lazarus: fastplaz_runtime.lpk, kemudian fastplaz_tools.lpk (compile dan install). Lihat juga Instalasi.

Ringkasan​

AreaPerubahan
Redirect / dieTidak keluar dari method; tambahkan Exit setelahnya
SessionTimeout dalam menit; direktori default <TEMP>/sessions
ModelSave/Delete yang gagal mengembalikan False + Message
Theme[flashmessages] di-encode; pakai html=1 untuk markup tepercaya
ProxyAktifkan systems/trust_proxy jika di belakang reverse proxy
reCAPTCHASelalu widget v2
Integrasibmkg, clarifai, googleanalytics, kloudless, newrelic, office365, yandex, zomato ditandai deprecated
PortStandalone 17845 (dulu 8080), MCP Agent Plane 17826

Wajib Dicek​

Redirect dan die tidak menghentikan kode​

Redirect(), die(), dan DieRaise() mengirim response dan menandai aplikasi untuk berhenti, tapi tidak keluar dari method yang sedang berjalan. Kode setelahnya tetap dieksekusi.

// sebelumnya: delete tetap jalan untuk user tanpa izin
if not isAllowed then
Redirect(BaseURL + 'login');
Model.Delete(ID);

// sekarang
if not isAllowed then
begin
Redirect(BaseURL + 'login');
Exit;
end;
Model.Delete(ID);

Framework, modul CMS, dan controller hasil generator sudah melakukan Exit setelah setiap redirect. Periksa controller Anda sendiri untuk pola yang sama.

Session timeout dalam menit​

systems/session_timeout dan SessionController.TimeOut dihitung dalam menit, sesuai dokumentasi. Sebelumnya nilai dibandingkan dengan detik, sehingga default 3 hari (4320) kedaluwarsa setelah 72 menit. Jika sebelumnya Anda mengakalinya dengan nilai yang sangat besar, turunkan lagi.

Direktori session​

Jika systems/session_dir kosong, file session disimpan di <TEMP>/sessions (mengikuti variabel environment TEMP). ztemp/sessions hanya dipakai jika TEMP tidak ada atau tidak bisa ditulis. Isi systems/session_dir jika beberapa aplikasi di satu host tidak boleh berbagi session.

Save dan Delete yang gagal mengembalikan False​

TSimpleModel.Save, Delete, dan SoftDelete mengembalikan False dan mengisi Message jika gagal. Sebelumnya kegagalan langsung menghentikan request dengan halaman error.

if not Model.Save('id=' + Model.QuoteValue(id)) then
begin
LogUtil.Add(Model.Message, 'model');
Exit;
end;

Flash message di-encode​

[flashmessages] meng-encode setiap pesan sebagai HTML. Pesan yang memang berisi markup akan tampil sebagai teks. Gunakan [flashmessages html=1] hanya untuk pesan yang tepercaya.

IP klien dan header proxy​

X-Forwarded-For dan Client-IP diabaikan secara default karena bisa dipalsukan oleh klien. Jika aplikasi berada di belakang reverse proxy, aktifkan:

"systems" : { "trust_proxy" : true }

reCAPTCHA​

API v1 sudah dimatikan Google. TReCaptcha hanya memakai siteverify, dan THTMLUtil.ReCaptcha() selalu menampilkan widget v2, apa pun nilai argumen Version-nya.

Integrasi yang deprecated​

Layanan berikut sudah tidak beroperasi. Class-nya masih bisa di-compile tapi ditandai deprecated dan akan dihapus: bmkg, clarifai, googleanalytics (Universal Analytics), kloudlesscalendar, newrelic, office365, yandextranslate, zomato.

Perlu Diketahui​

Database​

  • QuoteIdentifier() dan QuotedTableName meng-quote nama tabel dan alias, sehingga nama seperti order atau my-table bisa dipakai.
  • QuoteValue() meng-quote nilai sesuai driver aktif. Gunakan untuk setiap nilai yang dimasukkan ke string Where.
  • SoftDelete sudah berfungsi. Dengan UseSoftDelete, Delete menandai baris lewat SoftDeleteField (default is_deleted).
  • ExecScript / ExecSQLScript menjalankan SQL multi-statement dalam satu transaksi (rollback jika gagal).
  • TSimpleModel.Create('') menurunkan nama tabel dari nama class: TUserGroupModel menjadi user_groups.

Theme​

  • Filter baru escape (alias html, htmlspecialchars): [$name|escape].
  • [if] mendukung =, ==, !=, <>, <, >, <=, >=, nesting, HTML multi-baris, dan nilai ber-kutip.
  • [foreach] bisa bersarang, dan dataset di-rewind sebelum dirender.
  • Nama template dari request disaring lewat TThemeUtil.SafeTemplateName().
  • Path include yang diawali / dihitung dari web root, bukan dari root drive.
  • Page cache disimpan per session jika session berisi data.
  • ThemeUtil.View sudah dihapus; gunakan ThemeUtil.Render.

Keamanan​

  • Token CSRF dibuat per form, sehingga dua form di satu halaman tidak saling membatalkan. Cek dengan isValidCSRF di controller, tampilkan dengan HTMLUtil.CSRF('formid').
  • Cookie session HttpOnly, SameSite=Lax, dan Secure jika request lewat HTTPS.
  • SessionController.RegenerateID membuat session id baru, misalnya setelah login.
  • RandomString() memakai generator acak yang aman secara kriptografis (CSPRNG).
  • Method HTTP yang tidak ditangani controller mendapat 405 Method Not Allowed.
  • /initialize menolak berjalan jika config/config.json sudah ada.
  • EnableCors tidak lagi menggabungkan * dengan credentials; berikan origin eksplisit jika butuh credentials.

Library​

  • TJSONUtil kembali menerima array sebagai root.
  • TMailer mendukung Cc dan Bcc, dan bisa mengirim tanpa Synapse lewat SMTP client bawaan (smtp_lib).
  • TRedisLib mendukung IPv6 dan menerapkan TimeOut saat koneksi.
  • DateTimeHuman() mem-parse tanggal tanpa bergantung pada locale.

IDE Tools​

  • Nama module, controller, model, dan project otomatis diubah menjadi identifier Pascal yang valid (my-app → myapp, 2fa → _2fa).
  • Membatalkan wizard tidak lagi membuat file.
  • Create Theme Structure kembali menyalin theme default.
  • Database Explorer memakai port yang dikonfigurasi dan menyimpan prefix tabel.

Detail teknis lengkap (Bahasa Inggris): UPGRADE.md dan CHANGES.md.