• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

zentralopensource / zentral / 39417527296
91%

Build:
DEFAULT BRANCH: main
Ran 20 Oct 2026 11:57AM UTC
Jobs 1
Files 1045
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

20 Oct 2026 11:23AM UTC coverage: 91.016% (+0.08%) from 90.933%
39417527296

push

github

np5
turbo: type the scheduling actions, and retire their permissions

createOneTimeJob, updateOneTimeJob and deleteOneTimeJob, and
createRecurringJob, updateRecurringJob and deleteRecurringJob, are typed
PBAC actions now.

A create action takes the CONFIGURATION as its resource, because the
schedule does not exist yet. An update or a delete action takes the
SCHEDULE. A schedule is a member of its configuration, so one policy on a
configuration covers the six actions. A schedule also carries the job that
it runs, so an update or a delete policy can read resource.job. The six
actions have the JOB as an entity in context.job, so one policy can name
them all:

  forbid (
    principal,
    action in [Turbo::Action::"createOneTimeJob",
               Turbo::Action::"updateOneTimeJob",
               Turbo::Action::"deleteOneTimeJob"],
    resource
  ) when { context.job.kind == "file_export" };

An entity, not a kind string: context.job.kind gives what a job_kind key
gives, and a policy can read any attribute that the job declares later,
with no change to the actions. The values of the kind stay declared on the
kind attribute of Turbo::Job.

Every kind is covered, not only the sysdiagnose and the file export. A
script runs any code as root, and add_onetimejob did not tell it from an
mSCP check. The two schedule models are covered in one step: with only the
one-time jobs typed, a role with turbo.add_recurringjob could still
schedule a recurring script in a configuration that a policy refused.

The add, change and delete permissions of the two schedule models map to
no action now (JobScope.pbac_excluded_default_permissions), so nothing can
ask these actions through has_perm with System::"any" and an empty context.
The view permissions stay: a typed view action must scope a list, which
means a policy filters a queryset instead of a decision on one request.
That is separate work, and a test keeps them mapped. Only our own servers
have the Turbo module, so no role ... (continued)

202 of 202 new or added lines in 11 files covered. (100.0%)

3 existing lines in 2 files now uncovered.

53422 of 58695 relevant lines covered (91.02%)

0.91 hits per line

Coverage Regressions

Lines Coverage ∆ File
2
99.6
0.08% zentral/contrib/turbo/models.py
1
98.44
0.0% zentral/contrib/turbo/wire.py
Jobs
ID Job ID Ran Files Coverage
1 39417527296.1 20 Oct 2026 11:57AM UTC 1045
91.02
GitHub Action Run
Source Files on build 39417527296
  • Tree
  • List 1045
  • Changed 24
  • Source Changed 22
  • Coverage Changed 23
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #39417527296
  • 74c42f6b on github
  • Prev Build on main (#39413616672)
  • Next Build on main (#39421476315)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc