File Details
queryhy-1.4.1.jar
- R
- Apr 30, 2026
- 339.33 KB
- 18
- Early Access
File Name
queryhy-1.4.1.jar
Supported Versions
- Early Access
[1.4.1] - Security & Stability Patch
Security
- XSS-Fixes: Player names, UUIDs, and chat messages are now fully HTML- and JavaScript-escaped before being rendered in the dashboard. Malicious player names can no longer inject code into the browser of anyone viewing the dashboard.
- Removed API Key via Query Parameter: The
?apiKey=URL parameter is no longer accepted. API keys must be passed exclusively via theX-API-Keyheader, preventing keys from appearing in server logs, browser history, and proxy caches. - Constant-Time API Key Comparison: Replaced
String.equals()withMessageDigest.isEqual()to eliminate timing-based brute-force attacks on the API key. - Console XSS Protection: The dashboard remote console now escapes all command input and server responses before injecting them into the DOM.
Fixed
- Wrong Monitor Lock in Dashboard:
synchronized(onlinePlayers)was using a different lock object than all other synchronized methods (synchronized(this)), creating a potential race condition. Now consistently usesQueryServer.this. - Non-Atomic Chat Log Writes:
addChatMessage()was performing a multi-step add/size-check/remove sequence on a synchronized list without holding the lock across all steps. The entire operation is now wrapped insynchronized(chatLog). - Rate Limit Cleanup Race Condition: Replaced
volatile longwithAtomicLongandcompareAndSet()to prevent multiple threads from triggering cleanup simultaneously. lastHistoryUpdateThread Visibility: Field is nowvolatileto ensure changes are visible across threads.- Plugin NPE in Dashboard: Added a null check for
QueryHyPlugin.getInstance()inDashboardHandler; returns HTTP 503 if the plugin is unavailable instead of throwing aNullPointerException. - HTTP Server Start Failure Silent:
start()now returns aboolean; the plugin logs a SEVERE message if the HTTP server fails to bind. - Reload Race Condition:
reloadPlugin()now explicitly callsstop()beforestart()instead of relying on the implicit stop insidestart(). - Client Disconnect Error:
IOExceptionduring response body writes is now caught silently (client disconnected) instead of propagating as an unhandled error. - Invalid Config Values: Added
QueryConfig.validate()which clamps all numeric settings to safe ranges (e.g.port1β65535,dashboardRefreshSecondsβ₯ 1). Called automatically on every config load.
Changed
- CDN Version Pinned: Chart.js CDN reference changed from unpinned
chart.jstochart.js@4.4.9to prevent unexpected breakage from upstream updates. - Dashboard HTML uses StringBuilder: Replaced string concatenation in loops with
StringBuilderthroughoutDashboardHandler. - Gson updated:
2.10.1β2.11.0. - Version aligned:
build.gradleand.hytale/project.jsonnow both reflect version1.4.0/1.4.1.