diff --git a/deployment/AzureDeploymentTemplate.json b/deployment/AzureDeploymentTemplate.json index 620700934567..bc7eb0ba9efe 100644 --- a/deployment/AzureDeploymentTemplate.json +++ b/deployment/AzureDeploymentTemplate.json @@ -115,18 +115,6 @@ "dependsOn": [ "[resourceId('Microsoft.KeyVault/vaults', variables('uniqueResourceNameBase'))]" ] - }, - { - "type": "secrets", - "name": "exchangerefreshtoken", - "apiVersion": "2015-06-01", - "properties": { - "contentType": "text/plain", - "value": "ExchangeRefreshToken" - }, - "dependsOn": [ - "[resourceId('Microsoft.KeyVault/vaults', variables('uniqueResourceNameBase'))]" - ] } ], "dependsOn": ["[resourceId('Microsoft.Web/sites', variables('funcAppName'))]"] @@ -178,10 +166,6 @@ "name": "RefreshToken", "value": "[concat('@Microsoft.KeyVault(SecretUri=https://',variables('uniqueResourceNameBase'), '.vault.azure.net/secrets/RefreshToken)')]" }, - { - "name": "ExchangeRefreshtoken", - "value": "[concat('@Microsoft.KeyVault(SecretUri=https://',variables('uniqueResourceNameBase'), '.vault.azure.net/secrets/ExchangeRefreshToken)')]" - }, { "name": "TenantID", "value": "[concat('@Microsoft.KeyVault(SecretUri=https://',variables('uniqueResourceNameBase'), '.vault.azure.net/secrets/tenantid)')]" diff --git a/deployment/AzureDeploymentTemplate_regionoptions.json b/deployment/AzureDeploymentTemplate_regionoptions.json index c187bb7dc914..11fccba7350c 100644 --- a/deployment/AzureDeploymentTemplate_regionoptions.json +++ b/deployment/AzureDeploymentTemplate_regionoptions.json @@ -115,18 +115,6 @@ "dependsOn": [ "[resourceId('Microsoft.KeyVault/vaults', variables('uniqueResourceNameBase'))]" ] - }, - { - "type": "secrets", - "name": "exchangerefreshtoken", - "apiVersion": "2015-06-01", - "properties": { - "contentType": "text/plain", - "value": "ExchangeRefreshToken" - }, - "dependsOn": [ - "[resourceId('Microsoft.KeyVault/vaults', variables('uniqueResourceNameBase'))]" - ] } ], "dependsOn": ["[resourceId('Microsoft.Web/sites', variables('funcAppName'))]"] @@ -178,10 +166,6 @@ "name": "RefreshToken", "value": "[concat('@Microsoft.KeyVault(SecretUri=https://',variables('uniqueResourceNameBase'), '.vault.azure.net/secrets/RefreshToken)')]" }, - { - "name": "ExchangeRefreshtoken", - "value": "[concat('@Microsoft.KeyVault(SecretUri=https://',variables('uniqueResourceNameBase'), '.vault.azure.net/secrets/ExchangeRefreshToken)')]" - }, { "name": "TenantID", "value": "[concat('@Microsoft.KeyVault(SecretUri=https://',variables('uniqueResourceNameBase'), '.vault.azure.net/secrets/tenantid)')]" diff --git a/deployment/DevAzureDeploymentTemplate.json b/deployment/DevAzureDeploymentTemplate.json index a653cebc66dd..dee70ee11871 100644 --- a/deployment/DevAzureDeploymentTemplate.json +++ b/deployment/DevAzureDeploymentTemplate.json @@ -37,13 +37,6 @@ "description": "The Refresh token for your Secure Application Model." } }, - "ExchangeRefreshToken": { - "defaultValue": "LongRefreshtoken", - "type": "string", - "metadata": { - "description": "The Exchange Refresh token for your Secure Application Model." - } - }, "GithubRepository": { "defaultValue": "https://github.com/KelvinTegelaar/CIPP", "type": "string", @@ -150,18 +143,6 @@ "dependsOn": [ "[resourceId('Microsoft.KeyVault/vaults', variables('uniqueResourceNameBase'))]" ] - }, - { - "type": "secrets", - "name": "exchangerefreshtoken", - "apiVersion": "2015-06-01", - "properties": { - "contentType": "text/plain", - "value": "[parameters('exchangerefreshtoken')]" - }, - "dependsOn": [ - "[resourceId('Microsoft.KeyVault/vaults', variables('uniqueResourceNameBase'))]" - ] } ], "dependsOn": ["[resourceId('Microsoft.Web/sites', variables('funcAppName'))]"] @@ -213,10 +194,6 @@ "name": "RefreshToken", "value": "[concat('@Microsoft.KeyVault(SecretUri=https://',variables('uniqueResourceNameBase'), '.vault.azure.net/secrets/RefreshToken)')]" }, - { - "name": "ExchangeRefreshtoken", - "value": "[concat('@Microsoft.KeyVault(SecretUri=https://',variables('uniqueResourceNameBase'), '.vault.azure.net/secrets/ExchangeRefreshToken)')]" - }, { "name": "TenantID", "value": "[concat('@Microsoft.KeyVault(SecretUri=https://',variables('uniqueResourceNameBase'), '.vault.azure.net/secrets/tenantid)')]" diff --git a/deployment/DevAzureDeploymentTemplate_regionoptions.json b/deployment/DevAzureDeploymentTemplate_regionoptions.json index 7af2b9af4905..301d50d5437a 100644 --- a/deployment/DevAzureDeploymentTemplate_regionoptions.json +++ b/deployment/DevAzureDeploymentTemplate_regionoptions.json @@ -37,13 +37,6 @@ "description": "The Refresh token for your Secure Application Model." } }, - "ExchangeRefreshToken": { - "defaultValue": "LongRefreshtoken", - "type": "string", - "metadata": { - "description": "The Exchange Refresh token for your Secure Application Model." - } - }, "GithubRepository": { "defaultValue": "https://github.com/KelvinTegelaar/CIPP", "type": "string", @@ -150,18 +143,6 @@ "dependsOn": [ "[resourceId('Microsoft.KeyVault/vaults', variables('uniqueResourceNameBase'))]" ] - }, - { - "type": "secrets", - "name": "exchangerefreshtoken", - "apiVersion": "2015-06-01", - "properties": { - "contentType": "text/plain", - "value": "[parameters('exchangerefreshtoken')]" - }, - "dependsOn": [ - "[resourceId('Microsoft.KeyVault/vaults', variables('uniqueResourceNameBase'))]" - ] } ], "dependsOn": ["[resourceId('Microsoft.Web/sites', variables('funcAppName'))]"] @@ -213,10 +194,6 @@ "name": "RefreshToken", "value": "[concat('@Microsoft.KeyVault(SecretUri=https://',variables('uniqueResourceNameBase'), '.vault.azure.net/secrets/RefreshToken)')]" }, - { - "name": "ExchangeRefreshtoken", - "value": "[concat('@Microsoft.KeyVault(SecretUri=https://',variables('uniqueResourceNameBase'), '.vault.azure.net/secrets/ExchangeRefreshToken)')]" - }, { "name": "TenantID", "value": "[concat('@Microsoft.KeyVault(SecretUri=https://',variables('uniqueResourceNameBase'), '.vault.azure.net/secrets/tenantid)')]" diff --git a/package-lock.json b/package-lock.json index 51ada863cb0a..08e6a9e247c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7107,8 +7107,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.9.2", - "license": "MIT", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -8824,7 +8825,8 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/global-modules": { "version": "2.0.0", @@ -11851,10 +11853,6 @@ "node": ">=4" } }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "license": "MIT" - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "license": "MIT" @@ -17528,8 +17526,9 @@ } }, "node_modules/watchpack": { - "version": "2.3.1", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -17555,32 +17554,33 @@ } }, "node_modules/webpack": { - "version": "5.69.1", - "license": "MIT", + "version": "5.77.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.77.0.tgz", + "integrity": "sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", + "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", + "enhanced-resolve": "^5.10.0", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "bin": { @@ -22755,7 +22755,9 @@ "dev": true }, "enhanced-resolve": { - "version": "5.9.2", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -23851,7 +23853,9 @@ } }, "glob-to-regexp": { - "version": "0.4.1" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "global-modules": { "version": "2.0.0", @@ -25730,9 +25734,6 @@ "jsesc": { "version": "2.5.2" }, - "json-parse-better-errors": { - "version": "1.0.2" - }, "json-parse-even-better-errors": { "version": "2.3.1" }, @@ -29235,7 +29236,9 @@ } }, "watchpack": { - "version": "2.3.1", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -29253,31 +29256,33 @@ "dev": true }, "webpack": { - "version": "5.69.1", + "version": "5.77.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.77.0.tgz", + "integrity": "sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q==", "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", + "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", + "enhanced-resolve": "^5.10.0", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "dependencies": { diff --git a/public/version_latest.txt b/public/version_latest.txt index e4604e3afd0d..15a279981720 100644 --- a/public/version_latest.txt +++ b/public/version_latest.txt @@ -1 +1 @@ -3.2.1 +3.3.0 diff --git a/src/_nav.js b/src/_nav.js index 3177cc44935d..e5a5d4f3f548 100644 --- a/src/_nav.js +++ b/src/_nav.js @@ -606,6 +606,11 @@ const _nav = [ name: 'Phishing Policies', to: '/email/reports/phishing-policies', }, + { + component: CNavItem, + name: 'Shared Mailbox with Enabled Account', + to: '/email/reports/SharedMailboxEnabledAccount', + }, ], }, { diff --git a/src/routes.js b/src/routes.js index 61176edabc93..bac1f9bf996f 100644 --- a/src/routes.js +++ b/src/routes.js @@ -6,6 +6,7 @@ const Users = React.lazy(() => import('src/views/identity/administration/Users') const DeletedItems = React.lazy(() => import('src/views/identity/administration/Deleted')) const ViewBEC = React.lazy(() => import('src/views/identity/administration/ViewBEC')) const AddUser = React.lazy(() => import('src/views/identity/administration/AddUser')) +const InviteGuest = React.lazy(() => import('src/views/identity/administration/InviteGuest')) const EditUser = React.lazy(() => import('src/views/identity/administration/EditUser')) const ViewUser = React.lazy(() => import('src/views/identity/administration/ViewUser')) const Groups = React.lazy(() => import('src/views/identity/administration/Groups')) @@ -55,7 +56,7 @@ const DeployConditional = React.lazy(() => import('src/views/tenant/conditional/ const ListLicences = React.lazy(() => import('src/views/tenant/administration/ListLicences')) const ListAppConsent = React.lazy(() => import('src/views/tenant/administration/ListOauthApps')) -const BasicAuthReport = React.lazy(() => import('src/views/identity/reports/InactiveUsers')) +const InActiveUserReport = React.lazy(() => import('src/views/identity/reports/InactiveUsers')) const SignInReport = React.lazy(() => import('src/views/identity/reports/SignIns')) const AzureADConnectReport = React.lazy(() => @@ -172,6 +173,9 @@ const MailboxClientAccessSettingsList = React.lazy(() => const MailboxStatisticsList = React.lazy(() => import('src/views/email-exchange/reports/MailboxStatisticsList'), ) +const SharedMailboxEnabledAccount = React.lazy(() => + import('src/views/email-exchange/reports/SharedMailboxEnabledAccount'), +) const MessageTrace = React.lazy(() => import('src/views/email-exchange/reports/MessageTrace')) const PhishingPoliciesList = React.lazy(() => import('src/views/email-exchange/reports/PhishingPoliciesList'), @@ -228,6 +232,11 @@ const routes = [ { path: '/identity/administration/users/add', name: 'Add User', component: AddUser }, { path: '/identity/administration/users/edit', name: 'Edit User', component: EditUser }, { path: '/identity/administration/users/view', name: 'View User', component: ViewUser }, + { + path: '/identity/administration/users/InviteGuest', + name: 'Invite Guest', + component: InviteGuest, + }, { path: '/identity/administration/ViewBec', name: 'View BEC', component: ViewBEC }, { path: '/identity/administration', name: 'Administration' }, { path: '/identity/administration/users', name: 'Users', component: Users }, @@ -268,8 +277,8 @@ const routes = [ { path: '/identity/reports/mfa-report', name: 'MFA Report', component: MFAReport }, { path: '/identity/reports/inactive-users-report', - name: 'Basic Auth Report', - component: BasicAuthReport, + name: 'Inactive Users Report', + component: InActiveUserReport, }, { path: '/identity/reports/Signin-report', @@ -568,6 +577,11 @@ const routes = [ path: '/email/reports/mailbox-statistics', component: MailboxStatisticsList, }, + { + name: 'Shared Mailbox Enabled Account', + path: '/email/reports/SharedMailboxEnabledAccount', + component: SharedMailboxEnabledAccount, + }, { name: 'Mailbox Client Access Settings', path: '/email/reports/mailbox-cas-settings', diff --git a/src/views/cipp/CIPPSettings.js b/src/views/cipp/CIPPSettings.js index 94e2e17f3897..55de4cd0580d 100644 --- a/src/views/cipp/CIPPSettings.js +++ b/src/views/cipp/CIPPSettings.js @@ -656,7 +656,7 @@ const ExcludedTenantsSettings = () => { if (cell === 'delegatedAndGranularDelegetedAdminPrivileges') { return } - if (cell === 'GranularDelegetedAdminPrivileges') { + if (cell === 'granularDelegatedAdminPrivileges') { return } return diff --git a/src/views/cipp/Logs.js b/src/views/cipp/Logs.js index 73a956b18b05..e7733a152fff 100644 --- a/src/views/cipp/Logs.js +++ b/src/views/cipp/Logs.js @@ -20,6 +20,20 @@ import { CippDatatable, cellDateFormatter, CellTip } from 'src/components/tables import { useNavigate } from 'react-router-dom' import DatePicker from 'react-datepicker' import 'react-datepicker/dist/react-datepicker.css' +const reverseSort = (rowA, rowB) => { + const a = rowA.DateTime.toLowerCase() + const b = rowB.DateTime.toLowerCase() + + if (a > b) { + return -1 + } + + if (b > a) { + return 1 + } + + return 0 +} const columns = [ { @@ -30,6 +44,7 @@ const columns = [ exportSelector: 'DateTime', minWidth: '145px', maxWidth: '145px', + sortFunction: reverseSort, }, { name: 'Tenant', @@ -41,11 +56,11 @@ const columns = [ maxWidth: '145px', }, { - name: 'API', - selector: (row) => row['API'], + name: 'User', + selector: (row) => row['User'], sortable: true, - cell: (row) => CellTip(row['API']), - exportSelector: 'API', + cell: (row) => CellTip(row['User']), + exportSelector: 'User', minWidth: '145px', maxWidth: '145px', }, @@ -57,11 +72,11 @@ const columns = [ exportSelector: 'Message', }, { - name: 'User', - selector: (row) => row['User'], + name: 'API', + selector: (row) => row['API'], sortable: true, - cell: (row) => CellTip(row['User']), - exportSelector: 'User', + cell: (row) => CellTip(row['API']), + exportSelector: 'API', minWidth: '145px', maxWidth: '145px', }, diff --git a/src/views/cipp/Setup.js b/src/views/cipp/Setup.js index 5dd85f962c53..61f5c0f21db4 100644 --- a/src/views/cipp/Setup.js +++ b/src/views/cipp/Setup.js @@ -281,16 +281,6 @@ const Setup = () => { /> - - - - -
diff --git a/src/views/email-exchange/administration/MailboxesList.js b/src/views/email-exchange/administration/MailboxesList.js index 0fc1535160d6..9126ba955d04 100644 --- a/src/views/email-exchange/administration/MailboxesList.js +++ b/src/views/email-exchange/administration/MailboxesList.js @@ -95,6 +95,20 @@ const MailboxList = () => { modalMessage: 'Are you sure you want to convert this shared mailbox to a user mailbox?', }, + { + label: 'Copy Sent Items to Shared Mailbox', + color: 'info', + modal: true, + modalUrl: `/api/ExecCopyForSent?TenantFilter=${tenant.defaultDomainName}&ID=${row.UPN}`, + modalMessage: 'Are you sure you want to enable Copy Sent Items to Shared Mailbox?', + }, + { + label: 'Disable Copy Sent Items to Shared Mailbox', + color: 'info', + modal: true, + modalUrl: `/api/ExecCopyForSent?TenantFilter=${tenant.defaultDomainName}&ID=${row.UPN}&MessageCopyForSentAsEnabled=false`, + modalMessage: 'Are you sure you want to disable Copy Sent Items to Shared Mailbox?', + }, { label: 'Hide from Global Address List', color: 'info', diff --git a/src/views/email-exchange/reports/SharedMailboxEnabledAccount.js b/src/views/email-exchange/reports/SharedMailboxEnabledAccount.js new file mode 100644 index 000000000000..8135b38a3655 --- /dev/null +++ b/src/views/email-exchange/reports/SharedMailboxEnabledAccount.js @@ -0,0 +1,65 @@ +import React from 'react' +import { useSelector } from 'react-redux' +import { CellTip, cellBooleanFormatter } from 'src/components/tables' +import { CippPageList } from 'src/components/layout' + +const columns = [ + { + selector: (row) => row['UserPrincipalName'], + name: 'User Prinicipal Name', + sortable: true, + cell: (row) => CellTip(row['UserPrincipalName']), + exportSelector: 'UserPrincipalName', + minWidth: '200px', + }, + { + selector: (row) => row['displayName'], + name: 'Display Name', + sortable: true, + cell: (row) => CellTip(row['displayName']), + exportSelector: 'displayName', + minWidth: '200px', + }, + { + selector: (row) => row['givenName'], + name: 'First Name', + sortable: true, + cell: (row) => CellTip(row['givenName']), + exportSelector: 'givenName', + minWidth: '200px', + }, + { + selector: (row) => row['surname'], + name: 'Surname', + sortable: true, + cell: (row) => CellTip(row['surname']), + exportSelector: 'surname', + minWidth: '200px', + }, + { + selector: (row) => row['accountEnabled'], + name: 'Account Enabled', + sortable: true, + cell: (row) => CellTip(row['accountEnabled']), + exportSelector: 'accountEnabled', + }, +] + +const SharedMailboxEnabledAccount = () => { + const tenant = useSelector((state) => state.app.currentTenant) + + return ( + + ) +} + +export default SharedMailboxEnabledAccount diff --git a/src/views/home/Home.js b/src/views/home/Home.js index 974ab575da30..f0fc78f8e10a 100644 --- a/src/views/home/Home.js +++ b/src/views/home/Home.js @@ -80,14 +80,10 @@ const Home = () => { - +
Refresh Token: {!isLoadingDash ? dashboard?.RefreshTokenDate : ''}
- -
- Exchange Token: {!isLoadingDash ? dashboard?.ExchangeTokenDate : ''} -
diff --git a/src/views/identity/administration/InviteGuest.js b/src/views/identity/administration/InviteGuest.js new file mode 100644 index 000000000000..c1b46cbdf6fc --- /dev/null +++ b/src/views/identity/administration/InviteGuest.js @@ -0,0 +1,151 @@ +import React from 'react' +import { + CButton, + CCard, + CCardBody, + CCardHeader, + CCardTitle, + CCol, + CForm, + CRow, + CCallout, +} from '@coreui/react' +import { Form } from 'react-final-form' +import { RFFCFormCheck, RFFCFormInput } from 'src/components/forms' +import { CippPage } from 'src/components/layout' +import { useListAdConnectSettingsQuery } from 'src/store/api/adconnect' +import { useLazyGenericPostRequestQuery } from 'src/store/api/app' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' +import { useSelector } from 'react-redux' +import { required } from 'src/validators' +import useQuery from 'src/hooks/useQuery' +import { useNavigate } from 'react-router-dom' + +const InviteGuest = () => { + let navigate = useNavigate() + + const tenant = useSelector((state) => state.app.currentTenant) + const { defaultDomainName: tenantDomain } = tenant + let query = useQuery() + const allQueryObj = {} + for (const [key, value] of query.entries()) { + allQueryObj[key] = value + } + const { + data: adconnectsettings = [], + isFetching: adcIsFetching, + error: adcError, + } = useListAdConnectSettingsQuery({ tenantDomain }) + + const [genericPostRequest, postResults] = useLazyGenericPostRequestQuery() + const onSubmit = (values) => { + const shippedValues = { + DisplayName: values.displayName, + Domain: values.primDomain, + Mail: values.mail, + PostalCode: values.postalCode, + RedirectURL: values.RedirectURL, + SendInvite: values.SendInvite, + tenantID: tenantDomain, + } + //window.alert(JSON.stringify(shippedValues)) + genericPostRequest({ path: '/api/AddGuest', values: shippedValues }) + } + + return ( + + {postResults.isSuccess && ( + + {postResults.data?.Results.map((result, index) => ( +
  • {result}
  • + ))} +
    + )} + + + + + Guest Details + + + {adcError && Unable to determine Azure AD Connect Settings} + {!adcIsFetching && adconnectsettings.dirSyncEnabled && ( + + Warning! {adconnectsettings.dirSyncEnabled} This tenant currently has Active + Directory Sync Enabled. This usually means users should be created in Active + Directory + + )} +
    { + return ( + + + + + + + + + + + + + + + + + + + + + Invite Guest + {postResults.isFetching && ( + + )} + + + + {postResults.isSuccess && ( + + {postResults.data.Results.map((message, idx) => { + return
  • {message}
  • + })} +
    + )} +
    + ) + }} + /> + + + + + + ) +} + +export default InviteGuest diff --git a/src/views/identity/administration/UserMailboxRuleList.js b/src/views/identity/administration/UserMailboxRuleList.js new file mode 100644 index 000000000000..acb19e3e44e1 --- /dev/null +++ b/src/views/identity/administration/UserMailboxRuleList.js @@ -0,0 +1,98 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { cellBooleanFormatter, CellTip } from 'src/components/tables' +import { DatatableContentCard } from 'src/components/contentcards' +import { faEnvelope } from '@fortawesome/free-solid-svg-icons' + +const rowStyle = (row, rowIndex) => { + const style = {} + + return style +} + +export default function UserMailboxRuleList({ userId, tenantDomain, className = null }) { + const formatter = (cell) => CellBoolean({ cell }) + const columns = [ + { + selector: (row) => row['Name'], + name: 'Display Name', + sortable: true, + cell: (row) => CellTip(row['Name']), + exportSelector: 'Name', + width: '200px', + }, + { + selector: (row) => row['Description'], + name: 'Description', + sortable: true, + cell: (row) => CellTip(row['Description']), + exportSelector: 'Description', + width: '350px', + }, + { + selector: (row) => row['ForwardTo'], + name: 'Forwards To', + sortable: true, + cell: (row) => CellTip(row['ForwardTo']), + exportSelector: 'ForwardTo', + width: '250px', + }, + { + selector: (row) => row['RedirectTo'], + name: 'Redirect To', + sortable: true, + cell: (row) => CellTip(row['RedirectTo']), + exportSelector: 'RedirectTo', + maxwidth: '250px', + }, + { + selector: (row) => row['CopyToFolder'], + name: 'Copy To Folder', + sortable: true, + cell: (row) => CellTip(row['CopyToFolder']), + exportSelector: 'CopyToFolder', + maxwidth: '200px', + }, + { + selector: (row) => row['MoveToFolder'], + name: 'Move To Folder', + sortable: true, + cell: (row) => CellTip(row['MoveToFolder']), + exportSelector: 'MoveToFolder', + maxwidth: '200px', + }, + { + selector: (row) => row['DeleteMessage'], + name: 'Delete Message', + sortable: true, + cell: cellBooleanFormatter({ colourless: true }), + formatter, + exportSelector: 'DeleteMessage', + width: '200px', + }, + ] + return ( + + ) +} + +UserMailboxRuleList.propTypes = { + userId: PropTypes.string.isRequired, + tenantDomain: PropTypes.string.isRequired, + className: PropTypes.string, +} diff --git a/src/views/identity/administration/Users.js b/src/views/identity/administration/Users.js index 7df07ee6de0f..3b7a0e3a04e1 100644 --- a/src/views/identity/administration/Users.js +++ b/src/views/identity/administration/Users.js @@ -159,14 +159,14 @@ const Offcanvas = (row, rowIndex, formatExtraData) => { label: 'Reset Password (Must Change)', color: 'info', modal: true, - modalUrl: `/api/ExecResetPass?MustChange=true&TenantFilter=${tenant.defaultDomainName}&ID=${row.id}`, + modalUrl: `/api/ExecResetPass?MustChange=true&TenantFilter=${tenant.defaultDomainName}&ID=${row.id}&displayName=${row.displayName}`, modalMessage: 'Are you sure you want to reset the password for this user?', }, { label: 'Reset Password', color: 'info', modal: true, - modalUrl: `/api/ExecResetPass?MustChange=false&TenantFilter=${tenant.defaultDomainName}&ID=${row.id}`, + 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?', }, { @@ -262,15 +262,27 @@ const columns = [ const Users = (row) => { const tenant = useSelector((state) => state.app.currentTenant) - const titleButton = + const titleButtons = ( +
    + +
    + +
    +
    + ) return ( { @@ -90,6 +91,9 @@ const ViewUser = (props) => { + + + )} diff --git a/src/views/identity/reports/InactiveUsers.js b/src/views/identity/reports/InactiveUsers.js index d9d933c5d35c..4c64fc18386e 100644 --- a/src/views/identity/reports/InactiveUsers.js +++ b/src/views/identity/reports/InactiveUsers.js @@ -41,7 +41,7 @@ const Altcolumns = [ exportSelector: 'lastRefreshedDateTime', }, ] -const BasicAuthReport = () => { +const InActiveUserReport = () => { const tenant = useSelector((state) => state.app.currentTenant) return ( @@ -58,4 +58,4 @@ const BasicAuthReport = () => { ) } -export default BasicAuthReport +export default InActiveUserReport diff --git a/version_latest.txt b/version_latest.txt index 0444f3207675..0fa4ae489037 100644 --- a/version_latest.txt +++ b/version_latest.txt @@ -1 +1 @@ -3.2.1 \ No newline at end of file +3.3.0 \ No newline at end of file