Pontoporeia
0a05f3911c
Replace Psalm with PHPStan + PHP‑CS‑Fixer + Biome, add linting configs & cleanup
...
- Removed the `vimeo/psalm` dependency and all related files
(`psalm.xml`, `psalm‑baseline.xml`, suppress annotations).
- Added **PHPStan** (v2.1.54) and **PHP‑CS‑Fixer** (v3.95.1) to
`vendor/bin/`.
- Created `phpstan.neon` (level 5, bootstraps `app/bootstrap.php`,
scans `Parsedown.php`).
- Created `phpstan‑baseline.neon` with 10 pre‑existing errors.
- Added `.php‑cs‑fixer.dist.php` (PSR‑12 + PHP80Migration, targets
`app/src` & `app/tests`).
- Added `biome.json` and updated `justfile` to replace the old Psalm
recipes with `phpstan`, `cs‑check`, and `cs‑fix`.
- Updated `.gitignore` to exclude PHPStan and PHP‑CS‑Fixer cache files.
- Updated several JS files (`file‑preview.js`, `file‑upload‑queue.js`)
eand PHP controllers (`MediaController.php`, `SearchController.php`,
`SystemController.php`).
- Minor adjustments to `TODO.md`, `app/src/Database.php`,
`app/src/Parsedown.php`, `app/src/ShareLink.php`, and
`app/src/SmtpRelay.php`.
2026-05-05 11:04:52 +02:00
Pontoporeia
d6e30ec9cd
Enhance serve recipe to automatically open the browser
...
- use xdg-open firefox
- keep serve recipe in foreground
2026-05-05 11:04:52 +02:00
Pontoporeia
8a38708fc8
Refactor justfile to reduce redundancy and merge similar recipes
...
- Merge deploy-* recipes into a single deploy-script recipe
- Remove rarely used recipes (show id, setup-dirs)
- Simplify test-* recipes
- Remove redundant default recipe
- Preserve all critical functionality
2026-05-05 11:04:52 +02:00
Pontoporeia
d09f1942f0
Fix Mistral provider: change api from openai-completions to mistral-conversations
2026-05-05 11:04:52 +02:00
Pontoporeia
34b2d073ee
style(toast): reposition to bottom-center, solid bg, larger text, longer duration
2026-05-05 11:04:52 +02:00
Pontoporeia
e8bf89d184
admin header: replace déconnexion text with SVG sign-out icon
2026-05-05 11:04:52 +02:00
Pontoporeia
0f849468f7
feat: inline email retry on 550 rejection in tfe access request form
2026-05-05 11:04:52 +02:00
Pontoporeia
da53bf5d7a
feat: email retry page on 550 rejection; confirmation_email optional in admin form
2026-05-05 11:04:52 +02:00
Pontoporeia
898a87789b
fix(smtp-test): catch SmtpSendException to surface delivery errors as flash messages
2026-05-05 11:04:52 +02:00
Pontoporeia
19784090a3
fix: pass PHP upload limits via -d flags in justfile serve recipe
...
php -S (built-in dev server) ignores .htaccess and .user.ini entirely.
The POST Content-Length limit was still 8M from /etc/php/php.ini.
Pass upload_max_filesize=512M, post_max_size=520M, memory_limit=256M,
max_execution_time=300, max_input_time=300 directly on the CLI.
2026-05-05 11:04:52 +02:00
Pontoporeia
6a37d21f3f
docs: add file-uploads.md — accepted types, limits, storage, ordering, security
2026-05-05 11:04:52 +02:00
Pontoporeia
a83dc1c74e
feat: multi-type file upload with sort order, labels, and expanded MIME support
...
- DB migration 007: add sort_order + display_label to thesis_files
- Database: getThesisFiles ordered by sort_order; insertThesisFile accepts label/order;
new reorderThesisFiles() and updateThesisFileLabel() methods
- ThesisCreateController + ThesisEditController: expand allowed MIME/exts to include
audio (mp3/ogg/wav/flac/aac/m4a), video (webm/mov/ogv), image (gif/webp),
archives (tar/gz), any-ext via octet-stream; max size raised to 500 MB;
accept file_labels[] and file_orders[] POST fields; detectFileType() helper
- MediaController: expanded MIME allowlist; HTTP Range support for audio/video;
force-download for unknown types; inline for known displayable types
- fieldset-files.php: sortable queue UI with SortableJS, per-file labels, 500 MB hint
- templates/admin/edit.php: existing files as sortable list with drag handles,
type icons, label inputs, delete checkboxes, hidden sort-order fields
- file-upload-queue.js: new JS replacing file-preview.js — sortable new-file queue,
per-file labels, hidden order fields on submit, backward-compat legacy preview
- tfe.php: renders audio (<audio>), all video formats, images, PDF, and
download-only 'other' files; reads display_label; sorted by sort_order
- tfe.css + form.css: styles for audio player, download files, sortable queue,
drag handles, file type badges, label inputs
- .htaccess + .user.ini: upload_max_filesize=512M / post_max_size=520M
2026-05-05 11:04:52 +02:00
Pontoporeia
2188ff5479
docs: add SMTP 550 postfix fix report for mail admin
2026-05-05 11:04:52 +02:00
Pontoporeia
89b7ab476e
Handle SMTP 550 recipient-rejected errors with structured SmtpSendException
...
- Add SmtpSendException with smtpCode/smtpResponse/isRecipientRejected()
- smtpSend() $expect closure throws SmtpSendException (with code) instead of RuntimeException
- SmtpRelay::send() re-throws SmtpSendException so callers can inspect it
- request-access.php (new): catch 550 → roll back token+approval, return HTTP 422 with FR user message
- request-access.php (resend): catch 550 → HTTP 422 instead of silently claiming success
- StudentEmail::sendConfirmation(): catch SmtpSendException → log+false (submission not aborted)
- admin/actions/access-request.php: catch SmtpSendException post-approval → flash warning (recipient-rejected vs transient)
2026-05-05 11:04:52 +02:00
Pontoporeia
8d115dc965
smtp: enable TLS peer verification, fix envelope injection, fix dot-stuffing
2026-05-05 11:04:52 +02:00
Pontoporeia
33987c9b15
smtp: add notify_email field; fix admin notification sent to no-reply sender
2026-05-05 11:04:52 +02:00
Pontoporeia
bdb68479d5
smtp: typed probe errors with per-field UI highlighting on save
2026-05-05 11:04:52 +02:00
Pontoporeia
b750aca2f5
smtp: probe credentials on save (connect+auth+quit, no message sent)
2026-05-05 11:04:52 +02:00
Pontoporeia
56c8d54435
repertoire: align all column headings to shared baseline row
2026-05-05 11:04:52 +02:00
Pontoporeia
a9e03c4b1c
repertoire: fixed-header columns, remove main/index padding, minimal column padding
2026-05-05 11:04:52 +02:00
Pontoporeia
0960afb731
fix: add missing favicon tags to partage/recapitulatif.php
2026-05-05 11:04:52 +02:00
Pontoporeia
9ba60084bf
fix: require SmtpRelay.php before StudentEmail.php in partage/index.php
2026-05-05 11:04:52 +02:00
Pontoporeia
cb883ab33f
fix: deploy-server.sh migrates posterg.db → xamxam.db and cleans legacy nginx configs
2026-05-05 11:04:52 +02:00
Pontoporeia
ab51bf3a66
fix: deploy-server.sh cleans up legacy posterg configs and prunes old xamxam backups
2026-05-05 11:04:52 +02:00
Pontoporeia
68e30abb56
fix: remove Post-ERG branding → XAMXAM; drop legacy posterg nginx symlink in deploy script; rename posterg.db → xamxam.db
2026-05-05 11:04:52 +02:00
Pontoporeia
c949cf9481
rename posterg → xamxam throughout: nginx conf, scripts, PHP source, docs
2026-05-05 11:04:52 +02:00
Pontoporeia
3e35bbc40f
style: align mobile nav dropdown links left
2026-05-05 11:04:52 +02:00
Pontoporeia
471c892638
style: larger mobile nav dropdown links
2026-05-05 11:04:52 +02:00
Pontoporeia
42286b1b71
Header link modification
2026-05-05 11:04:44 +02:00
Pontoporeia
671cfb6d83
fix: hamburger dropdown not showing — reset display:none at mobile breakpoint
2026-04-30 00:02:44 +02:00
Pontoporeia
11f429eb72
feat: pure-CSS hamburger menu for public nav (≤640px)
2026-04-29 22:13:19 +02:00
Pontoporeia
c27ffafa7e
fix: add missing favicon tags to partage/index.php (error, password gate, form)
2026-04-29 21:58:49 +02:00
Pontoporeia
80b7fddea4
fix: partials must not unset caller-owned $formData
...
fieldset-academic.php, fieldset-metadata.php and fieldset-licence-explanation.php
were each calling unset($formData) (or wrong variable) in their cleanup block,
destroying the variable in the parent renderShareLinkForm() scope. This caused
an Undefined variable / TypeError on old($formData, ...) for any field rendered
after those partials (e.g. confirmation_email at line 328).
Fix: remove $formData from the unset() calls; fieldset-licence-explanation.php
was also unsetting the wrong name — corrected to unset($n) which is the variable
it actually declares.
2026-04-29 21:56:42 +02:00
Pontoporeia
992f74b31c
fix: prevent jury-fieldset partial from calling old() with wrong arity in partage context
...
Drop '?: null' coercions on juryPresident/juryPromoteur seeding in partage/index.php
so they are '' (not null), making the partial's $addMode guard false and skipping the
single-arg old() call that clashes with partage's 3-arg old() signature.
2026-04-29 21:56:42 +02:00
Pontoporeia
43702542eb
feat(admin): sortable form-help blocks with two-panel UI
...
- Migration 005: add sort_order column to form_help_blocks
- Database: getAllFormHelpBlocks orders by sort_order; new reorderFormHelpBlocks()
- actions/form-help-reorder.php: HTMX POST handler, CSRF-validated, 204 response
- templates/admin/contenus.php: replace flat table with two-panel layout
- Left: SortableJS 1.15.2 + htmx drag-and-drop ordered block cards
- Right: static form structure reference showing fieldsets and their inputs
- admin.css: .fhb-* styles for layout, cards, ghost/chosen/drag states, anchors
- schema.sql: updated form_help_blocks DDL with sort_order column
2026-04-29 21:45:55 +02:00
Pontoporeia
5c39e856a3
fix: pass enabledAccessTypes from ThesisEditController to edit view
2026-04-29 21:34:47 +02:00
Pontoporeia
885150ea45
css: centralise semantic element baseline styles in common.css
2026-04-29 21:33:55 +02:00
Pontoporeia
b5189c0d08
admin: merge acces-etudiante+file-access into acces.php, absorb system.php into parametres.php
2026-04-29 21:18:25 +02:00
Pontoporeia
670a38f30d
add form help blocks: DB table, admin editor, live rendering in partage form
2026-04-29 21:08:09 +02:00
Pontoporeia
0437ec8d15
fix: escape apostrophe in FORM_HELP_LABELS string (Database.php:2005)
2026-04-29 21:05:53 +02:00
Pontoporeia
d665cb502d
centralise form fieldsets into shared partials; add TODO stubs in partage form
2026-04-29 20:59:35 +02:00
Pontoporeia
0628efbba3
Updated the README
2026-04-29 20:47:14 +02:00
Pontoporeia
89de6dd748
Removed the test csv
2026-04-28 22:21:35 +02:00
Pontoporeia
18a02a0018
deploy: rename deploy path from /var/www/posterg to /var/www/xamxam
2026-04-28 22:21:09 +02:00
Pontoporeia
cd68e6e9d7
deploy: exclude posterg.db, theses/, covers/ from rsync to avoid overwriting remote data
2026-04-28 22:15:06 +02:00
Pontoporeia
59c4cf055f
smtp-test: bypass DB, use POST fields directly for credentials
2026-04-27 21:44:10 +02:00
Pontoporeia
9ff8b1b464
fix: call RateLimit::checkKey() as instance method in request-access.php
2026-04-27 21:16:26 +02:00
Pontoporeia
e09b056115
fix: iframe for PDF display, exclude cover files from public loop, no session on media requests
2026-04-27 21:11:58 +02:00
Pontoporeia
46a3c360ec
fix: use local storage/ in dev, create upload dirs, gitignore uploads
2026-04-27 21:08:48 +02:00
Pontoporeia
48059c2317
fix: serve logs, formulaire.php error_log path, CSRF debug, undefined $redirect
2026-04-27 21:04:21 +02:00