Skip to content

Commit e705e98

Browse files
authored
Merge branch 'KelvinTegelaar:main' into main
2 parents 6c2a724 + c38bdc6 commit e705e98

93 files changed

Lines changed: 3323 additions & 812 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/cipp_dev_build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ jobs:
5454
5555
# Upload to Azure Blob Storage
5656
- name: Azure Blob Upload
57-
uses: LanceMcCarthy/Action-AzureBlobUpload@v3.11.0
57+
uses: LanceMcCarthy/Action-AzureBlobUpload@v3.12.0
5858
with:
5959
connection_string: ${{ secrets.AZURE_CONNECTION_STRING }}
6060
container_name: cipp

.github/workflows/cipp_frontend_build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ jobs:
5454
5555
# Upload to Azure Blob Storage
5656
- name: Azure Blob Upload
57-
uses: LanceMcCarthy/Action-AzureBlobUpload@v3.11.0
57+
uses: LanceMcCarthy/Action-AzureBlobUpload@v3.12.0
5858
with:
5959
connection_string: ${{ secrets.AZURE_CONNECTION_STRING }}
6060
container_name: cipp

package.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "cipp",
3-
"version": "10.5.2",
3+
"version": "10.5.5",
44
"author": "CIPP Contributors",
55
"homepage": "https://cipp.app/",
66
"bugs": {
@@ -16,7 +16,7 @@
1616
},
1717
"scripts": {
1818
"dev": "next -H 127.0.0.1",
19-
"build": "next build --webpack && rm -rf package.json yarn.lock",
19+
"build": "node scripts/skip-export-build-traces.mjs && next build --webpack && rm -rf package.json yarn.lock",
2020
"start": "next start",
2121
"export": "next export",
2222
"lint": "npx eslint .",
@@ -40,10 +40,10 @@
4040
"@nivo/core": "^0.99.0",
4141
"@nivo/sankey": "^0.99.0",
4242
"@react-pdf/renderer": "^4.5.1",
43-
"@reduxjs/toolkit": "^2.11.2",
43+
"@reduxjs/toolkit": "^2.12.0",
4444
"@tanstack/query-sync-storage-persister": "^5.90.25",
4545
"@tanstack/react-query": "^5.100.10",
46-
"@tanstack/react-query-devtools": "^5.96.2",
46+
"@tanstack/react-query-devtools": "^5.100.10",
4747
"@tanstack/react-query-persist-client": "^5.96.2",
4848
"@tanstack/react-table": "^8.19.2",
4949
"@tiptap/core": "^3.22.3",
@@ -53,11 +53,11 @@
5353
"@tiptap/react": "^3.20.5",
5454
"@tiptap/starter-kit": "^3.20.5",
5555
"@vvo/tzdb": "^6.198.0",
56-
"apexcharts": "5.10.4",
56+
"apexcharts": "5.14.0",
5757
"axios": "1.16.1",
5858
"date-fns": "4.1.0",
5959
"diff": "^8.0.3",
60-
"dompurify": "^3.4.3",
60+
"dompurify": "^3.4.9",
6161
"driver.js": "^1.4.0",
6262
"eml-parse-js": "^1.2.0-beta.0",
6363
"export-to-csv": "^1.3.0",
@@ -72,7 +72,7 @@
7272
"lodash.isequal": "4.5.0",
7373
"material-react-table": "^3.0.1",
7474
"monaco-editor": "^0.55.1",
75-
"mui-tiptap": "^1.30.0",
75+
"mui-tiptap": "^1.31.0",
7676
"next": "^16.2.2",
7777
"nprogress": "0.2.0",
7878
"numeral": "2.0.6",

public/version.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"version": "10.5.2"
2+
"version": "10.5.5"
33
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Workaround for a Next.js 16 build-time waste on `output: 'export'` builds.
2+
//
3+
// Next traces server-side file dependencies with @vercel/nft ("Collecting build traces") on every
4+
// webpack build. For a static export there is NO server runtime, so that trace is never used — yet it
5+
// costs roughly HALF the build wall-clock (measured ~256s; the single biggest serial phase, and on a
6+
// 2-core CI runner it stacks on top of static generation). Next 14 let you skip it with
7+
// `outputFileTracing: false`; Next 15+ removed that option and ships no replacement.
8+
//
9+
// This idempotently patches the installed Next build to gate the NFT step on `config.output !== 'export'`
10+
// — exactly what the old flag did. It's safe: the trace result is never consumed for an export build
11+
// (only `output: 'standalone'` reads it), and Next already does `await buildTracesPromise` where an
12+
// unset (undefined) promise is a no-op. Run it immediately before `next build`. Re-running is harmless.
13+
// Remove once Next skips build traces for `output: 'export'` upstream (track: vercel/next.js).
14+
import { readFileSync, writeFileSync } from "node:fs";
15+
import { createRequire } from "node:module";
16+
17+
const require = createRequire(import.meta.url);
18+
19+
let target;
20+
try {
21+
target = require.resolve("next/dist/build/index.js");
22+
} catch {
23+
console.warn("[skip-export-traces] next/dist/build/index.js not resolvable — skipping (build still works)");
24+
process.exit(0);
25+
}
26+
27+
const NEEDLE = "!isGenerateMode && !buildTracesPromise) {";
28+
const PATCHED = "!isGenerateMode && !buildTracesPromise && config.output !== 'export') {";
29+
30+
let src = readFileSync(target, "utf8");
31+
if (src.includes(PATCHED)) {
32+
console.log("[skip-export-traces] already patched — Next will skip build traces for output: export");
33+
} else if (src.includes(NEEDLE)) {
34+
writeFileSync(target, src.replace(NEEDLE, PATCHED));
35+
console.log("[skip-export-traces] patched: Next will skip @vercel/nft build traces for output: export");
36+
} else {
37+
console.warn(
38+
"[skip-export-traces] WARNING: patch site not found — Next internals changed for this version. " +
39+
"Build proceeds unpatched (just slower). Re-verify the gate in next/dist/build/index.js."
40+
);
41+
}

src/components/CippCards/CippStandardsDialog.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import {
3636
ExpandMore as ExpandMoreIcon,
3737
} from '@mui/icons-material'
3838
import { SvgIcon } from '@mui/material'
39-
import standards from '../../data/standards.json'
39+
import { getStandards } from '../../utils/standards-data'
4040

4141
const getCategoryIcon = (category) => {
4242
switch (category) {
@@ -136,7 +136,7 @@ export const CippStandardsDialog = ({ open, onClose, standardsData, currentTenan
136136
let totalStandardsCount = 0
137137

138138
Object.entries(combinedStandards).forEach(([standardKey, standardConfig]) => {
139-
const standardInfo = standards.find((s) => s.name === `standards.${standardKey}`)
139+
const standardInfo = getStandards().find((s) => s.name === `standards.${standardKey}`)
140140
if (standardInfo) {
141141
const category = standardInfo.cat
142142
if (!standardsByCategory[category]) {

src/components/CippComponents/AuthMethodCard.jsx

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,23 @@ export const AuthMethodCard = ({ data, isLoading }) => {
1616
return null;
1717
}
1818

19-
const phishableMethods = ["mobilePhone", "email", "microsoftAuthenticatorPush"];
20-
const phishResistantMethods = ["fido2", "windowsHelloForBusiness", "x509Certificate"];
19+
const phishableMethods = [
20+
"mobilePhone",
21+
"alternateMobilePhone",
22+
"officePhone",
23+
"email",
24+
"microsoftAuthenticatorPush",
25+
"softwareOneTimePasscode",
26+
"hardwareOneTimePasscode",
27+
];
28+
const passkeyMethods = [
29+
"fido2SecurityKey",
30+
"passKeyDeviceBound",
31+
"passKeyDeviceBoundAuthenticator",
32+
"passKeyDeviceBoundWindowsHello",
33+
"x509Certificate",
34+
];
35+
const phishResistantMethods = [...passkeyMethods, "windowsHelloForBusiness"];
2136

2237
let singleFactor = 0;
2338
let phishableCount = 0;
@@ -48,20 +63,26 @@ export const AuthMethodCard = ({ data, isLoading }) => {
4863

4964
if (hasPhishResistant) {
5065
phishResistantCount++;
51-
if (methods.includes("fido2") || methods.includes("x509Certificate")) {
66+
if (methods.some((m) => passkeyMethods.includes(m))) {
5267
passkeyCount++;
5368
}
5469
if (methods.includes("windowsHelloForBusiness")) {
5570
whfbCount++;
5671
}
5772
} else if (hasPhishable) {
5873
phishableCount++;
59-
if (methods.includes("mobilePhone") || methods.includes("email")) {
74+
if (
75+
methods.includes("mobilePhone") ||
76+
methods.includes("alternateMobilePhone") ||
77+
methods.includes("officePhone") ||
78+
methods.includes("email")
79+
) {
6080
phoneCount++;
6181
}
6282
if (
6383
methods.includes("microsoftAuthenticatorPush") ||
64-
methods.includes("softwareOneTimePasscode")
84+
methods.includes("softwareOneTimePasscode") ||
85+
methods.includes("hardwareOneTimePasscode")
6586
) {
6687
authenticatorCount++;
6788
}

src/components/CippComponents/AuthMethodSankey.jsx

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,23 @@ export const AuthMethodSankey = ({ data }) => {
1313
return null;
1414
}
1515

16-
// Categorize MFA methods as phishable or phish-resistant
17-
const phishableMethods = ["mobilePhone", "email", "microsoftAuthenticatorPush"];
18-
const phishResistantMethods = ["fido2", "windowsHelloForBusiness", "x509Certificate"];
16+
const phishableMethods = [
17+
"mobilePhone",
18+
"alternateMobilePhone",
19+
"officePhone",
20+
"email",
21+
"microsoftAuthenticatorPush",
22+
"softwareOneTimePasscode",
23+
"hardwareOneTimePasscode",
24+
];
25+
const passkeyMethods = [
26+
"fido2SecurityKey",
27+
"passKeyDeviceBound",
28+
"passKeyDeviceBoundAuthenticator",
29+
"passKeyDeviceBoundWindowsHello",
30+
"x509Certificate",
31+
];
32+
const phishResistantMethods = [...passkeyMethods, "windowsHelloForBusiness"];
1933

2034
let singleFactor = 0;
2135
let phishableCount = 0;
@@ -54,21 +68,26 @@ export const AuthMethodSankey = ({ data }) => {
5468
if (hasPhishResistant) {
5569
phishResistantCount++;
5670
// Count specific phish-resistant methods
57-
if (methods.includes("fido2") || methods.includes("x509Certificate")) {
71+
if (methods.some((m) => passkeyMethods.includes(m))) {
5872
passkeyCount++;
5973
}
6074
if (methods.includes("windowsHelloForBusiness")) {
6175
whfbCount++;
6276
}
6377
} else if (hasPhishable) {
6478
phishableCount++;
65-
// Count specific phishable methods
66-
if (methods.includes("mobilePhone") || methods.includes("email")) {
79+
if (
80+
methods.includes("mobilePhone") ||
81+
methods.includes("alternateMobilePhone") ||
82+
methods.includes("officePhone") ||
83+
methods.includes("email")
84+
) {
6785
phoneCount++;
6886
}
6987
if (
7088
methods.includes("microsoftAuthenticatorPush") ||
71-
methods.includes("softwareOneTimePasscode")
89+
methods.includes("softwareOneTimePasscode") ||
90+
methods.includes("hardwareOneTimePasscode")
7291
) {
7392
authenticatorCount++;
7493
}

0 commit comments

Comments
 (0)