Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
917 commits
Select commit Hold shift + click to select a range
9c3ec21
fix(report-builder): preserve table cells in pdf
github-actions[bot] Aug 4, 2026
8787280
perf(standards): trim Graph fields in checks
github-actions[bot] Aug 4, 2026
57e8da4
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 4, 2026
a1e7ade
fix(endpoint): resolve AssignTo key casing collision in app templates
github-actions[bot] Aug 4, 2026
37ac576
Merge pull request #172 from CyberDrain/preview/alltenants-dashboard
github-actions[bot] Aug 4, 2026
fc2242d
Merge pull request #170 from kris6673/feat/onboarding-shared-calendar…
github-actions[bot] Aug 4, 2026
ac02b3c
perf(intune): fetch setting definitions per policy instead of whole c…
github-actions[bot] Aug 4, 2026
49912d8
baselines
github-actions[bot] Aug 4, 2026
de72b24
fix(autopilot): remove user-select locale override
github-actions[bot] Aug 4, 2026
0c94b9d
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 4, 2026
63fc27b
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 4, 2026
4baac22
fix(labels): harden sensitivity label redeploy
github-actions[bot] Aug 4, 2026
22df275
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 4, 2026
a2f9bf5
fix(standards): handle default platform policy
github-actions[bot] Aug 4, 2026
2c32d2f
feat(groups): enhance group report with owners and update UI for owne…
github-actions[bot] Aug 4, 2026
43db165
fix(backend): resolve PSScriptAnalyzer warnings
github-actions[bot] Aug 4, 2026
2970af8
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 4, 2026
95f8862
new standards
github-actions[bot] Aug 4, 2026
6d55da3
updates for baselines
github-actions[bot] Aug 4, 2026
e60b21b
Merge pull request #171 from CyberDrain/preview/superadmin-nav-reorg
github-actions[bot] Aug 4, 2026
68c7ac8
fix(groups): correct Exchange bulk result correlation and group type …
github-actions[bot] Aug 5, 2026
e2eb951
refactor(sharepoint): migrate to REST API with app-only auth
github-actions[bot] Aug 5, 2026
c0077c2
fix(applications): improve path resolution and add exclude group
github-actions[bot] Aug 5, 2026
9dc8314
test(dbc): add auto expanding archive state tests
github-actions[bot] Aug 5, 2026
41c07a4
docs(http): add endpoint descriptions
github-actions[bot] Aug 5, 2026
fddebfc
Merge pull request #184 from kris6673/feat/intune-bios-password-retri…
github-actions[bot] Aug 5, 2026
94846d4
fix: normalize boolean query parameter handling across endpoints
github-actions[bot] Aug 5, 2026
09c83bd
fix(scheduler): add OData injection protection and improve tenant fil…
github-actions[bot] Aug 5, 2026
56f81c0
compares now allow anyof
github-actions[bot] Aug 5, 2026
e7fa65f
fix: enforce boolean flag comparisons in HTTP entrypoints
github-actions[bot] Aug 5, 2026
d380e47
fix(standards): strip rawData before replacement
github-actions[bot] Aug 5, 2026
84e8ba2
fix(applications): align Win32 MSP/Choco payloads with Graph detectio…
github-actions[bot] Aug 5, 2026
aa9e84b
fix(breaches): add AnyTenant tag and fix formatting
github-actions[bot] Aug 5, 2026
6ce51f0
refactor: remove standard telemetry metadata
github-actions[bot] Aug 5, 2026
1503bf6
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 5, 2026
d70e08b
fix: respect exclusions and cache TTL in drift/groups
github-actions[bot] Aug 5, 2026
939929a
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 5, 2026
6be031b
feat(dashboard): add AllTenants views for secure score and test results
github-actions[bot] Aug 5, 2026
9e37416
new dev modules
github-actions[bot] Aug 5, 2026
b92b6ef
add standard conflict detection.
github-actions[bot] Aug 5, 2026
f10bed8
perf(tests): fan-out per-tenant queries and add count API
github-actions[bot] Aug 5, 2026
9e00238
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 5, 2026
268fad0
fix(stats): detect SSO complete from live EasyAuth config
github-actions[bot] Aug 5, 2026
e3528c5
fix(sam): activate missing directory roles on 404
github-actions[bot] Aug 5, 2026
ea584cb
feat(identity): use unified RBAC API for roles listing
github-actions[bot] Aug 5, 2026
f929f43
Merge pull request #195 from CyberDrain/fix/recommended-roles-doc-links
github-actions[bot] Aug 5, 2026
b878860
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 5, 2026
568c058
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 6, 2026
1ed764e
compare fixes for intune and baseline caching for CA policies with ha…
github-actions[bot] Aug 6, 2026
14f037c
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 6, 2026
3be39e0
feat(reports): centralise PDF branding into one shared kit
github-actions[bot] Aug 6, 2026
5053b0b
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 6, 2026
6a008d4
feat(mcp): add OpenAPI generator and MCP safety improvements
github-actions[bot] Aug 6, 2026
fb616f7
SMB1001 tag
github-actions[bot] Aug 6, 2026
4a269dd
fix(drift): guard stale-row pruning against partial batch failures
github-actions[bot] Aug 6, 2026
40bf46d
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 6, 2026
11712d2
PRM updates.
github-actions[bot] Aug 6, 2026
96f2470
fix(openapi): avoid fake response fields
github-actions[bot] Aug 7, 2026
73eea67
refactor(email): migrate TenantAllowBlockList to report DB
github-actions[bot] Aug 7, 2026
cbb902e
fix(openapi): narrow Graph field claims to proven projections
github-actions[bot] Aug 7, 2026
052dcb7
chore: move http files into correct nested folders
github-actions[bot] Aug 7, 2026
82f701d
fix: correct pester test pathing
github-actions[bot] Aug 7, 2026
b6d08b8
fix(openapi): serve spec as static asset
github-actions[bot] Aug 7, 2026
66d34ab
fix(api): use NormalizedError so failures show their message
github-actions[bot] Aug 7, 2026
6430a19
spacing?
github-actions[bot] Aug 7, 2026
854d8e8
make DCR work fully - Automated onboardings are now possible using th…
github-actions[bot] Aug 7, 2026
d3de613
fix(mcp): improve tool search, serialisation and protocol handling
github-actions[bot] Aug 7, 2026
ff3c3f6
Merge branches 'dev' and 'dev' of https://github.com/CyberDrain/CIPP …
github-actions[bot] Aug 7, 2026
355cc52
clean on empty for baseline checking.
github-actions[bot] Aug 7, 2026
62ce20c
fix(standards): default auth method to all_users
github-actions[bot] Aug 7, 2026
23ebdf9
fix(auth): throw on auth policy read failure
github-actions[bot] Aug 7, 2026
fc9749e
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 7, 2026
3d5a67f
Merge pull request #210 from CyberDrain/preview/new-setup-gate
github-actions[bot] Aug 7, 2026
b5a00a4
Merge pull request #191 from TecharyJames/feat-set-custom-font
github-actions[bot] Aug 7, 2026
a16dacb
Fix Pester
github-actions[bot] Aug 7, 2026
8ee8dad
fix(setup): retry KV secret reads in ExecListAppId
github-actions[bot] Aug 7, 2026
827cfe0
fix(setup): handle placeholder secrets and credential timing
github-actions[bot] Aug 7, 2026
9af6e48
fix(pdf): resolve cipp variables in report footers
github-actions[bot] Aug 7, 2026
b35b4eb
Update Invoke-ExecAzBobbyTables.ps1
github-actions[bot] Aug 7, 2026
af4ca7a
feat(branding): split branding into own endpoint
github-actions[bot] Aug 7, 2026
bd75721
fix(images): use range filter for large entity parts
github-actions[bot] Aug 7, 2026
fea665e
version up
github-actions[bot] Aug 7, 2026
ec38d2c
v up
github-actions[bot] Aug 7, 2026
596bf38
chore: bump version to 10.8.2
github-actions[bot] Aug 8, 2026
cc92ea9
fix(release-notes): match exact version tag for hotfix releases
github-actions[bot] Aug 8, 2026
e9a57fe
exporting and template packages
github-actions[bot] Aug 9, 2026
352f078
improve historics
github-actions[bot] Aug 9, 2026
f2265e1
fix(intune): cache setting definitions for Catalog comparisons
github-actions[bot] Aug 10, 2026
71153d3
fix(branding): fetch multipart images reliably
github-actions[bot] Aug 10, 2026
491ffaf
fix(standards): normalize ca template drift
github-actions[bot] Aug 10, 2026
c6b464b
fix(cache): refactor data processing in cache scripts to use foreach …
github-actions[bot] Aug 10, 2026
4057591
fix(dbcache): avoid steppable pipeline scope bug
github-actions[bot] Aug 10, 2026
977a208
feat(core): auto-reconcile instance and webhook urls
github-actions[bot] Aug 10, 2026
add019b
feat(tenants): add tenant group membership to tenant list
github-actions[bot] Aug 10, 2026
7dc2fdb
Merge pull request #231 from CyberDrain/fix/setup-wizard-auth
github-actions[bot] Aug 10, 2026
67910ca
fix(orchestrator): stream Craft batch payloads
github-actions[bot] Aug 10, 2026
e3ff6a4
fix(standards): fix DisableM365GroupUsers create path
github-actions[bot] Aug 10, 2026
4f03a2b
fix: anytenant for ExecBrandingSettings entrypoint
github-actions[bot] Aug 10, 2026
ca410c7
fix(standards): count successes for DisableEXOPowerShell
github-actions[bot] Aug 10, 2026
d2aabeb
fix(settings): use Get-Tenants for tenant domain lookup
github-actions[bot] Aug 10, 2026
0ff6d64
chore: bump version to 10.8.3
github-actions[bot] Aug 10, 2026
ebc7453
fix(core): log incomplete table entities
github-actions[bot] Aug 11, 2026
42a9280
refactor(graphhelper): extract exo error parser
github-actions[bot] Aug 11, 2026
7939a7a
fix(bec): handle empty rule audit responses
github-actions[bot] Aug 11, 2026
4247030
chore: remove dead variable assignment
github-actions[bot] Aug 11, 2026
b442560
fix(settings): update tenant domain resolution logic
github-actions[bot] Aug 11, 2026
fdd36f3
fix(branding): replace local ConvertTo-IdList with direct helper calls
github-actions[bot] Aug 11, 2026
c87d67c
perf(tables): cache CreateTable calls to reduce 409s
github-actions[bot] Aug 12, 2026
29dbad7
feat(mcp): validate redirect URIs against resource app
github-actions[bot] Aug 12, 2026
35ce4e8
feat(bec): expand BEC checks and reporting
github-actions[bot] Aug 12, 2026
3e507f4
fix(bec): tighten scoring and foreign sign-in logic
github-actions[bot] Aug 12, 2026
60f908c
feat(ca): improve policy patching and builder
github-actions[bot] Aug 12, 2026
eca7c9f
fix(exchange): resolve folder perm users by id
github-actions[bot] Aug 12, 2026
3d3ed49
chore: fix pester test stubs
github-actions[bot] Aug 12, 2026
265bd8a
fix(cippcore): harden CVE and folder perms
github-actions[bot] Aug 12, 2026
4597057
fix(reports): filter excluded tenants from secure score
github-actions[bot] Aug 12, 2026
95fb7f0
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 12, 2026
4ed970f
fix(sharepoint): support sovereign cloud SharePoint domains
github-actions[bot] Aug 12, 2026
4435a3f
fix(permissions): add noPagination and shorten messages
github-actions[bot] Aug 12, 2026
34622b7
feat(dbcache): add resumable sharing links scan
github-actions[bot] Aug 12, 2026
40be4c9
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 12, 2026
97d19cf
Merge pull request #271 from CyberDrain/chore/license-sku-update-2026…
github-actions[bot] Aug 12, 2026
b9f8a42
fix(copilot): correct copilot setting mappings
github-actions[bot] Aug 12, 2026
24e6a42
chore: bump version to 10.8.4
github-actions[bot] Aug 12, 2026
85b71db
refactor: trim verbose inline comments to essentials
github-actions[bot] Aug 12, 2026
dce2119
fix(alerts): improve HuntressRogueApps feed guard and CIPP list matching
github-actions[bot] Aug 12, 2026
09df6ef
fix(spo): surface SPO consent failures accurately
github-actions[bot] Aug 13, 2026
f485306
chore: bump bobbytables dep
github-actions[bot] Aug 13, 2026
88c42c6
feat(core): add partner tenant info endpoint
github-actions[bot] Aug 13, 2026
541df3c
fix(mem): harden template deploy and prep assign
github-actions[bot] Aug 13, 2026
01685af
fix(pwpush): handle null account results safely
github-actions[bot] Aug 13, 2026
669f080
fix(cippcore): clarify sharepoint admin 401 errors
github-actions[bot] Aug 13, 2026
431a608
feat(core): add Update-CIPPAzDataTableEntity merge helper
github-actions[bot] Aug 13, 2026
a820889
fix(auth): wrap permissions in array operator
github-actions[bot] Aug 14, 2026
ff62819
feat(cippcore): add Repair-CIPPTable and Test-CIPPTableNotFound funct…
github-actions[bot] Aug 14, 2026
981601a
feat(cippcore): enhance error handling for Azure Data Table operations
github-actions[bot] Aug 14, 2026
29911dc
fix(cippdb): skip unmanaged tenants in tests
github-actions[bot] Aug 14, 2026
e9ff18a
fix(tests): use correct DMARC property names in SMB1001_2_12
github-actions[bot] Aug 14, 2026
4d050b2
fix(sharepoint): apply bulk Remove Guest Access and Edit Site to ever…
github-actions[bot] Aug 14, 2026
000ca27
Update openapi.json
github-actions[bot] Aug 14, 2026
558ae12
Merge pull request #289 from CyberDrain/preview/mcp-docs-search
github-actions[bot] Aug 14, 2026
0dea551
feat(sharepoint): add quota card and fix empty usage report handling
github-actions[bot] Aug 14, 2026
6b622bf
fix(sharepoint): preserve null storage for sites with no usage data
github-actions[bot] Aug 14, 2026
6508334
fix(scheduler): handle delta query failures gracefully
github-actions[bot] Aug 14, 2026
ea3c583
feat(github): fall back to function app on PAT errors
github-actions[bot] Aug 14, 2026
b02fd9d
fix(extensions): surface GitHub token errors in test
github-actions[bot] Aug 14, 2026
d9e3571
chore: bump version to 10.8.5
github-actions[bot] Aug 14, 2026
1b36e4f
baseline saving
github-actions[bot] Aug 15, 2026
87a96d4
Fix deny remediation
github-actions[bot] Aug 15, 2026
7b55023
temporary fix
github-actions[bot] Aug 15, 2026
ad84826
more granular permissions
github-actions[bot] Aug 15, 2026
1eb6bbf
baseline items
github-actions[bot] Aug 15, 2026
b6835eb
fixes for baselines
github-actions[bot] Aug 15, 2026
99805b2
baseline compare items
github-actions[bot] Aug 15, 2026
b40f707
update batches
github-actions[bot] Aug 15, 2026
892d22c
more conversions
github-actions[bot] Aug 15, 2026
7ecc89c
Remove custom, change it to prepare+executor.
github-actions[bot] Aug 15, 2026
10c6796
baselines updates, adding pester tests
github-actions[bot] Aug 15, 2026
a591176
new baselines conversion
github-actions[bot] Aug 15, 2026
51d40d0
fixes for baselines preps
github-actions[bot] Aug 15, 2026
80ccbe2
Merge pull request #299 from CyberDrain/fix/cpv-consent-retry-gate
github-actions[bot] Aug 15, 2026
626685f
Merge pull request #297 from kris6673/feat/AllowTeamsConsumerInbound
github-actions[bot] Aug 15, 2026
c662f84
Merge pull request #296 from kris6673/feat/autopilot-group-assignment
github-actions[bot] Aug 15, 2026
60d2dc5
Merge pull request #294 from CyberDrain/feat/custom-role-simple-mode
github-actions[bot] Aug 15, 2026
ea80c0e
Merge pull request #282 from ZenTopBrandon/fix/phish-protection-brand…
github-actions[bot] Aug 15, 2026
31ab874
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 15, 2026
3cf989e
Merge pull request #277 from Corsw/patch-1
github-actions[bot] Aug 15, 2026
1ad136d
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 15, 2026
9c26968
baseline tests
github-actions[bot] Aug 15, 2026
e0b41e1
new standards
github-actions[bot] Aug 15, 2026
c87eb7b
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 15, 2026
2eb0ea9
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 15, 2026
c3167db
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 15, 2026
de79414
more baseline conversion
github-actions[bot] Aug 15, 2026
fb3e0c5
more converted baselines
github-actions[bot] Aug 15, 2026
a15c4d5
feat(gdap): add Partner Center API token check
github-actions[bot] Aug 16, 2026
e9d1228
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 16, 2026
9753445
baselines
github-actions[bot] Aug 16, 2026
5a9965f
Baseline conversions
github-actions[bot] Aug 16, 2026
35a465b
conversion
github-actions[bot] Aug 16, 2026
d7c2417
new baselines
github-actions[bot] Aug 16, 2026
0f24f81
batch 5
github-actions[bot] Aug 16, 2026
cc7abd9
Last batch
github-actions[bot] Aug 16, 2026
c4b476d
minor big fixes baselines
github-actions[bot] Aug 16, 2026
9b251bb
fixes baseline
github-actions[bot] Aug 16, 2026
81a15a4
fixes for baselines
github-actions[bot] Aug 17, 2026
e942c33
baseline fixes
github-actions[bot] Aug 17, 2026
f5c064e
baseline changes
github-actions[bot] Aug 17, 2026
ac69f81
Baseline bugs in compares
github-actions[bot] Aug 17, 2026
ba42d5a
fix(standards): ignore unmanaged policy fields
github-actions[bot] Aug 17, 2026
b5a26ba
Merge pull request #307 from CyberDrain/preview/auditlog-performance-…
github-actions[bot] Aug 17, 2026
6f0aceb
fix(identity): correct inactive users report fields
github-actions[bot] Aug 17, 2026
ff073e6
feat(cipp): Introduce UnlicensedOneDriveData alert
github-actions[bot] Aug 17, 2026
7357fc8
fix(ca): resolve custom variables before named-location matching
github-actions[bot] Aug 17, 2026
a99fedc
fix(pwpush): stop stale settings from silently breaking every push
github-actions[bot] Aug 17, 2026
9ed5629
feat(cipp): record version transitions and surface hosting info on Ve…
github-actions[bot] Aug 17, 2026
b864a3f
fix(pwpush): force re-initialization so config changes reach every wo…
github-actions[bot] Aug 17, 2026
5248d26
feat(support): add support bundle generator
github-actions[bot] Aug 17, 2026
09ecad5
baseline changes
github-actions[bot] Aug 17, 2026
4aaf259
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 18, 2026
f2fc009
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 18, 2026
0ed8661
fix(pwpush): handle string account ids in links
github-actions[bot] Aug 18, 2026
97fac42
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 18, 2026
d8c9c17
allow removal via selector
github-actions[bot] Aug 18, 2026
a6f2bdf
remove alert option for baseline
github-actions[bot] Aug 18, 2026
9791c5b
add offboarding of Quartatine alerts to offboarding
github-actions[bot] Aug 18, 2026
00cc3bf
fix(auth): narrow remaining cached AllTenants readers to allowed tenants
github-actions[bot] Aug 18, 2026
5a6c2d1
feat(identity): add guest lifecycle dashboard
github-actions[bot] Aug 18, 2026
c32b8ce
feat(tools): sharing-links seeding and scan measurement dev scripts
github-actions[bot] Aug 18, 2026
8b4a11a
fix(auth): enforce tenant scope on AnyTenant live and write endpoints
github-actions[bot] Aug 18, 2026
5f10a1e
feat(orchestrator): add priority-aware queue scheduling
github-actions[bot] Aug 18, 2026
f11c484
chore(api): update api spec
github-actions[bot] Aug 18, 2026
a17c338
fix(exchange): resolve connector comment variables per target tenant
github-actions[bot] Aug 18, 2026
418b66b
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 18, 2026
cb0af69
fix(queue): read Craft context via variable lookup
github-actions[bot] Aug 18, 2026
b6a3822
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 18, 2026
e1f4ca4
Merge pull request #188 from kris6673/feat/purview-message-encryption
github-actions[bot] Aug 18, 2026
67902d8
fix(orchestration): pass parent run lineage when queueing Craft child…
github-actions[bot] Aug 18, 2026
cf0701f
feat(identity): serve guest lifecycle dashboard from the report cache
github-actions[bot] Aug 18, 2026
a98835a
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 18, 2026
5fbd952
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 18, 2026
641e6b4
feat(support): add manual recording mode to support bundle
github-actions[bot] Aug 18, 2026
fa2834b
translate license shapes and report update.
github-actions[bot] Aug 18, 2026
35848ee
use actual report.
github-actions[bot] Aug 18, 2026
8e80634
feat(tests): expose Domain Analyser results to custom tests via the r…
github-actions[bot] Aug 18, 2026
70b59ba
chore(api): update api spec
github-actions[bot] Aug 18, 2026
db76e1c
fix(sharepoint): treat locked sites as inactive instead of failed in …
github-actions[bot] Aug 18, 2026
33ae242
fix(sharepoint): authenticate StorageQuotas reads with the SAM certif…
github-actions[bot] Aug 18, 2026
6c2a680
Merge pull request #323 from Renada-Solutions/feat/halo-request-source
github-actions[bot] Aug 18, 2026
c9ee761
Merge pull request #330 from CyberDrain/chore/license-sku-update-2026…
github-actions[bot] Aug 19, 2026
7b1d0cc
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 19, 2026
a287206
fix(auth): ReadWrite rule grants implied Read permission
github-actions[bot] Aug 19, 2026
4244d03
fix(standards): guard group template against duplicate creation
github-actions[bot] Aug 19, 2026
022e92f
fix(standards): improve spam filter policy resolution
github-actions[bot] Aug 19, 2026
55f970d
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 19, 2026
0f0d388
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 19, 2026
c9002cf
Merge pull request #341 from CyberDrain/chore/license-sku-update-2026…
github-actions[bot] Aug 20, 2026
890b79d
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 20, 2026
18b9b9e
Merge pull request #345 from jonwbstr/HuduIntegration-magicdash-add-l…
github-actions[bot] Aug 20, 2026
11d8024
Merge pull request #344 from jonwbstr/HuduIntegration-switching-magic…
github-actions[bot] Aug 20, 2026
bab87a4
feat(cipp): enhance group management and UI components
github-actions[bot] Aug 20, 2026
7e0cb78
Merge pull request #348 from MWG-Logan/feat/investigate-drift-standard
github-actions[bot] Aug 20, 2026
047c9f0
Merge pull request #318 from kris6673/quarantine-overhaul
github-actions[bot] Aug 20, 2026
24c5321
remove workflow, fix tests
github-actions[bot] Aug 21, 2026
98cd83b
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 21, 2026
2508748
OneDrive sizes
github-actions[bot] Aug 21, 2026
feef535
fiuxes https://github.com/CyberDrain/CIPP/issues/356
github-actions[bot] Aug 21, 2026
cfe70e5
retry logic for webhooks
github-actions[bot] Aug 21, 2026
750e52d
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 22, 2026
52a675f
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
github-actions[bot] Aug 22, 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
  •  
  •  
  •  
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