Repository navigation
v0.1.24-alpha
Pre-release
Pre-release
·
4 commits
to main
since this release
İmzalı sürüm (ed25519).
manifest.jsonvemanifest.json.sigrelease'e dahildir; açık anahtar depodakeys/pops_release_ed25519.pub.pem. Doğrulama için bkz.keys/README.md. Ajan içinPOps-Agent-*-win-x64.msiönerilir (sessiz kurulum ve özellikleri:Installer/README.md); zip eski elle kurulum yoludur. Ajan paketleri Windows'ta SmartScreen uyarısı verebilir (Authenticode imzası henüz yok). MSI kendi .NET 10 çalışma zamanını getirir; uç noktada önceden bir şey kurmak gerekmez. Pardus/Debian içinpops-agent_*_all.deb(Debian 12 / Pardus 23 ve sonrası; kurulum:Agent-Linux/README.md).
For operators, in short:
- Security first: PHP2Shell (CVE-2026-109618, CVE-2026-109619). Update the PHP of a native server now
(AlmaLinux/RHEL 9:dnf update 'php*', Debian/Ubuntu:apt upgrade) and restart PHP-FPM. The Docker panel image of
this release runs PHP 8.3.36. Details under Security. - A rebuilt panel for everyday work. One Bilgisayarlar section (lab tiles, the lab's PCs, a list) and a full
page per PC with its problems and how to fix them; labelled buttons; Sistem ve Güncelleme and Ayarlar as
sidebar sections. Same features, same API. - Agent fixes from the second external review, tried on a real PC and on a throwaway Windows machine in CI:
- uninstalling during a quarantine or an exam no longer leaves the PC without network;
- an exam no longer gets shorter or longer when the PC clock is wrong;
- winget uses only the winget source, installs the newest version, retries once without a scope when the package
has no machine installer, and says where the package landed; - a refused shutdown or restart is reported as an error;
- large file transfers no longer stop after 100 seconds, and transfer errors are in plain Turkish;
- no BITS when the server CA is pinned; the peer cache also works in labs with public IPv4 addresses.
- Keep file transfer off on a PC like remote command and remote screen, and pick features to install off from the
enrollment token dialog, which now shows the readymsiexeccommand. - Before updating a native server: migration
0033adds one column. Reinstall/usr/local/sbin/pops-backupfrom
this release for the weekly backup retention. Then send the new agent from Sistem ve Güncelleme. - Known limitation: behind Cloudflare's Free or Pro plan, a file transfer over 100 MB fails (one request per
file); see the troubleshooting guide.
Try it without installing: https://demo.pashacore.com.tr (demo / demo, read-only).
Added
- Panel: keep file transfer off on a PC, and choose features to install off. The capability policy on
Cihaz kaydı ve güvenlik covers file transfer next to remote command and remote screen: the server keeps a
standing "off" request (set-capabilitiesfiles_enabled, migration0033), re-sends it when the agent reconnects
reporting it on, and refuses file transfers to that PC meanwhile (#199). The enrollment token dialog lists remote
command, remote screen, file transfer, exam mode, power actions, messages and in-lab package sharing; the result
shows the readymsiexeccommand withNAME_ENABLED=0for each feature ticked, so a staff PC can be installed with
them off from the first start (#198). - Simulator lab distribution.
tools/agent_simulator.py --labs Ncreates short-livedSIM-LAB-*enrollment
tokens and spreads simulated agents evenly across them for realistic class and report testing. Thanks to
@adity982 (#170, closes #72). pops-tls check [--days N]for monitoring. Exits0while the server certificate is valid for more than N days (default 30, the thresholdrenewuses),1with one line when it has N days or fewer left or has expired, and2when there is no certificate. It changes nothing on disk, so a cron mail or a monitoring plugin can run it.pops-tls showmarks the "Kalan" line with "uyarı" inside the threshold. Thanks to @RajGahoi (#155, closes #112).
Changed
- Panel rebuilt for everyday work (#198). Every page was rebuilt on the same engine and API, without a
backend change: one Bilgisayarlar section (lab tiles with status squares, the lab's PCs, a flat list) and a full
PC page (pc?id=) with the problems and their fixes and tabs for general, hardware, software, updates, history,
events and files; labelled buttons with one primary action per page and the rest in a Diğer menu; lists as the
main content, rows that open the item; Sistem ve Güncelleme and Ayarlar sections as sidebar sub-items, with
server and agent updates shown as steps. No KPI tiles or decorative charts on the working pages; statistics stay on
Raporlar. - Agent: winget pins the newest version and says where a package landed (#202). Without a version the agent first
reads the newest version in the winget source and installs that one, so--scope machinecan no longer quietly
install an old release that still had a machine-scope installer (in the field Anki fell back from 26.09.3 to
2.1.65); the output says which version was chosen. A second line says where the package landed: machine-wide, or
only in the SYSTEM account's profile, where the PC's users do not see it. - Agent: file transfer errors in plain Turkish (#202). A broken upload or download no longer shows a raw .NET
message such asError while copying content to a stream.; it says what happened (for example that the connection
was cut and that a proxy's size limit, such as Cloudflare's 100 MB, may be the cause) with the original error in
brackets. HTTP 413, DNS, connection and TLS errors have their own texts. - Docs: file transfers through a proxy's size limit in troubleshooting (#201).
- Backend dependencies: asyncpg 0.32, redis 8.1, pydantic 2.14 and FastAPI 0.143 (#165, #166, #172, #174).
- asyncpg keeps the pool's
min_sizeconnections open (POps: 2 per worker) and fixes a pool deadlock after a protocol abort. - redis-py 8 talks RESP3 by default with compatible responses; the multi-worker Redis job passes unchanged.
- pydantic 2.14 and FastAPI 0.143 need no code change; FastAPI's automatic OpenTelemetry setup is now opt-in and
POps never used it. Starlette 1.8 is skipped: it needs Python 3.11 and the backend still supports 3.10 (D-20). - All of them come from the hash-locked
requirements.lockon the next server update.
- asyncpg keeps the pool's
- Agent: .NET packages 10.0.13 (Microsoft.Extensions.Hosting, System.Diagnostics.EventLog, System.Management and
System.ServiceProcess.ServiceController; #177, #178, #182, #183, #191). - Docker images: refreshed
python:3.12-slimandphpbase image digests (#187, #189). - Agent: the Worker is split into command handlers and a per-agent context (steps a0–a5, b1–b4, d; #162, #163, #192–#195). A
CommandDispatcherroutes each server action to its own handler class: execute, winget, tasks, Vision and capabilities, exam, file transfer, power, messages and more.CapabilityGatesends everycapability_deniedfrom one place. The connection loop, the sender and the tray message routing have their own classes. The agent's folders, runtime state (capabilities, modules, credentials, server trust, HTTP client, update state), the machine seams (firewall, kiosk, exam, file transfer) and the DNS policy monitor are instances held by oneAgentContextinstead of statics.Worker.csshrinks from 2,203 to about 710 lines. Behaviour is unchanged. Two small additions: the exam handler releases its resources when the agent stops, and the network change listener is removed when the Worker stops. Design note:docs/design/worker-split.md. - Agent tests run in parallel by default. Only classes that open real processes, pipes or sockets run serially; the shared-state collection is gone, because no test changes a process-wide static any more. A guard test fails CI when a parallel class touches mutable static state, and a second one when product code in
POpsAgentorPOps.Sharedadds a mutable static. Both ignore the hit counters that code coverage adds in CI. CI ran 1,479 tests on .NET 10 and 81 on the .NET Framework 4.7.2 MSI actions. - Exam mode: the server sends its own time.
exam_modenow carriesnow(unix seconds) next tountil. Agents from 0.1.24 takeuntil - nowas the time left and count it on a monotonic clock, so a PC clock that is ahead no longer refuses the exam and one that is behind no longer lengthens it. Older agents ignore the field. Schema, example and protocol README updated. - Docs: release rhythm stated as it is. README, README.tr, ROADMAP and the code-signing page said releases come out weekly, but 0.1.22 and 0.1.23 came out on the same day. They now say at most one planned release a week, with security fixes in between.
- Docs: tool scripts. The docstrings of
tools/agent_simulator.py,tools/bench_charts.py,tools/html_sinks/check_html_sinks.pyandtools/sign_release.pygive Python 3.10+ (the oldest version CI tests) andpython3 tools/…examples that run from the repository root. Thanks to @RajGahoi (#90). - Docs: Turkish contributions. CONTRIBUTING has a short Turkish section, Türkçe katkı, and README.tr links the
good first issueand newtürkçelabels. Ten first issues are written in Turkish (translations of the FAQ, backup, troubleshooting and quick start guides; a Pardus test of the Linux agent; a spelling and terminology check of the panel's Turkish; a glossary; an exam mode guide for teachers; first-impression feedback on the demo; a review of the pilot school guide). - Backups: weekly retention.
pops-backupnow keeps the newestKEEP_MINbackups (3), every backup younger thanKEEP_DAYSdays (now 7, was 14;0turns the rule off) and the newest backup of each of the lastKEEP_WEEKLYweeks (4), and deletes the rest. Each backup carries the agent packages kept on the server (about 80 MB per agent version), so with 14 nightly copies the folder kept growing. On a small disk,KEEP_DAYS=0keeps the last 3 nights plus 4 weekly backups. An existingbackup.confwithKEEP_DAYS=14still keeps two weeks. CI checks the rules on dated folders. - Docs: README and README.tr describe 0.1.23.
- Features and how it works: new feature rows for exam mode, file transfer, winget, power actions and messages, Vision v2, organisational units, directory and OIDC sign-in, modules, the GLPI export and several workers with Redis. "How it works" covers the Redis workers, the Linux agent and
X-Agent-Features. - Security and transparency: the SSO safeguards, tenancy, file transfer tokens, exam mode as a notice (not proctoring), the notices for power actions and messages, the locked-PC Vision banner and every capability switch.
- Also: the lab peer cache, updated requirements and known limitations, the Linux and Pardus status, 0.1.22 and 0.1.23 in the release history, test counts from the release CI run, and new screenshots from the public demo (
screenshots/v0.1.23/).
- Features and how it works: new feature rows for exam mode, file transfer, winget, power actions and messages, Vision v2, organisational units, directory and OIDC sign-in, modules, the GLPI export and several workers with Redis. "How it works" covers the Redis workers, the Linux agent and
- Docs: SECURITY.md lists the 0.1.23 controls and four new residual risks: the peer cache port when enabled, Redis inside the trust boundary in multi-worker mode, trust in the directory or SSO provider, and fetched files kept for 7 days.
- Docs: CONTRIBUTING.md's repository layout and CI tables match
ci.yml(Linux agent jobs, the Redis job, fuzzing, the lock check, JavaScript unit tests, pytest).
Removed
- The 14 old panel screenshots in
screenshots/light/; nothing linked to them since the README moved toscreenshots/v0.1.23/.
Fixed
- Panel: the PC page's file buttons with
?tab=files. Opening a PC page directly on the files tab stopped the
page's script before the buttons were wired, so Dosya gönder and Dosya al did nothing (#198). - Panel: the MAC address on the PC page. The General tab read a field the device list never has, so it always
showed "—"; it now comes from the hardware inventory (#198). - Panel: the running version after a manual install. The server stored the running version only from an
update result, so a PC whose agent was installed or downgraded by hand kept showing the old version. The version
the agent announces when it connects is now stored as well (#197, found in the 0.1.24 field test). - winget: "different install technology" is a failure. winget answers
0x8A15002Bboth for "already up to
date" and when the requested version uses another install technology than the installed one (for example an MSI
over an exe install). In the second case nothing was installed but the task showed Tamamlandı; it is now
Başarısız (#197). - Agent uninstall log. The firewall clean-up script no longer lets PowerShell progress records split the result
line in the MSI log (#197). - Agent: uninstalling removes every POps firewall rule. The MSI's uninstall deletes the quarantine, exam mode and
peer cache rules (and the unnamed rules of agents before 0.1.4), turns the firewall profiles that were off before a
quarantine or exam back off, and deletes the quarantine and exam state files. A PC uninstalled during a quarantine
or an exam is no longer left without network. An upgrade or rollback keeps the rules (#196). - Agent: the exam length no longer depends on the PC clock. The agent counts from the server's
nowon a
monotonic clock, so a changed PC clock cannot shorten or lengthen an exam; it is at most 8 hours, also after a
restart (#196, server side #158). - Agent: winget installs use only the winget source.
--source wingetkeeps the msstore source out under
LocalSystem. A package without a machine-wide installer (0x8A150010) is retried once without--scope machine,
and the result's first line says which scope was used. Such a package probably installs into the SYSTEM profile,
where students do not see it (#196). - Agent: power results say what really happened. Lock and sign-out report after acting, with the Win32 error code
on failure. A shutdown or restart thatshutdown.exerefuses is reported as[HATA]with its exit code, the task
isFailedand the PC stays on; before, the agent reported[TAMAM]just before acting (#196). - Agent: large file transfers no longer stop after 100 seconds. File transfers have their own HTTP client: a
transfer stops only after 2 minutes without data or 2 hours in total (#196). - Agent: no BITS when the server CA is pinned. With
SERVER_CA_CERTset the agent downloads updates directly,
because BITS cannot use the pinned CA; that saves about 10 minutes per update (#196). - Peer cache in labs with public IPv4 addresses. The server now offers a PC's own public IPv4 address as a peer
(fromX-Agent-Peer-Cacheor the inventory; a public connection address is still not used, as it is usually the
school's NAT), and the agent accepts peers on its own subnets, private or public. Before, such labs silently got
no peers (#196). - Vision: a thumbnail reaches the panel with only its documented fields. The server passed the agent's
thumbnailmessage on to the admin panels as it came, apart from settinghw_idfrom the connection. An agent could add apc_namenaming another PC. The panel reads onlyhw_id, so nothing was shown under the wrong PC, but the server's rule is that no agent message reaches the panel in another device's name. Found by theagent_wsfuzz target; the input is now in its regression corpus. - Docs: stale facts after 0.1.23. Getting started, the Turkish "Neden POps?" guide and the positioning page no longer say there is no Linux agent or no directory sign-in. The Veyon guide lists the peer cache port and points to Sistem → Modüller. The quick start shows the language switch, every capability property and the Linux
.deb. The Linux agent README no longer says Mesaj gönder sends the Windowsmsgcommand. ROADMAP no longer lists directory sign-in under Later. - Sistem: an agent that is installing an update shows as updating, not off. The agent's service is stopped during the install, so the PC looked offline and the card said "Hepsi kapalı". PCs with an update in flight are now counted as "güncelleniyor", and "eski ajanı güncelle" doesn't send to them again.
Security
- PHP2Shell (CVE-2026-109618, CVE-2026-109619): the Docker panel image moves to PHP 8.3.36. Both flaws in PHP
itself allow unauthenticated remote code execution on any PHP that serves web requests (CVSS 9.2–9.8; exploitation
attempts reported since 21 October 2026). The panel image runs Apache with mod_php, the setup PHP rates as most exposed.
docker/dashboard.Dockerfilepins the patchedphp:8.3-apache. Installations with the distribution's PHP (the
install.shlayout) must update their PHP packages and restart PHP-FPM: AlmaLinux/RHEL 9dnf update 'php*'
(fixed in8.0.30-8.el9_8.alma.1), Debian/Ubuntuapt upgrade. Until then PHP's own stop-gap is
session.upload_progress.enabled=0plusmemory_limit=-1set where the application cannot override it (with a
container or cgroup memory limit as the boundary); updating is the only complete fix. Docker images from the 0.1.23-alpha release still carry PHP 8.3.35: rebuild withdocker compose build dashboardor wait for the next release. The demo server was rebuilt and its host PHP updated on 22 October.