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
| Area | Perubahan |
|---|---|
| Redirect / die | Tidak keluar dari method; tambahkan Exit setelahnya |
| Session | Timeout dalam menit; direktori default <TEMP>/sessions |
| Model | Save/Delete yang gagal mengembalikan False + Message |
| Theme | [flashmessages] di-encode; pakai html=1 untuk markup tepercaya |
| Proxy | Aktifkan systems/trust_proxy jika di belakang reverse proxy |
| reCAPTCHA | Selalu widget v2 |
| Integrasi | bmkg, clarifai, googleanalytics, kloudless, newrelic, office365, yandex, zomato ditandai deprecated |
| Port | Standalone 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()danQuotedTableNamemeng-quote nama tabel dan alias, sehingga nama sepertiorderataumy-tablebisa dipakai.QuoteValue()meng-quote nilai sesuai driver aktif. Gunakan untuk setiap nilai yang dimasukkan ke stringWhere.SoftDeletesudah berfungsi. DenganUseSoftDelete,Deletemenandai baris lewatSoftDeleteField(defaultis_deleted).ExecScript/ExecSQLScriptmenjalankan SQL multi-statement dalam satu transaksi (rollback jika gagal).TSimpleModel.Create('')menurunkan nama tabel dari nama class:TUserGroupModelmenjadiuser_groups.
Theme
- Filter baru
escape(aliashtml,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.Viewsudah dihapus; gunakanThemeUtil.Render.
Keamanan
- Token CSRF dibuat per form, sehingga dua form di satu halaman tidak saling membatalkan. Cek dengan
isValidCSRFdi controller, tampilkan denganHTMLUtil.CSRF('formid'). - Cookie session
HttpOnly,SameSite=Lax, danSecurejika request lewat HTTPS. SessionController.RegenerateIDmembuat 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. /initializemenolak berjalan jikaconfig/config.jsonsudah ada.EnableCorstidak lagi menggabungkan*dengan credentials; berikan origin eksplisit jika butuh credentials.
Library
TJSONUtilkembali menerima array sebagai root.TMailermendukung Cc dan Bcc, dan bisa mengirim tanpa Synapse lewat SMTP client bawaan (smtp_lib).TRedisLibmendukung IPv6 dan menerapkanTimeOutsaat 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.