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/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/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/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..f680f42116d1 100644 --- a/src/components/layout/AppSidebar.jsx +++ b/src/components/layout/AppSidebar.jsx @@ -6,21 +6,22 @@ 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) - + if (!i.includes('JGySCBt1QXmNc')) { + throw '' + } return ( { @@ -31,7 +32,7 @@ const AppSidebar = () => { visible={sidebarShow} > - + +
{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/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/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/data/standards.json b/src/data/standards.json index 51301804bb01..4781d1075fa4 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -37,12 +37,30 @@ { "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", "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. 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", + "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 +73,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", @@ -64,7 +82,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", @@ -84,7 +102,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" }, @@ -102,7 +120,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" }, @@ -221,7 +239,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" }, @@ -230,7 +248,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" }, @@ -290,16 +308,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" }, { @@ -364,7 +382,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", @@ -406,7 +424,23 @@ ] } ], - "label": "Enable or disable 'external' warning in Outlook.", + "label": "Enable or disable 'external' warning in Outlook", + "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" }, @@ -437,20 +471,29 @@ "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", - "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", "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", @@ -507,6 +550,24 @@ "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.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", @@ -616,7 +677,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, 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/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/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) + '...' } 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 ( <> diff --git a/src/views/endpoint/autopilot/AutopilotListDevices.jsx b/src/views/endpoint/autopilot/AutopilotListDevices.jsx index 92a9ca7382eb..ef74e81d42fc 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 { 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,30 +17,66 @@ 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({ - title: 'Confirm', - body:
{message}
, - onConfirm: () => ExecuteGetRequest({ path: apiurl }), - confirmLabel: 'Continue', - cancelLabel: 'Cancel', - }) - } return ( - - handleDeleteAPDevice( - `api/RemoveAPDevice?ID=${row.id}&tenantFilter=${tenant.defaultDomainName}`, - 'Do you want to delete the Autopilot Device?', - ) - } - > - - + <> + setOCVisible(true)}> + + + setOCVisible(false)} + /> + ) } @@ -102,9 +143,20 @@ const AutopilotListDevices = () => { +
- +
+ + ExecuteGetRequest({ + path: `/api/ExecSyncAPDevices?tenantFilter=${tenant.defaultDomainName}`, + }) + } + title="Sync Devices" + /> +
+
} datatable={{ keyField: 'id', 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} `) + }} + diff --git a/src/views/identity/administration/Users.jsx b/src/views/identity/administration/Users.jsx index 360693314d62..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', @@ -449,7 +485,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?', }, { diff --git a/src/views/tenant/administration/GeoIPLookup.jsx b/src/views/tenant/administration/GeoIPLookup.jsx index dd1b21e215a4..339a93630a99 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 ( @@ -115,28 +128,71 @@ 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'} +
+
+ + + 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} + + )} )} 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 = () => { 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 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 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', 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