Skip to content

[pull] dev from KelvinTegelaar:dev - #105

Open
pull[bot] wants to merge 1533 commits into
isgq-github01:devfrom
KelvinTegelaar:dev
Open

pull[bot] wants to merge 1533 commits into
isgq-github01:devfrom
KelvinTegelaar:dev

Conversation

@pull

@pull pull Bot commented Jun 16, 2026 •

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

@pull pull Bot locked and limited conversation to collaborators Jun 16, 2026
@pull pull Bot added the ⤵️ pull label Jun 16, 2026
… scanning the reporting cache

- Add Get-CIPPLicenseSkuName: LicenseSkuNames table lookups, falling back to the tenant's LicenseOverview row and backfilling the table
- ExecLicenseSearch uses it and accepts tenantFilter
- License backfill sends the current tenant and requests each SKU once per tenant
- Seed the licence SKU name table from the licence overview cache

Synced from CyberDrain/CIPP@345c50b
…t-CopilotReportPeriod function

- Introduced Get-CopilotReportPeriod to handle period validation and fallback for Copilot report requests.
- Updated report fetching logic for UserDetail, Trend, and Adoption types to use the new function, improving error handling and code clarity.

Synced from CyberDrain/CIPP@5e0f313
…verride caches

- collect ActivityBasedTimeoutPolicy in the Graph group
- write ExoCASMailboxSmtpAuth from the existing CAS mailbox stream
- register both cache types

Synced from CyberDrain/CIPP@60e5ea0
…r text

Intune accepts 30 to 270 days for the device cleanup rule; the classic standard's helper
text said 31 to 365.

fixes #811

Synced from CyberDrain/CIPP@d31bdc4
The Check extension executor compares a config fingerprint and skips the redeploy when
nothing changed, but the engine still logged "Successfully changed" and recorded the run
as Remediated. The executor now returns an explicit unchanged marker and the engine
records that run as Compliant with no remediation log line or alert.

Synced from CyberDrain/CIPP@9a9bb2d
…ences

A task asking for Push from a user with no registered devices would notify
nobody. Add-CIPPScheduledTask now refuses it with a pointer to Preferences;
every form funnels through there, so offboarding, JIT admin, vacation mode
and add/edit user are covered. System-created tasks carry no principal and
never select Push, so they are unaffected.

Frontend
- usePushDevices reads the same paginated query the Preferences table runs
  under ListPushSubscriptions and exposes a flattened device list and the
  VAPID public key. Sharing that key with a plain ApiGetCall made the two
  fight over one cache entry.
- Scheduler and alert forms only offer "Push (notify me)" once a device is
  registered, with helper text that says where to enrol or how many devices
  will be notified.
- Preferences card: stable dataMap for the device table (an inline function
  re-mapped the rows on every render and made the table flicker) and the
  public key from the shared hook.

Backend
- Log the push service's status when an expired subscription is pruned.

Tests: enrolment guard (refused with no devices, accepted once enrolled,
device table untouched otherwise); hook reads the paginated cache and words
the hint by count. Verified in Chrome via Playwright: enrol, FCM accepts,
service worker displays the notification, impersonation blocks enrolment,
remove clears the row.

Synced from CyberDrain/CIPP@075753d
- New-ExoBulkRequest: .Where() for the tenant lookup and 429 scan, skip the per-response PSObject.Copy() for object bodies, serialise batch payloads with CippJson.ToJson
- Push-GetMailboxPermissionsBatch: .Where() for the mailbox lookups, drop the per-batch ConvertTo-Json sample logging

Synced from CyberDrain/CIPP@ae3310d
Bumps next to 16.3.8 for the next/og advisory and brace-expansion and dompurify to their
patched releases; suppresses the plain-text SecureString rule where the VAPID private key
is handed to Key Vault; gives Service Health a docs link target; and updates two tests
that lagged behind the BEC drawer hint text and the non-dismissible legacy notice.

Synced from CyberDrain/CIPP@9d43b99
- Include Entra's error_description instead of a bare 400
- Log the app management policy action and tenant for Send Push

Synced from CyberDrain/CIPP@d2bbc74
…Sites filter

- select isPersonalSite in the OneDrive root permissions and long paths site lists so the filter returns sites
- read the SharePoint admin site list in 5,000-row pages with only the fields used
- request only the read fields from getAllSites, the channel site lookup and the library lookup
- leave AutoMapUrl empty for sites without a document library

Synced from CyberDrain/CIPP@2540233
Update-AppManagementPolicy now actively blocks passwordAddition/symmetricKeyAddition on CIPP-SAM when CertificateOnly is set, instead of just leaving them unblocked, and lifts the block in secret mode. Also skips policy management for CIPP-SAM in customer tenants (service principal lock applies there instead), and wires Invoke-ExecCombinedSetup and Update-CIPPSAMSecret to call it explicitly with the correct mode when toggling certificate auth or minting a secret. Adds tests and documentation covering the new behavior.

Synced from CyberDrain/CIPP@054b5e7
fix(alerts): skip TERRL alert when EXO reports no limit threshold

Synced from CyberDrain/CIPP@b548ceb
feat(securescore): points to gain per control, sort, 2-decimal percentages, %/points chart toggle

Synced from CyberDrain/CIPP@28185bb
Add-CIPPGroupMember on a brand-new user always fails until Exchange provisions the mailbox, so inline retries were never going to succeed. Resolve each group's real type via Get-CIPPGroupType, schedule Exchange-backed groups (distribution lists, mail-enabled security) 15 minutes out instead of attempting them inline, and add directory groups immediately.

Extract the Exchange-vs-Graph decision into a shared Test-CIPPGroupIsExchangeBacked helper used by both New-CIPPUserTask and Set-CIPPUser. Add a -DeferExchange switch to Set-CIPPCopyGroupMembers so copying group membership onto a new user queues the Exchange half instead of failing inline, and escape single quotes in scheduled task name filters to avoid malformed OData queries.

Synced from CyberDrain/CIPP@1dade11
Get-CIPPStandards now merges single-instance GroupTemplate standards across multiple contributing templates instead of letting later ones overwrite earlier ones.

Invoke-CIPPStandardGroupTemplate reads the whole GroupTemplate partition and matches requested ids in memory instead of building an 'eq' filter per id, which exceeded table service query limits once settings merged across tiers. Also handles table read failures by logging and skipping the run rather than treating missing templates as drift.

Adds/updates Pester coverage for merged-tier settings and table read failures.

Synced from CyberDrain/CIPP@a18aff6
Set-CIPPAssignedPolicy previously ignored custom exclude group names that didn't match any group, silently falling through without excluding anything. Now unresolved names are collected and the function warns and throws instead of assigning the policy without the intended exclusion. Adds tests covering unresolved, partially resolved, and fully resolved exclude group scenarios.

Synced from CyberDrain/CIPP@84cd16a
Fix incorrect Write-LogMessage parameter usage (-level -> -sev) across Get-Tenants and Invoke-HuduExtensionSync.

When LAPS or BitLocker credential retrieval fails for a device, update the Hudu asset without the credential fields instead of skipping the entire asset update, and skip writing the cache row so the next sync retries credentials. Add tenant-level warnings and error tracking when LAPS/BitLocker metadata retrieval fails for all devices, and when device processing is skipped due to a missing device layout ID. Update tests to match.

Synced from CyberDrain/CIPP@ea66d46
…261021

chore(openapi): regenerate API spec (2026-10-21)

Synced from CyberDrain/CIPP@a1822d9
- Set-CIPPRetentionCompliancePolicy throws with the policy or rule step and the real error
- match an existing rule by the policy GUID it reports, not by policy name
- still deploy the rule of an existing policy when the policy update is refused
- deploy the template comment, stored as 'comments'
- AddRetentionCompliancePolicy returns per-tenant result states with 200/207/500
- baseline executor and classic standard keep deploying the remaining templates

Synced from CyberDrain/CIPP@ce91c49
* fix(bec): use configured PDF branding presets

* fix(bec): use configured PDF branding presets

* fix(bec): use configured PDF branding presets

* test(bec): cover branding in evidence ZIP

* test(bec): verify branding preset reaches PDF renderer

* test(bec): verify variant-specific branding request

* test(bec): match PDF button accessible name

* test(bec): use consistent accessible PDF button selector

* fix(reports): apply configured branding preset in SharingReportButton

* fix(reports): apply configured branding preset in PermissionsReportButton

* fix(reports): apply configured branding preset in MailFlowReportButton

* fix(reports): apply configured branding preset in ShadowAIReportButton

* fix(reports): apply configured branding preset in SharingReportPdf

* fix(reports): apply configured branding preset in PermissionsReportPdf

* fix(reports): apply configured branding preset in MailFlowReportPdf

* fix(reports): apply configured branding preset in ShadowAIReportPdf

* test(reports): cover per-report PDF branding defaults in UI

* test(reports): verify branding preset forwarding in PDF endpoints

* test(bec): make log partition assertion respect rolling 60-day window

Synced from CyberDrain/CIPP@3da756b
- pass report preset ids to the tenant-name and PDF helpers instead of resolving branding inline
- name the tenant once when both BEC PDFs share a preset
- merge the endpoint preset tests into one file and drop redundant fallback cases

Synced from CyberDrain/CIPP@ae9ba6f
- Generate Report on the Domain Analyser page renders a client-ready PDF covering every domain in the tenant from the stored analyser results
- the analyser stores per-check results and an MTA-STS status; DNSSEC and MTA-STS carry 10 points each, and onmicrosoft.com domains are scored out of 140 without them
- an SPF lookup error no longer earns the SPF validation points
- vendor DNSHealth 1.1.11: MTA-STS policy fetch timeout and missing vs not valid messages
- docs for the report and the updated scoring

Fixes #999

Synced from CyberDrain/CIPP@d53e3ac
…ted reports

- Log a one-line task summary and capped parameters, without stored headers or TaskInfo
- Delete generated Report Builder reports and PDFs past the report retention setting

Synced from CyberDrain/CIPP@1730eed
Rebuild the HTML the Hudu sync writes into rich-text fields, based on a
mockup contributed by Jim-Barry. Each asset type now has a view model
(Get-Hudu*ViewModel) and a renderer (Get-Hudu*Body) built from small shared
UI helpers (cards, rows, chips, links, bars, details, icons, tones). This
replaces the inline string building and ConvertTo-Html tables.

People
- Contact, mailbox, OneDrive, access and settings cards, with groups,
  service plans, devices and policies shown as chips.
- A "Needs attention" strip: disabled account, storage thresholds,
  non-compliant or stale devices, report-only CA policies, mail forwarding.
- Internal forwarding resolves the directory object id to the recipient's
  address, and the smtp: prefix is stripped from external forwarding.

Devices
- Device details, hardware (storage bar), enrollment and security cards,
  plus policy and group cards. Replaces the Get-HuduFormattedField, Block
  and LinkBlock helpers.

Magic Dash
- Company dashboard with tiles, licenses, roles (including PIM-eligible
  members), verified domains and licensed users; people linked to Hudu are
  underlined.
- Stale Magic Dashes are cleaned up when a tenant is renamed.

Rendering
- Everything is HTML-encoded and styled inline with translucent colours, so
  it reads on Hudu's light and dark themes; no custom CSS block is needed
  any more.
- Hudu's mobile app ignores flex, so layouts use grid (which stacks on
  phones), inline flow and table rows. A Pester guard rejects flex,
  justify-content, float and gap.
- Hudu wraps every table in a padded scroll div, so consecutive label/value
  rows share one table. Table layout and wrapping are reset inline, so
  values wrap instead of scrolling on any Hudu version.
- Section counts render as chips, and progress bars always show the
  percentage as text.

Settings
- New date and number format (locale) setting for the Hudu integration,
  with timestamps shown in the instance time zone.
- The content hash excludes the synced-at timestamp, so unchanged assets are
  not rewritten on every sync.

Docs and tests updated; new Pester suites cover the renderers and the
attention-item logic.

Co-Authored-By: jbbehar <33136816+jbbehar@users.noreply.github.com>

Synced from CyberDrain/CIPP@025744f
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant