Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1829 commits
Select commit Hold shift + click to select a range
c9a19b3
fix(api-clients): accept legacy string Enabled values on API clients
github-actions[bot] Oct 27, 2026
5c74d3b
fix(domains): escape the DNS domain filter and check every row of a d…
github-actions[bot] Oct 27, 2026
7ff26b1
fix(variables): reject custom variable requests without a tenant and …
github-actions[bot] Oct 27, 2026
a4c3990
fix(hudu): refresh the shared relations cache without rewriting it on…
github-actions[bot] Oct 27, 2026
2814dbc
Merge pull request #1052 from kris6673/feat/jit-approver-email
github-actions[bot] Oct 27, 2026
58ab42f
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Oct 27, 2026
5a3e0e0
fix(security): scope template lists, CVE exceptions and refresh token…
github-actions[bot] Oct 27, 2026
46411a4
fix(identity): refuse JIT admin and user default template edits outsi…
github-actions[bot] Oct 27, 2026
14fd0d4
fix(identity): split ListUserPhoto into the caller's own photo and a …
github-actions[bot] Oct 27, 2026
9b9ef12
feat(baselines): report enterprise apps with no sign-in for a set num…
github-actions[bot] Oct 27, 2026
5ecb6de
Update openapi.json
github-actions[bot] Oct 27, 2026
62d4762
fix(baselines): apply authentication method exclude groups to every m…
github-actions[bot] Oct 27, 2026
ac1af24
fix(baselines): stop duplicate Conditional Access named locations and…
github-actions[bot] Oct 27, 2026
b997efb
Merge pull request #1057 from CyberDrain/chore/baseline-standards-jso…
github-actions[bot] Oct 28, 2026
11219ea
fix(tenant): manage excluded groups for every authentication method
github-actions[bot] Oct 28, 2026
c3b477a
fix(intune): keep template references on settings added in the templa…
github-actions[bot] Oct 28, 2026
772eac8
fix(identity): retry adding a new user to a group when the account ha…
github-actions[bot] Oct 28, 2026
a405b75
Update openapi.json
github-actions[bot] Oct 28, 2026
65e029f
Update openapi.json
github-actions[bot] Oct 28, 2026
cd399de
Merge pull request #1059 from Renada-Solutions/fix/tenant-initial-dom…
github-actions[bot] Oct 28, 2026
dfde0f4
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Oct 28, 2026
2be0028
fix(tests): fix the failing backend Pester tests
github-actions[bot] Oct 28, 2026
71f6d7e
Update openapi.json
github-actions[bot] Oct 28, 2026
7f3f543
fix(baselines): show a renamed tenant group's current name so its bas…
github-actions[bot] Oct 28, 2026
cef322a
fix(baselines): drop blank graduation conditions so the baseline edit…
github-actions[bot] Oct 29, 2026
d321395
feat(ninjaone): render the organisation fields with the documentation…
github-actions[bot] Oct 29, 2026
504a5d7
Merge pull request #1064 from CyberDrain/chore/openapi-spec-update-20…
github-actions[bot] Oct 29, 2026
12f112f
Update openapi.json
github-actions[bot] Oct 29, 2026
7d05a4a
Update openapi.json
github-actions[bot] Oct 29, 2026
bf72699
fix(users): queue one Exchange group copy retry scoped to the pending…
github-actions[bot] Oct 29, 2026
fd111a3
fix(baselines): stop CA templates drifting on user names the tenant d…
github-actions[bot] Oct 29, 2026
324d5ac
Update openapi.json
github-actions[bot] Oct 29, 2026
2574b3d
Update openapi.json
github-actions[bot] Oct 29, 2026
bca6ac8
fix(baselines): treat nested license groups as AND in security simula…
github-actions[bot] Oct 29, 2026
b782a8e
fix(ninjaone): prepare credential fields when the settings are saved
github-actions[bot] Oct 29, 2026
3fc3c10
fix(ninjaone): give the tenant summary tables half the row
github-actions[bot] Oct 29, 2026
45c7b2f
feat(config): size HTTP burst workers per host tier
github-actions[bot] Oct 29, 2026
834c731
fix(halo): say why a referenced ticket could not be read before raisi…
github-actions[bot] Oct 29, 2026
d6a1ceb
docs(halo): list the agent settings needed to add results to an exist…
github-actions[bot] Oct 29, 2026
1ce3987
fix(backup): include baselines in CIPP backups
github-actions[bot] Oct 29, 2026
2e2ae09
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Oct 29, 2026
eb67a22
feat(ninjaone): add NinjaOne Ticketing as a PSA target
github-actions[bot] Oct 29, 2026
fc8aa99
Update openapi.json
github-actions[bot] Oct 30, 2026
2da057d
perf(syncro): give Syncro its own HTTP/2 client pool
github-actions[bot] Oct 30, 2026
8e8d929
Merge pull request #1079 from CyberDrain/chore/docs-published-pages-u…
github-actions[bot] Oct 30, 2026
454d922
feat(timers): show Craft's recorded timer state and jitter on the Tim…
github-actions[bot] Oct 30, 2026
c6e1318
feat(app-permissions): audit-backed exposure signals, directory roles…
github-actions[bot] Oct 30, 2026
1c4f559
Update openapi.json
github-actions[bot] Oct 30, 2026
33c9228
fix(baselines): drop tenantFilter from imported CA templates before c…
github-actions[bot] Oct 30, 2026
3affafc
fix(baselines): end a tenant's rollout before a stage its tenant grou…
github-actions[bot] Oct 30, 2026
2b86389
fix(baselines): read stage progress before forcing writes so edited b…
github-actions[bot] Oct 30, 2026
f8ea8a1
fix(applications): read app install status from Graph's retrieveDevic…
github-actions[bot] Oct 30, 2026
ff7736c
fix(domains): save DKIM selectors for callers with Tenant.DomainAnaly…
github-actions[bot] Oct 30, 2026
4b0d3ee
fix(graph-explorer): always page AllTenants reads from the cache
github-actions[bot] Oct 30, 2026
4b3ae2a
fix(graph): retry network failures instead of failing on a missing Re…
github-actions[bot] Oct 31, 2026
df99c74
Merge pull request #1098 from kris6673/feat/memberof-dynamic-group-fi…
github-actions[bot] Nov 1, 2026
b3e2caf
Merge pull request #1088 from TecharyJames/enrollment-restrictions
github-actions[bot] Nov 1, 2026
b6c1677
Merge pull request #1085 from kris6673/feat/add-group-drawer
github-actions[bot] Nov 1, 2026
704daad
Merge pull request #1083 from kris6673/feat/calendar-permissions-bulk…
github-actions[bot] Nov 1, 2026
f10d9cf
Merge pull request #1112 from CyberDrain/chore/docs-published-pages-u…
github-actions[bot] Nov 2, 2026
68bf6ac
feat: Add Exchange application roles and access policies to CIPP
github-actions[bot] Nov 2, 2026
c55337d
fix(intune): resolve selectedTenants by customerId in bulk app endpoints
github-actions[bot] Nov 2, 2026
859f208
fix(integrations): hide Syncro and update logo
github-actions[bot] Nov 2, 2026
4f101c4
chore: bump version to 11.3.0
github-actions[bot] Nov 2, 2026
821d7a9
refactor(auth): require explicit SelectedTenants param
github-actions[bot] Nov 2, 2026
e15f9a9
Merge pull request #1122 from CyberDrain/chore/docs-published-pages-u…
github-actions[bot] Nov 3, 2026
97670b0
feat(roles): add BlockAllTenants custom role flag
github-actions[bot] Nov 3, 2026
a3a08df
fix(container-update): store remote build date as ISO UTC
github-actions[bot] Nov 3, 2026
8db535e
feat(container-mgmt): pin verified channel image digests
github-actions[bot] Nov 3, 2026
51cf3eb
fix(extensions): scope scheduled task cleanup to active extensions
github-actions[bot] Nov 3, 2026
f9550a7
docs(container): clarify dev channel usage guidance
github-actions[bot] Nov 4, 2026
e86a6e7
Merge pull request #1139 from CyberDrain/chore/openapi-spec-update-20…
github-actions[bot] Nov 4, 2026
423385c
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Nov 4, 2026
a45be13
feat: Add functionality for managing deleted applications
github-actions[bot] Nov 4, 2026
0a4c8cd
feat: Add federated credential support and app sign-in activity tracking
github-actions[bot] Nov 4, 2026
7bd2916
fix(roles): list built-in roles when no custom roles exist
github-actions[bot] Nov 4, 2026
bd27fdf
Merge pull request #882 from kris6673/feat/ca-policy-duplicate
github-actions[bot] Nov 4, 2026
d1ec395
Merge pull request #1005 from kris6673/fix/group-license-supported-types
github-actions[bot] Nov 4, 2026
aca1c28
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Nov 4, 2026
69d470b
Merge pull request #1015 from kris6673/feat/shared-mailbox-last-signin
github-actions[bot] Nov 4, 2026
5e8f0e7
fix(exchange): raise users page size when sign-in logs unavailable
github-actions[bot] Nov 4, 2026
c9fa1f7
Merge pull request #1063 from kris6673/feat/bulk-add-shared-room-equi…
github-actions[bot] Nov 4, 2026
bb3db0b
docs: fix alert history path and conditional access policy copy spec
github-actions[bot] Nov 4, 2026
83fce98
Merge pull request #1065 from kris6673/fix/sp-guest-peoplepicker-text
github-actions[bot] Nov 4, 2026
86cd90a
Merge pull request #1073 from kris6673/feat/alltenants-securescore-co…
github-actions[bot] Nov 4, 2026
93ebd6e
test: define shared HttpResponseContext stub once
github-actions[bot] Nov 4, 2026
46f67d9
perf(baselines): write trend points in one table call
github-actions[bot] Nov 4, 2026
ae8c926
Merge pull request #1077 from kris6673/feat/non-compliant-devices-page
github-actions[bot] Nov 4, 2026
5b05144
fix(tests): require a literal type in custom test data reads and proj…
github-actions[bot] Nov 4, 2026
df6689b
perf(cache): read role-assignable groups' audit events 20 groups at a…
github-actions[bot] Nov 5, 2026
b35f77c
Merge pull request #1144 from kris6673/fix/alert-license-gates
github-actions[bot] Nov 5, 2026
83cd82e
Merge pull request #1146 from Corsw/patch-3
github-actions[bot] Nov 5, 2026
baef52a
Merge pull request #1138 from CyberDrain/chore/docs-published-pages-u…
github-actions[bot] Nov 5, 2026
a72d523
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Nov 5, 2026
2c2730d
Merge pull request #1150 from CyberDrain/chore/docs-published-pages-u…
github-actions[bot] Nov 5, 2026
67ed5be
Merge pull request #1123 from kris6673/feat/unassign-device-users
github-actions[bot] Nov 5, 2026
7c0f0f8
Merge pull request #1129 from kris6673/fix/allowedtenants-mixed-scope
github-actions[bot] Nov 5, 2026
302bf0d
Merge pull request #1130 from kris6673/fix/tenantlist-collapse-allten…
github-actions[bot] Nov 5, 2026
e888c9e
Update openapi.json
github-actions[bot] Nov 5, 2026
3415405
Merge pull request #1082 from kris6673/fix/mfa-report-guest-ca-coverage
github-actions[bot] Nov 5, 2026
0be8927
perf(identity): precompute CA policy specs in Get-CIPPMFAState
github-actions[bot] Nov 5, 2026
43d944f
fix(offboarding): accept a plain forwarding address in offboarding op…
github-actions[bot] Nov 5, 2026
4ef368a
feat(layout): use the shared error card for the pick-a-tenant and ten…
github-actions[bot] Nov 5, 2026
5dceed5
fix(licenses): filter cached licence rows by their RowKey tenant so r…
github-actions[bot] Nov 5, 2026
65c55bc
fix(groups): create the group in every tenant when All Tenants is pic…
github-actions[bot] Nov 5, 2026
20688b6
Update openapi.json
github-actions[bot] Nov 5, 2026
ac5bc5b
fix(baselines): open the right baseline from Edit Baseline in the sta…
github-actions[bot] Nov 5, 2026
27b2fef
fix(mcp): wait for new app registrations to replicate during MCP clie…
github-actions[bot] Nov 5, 2026
78edfc5
Update openapi.json
github-actions[bot] Nov 5, 2026
cc453fe
fix(tenant-groups): reserve placeholder group names, lock the onboard…
github-actions[bot] Nov 5, 2026
2d42568
feat(intune): auto-raise and complete multi-admin approvals
github-actions[bot] Nov 5, 2026
ebe9917
Merge pull request #1081 from kris6673/feat/intune-policy-failures
github-actions[bot] Nov 5, 2026
d429104
fix(mem): treat intune multi-admin approval as pending
github-actions[bot] Nov 5, 2026
c40c733
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Nov 5, 2026
5d26f1e
fix(baselines): resolve localized policy names and keep Authenticator…
github-actions[bot] Nov 5, 2026
d00941e
fix(dashboard): ignore on-demand caches instead of flagging tenants t…
github-actions[bot] Nov 6, 2026
a874d03
fix(baselines): skip CA templates with risk conditions as unlicensed …
github-actions[bot] Nov 6, 2026
7910461
fix(sam): report a client secret deleted from the app instead of show…
github-actions[bot] Nov 6, 2026
1984eef
fix(gdap): stop reset role mapping recreating groups that were alread…
github-actions[bot] Nov 6, 2026
f0aefee
fix(apps): only offer display languages Intune accepts for Microsoft …
github-actions[bot] Nov 6, 2026
d797c97
fix(endpoint): search several Store markets so app search finds apps …
github-actions[bot] Nov 6, 2026
647e922
perf(alerts): skip the snooze and AlertLastRun reads when an alert ru…
github-actions[bot] Nov 6, 2026
71a8c2c
fix(domains): keep the previous analyser result when a domain's MX lo…
github-actions[bot] Nov 6, 2026
53cc1b3
fix(standards): keep tenant-specific overrides when running one stand…
github-actions[bot] Nov 6, 2026
ce52824
perf(core): keep feature flag state in the process environment instea…
github-actions[bot] Nov 6, 2026
7d050f8
fix(baselines): return 404 for missing standards templates and baseli…
github-actions[bot] Nov 6, 2026
ced6aae
fix(baselines): keep scheduled baselines running when a manual-only b…
github-actions[bot] Nov 6, 2026
ee838db
feat(conditional): all tenants view for named locations
github-actions[bot] Nov 6, 2026
cdfc238
perf(intune): share one group name snapshot across the Intune caches
github-actions[bot] Nov 6, 2026
b70c5a8
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Nov 6, 2026
443b0f1
feat(tenants): view data for a tenant group from the tenant selector
github-actions[bot] Nov 6, 2026
d6528c1
Merge pull request #1168 from CyberDrain/feat/multi-partner-tenants
github-actions[bot] Nov 6, 2026
26ef93a
Merge pull request #1172 from ZenTopBrandon/fix/role-escalable-groups…
github-actions[bot] Nov 7, 2026
0be29c2
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Nov 7, 2026
1f65be0
feat(tests): add ZTNA assessments from Zero Trust Assessment 3.1.0
github-actions[bot] Nov 7, 2026
962dbb8
fix: server side sort of CA policies by displayName
github-actions[bot] Nov 7, 2026
d20bf17
add new stats
github-actions[bot] Nov 8, 2026
ad46da4
perf(stats): keep enterprise app names stable and count report templa…
github-actions[bot] Nov 8, 2026
674145b
perf(tables): read table query pages into pooled buffers and recover …
github-actions[bot] Nov 9, 2026
633163b
perf(reporting): size branding images when they are uploaded
github-actions[bot] Nov 9, 2026
668cb8c
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Nov 9, 2026
1f5a601
perf(auth): skip the access timing debug line when debug output is off
github-actions[bot] Nov 9, 2026
a7e07e9
fixes renewal for sherweb decrease
github-actions[bot] Nov 9, 2026
0a30e2c
Update openapi.json
github-actions[bot] Nov 9, 2026
c0489e8
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Nov 9, 2026
fac47cf
Merge pull request #1127 from kris6673/feat/intune-deployment-status
github-actions[bot] Nov 9, 2026
b72720e
fix team mailnick feature
github-actions[bot] Nov 9, 2026
1a03385
failed scheduled task fixes
github-actions[bot] Nov 9, 2026
f649c20
add set timezone
github-actions[bot] Nov 9, 2026
2653085
add offboarding option to remove roles
github-actions[bot] Nov 9, 2026
17b1df9
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Nov 9, 2026
aad26d3
Update openapi.json
github-actions[bot] Nov 9, 2026
043fc5b
fix(reports): return Lighthouse device compliance instead of a 403 fo…
github-actions[bot] Nov 9, 2026
7debc79
fix(ninjaone): name licence service plans by plan id in licence docum…
github-actions[bot] Nov 9, 2026
29c25e3
fix(domains): remove domains no longer in the tenant from the domain …
github-actions[bot] Nov 9, 2026
741266e
configure days
github-actions[bot] Nov 9, 2026
6b486b1
Merge pull request #1190 from Umbrella-IT-Group/fix/site-user-access-…
github-actions[bot] Nov 9, 2026
d648290
Merge pull request #1188 from Umbrella-IT-Group/fix/ca-template-id-fi…
github-actions[bot] Nov 9, 2026
90838cc
Merge pull request #1185 from Umbrella-IT-Group/fix/recycle-bin-first…
github-actions[bot] Nov 9, 2026
dc0b778
Merge pull request #1192 from Umbrella-IT-Group/fix/incident-tags
github-actions[bot] Nov 9, 2026
16d4ed0
Merge pull request #891 from StoricU/feature/travel-existing-locations
github-actions[bot] Nov 9, 2026
eb04191
refactor(ca): optimize excludedLocations
github-actions[bot] Nov 9, 2026
a044849
test(security): discover bulk handlers by scan, not list
github-actions[bot] Nov 9, 2026
1e2e346
fix(reporting): keep line breaks when sanitizing report text
github-actions[bot] Nov 10, 2026
3b4ad63
Merge pull request #1193 from Umbrella-IT-Group/fix/graph-scalar-value
github-actions[bot] Nov 10, 2026
403bb0b
Merge pull request #1195 from Umbrella-IT-Group/fix/ca-policies-faile…
github-actions[bot] Nov 10, 2026
45fa788
Merge pull request #1197 from Umbrella-IT-Group/fix/recycle-summary-p…
github-actions[bot] Nov 10, 2026
5e9cd4e
Merge pull request #1205 from Umbrella-IT-Group/fix/baseline-reimport…
github-actions[bot] Nov 10, 2026
3d4cfd7
Merge pull request #1201 from Umbrella-IT-Group/fix/incident-sort-order
github-actions[bot] Nov 10, 2026
09398a7
Merge pull request #1203 from Umbrella-IT-Group/fix/assignment-filter…
github-actions[bot] Nov 10, 2026
62d32bd
Merge pull request #1199 from Umbrella-IT-Group/fix/auth-methods-unre…
github-actions[bot] Nov 10, 2026
4f07987
Update openapi.json
github-actions[bot] Nov 10, 2026
d942a7e
refactor(baselines): simplify auth method group targeting and its test
github-actions[bot] Nov 10, 2026
55542f3
Merge pull request #1208 from Umbrella-IT-Group/fix/override-delete-k…
github-actions[bot] Nov 10, 2026
7a66126
Update openapi.json
github-actions[bot] Nov 10, 2026
195db26
Update openapi.json
github-actions[bot] Nov 10, 2026
ebadc4b
fix(nhi): cap the directory audit read of a busy app
github-actions[bot] Nov 10, 2026
813e347
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Nov 10, 2026
e3cf6e2
jitter the stats for cleaner delivery
github-actions[bot] Nov 10, 2026
25e0298
Merge pull request #1221 from kris6673/fix/guest-detection-ca-coverage
github-actions[bot] Nov 10, 2026
1d557d3
Merge pull request #1116 from ADV-Technical-Consulting/feat/spo-guest…
github-actions[bot] Nov 10, 2026
044049c
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Nov 10, 2026
5df680b
feat(NinjaOne): add MaxLength parameter and adjust user display logic…
github-actions[bot] Nov 10, 2026
561e4e4
Merge pull request #1223 from kris6673/fix/scripted-alert-silent-fail…
github-actions[bot] Nov 10, 2026
1265e83
Update openapi.json
github-actions[bot] Nov 10, 2026
7def741
Merge pull request #1229 from Umbrella-IT-Group/fix/variables-endpoin…
github-actions[bot] Nov 10, 2026
38a8526
Merge pull request #1227 from kris6673/fix/mde-attach-toggle
github-actions[bot] Nov 11, 2026
a654b66
Merge pull request #1231 from CyberDrain/chore/openapi-spec-update-20…
github-actions[bot] Nov 11, 2026
642ec8b
Merge pull request #1226 from chris-dewey-1991/fix-security-simulatio…
github-actions[bot] Nov 11, 2026
52ac36e
Merge pull request #1225 from kris6673/fix/dynamic-group-rule-evaluation
github-actions[bot] Nov 11, 2026
002cfcf
fix(alerts): skip new accounts in the Global Admin password alert
github-actions[bot] Nov 11, 2026
a920474
fixed advisory on potential injection
github-actions[bot] Nov 11, 2026
f11ecb6
feat(integrations): warn on the API egress card when a client takes u…
github-actions[bot] Nov 11, 2026
d13f715
Update openapi.json
github-actions[bot] Nov 11, 2026
a2322dd
Merge pull request #1238 from kris6673/fix/reports-unknown-not-negative
github-actions[bot] Nov 11, 2026
bcd7d81
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Nov 11, 2026
8cc36ed
fix(domains): clean up stale analyser rows when a tenant has no domai…
github-actions[bot] Nov 11, 2026
e32f0b1
fix(scheduler): block dispatchers and unscoped graph helpers
github-actions[bot] Nov 11, 2026
d3be7b9
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Nov 11, 2026
1a0122c
Merge pull request #1234 from kris6673/fix/standards-false-compliant
github-actions[bot] Nov 11, 2026
2386f8c
refactor(sharepoint): centralize SharePoint host validation
github-actions[bot] Nov 11, 2026
31dfd64
fix(msp): escape typographic quotes in install commands
github-actions[bot] Nov 11, 2026
d98dddb
fix(security): harden ExecApplication and partner URI exemptions
github-actions[bot] Nov 11, 2026
0daa954
fix(webhooks): guard against SSRF in webhook destinations
github-actions[bot] Nov 11, 2026
9f21ad1
fix(endpoint): validate GUID/path inputs in app, SP, photo endpoints
github-actions[bot] Nov 11, 2026
d791387
fix(gdap): validate relationship id before Graph calls
github-actions[bot] Nov 11, 2026
118e57e
fix(security): validate app credential and extension inputs
github-actions[bot] Nov 11, 2026
19514c6
Update openapi.json
github-actions[bot] Nov 11, 2026
6748ebe
fix(api-client): restrict tenant-limited role grants and app adoption
github-actions[bot] Nov 11, 2026
e76b046
fix(standards): escape device script values with ConvertTo-CIPPScript…
github-actions[bot] Nov 12, 2026
03ea403
fix(scheduler): force nested tenant params to task tenant
github-actions[bot] Nov 12, 2026
917a3ba
Merge pull request #1256 from TMGCL-TS/fix/alert-snooze-cmdlet-case
github-actions[bot] Nov 12, 2026
e5a0d62
Merge pull request #1242 from Kyle-Luchsinger/feat/license-request-alert
github-actions[bot] Nov 12, 2026
28baf00
Merge pull request #1245 from Umbrella-IT-Group/fix/notification-day-…
github-actions[bot] Nov 12, 2026
fe28458
refactor(notifications): tidy day-rollover notification fix
github-actions[bot] Nov 12, 2026
1792f84
perf(licenses): point-query licence SKU names instead of OR-ed row keys
github-actions[bot] Nov 12, 2026
2a8bd2f
fix(tests): stop ZTNA21941 passing on sign-in frequency and CIS 1.3.3…
github-actions[bot] Nov 12, 2026
5f52e53
Merge pull request #1235 from kris6673/fix/ca-analysis-guest-and-phis…
github-actions[bot] Nov 12, 2026
4e033cd
fix(backend): restrict backup listing by type and tenant
github-actions[bot] Nov 12, 2026
f9b4cdd
fix(alerts): restrict Invoke-AddScriptedAlert to alert commands
github-actions[bot] Nov 12, 2026
ecd9160
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Nov 12, 2026
a37a261
Update openapi.json
github-actions[bot] Nov 12, 2026
d6286b1
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Nov 12, 2026
ee49e56
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Nov 12, 2026
cc2856c
fix(auth): treat empty group/tenant selector values as unresolved
github-actions[bot] Nov 12, 2026
a677aae
fix(identity): enforce JIT role/group restrictions and id validation
github-actions[bot] Nov 12, 2026
f0d4bd9
fix(extensions): block secret reuse on changed destination
github-actions[bot] Nov 12, 2026
07a3b3a
feat(hudu): allow hiding license warnings in Magic Dash
github-actions[bot] Nov 12, 2026
ee4647c
fix(templates): enforce assignment perms on import
github-actions[bot] Nov 12, 2026
8a1675e
feat(backup): include AccessIPRanges table in CIPP backup
github-actions[bot] Nov 12, 2026
6859e64
fix(sandbox): clear commands/providers for strict allowlist
github-actions[bot] Nov 12, 2026
b19a794
Merge pull request #1263 from CyberDrain/chore/openapi-spec-update-20…
github-actions[bot] Nov 12, 2026
2483886
Merge pull request #1260 from CyberDrain/chore/docs-published-pages-u…
github-actions[bot] Nov 12, 2026
bc813d5
adds pim group eligibility.
github-actions[bot] Nov 12, 2026
a0d3e5e
added tags
github-actions[bot] Nov 12, 2026
9c0ef1e
fixes bug with db collection and groups
github-actions[bot] Nov 12, 2026
17e094f
clears tenant rows on baseline save
github-actions[bot] Nov 12, 2026
a00fc33
fix(standards): enforce tenant access scope on standards endpoints
github-actions[bot] Nov 12, 2026
919af7f
fix(gdap): block reserved groups and restrict partner config writes
github-actions[bot] Nov 12, 2026
b7371cf
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Nov 12, 2026
4f97afa
fix(baselines): render token substitution on objects, not JSON
github-actions[bot] Nov 12, 2026
f98b9df
feat(templates): restrict shared template writes to unrestricted roles
github-actions[bot] Nov 12, 2026
97bdfcb
feat(backup): include allowedUsers table in tenant backups
github-actions[bot] Nov 12, 2026
ee377ef
fix(backup): include direct tenants in CIPP backup
github-actions[bot] Nov 12, 2026
8eb41fb
fix(auth): add secret before removing old ones on reset
github-actions[bot] Nov 12, 2026
9181293
Merge pull request #1273 from Umbrella-IT-Group/fix/sponsor-post
github-actions[bot] Nov 12, 2026
438cbd9
Update openapi.json
github-actions[bot] Nov 12, 2026
5291ab2
Update openapi.json
github-actions[bot] Nov 13, 2026
928194d
fix(licenses): name SKUs from the CSV first in the licence overview
github-actions[bot] Nov 13, 2026
ea284a1
fix(applications): remove client secrets one at a time and report each
github-actions[bot] Nov 13, 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.
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/cli@2.35.1 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.
Loading
Loading