Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
4605 commits
Select commit Hold shift + click to select a range
38e1750
improvements to infra notice
github-actions[bot] Sep 19, 2026
970872e
Merge pull request #658 from kris6673/fix/autopilot-add-device-batch-…
github-actions[bot] Sep 19, 2026
0b15905
new license report
github-actions[bot] Sep 19, 2026
44164f3
Merge pull request #661 from luimen6/feat/mfa-alert-new-user-grace
github-actions[bot] Sep 19, 2026
a27e7ef
Merge pull request #662 from luimen6/feat/sharepoint-bulk-add-members
github-actions[bot] Sep 19, 2026
ad3cf63
Merge pull request #659 from luimen6/feat/onboarding-tenant-groups
github-actions[bot] Sep 19, 2026
735d428
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Sep 19, 2026
ca5f2f1
fixes preprovision onedrive
github-actions[bot] Sep 19, 2026
1e751d1
Merge pull request #664 from luimen6/feat/user-template-sharepoint-sites
github-actions[bot] Sep 19, 2026
b99fb36
fixes permissions
github-actions[bot] Sep 19, 2026
8412808
update alert emails for baselines
github-actions[bot] Sep 19, 2026
09af032
Merge pull request #665 from luimen6/feat/teams-channel-sites
github-actions[bot] Sep 20, 2026
8e84f8a
Merge pull request #656 from CyberDrain/preview/mcptokenfixes
github-actions[bot] Sep 20, 2026
7059540
Merge pull request #604 from Aaronkatz0/feat/hudu-laps-bitlocker
github-actions[bot] Sep 20, 2026
9023a0e
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Sep 20, 2026
d1a8658
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Sep 20, 2026
ac80d73
add reasoning for ninjaone non compliant device.
github-actions[bot] Sep 20, 2026
37410ee
disable alerts
github-actions[bot] Sep 20, 2026
f0c15fb
remove alpha marker
github-actions[bot] Sep 20, 2026
11cfe85
Merge pull request #667 from CyberDrain/chore/openapi-spec-update-202…
github-actions[bot] Sep 21, 2026
880a5a4
Merge pull request #669 from CyberDrain/chore/permissions-translator-…
github-actions[bot] Sep 21, 2026
0cabc13
Merge pull request #672 from CyberDrain/feature/security-simulations
github-actions[bot] Sep 21, 2026
a44e4f7
fixes scenarios
github-actions[bot] Sep 21, 2026
b5579d6
feat(logs): add server-side API filter to logbook
github-actions[bot] Sep 21, 2026
0e833ec
fix(devicePrep): apply enrollment-time group via Graph action
github-actions[bot] Sep 21, 2026
a1e8c66
add amdx resolver
github-actions[bot] Sep 21, 2026
bd1ed60
Fix duplicate template JSON keys
github-actions[bot] Sep 22, 2026
c7ad84e
fix(api): validate report query parameters
github-actions[bot] Sep 22, 2026
8a4a950
chore: api spec description updates
github-actions[bot] Sep 22, 2026
d7c24f7
Merge pull request #684 from kris6673/feat/autopilot-profile-assignme…
github-actions[bot] Sep 22, 2026
dd74130
fix(settings): clarify access check refresh
github-actions[bot] Sep 22, 2026
fc5d670
Merge pull request #686 from kris6673/feat/hudu-pim-eligible-roles
github-actions[bot] Sep 22, 2026
bec371e
Merge pull request #674 from kris6673/fix/user-template-default-attri…
github-actions[bot] Sep 22, 2026
178334a
universal search improvements.
github-actions[bot] Sep 22, 2026
474b0a5
update alert management
github-actions[bot] Sep 22, 2026
e168c5d
fix(webhooks): dedupe audit log claims by event time
github-actions[bot] Sep 22, 2026
0243f8d
feat(defender): cache TVM export URLs
github-actions[bot] Sep 22, 2026
618e855
fix(mcp): pre-authorize clients and split URIs
github-actions[bot] Sep 22, 2026
a52deb6
Merge pull request #695 from CyberDrain/fix/baseline-migration-value-…
github-actions[bot] Sep 22, 2026
5f90449
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Sep 22, 2026
fe2ebd1
Add or update the Azure App Service build and deployment workflow config
KelvinTegelaar Sep 22, 2026
511a60a
Security Simulations: never carry a null entry in the situation, find…
github-actions[bot] Sep 22, 2026
a10b518
fix(settings): remove invalid Timestamp filter clause
github-actions[bot] Sep 23, 2026
046aeff
fix(tests): use ExoExternalInOutlook cache for external tag tests
github-actions[bot] Sep 23, 2026
7272945
fix(setup): clear cached tokens after refresh token update
github-actions[bot] Sep 23, 2026
57474cd
bump default logs returned to 2k from 400
github-actions[bot] Sep 23, 2026
41d2f38
perf(mem): stream export-backed mem reports
github-actions[bot] Sep 23, 2026
7ad2eaa
Merge pull request #708 from kris6673/fix/setauthmethod-select-unwrap
github-actions[bot] Sep 23, 2026
aa0cecd
feat(conditional): clone CA templates to detach them from template li…
github-actions[bot] Sep 23, 2026
00b5da0
Merge pull request #710 from CyberDrain/feat/template-sync-ux
github-actions[bot] Sep 23, 2026
e30828d
Merge pull request #490 from CyberDrain/preview/bec-case-workflow
github-actions[bot] Sep 23, 2026
04fe31b
Merge pull request #497 from CyberDrain/preview/server-side-pdf-reports
github-actions[bot] Sep 23, 2026
2e40192
s
github-actions[bot] Sep 23, 2026
a8288aa
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Sep 23, 2026
002be1d
refactor(identity): move Business Email Compromise under Identity > A…
github-actions[bot] Sep 23, 2026
90cfde1
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Sep 23, 2026
6a21cf1
Merge pull request #694 from MartinRain/fix/halopsa-alert-consolidation
github-actions[bot] Sep 23, 2026
d34447a
refactor(scheduler): extract orchestrator priority resolution
github-actions[bot] Sep 24, 2026
fbf4791
enhance(graph-requests): add endpoint blocking checks for Graph requests
github-actions[bot] Sep 24, 2026
8982938
fix(graph-requests): harden Graph endpoint blocklist against encoding…
github-actions[bot] Sep 24, 2026
259af44
Update openapi.json
github-actions[bot] Sep 24, 2026
96b86a7
fix(ninjaone): stop queuing no-op CVE sync orchestration
github-actions[bot] Sep 24, 2026
1a5748e
fix(standards): grade app consent reviewers by presence, not count
github-actions[bot] Sep 24, 2026
5f6dc33
fix(graph): stop endpoint blocklist guard leaking $false into results
github-actions[bot] Sep 24, 2026
7eac3bc
feat(sharepoint): enhance site template deployment with channels and …
github-actions[bot] Sep 24, 2026
2f05f45
Update Get-NormalizedError.ps1
github-actions[bot] Sep 24, 2026
4cadcdc
fix(alerts): scan 30 days of quarantine for pending release requests
github-actions[bot] Sep 24, 2026
484ac8b
Update openapi.json
github-actions[bot] Sep 24, 2026
c3a26cc
fix(gradient): sync licence counts from the reporting DB cache
github-actions[bot] Sep 24, 2026
7e68135
fix(msp-apps): repackage Huntress with the vendor's current v2 instal…
github-actions[bot] Sep 24, 2026
aef3778
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Sep 24, 2026
18f5184
Delete cachebpav2 since BPA is now removed
github-actions[bot] Sep 24, 2026
10120bb
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Sep 24, 2026
b6f87d8
fix(baselines): expand excluded group ids to member tenants
github-actions[bot] Sep 24, 2026
3219e5a
fix(baselines): clean EXO edits and clear stale flag
github-actions[bot] Sep 25, 2026
94cb146
fix(Get-CIPPAlertMFAAlertUsers): improve handling of new user grace p…
github-actions[bot] Sep 25, 2026
2565062
fix(alerts): omit email attachments that push sendMail over 4MB
github-actions[bot] Sep 25, 2026
53a5bd4
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Sep 25, 2026
ebf2f2e
version up
github-actions[bot] Sep 25, 2026
1677122
fix(scheduler): convert hashtable input in Add-CIPPScheduledTask
github-actions[bot] Sep 25, 2026
da9f580
Update openapi.json
github-actions[bot] Sep 25, 2026
6826fba
test(graph): stub endpoint blocklist guard in Get-GraphRequestList pa…
github-actions[bot] Sep 25, 2026
0e01d18
chore(docs): refresh published docs page snapshot from llms.txt
github-actions[bot] Sep 25, 2026
fd1bc00
fix(logs): make log retention cleanup keep up on large log tables
github-actions[bot] Sep 25, 2026
4ff149c
fix(scheduler): store ScheduledTime as string on RunNow
github-actions[bot] Sep 25, 2026
4e11b3a
fix(bec): stop Microsoft and IPv6 addresses cascading into false atta…
github-actions[bot] Sep 26, 2026
a3852e6
feat(api): document dual GET/POST for read endpoints with body fields
github-actions[bot] Sep 26, 2026
da8ca03
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Sep 27, 2026
edd4ed6
feat(alerts): enhance task alert display title handling
github-actions[bot] Sep 28, 2026
93125b1
feat(reporting): enhance callout rendering with height fitting logic
github-actions[bot] Sep 28, 2026
5d290c5
Revert "fix(auth): check granted SAM permissions instead of CIPP's sa…
github-actions[bot] Sep 28, 2026
139faba
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Sep 28, 2026
91a2fcf
fixes baselines max stages and app consents
github-actions[bot] Sep 28, 2026
dfc8835
fixes migration of groups, as this is now also a multi-prop.
github-actions[bot] Sep 28, 2026
4e84a91
fixes scenarios
github-actions[bot] Sep 28, 2026
587b80e
fixes name translations
github-actions[bot] Sep 28, 2026
a96e6d8
fix(ninjaone): drop rejected user batches and apply CA role exclusions
github-actions[bot] Sep 28, 2026
bf5c80e
fix(sam-cert): only prune this instance's own KV certs
github-actions[bot] Sep 28, 2026
bb72f78
fix(license-recommendation): exclude opaque add-ons from consolidation
github-actions[bot] Sep 28, 2026
8d87304
feat(standards): add EWS allowed applications standard
github-actions[bot] Sep 28, 2026
3478e9e
feat(stats): add baseline usage counts to stats payload
github-actions[bot] Sep 28, 2026
1e51056
build: add version bump script, bump to 11.0.1
github-actions[bot] Sep 28, 2026
2126c4b
chore(openapi): simplify template check response schema
github-actions[bot] Sep 28, 2026
d1a9756
fix(openapi): ensure unique operationIds for dual-method endpoints
github-actions[bot] Sep 28, 2026
23e1c29
perf(dbcache): cap the collection shape sample at 10 rows
github-actions[bot] Sep 29, 2026
35a697d
perf(dbcache): stop waiting on Intune exports and rebalance queue bands
github-actions[bot] Sep 29, 2026
d6e86ac
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into feat/sp…
github-actions[bot] Sep 29, 2026
c21edb7
perf(dbcache): stream the mailbox cache and cut its allocation
github-actions[bot] Sep 29, 2026
c107954
Update openapi.json
github-actions[bot] Sep 29, 2026
41a6f64
fix(dbcache): store the collection shape as a plain string
github-actions[bot] Sep 29, 2026
ca2be6c
Update openapi.json
github-actions[bot] Sep 29, 2026
9157130
feat(updates): show the scheduled restart time in the out-of-date alert
github-actions[bot] Sep 29, 2026
22b9a54
fix(groups): retry license assignment while a new group replicates
github-actions[bot] Sep 29, 2026
f41c960
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Sep 29, 2026
abe6073
fix(bec): judge password resets and MFA-stopped sign-ins on evidence
github-actions[bot] Sep 29, 2026
d790123
Update openapi.json
github-actions[bot] Sep 29, 2026
9892780
feat(bec): take approved vacation-mode travel into the location verdicts
github-actions[bot] Sep 29, 2026
b82717d
Merge pull request #767 from CyberDrain/chore/docs-published-pages-up…
github-actions[bot] Sep 29, 2026
8b98607
fix: quarantine alert release request error
github-actions[bot] Sep 29, 2026
73f0878
fix(baselines): edge-trigger remediation alerts and report failed wri…
github-actions[bot] Sep 29, 2026
6506a28
perf(reports): read AllTenants report data once, scoped to the caller…
github-actions[bot] Sep 29, 2026
389cb19
fix(license-recommendation): removal candidates crashed the report
github-actions[bot] Sep 29, 2026
cc4e76d
feat: MS365 Service Health Page
github-actions[bot] Sep 30, 2026
be72298
chore(timers): Start caching and lighter tasks earlier
github-actions[bot] Sep 30, 2026
b5daad6
perf(ninjaone): cut tenant sync memory and runtime
github-actions[bot] Sep 30, 2026
1d19c98
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Sep 30, 2026
e50bcdf
CASMailboxSMTPAuth
github-actions[bot] Sep 30, 2026
28b56ca
Update openapi.json
github-actions[bot] Sep 30, 2026
906d4ba
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Sep 30, 2026
e968a11
fix(gradient): reuse one HTTP connection per licence sync run
github-actions[bot] Sep 30, 2026
e117abc
perf(gradient): read the service catalogue once per licence sync run
github-actions[bot] Sep 30, 2026
666dea3
fix(extensions): check the Hudu and NinjaOne APIs before syncing
github-actions[bot] Sep 30, 2026
3bcaa36
feat(bec): run each investigation phase as its own sequential job
github-actions[bot] Sep 30, 2026
1e9ec09
fix(baselines): a stage with no standards no longer returns a null entry
github-actions[bot] Sep 30, 2026
466cf97
fix: switch to api calls on table
github-actions[bot] Oct 1, 2026
be1b13e
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Oct 1, 2026
246c075
macosx support
github-actions[bot] Oct 1, 2026
d18be76
fixes issue with tests and baseline exlcusion reporting
github-actions[bot] Oct 1, 2026
09f7224
fixes join of strings
github-actions[bot] Oct 1, 2026
bc73f01
fixes shortcut looping and makes it multipost
github-actions[bot] Oct 1, 2026
40ee81f
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Oct 1, 2026
6f00f7e
add conditional feature flag enablement
github-actions[bot] Oct 1, 2026
ee83086
feat(manifest): add new scope entry to SAMManifest.json
github-actions[bot] Oct 1, 2026
220dfe4
fix(licenses): resolve SKU names from a point-lookup table instead of…
github-actions[bot] Oct 2, 2026
f0ed0fb
Update openapi.json
github-actions[bot] Oct 2, 2026
9c75e17
refactor(Invoke-ListCopilotUsage): streamline report fetching with Ge…
github-actions[bot] Oct 2, 2026
54cf04e
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Oct 2, 2026
5962d47
Update openapi.json
github-actions[bot] Oct 2, 2026
a3ee269
Update Set-CIPPDBCachePIMSettings.ps1
github-actions[bot] Oct 2, 2026
a983fdc
chore: add lastPasswordChangeDateTime to the user cache
github-actions[bot] Oct 2, 2026
9d48196
fix(dbcache): schedule baseline-read activity timeout and SMTP AUTH o…
github-actions[bot] Oct 2, 2026
670c7df
chore: remove deprecated endpoint from caching
github-actions[bot] Oct 2, 2026
43380dd
fix(standards): correct the device retirement days range in the helpe…
github-actions[bot] Oct 2, 2026
9e6e499
fix(baselines): record a skipped self-gating remediation as Compliant
github-actions[bot] Oct 2, 2026
5b317ae
perf(sharepoint): request only the cached fields in the per-site SPOS…
github-actions[bot] Oct 2, 2026
ffcc289
feat(notifications): gate Push on enrolment and point forms at Prefer…
github-actions[bot] Oct 2, 2026
3374abc
chore: bump version to 11.0.2
github-actions[bot] Oct 2, 2026
fad8e49
perf(exchange): reduce PowerShell churn in EXO bulk requests
github-actions[bot] Oct 2, 2026
28750b7
fix(ci): clear the audit, analyzer and test failures on the hotfix PR
github-actions[bot] Oct 2, 2026
f0fb147
fix(tables): open AllTenants row links scoped to the row's tenant
github-actions[bot] Oct 5, 2026
281a628
fix(baselines): resolve variables in group template names before matc…
github-actions[bot] Oct 5, 2026
7854e90
fix(mfa): surface the Entra error when the MFA connector token fails
github-actions[bot] Oct 5, 2026
2a5062b
fix(alerts): keep storage quota alert snoozes matching across runs
github-actions[bot] Oct 5, 2026
0adb4e3
fix(sharepoint): apply the version policy to existing libraries and s…
github-actions[bot] Oct 5, 2026
0b92c52
fix to use exclusions etc
github-actions[bot] Oct 5, 2026
a9c3c7d
Merge pull request #732 from TechSG-Martin/feat/license-pricing-csv
github-actions[bot] Oct 5, 2026
424593a
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Oct 5, 2026
3be4565
Update openapi.json
github-actions[bot] Oct 5, 2026
56ca1fd
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Oct 5, 2026
37c1e4c
chore(hudu): bump vendored HuduAPI module to 4.1.0.1
github-actions[bot] Oct 5, 2026
cec5b7b
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Oct 5, 2026
18813e2
Merge pull request #825 from Renada-Solutions/feat/scheduled-items-re…
github-actions[bot] Oct 5, 2026
40b2e28
feat(vacation): add tenant vacation defaults & usageLocation default
github-actions[bot] Oct 5, 2026
e02149b
fix(community-repos): refuse adds GitHub cannot resolve and clear gho…
github-actions[bot] Oct 5, 2026
b8ba104
fix(halo): key consolidated tickets on the task, not the title
github-actions[bot] Oct 5, 2026
06b756b
feat(autopilot): assign profiles to groups with exclusions, grade ass…
github-actions[bot] Oct 6, 2026
e31d74a
Merge pull request #817 from CyberDrain/chore/docs-published-pages-up…
github-actions[bot] Oct 6, 2026
f498f4e
test(auth): pin built-in and custom role permissions and their access…
github-actions[bot] Oct 6, 2026
d34e8a2
perf(tests): drop per-user pipelines from ZTNA21811 and Copilot readi…
github-actions[bot] Oct 6, 2026
53bf55b
fix(mfa): give the MFA connector its own app management exemption
github-actions[bot] Oct 6, 2026
7783ee5
feat(hudu): per-tenant opt-out of LAPS and BitLocker sync
github-actions[bot] Oct 6, 2026
42c37cd
fix(tenant-selector): sort favourite tenants alphabetically
github-actions[bot] Oct 6, 2026
5009a1e
feat(vacation): add users to groups for the vacation period
github-actions[bot] Oct 6, 2026
c221072
refactor(hudu): build device hash material without +=
github-actions[bot] Oct 6, 2026
d6332f1
fix(baselines): count license-skipped standards as aligned for stage …
github-actions[bot] Oct 6, 2026
4393b2f
feat(transport): template mode on the rule editor; variables resolve …
github-actions[bot] Oct 6, 2026
63bf9a2
feat(exchange): add support for custom mailbox attributes management
github-actions[bot] Oct 7, 2026
720f3f2
Merge pull request #846 from kris6673/feat/dashboard-service-health
github-actions[bot] Oct 7, 2026
4037aa7
Update openapi.json
github-actions[bot] Oct 7, 2026
45cf27a
Update openapi.json
github-actions[bot] Oct 7, 2026
a34156b
refactor(exchange): qualify regex options
github-actions[bot] Oct 7, 2026
df10be4
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Oct 7, 2026
9428cbd
new ondrive alert
github-actions[bot] Oct 7, 2026
7d468b0
fix(baselines): store baseline result JSON columns as plain strings
github-actions[bot] Oct 7, 2026
b247c63
chore(openapi): type baseline storage fields
github-actions[bot] Oct 7, 2026
2c8f336
refactor(http): log API access once in the dispatcher
github-actions[bot] Oct 7, 2026
3b793d8
Update openapi.json
github-actions[bot] Oct 7, 2026
5edce6a
feat(realtime): live queue and job progress over Craft SSE
github-actions[bot] Oct 8, 2026
10430e2
docs(identity): document JIT Admin approval
github-actions[bot] Oct 8, 2026
33574e9
Merge pull request #856 from CyberDrain/chore/docs-published-pages-up…
github-actions[bot] Oct 8, 2026
87471ec
fixes bug with encrypted values
github-actions[bot] Oct 8, 2026
031a029
updated appdeploy
github-actions[bot] Oct 8, 2026
62814d3
add group ownership removal
github-actions[bot] Oct 8, 2026
296afb2
fix(tests): grade security simulations against secure values the scen…
github-actions[bot] Oct 8, 2026
d2d407a
perf(tests): grade each security simulation standard once
github-actions[bot] Oct 8, 2026
6a806d6
fix(templates): hash standards templates containing scalar arrays or …
github-actions[bot] Oct 8, 2026
96a1827
fix: match superadmin role alert exactly not lazily
github-actions[bot] Oct 8, 2026
6725b14
fix(standards): grade every MOERA domain for DMARC and alert only on …
github-actions[bot] Oct 8, 2026
528b33a
fix(applications): wait for a new service principal before granting p…
github-actions[bot] Oct 8, 2026
57ec64e
feat(baselines): add mailbox default audit set standard
github-actions[bot] Oct 8, 2026
9a1fbbf
feat(baselines): add mailbox default audit set standard
github-actions[bot] Oct 8, 2026
b1ae0bd
feat(pwpush): Add first party CIPPPwPush module
github-actions[bot] Oct 8, 2026
dcdcb17
test: fix locale-dependent signing cert expiry and stale Hudu credent…
github-actions[bot] Oct 9, 2026
8d307c7
test(tests): cover combined authentication flow transfer methods in C…
github-actions[bot] Oct 9, 2026
e93caf6
fix(baselines): disable and delete accounts with delegated permissions
github-actions[bot] Oct 9, 2026
cc63dca
fix(tests): normalise numeric SharePoint sharing enums in CIS 7.2.3, …
github-actions[bot] Oct 9, 2026
0ad43fc
fix(cache): report a skipped duplicate cache run instead of claiming …
github-actions[bot] Oct 9, 2026
cac78d2
fix(standards): report a skipped duplicate standards run instead of c…
github-actions[bot] Oct 9, 2026
034f0d2
ci(baselines): generate a combined baseline standards JSON for standa…
github-actions[bot] Oct 9, 2026
a25fa56
test(offboarding): keep offboarding options in sync across the valida…
github-actions[bot] Oct 9, 2026
16a2ea8
fix(baselines): update a transport rule the cache missed instead of f…
github-actions[bot] Oct 9, 2026
f8be07d
fix(identity): save JIT admin settings without a maximum duration aft…
github-actions[bot] Oct 9, 2026
580d17d
fix(api): return an error status when an endpoint's catch block fails
github-actions[bot] Oct 9, 2026
78479f8
Update openapi.json
github-actions[bot] Oct 9, 2026
c0b0715
token fix
github-actions[bot] Oct 9, 2026
77d7f24
fix(baselines): remove license gate on authentication methods
github-actions[bot] Oct 9, 2026
8a84d20
fix: add back in empty array
github-actions[bot] Oct 9, 2026
545c287
docs(api): document endpoint status codes and error-signalling helpers
github-actions[bot] Oct 9, 2026
d7c7ecf
feat(msp-apps): add NinjaOne to MSP vendor apps
github-actions[bot] Oct 9, 2026
a7abfb8
feat(branding): add option to turn off the cover image fade
github-actions[bot] Oct 9, 2026
1da5672
Update openapi.json
github-actions[bot] Oct 9, 2026
10c7b75
feat(halo): background auto-map with tenant ID and exact name matching
github-actions[bot] Oct 9, 2026
39f4537
feat(hudu): auto-map tenants via HaloPSA client and exact company name
github-actions[bot] Oct 9, 2026
cef067c
feat(conditional): add list custom variables for CA templates
github-actions[bot] Oct 10, 2026
bde9c62
new GSA deployment standard
github-actions[bot] Oct 10, 2026
2c9a206
Merge pull request #742 from kris6673/feat/teams-files-policy
github-actions[bot] Oct 10, 2026
6ed706f
feat(baselines): manage external meeting bots in the Teams meeting po…
github-actions[bot] Oct 10, 2026
49c4fba
feat(onedrive): allow a custom name when adding a OneDrive shortcut
github-actions[bot] Oct 10, 2026
f5149bc
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Oct 10, 2026
68d2615
fix(exchange): fall back to Get-MessageTraceV2 for GCC message traces
github-actions[bot] Oct 10, 2026
165773c
new baselines for EISCDA
github-actions[bot] Oct 10, 2026
2d81b61
Update openapi.json
github-actions[bot] Oct 11, 2026
30bfd59
perf(baselines): look up engine commands directly and cut exception c…
github-actions[bot] Oct 11, 2026
4118a5f
feat(baselines): filter the fleet overview by baseline and stage
github-actions[bot] Oct 11, 2026
839cb1c
fix(baselines): emit non-package standards from the stage helper
github-actions[bot] Oct 11, 2026
ac32d1c
fix(baselines): stop the unsaved-changes prompt when saving a new bas…
github-actions[bot] Oct 12, 2026
bc0acca
Merge pull request #876 from kris6673/feat/jit-approval-tenant-scope
github-actions[bot] Oct 12, 2026
5d4ead1
Fix push notification permission handling
github-actions[bot] Oct 12, 2026
abf357c
feat(sharepoint): show per-tenant storage table on AllTenants
github-actions[bot] Oct 12, 2026
b0d0ab3
perf(auditlog): cut directory loads and per-record cost in the rules …
github-actions[bot] Oct 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
Binary file added .DS_Store
Binary file not shown.
349 changes: 349 additions & 0 deletions .build/Add-OpenApiResponseSchemas.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,349 @@
#Requires -Version 7.0
<#
.SYNOPSIS
Enriches a CIPP openapi.json with typed 200 response schemas derived by static
analysis of the API and frontend repositories.

.DESCRIPTION
The generated CIPP spec types every request body but leaves every 200 response
as the generic StandardResults envelope. This stage fills typed per-endpoint
response schemas for the read surface, using two deterministic sources that are
already checked into the repositories (no live API calls):

1. Captured response shape baselines (CIPP/Tests/Shapes/*.json) - carry real
field types and nesting. Preferred when present.
2. Frontend table column declarations (simpleColumns in CIPP/src pages) -
carry field names only. Used when no baseline exists; fields are typed as
string and marked x-cipp-field-source: frontend so consumers know the type
is a name-only inference, not a verified type.

Endpoints with neither source keep the StandardResults envelope, which is the
correct shape for write/exec operations. Output is deterministic: the same input
repositories always produce a byte-identical spec.

.PARAMETER InputSpec
Path to the source openapi.json. Defaults to the repo-root spec relative to this
script (.build/.. ).

.PARAMETER OutputSpec
Path to write the enriched spec. Defaults to InputSpec (in-place rewrite).

.PARAMETER FrontendRepoPath
Path to a checkout of the CIPP frontend repository. Provides both the shape
baselines (Tests/Shapes) and the page column declarations (src).

.PARAMETER PassThru
Return the enriched spec object instead of only writing it. Used by tests.

.EXAMPLE
./Add-OpenApiResponseSchemas.ps1 -FrontendRepoPath ../CIPP

Rewrites the repo-root openapi.json in place with typed response schemas.
#>
[CmdletBinding()]
param(
[string]$InputSpec = (Join-Path $PSScriptRoot '..' 'openapi.json'),
[string]$OutputSpec,
[string]$FrontendRepoPath,
[switch]$PassThru
)

$ErrorActionPreference = 'Stop'

$script:CippHttpMethods = @('get', 'post', 'put', 'patch', 'delete')

function ConvertFrom-ShapeNode {
<#
.SYNOPSIS
Converts one node of a captured shape tree into an OpenAPI schema fragment.
#>
param($Node)

if ($Node -is [string]) {
switch ($Node) {
'string' { return @{ type = 'string' } }
'number' { return @{ type = 'number' } }
'bool' { return @{ type = 'boolean' } }
'datetime' { return [ordered]@{ type = 'string'; format = 'date-time' } }
# 'null' (captured as null at sample time) and 'truncated' (below the
# capture depth limit) carry no reliable type, so stay permissive.
default { return @{} }
}
}

if ($Node -is [System.Collections.IDictionary]) {
if ($Node['_type'] -eq 'array') {
return [ordered]@{ type = 'array'; items = (ConvertFrom-ShapeNode -Node $Node['_element']) }
}
$properties = [ordered]@{}
foreach ($key in ($Node.Keys | Sort-Object)) {
$properties[[string]$key] = ConvertFrom-ShapeNode -Node $Node[$key]
}
return [ordered]@{ type = 'object'; properties = $properties }
}

return @{}
}

function Get-ShapeBaselineMap {
<#
.SYNOPSIS
Maps endpoint name -> per-record OpenAPI schema, from captured shape baselines.
.DESCRIPTION
Reads only files carrying both _metadata and shape; the sibling
test-results.json and any non-baseline file is skipped. The per-record schema
is the baseline shape itself (the CIPP envelope's Results[] element).
#>
param([string]$ShapesDir)

$map = @{}
if (-not (Test-Path $ShapesDir)) {
Write-Warning "Shapes directory not found: $ShapesDir"
return $map
}

foreach ($file in (Get-ChildItem -Path $ShapesDir -Filter '*.json' | Sort-Object -Property FullName)) {
$doc = Get-Content -LiteralPath $file.FullName -Raw | ConvertFrom-Json -AsHashtable -Depth 100
if (-not ($doc -is [System.Collections.IDictionary] -and $doc.ContainsKey('_metadata') -and $doc.ContainsKey('shape'))) {
continue
}
$endpoint = $doc['_metadata']['endpoint']
if (-not $endpoint) { continue }
$map[$endpoint] = ConvertFrom-ShapeNode -Node $doc['shape']
}
return $map
}

function Get-FrontendColumnMap {
<#
.SYNOPSIS
Maps endpoint name -> sorted unique field names, from page simpleColumns.
.DESCRIPTION
Intent: skips conditional simpleColumns arrays to avoid non-column branch strings; false negatives beat junk fields.
Scans frontend page sources for files that pair an /api/<Endpoint> reference
with a simpleColumns array, and unions the declared column names per endpoint.
Field names are deterministic; their types are not, so callers type them as
string with a provenance marker.
#>
param([string]$SrcDir)

$map = @{}
if (-not (Test-Path $SrcDir)) {
Write-Warning "Frontend src directory not found: $SrcDir"
return $map
}

$endpointPattern = [regex]'/api/([A-Za-z0-9_]+)'
$columnsPattern = [regex]'(?s)\bsimpleColumns\s*(?:=|:)\s*(?:\{\s*)?\[(?<columns>[^\]]*)\]'
$stringPattern = [regex]'"([^"]+)"|''([^'']+)'''

$files = Get-ChildItem -Path $SrcDir -Recurse -File -Include '*.js', '*.jsx'
foreach ($file in $files) {
$text = Get-Content -LiteralPath $file.FullName -Raw
if ([string]::IsNullOrEmpty($text) -or $text -notmatch 'simpleColumns') { continue }

$endpoints = $endpointPattern.Matches($text) | ForEach-Object { $_.Groups[1].Value } | Sort-Object -Unique
if (-not $endpoints) { continue }

$columns = foreach ($colMatch in $columnsPattern.Matches($text)) {
foreach ($strMatch in $stringPattern.Matches($colMatch.Groups['columns'].Value)) {
$value = if ($strMatch.Groups[1].Success) { $strMatch.Groups[1].Value } else { $strMatch.Groups[2].Value }
if ($value) { $value }
}
}
if (-not $columns) { continue }

foreach ($endpoint in $endpoints) {
if (-not $map.ContainsKey($endpoint)) { $map[$endpoint] = [System.Collections.Generic.HashSet[string]]::new() }
foreach ($column in $columns) { [void]$map[$endpoint].Add($column) }
}
}
return $map
}

function ConvertTo-ColumnRecordSchema {
<#
.SYNOPSIS
Builds a per-record object schema from a set of frontend column names.
#>
param([System.Collections.Generic.HashSet[string]]$Columns)

$properties = [ordered]@{}
foreach ($column in ($Columns | Sort-Object)) {
$properties[$column] = [ordered]@{ type = 'string'; 'x-cipp-field-source' = 'frontend' }
}
return [ordered]@{ type = 'object'; properties = $properties }
}

function ConvertTo-ResponseEnvelopeSchema {
<#
.SYNOPSIS
Wraps a per-record schema in the CIPP { Results: [...], Metadata: {...} } envelope.
#>
param($RecordSchema)

return [ordered]@{
type = 'object'
properties = [ordered]@{
Results = [ordered]@{ type = 'array'; items = $RecordSchema }
Metadata = [ordered]@{ type = 'object' }
}
}
}


function Get-CippOperationId {
<#
.SYNOPSIS
Builds the deterministic operationId for one CIPP path and method.
.DESCRIPTION
Riftwing imports OpenAPI operations by operationId. CIPP upstream does not
currently emit operationIds, so this keeps importer keys stable without
depending on display labels or external data.
#>
param(
[Parameter(Mandatory)][string]$Path,
[Parameter(Mandatory)][string]$Method,
[Parameter(Mandatory)][string[]]$PathMethods
)

$endpointName = $Path -replace '^/api/', ''
if ($PathMethods.Count -eq 1) {
return $endpointName
}

$methodName = [System.Globalization.CultureInfo]::InvariantCulture.TextInfo.ToTitleCase($Method.ToLowerInvariant())
return "$methodName$endpointName"
}

function Add-CippOperationId {
<#
.SYNOPSIS
Injects missing operationIds and fails on duplicate operationIds.
.DESCRIPTION
Existing non-empty operationIds are preserved so this pass can retire itself
when upstream starts emitting operationIds. Duplicate operationIds are fatal
because importers commonly key operations by operationId.
#>
param([Parameter(Mandatory)][System.Collections.IDictionary]$Spec)

if (-not $Spec['paths']) { throw 'Spec has no paths.' }

$operationCount = 0
$injectedCount = 0
$operationIds = @{}

foreach ($pathEntry in $Spec['paths'].GetEnumerator()) {
$pathMethods = @($pathEntry.Value.Keys | Where-Object { $_ -in $script:CippHttpMethods })
foreach ($methodEntry in $pathEntry.Value.GetEnumerator()) {
if ($methodEntry.Key -notin $script:CippHttpMethods) { continue }

$operationCount++
$operation = $methodEntry.Value
$operationId = $operation['operationId']
if ([string]::IsNullOrWhiteSpace([string]$operationId)) {
$operationId = Get-CippOperationId -Path $pathEntry.Key -Method $methodEntry.Key -PathMethods $pathMethods
$operation['operationId'] = $operationId
$injectedCount++
}

if ($operationIds.ContainsKey($operationId)) {
throw "Duplicate operationId found: $operationId"
}
$operationIds[$operationId] = $true
}
}

return [pscustomobject]@{ Operations = $operationCount; Injected = $injectedCount; Unique = $operationIds.Count }
}

function Resolve-SpecResponse {
<#
.SYNOPSIS
Adds typed 200 response schemas to a parsed spec, in place, and returns counts.
.DESCRIPTION
The pure core of this stage: operates on an already-parsed spec hashtable and
the two endpoint maps, with no file or repository access, so it is unit
testable. Only existing 200 responses on get/post/put/patch/delete operations
are touched; everything else (including operations with no matching source) is
left exactly as found.
#>
param(
[Parameter(Mandatory)][System.Collections.IDictionary]$Spec,
[Parameter(Mandatory)][hashtable]$BaselineMap,
[Parameter(Mandatory)][hashtable]$ColumnMap
)

if (-not $Spec['paths']) { throw 'Spec has no paths.' }

$operationCount = 0
$typedCount = 0

foreach ($pathEntry in $Spec['paths'].GetEnumerator()) {
$endpoint = $pathEntry.Key -replace '^/api/', ''

$recordSchema = $null
if ($BaselineMap.ContainsKey($endpoint)) {
$recordSchema = $BaselineMap[$endpoint]
} elseif ($ColumnMap.ContainsKey($endpoint)) {
$recordSchema = ConvertTo-ColumnRecordSchema -Columns $ColumnMap[$endpoint]
}

foreach ($methodEntry in $pathEntry.Value.GetEnumerator()) {
if ($methodEntry.Key -notin $script:CippHttpMethods) { continue }
$operationCount++
if ($null -eq $recordSchema) { continue }

$responses = $methodEntry.Value['responses']
if ($null -eq $responses) { continue }

$okResponse = $responses['200']
if (-not $okResponse) { continue }

$okResponse['content'] = [ordered]@{
'application/json' = [ordered]@{ schema = (ConvertTo-ResponseEnvelopeSchema -RecordSchema $recordSchema) }
}
$typedCount++
}
}

return [pscustomobject]@{
Operations = $operationCount
Typed = $typedCount
}
}

function Add-CippResponseSchema {
<#
.SYNOPSIS
File-level orchestration: read spec + repo sources, enrich, write output.
#>
param(
[Parameter(Mandatory)][string]$InputSpec,
[Parameter(Mandatory)][string]$OutputSpec,
[Parameter(Mandatory)][string]$FrontendRepoPath,
[switch]$PassThru
)

if (-not (Test-Path $InputSpec)) { throw "Input spec not found: $InputSpec" }

$spec = Get-Content -LiteralPath $InputSpec -Raw | ConvertFrom-Json -AsHashtable -Depth 100
$baselineMap = Get-ShapeBaselineMap -ShapesDir (Join-Path $FrontendRepoPath 'Tests' 'Shapes')
$columnMap = Get-FrontendColumnMap -SrcDir (Join-Path $FrontendRepoPath 'src')

$operationIdResult = Add-CippOperationId -Spec $spec
$result = Resolve-SpecResponse -Spec $spec -BaselineMap $baselineMap -ColumnMap $columnMap
Write-Information "Operations: $($result.Operations) | typed responses added: $($result.Typed) | operationIds injected: $($operationIdResult.Injected) | unique operationIds: $($operationIdResult.Unique)" -InformationAction Continue

# Serialization is deterministic for the object this stage builds, but it does not globally canonicalize pre-existing spec keys.
[System.IO.File]::WriteAllText($OutputSpec, ($spec | ConvertTo-Json -Depth 100))

if ($PassThru) { return $spec }
}

# Run orchestration only when invoked as a script, not when dot-sourced for testing.
if ($MyInvocation.InvocationName -ne '.') {
if (-not $FrontendRepoPath) { throw 'FrontendRepoPath is required when running the script.' }
if (-not $OutputSpec) { $OutputSpec = $InputSpec }
Add-CippResponseSchema -InputSpec $InputSpec -OutputSpec $OutputSpec -FrontendRepoPath $FrontendRepoPath -PassThru:$PassThru
}
38 changes: 38 additions & 0 deletions .build/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# OpenAPI enrichment

`Add-OpenApiResponseSchemas.ps1` post-processes the generated CIPP `openapi.json`. It adds deterministic operationIds and typed `200` response schemas where response shape data can be derived from the CIPP frontend repository. It does not replace the upstream OpenAPI generator.

The enriched spec is published on each GitHub Release as the `openapi.enriched.json` release asset.

The PR check and release workflow strictly lint the CI-generated `openapi.enriched.json` with Redocly. The committed `.redocly.lint-ignore.yaml` baseline pins findings that already exist in the generated enriched spec because of upstream `openapi.json` issues. Any new Redocly error or warning that is not in the baseline fails CI.

To regenerate locally, check out the CIPP frontend repository and run:

```powershell
pwsh -NoProfile -File .build/Add-OpenApiResponseSchemas.ps1 `
-FrontendRepoPath <path-to-CIPP-frontend-checkout> `
-InputSpec ./openapi.json -OutputSpec ./openapi.enriched.json
```

If upstream `openapi.json` legitimately changes and the pinned Redocly findings must be refreshed, regenerate the enriched spec first, then regenerate the ignore baseline from that enriched output:

```powershell
pwsh -NoProfile -File .build/Add-OpenApiResponseSchemas.ps1 `
-FrontendRepoPath <path-to-CIPP-frontend-checkout> `
-InputSpec ./openapi.json -OutputSpec ./openapi.enriched.json
npx --yes @redocly/[email protected] lint ./openapi.enriched.json --generate-ignore-file
```

Do not generate the baseline from the base `openapi.json`. The lint subject is always the generated `openapi.enriched.json`.

## Known limitations

- Only `get`, `post`, `put`, `patch`, and `delete` operations are processed. `head`, `options`, and `trace` are not present in the current spec.
- Paths are assumed to start with `/api/`. All 580 current paths do.
- When a typed `200` response is added, it replaces the existing `200.content`. Today that content is only the generic `StandardResults` envelope.
- Conditional/ternary `simpleColumns` expressions are intentionally not parsed.

## Release workflow notes

- `openapi-enriched-release.yml` builds and uploads from the same tag. On `workflow_dispatch`, the `tag` input is checked out and used as the upload target. On `release: published`, the release tag is checked out and used as the upload target.
- `.github/workflows/` is gitignored in this repository, so the OpenAPI workflow files require `git add -f` when they are intentionally added or updated.
7 changes: 7 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
FUNCTIONS_WORKER_RUNTIME='powershell'
FUNCTIONS_WORKER_RUNTIME_VERSION='7.4'
AzureWebJobsStorage='DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNoBnZf6KgBVU4=;BlobEndpoint=http://azurite:10000/devstoreaccount1;QueueEndpoint=http://azurite:10001/devstoreaccount1;TableEndpoint=http://azurite:10002/devstoreaccount1;'
DEV_SKIP_BPA_TIMER='true'
DEV_SKIP_DOMAIN_TIMER='true'
FUNCTIONS_EXTENSION_VERSION='4'
NonLocalHostAzurite='true'
Loading