feat(halo): add configurable ticket request source - #323
Merged
KelvinTegelaar merged 1 commit intoAug 18, 2026
Conversation
Halo records tickets created over the API as "Manual" unless the payload carries a source, so CIPP's tickets are indistinguishable from ones an engineer logged by hand when reporting on ticket origin, SLAs or service reviews. Adds an optional Request Source setting to the HaloPSA integration. Create a source in Halo, pick it here, and it is stamped on every ticket CIPP raises. Left blank nothing is sent and Halo applies its own default, so existing installs behave exactly as before. Request sources are lookup type 22 and are instance-wide rather than scoped to a ticket type, so they get their own List key instead of joining HaloPSAFields, which is re-fetched per dropdown and on every ticket type change. Source ids include 0 (Email) and negatives (Halo's built-in integration sources), and both $null -as [int] and '' -as [int] evaluate to 0, so the payload guard checks presence before parsing rather than reusing the truthiness/-gt 0 pattern the priority field uses. Tests cover that, the unconfigured case and the consolidation path.
2 tasks
TecharyJames
added a commit
to TecharyJames/CIPP
that referenced
this pull request
Aug 21, 2026
commit e2cfa2d917d5365f0f241b87440f03bb0f7be6c1
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Fri Aug 21 14:34:48 2026 +0200
fix(openapi): sort generator file scans for cross-filesystem determinism
The table-writer and helper-index scans enumerated files with unsorted
Get-ChildItem -Recurse, and both merges are order-dependent (first writer
that states a type wins; first declaration wins). NTFS enumerates sorted
while ext4 does not, so a spec generated on Windows typed the onboarding
table's Exception/Logs/Relationship fields as string while the ubuntu
runner's regeneration left them untyped, failing the -Check drift gate on
every PR. Sorting on a separator-normalized path makes both platforms
process writers in the same order; the committed spec is already what the
sorted scan produces, so only the generator changes.
commit 5b10ea4ae13bb3b2e39dab8a6250e60b6580da61
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Fri Aug 21 14:11:17 2026 +0200
remove workflow, fix tests
commit b60a21624070771d02a07e67d239b307c31eae7e
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Fri Aug 21 14:01:26 2026 +0200
versions up.
commit f49c6025d3efceffcbde332a13c922d87b42d181
Author: Roel van der Wegen <github@aeternus.tech>
Date: Fri Aug 21 13:31:45 2026 +0200
feat(offboarding): enhance Out of Office message handling
- Introduced logic to resolve Out of Office (OOO) messages only if they are not empty, preventing automatic replies from being set with empty HTML.
- Updated offboarding job to use the resolved OOO message instead of the raw input.
- Adjusted tests to verify that OOO messages are correctly passed into job options.
- Enhanced documentation to clarify the handling of OOO messages and their configuration in user settings.
commit 960f81461c5759a7eb05eb74f6dcc3c8cfe0d5fb
Author: Roel van der Wegen <github@aeternus.tech>
Date: Fri Aug 21 12:53:31 2026 +0200
feat(users): add bulk action to require password change at next logon
Adds ExecRequirePasswordChange so admins can set forceChangePasswordNextSignIn without resetting the password, including multi-select support. Directory-synced accounts are rejected.
commit c6dd7a41e04a9c4dbf4b29443e389782d7e18480
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Fri Aug 21 18:28:20 2026 +0800
feat(vacation): support standalone alert exclusion
Add a new `ExecScheduleAuditExclusionVacation` endpoint and wire the vacation wizard to schedule location-based audit alert exclusions independently of Conditional Access. The UI now presents this as its own action, includes confirmation/results handling, updates vacation-mode filtering, and documents the new fifth action.
Also harden SharePoint sharing-links cache scans by removing the stale PrincipalCount pre-filter path, always using full/incremental delta ground truth, and preserving existing rows when permission batch reads are dropped. Related backend and frontend tests were updated accordingly.
commit e2ccac2194c6f227843b828d1e3581280dfb7fd4
Merge: 97bd9454 1db684e7
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Fri Aug 21 10:28:06 2026 +0200
Merge pull request #126 from jspern/refactor/tap-standard
feat(standards): add TAP lifetime and length configuration
commit 97bd945497e647d1c03f5b55efa61c15a1907a53
Merge: a95df624 ba59db71
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Fri Aug 21 10:27:41 2026 +0200
Merge pull request #248 from CyberDrain/dependabot/npm_and_yarn/frontend/dev/tiptap/starter-kit-3.29.2
chore(deps): bump @tiptap/starter-kit from 3.20.5 to 3.29.2 in /frontend
commit a95df6242ffd096b8fbbd5985b4d9ee861c7c267
Merge: 9a80ce96 e2d19f38
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Fri Aug 21 10:27:32 2026 +0200
Merge pull request #249 from CyberDrain/dependabot/npm_and_yarn/frontend/dev/storybook-10.5.7
chore(deps-dev): bump storybook from 10.3.5 to 10.5.7 in /frontend
commit 9a80ce965c3e226009d79e02394c227ab6b47162
Merge: 0bad5042 449fcd02
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Fri Aug 21 10:26:22 2026 +0200
Merge pull request #252 from CyberDrain/dependabot/npm_and_yarn/frontend/dev/react-dropzone-20.0.0
chore(deps): bump react-dropzone from 15.0.0 to 20.0.0 in /frontend
commit 0bad50426e0b9495531c30f3061c509031af9c0a
Merge: 53815ca6 a79aaf87
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Fri Aug 21 10:16:52 2026 +0200
Merge pull request #313 from CyberDrain/dependabot/github_actions/dev/github/codeql-action-4.37.7
chore(deps): bump github/codeql-action from 4.37.6 to 4.37.7
commit 53815ca6f146c9aa5efaf205773b62ef796d3089
Merge: 31a6220f 226751a3
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Thu Aug 20 22:46:15 2026 -0500
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
commit 31a6220fb1cf99ba4a1e29e82c89ff499cb43684
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Thu Aug 20 22:46:04 2026 -0500
docs: replace embedded API schema with reference to built in integration page
commit 226751a392df475284bc2855ceefb959439864fb
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Fri Aug 21 11:31:42 2026 +0800
feat(worker-health): surface skipped jobs and add job detail off-canvas
The job queue stats row now shows the Skipped count (stale queue entries
whose task was gone by dispatch time - benign, so never flagged red) and
the status filter gains a Skipped toggle. Each job row gets a More Info
off-canvas with the fields the table does not show: id, started and
completed times, and the last error.
QueuedUtc/StartedUtc/CompletedUtc are registered as absolute-date
columns, and the absolute-date formatter now returns a rendered string
instead of a raw Date when the caller accepts nodes - an off-canvas
containing any absolute-date field crashed React before this.
commit 53cafd5cc24125a6d582a2697911163b81d8b4d6
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Fri Aug 21 11:14:25 2026 +0800
fix(core): roll chained orchestrator runs into one queue status
A logical queue operation can span several orchestrator runs carrying
the same QueueId suffix: activities re-queue continuation runs (the
sharing scan's timebox and throttle resumes) and dispatch child
orchestrations. Get-CIPPQueueData returned one entry per run and
callers took the first, so a progress tracker read Completed the
moment the original run's own tasks finished and stopped polling while
resumed work was still running. Queue and reference lookups now roll
the whole chain up: task counts sum across runs, and the status stays
Running while any chained run is active.
commit 9040f665ae8dd2d0ed53ef5f44e26752574a5d3e
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Fri Aug 21 10:55:02 2026 +0800
feat(container-management): show update history as a data table
The Status action now returns the 50 most recent version transitions
instead of 25, and the Update History card renders them in a
CippDataTable (sortable, searchable, exportable) rather than a property
list. RecordedAt is registered as a datetime column so it renders as
relative time like other tables.
commit f532448d867c1881b54ac06e4ec8ac3ee80c18fa
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Thu Aug 20 21:35:11 2026 -0500
docs(quarantine): document the Files and Teams tabs
The quarantine route gained child routes for the Files and Teams Messages
tabs, so the flat page has moved to a section README and each tab now has
its own page, matching the route path the in-app documentation link is
built from.
- move quarantine.md to quarantine/README.md and cover the Email tab
- add quarantine/files.md and quarantine/teams.md for the reduced action
set those tabs offer
- correct the flyout section: it opens from More Info, not a row click,
and it now lists the URLs and Attachments sections
- reorder Table Actions to match the row menu, and document Block Sender,
Download Message, View Message Headers and Submit to Microsoft
- add the three SUMMARY.md nav entries
Renaming quarantine.md changes its published URL, so existing links and
bookmarks to /user-documentation/email/administration/quarantine.md will
need to follow the new path.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit e4c2877f186e299f1e2f19c4830434d0f7466d67
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Fri Aug 21 10:07:22 2026 +0800
fix(sharing-links): resume throttled scans
Add drive-level requeue handling with a persisted RequeueCount so mid-scan throttling resumes from the saved checkpoint instead of restarting or incorrectly completing a drive; stop requeuing after 6 attempts and then fail normally. Also switch principal-mode baseline detection to the dominant PrincipalCount from the first items page (instead of root permissions), preventing inflated root ACL counts from flagging entire libraries; extend resume tests to cover both baseline derivation and throttle requeue/budget behavior.
commit 21081565337c8403ac83e36db6b42fa60f478ee2
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Thu Aug 20 14:59:19 2026 -0500
docs(groups): document member and owner sub-tables
The Show Members and Show Owners buttons were replaced by Members and
Owners columns that open the group's list in a dialog, so the Action
Buttons section documented two buttons that no longer exist.
- Rewrite Action Buttons to cover Add Group and Deploy Group Template
- Add Members and Owners rows to Table Details, and drop the stale
paragraph about expansion columns and the centrally covered Tenant
and Cache Timestamp columns
- Add a Members and Owners section covering both dialogs: their columns,
row actions with bulk availability, and the Add Members and Add Owners
buttons
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit cace79c764a28dd4b88aec7a682ab9174229aea4
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Thu Aug 20 14:50:52 2026 -0500
docs(hudu): list all always-included Magic Dash portal links
The Settings hint named only Microsoft 365 and Entra as the portal links
always written to the Magic Dash card. Exchange, Intune, Teams and Azure
were already always included, and SharePoint was added in 86c7aaf3. Name
each one as it renders on the card.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 23ff8d1edac55d06851701ffb02520bffd4c6251
Merge: 2ad9c1f5 4725bf4b
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Thu Aug 20 21:48:46 2026 +0200
Merge pull request #318 from kris6673/quarantine-overhaul
Feat: Quarantine overhaul with enhanced message details and actions
commit 4725bf4bbe8dc3f9993e171eea0fa1bc11868d2a
Merge: e2a6e577 2ad9c1f5
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Thu Aug 20 21:48:26 2026 +0200
Merge branch 'dev' into quarantine-overhaul
Signed-off-by: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
commit 2ad9c1f50b67d0dbe5a138c19a9e6a98b580dec2
Merge: 791c6971 ba6091cc
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Thu Aug 20 21:45:58 2026 +0200
Merge pull request #348 from MWG-Logan/feat/investigate-drift-standard
fix(standards): clarify UserSubmissions drift rule state
commit ba6091ccb76dc76d0af5bff50d6880f1a898a2a8
Author: Logan Cook <2997336+MWG-Logan@users.noreply.github.com>
Date: Thu Aug 20 14:51:53 2026 -0400
fix(standards): clarify user submissions drift rule state
Keep the built-in Outlook report-button state separate from the optional custom destination rule in the comparison payload, and cover enabled, custom-destination, and disabled configurations.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
commit 791c69718520e71754d3257b1c43019160007b4f
Author: Roel van der Wegen <github@aeternus.tech>
Date: Thu Aug 20 19:26:07 2026 +0200
feat(cipp): enhance group management and UI components
- Improved `Invoke-EditGroup` function to better handle owner additions and removals with enhanced identity resolution.
- Updated `CippApiDialog` to integrate CSV field handling and nested value resolution.
- Introduced `CippDataTableButton` and `CippTableCardButton` components for improved action handling in data tables.
- Added sub-table functionality in `CippDataTable` for displaying members and owners with dynamic API integration.
- Refactored `CIPPTableToptoolbar` to support parent row attachment for bulk actions.
These changes enhance the usability and functionality of group management and data display within the CIPP module.
commit 1d374ecfa9a45cd573d6b509313ac13a38a410ad
Author: Roel van der Wegen <github@aeternus.tech>
Date: Thu Aug 20 19:25:37 2026 +0200
feat(cipp): enhance group management functions with new capabilities
- Added `Add-CIPPGroupOwner` and `Remove-CIPPGroupOwner` functions for managing group ownership.
- Introduced `Get-CIPPGroupType` function to classify groups based on their type.
- Updated `Add-CIPPGroupMember` and `Remove-CIPPGroupMember` functions to improve identity resolution and error handling.
- Implemented `Resolve-CIPPDirectoryId` for resolving directory identities to Graph object IDs.
- Created `Invoke-ExecGroupMembers` as an entry point for managing group members and owners through a unified API.
These changes enhance the overall functionality and usability of group management within the CIPP module.
commit 9cba749b9aa4800c3ef49ad52dc44a122cc34742
Merge: bcb443ac 1e5bb200
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Thu Aug 20 17:59:14 2026 +0200
Merge pull request #344 from jonwbstr/HuduIntegration-switching-magicdash-to-purview-portal
fix: Update Compliance Portal URL to Purview link
commit bcb443ac12cd722b194d49c9f3452d47bbfb5683
Merge: 4700275e 86c7aaf3
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Thu Aug 20 17:59:03 2026 +0200
Merge pull request #345 from jonwbstr/HuduIntegration-magicdash-add-link-to-SharePoint-Portal
feat: Add SharePoint Portal link to Hudu Magic Dash
commit 86c7aaf3bdc714737bb751dfc21c498f31b46e2f
Author: jonwbstr <jon.wbstr@gmail.com>
Date: Thu Aug 20 11:42:55 2026 -0400
Add SharePoint Portal link to Hudu Magic Dash
Signed-off-by: jonwbstr <jon.wbstr@gmail.com>
commit 1e5bb2004ac56cf7d68221dbeb0e2264fef8e40a
Author: jonwbstr <jon.wbstr@gmail.com>
Date: Thu Aug 20 11:10:52 2026 -0400
Update Compliance Portal URL to Purview link
Signed-off-by: jonwbstr <jon.wbstr@gmail.com>
commit 4700275efebe73e2d964977dd35696b9f58d79c8
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Thu Aug 20 08:41:34 2026 -0500
docs(cipp): document application secret verification on Permissions page
The permissions check now verifies the SAM application secret as well as
the application registration's permissions, reporting expiry, imminent
expiry and an in-memory mismatch on the Permissions Check card. Update
that section to match, and split the intro to remove an em dash.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 603bcb1e28cfa2b9d1e8099e6f9bbd59d2b96468
Merge: 28e7abff d23afd8f
Author: Roel van der Wegen <github@aeternus.tech>
Date: Thu Aug 20 14:22:23 2026 +0200
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
commit 28e7abff02d489378dad1eae0c3c03b233e2ff6f
Author: Roel van der Wegen <github@aeternus.tech>
Date: Thu Aug 20 14:22:18 2026 +0200
fix(gdap): ensure OnboardingUrl is set correctly in GDAP invite function (backfill on badly created invites)
Updated the Invoke-ListGDAPInvite script to explicitly add the OnboardingUrl property to the InviteRow object. This change addresses the issue where the OnboardingUrl could be null after writing, ensuring that the URL is always correctly formed and available for the onboarding process.
commit d23afd8ffe3069aa427e34f73ef3d43eb1db7ff2
Merge: 78796ea5 9dfab85d
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Thu Aug 20 14:45:26 2026 +0800
Merge pull request #341 from CyberDrain/chore/license-sku-update-20260820
commit 9dfab85d12f1fe685ec0a60848c55317813a4bcb
Author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Date: Thu Aug 20 06:09:11 2026 +0000
chore(licenses): update Microsoft license SKU data
commit 78796ea5ed6bd917ccf06e1e06e8fc9cbc6027aa
Merge: 08235621 0dd8f77f
Author: Roel van der Wegen <github@aeternus.tech>
Date: Thu Aug 20 00:27:05 2026 +0200
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
commit 082356211b410bc1b16fc3d0158ca60e20aec3fa
Author: Roel van der Wegen <github@aeternus.tech>
Date: Thu Aug 20 00:25:19 2026 +0200
feat(cipp): implement application secret verification in Test-CIPPAccessPermissions
Added functionality to verify the application secret stored in Key Vault, including checks for expiration and warning thresholds. This enhancement ensures that the application secret is valid and up-to-date, improving security and reliability in the CIPP access permissions testing process.
commit 715b0bae96e6814860b0cc21acb22a8d1c8b2565
Author: Roel van der Wegen <github@aeternus.tech>
Date: Wed Aug 19 21:54:19 2026 +0200
feat(gdap): enhance onboarding URL resolution in GDAP invite functions
Updated the Invoke-ExecGDAPInvite and Invoke-ListGDAPInvite scripts to improve the generation of onboarding URLs. The new implementation retrieves the hostname dynamically, ensuring that the onboarding URL is correctly formed based on the current environment. This change enhances the user experience by providing accurate links for onboarding processes.
commit 0dd8f77fc9427c7ef5942bf8a9fec56a22b869fb
Merge: e94f951a 2929741d
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Wed Aug 19 23:59:38 2026 +0800
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
commit e94f951a84fcc680bbf7c730aa9f0b186313e076
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Wed Aug 19 23:58:03 2026 +0800
fix(graph-requests): keep split cache rows in the queue pre-write cleanup
The pre-write cleanup read in Push-ListGraphRequestQueue projected
PartitionKey, RowKey and OriginalEntityId - a subset of the split-entity
markers. Get-AzDataTableLargeEntity then recognised the rows of a split
entity as parts, could not reassemble them without PartIndex/PartCount,
and dropped the whole entity, so tenants whose cached blob was split
across rows were never removed before the rewrite and every refresh
logged a false 'corrupt table entity' error. Project keys only, so the
raw physical rows come back and every row reaches the delete; the
delete already skips part rows it was handed directly.
commit 2929741d323ddd3bb73ce8db794241fc751aee2a
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 10:51:04 2026 -0500
docs(mobile-layout): correct account menu breakpoints
PR #316 moved Universal Search and the Light/Dark Mode entry in the
account popover from mdDown to useIsMobileLayout, so they now appear as
soon as the navigation collapses rather than only on a phone. Update the
window-width table and the universal search page to match, and qualify
the help and support row, which still moves only below 900px.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 14a4a1068b3e3981ea98c726b894cd3719dcb819
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 10:46:02 2026 -0500
docs(halopsa): correct test ticket scope and drop em dash
The Create Test Ticket row still described the button as raising a ticket
using only the ticket type and default priority. New-HaloPSATicket now
stamps a source on the payload, and the test ticket calls that function
directly, so the configured request source applies there too.
Also aligns the Request Source row's closing sentence with the Ticket Type
row above it ("Halo's default"), and replaces the pre-existing em dash in
How Alert Tickets Are Raised with a following sentence, so the page passes
the docs linter clean.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 71e7026d8ffc4b8341d5602b84999980dd0cafd0
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 10:40:00 2026 -0500
docs(shared-features): document self-service access refresh
Adds a Refresh My Access page under Menu Bar covering the account
popover item and the Access Denied page button, the three result
states, and the 30-second cooldown.
Also draws the line the paired backend fix creates: a refresh is for a
change to your own group membership, such as a PIM activation, while
role group mapping changes made in CIPP now apply immediately and need
no refresh.
Documents 8ac85709 and 6ddd24f2.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 1484dcd71ddb40629576e60e9a947d716be75e2b
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 10:28:06 2026 -0500
docs(report-builder): correct licence rendering in generated reports
A generated report now names licences from the tenant's own licence data
with the instance-wide exclusions applied, so excluded and unrecognised
SKUs no longer fall back to a SKU name or identifier. Separate the
preview's behaviour from the report's and link the excluded licences
page.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 01c15ff25dbd0b2ff4eaa2bca615ed708201ec4f
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 10:22:00 2026 -0500
docs(report-builder): document database block value rendering
Licence assignments render as product names and Cloud PCs with no
reported encryption state show as Encrypted (platform-managed), in
both the builder preview and the generated report.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 5acd4020cbc386525cd2e1a8d45f2e6df861d36b
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 10:05:41 2026 -0500
docs(identity): document Add Member action on Groups page
Adds the Add Member row action to the Groups page Table Actions, covering
the user picker, the CSV bulk path and multi-group selection.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 0752cc3efb90f1cb5130b172ce341dd98c9a0bc3
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Wed Aug 19 23:00:58 2026 +0800
docs(alerts): document rogue apps alert sources and CIPP curated list
The Huntress Rogue Apps alert compares tenants against both the public
Huntress RogueApps feed and a CIPP-curated list (Config/MaliciousApps.json),
so it can flag applications that do not appear on the Huntress site. That
second source was previously undocumented, which caused confusion when
detections did not match the Huntress list.
Adds a Rogue Apps docs page covering where the list comes from, what a
detection means, and the applications on the CIPP curated list; links it
from the Add Alert page and navigation; and points the in-app alert
description at the new page.
commit 98d45ca5008074338b6c8cd3b70b3381ec36cfdc
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 09:54:18 2026 -0500
docs(endpoint): document MDE offboarding and macOS wipe device actions
Adds the two new Intune device actions to the Devices page Table Actions
table, in the order they appear in the actions array:
- Offboard from Defender for Endpoint (76489ea), Windows only, covering
the Entra device ID match and the cases that report an error instead
- Wipe Device (7d6a6a9), macOS only, covering the optional Recovery PIN
and the Intel Mac without T2 caveat
Also mentions Defender for Endpoint offboarding in the page intro.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 1225d5293ef640d66457a09f71663b07d7d5d7af
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 09:46:48 2026 -0500
docs(message-encryption): correct IRM field descriptions and align to house style
Re-grounded the Current Configuration table against Set-IRMConfiguration:
- Internal Licensing Enabled: in Exchange Online this setting covers
external recipients as well, and is on by default. The old wording
implied internal only.
- External Licensing Enabled: the parameter is on-premises Exchange only,
so it carries no meaning for a cloud-only tenant. Now says so.
- Transport Decryption: explain what Disabled, Optional and Mandatory do,
and that Optional is the default, instead of just listing the values.
- Purview Message Encryption: describe it as the tenant connecting
directly to Azure Rights Management.
Corrected the Actions section: Sender and Recipient are mailbox pickers
sourced from ListMailboxes, not free-text fields, and the button is
greyed out rather than hidden. Documented the tenant-switch reset.
House style: dropped the divider before the closing include, "licenses"
to "licences" as a noun, converted the HTML table to the markdown
Action/Description form used elsewhere for non-table pages, and put the
headings into Title Case to match the corpus.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 325b40a9befce1add1ccc6cd74085df3faa97dc0
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Wed Aug 19 22:45:36 2026 +0800
fix(standards): improve spam filter policy resolution
Replace the legacy name-list policy lookup with a two-pass resolution: prefer an exact name match, then fall back to the built-in default policy (via IsDefault flag or 'Default' name) when the configured name is one of the known portal/cmdlet aliases. Also detect the built-in policy via IsDefault rather than relying solely on the 'Default' name string.
commit 0e93789eb6de365f962cc3e2a5645a45a344e6c3
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Wed Aug 19 22:44:52 2026 +0800
fix(standards): guard group template against duplicate creation
When Graph or Exchange reads failed, the GroupTemplate standard treated the empty result as 'tenant has no groups' and recreated every templated group on each run. Entra permits duplicate displayNames, so each failed read silently produced twins (2→4→6…).
Adds try/catch guards around both the Graph groups read and the Exchange dynamic distribution group read, logging an error and returning early on failure rather than proceeding with an empty baseline.
Also adds Pester tests covering the happy path (existing group not recreated, genuinely empty tenant creates group) and the failure paths (Graph failure, Exchange failure, report mode).
commit aa53ad9d455ba6b2396b222a0d3d4556d7e777c9
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 09:37:03 2026 -0500
docs(offboarding-wizard): document Send As and Send on Behalf grants
Add the two new mailbox access fields introduced in a0356d8a, correct the
OneDrive label casing to match the UI, and record that selecting Delete user
greys out the mailbox access, forwarding and out of office settings.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit b09037d33ac2fe1eee0daaa5f38c05fd2a9eef74
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 09:30:41 2026 -0500
docs(users): document duplicate username warning on Add User
Covers the warning added in ca0f6a4c, which appears below the domain
selector when the username and primary domain match an existing user
principal name or email alias. Notes that it does not block creation
and that its absence is not confirmation the address is free.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 8ba85f3273a86c2896a815e30ffcf68c5d185992
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 09:22:53 2026 -0500
docs(roles): document operations requiring unrestricted tenant access
Commit 00729896 gates four estate-wide operations behind an unrestricted
tenant scope: adding a tenant through the Setup Wizard, custom data
mapping writes, integration tenant and field mapping writes, and tenant
group management. Adds a central note to the Allowed Tenants step of the
roles guide, and a hint on each page where the restriction is hit.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 8cdcb627c3bf3f098bb0757ce6b55ac05652d833
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 08:55:56 2026 -0500
docs(teams-share): update sharing report scan behaviour
Reflect three sharing-links scan fixes on the Sharing Report page:
- scanning fans out per library, and an oversized library resumes by
itself instead of stalling the tenant scan (ef20e301)
- a library whose permission reads were throttled keeps its existing
links and is read in full on the next sync (ef20e301)
- the Preservation Hold Library is not scanned (ef20e301)
- empty charts read "No data to display" instead of sitting in a
loading state (0930bded)
- locked sites now have their links pruned rather than kept, since a
lock blocks sharing-link redemption, and they return once the lock
is lifted (94b9e736)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 47644a1e9c8c1ae0ad985d197f77f0d6d3e0f5e8
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Wed Aug 19 21:52:21 2026 +0800
fix(auth): ReadWrite rule grants implied Read permission
When a role rule grants X.ReadWrite, it now also matches X.Read endpoints in the permission universe. Previously, objects that only declare a .Read endpoint (e.g. Endpoint.Device) would silently lose access when the role was configured with the .ReadWrite variant.
commit 33227aa5772f39f3c43a968c5e883b07888f4bc2
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 08:34:40 2026 -0500
docs(identity): add guest users to the nav
Adds the SUMMARY entry for the guest users page, placed between Users
and Risky Users to mirror the order of the sidebar in the app.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 10b3efac87f2a36a51113b6fda310c5c68874331
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 08:32:31 2026 -0500
docs(identity): add guest users page
Documents the guest lifecycle dashboard added in 25dea1b7 and moved onto
the report cache in 0831a04d7: the six lifecycle statuses and the order
they resolve in, the summary cards and the status filters they drive,
the table columns and the two row actions.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 6b53d1099c33e9c502ccbf75e52c237deca409b2
Merge: 06cf2907 afac5679
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Wed Aug 19 15:25:57 2026 +0200
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
commit 06cf29072d9dd6d594c807307635942dff4d6b52
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Wed Aug 19 15:25:55 2026 +0200
device encryption state
commit afac567989b0f68d3fd36eaab95d6afc4114a0cc
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 08:13:00 2026 -0500
docs(roles): cover a custom role tenant scope that resolves to no tenants
A custom role can end up scoped to zero tenants, and 98ca5952 makes that
state deny every tenant's data rather than fall through to unrestricted.
The evaluation page had no coverage of it, so the symptom reads as CIPP
showing no data rather than as a scope problem.
Adds a section naming the three ways a scope empties out (allowed tenants
all blocked, a tenant group resolving to no members, custom roles since
deleted) and a matching quick-reference row.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit afeb8ffedd74ac78d8f45f16aeec4bb2a9841dbd
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 08:07:15 2026 -0500
docs(offboarding): document quarantine release request alert removal
Add the RemoveQuarantineAlert switch to the offboarding actions table,
covering what it deletes and what happens when the tenant has no such
alert.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit d654e282a509a8ff4f0fce3547d4cef82fb3e14f
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 08:02:41 2026 -0500
docs(alert-configuration): document alert enable and disable actions
Covers the new Enabled column and the Enable Alert and Disable Alert
row actions added in 8dc8739, and corrects View Task Details to
describe its condition as greyed out rather than hidden.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 7d6a6a92eab9b7de1114fb83ba45809f8429a697
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Wed Aug 19 14:57:12 2026 +0200
add macosx wipe
commit ddc53ecb493528eb01ab3328d1a7df6f4fcad8a9
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 07:54:44 2026 -0500
docs(shared-features): document the support file generator
Adds a Generate Support File entry to the speed dial's Options table and a
section covering the two capture modes, the recording chip, and redaction.
Also adds the action to the mobile hint's larger-screen list, since it is
registered on the speed dial only and does not reach the account menu.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 9c221f25472adf279a3807213f45e0dfbf16ab5d
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 07:40:51 2026 -0500
docs(shared-features): cover GDAP relationships in entity switcher
Add the GDAP relationship pages to the entity switcher's Where It Appears
table, along with a note that its entries are named for the customer and a
warning that the list is partner-level rather than tenant-scoped. Correct
the caching claim to the five minutes the app actually reuses the list for,
and cross-link the group, device, app registration, enterprise application
and relationship pages.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 0d7b4c973a3b8fd9f67522a3288d2f4413446845
Merge: 5059b016 08c22eec
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Wed Aug 19 20:40:53 2026 +0800
Merge pull request #330 from CyberDrain/chore/license-sku-update-20260819
commit 5059b016780cd7ce4399be669544515a438becb9
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 07:27:12 2026 -0500
docs(user-documentation): document version history and hosting details
The Versions card on Application Settings gained Hosting, App Service SKU,
Runtime Stack and Last Updated rows plus a Copy for Ticket button, and the
container management Status & Updates page gained an Update History card.
Document both, including the Unknown fallbacks and the fact that version
transitions are only recorded from the next update onward.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 6e344fa3a97c493b116f5c57af947715f09a5ad6
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 07:23:10 2026 -0500
docs(groups): drop dynamic distribution group from group pages
The group type was removed from the add group form, the add group
template form and the deploy templates wizard in 67adec2b, so it no
longer appears as a selectable type anywhere in the UI.
Removes the type from the Group Type tables on the add group and add
group template pages and from the wizard field table on the deploy
page, narrows the external sender and membership rule settings to the
types that still offer them, and drops the warning describing which
fields a dynamic distribution group ignores at creation.
The stored value is left documented on the group templates list page,
because the backend still handles the type and templates saved before
the change keep it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit b3530b01b030635c5cc95a40c2605eae10d20949
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 07:18:42 2026 -0500
docs(pwpush): document expiry ranges and test failure reporting
Follows 07e0415e, which changed behaviour the page described incorrectly.
- Expiration in Days and Expiration after views now state the accepted
1-90 and 1-100 ranges, and that an out-of-range value is ignored in
favour of the Password Pusher default.
- The branding account selector shows a single explanatory row when no
accounts can be retrieved, and that row cannot be selected. The
"Choose branding" step said the list stays empty instead.
- The Test step now covers failure: the result names the reason rather
than reporting "PWPush is not enabled" for everything.
- Removed the five em dashes flagged by lint_docs.py.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 81dd2ae6456d31fa393bee8b1319b686ec77889f
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 07:12:32 2026 -0500
docs(ca-templates): document custom variables in CA templates
No page covered custom variables in Conditional Access templates, even
though a template is only portable across an estate because of them.
Adds a Custom Variables section to the Create CA Template page: that any
field accepts a %variablename% token, that substitution runs before CIPP
matches names in the target tenant (so a variable-named named location,
authentication strength or authentication context matches the existing
object instead of being recreated on every deploy), that the whole
template is substituted at once so a location reference must use the same
variable text as its display name, and where values are set.
Also notes that this editor's fields carry no variable autocomplete: the
builder has no textFieldWithVariables field, so the % list never appears
and the name has to be typed in full.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 794b474b7d733601b26c7c90c81c064299773390
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 07:07:18 2026 -0500
docs(identity): document last successful sign-in column
Commit 47170a68 added `lastSuccessfulSignInDateTime` to the inactive
users report and changed `lastRefreshedDateTime` to the users cache row
timestamp rather than request time.
Update Table Details to match, correct the inactivity rule to the most
recent of the three sign-in fields, and add a warning that the
interactive and non-interactive columns record attempts rather than
successes. Drop the Tenant row, which is covered centrally by
table-features.md.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit e8d7faee6202703f22345bd10db6bcbb5b3c7dac
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Wed Aug 19 06:56:30 2026 -0500
docs(user-documentation): drop stale drawer action claims
The extended-info drawer no longer carries row action buttons, so four
pages claiming the same actions were available from inside the flyout
were wrong. On the Devices page the remaining flyout sentence moves into
Table Details, where the rest of the corpus keeps row-flyout prose.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 08c22eecd115a3a872161c252f9d145dc2dcf7ba
Author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Date: Wed Aug 19 06:08:54 2026 +0000
chore(licenses): update Microsoft license SKU data
commit ac32924612b9e200608131ab226db33b7c25f0e9
Merge: 4f2b0557 063722f7
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Wed Aug 19 00:41:41 2026 +0200
Merge pull request #316 from k-grube/fix/mobile-ui
Fix(mobile): layout fix 900-1200 viewport, mobile side nav scroll fixes
commit 4f2b055790e59806ae5131dcd7f659d457b9fa98
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Tue Aug 18 17:29:33 2026 -0500
docs(shared-features): document the entity switcher
Detail pages now render their title as a switcher that opens a searchable
list of sibling records, so you can move between users, groups, devices,
app registrations and enterprise applications without going back to the
table. Adds the shared page covering it, registers it in the nav, and
points the View Individual User header paragraph at it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 063722f70adaea95c153b23f5ad891342b4ccaf2
Merge: 34377cb3 62ca8472
Author: k-grube <grube.kevin@gmail.com>
Date: Tue Aug 18 15:27:20 2026 -0700
Merge remote-tracking branch 'upstream/dev' into fix/mobile-ui
commit 62ca847231c23d6dcd3a3c580f4a6ade0d4e5d1a
Merge: d0f916ae 32a4e5e8
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Tue Aug 18 21:29:45 2026 +0200
Merge pull request #323 from Renada-Solutions/feat/halo-request-source
feat(halo): add configurable ticket request source
commit d0f916aec852ee3f506ff15c69ff9fffcdfdd914
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Wed Aug 19 01:23:17 2026 +0800
fix(sharepoint): authenticate StorageQuotas reads with the SAM certificate
The tenant quota endpoint and the quota alert called SPO admin REST
StorageQuotas() with a delegated client-secret token, which 401s on
tenants where the service account lacks SharePoint admin rights; the
endpoint then swallowed the failure into "Not available" and the alert
silently skipped the tenant. Cert-based app-only auth - the same mode
the other SPO admin REST callers already use - succeeds on the tenants
the delegated call failed on.
commit 94b9e73630957cf7d5df623a821f15efc8c87d0a
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Wed Aug 19 01:11:16 2026 +0800
fix(sharepoint): treat locked sites as inactive instead of failed in the sharing-links scan
A NoAccess-locked site (typically an offboarded user's OneDrive) blocks
all content access including sharing-link redemption, so its links are
dead while the lock stands. The scan previously completed such sites as
failed, which protected their cached rows every cycle and logged a
warning per site per scan. A locked site now completes un-failed
without scanning, letting finalisation prune its inactive links; an
unlock later triggers a fresh full scan that re-adds them. Locks
appearing mid-scan get the same treatment at the drive level.
commit 0930bdedbd1357f86db1b475a4c8735a7147b08a
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Wed Aug 19 01:06:10 2026 +0800
fix(sharepoint): show an empty state instead of a permanent skeleton on empty chart cards
CippChartCard treated an empty series as a loading state, so a chart
whose data is legitimately empty - e.g. Top External Recipients on a
tenant with only organization-scope links - rendered a skeleton
forever. Loading now shows the skeleton; loaded-but-empty shows a
"No data to display" placeholder.
commit 23fbd3433206b8e6b78a3f56d0fbd5c25715ca8a
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Wed Aug 19 00:47:56 2026 +0800
chore(api): update api spec
commit 6ddd24f245b10051b33dc8a5a45ea76fd43823ef
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Wed Aug 19 00:47:55 2026 +0800
fix(auth): apply role group mapping changes to user access immediately
Changing which Entra group maps to a CIPP role only bumped the access
scope version, which covers what a role can see - not which roles a
user resolves to. Users kept their previously resolved roles for up to
15 minutes (the cacheAccessUserRoles TTL) plus the allowedUsers sync
interval.
ExecCustomRole now detects an actual mapping change (assign, reassign,
unmap, or role delete with a mapping) and clears the cached per-user
resolutions via the new Clear-CippAccessUserCache helper, then runs the
user sync and invalidates CRAFT's user cache, matching ExecCIPPUsers.
Permission-only role edits skip the fanout.
Set-CIPPAccessRole gets the same treatment, and a repair: it always
threw on its string-typed Group parameter, wrote the mapping under the
wrong partition key with an invalid -Table argument, and its pre-read
used '=' instead of 'eq'. It now writes the same shape ExecCustomRole
does.
commit 8ac85709cd907bbc7194f4570bf76d80ca73cac1
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Wed Aug 19 00:47:55 2026 +0800
feat(auth): add self-service access refresh for PIM-activated roles
Roles resolved from Entra group membership are cached for 15 minutes
(cacheAccessUserRoles) and mirrored into allowedUsers by a 15-minute
sync timer, so a role granted through a PIM-activated group could take
15+ minutes to reach CIPP. ExecRefreshMyAccess lets a signed-in user
clear their own cached resolution, re-check group membership via Graph,
and refresh the allowedUsers projection on demand, behind a 30-second
per-user cooldown.
The endpoint is Public by necessity - a user whose elevation has not
landed yet holds no CIPP role at all - and gates itself on the platform
principal header, refusing app-only API clients.
Frontend: a Refresh my access item in the account popover that runs
through the standard confirm dialog with inline results, and a refresh
affordance with result feedback on the Access Denied page, both
invalidating the cached /api/me so the UI updates in place.
Closes #315
commit 3f3247f23d396697b42af465e0624600ca96a742
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Wed Aug 19 00:42:05 2026 +0800
feat(tests): expose Domain Analyser results to custom tests via the reporting DB
Snapshot the Domain Analyser results already computed into the Domains
table into CippReportingDB as type DomainAnalyser during the Graph cache
collection, so custom tests and reports can read DNS hygiene, email
authentication state and domain health scores through Get-CIPPTestData
without needing network access from the test sandbox.
Rows are keyed by domain so nightly reruns upsert in place, and a tenant
the analyser has not run for is skipped rather than recorded as an
authoritative empty set.
Move the Domain Analyser timer from 05:30 to 01:30 so it completes ahead
of the 03:00 DB cache run and the 04:00 test run, matching the pattern
the Intune report-export timer already uses.
Closes #235
commit 32a4e5e828eafc2905ad6e840a07f7ce7611389d
Author: Jacob Newman <jacob@renada.co.uk>
Date: Tue Aug 18 17:20:22 2026 +0100
feat(halo): add configurable ticket request source
Halo records tickets created over the API as "Manual" unless the payload
carries a source, so CIPP's tickets are indistinguishable from ones an
engineer logged by hand when reporting on ticket origin, SLAs or service
reviews.
Adds an optional Request Source setting to the HaloPSA integration. Create
a source in Halo, pick it here, and it is stamped on every ticket CIPP
raises. Left blank nothing is sent and Halo applies its own default, so
existing installs behave exactly as before.
Request sources are lookup type 22 and are instance-wide rather than scoped
to a ticket type, so they get their own List key instead of joining
HaloPSAFields, which is re-fetched per dropdown and on every ticket type
change.
Source ids include 0 (Email) and negatives (Halo's built-in integration
sources), and both $null -as [int] and '' -as [int] evaluate to 0, so the
payload guard checks presence before parsing rather than reusing the
truthiness/-gt 0 pattern the priority field uses. Tests cover that, the
unconfigured case and the consolidation path.
commit 30cb11bfd4e4f6dfae1e3cead2ca988102a27e2c
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Tue Aug 18 17:44:46 2026 +0200
use actual report.
commit 067ed77464987a5c2b585713a5dea72fb867671a
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Tue Aug 18 17:38:06 2026 +0200
translate license shapes and report update.
commit 661a9c5c6a6033c678e0425fa2ed73479cef1607
Merge: dec62136 a4cea972
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Tue Aug 18 17:29:15 2026 +0200
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
commit dec62136bb2301d60dc11111b92c04cf26d22481
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Tue Aug 18 17:29:13 2026 +0200
add users directly from groups menu
commit a4cea9723184cdc11f0f184d423175f230f41677
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Tue Aug 18 23:26:03 2026 +0800
feat(support): add manual recording mode to support bundle
Adds a 'Record Actions' mode to the support bundle dialog that lets users close the dialog, reproduce an issue, and return to stop recording. A persistent chip indicator is shown while recording is active. Also captures request bodies in the network recording and renames internal serialization fields for clarity.
commit 68e0c011f080ac7e598a1e6cd0ad205dc5dfb0b5
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Tue Aug 18 23:25:57 2026 +0800
refactor(orchestration): resolve priority fallback directly
Fold the out-of-range check into the fallback condition instead of forcing
the explicit value back to $null to re-enter the fallback branch. Same
resolution order and results; one less indirection to read.
commit 0d164a8d75a1e65ab9d19dd43bcb1d00c2a04e0b
Merge: cd046714 44cfa2f9
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Tue Aug 18 16:34:27 2026 +0200
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
commit cd046714a4312d60bb389b919dd0f16d0d69f0ee
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Tue Aug 18 16:34:25 2026 +0200
add AppleUserInitiatedEnrollmentProfiles
commit 44cfa2f9d2850c651792a9e746878b5e93e93291
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Tue Aug 18 08:51:23 2026 -0500
docs(mobile): document mobile and narrow-screen behaviour
Covers the mobile UX work in 19fe49d5, e5ee94bb, c2ba5a96 and d69cbd29 as a
single shared-features page rather than repeating it per page, since every
change is in the shared table, layout, theme and dialog components.
New Shared Features > Mobile Layout page covering the two width thresholds,
where each menu bar control moves, the card list and its controls, selection
mode, the switch to the full table, full-screen detail flyouts and back-gesture
dismissal, the page actions button, the tab picker, breadcrumb collapse,
clamped notices, dialog and wizard layout, and the PDF handoff.
Also updates the pages whose behaviour now differs on a phone, adds the new
"Table view on small screens" preference, and corrects two stale references:
the tenant selector no longer moves into the navigation menu, and the CIPP
Users page is no longer titled "CIPP User Management".
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 7904815c3167ca2a3023da4cf290d9354cb1f40d
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Tue Aug 18 08:22:51 2026 -0500
docs(autopilot): complete group assignment documentation
Reviewed the enrollment profiles page against the sources changed in
PR #296 and corrected the gaps:
- document the missing Identity Group Read fallback, where the group
picker is replaced by a permission warning
- Assign to Custom Group(s) lists every Entra ID group type, not just
security groups
- Remove Assignment(s) can also remove the all devices assignment
- correct the Display Name character set to match both validators,
adding the pipe and backslash and noting hyphens are rejected
- use <strong> for the UI label in the actions table, drop the italics
in the field table, and restore the table's uniform row padding
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 0ca554a819a86c2cd6bafe119884e38691629b71
Merge: 76489ea1 0831a04d
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Tue Aug 18 15:21:38 2026 +0200
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
commit 76489ea1af5ec8ac1f02e8d5fc967cfdd9f908d3
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Tue Aug 18 15:21:36 2026 +0200
new MDE offboarding device action
commit 0831a04d7a867ac8bcab61fa5eff04941b0ebe48
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Tue Aug 18 21:12:59 2026 +0800
feat(identity): serve guest lifecycle dashboard from the report cache
The guest users page now reads cached data from the reporting database
by default, with a toggle back to live Graph and a sync action. The
Guests cache keeps the full beta property set and sponsors, and now
merges in signInActivity where the tenant is licensed for it, stamping
each row with signInLogsCapable so readers can tell a guest who never
signed in apart from a tenant without sign-in data. ListGuestUsers
gains a UseReportDB branch via Get-CIPPGuestUsersReport, AllTenants
support through the cache, and a sponsors column.
commit 2dc0c68a0768b752ecad1d2d2d3e2b357d913567
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Tue Aug 18 21:04:11 2026 +0800
fix(orchestration): pass parent run lineage when queueing Craft child runs
Child orchestrations queued from inside a running activity (e.g. the per-tenant
DomainAnalyser runs spawned by Push-DomainAnalyserTenant) arrived at Craft with
no parent run: the bridge's ambient context read is always null on the reused
pipeline thread, so the parent run finalized and dispatched its PostExecution
while its children were still running.
Read RunName from the stamped $global:CraftOperationContext - the same carrier
the priority default already uses - and pass it explicitly as the new run's
parent, so Craft holds the parent's finalize until the child completes. Probe
the bridge method's arity first: an older Craft runtime only exposes the
6-parameter method, and passing 7 arguments to it would throw instead of
degrading.
commit f45e502c87855c795df8c4fc4e53a88c7664a647
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Tue Aug 18 07:58:59 2026 -0500
docs: cover custom role simple mode and role impersonation
Documents the feature merged in 39767dac, and corrects the permission
category guidance added for 888e38c5, which only holds for per-category
roles now that pattern roles expand at evaluation time.
- roles.md and cipp-roles/add.md: the Simple (patterns) and Advanced
(per-category) modes, pattern syntax, the built-in role template, the
live result panel, and the fact that saving in Simple mode replaces
the category grid.
- how-cipp-evaluates-roles.md: wildcard roles pick up newly added
categories on their own, per-category roles do not. New section on
testing a role with impersonation, including the single-role-in-
isolation caveat.
- cipp-roles/README.md: Impersonate Role table action, an impersonation
section, and why More Info now reads "Effective Permissions (at last
save)".
- super-admin/README.md: pointer to impersonation, which is superadmin
only but lives outside that menu.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 547f533314798bb1a5e74fd5369a8f1f88e58d87
Merge: 89645f91 0aa537d5
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Tue Aug 18 14:56:17 2026 +0200
Merge pull request #188 from kris6673/feat/purview-message-encryption
Feat: Add Purview Message Encryption tools and configuration standard
commit 89645f91f0ad569660923ed1ed0c8ef9919973b7
Author: Brian Simpson <50429915+bmsimp@users.noreply.github.com>
Date: Tue Aug 18 07:44:07 2026 -0500
docs: cover GitHub token fallback and release notes defaults
Documents the behaviour introduced in 4878da5f and c7ec759e.
- GitHub integration: new "When the Token Stops Working" section covering
the read fallback to the shared token, writes still failing, and the log
entry each rejection produces. Test step now describes the failure result
as well as success.
- Release notes notification: the dialog opens on the newest feature
release rather than the running hotfix tag, and a failed refresh serves
the cached release list instead of erroring.
- Release notes notification: new section for the phone layout from
9a0aac50b and 9a668dec2.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
commit 7ba43cd163dfd243789d3642422162dd922c965d
Merge: a0356d8a 3dedce3c
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Tue Aug 18 14:38:02 2026 +0200
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
commit a0356d8ac5a1478543928e96747b60e3a05bb04d
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Tue Aug 18 14:38:00 2026 +0200
added sendas to offboarding wizard
commit 3dedce3ccaf563c0d4d418d3a4ee2053dad0ff66
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Tue Aug 18 20:33:48 2026 +0800
fix(queue): read Craft context via variable lookup
Use `Get-Variable` to fetch `CraftOperationContext` from global scope in orchestrator and queue helpers. This keeps priority detection working on current Craft workers while still degrading cleanly to defaults on older runtimes where the variable is absent.
commit 938c01836357b7b66143e7bba33d13930f8129cc
Merge: ca0f6a4c ba81145e
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Tue Aug 18 14:17:43 2026 +0200
Merge branch 'dev' of https://github.com/CyberDrain/CIPP into dev
commit ca0f6a4cc26dc07962e6ed1c6c8f967c552c7fc9
Author: KelvinTegelaar <49186168+KelvinTegelaar@users.noreply.github.com>
Date: Tue Aug 18 14:12:33 2026 +0200
added ability to duplicate name check, and app consent standard changes
commit ba81145ef1be763d4327e60faa92b40680d16c37
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Tue Aug 18 20:05:49 2026 +0800
fix(exchange): resolve connector comment variables per target tenant
Invoke-AddExConnector ran Get-CIPPTextReplacement once before the tenant
loop with an unassigned $Tenant, so %variable% tokens in the connector
comment resolved against a null tenant. Move the replacement inside the
per-tenant loop on a per-tenant copy of the params, so tokens resolve
against each target tenant and one tenant's resolved values never feed
the next tenant's replacement.
commit f3a9fe1aa4aa7d42b900b12ea16a11967db55dae
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Tue Aug 18 20:05:31 2026 +0800
fix(exchange): seed contact templates from CIPPRootPath instead of relative path
commit e2be9faeb949b63775948752e4fd798234b7a704
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Tue Aug 18 20:03:13 2026 +0800
chore(api): update api spec
commit 4616513b25d61af1cf37132556a66bb1820df0c8
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Tue Aug 18 20:02:56 2026 +0800
feat(orchestrator): add priority-aware queue scheduling
Improve queue priority resolution for orchestrations and starter jobs:
- Start-CIPPOrchestrator now resolves priority via a fallback chain: explicit InputObject.Priority (range-validated) → ambient CraftOperationContext → HTTP-triggered default (P2) → background default (P4)
- Start-UserTasksOrchestrator explicitly sets P2 for user task orchestrations so they don't queue behind P4 background fan-outs
- Add-CippQueueMessage gains a Priority parameter, defaults to P2 for HTTP requests and P5 otherwise, with graceful fallback for older Craft runtimes that lack the priority overload
commit 4887e6bd7266b2bf140cf0be9c2cf7e517b912d3
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Tue Aug 18 20:02:17 2026 +0800
fix(autocomplete): disambiguate default match
Adjust single-select default resolution in `CippAutocomplete` to handle duplicate option values safely. The component now only auto-resolves by `value` when there is exactly one match; when multiple options share the same value, it additionally requires a `label` match and otherwise keeps the stored form value to avoid incorrect remapping after option refreshes.
commit 007298969aeda09fe36633cda0f54e4d83097f03
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Tue Aug 18 19:57:38 2026 +0800
fix(auth): enforce tenant scope on AnyTenant live and write endpoints
AnyTenant skips the framework per-tenant check, so each endpoint now
gates itself: restricted callers resolve the target tenant through the
scope-narrowed Get-Tenants (or filter rows via
Select-CippAllowedTenantData), failing closed. Estate-wide config
writes (extension/custom-data mappings, tenant onboarding, tenant group
rules) require an unrestricted scope. Covers 26 endpoints, with Pester
tests for the three gate shapes.
commit 76834eb1ff53bbcea1a7297d875c936ace468f3c
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Tue Aug 18 19:51:11 2026 +0800
feat(tools): sharing-links seeding and scan measurement dev scripts
New-SharingLinksTestData seeds a dedicated document library with many
small files and organization-scope links (chunked and resumable via
-StartIndex, Retry-After aware, -Cleanup to remove). The measurement
script times the scan phases (delta paging, permission batches, the
real site activity) and projects wall time against the background
activity budget; the comparison script benchmarks the classic
delta-plus-permissions collection against the PrincipalCount pre-filter
and Graph Search discovery on the same drive. All three require a
dot-sourced Initialize-DevEnvironment session.
commit ef20e301c02e14b84a2b719cb4cc428ffc2fc271
Author: Zacgoose <107489668+Zacgoose@users.noreply.github.com>
Date: Tue Aug 18 19:51:01 2026 +0800
fix(sharepoint): marker-based completion and per-drive fan-out for sharing-links scan
The scan-row pending counter and FailedSites JSON list are replaced with
insert-only marker rows: the failed-site list overflowed the 64KB table
property cap at ~315 SharePoint composite site ids, after which every
counter update failed, the counter never reached zero and finalisation
never ran. Markers cannot lose completions to write conflicts and have
no aggregate size cap.
Site tasks now dispatch one resumable task per drive. Drive tasks
timebox themselves (1100s under Craft,…
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #321
Halo records tickets created over the API as "Manual" unless the payload carries a source, so CIPP's tickets can't be told apart from ones an engineer logged by hand when reporting on ticket origin.
Adds an optional Request Source setting to the HaloPSA integration. Create a source in Halo, pick it here, and it's stamped on every ticket CIPP raises. Left blank nothing is sent and Halo applies its own default, so existing installs are unchanged.