Skip to content

feat: Dev to release - #889

Merged
JohnDuprey merged 225 commits into
mainfrom
dev
Oct 12, 2026
Merged

JohnDuprey merged 225 commits into
mainfrom
dev

Conversation

@JohnDuprey

Copy link
Copy Markdown
Contributor

No description provided.

TechSG-Martin and others added 30 commits September 25, 2026 17:00
- add TeamsFilesPolicy with the external chat file sharing, native file
  entry point and channel files tab settings, each with "Don't change"
- add CsTeamsFilesPolicy cache
- add AutoShareFilesInExternalChats to TeamsMessagingPolicy
- migrate the V2 donotconfigure value to blank
Catch up the user docs with the changes shipped in 11.0.2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Introduced a new action to delete library jobs, stopping future syncs while preserving already imported templates.
- Integrated permission checks to ensure only authorized users can perform the delete action.
- Updated UI text to clarify the functionality of the delete action and its implications on syncing.
…elpers

- Get-Tenants: read the excluded list and tenant mode only on the paths that use them, and filter the result with foreach/.Where()
- New-ExoRequest, New-ExoBulkRequest: look the tenant up with -TenantFilter instead of reading every tenant
- Get-AuthorisedRequest: .Where() instead of Where-Object
- New-GraphBulkRequest: serialise batches with CippJson.ToJson, .Where() for the response scans, skip the tenant write when LastGraphError is already clear
- New-ExoBulkRequest: build each batch in a list; New-ExoRequest: only serialise response headers when verbose
- Set-CIPPDBCacheIntunePolicies: match bulk and assignment results through an id lookup instead of a Where-Object scan per result
- fetch device statuses 20 policies at a time so only one batch of statuses is held
- build the request lists with foreach
- Get-CIPPMFAState: foreach over users instead of ForEach-Object, admin ids in a HashSet, emit each row as it is built
- Set-CIPPDBCacheMFAState: pipe the rows into Add-CIPPDbItem
- Get-CIPPTextReplacement: every token contains '%', so return text without one before the tenant and variable reads
- OneDriveUsage, Groups, ManagedDevices, ManagedDeviceEncryptionStates, AppRoleAssignments, SiteActivity and the mailbox rules batch add their note properties through PSObject.Properties, keeping Add-Member -Force placement
- mailbox rules batch: .Where() instead of Where-Object
…collectors

- TeamsVoice: build each number row directly instead of Select-Object * with calculated properties, keep Add-Member -Force placement, .Where() for the final filter
- ExoCASMailboxSmtpAuth: filter each streamed page with foreach instead of a Where-Object per mailbox
- Include Entra's error_description instead of a bare 400
- Log the app management policy action and tenant for Send Push
- Detect classic sites from the /Guid(...)/ GroupId SharePoint returns
- Send the lock change on its own: before other properties when unlocking, after them when locking
- Skip other properties while a site stays locked and say so in the result
- Send ApplyToNewDocumentLibraries with a site version policy so it is stored
- File snoozes under the alert function's real name so casing differences in email links still match
- Give the SharePoint and OneDrive quota items a stable Message so usage changes keep the same content hash
…urface rejected tenant writes

- Queue existing-library updates with an explicit site policy; inheriting the tenant never updated them
- Clear every version limit when trimming automatically, which SharePoint requires
- Throw when SharePoint returns ErrorInfo from a tenant write instead of reporting success
feat: add bulk license pricing import/export
…60925

chore(openapi): regenerate API spec (2026-09-25)
Zacgoose and others added 28 commits October 11, 2026 15:25
…ption paths in tests

- Get-CIPPCopilotReport asks for D28 and retries D30 on Graph's period error; ListCopilotUsage and both Copilot collectors use it
- CippIndex.First replaces Find | Select-Object -First 1 in ZTNA tests and the NinjaOne sync
- What-If response matching, simulation identity picks and token expiry no longer throw internally
- resolve each suite's commands once per runspace instead of per suite run
- remember a failed tenant capabilities lookup for two minutes
- drop effectiveRules from the RoleManagementPolicies test projection; ZTNA21819/21820 read rules
- replace empty-collection index lookups in Security Simulations, ZTNA21818 and the baseline engine
…hurn in the tests run

- resolve collectors, prepare hooks and executors with a direct command lookup instead of Get-Command
- skip the collector lookup for definitions without a cache type
- take a remembered capabilities failure without rethrowing it; pin Test-CIPPStandardLicense behaviour in tests
- remember a failed SharePoint root site lookup for two minutes
- avoid exception-driven paths in Get-NormalizedError, Get-CippUserAgent, prepare hooks and ZTNA21992
…o background workers at startup

- CIPPDB, CIPPBaselines, CIPPTests and CIPPAlerts join BgModules, so background workers share one parse instead of each autoloading its own copy
The fleet overview mixed every baseline together. It can now be scoped
to one baseline, and optionally one of its stages: a tenant's standard
counts when that baseline has rolled it out to the tenant (stages up to
its current stage, or just the chosen stage). Standards shared by two
baselines count toward both, which the page notes. Stored trends are
fleet-wide, so the trend chart is hidden while filtered, and a filter
with nothing scorable shows a dash instead of 0%.

The Alignment tab's by-standard view gets the same filters and reads
them from the URL, so the Open Deviations and License Missing tiles
carry the filter there. Those tiles passed onClick, which CippInfoBar
ignores, so they never navigated; they now use link.

ListBaselineAlignment takes optional baselineId and stage parameters
with byStandard; the unfiltered response is unchanged. The tenant
view's per-baseline score now matches exact standard instances through
the same stage helper, so package members count and other baselines'
instances no longer skew it.

Closes #868
JIT admin approval was instance-wide. A new "Tenants that need approval"
setting limits it to selected tenants and tenant groups; leaving it empty
keeps approval in every tenant.

- entries store the tenant's customer id, and the requested tenant is
  resolved so its customer id, default and initial domain all match
- groups are read from storage rather than Get-TenantGroups, which hides
  groups outside the caller's scope, and older domain-keyed member rows
  still match
- an unresolvable tenant, a failed lookup or a deleted group keeps
  approval required
- trigger roles are checked first, so requests they rule out skip the
  tenant lookup
…tion and AAGUID picker

- baseline variables can show or hide on a condition; hidden values are kept unless the definition sets clearOnHide
- FIDO2 key restrictions allow Windows Hello and Authenticator passkeys by default, with an opt-out switch
- AAGUIDs is a creatable picker of mainstream authenticators; comma-separated values saved before still load
- field guidance and description explain AAGUIDs, attestation and common setups
Feat: Scope JIT admin approval to specific tenants and tenant groups
… pass

- Exact organization name match, then the organization owning most of the tenant's Intune devices (serial, then device name)
- Intune devices read from the ManagedDevices report cache instead of a per-tenant Graph fan-out
- Runs on the extension timer before the NinjaOne sync is scheduled, so new tenants map without visiting the page
- Already-mapped organizations are no longer re-used, and ties or serials shared between organizations are skipped
…-map behaviour

- The extension timer runs only the organization name pass, so it never downloads every NinjaOne device
- Device matching stays on the Automap Companies button
- HaloPSA, Hudu and NinjaOne docs describe what each auto-map matches and that it runs every two hours
The push-subscription flow now surfaces browser notification permission denials instead of swallowing them. The preferences page shows a clear status message while waiting for permission and explains how to enable notifications if the browser prompt does not appear.
…engine

- small batches cut the referenced entries out of the cached directory; a search's large slices share one full parse
- validate the cached users blob with Test-Json instead of parsing it
- share the expanded rule set across tenants
- map GUIDs without Add-Member or a log line per mapping, and before the placeholders are added
- parse and serialise records with CippJson
- drop the per-worker directory memo and the per-batch rule configuration log
Invoke-ListAuditLogCoverage pulled the entire ledger and filtered by date range and tenant in memory, timing out on large instances. Push the WindowStart range and tenant selector (PartitionKey or TenantId) into the table query instead.

Also add a 30-day cleanup of the coverage ledger in Start-LogRetentionCleanup, since the ledger has no other retention and only needs ~50 hours for the engine to function.

Add tests covering the server-side filter construction and the new cleanup batch behavior.
Change Baselines feature flag description from "public beta" to "opt-in feature" to reflect its current status.
Update yarn.lock for sharp 0.35.5, prosemirror-view 1.42.6, and source-map-js 1.2.2.
@JohnDuprey
JohnDuprey merged commit 5ceda86 into main Oct 12, 2026
26 of 27 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants