Repository navigation
v0.2.0
✨ New Features
-
Dedicated Job Details Page:
-
Added a new
/job/{job_id}routing and a responsive UI (job.html) to view full matched job details. -
Features a visual "Match Score" ring, detailed job descriptions, and direct action buttons (Save, Dismiss, View on Arbeitsagentur).
-
Clickable Feed Integration:
-
Job cards in the feed now link directly to the new details page via clickable titles and a dedicated "View" button.
-
Lazy-Loading Descriptions:
-
The backend now automatically fetches and caches missing job descriptions from the Bundesagentur für Arbeit (BA) API when a user views a job's details.
-
Expanded Localization:
-
Added UI translations for the new job details interface across all supported languages (English, German, Russian, Ukrainian).
🛡️ Security & Data Integrity
-
Robust Text Sanitizer (
text_sanitizer.py): -
Implemented a new defense-in-depth HTML parser to strip malicious markup (e.g.,
<script>,<style>,<iframe>) from untrusted third-party BA API responses. -
Automatically removes invisible formatting, zero-width, and private-use characters to prevent hidden prompt-injection payloads from reaching the LLM matcher.
-
Normalizes whitespace and safely truncates abnormally long text strings to protect database columns and LLM context limits.
-
Strict Schema Validation:
-
Hardened
BAJobListingandBADetailedJobschemas to enforce strict data sanitization on initialization. -
Added strict validation for external URLs (allowing only well-formed
http/https) and reference numbers. -
API Client Protections:
-
The
ArbeitsagenturClientnow proactively refuses to execute requests if the requested job reference number contains invalid or unsafe characters.
🧪 Testing & Chores
- Added comprehensive test suites (
test_text_sanitizer.pyandtest_job_info.py) to verify defense against adversarial payloads, entity-encoded XSS attacks, and malformed HTML. - Expanded API client tests to ensure missing fields and HTTP 404 errors from the BA API are handled gracefully without crashing the view.
Full Changelog: v0.1.3...v0.2.0