Skip to content
This repository was archived by the owner on Sep 29, 2026. It is now read-only.

[pull] dev from KelvinTegelaar:dev - #126

Open
pull[bot] wants to merge 2065 commits into
covenanttechnologysolutions:devfrom
KelvinTegelaar:dev
Open

pull[bot] wants to merge 2065 commits into
covenanttechnologysolutions:devfrom
KelvinTegelaar:dev

Conversation

@pull

@pull pull Bot commented Apr 24, 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 Apr 24, 2026
@pull pull Bot added the ⤵️ pull label Apr 24, 2026
Split the Windows upgrade capability into windowsEnterprise, windowsBusiness, and a new virtualDesktop capability for finer-grained matching.

Products made up solely of service plans not mapped to any capability (e.g. Windows 365, Defender for Identity) no longer contribute to a user's capability union for Consolidate/Protect suggestions, since bundling them into a "covering" target was misleading. Cost basis and family lists for these suggestions now only include describable products.

Added a PlanNamesById parameter and PlanLosses helper to surface, by friendly name, any unmapped service plans that a downgrade/consolidation target would silently drop, so users see what they'd lose even when no capability describes it.

Synced from CyberDrain/CIPP@e670ba7
Adds a new EWSAllowedAppIds standard/baseline that enables EWS and additively manages the EwsAllowedAppIDs list (presets, custom app IDs with tenant variable support, optional discovery of apps holding EWS permissions, and the Exchange hybrid app). Known-malicious app IDs are never added and only removed when explicitly opted in. Includes shared state/discovery helpers, standards.json entries, and Pester tests. Also updates DisableEWS docs to note the conflict between the two standards.

Synced from CyberDrain/CIPP@b5dd367
Introduce Get-CIPPStatsBaselines to compute BaselineCount, BaselineTenantCount, and BaselineStandardsCount from the BaselineRollouts and Baselines tables. Wire these into Start-CIPPStatsTimer's payload along with FeatureFlags, and add Pester tests covering normal and failure cases.

Synced from CyberDrain/CIPP@c4a2db7
Add Update-CippVersion.ps1 to keep version_latest.txt, package.json, and version.json in sync when bumping releases. Bump version from 11.0.0 to 11.0.1.

Synced from CyberDrain/CIPP@9d0fdce
Replace static storage-derived field list with a note that the endpoint returns upstream data as-is, since actual shape depends on upstream API.

Synced from CyberDrain/CIPP@6e05bf9
POST operations on endpoints supporting both GET and POST now get a method-suffixed operationId (e.g. ListTenantsPost) instead of duplicating the GET operationId, avoiding OpenAPI spec collisions. Regenerated the spec and added a test asserting distinct operationIds for dual-method paths.

Synced from CyberDrain/CIPP@d3fe599
Add-CIPPDbItem meant to sample the shape from the first rows only, but
the counter was incremented inside a scriptblock run with '&', which has
its own scope, so every row was walked. An 18k-row write spent 72s of
CPU on it instead of ~4s, which affected every cache writer.

Count the sample in the process block, and sample 10 rows: the shape
only feeds the report builder's field picker, which accepts typed names.

Synced from CyberDrain/CIPP@df34c92
- DetectedApps and IntuneAppInstallStatus no longer sleep waiting on the
  export job; the Intune group starts the exports first and reads them last.
- Nightly cache runs at P10, its Intune group at P9, tests at P11.
- Export pre-submission P3, NinjaOne syncs P6, table cleanup P8.

Synced from CyberDrain/CIPP@0d256c2
- Get-User and Get-Mailbox are read a page at a time via New-ExoRequest -StreamPages.
- Rows are built directly and written as each page arrives; lookups stay compact.
- Add CIPP.CippJson.ToJson; Add-CIPPDbItem uses it when available.

Synced from CyberDrain/CIPP@bc12a57
- an unfinished self-service password reset counts as a failed try, not activity
- a failed interactive sign-in that got past the password (MFA or Conditional Access stopped it) scores against an address with no successful sign-in
- investigators can mark an address Suspicious in the IP review

Synced from CyberDrain/CIPP@c678acf
- read the user's scheduled travel policies (countries and dates) into the case
- a sign-in or action from a trip country during the trip is not foreign or a new country
- the rest of the address evidence is still judged

Synced from CyberDrain/CIPP@637dcf7
…date-20260929

chore(docs): refresh published docs page snapshot (2026-09-29)

Synced from CyberDrain/CIPP@63c1abd
Test for transient error codes and do not raise an alert if one is found

Synced from CyberDrain/CIPP@b522aad
…tes as Error

Standards that write on every run (checkBeforeRun: false) raised a Remediated alert on
every scheduled cycle even when nothing changed. The alert now fires only on the
transition out of a non-compliant state, matching how Drift alerts already behave.

A remediation write that threw left the row at its graded Drift status, so the alignment
page showed Drift with an empty diff and expected equal to current. The row now persists
as Error, a pending Denied status survives the failure, and the failure log carries the
exception detail so a 403 response body is no longer lost. The alignment page gets an
error colour for that status and offers no Accept/Deny action on it.

Synced from CyberDrain/CIPP@f986260
…'s tenants

- Get-CIPPDbItem reads only a restricted caller's tenant partitions for allTenants; -ByTenant groups rows per managed tenant
- Report helpers hand each tenant its rows instead of reading every row to find tenants and re-reading each tenant
- Move the inactive users helper into Get-CIPPInactiveUsersReport
- Add module-boundary tests for the request tenant scope

Synced from CyberDrain/CIPP@1c1ffd7
The plan-loss helper built its empty target set inline in an if expression, which
PowerShell enumerates to nothing, so a "Remove license" row hit a null set and the
whole report returned 500. The set is now assigned before the branch. The downgrade
call site also passed the user's disabled plans as enumerated strings instead of the
set, so only the first disabled plan was honoured.

Synced from CyberDrain/CIPP@2fea942
- index licensed users by SKU and look up plan names once instead of scanning per license and plan
- project wide cache types and compliance statuses to the fields the sync reads
- build CVE rows from directly read device names in bulk and write the CSV as UTF-8
- serialise the cached device with CippJson.ToJson and format compliance dates without Get-Date
- stop writing the unread user scratch tables
- CippJson: match ConvertFrom-Json date parsing, write AutomationNull as null, add ReadStringField

Synced from CyberDrain/CIPP@8126ff9
github-actions Bot and others added 30 commits October 16, 2026 10:03
- Mailbox and OneDrive usage shown rounded; the input fingerprint uses the shown values
- User documents fetched without materialising their field HTML
- Input fingerprints saved with each write wave, and wave timings logged

Synced from CyberDrain/CIPP@e96070e
- Users and groups are streamed once instead of read twice; group members kept as id lists
- Licence assigned dates counted per day with hashtable lookups
- Device, compliance, OneDrive, licence and tenant dates shown as yyyy-MM-dd

Synced from CyberDrain/CIPP@0b7d089
Centralize next-run calculations across execution and post-execution paths to skip missed intervals without shifting the original schedule. Keep RunNow aligned with recurring slots and add regression coverage.

Synced from CyberDrain/CIPP@72999ae
- Changed users are written in the tenant sync when they fit one wave, else staged 2000 at a time and written by a child run two chunks at once
- Documents are built from the fingerprinted inputs by Invoke-NinjaOneUserDocWrite, shared by both paths
- NinjaOneUserDocFinish records the end of a fanned-out sync and clears its staged rows

Synced from CyberDrain/CIPP@9cddfa8
- Hide them from Add Existing and reject adding, resetting or deleting them
- Skip them in the MCP reconcile on Save to Azure and warmup

Synced from CyberDrain/CIPP@5670280
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.

Synced from CyberDrain/CIPP@8158983
- 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

Synced from CyberDrain/CIPP@927288a
…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.

Synced from CyberDrain/CIPP@c17c9d3
Keep backend and frontend copies in sync. Backend VendorTenantList.json is
additive for upcoming consumers; existing offboarding still uses the frontend list.

Synced from CyberDrain/CIPP@9f5f17e
…t log

- PIM assignments, activations and removals are logged as plain role operations by MS-PIM; role setting changes are not logged

Synced from CyberDrain/CIPP@4f74579
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