diff --git a/.vscode/launch.json b/.vscode/launch.json index df82b6059e48..b0363910187c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -27,6 +27,13 @@ "request": "launch", "name": "Launch Chrome Debugger", "url": "http://localhost:4280" + }, + { + "type": "PowerShell", + "name": "Launch in Windows Terminal", + "request": "launch", + "cwd": "${cwd}", + "script": ". '${cwd}\\Tools\\Start-CippDevEmulators.ps1'" } ], "compounds": [ diff --git a/Tools/Start-CippDevEmulators.ps1 b/Tools/Start-CippDevEmulators.ps1 new file mode 100644 index 000000000000..b4f6ca696ffe --- /dev/null +++ b/Tools/Start-CippDevEmulators.ps1 @@ -0,0 +1,4 @@ +Write-Host "Starting CIPP Dev Emulators" +$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 + diff --git a/package.json b/package.json index a8766820628f..f92f847989c0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cipp", - "version": "5.8.0", + "version": "5.8.5", "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/MFAStates.json b/public/MFAStates.json new file mode 100644 index 000000000000..fcaf8dc6ceb3 --- /dev/null +++ b/public/MFAStates.json @@ -0,0 +1,14 @@ +[ + { + "value": "disabled", + "label": "Disabled" + }, + { + "value": "enabled", + "label": "Enabled" + }, + { + "value": "enforced", + "label": "Enforced" + } +] diff --git a/public/version_latest.txt b/public/version_latest.txt index 11d9efa3d5ab..a075da200b96 100644 --- a/public/version_latest.txt +++ b/public/version_latest.txt @@ -1 +1 @@ -5.8.0 +5.8.5 diff --git a/src/components/buttons/TableModalButton.jsx b/src/components/buttons/TableModalButton.jsx index 67d2b22193da..f18dee1afe9f 100644 --- a/src/components/buttons/TableModalButton.jsx +++ b/src/components/buttons/TableModalButton.jsx @@ -50,4 +50,5 @@ TableModalButton.propTypes = { title: PropTypes.string, className: PropTypes.string, countOnly: PropTypes.bool, + icon: PropTypes.string, } diff --git a/src/components/tables/CellBoolean.jsx b/src/components/tables/CellBoolean.jsx index fc23282f7a2c..7ed5f5b8ebae 100644 --- a/src/components/tables/CellBoolean.jsx +++ b/src/components/tables/CellBoolean.jsx @@ -47,6 +47,7 @@ export default function CellBoolean({ if ( cell.toLowerCase() === 'success' || cell.toLowerCase() === 'enabled' || + cell.toLowerCase() === 'enforced' || cell.toLowerCase() === 'pass' || cell.toLowerCase() === 'true' || cell.toLowerCase() === 'compliant' diff --git a/src/data/standards.json b/src/data/standards.json index 28c9f0cdecab..6c9455bc7f04 100644 --- a/src/data/standards.json +++ b/src/data/standards.json @@ -550,6 +550,16 @@ "impact": "High Impact", "impactColour": "danger" }, + { + "name": "standards.PerUserMFA", + "cat": "Entra (AAD) Standards", + "tag": ["highimpact"], + "helpText": "Enables per user MFA for all users.", + "addedComponent": [], + "label": "Enables per user MFA for all users.", + "impact": "High Impact", + "impactColour": "danger" + }, { "name": "standards.OutBoundSpamAlert", "cat": "Exchange Standards", @@ -1327,7 +1337,7 @@ }, { "type": "boolean", - "label": "Enable Internal Sender Admin Notifications", + "label": "Enable External Sender Admin Notifications", "name": "standards.MalwareFilterPolicy.EnableExternalSenderAdminNotifications" }, { diff --git a/src/views/endpoint/intune/MEMListCompliance.jsx b/src/views/endpoint/intune/MEMListCompliance.jsx index 9b970031bb1d..328a387566fd 100644 --- a/src/views/endpoint/intune/MEMListCompliance.jsx +++ b/src/views/endpoint/intune/MEMListCompliance.jsx @@ -151,7 +151,7 @@ const ComplianceList = () => { label: 'Delete Policy', modal: true, modalUrl: `api/RemovePolicy?TenantFilter=${tenant?.defaultDomainName}&ID=!id&URLName=deviceCompliancePolicies`, - modalMessage: 'Are you sure you want to convert these users to a shared mailbox?', + modalMessage: 'Are you sure you want to delete these policies?', }, ], }, diff --git a/src/views/identity/administration/Users.jsx b/src/views/identity/administration/Users.jsx index 0f34be2af7ef..93adcb0f1de8 100644 --- a/src/views/identity/administration/Users.jsx +++ b/src/views/identity/administration/Users.jsx @@ -111,6 +111,26 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { modalUrl: `/api/ExecSendPush?TenantFilter=${tenant.defaultDomainName}&UserEmail=${row.userPrincipalName}`, modalMessage: 'Are you sure you want to send a MFA request?', }, + { + label: 'Set Per-User MFA', + color: 'info', + modal: true, + modalUrl: `/api/ExecPerUserMFA`, + modalType: 'POST', + modalBody: { + TenantFilter: tenant.defaultDomainName, + userId: `${row.userPrincipalName}`, + }, + modalMessage: 'Are you sure you want to set per-user MFA for these users?', + modalDropdown: { + url: '/MFAStates.json', + labelField: 'label', + valueField: 'value', + addedField: { + State: 'value', + }, + }, + }, { label: 'Convert to Shared Mailbox', color: 'info', @@ -500,6 +520,26 @@ const Users = (row) => { modalUrl: `/api/ExecResetMFA?TenantFilter=!Tenant&ID=!id`, modalMessage: 'Are you sure you want to enable MFA for these users?', }, + { + label: 'Set Per-User MFA', + color: 'info', + modal: true, + modalUrl: `/api/ExecPerUserMFA`, + modalType: 'POST', + modalBody: { + TenantFilter: tenant.defaultDomainName, + userId: '!userPrincipalName', + }, + modalMessage: 'Are you sure you want to set per-user MFA for these users?', + modalDropdown: { + url: '/MFAStates.json', + labelField: 'label', + valueField: 'value', + addedField: { + State: 'value', + }, + }, + }, { label: 'Enable Online Archive', color: 'info', diff --git a/src/views/identity/reports/MFAReport.jsx b/src/views/identity/reports/MFAReport.jsx index 4f1d80936fa2..27f09aecfa3b 100644 --- a/src/views/identity/reports/MFAReport.jsx +++ b/src/views/identity/reports/MFAReport.jsx @@ -2,6 +2,7 @@ import React from 'react' import { useSelector } from 'react-redux' import { cellBooleanFormatter, CellTip } from 'src/components/tables' import { CippPageList } from 'src/components/layout' +import { Row } from 'react-bootstrap' const columns = [ { @@ -9,7 +10,8 @@ const columns = [ name: 'User Principal Name', sortable: true, exportSelector: 'UPN', - grow: 2, + cell: (row) => CellTip(row['UPN']), + maxWidth: '400px', }, { selector: (row) => row['AccountEnabled'], @@ -17,6 +19,7 @@ const columns = [ sortable: true, cell: cellBooleanFormatter({ colourless: true }), exportSelector: 'AccountEnabled', + maxWidth: '200px', }, { selector: (row) => row['isLicensed'], @@ -24,6 +27,7 @@ const columns = [ sortable: true, cell: cellBooleanFormatter({ colourless: true }), exportSelector: 'isLicensed', + maxWidth: '200px', }, { selector: (row) => row['MFARegistration'], @@ -31,13 +35,23 @@ const columns = [ sortable: true, cell: cellBooleanFormatter(), exportSelector: 'MFARegistration', + maxWidth: '200px', + }, + { + selector: (row) => row['PerUser'], + name: 'Per user MFA Status', + sortable: true, + cell: cellBooleanFormatter(), + exportSelector: 'PerUser', + maxWidth: '200px', }, { selector: (row) => row['CoveredBySD'], name: 'Enforced via Security Defaults', sortable: true, - cell: cellBooleanFormatter({ colourless: true }), + cell: cellBooleanFormatter(), exportSelector: 'CoveredBySD', + maxWidth: '200px', }, { selector: (row) => row['CoveredByCA'], @@ -46,12 +60,6 @@ const columns = [ cell: (row) => CellTip(row['CoveredByCA']), exportSelector: 'CoveredByCA', }, - { - selector: (row) => row['PerUser'], - name: 'Per user MFA Status', - sortable: true, - exportSelector: 'PerUser', - }, ] const Altcolumns = [ diff --git a/version_latest.txt b/version_latest.txt index 82544bb3fa78..a075da200b96 100644 --- a/version_latest.txt +++ b/version_latest.txt @@ -1,2 +1 @@ -5.8.0 - +5.8.5