From aff91489a98aa71e7ea7cdfad5d41203604e14aa Mon Sep 17 00:00:00 2001 From: John Duprey Date: Tue, 13 Aug 2024 22:47:48 -0400 Subject: [PATCH 01/18] Add processor function support Expects CIPP-API-Processor as folder name --- Tools/Start-CippDevEmulators.ps1 | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Tools/Start-CippDevEmulators.ps1 b/Tools/Start-CippDevEmulators.ps1 index b4f6ca696ffe..bde7511caac1 100644 --- a/Tools/Start-CippDevEmulators.ps1 +++ b/Tools/Start-CippDevEmulators.ps1 @@ -1,4 +1,12 @@ -Write-Host "Starting CIPP Dev Emulators" +Write-Host 'Starting CIPP Dev Emulators' +Get-Process node -ErrorAction SilentlyContinue | Stop-Process -ErrorAction SilentlyContinue $Path = (Get-Item $PSScriptRoot).Parent.Parent.FullName -wt --title CIPP`; new-tab --title 'Azurite' -d $Path pwsh -c azurite`; new-tab --title 'FunctionApp' -d $Path\CIPP-API pwsh -c func start`; new-tab --title 'CIPP Frontend' -d $Path\CIPP pwsh -c npm run start`; new-tab --title 'SWA' -d $Path\CIPP pwsh -c npm run start-swa + +$Process = Read-Host -Prompt 'Start Process Function (y/N)?' + +if ($Process -eq 'y') { + wt --title CIPP`; new-tab --title 'Azurite' -d $Path pwsh -c azurite`; new-tab --title 'FunctionApp' -d $Path\CIPP-API pwsh -c func start`; new-tab --title 'CIPP Frontend' -d $Path\CIPP pwsh -c npm run start`; new-tab --title 'SWA' -d $Path\CIPP pwsh -c npm run start-swa`; new-tab --title 'CIPP-API-Processor' -d $Path\CIPP-API-Processor pwsh -c func start --port 7072 +} else { + wt --title CIPP`; new-tab --title 'Azurite' -d $Path pwsh -c azurite`; new-tab --title 'FunctionApp' -d $Path\CIPP-API pwsh -c func start`; new-tab --title 'CIPP Frontend' -d $Path\CIPP pwsh -c npm run start`; new-tab --title 'SWA' -d $Path\CIPP pwsh -c npm run start-swa +} From a7308f45f15892dba954ba834c744d15e92f788e Mon Sep 17 00:00:00 2001 From: John Duprey Date: Tue, 13 Aug 2024 22:50:29 -0400 Subject: [PATCH 02/18] Add extension call to action support --- src/views/cipp/Extensions.jsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/views/cipp/Extensions.jsx b/src/views/cipp/Extensions.jsx index 5923599a6f66..84841ec3ec18 100644 --- a/src/views/cipp/Extensions.jsx +++ b/src/views/cipp/Extensions.jsx @@ -22,6 +22,7 @@ import CippButtonCard from 'src/components/contentcards/CippButtonCard.jsx' import { RFFCFormInput, RFFCFormSwitch } from 'src/components/forms/RFFComponents.jsx' import { Form } from 'react-final-form' import ExtensionMappings from 'src/views/cipp/ExtensionMappings.jsx' +import ReactHtmlParser from 'react-html-parser' export default function CIPPExtensions() { const [listBackend, listBackendResult] = useLazyGenericGetRequestQuery() @@ -121,6 +122,12 @@ export default function CIPPExtensions() { clients. )} + {integration?.callToAction && ( + + + {ReactHtmlParser(integration.callToAction)} + + )} Date: Tue, 13 Aug 2024 23:24:57 -0400 Subject: [PATCH 03/18] CIPP-SAM API Permissions - Add new components - SettingsAppPermissions - CippAppPermissionBuilder - Modify CippButtonCard, make isFetching not required and default false - Modify CellTip & CellGenericFormat, allow for wrapping text - Add onCreateOption to Creatable - CSS tweaks - Make adjust CippTable filter z-index to not conflict with select search - Add CIPP-SAM permission SuperAdmin section --- .../contentcards/CippButtonCard.jsx | 4 +- src/components/forms/RFFComponents.jsx | 6 +- src/components/tables/CellGenericFormat.jsx | 12 +- src/components/tables/CellTip.jsx | 4 +- .../utilities/CippAppPermissionBuilder.jsx | 585 ++++++++++++++++++ src/scss/_custom.scss | 6 + src/scss/_themes.scss | 1 + .../cipp/app-settings/SettingsSuperAdmin.jsx | 212 +++++-- .../components/SettingsAppPermissions.jsx | 65 ++ 9 files changed, 821 insertions(+), 74 deletions(-) create mode 100644 src/components/utilities/CippAppPermissionBuilder.jsx create mode 100644 src/views/cipp/app-settings/components/SettingsAppPermissions.jsx diff --git a/src/components/contentcards/CippButtonCard.jsx b/src/components/contentcards/CippButtonCard.jsx index 8e74d5470693..8e280ab067d3 100644 --- a/src/components/contentcards/CippButtonCard.jsx +++ b/src/components/contentcards/CippButtonCard.jsx @@ -8,7 +8,7 @@ export default function CippButtonCard({ titleType = 'normal', CardButton, children, - isFetching, + isFetching = false, className = 'h-100', }) { return ( @@ -32,6 +32,6 @@ CippButtonCard.propTypes = { titleType: PropTypes.string, CardButton: PropTypes.element.isRequired, children: PropTypes.element.isRequired, - isFetching: PropTypes.bool.isRequired, + isFetching: PropTypes.bool, className: PropTypes.string, } diff --git a/src/components/forms/RFFComponents.jsx b/src/components/forms/RFFComponents.jsx index 14163a033d62..30e096a71aa8 100644 --- a/src/components/forms/RFFComponents.jsx +++ b/src/components/forms/RFFComponents.jsx @@ -516,6 +516,7 @@ export const RFFSelectSearch = ({ retainInput = true, isLoading = false, allowCreate = false, + onCreateOption, refreshFunction, ...props }) => { @@ -589,7 +590,7 @@ export const RFFSelectSearch = ({ )} {allowCreate ? ( - + ) : ( - {dropMessage} - - - + <> + {returnCard ? ( + +
+ + + {dropMessage} + +
+
+ ) : ( +
+ + + {dropMessage} + +
+ )} + ) } @@ -73,6 +92,7 @@ CippDropzone.propTypes = { dropMessage: PropTypes.string, accept: PropTypes.object, maxFiles: PropTypes.number, + returnCard: PropTypes.bool, } export default CippDropzone From 7e87b2a1cdde1d23a885f31aa829bbbf02966ad5 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 14 Aug 2024 16:09:56 -0400 Subject: [PATCH 09/18] Create service principal capabilities --- .../utilities/CippAppPermissionBuilder.jsx | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/components/utilities/CippAppPermissionBuilder.jsx b/src/components/utilities/CippAppPermissionBuilder.jsx index 93b1b9abef8c..e4c2ee3bfdf8 100644 --- a/src/components/utilities/CippAppPermissionBuilder.jsx +++ b/src/components/utilities/CippAppPermissionBuilder.jsx @@ -13,7 +13,7 @@ import { } from '@coreui/react' import { Field, Form, FormSpy } from 'react-final-form' import { RFFCFormRadioList, RFFSelectSearch } from 'src/components/forms' -import { useGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app' +import { useGenericGetRequestQuery, useLazyGenericGetRequestQuery } from 'src/store/api/app' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { TenantSelectorMultiple, @@ -53,6 +53,8 @@ const CippAppPermissionBuilder = ({ onSubmit, currentPermissions = {}, isSubmitt path: 'api/ExecServicePrincipals', }) + const [createServicePrincipal, createResult] = useLazyGenericGetRequestQuery() + const removeServicePrincipal = (appId) => { var servicePrincipal = selectedApp.find((sp) => sp?.appId === appId) var newServicePrincipals = selectedApp.filter((sp) => sp?.appId !== appId) @@ -91,6 +93,15 @@ const CippAppPermissionBuilder = ({ onSubmit, currentPermissions = {}, isSubmitt } } + const onCreateServicePrincipal = (appId) => { + createServicePrincipal({ + path: 'api/ExecServicePrincipals?Action=Create&AppId=' + appId, + }).then(() => { + refetchSpList() + setCalloutMessage(createResult?.data?.Results) + }) + } + const addPermissionRow = (servicePrincipal, permissionType, permission) => { var updatedPermissions = JSON.parse(JSON.stringify(newPermissions)) @@ -683,7 +694,7 @@ const CippAppPermissionBuilder = ({ onSubmit, currentPermissions = {}, isSubmitt refreshFunction={() => refetchSpList()} allowCreate={true} onCreateOption={(newSp) => { - console.log(newSp) + onCreateServicePrincipal(newSp) }} placeholder="(Advanced) Select a Service Principal" /> From f22f756ed8dec5115bf0c12bf232b3bc7df9a36b Mon Sep 17 00:00:00 2001 From: John Duprey Date: Wed, 14 Aug 2024 18:39:29 -0400 Subject: [PATCH 10/18] Permission builder --- .../utilities/CippAppPermissionBuilder.jsx | 79 +++++++++++++++++++ .../components/SettingsAppPermissions.jsx | 13 ++- 2 files changed, 88 insertions(+), 4 deletions(-) diff --git a/src/components/utilities/CippAppPermissionBuilder.jsx b/src/components/utilities/CippAppPermissionBuilder.jsx index e4c2ee3bfdf8..c986b67145f2 100644 --- a/src/components/utilities/CippAppPermissionBuilder.jsx +++ b/src/components/utilities/CippAppPermissionBuilder.jsx @@ -821,6 +821,85 @@ const CippAppPermissionBuilder = ({ onSubmit, currentPermissions = {}, isSubmitt )} + + {newPermissions?.MissingPermissions && + newPermissions?.Type === 'Table' && + Object.keys(newPermissions?.MissingPermissions).length > 0 && ( + + + + + + + New Permissions Available + {Object.keys(newPermissions?.MissingPermissions).map((perm) => { + // translate appid to display name + var sp = servicePrincipals?.Results?.find( + (sp) => sp.appId === perm, + ) + return ( +
+ {sp?.displayName}:{' '} + {Object.keys(newPermissions?.MissingPermissions[perm]).map( + (type) => { + return ( + <> + {newPermissions?.MissingPermissions[perm][type] + .length > 0 && ( + + {type == 'applicationPermissions' + ? 'Application' + : 'Delegated'}{' '} + -{' '} + {newPermissions?.MissingPermissions[perm][type] + .map((p) => { + return p.value + }) + .join(', ')} + + )} + + ) + }, + )} +
+ ) + })} +
+ + + { + var updatedPermissions = JSON.parse( + JSON.stringify(newPermissions), + ) + Object.keys(newPermissions?.MissingPermissions).map( + (perm) => { + Object.keys( + newPermissions?.MissingPermissions[perm], + ).map((type) => { + newPermissions?.MissingPermissions[perm][type].map( + (p) => { + updatedPermissions.Permissions[perm][type].push(p) + }, + ) + }) + }, + ) + updatedPermissions.MissingPermissions = {} + setNewPermissions(updatedPermissions) + }} + className={`circular-button float-end`} + > + + + + +
+
+
+
+ )} <> {selectedApp?.length > 0 && diff --git a/src/views/cipp/app-settings/components/SettingsAppPermissions.jsx b/src/views/cipp/app-settings/components/SettingsAppPermissions.jsx index c3b6da3ffbd7..d36dffb0b597 100644 --- a/src/views/cipp/app-settings/components/SettingsAppPermissions.jsx +++ b/src/views/cipp/app-settings/components/SettingsAppPermissions.jsx @@ -28,13 +28,18 @@ const SettingsAppPermissions = () => { genericPostRequest({ path: 'api/ExecSAMAppPermissions?Action=Update', values: values, + }).then(() => { + refetchSam() }) } - const { data: samAppPermissions = [], isFetching: samAppPermissionsFetching } = - useGenericGetRequestQuery({ - path: 'api/ExecSAMAppPermissions', - }) + const { + data: samAppPermissions = [], + isFetching: samAppPermissionsFetching, + refetch: refetchSam, + } = useGenericGetRequestQuery({ + path: 'api/ExecSAMAppPermissions', + }) return ( From d642177ad73c52b5f621de97377161f70108c2aa Mon Sep 17 00:00:00 2001 From: John Duprey Date: Fri, 16 Aug 2024 12:17:38 -0400 Subject: [PATCH 11/18] Fix CellTable item count for single objects --- src/components/tables/CellTable.jsx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/components/tables/CellTable.jsx b/src/components/tables/CellTable.jsx index cfcbd5403065..2186a406fe6b 100644 --- a/src/components/tables/CellTable.jsx +++ b/src/components/tables/CellTable.jsx @@ -23,6 +23,15 @@ export default function cellTable( if (columnProp === undefined || columnProp === null) { columnProp = [] } else { + var objectLength = 1 + var lengthText = 'Item' + if (columnProp instanceof Array) { + objectLength = columnProp.length + if (objectLength > 1) { + lengthText = 'Items' + } + } + if (!Array.isArray(columnProp) && typeof columnProp === 'object') { columnProp = Object.keys(columnProp).map((key) => { return { @@ -93,7 +102,7 @@ export default function cellTable( size="sm" onClick={() => handleTable({ columnProp })} > - {columnProp.length} Items + {objectLength} {lengthText} ) } From 22c72644a9da76cffcc9c2d4a8e1c1725eddc824 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Fri, 16 Aug 2024 17:29:11 -0400 Subject: [PATCH 12/18] Huntress RogueApps - Add new scripted alert - Update alert wizard to accept a description property for scripted alerts --- src/data/alerts.json | 6 +++++ .../tenant/administration/AlertWizard.jsx | 24 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/data/alerts.json b/src/data/alerts.json index 835216740c4d..13f18265caf4 100644 --- a/src/data/alerts.json +++ b/src/data/alerts.json @@ -99,5 +99,11 @@ "name": "DeviceCompliance", "label": "Alert on device compliance issues", "recommendedRunInterval": "4h" + }, + { + "name": "HuntressRogueApps", + "label": "Alert on Huntress Rogue Apps detected", + "recommendedRunInterval": "4h", + "description": "Huntress has provided a repository of known rogue apps that are commonly used in BEC, data exfiltration and other Microsoft 365 attacks. This alert will notify you if any of these apps are detected in the selected tenant(s). For more information, see https://huntresslabs.github.io/rogueapps/." } ] diff --git a/src/views/tenant/administration/AlertWizard.jsx b/src/views/tenant/administration/AlertWizard.jsx index 9b5253ef7351..e444c11ec123 100644 --- a/src/views/tenant/administration/AlertWizard.jsx +++ b/src/views/tenant/administration/AlertWizard.jsx @@ -21,6 +21,7 @@ import auditLogSchema from 'src/data/AuditLogSchema.json' import auditLogTemplates from 'src/data/AuditLogTemplates.json' import Skeleton from 'react-loading-skeleton' import { required } from 'src/validators' +import HtmlParser from 'react-html-parser' const AlertWizard = () => { const tenantDomain = useSelector((state) => state.app.currentTenant.defaultDomainName) @@ -112,6 +113,18 @@ const AlertWizard = () => { } } + const getScriptDescription = () => { + const values = currentFormState?.values + if (values) { + const command = values.command?.value + if (command?.description) { + return HtmlParser(command.description) + } else { + return null + } + } + } + const setAuditForm = (e) => { const preset = presetValues.find((p) => p.value === e.value) setAuditFormState(preset.template) @@ -368,6 +381,16 @@ const AlertWizard = () => { render={({ handleSubmit, submitting, values }) => { return ( + {getScriptDescription() && ( + + + + + {getScriptDescription()} + + + + )} { /> + From b86f0dd65321e28ff61a0752147fc2595c024d59 Mon Sep 17 00:00:00 2001 From: Chris Brannon Date: Sat, 17 Aug 2024 17:03:54 -0400 Subject: [PATCH 13/18] Assign & Unassign Teams Voice User Numbers --- src/views/teams-share/teams/BusinessVoice.jsx | 249 ++++++++++++++---- 1 file changed, 194 insertions(+), 55 deletions(-) diff --git a/src/views/teams-share/teams/BusinessVoice.jsx b/src/views/teams-share/teams/BusinessVoice.jsx index 6c132806d8bf..ada434df6895 100644 --- a/src/views/teams-share/teams/BusinessVoice.jsx +++ b/src/views/teams-share/teams/BusinessVoice.jsx @@ -1,68 +1,207 @@ -import React from 'react' +import React, { useState } from 'react' +import { CButton } from '@coreui/react' import { useSelector } from 'react-redux' import { CellBoolean } from 'src/components/tables' import { CippPageList } from 'src/components/layout' - -const Formatter = (cell) => CellBoolean({ cell }) -const columns = [ - { - name: 'Assigned to User', - selector: (row) => row['AssignedTo'], - sortable: true, - exportSelector: 'AssignedTo', - }, - { - name: 'Phone Number', - selector: (row) => row['TelephoneNumber'], - sortable: true, - exportSelector: 'TelephoneNumber', - }, - { - name: 'Number Type', - selector: (row) => row['NumberType'], - sortable: true, - exportSelector: 'NumberType', - }, - { - name: 'Country', - selector: (row) => row['IsoCountryCode'], - sortable: true, - exportSelector: 'IsCountryCode', - }, - { - name: 'Location', - selector: (row) => row['PlaceName'], - sortable: true, - exportSelector: 'PlaceName', - }, - { - name: 'Activation State', - selector: (row) => row['ActivationState'], - formatter: Formatter, - exportSelector: 'ActivationState', - sortable: true, - }, - { - name: 'Operator Connect', - selector: (row) => row['IsOperatorConnect'], - formatter: Formatter, - sortable: true, - exportSelector: 'IsOperatorConnect', - }, - { - name: 'Purchased on', - selector: (row) => row['AcquisitionDate'], - sortable: true, - exportSelector: 'AcquisitionDate', - }, -] +import { TitleButton } from 'src/components/buttons' +import { CippActionsOffcanvas } from 'src/components/utilities' +import { faEllipsisV } from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' const BusinessVoice = () => { const tenant = useSelector((state) => state.app.currentTenant) + const Offcanvas = (row, rowIndex, formatExtraData) => { + const tenant = useSelector((state) => state.app.currentTenant) + const [ocVisible, setOCVisible] = useState(false) + return ( + <> + setOCVisible(true)}> + + + setOCVisible(false)} + /> + + ) + } + const Formatter = (cell) => CellBoolean({ cell }) + const usageFormatter = (cell) => { + if (cell.includes('UserAssignment')) { + return 'User' + } + if (cell.includes('FirstPartyAppAssignment')) { + return 'Voice App' + } + if (cell.includes('ConferenceAssignment')) { + return 'Conference' + } + return cell[0] + } + const columns = [ + { + name: 'Assigned to User', + selector: (row) => row['AssignedTo'], + sortable: true, + exportSelector: 'AssignedTo', + }, + { + name: 'Phone Number', + selector: (row) => row['TelephoneNumber'], + sortable: true, + exportSelector: 'TelephoneNumber', + }, + { + name: 'Assignment Status', + selector: (row) => row['AssignmentStatus'], + sortable: true, + exportSelector: 'AssignmentStatus', + }, + { + name: 'Number Type', + selector: (row) => row['NumberType'], + sortable: true, + exportSelector: 'NumberType', + }, + { + name: 'Licensed Usage', + selector: (row) => usageFormatter(row['AcquiredCapabilities']), + sortable: true, + exportSelector: 'AcquiredCapabilities', + }, + { + name: 'Country', + selector: (row) => row['IsoCountryCode'], + sortable: true, + exportSelector: 'IsCountryCode', + }, + { + name: 'Location', + selector: (row) => row['PlaceName'], + sortable: true, + exportSelector: 'PlaceName', + }, + { + name: 'Activation State', + selector: (row) => row['ActivationState'], + formatter: Formatter, + exportSelector: 'ActivationState', + sortable: true, + }, + { + name: 'Operator Connect', + selector: (row) => row['IsOperatorConnect'], + formatter: Formatter, + sortable: true, + exportSelector: 'IsOperatorConnect', + }, + { + name: 'Purchased on', + selector: (row) => row['AcquisitionDate'], + sortable: true, + exportSelector: 'AcquisitionDate', + }, + { + name: 'Actions', + cell: Offcanvas, + }, + ] + const titleButtons = ( +
+
+ +
+
+ ) return ( Date: Sat, 17 Aug 2024 17:26:25 -0400 Subject: [PATCH 14/18] Formatting Issue --- src/views/teams-share/teams/BusinessVoice.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/views/teams-share/teams/BusinessVoice.jsx b/src/views/teams-share/teams/BusinessVoice.jsx index ada434df6895..5f2c0d32598a 100644 --- a/src/views/teams-share/teams/BusinessVoice.jsx +++ b/src/views/teams-share/teams/BusinessVoice.jsx @@ -199,7 +199,8 @@ const BusinessVoice = () => { filterlist: [ { filterName: 'Unassigned User Numbers', - filter: 'Complex: AssignmentStatus eq Unassigned; AcquiredCapabilities like UserAssignment', + filter: + 'Complex: AssignmentStatus eq Unassigned; AcquiredCapabilities like UserAssignment', }, ], columns, From cc0eda1b7ac6c105c1ae5f70b9a817102117b88e Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Sun, 18 Aug 2024 18:29:48 +0200 Subject: [PATCH 15/18] Fixes jitadmin issues --- src/views/identity/administration/DeployJITAdmin.jsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/views/identity/administration/DeployJITAdmin.jsx b/src/views/identity/administration/DeployJITAdmin.jsx index 81d23666fa61..146ab7d6fef1 100644 --- a/src/views/identity/administration/DeployJITAdmin.jsx +++ b/src/views/identity/administration/DeployJITAdmin.jsx @@ -47,10 +47,13 @@ const DeployJITAdmin = () => { 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, - UserPrincipalName: `${values.username}@${values.domain}`, + UserId: values.UserId?.value.id, + UserPrincipalName: values.username + ? `${values.username}@${values.domain}` + : values.UserId?.value.userPrincipalName, FirstName: values.FirstName, LastName: values.LastName, useraction: values.useraction, @@ -168,7 +171,7 @@ const DeployJITAdmin = () => { ({ - value: user.id, + value: { userPrincipalName: user.userPrincipalName, id: user.id }, name: `${user.displayName} <${user.userPrincipalName}>`, }))} placeholder={!usersIsFetching ? 'Select user' : 'Loading...'} From e6258b92973e6ca8c9fc7ead4f1852f476d81682 Mon Sep 17 00:00:00 2001 From: MoltenTesseract Date: Mon, 19 Aug 2024 14:44:09 +1000 Subject: [PATCH 16/18] Fix delete rule confirmation text The delete popup incorrectly asked to confirm to disable the rule, not delete it. --- src/views/email-exchange/connectors/ConnectorList.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/email-exchange/connectors/ConnectorList.jsx b/src/views/email-exchange/connectors/ConnectorList.jsx index c18d5eeb0004..1f3829abcb1d 100644 --- a/src/views/email-exchange/connectors/ConnectorList.jsx +++ b/src/views/email-exchange/connectors/ConnectorList.jsx @@ -57,7 +57,7 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { modal: true, icon: , modalUrl: `/api/RemoveExConnector?TenantFilter=${tenant.defaultDomainName}&GUID=${row.Guid}&Type=${row.cippconnectortype}`, - modalMessage: 'Are you sure you want to disable this rule?', + modalMessage: 'Are you sure you want to delete this rule?', }, ]} placement="end" From aaa50b96f810c51e2f7c3fa9ba167ce201166682 Mon Sep 17 00:00:00 2001 From: KelvinTegelaar Date: Mon, 19 Aug 2024 18:58:09 +0200 Subject: [PATCH 17/18] 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 41b4ceedb492..b74d149fe82e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cipp", - "version": "6.2.2", + "version": "6.3.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 ca06394388d6..798e38995c4d 100644 --- a/public/version_latest.txt +++ b/public/version_latest.txt @@ -1 +1 @@ -6.2.2 +6.3.0 diff --git a/version_latest.txt b/version_latest.txt index ca06394388d6..798e38995c4d 100644 --- a/version_latest.txt +++ b/version_latest.txt @@ -1 +1 @@ -6.2.2 +6.3.0 From b3d79e60f23a239c9c049a3d79d4a5240854af58 Mon Sep 17 00:00:00 2001 From: John Duprey Date: Mon, 19 Aug 2024 13:16:47 -0400 Subject: [PATCH 18/18] Fix reset mfa --- src/views/identity/administration/Users.jsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/views/identity/administration/Users.jsx b/src/views/identity/administration/Users.jsx index 4d236659ad7f..eb0cd4f29f6c 100644 --- a/src/views/identity/administration/Users.jsx +++ b/src/views/identity/administration/Users.jsx @@ -99,10 +99,10 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { }, { label: 'Rerequire MFA registration', - link: entraLink, color: 'info', - target: '_blank', - external: true, + modal: true, + modalUrl: `/api/ExecResetMFA?TenantFilter=${tenant.defaultDomainName}&ID=${row.userPrincipalName}`, + modalMessage: 'Are you sure you want to reset MFA for this user?', }, { label: 'Send MFA Push', @@ -527,8 +527,8 @@ const Users = (row) => { { label: 'Rerequire MFA registration', modal: true, - modalUrl: `/api/ExecResetMFA?TenantFilter=!Tenant&ID=!id`, - modalMessage: 'Are you sure you want to enable MFA for these users?', + modalUrl: `/api/ExecResetMFA?TenantFilter=!Tenant&ID=!userPrincipalName`, + modalMessage: 'Are you sure you want to reset MFA for these users?', }, { label: 'Set Per-User MFA',