index.php and create_ticket_api.php use their own raw mysqli connections instead of Database::getConnection() — missing charset/timezone sync on most page traffic #103
Closed
opened 2026-09-01 00:21:11 -04:00 by jared
·
1 comment
No Branch/Tag Specified
main
development
fix/comment-markdown-persist-18
deploy-2026.10.03-279
deploy-2026.10.03-275
deploy-2026.09.26-272
deploy-2026.09.25-268
deploy-2026.09.25-264
deploy-2026.09.24-258
deploy-2026.09.24-254
deploy-2026.09.12-242
deploy-2026.09.12-238
deploy-2026.09.12-234
deploy-2026.09.12-230
deploy-2026.09.12-226
deploy-2026.09.12-222
deploy-2026.09.11-218
deploy-2026.09.11-214
deploy-2026.09.11-210
deploy-2026.09.11-206
deploy-2026.09.11-202
deploy-2026.09.11-198
deploy-2026.09.11-194
deploy-2026.09.11-190
deploy-2026.09.11-186
deploy-2026.09.09-182
deploy-2026.09.09-178
deploy-2026.09.08-172
deploy-2026.09.01-163
deploy-2026.08.08-155
deploy-2026.08.08-151
deploy-2026.08.08-147
deploy-2026.08.08-143
deploy-2026.08.08-139
deploy-2026.07.15-130
deploy-2026.07.15-122
deploy-2026.07.11-107
deploy-2026.06.30-96
deploy-2026.06.30-92
deploy-2026.06.30-88
deploy-2026.06.30-84
deploy-2026.06.30-80
deploy-2026.06.30-76
deploy-2026.06.30-72
deploy-2026.06.30-68
deploy-2026.04.29-49
deploy-2026.04.29-41
deploy-2026.04.18-35
deploy-2026.04.16-31
deploy-2026.04.16-27
deploy-2026.04.16-23
deploy-2026.04.16-11
deploy-2026.04.14-9
Labels
Clear labels
api
bug
concurrency
config
data-integrity
dead-code
documentation
duplicate
enhancement
help wanted
invalid
needs-decision
notifications
performance
priority/docs
priority/high
priority/low
priority/medium
question
rate-limiting
reliability
security
ux
wontfix
workflow
Bearer/internal API surface
Something is not working
Race condition / concurrency bug
Configuration / deployment default
Data correctness / schema / integrity issue
Unused / dead code cleanup
README / docs accuracy
This issue or pull request already exists
New feature
Need some help
Something is wrong
Needs a maintainer decision, not clearly a bug
Matrix / in-app notification bug
Performance or resource-usage concern
Documentation-only gap
High-severity / high-impact issue
Low-severity / cosmetic issue
Medium-severity issue
More information is needed
Rate limiting behavior
Reliability / error-handling gap
Security or access-control impact
User-facing UX/functional bug
This won't be fixed
Ticket status workflow engine
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: LotusGuild/tinker_tickets#103
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Severity: High
index.php(~lines 20-27) andcreate_ticket_api.php(~lines 38-43) each open their ownnew mysqli(...)connection instead of usingDatabase::getConnection()— and unlikeDatabase.php's connection, neither ever callsset_charset('utf8mb4')or syncs the MySQL sessiontime_zoneto the app's configuredTIMEZONE.Impact — this is significant because of scope:
index.php's raw$connis what gets passed intoDashboardController/TicketControllerfor every non-API web page — the entire dashboard, ticket view, and ticket-create UI, includingStatsModel. This directly contradicts an earlier audit conclusion that "'Today' date boundaries are timezone-safe becausehelpers/Database.phppins the sessiontime_zone" — that check verifiedDatabase.php's own connection-creation code is correct, but never verified it's actually the connection serving the dashboard. It isn't. AnyNOW()/CURDATE()-based query run through this connection (most of the dashboard/stats/ticket-view SQL) uses the DB server's default session timezone, not the app's configured one.set_charset()call means this connection uses whatever character set the server negotiates by default instead of the explicitutf8mb4every other connection gets.TicketController::create()'s non-JS POST fallback writes a ticket directly through this connection — if the default charset isn'tutf8mb4, multi-byte characters (emoji, non-Latin scripts, accented characters) typed into the title/description via this path get mis-encoded/corrupted at write time, permanently.create_ticket_api.php— the hwmonDaemon-facing endpoint's ticket-creation connection never syncstime_zone, socreated_aton an API-created ticket is stamped using the DB server's default session tz while every other ticket (created viaDatabase::getConnection()-backed endpoints) uses the app's configuredTIMEZONE. If those two differ, hwmonDaemon-created tickets can silently land on the wrong 'day' forcreated_at-based stats/filters (e.g. the dashboard's 'Today' widget, SLA elapsed-time calculations).Fix: Route both
index.phpandcreate_ticket_api.phpthroughDatabase::getConnection()instead of hand-rolling a secondnew mysqli(...), eliminating the duplicate connection-creation code path and its charset/timezone drift entirely.Fixed and verified against real MariaDB and real running endpoints (session-based CSRF flow, health-check states, connection charset/timezone sync). Merged to main in commit
bcc732e.