Skip to content

feat: dev to release - #956

Merged
JohnDuprey merged 197 commits into
mainfrom
dev
Oct 17, 2026
Merged

JohnDuprey merged 197 commits into
mainfrom
dev

Conversation

@JohnDuprey

Copy link
Copy Markdown
Contributor

No description provided.

NickVAg and others added 30 commits October 1, 2026 18:08
Added docs page for incident response scenarios
SideNavItem read openImmediately only on mount, so client-side navigation
(Ctrl+K page search, breadcrumbs, bookmarks) left the parent sections of
the new route collapsed and the highlighted page hidden. Sections now open
when the route moves into them, without auto-closing ones the user opened.

The active leaf is centered in the nav when it is out of view, measuring
against the sticky sponsor footer, which covered items scrolled to the
bottom edge with block "nearest".
…vices

Direction-scoped Replace kept the All Users / All Devices broad targets in
both directions. For Exclude that is right, the exclusions narrow them, but
for Include it made Replace a no-op on broadly assigned policies: All Devices
plus the picked group still reaches every device, and there was no way in the
UI to narrow a policy from All Devices to a group.

Include + Replace now treats the broad targets as part of the include side, so
the picked groups become the only include targets. Exclusions are kept.
Exclude + Replace is unchanged. Applied to Set-CIPPAssignedPolicy and
Set-CIPPAssignedApplication, helper text and docs updated.
React already escapes text node values, so manually escaping with escapeHtml caused values like '&' and '<' to render as '&amp;'/'&lt;' to the user. Remove the redundant escapeHtml helper and use raw nested values directly, and add a test covering HTML-special characters rendering verbatim.

Closes #883
…known

Without Defender for Office 365 Plan 2 the message details come from the
exported message, which lists the URLs and attachments but carries no
verdict. The chip rendered that gap as "Unknown", which reads as a verdict
Microsoft never gave. It now says "Not analysed" on the header fallback and
keeps "Unknown" for a Defender answer without a verdict.

Closes #873
…ofile

The profile was found by name across every configuration policy, so a
same-named Settings Catalog policy from another template would be graded
as drifted and deleted on remediation. Also require the device
preparation template.
…sting device prep group

The Device Prep baseline only set the Intune Provisioning Client as owner
when it created the device group, so a group made by hand stayed without
it. Ownership is now graded and, on remediation, added to the existing
group in place, without recreating the profile. The profile also has to
use the device preparation template to match, so a same-named policy is
never deleted, and the check and the fix resolve the same group when
several match.
Closes #721
- clearing a tenant's tokens now covers its GUID and every domain
- MessageEncryption, SetDefaultMailboxFont, PlannerBlockTaskDelete, OneDriveLicensedQuota, MigrateOneDriveShortcuts and PIMRoleSettings
- on-demand caches for the per-user/per-mailbox reads: MailboxMessageConfiguration, PlannerUserPolicies, OneDriveQuotas, OneDriveRootShortcuts; ExoIRMConfiguration joins the scheduled Exchange group
- engine: a prepare hook that cannot grade records an error and never runs the executor; configuration errors skip the cache re-collection
- ExoBulkSweep: per-write concurrency, default 16
…te-limit pacing

- nightly cache collection runs one capped run per tenant instead of one flat run
- mailbox permissions, calendar permissions and rules run as a chain per tenant, one type at a time, each stored before the next starts
- CIPPRateLimiter paces EXO from the Rate-Limit-Remaining/Reset headers
- New-ExoBulkRequest retries transient mailbox errors, caps concurrency at 32 and drops the never-logged-on mailbox warning
- $select on the permission and calendar reads
…hub-script

andymckay/labeler is archived (no updates since 2022) and can't set issue
types. actions/github-script now adds the labels and sets the Bug/Feature
type in one step, so issues filed outside the form get the same type the
issue templates apply.
CI: Set issue type in Label Issues workflow
…tion

- Get-CIPPSPOSite -Properties selects only the needed SiteProperties fields and emits sites per page
- SPOSites cache reads, merges and writes sites in chunks of 500
- SharePoint site usage archive enrichment requests only its two fields
Add macOS LAPS password retrieval for Intune-managed devices, route requests by platform while preserving Windows as the default, and document the new device action.
JohnDuprey and others added 23 commits October 16, 2026 10:16
The CA check named users and groups only from the Users and Groups
caches, which the CA standard never refreshes, so groups just created
by a deploy or vacation mode stayed raw ids and showed as drift. Look
up leftover ids live in one directoryObjects/getByIds call.

Closes #927
Short names like [List[string]] only resolve where `using namespace` is
in effect, which the compiled modules do not guarantee, so they fail at
runtime on the path that hits them. Fix the last one and add a static
test that fails on any short generic type name in CIPP-owned modules.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- mailbox permission, calendar and rules stores skip the write when a batch returned no result
- calendar folder cache leaves out UPNs that are not valid table keys
- show the category path on picker results (index rows now carry categoryId)
- exclude nested settings already in the policy from the picker
- tooltip shows the setting id, with help text below when present
- label the values summary as categories and fields
- start new simple collections empty instead of with a blank entry

Fixes #950
- Get-CIPPReportPage pages AllTenants report reads by whole tenants, scoped to allowed tenants
- report-backed list endpoints return { Results, Metadata.nextLink } when manualPagination is set
- their pages opt in via serverPagination; ListGraphRequest AllTenants tables page by default
- mailbox activity sorts in the table instead of on the server
…nges

Detect secrets, certificates, permission grants, owner adds, and directory
role membership when initiated by an application or a user, with KeyDescription
diffing so credential alerts only fire on newly added Verify keys.
Keep backend and frontend copies in sync. Backend VendorTenantList.json is
additive for upcoming consumers; existing offboarding still uses the frontend list.
- save only changed table pages and write them asynchronously
- skip building discarded log messages and replace LokiJS key indexes with a hash index
Adds a Credentials tab (replacing the SSO tab) under Advanced > Authentication
with a CIPP-SAM card next to the existing SSO card, and the backend needed to
see, rotate, revoke and audit the app's credentials.

SAM card and ExecSAMCredentials endpoint
- Status: app and tenant, auth mode, stored secret liveness and expiry,
  certificate registration and expiry, refresh token health (partner and direct
  tenants), and every secret/certificate on the app registration with an owner
  classification (this instance, other CIPP, external, unknown).
- Manage credentials opens the shared table dialog with Revoke, Mark as known
  and Remove known flag as row actions. Rotate secret, Renew certificate and
  Run token update confirm through CippApiDialog; Re-authenticate and Manual
  override deep-link to the wizard.
- Ownership is tracked by storing the secret keyId in AppCache (SecretKeyId)
  everywhere a secret is minted; the weekly timer now judges expiry on its own
  secret instead of the newest one on the app.
- Known flags and provenance (source, actor, created by/at) live in Config
  'SAMCredential' rows and are shown in the table and alerts.

Rotation and auth mode
- Update-CIPPSAMSecret extracts the mint/store/rollback logic the timer used;
  the rotate action and the timer both call it.
- Disabling certificate auth on a secret-less install mints a tracked secret
  with the certificate and only flips once the new secret works for both the
  client-credentials and refresh-token grants.
- Status reads the CertificateAuthentication flag directly instead of the
  per-runspace env mirror.
- New CredentialVersion marker on AppCache: writers bump it and Get-GraphToken
  reloads credentials when it changes, so rotations and mode changes no longer
  leave other runspaces on stale credentials.

Logging and alerting
- Every create, rotate, revoke, flag, renew, mode change and SSO rotation logs
  at Alert severity with the acting user and credential id, never the value.
- Always-on hourly Start-SAMCredentialMonitorTimer diffs the app's credentials
  against a snapshot and alerts on every added/removed credential via
  Send-CIPPAlert (email, PSA, webhook). CIPP's own changes alert immediately
  and are worded as expected ("Created by CIPP (scheduled rotation). No action
  needed"); anything else says to review it.

SSO
- Status returns the client secret expiry; the weekly timer rotates the SSO
  secret within 30 days of expiry and logs that a restart is required.

Shared components
- CippTableDialog no longer renders a second title; a CippDataTable inside a
  dialog sizes to the dialog with a sticky header so only the rows scroll.
- Get-CippKeyVaultSecret gains -IncludeAttributes for the updated timestamp.

Tests: Pester for Update-CIPPSAMSecret (incl. rollback), owner classification,
snapshot diff wording, timer expiry and SSO rotation, certificate-auth
disable gate, Get-GraphToken credential-version reload; vitest for the SAM
card, SSO card, table dialog and data table.
Previously, disabling certificate auth while an existing (non-minted) client secret was still propagating would fall through to the "rotate the secret" error message instead of the propagating message. Now both minted and existing secrets get the appropriate propagating message, and Test-CIPPSAMSecret includes the refresh grant check since Entra activates it later than client_credentials.

Adds a test covering the case where an existing secret is recently rotated and still propagating.
Add new credentials.md page documenting the CIPP-SAM and CIPP-SSO credential management UI, including status chips, actions, credential review, alerts/logging, and auth mode switching. Update SUMMARY.md, authentication README, sso.md, and sam-setup-wizard.md to reference and link the new page.
@JohnDuprey JohnDuprey changed the title fix: dev to hotfix feat: dev to release Oct 17, 2026
@JohnDuprey
JohnDuprey merged commit 32893eb into main Oct 17, 2026
25 of 26 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