Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
124 commits
Select commit Hold shift + click to select a range
3729bce
small updates
KelvinTegelaar Dec 20, 2025
08c8326
dashv2 updates
KelvinTegelaar Dec 21, 2025
cf9da22
reporting template tests
KelvinTegelaar Dec 22, 2025
8159090
reporting updates
KelvinTegelaar Dec 22, 2025
b0d7b6d
Reporting
KelvinTegelaar Dec 22, 2025
7aa2422
Interface changes
KelvinTegelaar Dec 22, 2025
eab3145
add table support for tests
KelvinTegelaar Dec 23, 2025
79b5f92
table support update
KelvinTegelaar Dec 23, 2025
85dd0b4
Added overwrite toggle for transport rule standard
kakaiwa Dec 24, 2025
892223b
Removed Azurite files
kakaiwa Dec 24, 2025
0437492
Update the ability to browse items
KelvinTegelaar Dec 26, 2025
9c2c564
update browsing
KelvinTegelaar Dec 26, 2025
ac84838
bug fixes for tests
KelvinTegelaar Dec 26, 2025
6ee952b
Merge pull request #5141 from cipptesting/dev
KelvinTegelaar Dec 30, 2025
7dc86bf
Add secure score linegrid.
KelvinTegelaar Dec 30, 2025
6235a6f
Report updates
KelvinTegelaar Dec 30, 2025
d2c70dd
New report creation ability
KelvinTegelaar Dec 30, 2025
fa3bbb7
License Sankey
KelvinTegelaar Dec 31, 2025
d8a8282
License sankey
KelvinTegelaar Dec 31, 2025
f2dacd1
prettification
KelvinTegelaar Dec 31, 2025
908c62f
Index updates
KelvinTegelaar Dec 31, 2025
7d0d726
Reverse spinner animation direction
JohnDuprey Dec 31, 2025
e911d25
dashboard updates
KelvinTegelaar Jan 1, 2026
578e070
Design updates
KelvinTegelaar Jan 1, 2026
f17a8bf
up
KelvinTegelaar Jan 2, 2026
e2f4122
Fix silly bug
KelvinTegelaar Jan 2, 2026
28084ff
frontend updates
KelvinTegelaar Jan 2, 2026
847f137
frontend updates
KelvinTegelaar Jan 2, 2026
e410861
feat(alerts): add Intune policy conflict alert configuration
MWG-Logan Jan 2, 2026
0bc8262
Merge pull request #5150 from BezaluLLC/intune-error-alerts
KelvinTegelaar Jan 2, 2026
8f71886
update url.
KelvinTegelaar Jan 2, 2026
b70a305
minor updates
KelvinTegelaar Jan 2, 2026
950118c
Merge branch 'dev' of https://github.com/KelvinTegelaar/CIPP into dev
KelvinTegelaar Jan 2, 2026
f0fc90b
Updates for tests
KelvinTegelaar Jan 2, 2026
040e65f
report drawer
KelvinTegelaar Jan 2, 2026
8ca4c57
Updates
KelvinTegelaar Jan 3, 2026
1fe9dfb
Remove checkboxes
KelvinTegelaar Jan 3, 2026
e4048ba
create ability to run tests
KelvinTegelaar Jan 3, 2026
dcde271
text updates
KelvinTegelaar Jan 3, 2026
99edba7
Update row scrolling
KelvinTegelaar Jan 3, 2026
9912b79
updates
KelvinTegelaar Jan 3, 2026
839a78b
Updates for standards
KelvinTegelaar Jan 3, 2026
e6d4a68
redesign drift
KelvinTegelaar Jan 4, 2026
e36c360
improvements to UX for bannerlist card and drift
KelvinTegelaar Jan 4, 2026
426be86
updates to interface
KelvinTegelaar Jan 4, 2026
875e030
Implement suggested policies by Jon
KelvinTegelaar Jan 4, 2026
b88e20a
Jons suggested sort
KelvinTegelaar Jan 4, 2026
8988313
Drift mgmgnt
KelvinTegelaar Jan 4, 2026
22c0729
drift management
KelvinTegelaar Jan 4, 2026
ffc8745
updates to compares and prettification
KelvinTegelaar Jan 4, 2026
558efa3
Feat: Add trusted and blocked senders card and action
kris6673 Dec 15, 2025
a5a8a8d
damn you typo
kris6673 Dec 15, 2025
55548ad
Fix: Add requestDate default column and make it a pretty DateTime in …
kris6673 Jan 5, 2026
d3d3a71
Update API config to post entire row in drift management
JohnDuprey Jan 7, 2026
1b782bb
Add IP range support to roles
JohnDuprey Jan 7, 2026
b9256ac
Add $orderby support to Graph Explorer filter
JohnDuprey Jan 7, 2026
75f183a
Merge pull request #5161 from kris6673/small-insignificant-change
JohnDuprey Jan 7, 2026
84bd2bb
fix group type in edit user
JohnDuprey Jan 7, 2026
9e1df4d
Refactor tenant selection effects to include additional dependencies …
ZenTopBrandon Jan 7, 2026
3a3f9a9
oops I changed too much
ZenTopBrandon Jan 7, 2026
9680052
Merge pull request #5167 from ZenTopBrandon/TenantSelectorBugFix
JohnDuprey Jan 8, 2026
37d28c6
Update CippAddEditUser.jsx
JohnDuprey Jan 8, 2026
aa27f33
Handle null items in standards template arrays
JohnDuprey Jan 8, 2026
8e190b5
Update edit.jsx
JohnDuprey Jan 8, 2026
467e624
Add Dependabot configuration for npm updates
LukeSteward Jan 8, 2026
15bae48
Update GDAP invite URLs to new Microsoft admin domain
sfaxluke Jan 9, 2026
3f87721
Add deprecated standard handling to UI
JohnDuprey Jan 9, 2026
bd9f532
Merge pull request #5175 from sfaxluke/new-gdap-urls
JohnDuprey Jan 10, 2026
f9d49f1
Merge pull request #5172 from LukeSteward/dev
JohnDuprey Jan 10, 2026
41a485c
Merge pull request #5092 from kris6673/JunkEmailConfiguration
JohnDuprey Jan 10, 2026
9ac3199
Fix reporting
KelvinTegelaar Jan 11, 2026
8647fe5
prettification
KelvinTegelaar Jan 11, 2026
458676f
Add description field
KelvinTegelaar Jan 11, 2026
4a9905d
added field
KelvinTegelaar Jan 11, 2026
b73e474
making buttons the same
KelvinTegelaar Jan 12, 2026
c380f5a
Add showTitle prop to ScheduledTaskDetails
JohnDuprey Jan 12, 2026
a9256de
Add responsive compact mode to table toolbar
JohnDuprey Jan 12, 2026
0cde722
prettification
KelvinTegelaar Jan 12, 2026
b18b16a
Merge branch 'dev' of https://github.com/KelvinTegelaar/CIPP into dev
KelvinTegelaar Jan 12, 2026
15f9d64
added SecDefaultsDisabled
KelvinTegelaar Jan 12, 2026
678e8e7
no desc is prettier
KelvinTegelaar Jan 12, 2026
ba99502
Add JIT Admin Templates and settings integration
Zacgoose Jan 13, 2026
f742779
update standards with extra tags
KelvinTegelaar Jan 13, 2026
e4aa1ac
updates dashboard
KelvinTegelaar Jan 13, 2026
431e870
updates dashboard
KelvinTegelaar Jan 13, 2026
824a9ed
fix report creation
KelvinTegelaar Jan 13, 2026
bcae216
fix report creation
KelvinTegelaar Jan 13, 2026
1c5161b
Merge pull request #5192 from Zacgoose/JIT-featues
KelvinTegelaar Jan 13, 2026
272dc0f
move JitAdminSettings
KelvinTegelaar Jan 13, 2026
990b0d1
height fix.
KelvinTegelaar Jan 13, 2026
1d7871d
remove cipp server url
JohnDuprey Jan 13, 2026
d66aded
Filter out standards with missing templates in drift view
JohnDuprey Jan 13, 2026
2a1ebff
height fix
KelvinTegelaar Jan 13, 2026
381ad92
dashboard fix
KelvinTegelaar Jan 14, 2026
4933cd8
dashboardv2 fixes
KelvinTegelaar Jan 14, 2026
3ed3b57
remove all tenant support
KelvinTegelaar Jan 14, 2026
b55ac1a
Fix issue with undefined JIT templates
JohnDuprey Jan 14, 2026
88c37f0
Fix tag monitoring
KelvinTegelaar Jan 14, 2026
e7414d3
Merge branch 'dev' of https://github.com/KelvinTegelaar/CIPP into dev
KelvinTegelaar Jan 14, 2026
08b4a55
Tenant drift management
KelvinTegelaar Jan 14, 2026
d3a72fa
Fix applied Standards
KelvinTegelaar Jan 15, 2026
76f2b7e
imrovements to applied standards
KelvinTegelaar Jan 15, 2026
6cbe2de
Add tenant fetching state and refresh to role form
JohnDuprey Jan 15, 2026
48b9a45
Update relatedQueryKeys for custom role actions
JohnDuprey Jan 15, 2026
841612e
Fixed issue with buttons and improved design
KelvinTegelaar Jan 15, 2026
5134bc5
improve design
KelvinTegelaar Jan 15, 2026
ba4ab82
Merge branch 'dev' of https://github.com/KelvinTegelaar/CIPP into dev
KelvinTegelaar Jan 15, 2026
d000695
Fixed calculations
KelvinTegelaar Jan 15, 2026
cf1cfa7
improve padding
KelvinTegelaar Jan 15, 2026
d803141
fixes with tags
KelvinTegelaar Jan 15, 2026
0bd3db3
fixes with tags
KelvinTegelaar Jan 15, 2026
4b3f007
Design changes
KelvinTegelaar Jan 15, 2026
1ec1196
UX updates
KelvinTegelaar Jan 15, 2026
0c4c451
bug fixes drift
KelvinTegelaar Jan 15, 2026
48d6af8
Update source type from Extension Sync to Reporting DB
JohnDuprey Jan 16, 2026
30bdb44
Add Mailbox Permissions report page
JohnDuprey Jan 16, 2026
202cf34
Add tenant support to mailbox permissions report
JohnDuprey Jan 16, 2026
cc4eb7e
group by default
KelvinTegelaar Jan 16, 2026
d7ce7b0
Update mailbox permissions sync API and table columns
JohnDuprey Jan 16, 2026
93bf99b
Add sync functionality to MFA Report page
JohnDuprey Jan 16, 2026
5c7fa36
Add Relentless Solutions as a sponsor
JohnDuprey Jan 16, 2026
cede7f0
Replace info alerts with tooltip icons in reports
JohnDuprey Jan 16, 2026
a11c64b
Bump version to 10.0.0
JohnDuprey Jan 16, 2026
221faa7
Merge pull request #5202 from KelvinTegelaar/dev
KelvinTegelaar Jan 16, 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
12 changes: 12 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file

version: 2
updates:
- package-ecosystem: "npm" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "weekly"
target-branch: "dev"
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "cipp",
"version": "8.8.2",
"version": "10.0.0",
"author": "CIPP Contributors",
"homepage": "https://cipp.app/",
"bugs": {
Expand Down Expand Up @@ -106,7 +106,7 @@
"redux-persist": "^6.0.0",
"redux-thunk": "3.1.0",
"rehype-raw": "^7.0.0",
"remark-gfm": "^3.0.1",
"remark-gfm": "^4.0.0",
"simplebar": "6.3.2",
"simplebar-react": "3.3.2",
"stylis-plugin-rtl": "2.1.1",
Expand Down
Binary file added public/sponsors/relentless-dark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/sponsors/relentless-light.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion public/version.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"version": "8.8.2"
"version": "10.0.0"
}
36 changes: 35 additions & 1 deletion src/components/CippCards/CippBannerListCard.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { useState, useCallback } from "react";
import {
Box,
Card,
Checkbox,
Collapse,
Divider,
IconButton,
Expand All @@ -16,13 +17,34 @@ import { CippPropertyListCard } from "./CippPropertyListCard";
import { CippDataTable } from "../CippTable/CippDataTable";

export const CippBannerListCard = (props) => {
const { items = [], isCollapsible = false, isFetching = false, children, ...other } = props;
const {
items = [],
isCollapsible = false,
isFetching = false,
children,
onSelectionChange,
selectedItems = [],
...other
} = props;
const [expanded, setExpanded] = useState(null);

const handleExpand = useCallback((itemId) => {
setExpanded((prevState) => (prevState === itemId ? null : itemId));
}, []);

const handleCheckboxChange = useCallback(
(itemId, checked) => {
if (onSelectionChange) {
if (checked) {
onSelectionChange([...selectedItems, itemId]);
} else {
onSelectionChange(selectedItems.filter((id) => id !== itemId));
}
}
},
[onSelectionChange, selectedItems]
);

const hasItems = items.length > 0;

if (isFetching) {
Expand Down Expand Up @@ -91,6 +113,16 @@ export const CippBannerListCard = (props) => {
alignItems="center"
sx={{ flex: 1, minWidth: 0 }}
>
{onSelectionChange && (
<Checkbox
checked={selectedItems.includes(item.id)}
onChange={(e) => {
e.stopPropagation();
handleCheckboxChange(item.id, e.target.checked);
}}
onClick={(e) => e.stopPropagation()}
/>
)}
<Box
sx={{
alignItems: "center",
Expand Down Expand Up @@ -224,4 +256,6 @@ CippBannerListCard.propTypes = {
).isRequired,
isCollapsible: PropTypes.bool,
isFetching: PropTypes.bool,
onSelectionChange: PropTypes.func,
selectedItems: PropTypes.array,
};
129 changes: 129 additions & 0 deletions src/components/CippComponents/AssessmentCard.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
import { Card, CardHeader, CardContent, Box, Typography, Skeleton } from "@mui/material";
import { Security as SecurityIcon } from "@mui/icons-material";
import { ResponsiveContainer, RadialBarChart, RadialBar, PolarAngleAxis } from "recharts";
import { CippTimeAgo } from "../CippComponents/CippTimeAgo";

export const AssessmentCard = ({ data, isLoading }) => {
// Extract data with null safety
const identityPassed = data?.TestResultSummary?.IdentityPassed || 0;
const identityTotal = data?.TestResultSummary?.IdentityTotal || 1;
const devicesPassed = data?.TestResultSummary?.DevicesPassed || 0;
const devicesTotal = data?.TestResultSummary?.DevicesTotal || 0;

// Determine if we should show devices section
const hasDeviceTests = devicesTotal > 0;

// Calculate percentages for the radial chart
// If no device tests, set devices to 100% (complete)
const devicesPercentage = hasDeviceTests ? (devicesPassed / devicesTotal) * 100 : 100;
const identityPercentage = (identityPassed / identityTotal) * 100;

const chartData = [
{
value: devicesPercentage,
fill: "#22c55e",
},
{
value: identityPercentage,
fill: "#3b82f6",
},
];

return (
<Card sx={{ height: "100%" }}>
<CardHeader
title={
<Box sx={{ display: "flex", alignItems: "center", gap: 1 }}>
<SecurityIcon sx={{ fontSize: 20 }} />
<Typography variant="subtitle1">Assessment</Typography>
</Box>
}
sx={{ pb: 1.5 }}
/>
<CardContent>
<Box sx={{ display: "flex", gap: 3 }}>
<Box sx={{ flex: 1 }}>
<Box sx={{ mb: 2 }}>
<Typography variant="caption" color="text.secondary">
Identity
</Typography>
<Typography variant="h5" fontWeight="bold">
{isLoading ? (
<Skeleton width={80} />
) : (
<>
{identityPassed}/{identityTotal}
<Typography
component="span"
variant="caption"
color="text.secondary"
sx={{ ml: 1 }}
>
tests
</Typography>
</>
)}
</Typography>
</Box>
{hasDeviceTests && (
<Box sx={{ mb: 2 }}>
<Typography variant="caption" color="text.secondary">
Devices
</Typography>
<Typography variant="h5" fontWeight="bold">
{isLoading ? (
<Skeleton width={80} />
) : (
<>
{devicesPassed}/{devicesTotal}
<Typography
component="span"
variant="caption"
color="text.secondary"
sx={{ ml: 1 }}
>
tests
</Typography>
</>
)}
</Typography>
</Box>
)}
<Box>
<Typography variant="caption" color="text.secondary">
Last Data Collection
</Typography>
<Typography variant="body2" fontSize="0.75rem">
{isLoading ? (
<Skeleton width={100} />
) : data?.ExecutedAt ? (
<CippTimeAgo data={data?.ExecutedAt} />
) : (
"Not Available"
)}
</Typography>
</Box>
</Box>
<Box sx={{ width: "40%", maxWidth: 120, aspectRatio: 1 }}>
{isLoading ? (
<Skeleton variant="circular" width="100%" height="100%" />
) : (
<ResponsiveContainer width="100%" height="100%">
<RadialBarChart
innerRadius="20%"
outerRadius="100%"
data={chartData}
startAngle={90}
endAngle={450}
>
<PolarAngleAxis type="number" domain={[0, 100]} tick={false} />
<RadialBar dataKey="value" background cornerRadius={5} />
</RadialBarChart>
</ResponsiveContainer>
)}
</Box>
</Box>
</CardContent>
</Card>
);
};
155 changes: 155 additions & 0 deletions src/components/CippComponents/AuthMethodCard.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
import { Box, Card, CardHeader, CardContent, Typography, Skeleton } from "@mui/material";
import { People as UsersIcon } from "@mui/icons-material";
import { CippSankey } from "./CippSankey";

export const AuthMethodCard = ({ data, isLoading }) => {
const processData = () => {
if (!data || !Array.isArray(data) || data.length === 0) {
return null;
}

const enabledUsers = data.filter((user) => user.AccountEnabled === true);
if (enabledUsers.length === 0) {
return null;
}

const phishableMethods = ["mobilePhone", "email", "microsoftAuthenticatorPush"];
const phishResistantMethods = ["fido2", "windowsHelloForBusiness", "x509Certificate"];

let singleFactor = 0;
let phishableCount = 0;
let phishResistantCount = 0;
let perUserMFA = 0;
let phoneCount = 0;
let authenticatorCount = 0;
let passkeyCount = 0;
let whfbCount = 0;

enabledUsers.forEach((user) => {
const methods = user.MFAMethods || [];
const perUser = user.PerUser === "enforced" || user.PerUser === "enabled";
const hasRegistered = user.MFARegistration === true;

if (perUser && !hasRegistered && methods.length === 0) {
perUserMFA++;
return;
}

if (!hasRegistered || methods.length === 0) {
singleFactor++;
return;
}

const hasPhishResistant = methods.some((m) => phishResistantMethods.includes(m));
const hasPhishable = methods.some((m) => phishableMethods.includes(m));

if (hasPhishResistant) {
phishResistantCount++;
if (methods.includes("fido2") || methods.includes("x509Certificate")) {
passkeyCount++;
}
if (methods.includes("windowsHelloForBusiness")) {
whfbCount++;
}
} else if (hasPhishable) {
phishableCount++;
if (methods.includes("mobilePhone") || methods.includes("email")) {
phoneCount++;
}
if (
methods.includes("microsoftAuthenticatorPush") ||
methods.includes("softwareOneTimePasscode")
) {
authenticatorCount++;
}
} else {
phishableCount++;
authenticatorCount++;
}
});

const mfaPercentage = (
((phishableCount + phishResistantCount + perUserMFA) / enabledUsers.length) *
100
).toFixed(1);
const phishResistantPercentage = ((phishResistantCount / enabledUsers.length) * 100).toFixed(1);

const links = [
{ source: "Users", target: "Single factor", value: singleFactor },
{ source: "Users", target: "Multi factor", value: perUserMFA },
{ source: "Users", target: "Phishable", value: phishableCount },
{ source: "Users", target: "Phish resistant", value: phishResistantCount },
];

if (phoneCount > 0) links.push({ source: "Phishable", target: "Phone", value: phoneCount });
if (authenticatorCount > 0)
links.push({ source: "Phishable", target: "Authenticator", value: authenticatorCount });

if (passkeyCount > 0)
links.push({ source: "Phish resistant", target: "Passkey", value: passkeyCount });
if (whfbCount > 0) links.push({ source: "Phish resistant", target: "WHfB", value: whfbCount });

const description = `${mfaPercentage}% of enabled users have MFA configured. ${phishResistantPercentage}% use phish-resistant authentication methods.`;

return {
nodes: [
{ id: "Users", nodeColor: "hsl(28, 100%, 53%)" },
{ id: "Single factor", nodeColor: "hsl(0, 100%, 50%)" },
{ id: "Multi factor", nodeColor: "hsl(200, 70%, 50%)" },
{ id: "Phishable", nodeColor: "hsl(39, 100%, 50%)" },
{ id: "Phone", nodeColor: "hsl(39, 100%, 45%)" },
{ id: "Authenticator", nodeColor: "hsl(39, 100%, 55%)" },
{ id: "Phish resistant", nodeColor: "hsl(99, 70%, 50%)" },
{ id: "Passkey", nodeColor: "hsl(140, 70%, 50%)" },
{ id: "WHfB", nodeColor: "hsl(160, 70%, 50%)" },
],
links,
description,
};
};

const processedData = processData();

return (
<Card sx={{ flex: 1 }}>
<CardHeader
title={
<Box sx={{ display: "flex", alignItems: "center", gap: 1 }}>
<UsersIcon sx={{ fontSize: 24 }} />
<Typography variant="h6">All users auth methods</Typography>
</Box>
}
sx={{ pb: 1 }}
/>
<CardContent sx={{ pb: 0 }}>
<Box sx={{ height: 300 }}>
{isLoading ? (
<Skeleton variant="rectangular" width="100%" height={300} />
) : processedData ? (
<CippSankey data={{ nodes: processedData.nodes, links: processedData.links }} />
) : (
<Box
sx={{
display: "flex",
alignItems: "center",
justifyContent: "center",
height: "100%",
}}
>
<Typography variant="body2" color="text.secondary">
No authentication method data available
</Typography>
</Box>
)}
</Box>
</CardContent>
{!isLoading && processedData?.description && (
<CardContent sx={{ pt: 2 }}>
<Typography variant="body2" color="text.secondary">
{processedData.description}
</Typography>
</CardContent>
)}
</Card>
);
};
Loading