Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
51a82e8
updated text guidiance
KelvinTegelaar Jan 18, 2026
f3e3b47
Updated drift management
KelvinTegelaar Jan 18, 2026
2c5ab0d
Update compliant drift monitoring
KelvinTegelaar Jan 18, 2026
438b5a9
Update CippAddTestReportDrawer.jsx
Zacgoose Jan 19, 2026
26d9e09
securescore alert
Zacgoose Jan 19, 2026
476152e
Merge pull request #5216 from Zacgoose/queryKey-tweaks
KelvinTegelaar Jan 19, 2026
8c99a91
Fixed failed labeling workflow
LukeSteward Jan 19, 2026
bf8e912
Expand permissions for Mailbox Permissions menu
JohnDuprey Jan 19, 2026
a578bd7
Merge pull request #5223 from LukeSteward/patch-1
KelvinTegelaar Jan 19, 2026
324e09c
Merge pull request #5219 from Zacgoose/securescore-alert
KelvinTegelaar Jan 19, 2026
02b4ce5
Pass dateFilter to log entry view and API call
JohnDuprey Jan 20, 2026
c17dcea
Improve error handling and retry logic in API calls
JohnDuprey Jan 20, 2026
8e0c76f
Add calendar permissions report page
JohnDuprey Jan 20, 2026
bcd57dc
Fixes drift issues
KelvinTegelaar Jan 20, 2026
efb7f41
Merge branch 'dev' of https://github.com/KelvinTegelaar/CIPP into dev
KelvinTegelaar Jan 20, 2026
a9d0c78
Add tenant region display to lookup page
JohnDuprey Jan 20, 2026
f634ee4
feat(licenses): add restore default excluded licenses
kris6673 Jan 20, 2026
7d239e2
feat(licenses): standardize API calls for exclusion actions
kris6673 Jan 20, 2026
2bd5a12
Add license assignment states to user and group pages
JohnDuprey Jan 21, 2026
a546b73
Add 'Reprocess License Assignments' user action
JohnDuprey Jan 21, 2026
9b9e33d
Merge pull request #5239 from kris6673/excluded-licences
KelvinTegelaar Jan 21, 2026
9c44b99
bump version to 10.0.3
JohnDuprey Jan 21, 2026
488ac9c
Merge pull request #5244 from KelvinTegelaar/dev
JohnDuprey Jan 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .github/workflows/label_sponsor_requests.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
---
name: Label Issues
on:
issues:
Expand All @@ -14,4 +13,6 @@ jobs:
- name: Sponsor Labels
uses: JasonEtco/is-sponsor-label-action@v1.2.0
with:
label: 'Sponsor Request'
label: 'Sponsor Priority'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "cipp",
"version": "10.0.1",
"version": "10.0.3",
"author": "CIPP Contributors",
"homepage": "https://cipp.app/",
"bugs": {
Expand Down
2 changes: 1 addition & 1 deletion public/version.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"version": "10.0.2"
"version": "10.0.3"
}
17 changes: 12 additions & 5 deletions src/api/ApiCall.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ export function ApiGetCall(props) {
title: `${
error.config?.params?.tenantFilter ? error.config?.params?.tenantFilter : ""
} Error`,
})
}),
);
}
return returnRetry;
Expand Down Expand Up @@ -211,7 +211,7 @@ export function ApiPostCall({ relatedQueryKeys, onResult }) {
if (!query.queryKey || !query.queryKey[0]) return false;
const queryKeyStr = String(query.queryKey[0]);
const matches = wildcardPatterns.some((pattern) =>
queryKeyStr.startsWith(pattern)
queryKeyStr.startsWith(pattern),
);

// Debug logging for each query check
Expand All @@ -220,7 +220,7 @@ export function ApiPostCall({ relatedQueryKeys, onResult }) {
queryKey: query.queryKey,
queryKeyStr,
matchedPattern: wildcardPatterns.find((pattern) =>
queryKeyStr.startsWith(pattern)
queryKeyStr.startsWith(pattern),
),
});
}
Expand Down Expand Up @@ -252,15 +252,22 @@ export function ApiGetCallWithPagination({
waiting = true,
}) {
const dispatch = useDispatch();
const queryClient = useQueryClient();
const MAX_RETRIES = retry;
const HTTP_STATUS_TO_NOT_RETRY = [401, 403, 404];
const HTTP_STATUS_TO_NOT_RETRY = [302, 401, 403, 404, 500];

const retryFn = (failureCount, error) => {
let returnRetry = true;
if (failureCount >= MAX_RETRIES) {
returnRetry = false;
}
if (isAxiosError(error) && HTTP_STATUS_TO_NOT_RETRY.includes(error.response?.status ?? 0)) {
if (
error.response?.status === 302 &&
error.response?.headers.get("location").includes("/.auth/login/aad")
) {
queryClient.invalidateQueries({ queryKey: ["authmecipp"] });
}
returnRetry = false;
}

Expand All @@ -270,7 +277,7 @@ export function ApiGetCallWithPagination({
message: getCippError(error),
title: "Error",
toastError: error,
})
}),
);
}
return returnRetry;
Expand Down
4 changes: 2 additions & 2 deletions src/components/CippComponents/CippAddTestReportDrawer.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,13 @@ export const CippAddTestReportDrawer = ({ buttonText = "Create custom report" })

const createReport = ApiPostCall({
urlFromData: true,
relatedQueryKeys: ["ListTestReports"],
relatedQueryKeys: "ListTestReports",
});

// Fetch available tests for the form
const availableTestsApi = ApiGetCall({
url: "/api/ListAvailableTests",
queryKey: ["ListAvailableTests"],
queryKey: "ListAvailableTests",
});

const availableTests = availableTestsApi.data || { IdentityTests: [], DevicesTests: [] };
Expand Down
13 changes: 12 additions & 1 deletion src/components/CippComponents/CippUserActions.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,7 @@ export const useCippUserActions = () => {
labelField: (option) =>
option?.calculatedGroupType
? `${option.displayName} (${option.calculatedGroupType})`
: option?.displayName ?? "",
: (option?.displayName ?? ""),
valueField: "id",
addedField: {
groupType: "groupType",
Expand Down Expand Up @@ -549,6 +549,17 @@ export const useCippUserActions = () => {
"Are you sure you want to change the source of authority for [userPrincipalName]? Setting it to On-Premises Managed will take until the next sync cycle to show the change.",
multiPost: false,
},
{
label: "Reprocess License Assignments",
type: "POST",
icon: <CloudDone />,
url: "/api/ExecReprocessUserLicenses",
data: { ID: "id", userPrincipalName: "userPrincipalName" },
confirmText:
"Are you sure you want to reprocess license assignments for [userPrincipalName]?",
multiPost: false,
condition: (row) => canWriteUser,
},
{
label: "Revoke all user sessions",
type: "POST",
Expand Down
5 changes: 4 additions & 1 deletion src/components/CippWizard/CippSAMDeploy.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,10 @@ export const CippSAMDeploy = (props) => {
here
</Link>
</li>
<li>(Temporary) Global Administrator permissions for the CIPP Service Account</li>
<li>
An account with at minimum: <li>Application Administrator</li>
<li>User Administrator</li>
</li>
<li>
Multi-factor authentication enabled for the CIPP Service Account, with no trusted
locations or other exclusions.
Expand Down
34 changes: 34 additions & 0 deletions src/data/alerts.json
Original file line number Diff line number Diff line change
Expand Up @@ -331,5 +331,39 @@
"label": "Alert on quarantine release requests",
"recommendedRunInterval": "30m",
"description": "Monitors for user requests to release quarantined messages and provides a CIPP-native alternative to the external email forwarding method. This helps MSPs maintain secure configurations while getting timely notifications about quarantine activity. Links to the tenant's quarantine page are provided in alerts."
},
{
"name": "SecureScore",
"label": "Alert on a low Secure Score",
"recommendedRunInterval": "1d",
"requiresInput": true,
"multipleInput": true,
"inputs": [
{
"inputType": "autoComplete",
"inputLabel": "Threshold type absolute number or percent",
"inputName": "ThresholdType",
"creatable": false,
"multiple": false,
"options": [
{
"label": "Percent",
"value": "percent"
},
{
"label": "Absolute",
"value": "absolute"
}
],
"required": true
},
{
"inputType": "number",
"inputLabel": "Threshold Value (below this will trigger the alert)",
"inputName": "InputValue",
"required": true
}
],
"description": "Monitors Secure Score and alerts when it falls below the specified threshold (absolute or percent value). Helps identify security gaps and areas for improvement."
}
]
7 changes: 6 additions & 1 deletion src/layouts/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -719,7 +719,12 @@ export const nativeMenuItems = [
{
title: "Mailbox Permissions",
path: "/email/reports/mailbox-permissions",
permissions: ["Exchange.Mailbox.Read"],
permissions: ["Exchange.Mailbox.*"],
},
{
title: "Calendar Permissions",
path: "/email/reports/calendar-permissions",
permissions: ["Exchange.Mailbox.*"],
},
{
title: "Anti-Phishing Filters",
Expand Down
12 changes: 6 additions & 6 deletions src/pages/cipp/logs/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ const pageTitle = "Logbook Results";
const actions = [
{
label: "View Log Entry",
link: "/cipp/logs/logentry?logentry=[RowKey]",
link: "/cipp/logs/logentry?logentry=[RowKey]&dateFilter=[DateFilter]",
icon: <EyeIcon />,
color: "primary",
},
Expand Down Expand Up @@ -100,14 +100,14 @@ const Page = () => {
setStartDate(
data.startDate
? new Date(data.startDate * 1000).toISOString().split("T")[0].replace(/-/g, "")
: null
: null,
);

// Format end date if available
setEndDate(
data.endDate
? new Date(data.endDate * 1000).toISOString().split("T")[0].replace(/-/g, "")
: null
: null,
);

// Set username filter if available
Expand All @@ -117,7 +117,7 @@ const Page = () => {
setSeverity(
data.severity && data.severity.length > 0
? data.severity.map((item) => item.value).join(",")
: null
: null,
);

// Close the accordion after applying filters
Expand Down Expand Up @@ -157,13 +157,13 @@ const Page = () => {
<>
{startDate
? new Date(
startDate.replace(/(\d{4})(\d{2})(\d{2})/, "$1-$2-$3") + "T00:00:00"
startDate.replace(/(\d{4})(\d{2})(\d{2})/, "$1-$2-$3") + "T00:00:00",
).toLocaleDateString()
: new Date().toLocaleDateString()}
{startDate && endDate ? " - " : ""}
{endDate
? new Date(
endDate.replace(/(\d{4})(\d{2})(\d{2})/, "$1-$2-$3") + "T00:00:00"
endDate.replace(/(\d{4})(\d{2})(\d{2})/, "$1-$2-$3") + "T00:00:00",
).toLocaleDateString()
: ""}
</>
Expand Down
15 changes: 8 additions & 7 deletions src/pages/cipp/logs/logentry.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,13 @@ import { getCippTranslation } from "../../../utils/get-cipp-translation";

const Page = () => {
const router = useRouter();
const { logentry } = router.query;
const { logentry, dateFilter } = router.query;

const logRequest = ApiGetCall({
url: `/api/Listlogs`,
data: {
logentryid: logentry,
dateFilter: dateFilter,
},
queryKey: `GetLogEntry-${logentry}`,
waiting: !!logentry,
Expand Down Expand Up @@ -44,12 +45,12 @@ const Page = () => {
logData.Severity === "CRITICAL"
? "error"
: logData.Severity === "Error"
? "error"
: logData.Severity === "Warn"
? "warning"
: logData.Severity === "Info"
? "info"
: "default"
? "error"
: logData.Severity === "Warn"
? "warning"
: logData.Severity === "Info"
? "info"
: "default"
}
variant="filled"
/>
Expand Down
Loading