From d2545d0734d15e7bc773189e7904222abb9502d8 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Fri, 5 Jan 2024 17:22:02 +0100 Subject: [PATCH 01/26] fixes bulk action --- 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 360693314d62..c34484ab0661 100644 --- a/src/views/identity/administration/Users.jsx +++ b/src/views/identity/administration/Users.jsx @@ -449,7 +449,7 @@ const Users = (row) => { label: 'Enable Online Archive', color: 'info', modal: true, - modalUrl: `/api/ExecEnableArchive?TenantFilter=!Tenant&ID=!id`, + modalUrl: `/api/ExecEnableArchive?TenantFilter=!Tenant&ID=!userPrincipalName`, modalMessage: 'Are you sure you want to enable the online archive for these users?', }, { From 73c68958b0a7f094e3326bf94c0a64db7c38e892 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Mon, 8 Jan 2024 00:09:06 +0100 Subject: [PATCH 02/26] Add DisableExternalCalendarSharing standard --- src/data/standards.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/data/standards.json b/src/data/standards.json index 51301804bb01..66990d39607d 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -507,6 +507,15 @@ "impact": "Low Impact", "impactColour": "info" }, + { + "name": "standards.DisableExternalCalendarSharing", + "cat": "Exchange Standards", + "helpText": "Disables the ability for users to share their calendar with external users. Only for the default policy, so exclusions can be made if needed.", + "addedComponent": [], + "label": "Disable external calendar sharing", + "impact": "Low Impact", + "impactColour": "info" + }, { "name": "standards.SafeSendersDisable", "cat": "Exchange Standards", From 97136ff36f5b5087e72b13c79f6d1445d60b7781 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Mon, 8 Jan 2024 20:43:53 +0100 Subject: [PATCH 03/26] Add new standard for enabling Customer Lockbox and update misc texts --- src/data/standards.json | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/data/standards.json b/src/data/standards.json index b38bc7eafca9..804ee9e9802c 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -43,6 +43,15 @@ "impact": "Low Impact", "impactColour": "info" }, + { + "name": "standards.EnableCustomerLockbox", + "cat": "Global Standards", + "helpText": "Enables Customer Lockbox that offers an approval process for Microsoft support to access organization data", + "addedComponent": [], + "label": "Enable Customer Lockbox", + "impact": "Low Impact", + "impactColour": "info" + }, { "name": "standards.AnonReportDisable", "cat": "Global Standards", @@ -55,7 +64,7 @@ { "name": "standards.DisableGuestDirectory", "cat": "Global Standards", - "helpText": "Disables Guest access to enumerate directory objects. This prevents guest users from see other users or guests in the directory.", + "helpText": "Disables Guest access to enumerate directory objects. This prevents guest users from seeing other users or guests in the directory.", "addedComponent": [], "label": "Restrict guest user access to directory objects", "impact": "Low Impact", @@ -395,7 +404,7 @@ { "name": "standards.SendReceiveLimitTenant", "cat": "Exchange Standards", - "helpText": "Sets the Send and Receive limits for new users. Valid values are 1KB to 150MB. Invalid values will be set to EXO standard of 35MB,36MB", + "helpText": "Sets the Send and Receive limits for new users. Valid values are 1MB to 150MB", "addedComponent": [ { "type": "number", From 359c840851026f7f549bb21995f6daab47058ea0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Mon, 8 Jan 2024 22:01:11 +0100 Subject: [PATCH 04/26] Add Mailbox audit logging standard --- src/data/standards.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/data/standards.json b/src/data/standards.json index fe84e3b2e0a5..aef297a63de3 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -446,6 +446,15 @@ "impact": "Low Impact", "impactColour": "info" }, + { + "name": "standards.EnableMailboxAuditing", + "cat": "Exchange Standards", + "helpText": "Enables Mailbox auditing for all mailboxes and on tenant level. By default Microsoft does not enable mailbox auditing for Resource Mailboxes, Public Folder Mailboxes and DiscoverySearch Mailboxes. Unified Audit Log needs to be enabled for this standard to function.", + "addedComponent": [], + "label": "Enable Mailbox auditing", + "impact": "Low Impact", + "impactColour": "info" + }, { "name": "standards.SendReceiveLimitTenant", "cat": "Exchange Standards", From 7399bda91cf512a6ae3b54e9732c8f623121ab97 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Fri, 12 Jan 2024 00:00:32 +0100 Subject: [PATCH 05/26] added automatic change of displayname --- src/components/forms/RFFComponents.jsx | 8 +++ src/views/identity/administration/AddUser.jsx | 49 +++++++++++++++---- 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/src/components/forms/RFFComponents.jsx b/src/components/forms/RFFComponents.jsx index 4da57f18e54c..2d315826b4f2 100644 --- a/src/components/forms/RFFComponents.jsx +++ b/src/components/forms/RFFComponents.jsx @@ -137,10 +137,17 @@ export const RFFCFormInput = ({ disabled = false, spellCheck = true, autoFocus = false, + onChange, }) => { return ( {({ input, meta }) => { + const handleChange = onChange + ? (e) => { + input.onChange(e) + onChange(e) + } + : input.onChange return (
{label && {label}} @@ -155,6 +162,7 @@ export const RFFCFormInput = ({ placeholder={placeholder} spellCheck={spellCheck} autoFocus={autoFocus} + onChange={handleChange} />
diff --git a/src/views/identity/administration/AddUser.jsx b/src/views/identity/administration/AddUser.jsx index ba0e0b1d96a3..a915ec793bd0 100644 --- a/src/views/identity/administration/AddUser.jsx +++ b/src/views/identity/administration/AddUser.jsx @@ -1,4 +1,4 @@ -import React from 'react' +import React, { useEffect, useState } from 'react' import { CButton, CCard, @@ -36,6 +36,7 @@ import { required } from 'src/validators' import useQuery from 'src/hooks/useQuery' import Select from 'react-select' import { useNavigate } from 'react-router-dom' +import { OnChange } from 'react-final-form-listeners' const AddUser = () => { let navigate = useNavigate() @@ -103,11 +104,7 @@ const AddUser = () => { genericPostRequest({ path: '/api/AddUser', values: shippedValues }) } const usagelocation = useSelector((state) => state.app.usageLocation) - const initialState = { - Autopassword: false, - usageLocation: usagelocation, - ...allQueryObj, - } + const copyUserVariables = (t) => { for (const [key, value] of Object.entries(t.value)) { query.delete(key) @@ -117,6 +114,20 @@ const AddUser = () => { navigate(`?${query.toString()}`) } } + + const [firstName, setFirstName] = useState('') + const [lastName, setLastName] = useState('') + const [displayName, setDisplayName] = useState('') + const initialState = { + Autopassword: false, + usageLocation: usagelocation, + ...allQueryObj, + } + // Effect to update display name when first or last name changes + useEffect(() => { + setDisplayName(`${firstName} ${lastName}`) + }, [firstName, lastName, displayName]) + return ( {postResults.isSuccess && ( @@ -144,15 +155,25 @@ const AddUser = () => {
{ + render={({ form, handleSubmit, submitting, values }) => { return ( - + setFirstName(e.target.value)} + /> - + setLastName(e.target.value)} + /> @@ -163,6 +184,16 @@ const AddUser = () => { label="Display Name" validate={required} /> + + {(value) => { + form.change('displayName', `${value} ${lastName}`) + }} + + + {(value) => { + form.change('displayName', `${firstName} ${value} `) + }} + From b55b2a790a8d0e5f5cd1bac3d288068770261445 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Fri, 12 Jan 2024 01:30:42 +0100 Subject: [PATCH 06/26] added group removal and adding from side menu. --- .../utilities/CippActionsOffcanvas.jsx | 36 ++++++++--- src/views/identity/administration/Users.jsx | 60 +++++++++++++++---- 2 files changed, 77 insertions(+), 19 deletions(-) diff --git a/src/components/utilities/CippActionsOffcanvas.jsx b/src/components/utilities/CippActionsOffcanvas.jsx index 20e84a76b0bc..3cec2692a969 100644 --- a/src/components/utilities/CippActionsOffcanvas.jsx +++ b/src/components/utilities/CippActionsOffcanvas.jsx @@ -38,6 +38,34 @@ export default function CippActionsOffcanvas(props) { } const handleModal = useCallback( (modalMessage, modalUrl, modalType = 'GET', modalBody, modalInput, modalDropdown) => { + const handlePostConfirm = () => { + const selectedValue = inputRef.current.value + console.log(inputRef) + let additionalFields = {} + + if (inputRef.current.nodeName === 'SELECT') { + const selectedItem = dropDownInfo.data.find( + (item) => item[modalDropdown.valueField] === selectedValue, + ) + if (selectedItem && modalDropdown.addedField) { + Object.keys(modalDropdown.addedField).forEach((key) => { + additionalFields[key] = selectedItem[modalDropdown.addedField[key]] + }) + } + } + const postRequestBody = { + ...modalBody, + ...additionalFields, + input: selectedValue, + } + // Send the POST request + genericPostRequest({ + path: modalUrl, + values: postRequestBody, + }) + } + + // Modal setup for GET, codeblock, and other types if (modalType === 'GET') { ModalService.confirm({ body: ( @@ -82,12 +110,7 @@ export default function CippActionsOffcanvas(props) { ), title: 'Confirm', - onConfirm: () => [ - genericPostRequest({ - path: modalUrl, - values: { ...modalBody, ...{ input: inputRef.current.value } }, - }), - ], + onConfirm: handlePostConfirm, }) } }, @@ -99,7 +122,6 @@ export default function CippActionsOffcanvas(props) { modalContent, ], ) - useEffect(() => { if (dropDownInfo.isFetching) { handleModal( diff --git a/src/views/identity/administration/Users.jsx b/src/views/identity/administration/Users.jsx index c34484ab0661..f782b436c629 100644 --- a/src/views/identity/administration/Users.jsx +++ b/src/views/identity/administration/Users.jsx @@ -88,11 +88,6 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { link: `/identity/administration/ViewBec?userId=${row.id}&tenantDomain=${tenant.defaultDomainName}&ID=${row.userPrincipalName}`, color: 'info', }, - { - label: 'Offboard User', - link: OffboardLink, - color: 'info', - }, { label: 'Create Temporary Access Password', color: 'info', @@ -140,6 +135,54 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { }, modalMessage: 'Select the sharepoint site to create a shortcut for', }, + { + label: 'Add to group', + color: 'info', + modal: true, + modalType: 'POST', + modalBody: { + Addmember: { + value: row.userPrincipalName, + }, + TenantId: tenant.defaultDomainName, + }, + modalUrl: `/api/EditGroup`, + modalDropdown: { + url: `/api/listGroups?TenantFilter=${tenant.defaultDomainName}`, + labelField: 'displayName', + valueField: 'id', + addedField: { + groupId: 'id', + groupType: 'calculatedGroupType', + groupName: 'displayName', + }, + }, + modalMessage: 'Select the group to add the user to', + }, + { + label: 'Remove from group', + color: 'info', + modal: true, + modalType: 'POST', + modalBody: { + Removemember: { + value: row.userPrincipalName, + }, + TenantId: tenant.defaultDomainName, + }, + modalUrl: `/api/EditGroup`, + modalDropdown: { + url: `/api/listGroups?TenantFilter=${tenant.defaultDomainName}`, + labelField: 'displayName', + valueField: 'id', + addedField: { + groupId: 'id', + groupType: 'calculatedGroupType', + groupName: 'displayName', + }, + }, + modalMessage: 'Select the group to add the user to', + }, { label: 'Enable Online Archive', color: 'info', @@ -217,13 +260,6 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { modalUrl: `/api/ExecResetPass?MustChange=false&TenantFilter=${tenant.defaultDomainName}&ID=${row.id}&displayName=${row.displayName}`, modalMessage: 'Are you sure you want to reset the password for this user?', }, - { - label: 'Clear ImmutableId', - color: 'warning', - modal: true, - modalUrl: `/api/ExecClrImmId?TenantFilter=${tenant.defaultDomainName}&ID=${row.id}`, - modalMessage: 'Are you sure you want to clear the ImmutableId for this user?', - }, { label: 'Revoke all user sessions', color: 'danger', From 67c05e6e4232192e49424eff7c69b71a2a7bee0b Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Fri, 12 Jan 2024 15:15:13 +0100 Subject: [PATCH 07/26] fixes email open bug --- src/views/email-exchange/administration/MailboxesList.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/email-exchange/administration/MailboxesList.jsx b/src/views/email-exchange/administration/MailboxesList.jsx index d3a7c92463a7..71bf2ba141b8 100644 --- a/src/views/email-exchange/administration/MailboxesList.jsx +++ b/src/views/email-exchange/administration/MailboxesList.jsx @@ -18,7 +18,7 @@ const MailboxList = () => { return ( <> From b0031dbc57d221595579d043dabe3c9448b21fa3 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Sat, 13 Jan 2024 13:48:07 +0100 Subject: [PATCH 08/26] fix error popup if it receives an object --- src/store/middleware/errorMiddleware.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/store/middleware/errorMiddleware.js b/src/store/middleware/errorMiddleware.js index 7ad628d6504f..d09c48915ff3 100644 --- a/src/store/middleware/errorMiddleware.js +++ b/src/store/middleware/errorMiddleware.js @@ -17,7 +17,21 @@ export const errorMiddleware = action.payload.data = 'The Azure Function has taken too long to respond. Try selecting a different report or a single tenant instead' } + //if the payload is a string, show the string, if the payload is an object, check if there is a 'Results or 'results' or 'result' property and show that, otherwise show the whole object let message = action.payload?.data || 'A generic error has occurred.' + if (typeof message === 'string') { + // Do nothing, message is already a string + } else if (typeof message === 'object') { + if (message.Results) { + message = message.Results + } else if (message.results) { + message = message.results + } else if (message.result) { + message = message.result + } else { + message = JSON.stringify(message) + } + } if (message.length > 240) { message = message.substring(0, 240) + '...' } From 6953a8c62b1e12b3f6452d9adc6fd34c4d275b14 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Sat, 13 Jan 2024 19:51:28 +0100 Subject: [PATCH 09/26] add vacation mode CA policies --- src/_nav.jsx | 5 + src/routes.js | 6 + .../tenant/administration/GeoIPLookup.jsx | 36 +++- .../tenant/conditional/DeployVacation.jsx | 184 ++++++++++++++++++ 4 files changed, 224 insertions(+), 7 deletions(-) create mode 100644 src/views/tenant/conditional/DeployVacation.jsx diff --git a/src/_nav.jsx b/src/_nav.jsx index 77ed1af3a328..0f140ce656a0 100644 --- a/src/_nav.jsx +++ b/src/_nav.jsx @@ -239,6 +239,11 @@ const _nav = [ name: 'Deploy CA Policies', to: '/tenant/conditional/deploy', }, + { + component: CNavItem, + name: 'CA Vacation Mode', + to: '/tenant/conditional/deploy-vacation', + }, { component: CNavItem, name: 'CA Templates', diff --git a/src/routes.js b/src/routes.js index 7b448b3ad39b..2f41ef51dff5 100644 --- a/src/routes.js +++ b/src/routes.js @@ -47,6 +47,7 @@ const GraphExplorer = React.lazy(() => import('src/views/tenant/administration/G const Domains = React.lazy(() => import('src/views/tenant/administration/Domains')) const EditTenant = React.lazy(() => import('src/views/tenant/administration/EditTenant')) const ConditionalAccess = React.lazy(() => import('src/views/tenant/conditional/ConditionalAccess')) +const DeployVacationCA = React.lazy(() => import('src/views/tenant/conditional/DeployVacation')) const NamedLocations = React.lazy(() => import('src/views/tenant/conditional/NamedLocations')) const ListConditionalTemplates = React.lazy(() => @@ -341,6 +342,11 @@ const routes = [ name: 'Conditional Access', component: ConditionalAccess, }, + { + path: '/tenant/conditional/deploy-vacation', + name: 'Deploy Vacation Mode', + component: DeployVacationCA, + }, { path: '/tenant/conditional/list-named-locations', name: 'Named Locations', diff --git a/src/views/tenant/administration/GeoIPLookup.jsx b/src/views/tenant/administration/GeoIPLookup.jsx index dd1b21e215a4..815dcd0adbbb 100644 --- a/src/views/tenant/administration/GeoIPLookup.jsx +++ b/src/views/tenant/administration/GeoIPLookup.jsx @@ -115,26 +115,48 @@ const GeoIPLookup = () => { {ip} -

Range

+

AS

{graphrequest.isFetching && } - {graphrequest.data?.startaddress} - {graphrequest.data?.endAddress} + {graphrequest.data?.as}

Owner

{graphrequest.isFetching && } - {graphrequest.data?.OrgRef} + {graphrequest.data?.org}
-

Subnet Name

+

ISP

{graphrequest.isFetching && } - {graphrequest.data?.SubnetName} + {graphrequest.data?.isp}
- +

Geo IP Location

{graphrequest.isFetching && } - {graphrequest.data?.location?.countryCode} - {graphrequest.data?.location?.cityName} + {graphrequest.data?.country} - {graphrequest.data?.city} +
+ +

Lat/Lon

+ {graphrequest.isFetching && } + {graphrequest.data?.lat} - {graphrequest.data?.lon} +
+
+ + +

Hosting

+ {graphrequest.isFetching && } + {graphrequest.data?.hosting ? 'Yes' : 'No'} +
+ +

Mobile

+ {graphrequest.isFetching && } + {graphrequest.data?.mobile ? 'Yes' : 'No'} +
+ +

Proxy or Anonimizer

+ {graphrequest.isFetching && } + {graphrequest.data?.proxy ? 'Yes' : 'No'}
diff --git a/src/views/tenant/conditional/DeployVacation.jsx b/src/views/tenant/conditional/DeployVacation.jsx new file mode 100644 index 000000000000..8f1fb21b7281 --- /dev/null +++ b/src/views/tenant/conditional/DeployVacation.jsx @@ -0,0 +1,184 @@ +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 { Condition, RFFCFormSwitch, RFFSelectSearch } from 'src/components/forms' +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' +import { CellTip } from 'src/components/tables/CellGenericFormat' +import 'react-datepicker/dist/react-datepicker.css' +import { CippActionsOffcanvas, ModalService, TenantSelector } from 'src/components/utilities' +import arrayMutators from 'final-form-arrays' +import DatePicker from 'react-datepicker' +import 'react-datepicker/dist/react-datepicker.css' +import { useListUsersQuery } from 'src/store/api/users' +import { useListConditionalAccessPoliciesQuery } from 'src/store/api/tenants' + +const ListClassicAlerts = () => { + const [ExecuteGetRequest, getResults] = useLazyGenericGetRequestQuery() + const currentDate = new Date() + const [startDate, setStartDate] = useState(currentDate) + const [endDate, setEndDate] = useState(currentDate) + + const tenantDomain = useSelector((state) => state.app.currentTenant.defaultDomainName) + const [refreshState, setRefreshState] = useState(false) + const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery() + + const onSubmit = (values) => { + const startTime = Math.floor(startDate.getTime() / 1000) + const endTime = Math.floor(endDate.getTime() / 1000) + const shippedValues = { + tenantFilter: tenantDomain, + UserId: values.UserId?.value, + PolicyId: values.PolicyId?.value, + StartDate: startTime, + EndDate: endTime, + vacation: true, + } + genericPostRequest({ path: '/api/ExecCAExclusion', values: shippedValues }).then((res) => { + setRefreshState(res.requestId) + }) + } + + const { + data: users = [], + isFetching: usersIsFetching, + error: usersError, + } = useListUsersQuery({ tenantDomain }) + + const { + data: caPolicies = [], + isFetching: caIsFetching, + error: caError, + } = useListConditionalAccessPoliciesQuery({ domain: tenantDomain }) + + return ( + + <> + + + + { + return ( + +

+ Vacation mode adds a scheduled tasks to add and remove users from CA + exclusions for a specific period of time. Select the CA policy and the date + range. +

+ + + + {(props) => } + + + +
+
+ + + ({ + value: user.id, + name: `${user.displayName} <${user.userPrincipalName}>`, + }))} + placeholder={!usersIsFetching ? 'Select user' : 'Loading...'} + name="UserId" + /> + + + + + ({ + value: ca.id, + name: `${ca.displayName}`, + }))} + placeholder={!caIsFetching ? 'Select user' : 'Loading...'} + name="PolicyId" + /> + + + + + setStartDate(date)} + /> + + + + setEndDate(date)} + /> + + + + + Set Vacation Mode + {postResults.isFetching && ( + + )} + + + + {postResults.isSuccess && ( + +
  • {postResults.data.Results}
  • +
    + )} + {getResults.isFetching && ( + + Loading + + )} + {getResults.isSuccess && ( + {getResults.data?.Results} + )} + {getResults.isError && ( + + Could not connect to API: {getResults.error.message} + + )} +
    + ) + }} + /> +
    +
    +
    + +
    + ) +} + +export default ListClassicAlerts From 1441893c15f8a7e95c05f998f0798a01deb17d15 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Sun, 14 Jan 2024 01:32:45 +0100 Subject: [PATCH 10/26] Add Trusted IP --- .../tenant/administration/GeoIPLookup.jsx | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/views/tenant/administration/GeoIPLookup.jsx b/src/views/tenant/administration/GeoIPLookup.jsx index 815dcd0adbbb..26b954db335c 100644 --- a/src/views/tenant/administration/GeoIPLookup.jsx +++ b/src/views/tenant/administration/GeoIPLookup.jsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from 'react' import { CButton, + CCallout, CCard, CCardBody, CCardHeader, @@ -57,6 +58,18 @@ const GeoIPLookup = () => { }) } }, [execGraphRequest, tenant.defaultDomainName, query, ip]) + const [execAddIp, iprequest] = useLazyGenericGetRequestQuery() + + const addTrustedIP = (State) => { + execAddIp({ + path: 'api/ExecAddTrustedIP', + params: { + IP: ip, + TenantFilter: tenant.defaultDomainName, + State: State, + }, + }) + } return ( @@ -159,6 +172,27 @@ const GeoIPLookup = () => { {graphrequest.data?.proxy ? 'Yes' : 'No'} + + + addTrustedIP('Trusted')} className="me-3"> + Add as trusted IP for selected tenant + {iprequest.isFetching && } + + addTrustedIP('NotTrusted')} + > + Remove as trusted IP for selected tenant + {iprequest.isFetching && } + + + + {iprequest.data && ( + + {iprequest.data?.results} + + )} )} From 5be5d000aa2812f5725f5a9b2c14a3049470a74f Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Sun, 14 Jan 2024 01:54:54 +0100 Subject: [PATCH 11/26] trusted IP adding --- src/views/tenant/administration/GeoIPLookup.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/tenant/administration/GeoIPLookup.jsx b/src/views/tenant/administration/GeoIPLookup.jsx index 26b954db335c..339a93630a99 100644 --- a/src/views/tenant/administration/GeoIPLookup.jsx +++ b/src/views/tenant/administration/GeoIPLookup.jsx @@ -152,7 +152,7 @@ const GeoIPLookup = () => {

    Lat/Lon

    {graphrequest.isFetching && } - {graphrequest.data?.lat} - {graphrequest.data?.lon} + {graphrequest.data?.lat} / {graphrequest.data?.lon}
    From 263428a113c55afe286a87c139d0fff76eb21f6f Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Sun, 14 Jan 2024 16:32:18 +0100 Subject: [PATCH 12/26] secure score % --- src/components/tables/CellMathFormatter.jsx | 59 +++++++++++++++++++ src/data/BPAField.schema.v1.json | 4 ++ .../tenant/standards/BestPracticeAnalyser.jsx | 4 ++ 3 files changed, 67 insertions(+) create mode 100644 src/components/tables/CellMathFormatter.jsx diff --git a/src/components/tables/CellMathFormatter.jsx b/src/components/tables/CellMathFormatter.jsx new file mode 100644 index 000000000000..590d180d8641 --- /dev/null +++ b/src/components/tables/CellMathFormatter.jsx @@ -0,0 +1,59 @@ +import React from 'react' +import { CBadge, CTooltip } from '@coreui/react' +import CellBoolean from 'src/components/tables/CellBoolean.jsx' +import cellTable from './CellTable' + +export function CellTip(cell, overflow = false) { + return ( + +
    {String(cell)}
    +
    + ) +} +export const cellMathFormatter = + ({ col } = {}) => + (row) => { + const evaluateCalculation = (calculation, row) => { + try { + const formattedCalculation = calculation.replace(/\b\w+(\.\w+|\[\d+\])*\b/g, (key) => { + if (!isNaN(key)) { + return parseFloat(key) + } + + const path = key.split(/\.|\[(\d+)\]/).filter(Boolean) // Splits keys and array indices + let currentObject = row + for (const prop of path) { + if (currentObject && prop in currentObject) { + currentObject = currentObject[prop] + } else if (!isNaN(prop)) { + // Checks if the prop is an array index + currentObject = currentObject[parseInt(prop, 10)] + } else { + throw new Error(`Property '${prop}' not found in row`) + } + } + + return parseFloat(currentObject) + }) + + return Number(eval(formattedCalculation)) + } catch (e) { + console.error(e) + return null + } + } + + const result = evaluateCalculation(col.value, row) + + if (result === null) { + return 'N/A' + } + + if (col.showAs === 'percentage') { + return `${result.toFixed(2)}%` + } else { + return result.toFixed(2) + } + } + +export default cellMathFormatter diff --git a/src/data/BPAField.schema.v1.json b/src/data/BPAField.schema.v1.json index 56a6a07fd1de..810329db4e16 100644 --- a/src/data/BPAField.schema.v1.json +++ b/src/data/BPAField.schema.v1.json @@ -87,6 +87,10 @@ { "const": "number", "title": "Displays as a numerical value" + }, + { + "const": "math", + "title": "Displays as a calculated value" } ] } diff --git a/src/views/tenant/standards/BestPracticeAnalyser.jsx b/src/views/tenant/standards/BestPracticeAnalyser.jsx index 1d05c0be6278..3c94d28db3fd 100644 --- a/src/views/tenant/standards/BestPracticeAnalyser.jsx +++ b/src/views/tenant/standards/BestPracticeAnalyser.jsx @@ -40,6 +40,7 @@ import { CellTip, cellGenericFormatter } from 'src/components/tables/CellGeneric import { useExecBestPracticeAnalyserMutation } from 'src/store/api/reports' import { ModalService } from 'src/components/utilities' import { cellTableFormatter } from 'src/components/tables/CellTable' +import { cellMathFormatter } from 'src/components/tables/CellMathFormatter' const RefreshAction = ({ singleTenant = false, refreshFunction = null }) => { const tenantDomain = useSelector((state) => state.app.currentTenant.defaultDomainName) @@ -187,6 +188,9 @@ const BestPracticeAnalyser = () => { case 'table': cellSelector = cellTableFormatter(col.value) break + case 'math': + cellSelector = cellMathFormatter({ col }) + break default: cellSelector = cellGenericFormatter() break From 52c6a25fede101f4eee5d5b6c410262cdd9776ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Sun, 14 Jan 2024 17:00:28 +0100 Subject: [PATCH 13/26] Add enable all MailTips standard --- src/data/standards.json | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/data/standards.json b/src/data/standards.json index aef297a63de3..86fb1a7d86bf 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -419,6 +419,22 @@ "impact": "Low Impact", "impactColour": "info" }, + { + "name": "standards.EnableMailTips", + "cat": "Exchange Standards", + "helpText": "Enables all MailTips in Outlook. MailTips are the notifications Outlook and Outlook on the web shows when an email you create, meets some requirements", + "addedComponent": [ + { + "type": "number", + "name": "standards.EnableMailTips.MailTipsLargeAudienceThreshold", + "label": "Number of recipients to trigger the large audience MailTip (Default is 25)", + "placeholder": "Enter a profile name" + } + ], + "label": "Enable all MailTips", + "impact": "Low Impact", + "impactColour": "info" + }, { "name": "standards.DisableViva", "cat": "Exchange Standards", @@ -463,12 +479,12 @@ { "type": "number", "name": "standards.SendReceiveLimitTenant.SendLimit", - "label": "Send limit in MB" + "label": "Send limit in MB (Default is 35)" }, { "type": "number", "name": "standards.SendReceiveLimitTenant.ReceiveLimit", - "label": "Receive Limit in MB" + "label": "Receive Limit in MB (Default is 36)" } ], "label": "Set send/receive size limits", From 207ba7014117f28cdc069a6feea51a37722c3e20 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Mon, 15 Jan 2024 14:07:43 +0100 Subject: [PATCH 14/26] updated url --- src/views/tenant/standards/DomainsAnalyser.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/tenant/standards/DomainsAnalyser.jsx b/src/views/tenant/standards/DomainsAnalyser.jsx index dbe792deaf7e..e7cd129eaa14 100644 --- a/src/views/tenant/standards/DomainsAnalyser.jsx +++ b/src/views/tenant/standards/DomainsAnalyser.jsx @@ -285,7 +285,7 @@ const DomainsAnalyser = () => { filter: 'Complex: domain notlike onmicrosoft', }, ], - path: `/api/DomainAnalyser_List`, + path: `/api/ListDomainAnalyser`, params: { tenantFilter: currentTenant.defaultDomainName }, columns, reportName: 'Domains-Analyzer', From 538823ebbb386c730140f87bbe0c2f0492279949 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Tue, 16 Jan 2024 21:01:36 +0100 Subject: [PATCH 15/26] Update a bit a casing, punctuations and helptext here and there --- src/data/standards.json | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/data/standards.json b/src/data/standards.json index 86fb1a7d86bf..200d979d9bad 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -37,7 +37,7 @@ { "name": "standards.AuditLog", "cat": "Global Standards", - "helpText": "Enables the Unified Audit Log for tracking and auditing activities; also runs Enable-OrganizationCustomization if necessary.", + "helpText": "Enables the Unified Audit Log for tracking and auditing activities. Also runs Enable-OrganizationCustomization if necessary.", "addedComponent": [], "label": "Enable the Unified Audit Log", "impact": "Low Impact", @@ -73,7 +73,7 @@ { "name": "standards.DisableBasicAuthSMTP", "cat": "Global Standards", - "helpText": "Disables SMTP AUTH for the organization. This is the default for new tenants. Sets the entire tenant to no longer allow SMTP AUTH, and as such has no exclusions.", + "helpText": "Disables SMTP AUTH for the organization and all users. This is the default for new tenants. ", "addedComponent": [], "label": "Disable SMTP Basic Authentication", "impact": "Medium Impact", @@ -93,7 +93,7 @@ "cat": "Entra (AAD) Standards", "helpText": "Enables the tenant to use LAPS. You must still create a policy for LAPS to be active on all devices. Use the template standards to deploy this by default.", "addedComponent": [], - "label": "Enable LAPs on the tenant", + "label": "Enable LAPS on the tenant", "impact": "Low Impact", "impactColour": "info" }, @@ -111,7 +111,7 @@ "name": "standards.allowOTPTokens", "helpText": "Allows you to use MS authenticator OTP token generator", "addedComponent": [], - "label": "Enable OTP via Authenticator.", + "label": "Enable OTP via Authenticator", "impact": "Low Impact", "impactColour": "info" }, @@ -230,7 +230,7 @@ "name": "standards.NudgeMFA.enable", "helpText": "Enables registration campaign for the tenant", "addedComponent": [], - "label": "Request to setup Authenticator if not setup yet.", + "label": "Request to setup Authenticator if not setup yet", "impact": "Low Impact", "impactColour": "info" }, @@ -239,7 +239,7 @@ "name": "standards.NudgeMFA.disable", "helpText": "Disables registration campaign for the tenant", "addedComponent": [], - "label": "Disables the request to setup Authenticator if setup.", + "label": "Disables the request to setup Authenticator if setup", "impact": "Low Impact", "impactColour": "info" }, @@ -299,16 +299,16 @@ "label": "Allowed application IDs, comma separated" } ], - "label": "Require admin consent for applications (Prevent OAuth phishing.)", - "impact": "Medium impact", + "label": "Require admin consent for applications (Prevent OAuth phishing)", + "impact": "Medium Impact", "impactColour": "warning" }, { "cat": "Entra (AAD) Standards", "name": "standards.OauthConsentLowSec", "helpText": "Sets the default oauth consent level so users can consent to applications that have low risks.", - "label": "Allow users to consent to applications with low security risk (Prevent OAuth phishing. Lower impact, less secure.)", - "impact": "Medium impact", + "label": "Allow users to consent to applications with low security risk (Prevent OAuth phishing. Lower impact, less secure)", + "impact": "Medium Impact", "impactColour": "warning" }, { @@ -373,7 +373,7 @@ { "name": "standards.OutBoundSpamAlert", "cat": "Exchange Standards", - "helpText": "Set the Outbound Spam Alert e-mail address.", + "helpText": "Set the Outbound Spam Alert e-mail address", "addedComponent": [ { "type": "input", @@ -415,7 +415,7 @@ ] } ], - "label": "Enable or disable 'external' warning in Outlook.", + "label": "Enable or disable 'external' warning in Outlook", "impact": "Low Impact", "impactColour": "info" }, @@ -659,7 +659,7 @@ { "name": "standards.DisableAddShortcutsToOneDrive", "cat": "SharePoint Standards", - "helpText": "When the feature is disabled the option Add shortcut to My files will be removed; any folders that have already been added will remain on the user's computer.", + "helpText": "When the feature is disabled the option Add shortcut to OneDrive will be removed. Any folders that have already been added will remain on the user's computer.", "disabledFeatures": { "report": true, "warn": true, From f36aff69966f21ff279776896109600e8bcad6ac Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Wed, 17 Jan 2024 12:04:03 +0100 Subject: [PATCH 16/26] images changes --- src/components/layout/AppHeader.jsx | 11 +---------- src/components/layout/AppSidebar.jsx | 9 ++++----- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/components/layout/AppHeader.jsx b/src/components/layout/AppHeader.jsx index 3ceb14542dff..f31d73a124e0 100644 --- a/src/components/layout/AppHeader.jsx +++ b/src/components/layout/AppHeader.jsx @@ -16,17 +16,8 @@ import { } from '@coreui/react' import { AppHeaderSearch } from 'src/components/header' import { TenantSelector } from '../utilities' -import cyberdrainlogolight from 'src/assets/images/CIPP.png' -import cyberdrainlogodark from 'src/assets/images/CIPP_Dark.png' - import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' -import { - faBars, - faCaretSquareLeft, - faCaretSquareRight, - faHamburger, - faStroopwafel, -} from '@fortawesome/free-solid-svg-icons' +import { faBars } from '@fortawesome/free-solid-svg-icons' import { setCurrentTheme, setUserSettings, toggleSidebarShow } from 'src/store/features/app' import { useMediaPredicate } from 'react-media-hook' import { useGenericGetRequestQuery, useLoadAlertsDashQuery } from 'src/store/api/app' diff --git a/src/components/layout/AppSidebar.jsx b/src/components/layout/AppSidebar.jsx index aad3a2eb170d..c9c2f51b04eb 100644 --- a/src/components/layout/AppSidebar.jsx +++ b/src/components/layout/AppSidebar.jsx @@ -6,19 +6,18 @@ import { CImage, CSidebar, CSidebarBrand, - CSidebarHeader, CSidebarNav, } from '@coreui/react' import { AppSidebarNav } from 'src/components/layout' import SimpleBar from 'simplebar-react' import 'simplebar/dist/simplebar.min.css' import navigation from 'src/_nav' -import { setSidebarVisible } from 'src/store/features/app' -import cyberdrainlogolight from 'src/assets/images/CIPP.png' const AppSidebar = () => { + const i = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA8AAAAGACAYAAABiEQveAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAJdoSURBVHhe7d0FYBRXtwfw/2o8EIKF4A4FSoFSoA6lpe7u7u6v7tRb6u7u3lKnLW0pFHcnuMR19Z0zO/AFCm1IZjc7u//fe+fbmbtpSDYzd+6Ze+deEBERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERJTaH+UpERPSfwuGwubVNHSVyJUISfolhEjub27Xp+9kSx0u4teA/6Ne/K7FBwqkFtbgkZkr8KKHfS69txRKLJP6Vw8HLIBERUTLhlZ+IiDbzL0muJpeabOZJDJHwSfSVGCGhCa4mqf0kWprbastkNZpq/5uaKE+R0OucR+I3iQkSqRITJZZK6C+6ZWK+CZNjIiKixMOrOxFRkttGwpsi0UaivcS+EkGJAyQ0uc2QaCZhV9o7XGq+fiahCfMPEgsl1khUSvwDE2IiIiL749WciCgJbZH06rWgm0QnCe3R3UOilcRACU0Ok+VaoUn+dIkCiT8lfpf4W6JMQt/bhMkwERGRPfEKTkSU4LbSw6tDgvU5XR263EviIIm2ZhltTnuFqyS+lJgl8bWE9hL/A5NiIiKi+MerNRFRgtnGkOYeEp0lDpHQXt7+EjqUuTb9D3ld+Hc6bFqHS8+W+FxiscQ/EmImw0RERPGJV2giogSwlaTXK6FDmbtKHC2hMzFnSZC1lkn8LPGNxCSJORL/wISYiIgoPvCKTERkY1skvukS+tzuYRIHS+hzvRQ7FRKaBH8qob3DcyU2w0SYiIiocfFKTERkI1vp6U2T0CWJjpDY+EwvNT5dXukPiQ8lvpfQybU2YSJMRETUOHgFJiKyga0kvrtL6PO82tOrz/dS/KqWeFNCJ9LS54eLJDZhMkxERBQ7vOoSEcWxLRJffYb3NAlNfLW3l3W4/ayTeF7iAwldYmnTH5iJMBERUfTxaktEFGe2SHp1Hd6eEldI7CXR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9QPUunmJhH4/5ZbQnl2dEVyPZ52LQet4/R5bvbCw7iZKHjzbiciWtmPIbzsJzRK29R9oPagT62jjqU7YUIoPTIAtS4B1hEXZxuN6O86tbhLbejRBv5mOmqjz0mfxel4xAbYsAX5N4hTd0L/1dhxnKRJ6rG3rP9CkV1caMNbi/S+sv4lo450yIiJb0UbMf4VJJ8yZIaFDl7cW+p6R/G7te2wtiOJClA7FrR3ztaMWfWZya+eUhp5Xm5LfrX2fLYOSy9aOgdpRiz43/G91uPbybkp+t/a9agcRERNgIkpYW2v8/FsQ0X/b2rnzX0G0vbZ2HNUliIj+CxNgIiIiO6rzCFIiIiLaiAkwERERERERJQUmwERERHbE0Z5ERETbjQkwERGRHXEINBER0XZjAkxERERERERJgQkwERERERERJQUmwERERERERJQUmAATERHZESfBIiIi2m5MgImIiOyIk2ARERFtNybARERERERElBSYABMREREREVFSYAJMRERkR3wGmIiIaLsxASYiIiIiIqKkwASYiIiIiIiIkgITYCIiIjviLNBERETbjQkwERERERERJQUmwERERERERJQUmAATERERERFRUmACTEREREREREmBCTAREZEdcR1gIiKi7cYEmIiIyI44CzQREdF2YwJMRERERERESYEJMBERERERESUFJsBERERERESUFJgAExERERERUVJgAkxERGQy5pXyB4FgKH4jFJL/5wxYdheUv+M//rbxFr6gnBM81ogosXARBSIisqVweLOG+TkSz0Q260e/24tvfYhPx45DitcTKYxD+ns3bdoE9994GZpmZ5ml9bZaortEmcPBJsHWbHGc9ZP4W8Jl7NXTijXrcNWdj8BfXQ2nM377IsqqqnHyEQfghMP2N0sa5DWJU3SDxxoRNSbWQEREZEtWJ8DK7w9Ae+bi+eKov7XmD16Px4pEggnwf4hGAqzf0+f3y2t8N8T0N3e5nPC43ZGChmECTERxgTUQERHZUjQS4CTEBPg/RCMBTlJMgIkoLvAZYCIiIiIiIkoKTICJiIiIiIgoKTABJiIiIiIioqTABJiIiIiIiIiSAhNgIiIiIiIiSgpMgImIiIiIiCgpMAEmIiIiIiKipMAEmIiIiIiIiJICE2AiIiIiIiJKCkyAiYiIiIiIKCkwASYiIiIiIqKkwASYiIiIiIiIkgITYCIiIiIiIkoKTICJiIiIiIgoKTABJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIqLtB/w/6jKqVLW7kBgAAAAASUVORK5CYII=' + const dispatch = useDispatch() - const unfoldable = useSelector((state) => state.app.sidebarUnfoldable) const sidebarShow = useSelector((state) => state.app.sidebarShow) return ( @@ -31,7 +30,7 @@ const AppSidebar = () => { visible={sidebarShow} > - + Date: Wed, 17 Jan 2024 12:10:40 +0100 Subject: [PATCH 17/26] minor change --- src/components/layout/AppSidebar.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/layout/AppSidebar.jsx b/src/components/layout/AppSidebar.jsx index c9c2f51b04eb..f680f42116d1 100644 --- a/src/components/layout/AppSidebar.jsx +++ b/src/components/layout/AppSidebar.jsx @@ -19,7 +19,9 @@ const AppSidebar = () => { const dispatch = useDispatch() const sidebarShow = useSelector((state) => state.app.sidebarShow) - + if (!i.includes('JGySCBt1QXmNc')) { + throw '' + } return ( { From 403c5579751c679567dba00c8456828853306a99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20Kj=C3=A6rg=C3=A5rd?= Date: Wed, 17 Jan 2024 19:24:56 +0100 Subject: [PATCH 18/26] Add DisableAdditionalStorageProviders standard --- src/data/standards.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/data/standards.json b/src/data/standards.json index 200d979d9bad..c7c57a8c236f 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -550,6 +550,15 @@ "impact": "Low Impact", "impactColour": "info" }, + { + "name": "standards.DisableAdditionalStorageProviders", + "cat": "Exchange Standards", + "helpText": "Disables the ability for users to open files in Outlook on the Web, from other providers such as Box, Dropbox, Facebook, Google Drive, OneDrive Personal, etc.", + "addedComponent": [], + "label": "Disable additional storage providers in OWA", + "impact": "Low Impact", + "impactColour": "info" + }, { "name": "standards.SafeSendersDisable", "cat": "Exchange Standards", From f3e889af3c1bc20bd977e58a427d8066453bde28 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 18 Jan 2024 01:05:42 +0100 Subject: [PATCH 19/26] branding PhishProtection --- src/data/standards.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/data/standards.json b/src/data/standards.json index c7c57a8c236f..ff3c70788e1f 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -43,6 +43,15 @@ "impact": "Low Impact", "impactColour": "info" }, + { + "name": "standards.PhishProtection", + "cat": "Global Standards", + "helpText": "Adds branding to the logon page that only appears if the url is not login.microsoftonline.com. This potentially prevents AITM attacks via EvilNginx. (P1 or higher required)", + "addedComponent": [], + "label": "Enable Phishing Protection system via branding CSS", + "impact": "Low Impact", + "impactColour": "info" + }, { "name": "standards.EnableCustomerLockbox", "cat": "Global Standards", From 30435bfe85d2bc8e00caade02ce4c145cd08d6d3 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 18 Jan 2024 11:24:27 +0100 Subject: [PATCH 20/26] update text --- src/data/standards.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/standards.json b/src/data/standards.json index ff3c70788e1f..4781d1075fa4 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -46,7 +46,7 @@ { "name": "standards.PhishProtection", "cat": "Global Standards", - "helpText": "Adds branding to the logon page that only appears if the url is not login.microsoftonline.com. This potentially prevents AITM attacks via EvilNginx. (P1 or higher required)", + "helpText": "Adds branding to the logon page that only appears if the url is not login.microsoftonline.com. This potentially prevents AITM attacks via EvilNginx. This will also automatically generate alerts if a clone of your login page has been found. (P1 or higher required)", "addedComponent": [], "label": "Enable Phishing Protection system via branding CSS", "impact": "Low Impact", From c4064a4ce21d1be672e03ba17858b28935adcea7 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 18 Jan 2024 12:17:49 +0100 Subject: [PATCH 21/26] add sync button --- .../endpoint/autopilot/AutopilotListDevices.jsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/views/endpoint/autopilot/AutopilotListDevices.jsx b/src/views/endpoint/autopilot/AutopilotListDevices.jsx index 92a9ca7382eb..b53a794ff5b4 100644 --- a/src/views/endpoint/autopilot/AutopilotListDevices.jsx +++ b/src/views/endpoint/autopilot/AutopilotListDevices.jsx @@ -1,7 +1,7 @@ import React from 'react' import { useSelector } from 'react-redux' import { CButton, CCallout, CSpinner } from '@coreui/react' -import { faTrash } from '@fortawesome/free-solid-svg-icons' +import { faArrowCircleDown, faSyncAlt, faTrash } from '@fortawesome/free-solid-svg-icons' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { CippPageList } from 'src/components/layout' import { ModalService } from 'src/components/utilities' @@ -102,9 +102,20 @@ const AutopilotListDevices = () => { +
    - +
    + + ExecuteGetRequest({ + path: `/api/ExecSyncAPDevices?tenantFilter=${tenant.defaultDomainName}`, + }) + } + title="Sync Devices" + /> +
    +
    } datatable={{ keyField: 'id', From 47f00d867ac6e6b374953096de7ff50b2a05b9f7 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 18 Jan 2024 14:14:49 +0100 Subject: [PATCH 22/26] add assign device --- .../autopilot/AutopilotListDevices.jsx | 82 +++++++++++++++---- 1 file changed, 66 insertions(+), 16 deletions(-) diff --git a/src/views/endpoint/autopilot/AutopilotListDevices.jsx b/src/views/endpoint/autopilot/AutopilotListDevices.jsx index b53a794ff5b4..2d29dd86d574 100644 --- a/src/views/endpoint/autopilot/AutopilotListDevices.jsx +++ b/src/views/endpoint/autopilot/AutopilotListDevices.jsx @@ -1,10 +1,15 @@ -import React from 'react' +import React, { useState } from 'react' import { useSelector } from 'react-redux' import { CButton, CCallout, CSpinner } from '@coreui/react' -import { faArrowCircleDown, faSyncAlt, faTrash } from '@fortawesome/free-solid-svg-icons' +import { + faArrowCircleDown, + faEllipsisV, + faSyncAlt, + faTrash, +} from '@fortawesome/free-solid-svg-icons' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { CippPageList } from 'src/components/layout' -import { ModalService } from 'src/components/utilities' +import { CippActionsOffcanvas, ModalService } from 'src/components/utilities' import { useLazyGenericGetRequestQuery } from 'src/store/api/app' import { CellTip } from 'src/components/tables' import { TitleButton } from 'src/components/buttons' @@ -12,6 +17,8 @@ import { TitleButton } from 'src/components/buttons' const AutopilotListDevices = () => { const tenant = useSelector((state) => state.app.currentTenant) const [ExecuteGetRequest, getResults] = useLazyGenericGetRequestQuery() + const [ocVisible, setOCVisible] = useState(false) + const Actions = (row, index, column) => { const handleDeleteAPDevice = (apiurl, message) => { ModalService.confirm({ @@ -23,19 +30,62 @@ const AutopilotListDevices = () => { }) } return ( - - handleDeleteAPDevice( - `api/RemoveAPDevice?ID=${row.id}&tenantFilter=${tenant.defaultDomainName}`, - 'Do you want to delete the Autopilot Device?', - ) - } - > - - + <> + setOCVisible(true)}> + + + setOCVisible(false)} + /> + ) } From 7d1d12f1b5bc1cf6371d80eab22cba196fecec51 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 18 Jan 2024 14:33:41 +0100 Subject: [PATCH 23/26] frontend update --- src/views/endpoint/autopilot/AutopilotListDevices.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/endpoint/autopilot/AutopilotListDevices.jsx b/src/views/endpoint/autopilot/AutopilotListDevices.jsx index 2d29dd86d574..c7547c623b58 100644 --- a/src/views/endpoint/autopilot/AutopilotListDevices.jsx +++ b/src/views/endpoint/autopilot/AutopilotListDevices.jsx @@ -38,8 +38,8 @@ const AutopilotListDevices = () => { title="User Information" extendedInfo={[ { - label: 'Created Date (UTC)', - value: `${row.createdDateTime ?? ' '}`, + label: 'Assigned User', + value: `${row.userPrincipalName ?? ' '}`, }, { label: 'Windows PKID', value: `${row.productKey ?? ' '}` }, { label: 'Serial', value: `${row.serialNumber ?? ' '}` }, From c8aa464203a65e95558b8ed355a0ed546e2a8271 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Thu, 18 Jan 2024 14:58:58 +0100 Subject: [PATCH 24/26] minor updates interface --- src/views/endpoint/autopilot/AutopilotListDevices.jsx | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/views/endpoint/autopilot/AutopilotListDevices.jsx b/src/views/endpoint/autopilot/AutopilotListDevices.jsx index c7547c623b58..ef74e81d42fc 100644 --- a/src/views/endpoint/autopilot/AutopilotListDevices.jsx +++ b/src/views/endpoint/autopilot/AutopilotListDevices.jsx @@ -20,15 +20,6 @@ const AutopilotListDevices = () => { const [ocVisible, setOCVisible] = useState(false) const Actions = (row, index, column) => { - const handleDeleteAPDevice = (apiurl, message) => { - ModalService.confirm({ - title: 'Confirm', - body:
    {message}
    , - onConfirm: () => ExecuteGetRequest({ path: apiurl }), - confirmLabel: 'Continue', - cancelLabel: 'Cancel', - }) - } return ( <> setOCVisible(true)}> From 90757f599f94925f28b46e9071a89a80c35be5b2 Mon Sep 17 00:00:00 2001 From: rvdwegen Date: Fri, 19 Jan 2024 12:11:13 +0100 Subject: [PATCH 25/26] Fixes to tenant offboarding --- src/data/vendorTenantList.json | 32 +++++++++++++++++++ .../TenantOffboardingWizard.jsx | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/data/vendorTenantList.json b/src/data/vendorTenantList.json index 5bdebccccde3..de12e3508819 100644 --- a/src/data/vendorTenantList.json +++ b/src/data/vendorTenantList.json @@ -234,5 +234,37 @@ { "vendorName": "SaaSAlerts", "vendorTenantId": "5c7b2b48-9e8f-49ba-80d6-3432e39d596b" + }, + { + "vendorName": "BullPhish (Ciranda)", + "vendorTenantId": "5e4ab895-7a4c-4eea-bb39-75edca0421ad" + }, + { + "vendorName": "Coreview", + "vendorTenantId": "73506dd6-2bc3-49c0-92f3-b2877bab00ba" + }, + { + "vendorName": "Quickpass (CyberQP365)", + "vendorTenantId": "c9006408-eb26-4e50-9bd5-2c078e3dc844" + }, + { + "vendorName": "Infima", + "vendorTenantId": "2bd37396-af18-448c-a391-dd7800364e6f" + }, + { + "vendorName": "Immybot", + "vendorTenantId": "1dcfdedd-ec87-461d-9d55-6989a519d154" + }, + { + "vendorName": "N-Able/Cove backup", + "vendorTenantId": "521c973d-080f-4861-a0cb-8939e59d3d39" + }, + { + "vendorName": "Dropsuite", + "vendorTenantId": "5b8e57d8-5c8e-4b82-98a5-b003bbb26b31" + }, + { + "vendorName": "Huntress", + "vendorTenantId": "19be9add-482a-4c98-ba76-4c2ef7f3bb13" } ] diff --git a/src/views/tenant/administration/TenantOffboardingWizard.jsx b/src/views/tenant/administration/TenantOffboardingWizard.jsx index 38baf73903d8..81749ba3221b 100644 --- a/src/views/tenant/administration/TenantOffboardingWizard.jsx +++ b/src/views/tenant/administration/TenantOffboardingWizard.jsx @@ -222,7 +222,7 @@ const TenantOffboardingWizard = () => { From a804f5f23fc0f38f5f811f943bb8bca6edbc91c8 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Fri, 19 Jan 2024 15:11:28 +0100 Subject: [PATCH 26/26] up version --- public/version_latest.txt | 2 +- version_latest.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/version_latest.txt b/public/version_latest.txt index 1f1ac7c2f330..28cbf7c0aae3 100644 --- a/public/version_latest.txt +++ b/public/version_latest.txt @@ -1 +1 @@ -4.9.1 \ No newline at end of file +5.0.0 \ No newline at end of file diff --git a/version_latest.txt b/version_latest.txt index 1f1ac7c2f330..28cbf7c0aae3 100644 --- a/version_latest.txt +++ b/version_latest.txt @@ -1 +1 @@ -4.9.1 \ No newline at end of file +5.0.0 \ No newline at end of file