🚀 What's Changed
Frontend
Click to expand changelog
Across the platform
- Removed Adaptive training mode; removed the "linear" terminology as the only mode is now linear
- Added a clear button to all relevant inputs, with unified behaviour throughout
- Capped titles and names at 256 characters, and token prefixes at 32
- Long text truncated in tables and cards reveals itself on hover, and only when actually clipped
- Multi-line fields grow to fit their content instead of being dragged to resize
- Unsaved changes state now persists on save failures
- Removed all D3-based visualizations and replaced them with ECharts visualizations
New charts
- All charts poll live data and offer CSV export
- Progress - per-trainee progress across levels over time
- Added a duration mode aligning every run to zero and showing elapsed time only
- Added an event type filter
- Status tiles - run state, time remaining, hints used and score
- Feedback overview - one trainee's identity and how their run concluded
- Live event feed - aggregated feed of most recent events
- Scoreboard - trainees ranked by score and duration
- Players per level - number of active runs at each level
- Score attainment - distribution of trainees across score bands
- Level difficulty - per-level difficulty from wrong answers, hints, solutions and time
- Top wrong answers - most frequent incorrect answers per level
- Trainee wrong answers - one trainee's incorrect answers
- Time vs expected - time spent per level against the authored estimate
- Time vs score - time spent against points scored per level
- Cumulative score - score accumulating level by level
- Overall speed vs score - every run's total time against its score
- Level percentiles - a run's score and time ranked against others, per level
- Assists coverage - which hints and solutions a run opened
- Event timeline - chronological run events with commands plotted beneath
- Commands - console commands aggregated per level, searchable, with argument folding
- Command log - one run's commands in order, with host, source IP and working directory
Training analysis dashboard
- Replaced all instance organiser visualizations with a dedicated analysis dashboard
- Aggregated view
- Presents the instance as a whole, covering current trainee standing and providing basis for improving the training definition
- Contains status tiles, progress, live event feed, scoreboard, players per level, score attainment, level difficulty, top wrong answers, time vs expected and commands
- Trainee view
- Presents a single selected run end to end, for monitoring or debriefing an individual trainee
- Contains cumulative score, time vs score, trainee wrong answers, event timeline and command log
- Runs are picked from a list carrying score, time, current level, hints, solutions and wrong answers
- Assessment view
- Presents the distribution of answers per question, allowing for question quality and difficulty analysis
- Selecting an answer highlights every trainee who chose it
- CSV export of the shown assessment, one row per trainee and question
- Aggregated view
- Selected view and trainee are held in the URL fragment, for sharing and bookmarking
- Removed now deprecated views: dashboard, quiz results, walkthrough, command timeline and command analysis
Trainee run summary
- Replaced the previous trainee run visualization with a new summary dashboard
- Presents a completed run back to the trainee, covering how it concluded and how it stands against other runs on the instance
- Contains feedback overview, overall speed vs score, level percentiles, scoreboard, assists coverage, cumulative score, time vs score and event timeline
Score export
- Reworked training instance score export, now broken down per level and splitting the assessment score from the training score
- Exports as CSV, replacing the previous plain text download
- Exports rank, login, name, mail, state, start and end time, duration, one column per scored level, training score, assessment score, total, hints taken, wrong answers and solutions displayed
- Levels a trainee never attempted export as a dash rather than a zero
Training definition editor
- Improved EMI question edit visuals
- Leaving Test mode restores each question's original required setting, instead of leaving every question forced to required
Topology
- Fixed crashes on multihomed VM nodes, which were emitted once per attached network and collided on duplicate identifiers
- Nodes whose operating system is not recognised no longer show a mismatched OS icon
- Internet node graphic is generated asynchronously, and failures are handled rather than breaking the graph
Sandbox
- Pool comments apply immediately and roll back if saving fails
- Pool comment length is capped
- Prompts before leaving pool edit with unsaved changes
- Creating a sandbox definition shows a loading state, and repeated Enter presses can no longer submit it twice
User and group
- Reworked microservice roles around a fixed default role, which every user of that microservice receives, cannot be deleted, and is always present so a microservice can never be left without one
- Adding a role moves focus straight into it
- Groups with no members or no roles say so, rather than showing an empty table
- Minor visual and behavioural improvements across user, group and microservice management, covering unsaved changes prompts and support for users without an email address
Navigation and home
- Home page hides agenda sections the user holds no role for, and shows a message if no agendas are accessible
- Users with access to a single agenda are taken directly to it instead of through the home page
- Fixed Design navigation offering Pool and Sandbox Images based on the wrong roles
- Navigating to an entity that does not exist redirects instead of failing
Internal
- New event query engine backing every chart, with events syncing into a local SQLite database in a web worker so charts query it instead of the network
- Sync tracks a watermark per instance and event type, so only new events are fetched
- Entity references on event rows resolve to full entities through a dedicated resolver
- Only one browser tab may own the local cache; other tabs are shown a blocked page and resume once it is freed
- Cached instances are evicted by age and total size on startup
- Cached batch fetch of entities by identifier resolves each id from a local cache and requests only the ones missing
- Cache lifetimes and maximum size are configurable, and polling periods are configured as duration strings
- Charts stop polling while the browser tab is hidden, and resume when it returns
- Route resolvers rewritten to fetch an entity once per navigation and share it across title and breadcrumb
- Unsaved changes tracking and its route guard extracted for reuse across agendas
- Pagination types moved from the Sentinel package into the shared utils library
- Replaced moment with date-fns for all duration handling
- Shared Vitest configuration adopted across every module, with a new test utilities library
- Theme gains spacing, font size and font weight token scales, and a card header style
Java backend
-
Training service
-
Adaptive training service was deprecated and archived
-
Adaptive smart assistant was deprecated and archived
-
Elasticsearch service was deprecated and archived. Elasticsearch has been replaced by OpenSearch and this service's functionality was moved into Training service's
training-opensearchmodule
Click to expand changelog
Visualization and analytics
- New events endpoint serving raw training and console command events, replacing the old server-rendered visualizations
GET /training-instances/{instanceId}/events, filtered by event type and a since timestamp, suitable for polling- Accessible to administrators, organizers of the instance and its participants
- Participants see only their own answer events and commands
- Removed all server-rendered visualizations in favour of the events endpoint, decoupling frontend charts from backend analysis
/visualizations/**- 22 endpoints/clusters/**- 6 endpoints- Command graphs - 11 endpoints
Score export
- Score export now returns a rich JSON report instead of a CSV file
GET /exports/training-instances/{instanceId}/scores- Carries rank, training and assessment score, total, per-level scores, hints taken, wrong answers, solutions displayed, start and end time, and duration; the old CSV carried only instance id, login and total training score
- Lists the levels it scores, in definition order
- Wrong answers on access levels are excluded from the total
- Ranked by score, ties broken by shorter time, then by run id
Bulk lookup
- New by-ids endpoints fetching many records in one request, each returning a lightweight projection
- Definitions, levels, hints, instances, runs and users
*BasicDTOprojections carry descriptive non-sensitive data only
Cleanup of removed service integrations
- Removed the training-feedback-service integration as a result of the microservice's removal
- Reference, trainee and summary graphs are no longer created alongside the training definition
- The feedback service client and its configuration are removed
- Removed the elasticsearch-service integration as a result of the microservice's removal
- Training events and console commands are queried directly from OpenSearch
- The elasticsearch-service client and its web client configuration are removed
- The
crczp-elasticsearch-documentsdependency is dropped
Deployment and configuration
- Event storage migrated from Elasticsearch to OpenSearch, to which the training-service now connects directly
- Properties added
opensearch.protocolopensearch.hostopensearch.portsandbox-service.uri
- Properties removed
openstack-server.uri- superseded bysandbox-service.urielasticsearch-service.uritraining-feedback-service.uri
- Audit logger renamed to
cz.cyberrange.platform.training.opensearch.events.training.logging.AuditService
Internal
- Added multiple bulk query operations to improve request performance
- Optimized listing training definitions, score export and the MITRE technique report
- Consolidated the API model into a single DTO hierarchy
- Shared level, definition, instance and run fields lifted into abstract base types
- Made explicit which training definition DTOs contain levels via a dedicated type instead of a nullable
levelsfield - Accessors, equality and string forms generated uniformly with Lombok across all DTOs
- Whole repository reformatted to Google Java Format
- Service tests reorganized into a
unitpackage, with new tests for mappers, facades, core services, scoring and event serialization
Python backend
Click to expand changelog
- Added NetBird VPN support for sandbox networks
- New endpoint for fetching NetBird VPN connection details
- Fixed an issue where an allocation request could wait indefinitely on stages
- Fixed an orphaned NetBird access group left behind when a sandbox is deleted mid-provision
- Added caching options for the GitHub sandbox-definition provider
FRESH_IMPORTcache mode is now validated and restricted to the GitHub provider- Docker/topology lookups now reflect the configured cache mode
- Separated TCP, ICMP, and HTTP monitoring into distinct types
- Windows sandbox hosts now default to
ansible_shell_type=powershellfor SSH communication - Fixed duplicate target names in Ansible inventory generation
- Added pool ID and sandbox ID to generated
ssh-keys.zipfilenames - Fixed UTF-8 encoding and urlsafe base64 handling in JWT payload parsing
- Fixed SMTP connections not being closed when STARTTLS/login fails in
EmailManager - Migrated fully to Python 3.12+, dropping support for older Python versions
- Replaced
git-url-parsewith the standard libraryurllib.parse(resolves CVE-2023-32758) - Resolved outstanding pylint, bandit, and mypy findings; raised the pylint score to 9.85/10
- Locked the Redis client version to avoid a compatibility regression
- Bumped and locked package dependencies
Infra
Click to expand changelog
- Added configurable per-protocol Guacamole connection parameter overrides
- Resolved multiple dependency CVEs in the Guacamole service (httpcore5, log4j2, logback, Netty/reactor-netty, swagger-ui/DOMPurify) and fixed tunnel handshake/exception-handling bugs
- Mitre-technique service: dropped the separate linear/adaptive training endpoints in favor of a single unified training-techniques endpoint, as part of the platform-wide Adaptive Training retirement (breaking config change — endpoint key renamed in
config.yml) - Added NetBird VPN support to the sandbox deployment
- Added configuration for GitHub sandbox-definition topology caching
- Added support for enabling network traffic forwarding (port mirroring) on sandbox definitions, for OpenStack (Neutron TaaS + OVN) or AWS (VPC Traffic Mirroring on Nitro instances) deployments
- Removed the Adaptive Training, Adaptive Smart Assistant, and Elasticsearch Helm subcharts; added an OpenSearch values file to match the Training service's new integration
- Added a manual workflow_dispatch trigger to the Helm package-and-upload CI workflow
🙌 Thanks to all contributors in this release:
Full Changelog: v1.1.0...v1.2.0