From 318e8eaed8db81dcbbda0c6017a755bcaae37c82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Bentsen=20Kj=C3=A6rg=C3=A5rd=20=28KBK=29?= Date: Thu, 13 Jun 2024 11:53:41 +0200 Subject: [PATCH 01/36] add all missing options and fix wrong editor value --- src/data/standards.json | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/data/standards.json b/src/data/standards.json index 7f302b59fdc7..1c7935651ab6 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -845,22 +845,38 @@ "label": "Publishing Editor - The user can create, read, edit, and delete all items in the folder, and create subfolders.", "value": "PublishingEditor" }, + { + "label": "Editor - The user can create items in the folder. The contents of the folder do not appear.", + "value": "Editor" + }, + { + "label": "Publishing Author. The user can read, create all items/subfolders. Can modify and delete only items they create.", + "value": "PublishingAuthor" + }, + { + "label": "Author - The user can create and read items, and modify and delete items that they create.", + "value": "Author" + }, + { + "label": "Non Editing Author - The user has full read access and create items. Can can delete only own items.", + "value": "NonEditingAuthor" + }, { "label": "Reviewer - The user can read all items in the folder.", "value": "Reviewer" }, { - "label": "Editor - The user can create items in the folder. The contents of the folder do not appear.", + "label": "Contributor - The user can create items and folders.", "value": "Contributor" }, - { - "label": "Limited Details - The user can view free/busy time within the calendar and the subject and location of appointments.", - "value": "LimitedDetails" - }, { "label": "Availability Only - Indicates that the user can view only free/busy time within the calendar.", "value": "AvailabilityOnly" }, + { + "label": "Limited Details - The user can view free/busy time within the calendar and the subject and location of appointments.", + "value": "LimitedDetails" + }, { "label": "None - The user has no permissions on the folder.", "value": "none" From f8711d89495222c09b4a651fbf5dabf09a632517 Mon Sep 17 00:00:00 2001 From: Esco Date: Thu, 13 Jun 2024 12:49:57 +0200 Subject: [PATCH 02/36] Added sharingDomainRestrictionMode Standard --- src/data/standards.json | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/data/standards.json b/src/data/standards.json index 7f302b59fdc7..3da776f1e146 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -1506,6 +1506,41 @@ "impact": "High Impact", "impactColour": "danger" }, + { + "name": "standards.sharingDomainRestriction", + "cat": "SharePoint Standards", + "tag": ["highimpact", "CIS"], + "helpText": "Restricts sharing to only users with the specified domain. This is useful for organizations that only want to share with their own domain.", + "addedComponent": [ + { + "type": "Select", + "name": "standards.sharingDomainRestriction.Mode", + "label": "Limit external sharing by domains", + "values": [ + { + "label": "Off", + "value": "none" + }, + { + "label": "Restirct sharing to specific domains", + "value": "allowList" + }, + { + "label": "Block sharing to specific domains", + "value": "blockList" + } + ] + }, + { + "type": "input", + "name": "standards.sharingDomainRestriction.Domains", + "label": "Domains to allow/block, comma separated" + } + ], + "label": "Restrict sharing to a specific domain", + "impact": "High Impact", + "impactColour": "danger" + }, { "name": "standards.TenantDefaultTimezone", "cat": "SharePoint Standards", From 1a70f84c7c3be573813197f7cb6c960b08b2ec5b Mon Sep 17 00:00:00 2001 From: Esco Date: Fri, 14 Jun 2024 10:25:14 +0200 Subject: [PATCH 03/36] Added intuneBrandingProfile standard --- src/data/standards.json | 61 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/src/data/standards.json b/src/data/standards.json index 7f302b59fdc7..a95bb5d4a957 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -1356,6 +1356,67 @@ "impact": "Low Impact", "impactColour": "info" }, + { + "name": "standards.intuneBrandingProfile", + "cat": "Intune Standards", + "tag": ["lowimpact"], + "helpText": "Sets the branding profile for the Intune Company Portal app. This is a tenant wide setting and overrules any settings set on the app level.", + "addedComponent": [ + { + "type": "input", + "name": "standards.intuneBrandingProfile.displayName", + "label": "Organization name" + }, + { + "type": "boolean", + "name": "standards.intuneBrandingProfile.showLogo", + "label": "Show logo" + }, + { + "type": "boolean", + "name": "standards.intuneBrandingProfile.showDisplayNameNextToLogo", + "label": "Show organization name next to logo" + }, + { + "type": "input", + "name": "standards.intuneBrandingProfile.contactITName", + "label": "Contact IT name" + }, + { + "type": "input", + "name": "standards.intuneBrandingProfile.contactITPhoneNumber", + "label": "Contact IT phone number" + }, + { + "type": "input", + "name": "standards.intuneBrandingProfile.contactITEmailAddress", + "label": "Contact IT email address" + }, + { + "type": "input", + "name": "standards.intuneBrandingProfile.contactITNotes", + "label": "Contact IT notes" + }, + { + "type": "input", + "name": "standards.intuneBrandingProfile.onlineSupportSiteName", + "label": "Online support site name" + }, + { + "type": "input", + "name": "standards.intuneBrandingProfile.onlineSupportSiteUrl", + "label": "Online support site URL" + }, + { + "type": "input", + "name": "standards.intuneBrandingProfile.privacyUrl", + "label": "Privacy statement URL" + } + ], + "label": "Set Intune Company Portal branding profile", + "impact": "Low Impact", + "impactColour": "info" + }, { "name": "standards.intuneDeviceReg", "cat": "Intune Standards", From 6323ec4fe82b162d7d09ff14787ff6526d499852 Mon Sep 17 00:00:00 2001 From: BNWEIN Date: Wed, 19 Jun 2024 09:15:15 +0100 Subject: [PATCH 04/36] Update Users.jsx Fixed Missing Username from Logbook when revoking sessions --- src/views/identity/administration/Users.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/identity/administration/Users.jsx b/src/views/identity/administration/Users.jsx index 93adcb0f1de8..0b0ea525497e 100644 --- a/src/views/identity/administration/Users.jsx +++ b/src/views/identity/administration/Users.jsx @@ -293,7 +293,7 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { label: 'Revoke all user sessions', color: 'danger', modal: true, - modalUrl: `/api/ExecRevokeSessions?TenantFilter=${tenant.defaultDomainName}&ID=${row.id}`, + modalUrl: `/api/ExecRevokeSessions?TenantFilter=${tenant.defaultDomainName}&ID=${row.id}&Username=${row.userPrincipalName}`, modalMessage: 'Are you sure you want to revoke this users sessions?', }, { From e8221aa56a9243e7d3c92fe66b91e31aa675a906 Mon Sep 17 00:00:00 2001 From: Esco Date: Wed, 19 Jun 2024 13:53:24 +0200 Subject: [PATCH 05/36] Added Quarantine Filters --- .../email-exchange/administration/QuarantineList.jsx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/views/email-exchange/administration/QuarantineList.jsx b/src/views/email-exchange/administration/QuarantineList.jsx index 7453af66b1a7..127d9095b16d 100644 --- a/src/views/email-exchange/administration/QuarantineList.jsx +++ b/src/views/email-exchange/administration/QuarantineList.jsx @@ -135,6 +135,17 @@ const QuarantineList = () => { capabilities={{ allTenants: false, helpContext: 'https://google.com' }} title="Quarantine Management" datatable={{ + filterlist: [ + { filterName : 'Status: Not Released', filter: '"ReleaseStatus":"NotReleased"' }, + { filterName : 'Status: Released', filter: '"ReleaseStatus":"Released"' }, + { filterName : 'Status: Denied', filter: '"ReleaseStatus":"Denied"' }, + { filterName : 'Reason: High Confidence Phishing', filter: '"QuarantineTypes":"HighConfPhish"' }, + { filterName : 'Reason: Phishing', filter: '"QuarantineTypes":"Phish"' }, + { filterName : 'Reason: Spam', filter: '"QuarantineTypes":"Spam"' }, + { filterName : 'Reason: Malware', filter: '"QuarantineTypes":"Malware"' }, + { filterName : 'Reason: FileTypeBlock', filter: '"QuarantineTypes":"FileTypeBlock"' }, + { filterName : 'Reason: Bulk', filter: '"QuarantineTypes":"Bulk"' }, + ], keyField: 'id', reportName: `${tenant?.defaultDomainName}-Mailbox-Quarantine`, path: '/api/ListMailQuarantine', From 7dc57d1b593d82a47251a3e2e216b5130f6d7246 Mon Sep 17 00:00:00 2001 From: BNWEIN Date: Wed, 19 Jun 2024 17:04:33 +0100 Subject: [PATCH 06/36] Renamed Function Changed: ExecSharePointOwner to: ExecSharePointPerms --- src/views/teams-share/onedrive/OneDriveList.jsx | 4 ++-- src/views/teams-share/sharepoint/SharepointList.jsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/views/teams-share/onedrive/OneDriveList.jsx b/src/views/teams-share/onedrive/OneDriveList.jsx index cacd7d39d0fc..f8bb4936e8d6 100644 --- a/src/views/teams-share/onedrive/OneDriveList.jsx +++ b/src/views/teams-share/onedrive/OneDriveList.jsx @@ -37,7 +37,7 @@ const OneDriveList = () => { TenantFilter: tenant.defaultDomainName, RemovePermission: false, }, - modalUrl: `/api/ExecSharePointOwner`, + modalUrl: `/api/ExecSharePointPerms`, modalDropdown: { url: `/api/listUsers?TenantFilter=${tenant.defaultDomainName}`, labelField: 'displayName', @@ -55,7 +55,7 @@ const OneDriveList = () => { TenantFilter: tenant.defaultDomainName, RemovePermission: true, }, - modalUrl: `/api/ExecSharePointOwner`, + modalUrl: `/api/ExecSharePointPerms`, modalDropdown: { url: `/api/listUsers?TenantFilter=${tenant.defaultDomainName}`, labelField: 'displayName', diff --git a/src/views/teams-share/sharepoint/SharepointList.jsx b/src/views/teams-share/sharepoint/SharepointList.jsx index e4ba2d74db6f..a93bb7c01250 100644 --- a/src/views/teams-share/sharepoint/SharepointList.jsx +++ b/src/views/teams-share/sharepoint/SharepointList.jsx @@ -79,7 +79,7 @@ const SharepointList = () => { RemovePermission: false, URL: row.URL, }, - modalUrl: `/api/ExecSharePointOwner`, + modalUrl: `/api/ExecSharePointPerms`, modalDropdown: { url: `/api/listUsers?TenantFilter=${tenant.defaultDomainName}`, labelField: 'displayName', @@ -98,7 +98,7 @@ const SharepointList = () => { RemovePermission: true, URL: row.URL, }, - modalUrl: `/api/ExecSharePointOwner`, + modalUrl: `/api/ExecSharePointPerms`, modalDropdown: { url: `/api/listUsers?TenantFilter=${tenant.defaultDomainName}`, labelField: 'displayName', From 03bf6029876fe811126ed783a7605a7bb2d92ab3 Mon Sep 17 00:00:00 2001 From: BNWEIN Date: Wed, 19 Jun 2024 22:31:14 +0100 Subject: [PATCH 07/36] Update EditGroup.jsx Fixed case sensitivity issue resulting in group names not working in the results. --- src/views/identity/administration/EditGroup.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/identity/administration/EditGroup.jsx b/src/views/identity/administration/EditGroup.jsx index 928962af5b83..7e81fc66306e 100644 --- a/src/views/identity/administration/EditGroup.jsx +++ b/src/views/identity/administration/EditGroup.jsx @@ -111,7 +111,7 @@ const EditGroup = () => { allowExternal: values.allowExternal, sendCopies: values.sendCopies, mail: group[0].mail, - groupName: group[0].DisplayName, + groupName: group[0].displayName, } //window.alert(JSON.stringify(shippedValues)) genericPostRequest({ path: '/api/EditGroup', values: shippedValues }).then((res) => { From 5d0043457690998792835d58beb0126f0e54b0f7 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 19 Jun 2024 21:59:37 -0400 Subject: [PATCH 08/36] JIT tweaks --- .../administration/DeployJITAdmin.jsx | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/views/identity/administration/DeployJITAdmin.jsx b/src/views/identity/administration/DeployJITAdmin.jsx index b87ca67dd8f3..aa6e64b80e74 100644 --- a/src/views/identity/administration/DeployJITAdmin.jsx +++ b/src/views/identity/administration/DeployJITAdmin.jsx @@ -1,7 +1,7 @@ import React, { useState } from 'react' import { CButton, CCallout, CCol, CForm, CRow, CSpinner, CTooltip } from '@coreui/react' import { useSelector } from 'react-redux' -import { Field, Form } from 'react-final-form' +import { Field, Form, FormSpy } from 'react-final-form' import { Condition, RFFCFormInput, @@ -45,6 +45,7 @@ const DeployJITAdmin = () => { useraction: values.useraction, AdminRoles: values.AdminRoles?.map((role) => role.value), StartDate: startTime, + UseTAP: values.useTap, EndDate: endTime, ExpireAction: values.expireAction.value, PostExecution: { @@ -137,6 +138,25 @@ const DeployJITAdmin = () => { name="UserId" isLoading={usersIsFetching} /> + + {({ values }) => { + users.map((user, key) => { + if ( + user.id === values.UserId?.value && + user.accountEnabled === false + ) { + return ( + + + + ) + } + }) + }} + @@ -195,6 +215,15 @@ const DeployJITAdmin = () => { /> + + + +
+ +
+
+
+
@@ -258,6 +287,13 @@ const DeployJITAdmin = () => { cell: cellGenericFormatter(), exportSelector: 'userPrincipalName', }, + { + name: 'Account Enabled', + selector: (row) => row['accountEnabled'], + sortable: true, + cell: cellGenericFormatter(), + exportSelector: 'accountEnabled', + }, { name: 'JIT Enabled', selector: (row) => row['jitAdminEnabled'], From 060f55503e85f9c94fe3a88cf034d4013f98219e Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 19 Jun 2024 23:30:19 -0400 Subject: [PATCH 09/36] Update DeployJITAdmin.jsx --- src/views/identity/administration/DeployJITAdmin.jsx | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/views/identity/administration/DeployJITAdmin.jsx b/src/views/identity/administration/DeployJITAdmin.jsx index aa6e64b80e74..4c572ec4250b 100644 --- a/src/views/identity/administration/DeployJITAdmin.jsx +++ b/src/views/identity/administration/DeployJITAdmin.jsx @@ -140,17 +140,15 @@ const DeployJITAdmin = () => { /> {({ values }) => { - users.map((user, key) => { + return users.map((user, key) => { if ( - user.id === values.UserId?.value && + user.id === values?.UserId?.value && user.accountEnabled === false ) { return ( - - + + This user is currently disabled, they will automatically be + enabled when JIT is executed. ) } From 5b07b1cb41ea806eb4cbf887dfff31bbef9fa714 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Bentsen=20Kj=C3=A6rg=C3=A5rd=20=28KBK=29?= Date: Fri, 21 Jun 2024 09:02:26 +0200 Subject: [PATCH 10/36] Reorder SharePoint lowimpact standard --- src/data/standards.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/data/standards.json b/src/data/standards.json index d30e7e1b29ef..39f4dfef6108 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -1478,6 +1478,22 @@ "impact": "Low Impact", "impactColour": "info" }, + { + "name": "standards.TenantDefaultTimezone", + "cat": "SharePoint Standards", + "tag": ["lowimpact"], + "helpText": "Sets the default timezone for the tenant. This will be used for all new users and sites.", + "addedComponent": [ + { + "type": "TimezoneSelect", + "name": "standards.TenantDefaultTimezone.Timezone", + "label": "Timezone" + } + ], + "label": "Set Default Timezone for Tenant", + "impact": "Low Impact", + "impactColour": "info" + }, { "name": "standards.DisableAddShortcutsToOneDrive", "cat": "SharePoint Standards", @@ -1627,21 +1643,5 @@ "label": "Restrict sharing to a specific domain", "impact": "High Impact", "impactColour": "danger" - }, - { - "name": "standards.TenantDefaultTimezone", - "cat": "SharePoint Standards", - "tag": ["lowimpact"], - "helpText": "Sets the default timezone for the tenant. This will be used for all new users and sites.", - "addedComponent": [ - { - "type": "TimezoneSelect", - "name": "standards.TenantDefaultTimezone.Timezone", - "label": "Timezone" - } - ], - "label": "Set Default Timezone for Tenant", - "impact": "Low Impact", - "impactColour": "info" } ] From 3d5fdd31d8a4521c00e7074156fe0c57c82cd3c0 Mon Sep 17 00:00:00 2001 From: Esco Date: Fri, 21 Jun 2024 09:20:13 +0200 Subject: [PATCH 11/36] e.actionsSelect is undefined fix Co-Authored-By: Kai Stenbro <58435124+GreenChiip@users.noreply.github.com> --- src/components/utilities/CippActionsOffcanvas.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/utilities/CippActionsOffcanvas.jsx b/src/components/utilities/CippActionsOffcanvas.jsx index 63febc746bce..c335bae5db5a 100644 --- a/src/components/utilities/CippActionsOffcanvas.jsx +++ b/src/components/utilities/CippActionsOffcanvas.jsx @@ -345,7 +345,7 @@ export default function CippActionsOffcanvas(props) { } let actionsSelectorsContent try { - actionsSelectorsContent = props.actionsSelect.map((action, index) => ( + actionsSelectorsContent = props?.actionsSelect?.map((action, index) => ( {action.label} Date: Fri, 21 Jun 2024 13:46:29 +0200 Subject: [PATCH 12/36] fixes bpa table error in console --- src/views/tenant/standards/BestPracticeAnalyser.jsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/views/tenant/standards/BestPracticeAnalyser.jsx b/src/views/tenant/standards/BestPracticeAnalyser.jsx index 801cd1eb6838..a0e1cb00b101 100644 --- a/src/views/tenant/standards/BestPracticeAnalyser.jsx +++ b/src/views/tenant/standards/BestPracticeAnalyser.jsx @@ -179,9 +179,12 @@ const BestPracticeAnalyser = () => { if (graphrequest.data.length === 0) { graphrequest.data = [{ data: 'No Data Found' }] } - const flatObj = graphrequest.data.Columns ? graphrequest.data.Columns : [] + const flatObj = graphrequest.data.Columns.length >= 0 ? graphrequest.data.Columns : [] flatObj.map((col) => { + if (col === null) { + return + } // Determine the cell selector based on the 'formatter' property let cellSelector if (col.formatter) { From 0deeb4a7eb30c1346f224d8ad4d9c6748098daad Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Fri, 21 Jun 2024 15:59:30 +0200 Subject: [PATCH 13/36] added delete report --- .../tenant/standards/BPAReportBuilder.jsx | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/views/tenant/standards/BPAReportBuilder.jsx b/src/views/tenant/standards/BPAReportBuilder.jsx index 584958f9ec40..eabe4d1bdc63 100644 --- a/src/views/tenant/standards/BPAReportBuilder.jsx +++ b/src/views/tenant/standards/BPAReportBuilder.jsx @@ -157,6 +157,12 @@ const BPAReportBuilder = () => { newBPATemplate({ path: '/api/AddBPATemplate', values: data }) } + const handleDelete = async (event) => { + event.preventDefault() + const data = formData.name + newBPATemplate({ path: `/api/RemoveBPATemplate?TemplateName=${data}` }) + } + const options = { wordWrap: true, } @@ -228,17 +234,21 @@ const BPAReportBuilder = () => { - - - + + + Publish - - + + handleDelete(e)}> + + Delete + + {newTemplateResult.isFetching && } {newTemplateResult.isSuccess && ( From b0c1f0f16874b497ea35059a120947e46485d9d3 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Fri, 21 Jun 2024 16:32:21 +0200 Subject: [PATCH 14/36] fixes spacing issue --- .../administration/QuarantineList.jsx | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/views/email-exchange/administration/QuarantineList.jsx b/src/views/email-exchange/administration/QuarantineList.jsx index 127d9095b16d..6c5de828afec 100644 --- a/src/views/email-exchange/administration/QuarantineList.jsx +++ b/src/views/email-exchange/administration/QuarantineList.jsx @@ -136,15 +136,18 @@ const QuarantineList = () => { title="Quarantine Management" datatable={{ filterlist: [ - { filterName : 'Status: Not Released', filter: '"ReleaseStatus":"NotReleased"' }, - { filterName : 'Status: Released', filter: '"ReleaseStatus":"Released"' }, - { filterName : 'Status: Denied', filter: '"ReleaseStatus":"Denied"' }, - { filterName : 'Reason: High Confidence Phishing', filter: '"QuarantineTypes":"HighConfPhish"' }, - { filterName : 'Reason: Phishing', filter: '"QuarantineTypes":"Phish"' }, - { filterName : 'Reason: Spam', filter: '"QuarantineTypes":"Spam"' }, - { filterName : 'Reason: Malware', filter: '"QuarantineTypes":"Malware"' }, - { filterName : 'Reason: FileTypeBlock', filter: '"QuarantineTypes":"FileTypeBlock"' }, - { filterName : 'Reason: Bulk', filter: '"QuarantineTypes":"Bulk"' }, + { filterName: 'Status: Not Released', filter: '"ReleaseStatus":"NotReleased"' }, + { filterName: 'Status: Released', filter: '"ReleaseStatus":"Released"' }, + { filterName: 'Status: Denied', filter: '"ReleaseStatus":"Denied"' }, + { + filterName: 'Reason: High Confidence Phishing', + filter: '"QuarantineTypes":"HighConfPhish"', + }, + { filterName: 'Reason: Phishing', filter: '"QuarantineTypes":"Phish"' }, + { filterName: 'Reason: Spam', filter: '"QuarantineTypes":"Spam"' }, + { filterName: 'Reason: Malware', filter: '"QuarantineTypes":"Malware"' }, + { filterName: 'Reason: FileTypeBlock', filter: '"QuarantineTypes":"FileTypeBlock"' }, + { filterName: 'Reason: Bulk', filter: '"QuarantineTypes":"Bulk"' }, ], keyField: 'id', reportName: `${tenant?.defaultDomainName}-Mailbox-Quarantine`, From 83d9e999a89564181217043847e794475e780786 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Fri, 21 Jun 2024 13:57:51 -0400 Subject: [PATCH 15/36] Sign in report tweaks --- src/views/identity/reports/SignIns.jsx | 32 ++++++++++++++++++-------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/views/identity/reports/SignIns.jsx b/src/views/identity/reports/SignIns.jsx index bcd14acc0c07..0e78095db5d1 100644 --- a/src/views/identity/reports/SignIns.jsx +++ b/src/views/identity/reports/SignIns.jsx @@ -16,7 +16,7 @@ import React, { useState } from 'react' import { Form } from 'react-final-form' import { useSelector } from 'react-redux' import { useNavigate } from 'react-router-dom' -import { RFFCFormCheck, RFFCFormInput } from 'src/components/forms' +import { Condition, RFFCFormCheck, RFFCFormInput } from 'src/components/forms' import { CippPageList } from 'src/components/layout' import { CellTip } from 'src/components/tables' import useQuery from 'src/hooks/useQuery' @@ -95,11 +95,10 @@ const columns = [ const SignInsReport = () => { const tenant = useSelector((state) => state.app.currentTenant) - let navigate = useNavigate() let query = useQuery() const filter = query.get('filter') const DateFilter = query.get('DateFilter') - const searchparams = query.toString() + const [searchParams, setSearchParams] = useState({}) const [visibleA, setVisibleA] = useState(true) const handleSubmit = async (values) => { @@ -113,11 +112,7 @@ const SignInsReport = () => { SearchNow: true, ...values, } - var queryString = Object.keys(shippedValues) - .map((key) => key + '=' + shippedValues[key]) - .join('&') - - navigate(`?${queryString}`) + setSearchParams(shippedValues) } return ( @@ -152,6 +147,11 @@ const SignInsReport = () => { render={({ handleSubmit, submitting, values }) => { return ( + + + + + { + + + + + + + @@ -190,9 +202,9 @@ const SignInsReport = () => { capabilities={{ allTenants: false, helpContext: 'https://google.com' }} datatable={{ columns: columns, - path: `/api/ListSignIns?${searchparams}`, + path: `/api/ListSignIns`, reportName: `${tenant?.defaultDomainName}-SignIns-Report`, - params: { TenantFilter: tenant?.defaultDomainName }, + params: { TenantFilter: tenant?.defaultDomainName, ...searchParams }, }} /> From c6d1e0e3706d712739242713e2efd8ccaacd1dd8 Mon Sep 17 00:00:00 2001 From: cipptesting Date: Fri, 21 Jun 2024 14:00:39 -0400 Subject: [PATCH 16/36] Updated DeploySpamfilter.jsx. Made priority configurable. --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 490fb9a392b6..bc2ed9783377 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cipp", - "version": "5.6.1", + "version": "5.8.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cipp", - "version": "5.6.1", + "version": "5.8.5", "license": "AGPL-3.0", "dependencies": { "@coreui/chartjs": "^3.0.0", From 10d2e831151f0d5741bed7bfe404f07d9fb7354c Mon Sep 17 00:00:00 2001 From: cipptesting Date: Fri, 21 Jun 2024 14:03:02 -0400 Subject: [PATCH 17/36] Updated DeploySpamfilter.jsx. Made priority configurable --- src/views/email-exchange/spamfilter/DeploySpamfilter.jsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/views/email-exchange/spamfilter/DeploySpamfilter.jsx b/src/views/email-exchange/spamfilter/DeploySpamfilter.jsx index c45b21e3fb0d..c2135ec9c833 100644 --- a/src/views/email-exchange/spamfilter/DeploySpamfilter.jsx +++ b/src/views/email-exchange/spamfilter/DeploySpamfilter.jsx @@ -6,7 +6,7 @@ import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons' import { CippWizard } from 'src/components/layout' import { WizardTableField } from 'src/components/tables' import PropTypes from 'prop-types' -import { RFFCFormSelect, RFFCFormTextarea } from 'src/components/forms' +import { RFFCFormSelect, RFFCFormTextarea, RFFCFormInput } from 'src/components/forms' import { useLazyGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app' import { OnChange } from 'react-final-form-listeners' @@ -151,6 +151,11 @@ const SpamFilterAdd = () => { /> + + + + +
@@ -179,6 +184,8 @@ const SpamFilterAdd = () => {
Rule Settings
{props.values.PowerShellCommand} +
Priority
+ {props.values.Priority} From 1e6c6f6fe3b8f657bc18b47a9da577821eeb9220 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Fri, 21 Jun 2024 14:26:46 -0400 Subject: [PATCH 18/36] JIT Update users query to ListGraphRequest --- .../administration/DeployJITAdmin.jsx | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/views/identity/administration/DeployJITAdmin.jsx b/src/views/identity/administration/DeployJITAdmin.jsx index 4c572ec4250b..547b895aa6fd 100644 --- a/src/views/identity/administration/DeployJITAdmin.jsx +++ b/src/views/identity/administration/DeployJITAdmin.jsx @@ -9,7 +9,11 @@ import { RFFCFormSwitch, RFFSelectSearch, } from 'src/components/forms' -import { useLazyGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app' +import { + useGenericGetRequestQuery, + useLazyGenericGetRequestQuery, + useLazyGenericPostRequestQuery, +} from 'src/store/api/app' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faCircleNotch, faEdit, faEye } from '@fortawesome/free-solid-svg-icons' import { CippContentCard, CippPage, CippPageList } from 'src/components/layout' @@ -63,7 +67,16 @@ const DeployJITAdmin = () => { data: users = [], isFetching: usersIsFetching, error: usersError, - } = useListUsersQuery({ tenantDomain }) + } = useGenericGetRequestQuery({ + path: '/api/ListGraphRequest', + params: { + TenantFilter: tenantDomain, + Endpoint: 'users', + $select: 'id,displayName,userPrincipalName,accountEnabled', + $count: true, + $top: 999, + }, + }) return ( @@ -130,7 +143,7 @@ const DeployJITAdmin = () => { ({ + values={users?.Results?.map((user) => ({ value: user.id, name: `${user.displayName} <${user.userPrincipalName}>`, }))} @@ -140,7 +153,7 @@ const DeployJITAdmin = () => { /> {({ values }) => { - return users.map((user, key) => { + return users?.Results?.map((user, key) => { if ( user.id === values?.UserId?.value && user.accountEnabled === false From fa9aba197bf2a41962377fb952cf5226f7b52c6b Mon Sep 17 00:00:00 2001 From: John Duprey Date: Fri, 21 Jun 2024 14:47:54 -0400 Subject: [PATCH 19/36] Fix user ordering --- src/views/identity/administration/DeployJITAdmin.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/views/identity/administration/DeployJITAdmin.jsx b/src/views/identity/administration/DeployJITAdmin.jsx index 547b895aa6fd..9d16549f9867 100644 --- a/src/views/identity/administration/DeployJITAdmin.jsx +++ b/src/views/identity/administration/DeployJITAdmin.jsx @@ -75,6 +75,7 @@ const DeployJITAdmin = () => { $select: 'id,displayName,userPrincipalName,accountEnabled', $count: true, $top: 999, + $orderby: 'displayName', }, }) From c4665d7bf1e4a3e10e7275085fb84010ed0d67db Mon Sep 17 00:00:00 2001 From: John Duprey Date: Fri, 21 Jun 2024 14:50:22 -0400 Subject: [PATCH 20/36] Update DeployVacation.jsx --- src/views/tenant/conditional/DeployVacation.jsx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/views/tenant/conditional/DeployVacation.jsx b/src/views/tenant/conditional/DeployVacation.jsx index 572aee8bb83d..6f43e2ddda30 100644 --- a/src/views/tenant/conditional/DeployVacation.jsx +++ b/src/views/tenant/conditional/DeployVacation.jsx @@ -50,7 +50,17 @@ const ListClassicAlerts = () => { data: users = [], isFetching: usersIsFetching, error: usersError, - } = useListUsersQuery({ tenantDomain }) + } = useGenericGetRequestQuery({ + path: '/api/ListGraphRequest', + params: { + TenantFilter: tenantDomain, + Endpoint: 'users', + $select: 'id,displayName,userPrincipalName,accountEnabled', + $count: true, + $top: 999, + $orderby: 'displayName', + }, + }) const { data: caPolicies = [], @@ -90,12 +100,13 @@ const ListClassicAlerts = () => { ({ + values={users?.Results?.map((user) => ({ value: user.id, name: `${user.displayName} <${user.userPrincipalName}>`, }))} placeholder={!usersIsFetching ? 'Select user' : 'Loading...'} name="UserId" + isLoading={usersIsFetching} /> @@ -109,6 +120,7 @@ const ListClassicAlerts = () => { }))} placeholder={!caIsFetching ? 'Select policy' : 'Loading...'} name="PolicyId" + isLoading={caIsFetching} /> From 5dd07f4fc4bbd033943741f014b5950baff5a9ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Fri, 21 Jun 2024 21:07:02 +0200 Subject: [PATCH 21/36] Change wording in standards --- src/views/tenant/standards/ListAppliedStandards.jsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/views/tenant/standards/ListAppliedStandards.jsx b/src/views/tenant/standards/ListAppliedStandards.jsx index 6548ebb25848..f60370975ee6 100644 --- a/src/views/tenant/standards/ListAppliedStandards.jsx +++ b/src/views/tenant/standards/ListAppliedStandards.jsx @@ -548,7 +548,7 @@ const ApplyNewStandard = () => { /> -
Optional Input
+
Settings
@@ -647,7 +647,7 @@ const ApplyNewStandard = () => { /> -
Optional Input
+
Settings
{obj.addedComponent && obj.addedComponent.map((component) => ( <> @@ -768,7 +768,7 @@ const ApplyNewStandard = () => {
-
Optional Input
+
Settings
{template.templates.isSuccess && ( {
-
Optional Input
+
Settings
{ -
Optional Input
+
Settings
Date: Fri, 21 Jun 2024 17:51:26 -0400 Subject: [PATCH 22/36] Fix nested array flattening --- src/components/tables/CippTable.jsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/tables/CippTable.jsx b/src/components/tables/CippTable.jsx index e858c5e28fc6..c0f6ff6d8b19 100644 --- a/src/components/tables/CippTable.jsx +++ b/src/components/tables/CippTable.jsx @@ -644,7 +644,13 @@ export default function CippTable({ if (typeof value === 'object' && !Array.isArray(value)) { Object.assign(output, flatten(value, newKey)) } else { - output[newKey] = value + if (Array.isArray(value)) { + value.map((item, idx) => { + Object.assign(output, flatten(item, `${newKey}[${idx}]`)) + }) + } else { + output[newKey] = value + } } return output }, {}) From b5790700e54a0dad4a97b09179a427d62e921057 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Sat, 22 Jun 2024 02:23:34 +0200 Subject: [PATCH 23/36] added error handling for when SAM wizard has not yet run. --- src/components/layout/AppHeader.jsx | 20 +++++++++++++++++++- src/store/features/app.js | 5 +++++ src/store/middleware/errorMiddleware.js | 8 ++++++-- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/components/layout/AppHeader.jsx b/src/components/layout/AppHeader.jsx index 620a2c9332c7..c62f6008657e 100644 --- a/src/components/layout/AppHeader.jsx +++ b/src/components/layout/AppHeader.jsx @@ -15,7 +15,12 @@ import { AppHeaderSearch } from 'src/components/header' import { CippActionsOffcanvas, TenantSelector } from '../utilities' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faBars } from '@fortawesome/free-solid-svg-icons' -import { setCurrentTheme, setUserSettings, toggleSidebarShow } from 'src/store/features/app' +import { + setCurrentTheme, + setSetupCompleted, + setUserSettings, + toggleSidebarShow, +} from 'src/store/features/app' import { useMediaPredicate } from 'react-media-hook' import { useGenericGetRequestQuery, @@ -92,6 +97,19 @@ const AppHeader = () => { } }, [delay, state]) } + //useEffect to check if any of the dashboard alerts contained the key "setupCompleted" and if so, + //check if the value of this key is false. If so, set the setupCompleted state to false + //if none is found, set the setupCompleted state to true + useEffect(() => { + if (dashboard && dashboard.length >= 1) { + const setupCompleted = dashboard.find((alert) => alert.setupCompleted === false) + if (setupCompleted) { + dispatch(setSetupCompleted({ setupCompleted: false })) + } else { + dispatch(setSetupCompleted({ setupCompleted: true })) + } + } + }, [dashboard, dispatch]) useEffect(() => { if (cippQueueList.isUninitialized && (cippQueueList.isFetching || cippQueueList.isLoading)) { diff --git a/src/store/features/app.js b/src/store/features/app.js index 91b0e1f5bf86..3f8ce3bcfb0f 100644 --- a/src/store/features/app.js +++ b/src/store/features/app.js @@ -14,6 +14,7 @@ const initialState = { defaultColumns: {}, newUserDefaults: {}, recentPages: [], + setupCompleted: false, } export const appSlice = createSlice({ @@ -62,6 +63,9 @@ export const appSlice = createSlice({ setRecentPages: (state, action) => { state.recentPages = action.payload?.recentPages }, + setSetupCompleted: (state, action) => { + state.setupCompleted = action.payload?.setupCompleted + }, }, }) @@ -80,6 +84,7 @@ export const { setDefaultColumns, setNewUserDefaults, setRecentPages, + setSetupCompleted, } = appSlice.actions export default persistReducer( diff --git a/src/store/middleware/errorMiddleware.js b/src/store/middleware/errorMiddleware.js index 14e868882709..c04ba4e3d067 100644 --- a/src/store/middleware/errorMiddleware.js +++ b/src/store/middleware/errorMiddleware.js @@ -2,17 +2,21 @@ // set action.hideToastError to `true` to ignore this middleware import { showToast } from 'src/store/features/toasts' import { isRejectedWithValue } from '@reduxjs/toolkit' +import { store } from '../store' export const errorMiddleware = ({ dispatch }) => (next) => (action) => { + const { getState } = store + const state = getState() + const setupCompleted = state.app?.setupCompleted if ( isRejectedWithValue(action) && !action.error?.hideToastError && - action.payload.message !== 'canceled' + action.payload.message !== 'canceled' && + setupCompleted ) { - console.error(action) if (action.payload.data === 'Backend call failure') { action.payload.data = 'The Azure Function has taken too long to respond. Try selecting a different report or a single tenant instead' From f822ea206b8fa1044f18785ecbfbf10b93965ba9 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Sat, 22 Jun 2024 02:57:00 +0200 Subject: [PATCH 24/36] enhanced error middleware to handle sam wizard issues. --- src/store/middleware/errorMiddleware.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/store/middleware/errorMiddleware.js b/src/store/middleware/errorMiddleware.js index c04ba4e3d067..074acb4f47c2 100644 --- a/src/store/middleware/errorMiddleware.js +++ b/src/store/middleware/errorMiddleware.js @@ -11,11 +11,15 @@ export const errorMiddleware = const { getState } = store const state = getState() const setupCompleted = state.app?.setupCompleted + let SamWizardError = false + if (action?.meta?.arg?.originalArgs?.path === '/api/ExecSamSetup') { + SamWizardError = true + } if ( isRejectedWithValue(action) && !action.error?.hideToastError && action.payload.message !== 'canceled' && - setupCompleted + (setupCompleted || SamWizardError) ) { if (action.payload.data === 'Backend call failure') { action.payload.data = From 600a279ea363fbc827edf0197bf01794b6b9a747 Mon Sep 17 00:00:00 2001 From: Esco Date: Sat, 22 Jun 2024 17:09:49 +0200 Subject: [PATCH 25/36] Added risky sign-in filter --- src/views/identity/reports/SignIns.jsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/views/identity/reports/SignIns.jsx b/src/views/identity/reports/SignIns.jsx index 0e78095db5d1..4840a906f9f0 100644 --- a/src/views/identity/reports/SignIns.jsx +++ b/src/views/identity/reports/SignIns.jsx @@ -201,6 +201,12 @@ const SignInsReport = () => { title="Sign Ins Report" capabilities={{ allTenants: false, helpContext: 'https://google.com' }} datatable={{ + filterlists: [ + { + filterName: 'Risky sign-ins', + filter: 'Complex: riskState ne none', + }, + ], columns: columns, path: `/api/ListSignIns`, reportName: `${tenant?.defaultDomainName}-SignIns-Report`, From bb85244c7adfd016f1f1993d17780bc566eead00 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Sat, 22 Jun 2024 17:56:57 +0200 Subject: [PATCH 26/36] new easy mode for GDAP --- src/components/forms/RFFComponents.jsx | 18 +- .../administration/GDAPInviteWizard.jsx | 270 ++++++++++++++---- 2 files changed, 221 insertions(+), 67 deletions(-) diff --git a/src/components/forms/RFFComponents.jsx b/src/components/forms/RFFComponents.jsx index 516098532900..14163a033d62 100644 --- a/src/components/forms/RFFComponents.jsx +++ b/src/components/forms/RFFComponents.jsx @@ -470,19 +470,25 @@ RFFCFormSelect.propTypes = { export function Condition({ when, is, children, like, regex }) { return ( <> - {is && ( + {is !== undefined && ( - {({ input: { value } }) => (value === is ? children : null)} + {({ input: { value } }) => { + return value === is ? children : null + }} )} - {like && ( + {like !== undefined && ( - {({ input: { value } }) => (value.includes(like) ? children : null)} + {({ input: { value } }) => { + return value.includes(like) ? children : null + }} )} - {regex && ( + {regex !== undefined && ( - {({ input: { value } }) => (value.match(regex) ? children : null)} + {({ input: { value } }) => { + return value.match(regex) ? children : null + }} )} diff --git a/src/views/tenant/administration/GDAPInviteWizard.jsx b/src/views/tenant/administration/GDAPInviteWizard.jsx index 2377ae2e0239..242d2c420ad2 100644 --- a/src/views/tenant/administration/GDAPInviteWizard.jsx +++ b/src/views/tenant/administration/GDAPInviteWizard.jsx @@ -19,6 +19,7 @@ import { TitleButton } from 'src/components/buttons' import PropTypes from 'prop-types' import { useLazyGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app' import { cellGenericFormatter } from 'src/components/tables/CellGenericFormat' +import { Condition, RFFCFormSwitch } from 'src/components/forms' const Error = ({ name }) => ( (value && value.length !== 0 ? undefined : 'Required') const GDAPInviteWizard = () => { + const defaultRolesArray = [ + { + Name: 'User Administrator', + ObjectId: 'fe930be7-5e62-47db-91af-98c3a49a38b1', + }, + { + Name: 'Teams Administrator', + ObjectId: '69091246-20e8-4a56-aa4d-066075b2a7a8', + }, + { + Name: 'SharePoint Administrator', + ObjectId: 'f28a1f50-f6e7-4571-818b-6a12f2af6b6c', + }, + { + Name: 'Security Administrator', + ObjectId: '194ae4cb-b126-40b2-bd5b-6091b380977d', + }, + { + Name: 'Privileged Role Administrator', + ObjectId: 'e8611ab8-c189-46e8-94e1-60213ab1f814', + }, + { + Name: 'Privileged Authentication Administrator', + ObjectId: '7be44c8a-adaf-4e2a-84d6-ab2649e08a13', + }, + { + Name: 'Intune Administrator', + ObjectId: '3a2c62db-5318-420d-8d74-23affee5d9d5', + }, + { + Name: 'Exchange Administrator', + ObjectId: '29232cdf-9323-42fd-ade2-1d097af3e4de', + }, + { + Name: 'Cloud Device Administrator', + ObjectId: '7698a772-787b-4ac8-901f-60d6b08affd2', + }, + { + Name: 'Cloud App Security Administrator', + ObjectId: '892c5842-a9a6-463a-8041-72aa08ca3cf6', + }, + { + Name: 'Authentication Policy Administrator', + ObjectId: '0526716b-113d-4c15-b2c8-68e3c22b9f80', + }, + { + Name: 'Application Administrator', + ObjectId: '9b895d92-2cd3-44c7-9d02-a6ac2d5ea5c3', + }, + ] const [inviteCount, setInviteCount] = useState(1) const [loopRunning, setLoopRunning] = React.useState(false) const [massResults, setMassResults] = React.useState([]) const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery() const [genericGetRequest, getResults] = useLazyGenericGetRequestQuery() + const [easyModeDone, setEasyMode] = useState(false) + const [easyModeProgress, setEasyModeProgress] = useState(null) const handleSubmit = async (values) => { - const resultsarr = [] - setLoopRunning(true) - for (var x = 0; x < inviteCount; x++) { - const results = await genericPostRequest({ path: '/api/ExecGDAPInvite', values: values }) - resultsarr.push(results.data) - setMassResults(resultsarr) + if (values.easyMode === true) { + if (easyModeDone === false) { + const defaultRoles = { + gdapRoles: defaultRolesArray, + } + const easyModeValues = { ...defaultRoles } + try { + await genericPostRequest({ path: '/api/ExecAddGDAPRole', values: easyModeValues }) + const results = await genericGetRequest({ path: '/api/ListGDAPRoles' }) + const filteredResults = results.data.filter((role) => + defaultRolesArray.some((defaultRole) => defaultRole.ObjectId === role.roleDefinitionId), + ) + setEasyMode(true) + const resultsarr = [] + setLoopRunning(true) + for (var x = 0; x < inviteCount; x++) { + const results = await genericPostRequest({ + path: '/api/ExecGDAPInvite', + values: { ...values, gdapRoles: filteredResults }, + }) + resultsarr.push(results.data) + setMassResults(resultsarr) + } + setLoopRunning(false) + } catch (error) { + setEasyModeProgress(`Failed to create GDAP roles or invite users ${error}`) + setLoopRunning(false) + } + } + } else { + // Normal mode execution + const resultsarr = [] + setLoopRunning(true) + for (var y = 0; y < inviteCount; y++) { + const results = await genericPostRequest({ path: '/api/ExecGDAPInvite', values: values }) + resultsarr.push(results.data) + setMassResults(resultsarr) + } + setLoopRunning(false) } - setLoopRunning(false) } - const formValues = {} + const formValues = { easyMode: true } const inviteColumns = [ { @@ -99,10 +184,7 @@ const GDAPInviteWizard = () => { onSubmit={handleSubmit} wizardTitle="GDAP Invite Wizard" > - +

Step 1

@@ -111,39 +193,66 @@ const GDAPInviteWizard = () => {

- - CIPP will create a single relationship with all roles you've selected for the maximum - duration of 730 days using a GUID as a random name for the relationship. -
It is recommend to put CIPP user in the correct GDAP Role Groups to manage your - environment secure after deployment of GDAP. -
-
- -
+ + + +

+ CIPP will create 12 new groups in your Azure AD environment if they do not exist, + and add the CIPP user to these 12 groups. The CIPP user will be added to the + following groups: +

+
    +
  • M365 GDAP Application Administrator
  • +
  • M365 GDAP Authentication Policy Administrator
  • +
  • M365 GDAP Cloud App Security Administrator
  • +
  • M365 GDAP Cloud Device Administrator
  • +
  • M365 GDAP Exchange Administrator
  • +
  • M365 GDAP Intune Administrator
  • +
  • M365 GDAP Privileged Authentication Administrator
  • +
  • M365 GDAP Privileged Role Administrator
  • +
  • M365 GDAP Security Administrator
  • +
  • M365 GDAP SharePoint Administrator
  • +
  • M365 GDAP Teams Administrator
  • +
  • M365 GDAP User Administrator
  • +
+ Any other user that needs to gain access to your Microsoft CSP Tenants will need to be + manually added to these groups. +
+
+ + + CIPP will create a single relationship with all roles you've selected for the maximum + duration of 730 days using a GUID as a random name for the relationship. + + +
+ +
- - {(props) => ( - row['RoleName'], - sortable: true, - exportselector: 'Name', - }, - { - name: 'Group', - selector: (row) => row['GroupName'], - sortable: true, - }, - ]} - fieldProps={props} - /> - )} - + + {(props) => ( + row['RoleName'], + sortable: true, + exportselector: 'Name', + }, + { + name: 'Group', + selector: (row) => row['GroupName'], + sortable: true, + }, + ]} + fieldProps={props} + /> + )} + +

@@ -190,25 +299,56 @@ const GDAPInviteWizard = () => { -
Roles and group names
- {props.values.gdapRoles.map((role, idx) => ( + {props.values.easyMode === false && ( + <> +
Roles and group names
+ {props.values.gdapRoles.map((role, idx) => ( + + {role.RoleName === 'Company Administrator' && ( + + WARNING: The Company Administrator role will prevent GDAP + relationships from automatically extending. We recommend against + using this in any GDAP relationship. + + )} + + ))} + +
    + {props.values.gdapRoles.map((role, idx) => ( +
  • + {role.RoleName} - {role.GroupName} +
  • + ))} +
+
+ + )} + {props.values.easyMode === true && ( <> - {role.RoleName === 'Company Administrator' && ( - - WARNING: The Company Administrator role will prevent GDAP - relationships from automatically extending. We recommend against using - this in any GDAP relationship. - - )} + +

+ You have selected CIPP to manage your roles and groups. Invites will + contain the following roles and groups +

+
    +
  • M365 GDAP Application Administrator
  • +
  • M365 GDAP Authentication Policy Administrator
  • +
  • M365 GDAP Cloud App Security Administrator
  • +
  • M365 GDAP Cloud Device Administrator
  • +
  • M365 GDAP Exchange Administrator
  • +
  • M365 GDAP Intune Administrator
  • +
  • M365 GDAP Privileged Authentication Administrator
  • +
  • M365 GDAP Privileged Role Administrator
  • +
  • M365 GDAP Security Administrator
  • +
  • M365 GDAP SharePoint Administrator
  • +
  • M365 GDAP Teams Administrator
  • +
  • M365 GDAP User Administrator
  • +
+
- ))} - - {props.values.gdapRoles.map((role, idx) => ( -
  • - {role.RoleName} - {role.GroupName} -
  • - ))} -
    + )} + {easyModeProgress && {easyModeProgress}}
    @@ -218,6 +358,14 @@ const GDAPInviteWizard = () => { )} {(massResults.length >= 1 || loopRunning) && ( <> + +

    + The invites have been generated. You can view the results below. The + invite link is to be used by a Global Administrator + of your clients Tenant. Theonboardinglink is to be + used by a CIPP administrator to finish the process inside of CIPP. +

    +
    {loopRunning ? ( From 727f9a1e74c7f677e0c2d17e82487cff09915509 Mon Sep 17 00:00:00 2001 From: Esco Date: Tue, 21 May 2024 14:10:55 +0200 Subject: [PATCH 27/36] Added Risky SignIns Report --- src/_nav.jsx | 5 + src/importsMap.jsx | 1 + src/routes.json | 6 + src/views/identity/reports/RiskySignIns.jsx | 127 ++++++++++++++++++++ 4 files changed, 139 insertions(+) create mode 100644 src/views/identity/reports/RiskySignIns.jsx diff --git a/src/_nav.jsx b/src/_nav.jsx index ada800050fc5..da41ba5fb492 100644 --- a/src/_nav.jsx +++ b/src/_nav.jsx @@ -114,6 +114,11 @@ const _nav = [ name: 'AAD Connect Report', to: '/identity/reports/azure-ad-connect-report', }, + { + component: CNavItem, + name: 'Risky Sign-ins', + to: '/identity/reports/risky-signins', + }, ], }, { diff --git a/src/importsMap.jsx b/src/importsMap.jsx index b50612327848..80aae0226dc8 100644 --- a/src/importsMap.jsx +++ b/src/importsMap.jsx @@ -32,6 +32,7 @@ import React from 'react' "/identity/reports/inactive-users-report": React.lazy(() => import('./views/identity/reports/InactiveUsers')), "/identity/reports/Signin-report": React.lazy(() => import('./views/identity/reports/SignIns')), "/identity/reports/azure-ad-connect-report": React.lazy(() => import('./views/identity/reports/AzureADConnectReport')), + "/identity/reports/risky-signins": React.lazy(() => import('./views/identity/reports/RiskySignIns')), "/tenant/administration/tenants": React.lazy(() => import('./views/tenant/administration/Tenants')), "/tenant/administration/tenants/edit": React.lazy(() => import('./views/tenant/administration/EditTenant')), "/tenant/administration/partner-relationships": React.lazy(() => import('./views/tenant/administration/PartnerRelationships')), diff --git a/src/routes.json b/src/routes.json index f27aaa5b148e..d54e9b03f768 100644 --- a/src/routes.json +++ b/src/routes.json @@ -206,6 +206,12 @@ "component": "views/identity/reports/AzureADConnectReport", "allowedRoles": ["admin", "editor", "readonly"] }, + { + "path": "/identity/reports/risky-signins", + "name": "Risky Sign-Ins", + "component": "views/identity/reports/RiskySignIns", + "allowedRoles": ["admin", "editor", "readonly"] + }, { "path": "/tenant", "name": "Tenant", diff --git a/src/views/identity/reports/RiskySignIns.jsx b/src/views/identity/reports/RiskySignIns.jsx new file mode 100644 index 000000000000..3fc63c40cc88 --- /dev/null +++ b/src/views/identity/reports/RiskySignIns.jsx @@ -0,0 +1,127 @@ +import { useSelector } from 'react-redux' +import { CippPageList } from 'src/components/layout' +import { CellTip } from 'src/components/tables' + +const columns = [ + { + name: 'Date', + selector: (row) => row['createdDateTime'], + sortable: true, + exportSelector: 'createdDateTime', + }, + { + name: 'User Principal Name', + selector: (row) => row['userPrincipalName'], + sortable: true, + exportSelector: 'userPrincipalName', + }, + { + name: 'Location', + selector: (row) => row.locationcipp, + sortable: true, + exportSelector: 'locationcipp', + cell: (row) => CellTip(row['locationcipp']), + }, + { + name: 'IP Address', + selector: (row) => row['ipAddress'], + sortable: true, + exportSelector: 'ipAddress', + }, + { + name: 'Risk State', + selector: (row) => row['riskState'], + sortable: true, + exportSelector: 'riskState', + }, + { + name: 'Risk Detail', + selector: (row) => row['riskDetail'], + sortable: true, + exportSelector: 'riskDetail', + }, + { + name: 'Risk Level Aggregated', + selector: (row) => row['riskLevelAggregated'], + sortable: true, + exportSelector: 'riskLevelAggregated', + }, + { + name: 'Risk Level During Sign-In', + selector: (row) => row['riskLevelDuringSignIn'], + sortable: true, + exportSelector: 'riskLevelDuringSignIn', + }, + { + name: 'Risk Event Type', + selector: (row) => row['riskEventTypes_v2'], + sortable: true, + exportSelector: 'riskEventTypes_v2', + }, + { + name: 'Application Name', + selector: (row) => row['clientAppUsed'], + sortable: true, + exportSelector: 'clientAppUsed', + }, + { + name: 'Authentication Requirements', + selector: (row) => row['authenticationRequirement'], + sortable: true, + exportSelector: 'authenticationRequirement', + }, + { + name: 'Additional Details', + selector: (row) => row.additionalDetails, + sortable: true, + exportSelector: 'additionalDetails', + cell: (row) => CellTip(row['additionalDetails']), + }, +] + +const RiskySignInsReport = () => { + const tenant = useSelector((state) => state.app.currentTenant) + + return ( + <> + + + ) +} + +export default RiskySignInsReport From 5dd35597f4294bd481c3dbfa9012feab9a4d9374 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Sun, 23 Jun 2024 00:18:53 +0200 Subject: [PATCH 28/36] Updated loader --- src/views/tenant/administration/GDAPInviteWizard.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/views/tenant/administration/GDAPInviteWizard.jsx b/src/views/tenant/administration/GDAPInviteWizard.jsx index 242d2c420ad2..956b8a374f00 100644 --- a/src/views/tenant/administration/GDAPInviteWizard.jsx +++ b/src/views/tenant/administration/GDAPInviteWizard.jsx @@ -193,7 +193,7 @@ const GDAPInviteWizard = () => {
    - +

    @@ -349,6 +349,7 @@ const GDAPInviteWizard = () => { )} {easyModeProgress && {easyModeProgress}} + {getResults.isFetching && } From e2ddd2d7ef96841554e79e6856ebaead4a7f8050 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Mon, 24 Jun 2024 13:07:37 +0200 Subject: [PATCH 29/36] error logging --- src/components/layout/AppHeader.jsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/layout/AppHeader.jsx b/src/components/layout/AppHeader.jsx index c62f6008657e..6ff31a76089a 100644 --- a/src/components/layout/AppHeader.jsx +++ b/src/components/layout/AppHeader.jsx @@ -102,10 +102,13 @@ const AppHeader = () => { //if none is found, set the setupCompleted state to true useEffect(() => { if (dashboard && dashboard.length >= 1) { + console.log('Finding if setup is completed.') const setupCompleted = dashboard.find((alert) => alert.setupCompleted === false) if (setupCompleted) { + console.log("Setup isn't completed yet, we found a match with false.") dispatch(setSetupCompleted({ setupCompleted: false })) } else { + console.log('Setup is completed.') dispatch(setSetupCompleted({ setupCompleted: true })) } } From 09701935d922cfc41c7dc2cd179e03682558b387 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Mon, 24 Jun 2024 13:21:07 +0200 Subject: [PATCH 30/36] setup completion stuff --- src/components/layout/AppHeader.jsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/layout/AppHeader.jsx b/src/components/layout/AppHeader.jsx index 6ff31a76089a..3d3636d0e426 100644 --- a/src/components/layout/AppHeader.jsx +++ b/src/components/layout/AppHeader.jsx @@ -101,9 +101,9 @@ const AppHeader = () => { //check if the value of this key is false. If so, set the setupCompleted state to false //if none is found, set the setupCompleted state to true useEffect(() => { - if (dashboard && dashboard.length >= 1) { + if (dashboard && Array.isArray(dashboard) && dashboard.length >= 1) { console.log('Finding if setup is completed.') - const setupCompleted = dashboard.find((alert) => alert.setupCompleted === false) + const setupCompleted = dashboard.find((alert) => alert && alert.setupCompleted === false) if (setupCompleted) { console.log("Setup isn't completed yet, we found a match with false.") dispatch(setSetupCompleted({ setupCompleted: false })) @@ -111,6 +111,9 @@ const AppHeader = () => { console.log('Setup is completed.') dispatch(setSetupCompleted({ setupCompleted: true })) } + } else { + console.log('Setup is completed.') + dispatch(setSetupCompleted({ setupCompleted: true })) } }, [dashboard, dispatch]) From b903be591bf61be7adbe051ac9635a2c005f271e Mon Sep 17 00:00:00 2001 From: Esco Date: Mon, 24 Jun 2024 13:32:09 +0200 Subject: [PATCH 31/36] Updated to RiskDetection --- src/_nav.jsx | 4 +- src/importsMap.jsx | 2 +- src/routes.json | 6 +-- .../{RiskySignIns.jsx => RiskDetections.jsx} | 51 ++++++++----------- 4 files changed, 28 insertions(+), 35 deletions(-) rename src/views/identity/reports/{RiskySignIns.jsx => RiskDetections.jsx} (66%) diff --git a/src/_nav.jsx b/src/_nav.jsx index da41ba5fb492..d985761aac45 100644 --- a/src/_nav.jsx +++ b/src/_nav.jsx @@ -116,8 +116,8 @@ const _nav = [ }, { component: CNavItem, - name: 'Risky Sign-ins', - to: '/identity/reports/risky-signins', + name: 'Risk Detections', + to: '/identity/reports/risk-detections', }, ], }, diff --git a/src/importsMap.jsx b/src/importsMap.jsx index 80aae0226dc8..edf90c47b285 100644 --- a/src/importsMap.jsx +++ b/src/importsMap.jsx @@ -32,7 +32,7 @@ import React from 'react' "/identity/reports/inactive-users-report": React.lazy(() => import('./views/identity/reports/InactiveUsers')), "/identity/reports/Signin-report": React.lazy(() => import('./views/identity/reports/SignIns')), "/identity/reports/azure-ad-connect-report": React.lazy(() => import('./views/identity/reports/AzureADConnectReport')), - "/identity/reports/risky-signins": React.lazy(() => import('./views/identity/reports/RiskySignIns')), + "/identity/reports/risk-detections": React.lazy(() => import('./views/identity/reports/RiskDetections')), "/tenant/administration/tenants": React.lazy(() => import('./views/tenant/administration/Tenants')), "/tenant/administration/tenants/edit": React.lazy(() => import('./views/tenant/administration/EditTenant')), "/tenant/administration/partner-relationships": React.lazy(() => import('./views/tenant/administration/PartnerRelationships')), diff --git a/src/routes.json b/src/routes.json index d54e9b03f768..7231cbece6eb 100644 --- a/src/routes.json +++ b/src/routes.json @@ -207,9 +207,9 @@ "allowedRoles": ["admin", "editor", "readonly"] }, { - "path": "/identity/reports/risky-signins", - "name": "Risky Sign-Ins", - "component": "views/identity/reports/RiskySignIns", + "path": "/identity/reports/risk-detections", + "name": "Risk Detections", + "component": "views/identity/reports/RiskDetections", "allowedRoles": ["admin", "editor", "readonly"] }, { diff --git a/src/views/identity/reports/RiskySignIns.jsx b/src/views/identity/reports/RiskDetections.jsx similarity index 66% rename from src/views/identity/reports/RiskySignIns.jsx rename to src/views/identity/reports/RiskDetections.jsx index 3fc63c40cc88..4c91e2a8823e 100644 --- a/src/views/identity/reports/RiskySignIns.jsx +++ b/src/views/identity/reports/RiskDetections.jsx @@ -4,10 +4,10 @@ import { CellTip } from 'src/components/tables' const columns = [ { - name: 'Date', - selector: (row) => row['createdDateTime'], + name: 'Detected Date', + selector: (row) => row['detectedDateTime'], sortable: true, - exportSelector: 'createdDateTime', + exportSelector: 'detectedDateTime', }, { name: 'User Principal Name', @@ -41,51 +41,44 @@ const columns = [ exportSelector: 'riskDetail', }, { - name: 'Risk Level Aggregated', - selector: (row) => row['riskLevelAggregated'], + name: 'Risk Level', + selector: (row) => row['riskLevel'], sortable: true, - exportSelector: 'riskLevelAggregated', + exportSelector: 'riskLevel', }, { - name: 'Risk Level During Sign-In', - selector: (row) => row['riskLevelDuringSignIn'], + name: 'Risk Type', + selector: (row) => row['riskType'], sortable: true, - exportSelector: 'riskLevelDuringSignIn', + exportSelector: 'riskType', }, { name: 'Risk Event Type', - selector: (row) => row['riskEventTypes_v2'], + selector: (row) => row['riskEventType'], sortable: true, - exportSelector: 'riskEventTypes_v2', + exportSelector: 'riskEventType', }, { - name: 'Application Name', - selector: (row) => row['clientAppUsed'], + name: 'Detection Type', + selector: (row) => row['detectionTimingType'], sortable: true, - exportSelector: 'clientAppUsed', + exportSelector: 'detectionTimingType', }, { - name: 'Authentication Requirements', - selector: (row) => row['authenticationRequirement'], + name: 'Activity', + selector: (row) => row['activity'], sortable: true, - exportSelector: 'authenticationRequirement', - }, - { - name: 'Additional Details', - selector: (row) => row.additionalDetails, - sortable: true, - exportSelector: 'additionalDetails', - cell: (row) => CellTip(row['additionalDetails']), + exportSelector: 'activity', }, ] -const RiskySignInsReport = () => { +const RiskDetections = () => { const tenant = useSelector((state) => state.app.currentTenant) return ( <> { }, ], columns: columns, - path: `/api/ListRiskySignIns`, - reportName: `${tenant?.defaultDomainName}-RiskySignIns-Report`, + path: `/api/ListRiskDetections`, + reportName: `${tenant?.defaultDomainName}-RiskDetections-Report`, params: { TenantFilter: tenant?.defaultDomainName }, }} /> @@ -124,4 +117,4 @@ const RiskySignInsReport = () => { ) } -export default RiskySignInsReport +export default RiskDetections From 70c25761a4d7344bcae1ad594b52baa9b95f3696 Mon Sep 17 00:00:00 2001 From: Esco Date: Mon, 24 Jun 2024 14:35:13 +0200 Subject: [PATCH 32/36] Added Risky Users --- src/_nav.jsx | 5 + src/routes.json | 6 ++ .../identity/administration/RiskyUsers.jsx | 98 +++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 src/views/identity/administration/RiskyUsers.jsx diff --git a/src/_nav.jsx b/src/_nav.jsx index d985761aac45..874b6e28eb42 100644 --- a/src/_nav.jsx +++ b/src/_nav.jsx @@ -45,6 +45,11 @@ const _nav = [ name: 'Users', to: '/identity/administration/users', }, + { + component: CNavItem, + name: 'Risky Users', + to: '/identity/administration/risky-users', + }, { component: CNavItem, name: 'Groups', diff --git a/src/routes.json b/src/routes.json index 7231cbece6eb..2975b4c168ac 100644 --- a/src/routes.json +++ b/src/routes.json @@ -99,6 +99,12 @@ "component": "views/identity/administration/Users", "allowedRoles": ["admin", "editor", "readonly"] }, + { + "path": "/identity/administration/risky-users", + "name": "Risky Users", + "component": "views/identity/administration/RiskyUsers", + "allowedRoles": ["admin", "editor", "readonly"] + }, { "path": "/identity/administration/devices", "name": "Devices", diff --git a/src/views/identity/administration/RiskyUsers.jsx b/src/views/identity/administration/RiskyUsers.jsx new file mode 100644 index 000000000000..ac5bdd6eb45d --- /dev/null +++ b/src/views/identity/administration/RiskyUsers.jsx @@ -0,0 +1,98 @@ +import { useSelector } from 'react-redux' +import { CippPageList } from 'src/components/layout' + +const columns = [ + { + name: 'Risk Last Updated Date', + selector: (row) => row['riskLastUpdatedDateTime'], + sortable: true, + exportSelector: 'riskLastUpdatedDateTime', + }, + { + name: 'User Principal Name', + selector: (row) => row['userPrincipalName'], + sortable: true, + exportSelector: 'userPrincipalName', + }, + { + name: 'Risk Level', + selector: (row) => row['riskLevel'], + sortable: true, + exportSelector: 'riskLevel', + }, + { + name: 'Risk State', + selector: (row) => row['riskState'], + sortable: true, + exportSelector: 'riskState', + }, + { + name: 'Risk Detail', + selector: (row) => row['riskDetail'], + sortable: true, + exportSelector: 'riskDetail', + }, + { + name: 'isProcessing', + selector: (row) => row['isProcessing'], + sortable: true, + exportSelector: 'isProcessing', + }, + { + name: 'isDeleted', + selector: (row) => row['isDeleted'], + sortable: true, + exportSelector: 'isDeleted', + }, +] + +const RiskyUsers = () => { + const tenant = useSelector((state) => state.app.currentTenant) + + return ( + <> + + + ) +} + +export default RiskyUsers From 4d04c29b41e5cd87fda62d9fa62d614cd98f8fe2 Mon Sep 17 00:00:00 2001 From: Esco Date: Mon, 24 Jun 2024 14:38:27 +0200 Subject: [PATCH 33/36] Update importsMap.jsx --- src/importsMap.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/importsMap.jsx b/src/importsMap.jsx index edf90c47b285..6cd0031a1c6c 100644 --- a/src/importsMap.jsx +++ b/src/importsMap.jsx @@ -15,6 +15,7 @@ import React from 'react' "/identity/administration/jit-admin": React.lazy(() => import('./views/identity/administration/DeployJITAdmin')), "/identity/administration/ViewBec": React.lazy(() => import('./views/identity/administration/ViewBEC')), "/identity/administration/users": React.lazy(() => import('./views/identity/administration/Users')), + "/identity/administration/risky-users": React.lazy(() => import('./views/identity/administration/RiskyUsers')), "/identity/administration/devices": React.lazy(() => import('./views/identity/administration/Devices')), "/identity/administration/groups/add": React.lazy(() => import('./views/identity/administration/AddGroup')), "/identity/administration/group-templates": React.lazy(() => import('./views/identity/administration/GroupTemplates')), From 2af51b13db7e4b5745c66064a6214d77b4b219a2 Mon Sep 17 00:00:00 2001 From: Esco Date: Mon, 24 Jun 2024 16:48:04 +0200 Subject: [PATCH 34/36] Moved to ListGraphRequest --- src/views/identity/administration/RiskyUsers.jsx | 11 ++++++++--- src/views/identity/reports/RiskDetections.jsx | 15 ++++++++++----- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/views/identity/administration/RiskyUsers.jsx b/src/views/identity/administration/RiskyUsers.jsx index ac5bdd6eb45d..d1ffc4ad0499 100644 --- a/src/views/identity/administration/RiskyUsers.jsx +++ b/src/views/identity/administration/RiskyUsers.jsx @@ -53,7 +53,7 @@ const RiskyUsers = () => { <> { }, ], columns: columns, - path: `/api/ListRiskyUsers`, + path: `api/ListGraphRequest`, reportName: `${tenant?.defaultDomainName}-ListRiskyUsers`, - params: { TenantFilter: tenant?.defaultDomainName }, + params: { + TenantFilter: tenant?.defaultDomainName, + Endpoint: `identityProtection/riskyUsers`, + $count: true, + $orderby: 'riskLastUpdatedDateTime', + }, }} /> diff --git a/src/views/identity/reports/RiskDetections.jsx b/src/views/identity/reports/RiskDetections.jsx index 4c91e2a8823e..9b526671b1c5 100644 --- a/src/views/identity/reports/RiskDetections.jsx +++ b/src/views/identity/reports/RiskDetections.jsx @@ -17,10 +17,10 @@ const columns = [ }, { name: 'Location', - selector: (row) => row.locationcipp, + selector: (row) => `${row.location.city} - ${row.location.countryOrRegion}`, sortable: true, exportSelector: 'locationcipp', - cell: (row) => CellTip(row['locationcipp']), + cell: (row) => CellTip(`${row.location.city} - ${row.location.countryOrRegion}`), }, { name: 'IP Address', @@ -79,7 +79,7 @@ const RiskDetections = () => { <> { }, ], columns: columns, - path: `/api/ListRiskDetections`, + path: `api/ListGraphRequest`, reportName: `${tenant?.defaultDomainName}-RiskDetections-Report`, - params: { TenantFilter: tenant?.defaultDomainName }, + params: { + TenantFilter: tenant?.defaultDomainName, + Endpoint: `identityProtection/riskDetections`, + $count: true, + $orderby: 'detectedDateTime', + }, }} /> From ea294a2c07dcdbae5d80f81e437ee0bddccbe8a0 Mon Sep 17 00:00:00 2001 From: Esco Date: Mon, 24 Jun 2024 18:15:14 +0200 Subject: [PATCH 35/36] fix row.location is null --- src/views/identity/reports/RiskDetections.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/views/identity/reports/RiskDetections.jsx b/src/views/identity/reports/RiskDetections.jsx index 9b526671b1c5..ed1604acda6e 100644 --- a/src/views/identity/reports/RiskDetections.jsx +++ b/src/views/identity/reports/RiskDetections.jsx @@ -17,10 +17,10 @@ const columns = [ }, { name: 'Location', - selector: (row) => `${row.location.city} - ${row.location.countryOrRegion}`, + selector: (row) => `${row.location?.city} - ${row.location?.countryOrRegion}`, sortable: true, - exportSelector: 'locationcipp', - cell: (row) => CellTip(`${row.location.city} - ${row.location.countryOrRegion}`), + exportSelector: 'Location', + cell: (row) => CellTip(`${row.location?.city} - ${row.location?.countryOrRegion}`), }, { name: 'IP Address', From bb12565bdf57b87c04c598a5ebb289bbe64db5fa Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Mon, 24 Jun 2024 22:11:59 +0200 Subject: [PATCH 36/36] Version up --- package.json | 2 +- public/version_latest.txt | 2 +- version_latest.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index f92f847989c0..ed6174da5afa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cipp", - "version": "5.8.5", + "version": "5.9.0", "description": "The CyberDrain Improved Partner Portal is a portal to help manage administration for Microsoft Partners.", "homepage": "https://cipp.app/", "bugs": { diff --git a/public/version_latest.txt b/public/version_latest.txt index a075da200b96..b3d91f9cfc04 100644 --- a/public/version_latest.txt +++ b/public/version_latest.txt @@ -1 +1 @@ -5.8.5 +5.9.0 diff --git a/version_latest.txt b/version_latest.txt index a075da200b96..b3d91f9cfc04 100644 --- a/version_latest.txt +++ b/version_latest.txt @@ -1 +1 @@ -5.8.5 +5.9.0