Skip to content

Commit 7f732ff

Browse files
authored
Merge pull request #49 from KelvinTegelaar/dev
[pull] dev from KelvinTegelaar:dev
2 parents da668ff + c025a51 commit 7f732ff

File tree

13 files changed

+501
-79
lines changed

13 files changed

+501
-79
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "cipp",
3-
"version": "5.8.5",
3+
"version": "5.9.3",
44
"description": "The CyberDrain Improved Partner Portal is a portal to help manage administration for Microsoft Partners.",
55
"homepage": "https://cipp.app/",
66
"bugs": {

public/version_latest.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5.8.5
1+
5.9.3

src/_nav.jsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ const _nav = [
4545
name: 'Users',
4646
to: '/identity/administration/users',
4747
},
48+
{
49+
component: CNavItem,
50+
name: 'Risky Users',
51+
to: '/identity/administration/risky-users',
52+
},
4853
{
4954
component: CNavItem,
5055
name: 'Groups',
@@ -114,6 +119,11 @@ const _nav = [
114119
name: 'AAD Connect Report',
115120
to: '/identity/reports/azure-ad-connect-report',
116121
},
122+
{
123+
component: CNavItem,
124+
name: 'Risk Detections',
125+
to: '/identity/reports/risk-detections',
126+
},
117127
],
118128
},
119129
{

src/components/forms/RFFComponents.jsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -470,19 +470,25 @@ RFFCFormSelect.propTypes = {
470470
export function Condition({ when, is, children, like, regex }) {
471471
return (
472472
<>
473-
{is && (
473+
{is !== undefined && (
474474
<Field name={when} subscription={{ value: true }}>
475-
{({ input: { value } }) => (value === is ? children : null)}
475+
{({ input: { value } }) => {
476+
return value === is ? children : null
477+
}}
476478
</Field>
477479
)}
478-
{like && (
480+
{like !== undefined && (
479481
<Field name={when} subscription={{ value: true }}>
480-
{({ input: { value } }) => (value.includes(like) ? children : null)}
482+
{({ input: { value } }) => {
483+
return value.includes(like) ? children : null
484+
}}
481485
</Field>
482486
)}
483-
{regex && (
487+
{regex !== undefined && (
484488
<Field name={when} subscription={{ value: true }}>
485-
{({ input: { value } }) => (value.match(regex) ? children : null)}
489+
{({ input: { value } }) => {
490+
return value.match(regex) ? children : null
491+
}}
486492
</Field>
487493
)}
488494
</>

src/components/layout/AppHeader.jsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,19 @@ const AppHeader = () => {
101101
//check if the value of this key is false. If so, set the setupCompleted state to false
102102
//if none is found, set the setupCompleted state to true
103103
useEffect(() => {
104-
if (dashboard && dashboard.length >= 1) {
105-
const setupCompleted = dashboard.find((alert) => alert.setupCompleted === false)
104+
if (dashboard && Array.isArray(dashboard) && dashboard.length >= 1) {
105+
console.log('Finding if setup is completed.')
106+
const setupCompleted = dashboard.find((alert) => alert && alert.setupCompleted === false)
106107
if (setupCompleted) {
108+
console.log("Setup isn't completed yet, we found a match with false.")
107109
dispatch(setSetupCompleted({ setupCompleted: false }))
108110
} else {
111+
console.log('Setup is completed.')
109112
dispatch(setSetupCompleted({ setupCompleted: true }))
110113
}
114+
} else {
115+
console.log('Setup is completed.')
116+
dispatch(setSetupCompleted({ setupCompleted: true }))
111117
}
112118
}, [dashboard, dispatch])
113119

src/components/tables/CippTable.jsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,7 @@ export default function CippTable({
637637

638638
// Define the flatten function
639639
const flatten = (obj, prefix = '') => {
640+
if (obj === null) return {}
640641
return Object.keys(obj).reduce((output, key) => {
641642
const newKey = prefix ? `${prefix}.${key}` : key
642643
const value = obj[key] === null ? '' : obj[key]
@@ -645,9 +646,13 @@ export default function CippTable({
645646
Object.assign(output, flatten(value, newKey))
646647
} else {
647648
if (Array.isArray(value)) {
648-
value.map((item, idx) => {
649-
Object.assign(output, flatten(item, `${newKey}[${idx}]`))
650-
})
649+
if (typeof value[0] === 'object') {
650+
value.map((item, idx) => {
651+
Object.assign(output, flatten(item, `${newKey}[${idx}]`))
652+
})
653+
} else {
654+
output[newKey] = value
655+
}
651656
} else {
652657
output[newKey] = value
653658
}
@@ -683,8 +688,7 @@ export default function CippTable({
683688
})
684689
return Array.isArray(exportData) && exportData.length > 0
685690
? exportData.map((obj) => {
686-
const flattenedObj = flatten(obj)
687-
return applyFormatter(flattenedObj)
691+
return flatten(applyFormatter(obj))
688692
})
689693
: []
690694
}
@@ -695,8 +699,7 @@ export default function CippTable({
695699
// Adjusted dataFlat processing to include formatting
696700
let dataFlat = Array.isArray(data)
697701
? data.map((item) => {
698-
const flattenedItem = flatten(item)
699-
return applyFormatter(flattenedItem)
702+
return flatten(applyFormatter(item))
700703
})
701704
: []
702705
if (!disablePDFExport) {

src/importsMap.jsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import React from 'react'
1515
"/identity/administration/jit-admin": React.lazy(() => import('./views/identity/administration/DeployJITAdmin')),
1616
"/identity/administration/ViewBec": React.lazy(() => import('./views/identity/administration/ViewBEC')),
1717
"/identity/administration/users": React.lazy(() => import('./views/identity/administration/Users')),
18+
"/identity/administration/risky-users": React.lazy(() => import('./views/identity/administration/RiskyUsers')),
1819
"/identity/administration/devices": React.lazy(() => import('./views/identity/administration/Devices')),
1920
"/identity/administration/groups/add": React.lazy(() => import('./views/identity/administration/AddGroup')),
2021
"/identity/administration/group-templates": React.lazy(() => import('./views/identity/administration/GroupTemplates')),
@@ -32,6 +33,7 @@ import React from 'react'
3233
"/identity/reports/inactive-users-report": React.lazy(() => import('./views/identity/reports/InactiveUsers')),
3334
"/identity/reports/Signin-report": React.lazy(() => import('./views/identity/reports/SignIns')),
3435
"/identity/reports/azure-ad-connect-report": React.lazy(() => import('./views/identity/reports/AzureADConnectReport')),
36+
"/identity/reports/risk-detections": React.lazy(() => import('./views/identity/reports/RiskDetections')),
3537
"/tenant/administration/tenants": React.lazy(() => import('./views/tenant/administration/Tenants')),
3638
"/tenant/administration/tenants/edit": React.lazy(() => import('./views/tenant/administration/EditTenant')),
3739
"/tenant/administration/partner-relationships": React.lazy(() => import('./views/tenant/administration/PartnerRelationships')),

src/routes.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,12 @@
9999
"component": "views/identity/administration/Users",
100100
"allowedRoles": ["admin", "editor", "readonly"]
101101
},
102+
{
103+
"path": "/identity/administration/risky-users",
104+
"name": "Risky Users",
105+
"component": "views/identity/administration/RiskyUsers",
106+
"allowedRoles": ["admin", "editor", "readonly"]
107+
},
102108
{
103109
"path": "/identity/administration/devices",
104110
"name": "Devices",
@@ -206,6 +212,12 @@
206212
"component": "views/identity/reports/AzureADConnectReport",
207213
"allowedRoles": ["admin", "editor", "readonly"]
208214
},
215+
{
216+
"path": "/identity/reports/risk-detections",
217+
"name": "Risk Detections",
218+
"component": "views/identity/reports/RiskDetections",
219+
"allowedRoles": ["admin", "editor", "readonly"]
220+
},
209221
{
210222
"path": "/tenant",
211223
"name": "Tenant",
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import { useSelector } from 'react-redux'
2+
import { CippPageList } from 'src/components/layout'
3+
4+
const columns = [
5+
{
6+
name: 'Risk Last Updated Date',
7+
selector: (row) => row['riskLastUpdatedDateTime'],
8+
sortable: true,
9+
exportSelector: 'riskLastUpdatedDateTime',
10+
},
11+
{
12+
name: 'User Principal Name',
13+
selector: (row) => row['userPrincipalName'],
14+
sortable: true,
15+
exportSelector: 'userPrincipalName',
16+
},
17+
{
18+
name: 'Risk Level',
19+
selector: (row) => row['riskLevel'],
20+
sortable: true,
21+
exportSelector: 'riskLevel',
22+
},
23+
{
24+
name: 'Risk State',
25+
selector: (row) => row['riskState'],
26+
sortable: true,
27+
exportSelector: 'riskState',
28+
},
29+
{
30+
name: 'Risk Detail',
31+
selector: (row) => row['riskDetail'],
32+
sortable: true,
33+
exportSelector: 'riskDetail',
34+
},
35+
{
36+
name: 'isProcessing',
37+
selector: (row) => row['isProcessing'],
38+
sortable: true,
39+
exportSelector: 'isProcessing',
40+
},
41+
{
42+
name: 'isDeleted',
43+
selector: (row) => row['isDeleted'],
44+
sortable: true,
45+
exportSelector: 'isDeleted',
46+
},
47+
]
48+
49+
const RiskyUsers = () => {
50+
const tenant = useSelector((state) => state.app.currentTenant)
51+
52+
return (
53+
<>
54+
<CippPageList
55+
title="Risky Users"
56+
capabilities={{ allTenants: true, helpContext: 'https://google.com' }}
57+
datatable={{
58+
filterlist: [
59+
{
60+
filterName: 'State: none',
61+
filter: 'Complex: riskState eq none',
62+
},
63+
{
64+
filterName: 'State: atRisk',
65+
filter: 'Complex: riskState eq atRisk',
66+
},
67+
{
68+
filterName: 'State: confirmedCompromised',
69+
filter: 'Complex: riskState eq confirmedCompromised',
70+
},
71+
{
72+
filterName: 'State: confirmedSafe',
73+
filter: 'Complex: riskState eq confirmedSafe',
74+
},
75+
{
76+
filterName: 'State: dismissed',
77+
filter: 'Complex: riskState eq dismissed',
78+
},
79+
{
80+
filterName: 'State: remediated',
81+
filter: 'Complex: riskState eq remediated',
82+
},
83+
{
84+
filterName: 'State: unknownFutureValue',
85+
filter: 'Complex: riskState eq unknownFutureValue',
86+
},
87+
],
88+
columns: columns,
89+
path: `api/ListGraphRequest`,
90+
reportName: `${tenant?.defaultDomainName}-ListRiskyUsers`,
91+
params: {
92+
TenantFilter: tenant?.defaultDomainName,
93+
Endpoint: `identityProtection/riskyUsers`,
94+
$count: true,
95+
$orderby: 'riskLastUpdatedDateTime',
96+
},
97+
}}
98+
/>
99+
</>
100+
)
101+
}
102+
103+
export default RiskyUsers

0 commit comments

Comments
 (0)