diff --git a/README.md b/README.md index c9d878457c36..29ef370db018 100644 --- a/README.md +++ b/README.md @@ -1 +1,13 @@ -#Replace with CIPPREadMe \ No newline at end of file +![CyberDrain Light](github_assets/img/CIPP.png#gh-dark-mode-only) +![CyberDrain Dark](github_assets/img/CIPP-Light.png#gh-light-mode-only) + +# What is this? + +The CyberDrain Improved Partner Portal is a portal to help manage administration for Microsoft Partners. The current Microsoft partner landscape makes it fairly hard to manage multi tenant situations, with loads of manual work. Microsoft Lighthouse might resolve this in the future but development of this is lagging far behind development of the current market for Microsoft Partners. +This project is a way to help you with administration, with user management, and deploying your own preferred standards. It's not a replacement for security tools, or a way to cut costs on specific subscriptions. The tool should assist you in removing the gripes with standard partner management and save you several hours per engineer per month. +For more information, we recommend checking out our website [here](https://cipp.app) +For detailed documentation about features of CIPP, please check out our [documentation.](https://docs.cipp.app) + +# Our sponsors + +You can find our sponsors [here.](https://docs.cipp.app/#our-sponsors) diff --git a/deployment/DevAzureDeploymentTemplate_regionoptions.json b/deployment/DevAzureDeploymentTemplate_regionoptions.json index 6b84d7bfea84..f17135c01057 100644 --- a/deployment/DevAzureDeploymentTemplate_regionoptions.json +++ b/deployment/DevAzureDeploymentTemplate_regionoptions.json @@ -294,6 +294,8 @@ "buildProperties": { "appLocation": "/", "apiLocation": "", + + "appArtifactLocation": "" "outputLocation": "/out" } }, diff --git a/github_assets/img/CIPP-Light.png b/github_assets/img/CIPP-Light.png new file mode 100644 index 000000000000..6d9ad4e7fad4 Binary files /dev/null and b/github_assets/img/CIPP-Light.png differ diff --git a/github_assets/img/CIPP.png b/github_assets/img/CIPP.png new file mode 100644 index 000000000000..c3cec15dd468 Binary files /dev/null and b/github_assets/img/CIPP.png differ diff --git a/github_assets/img/CyberDrain.png b/github_assets/img/CyberDrain.png new file mode 100644 index 000000000000..e27dbdacd2f2 Binary files /dev/null and b/github_assets/img/CyberDrain.png differ diff --git a/github_assets/img/Genuine-logo-vertical-light.png b/github_assets/img/Genuine-logo-vertical-light.png new file mode 100644 index 000000000000..9742b901b31a Binary files /dev/null and b/github_assets/img/Genuine-logo-vertical-light.png differ diff --git a/github_assets/img/Genuine-logo-vertical-light_dark.png b/github_assets/img/Genuine-logo-vertical-light_dark.png new file mode 100644 index 000000000000..9742b901b31a Binary files /dev/null and b/github_assets/img/Genuine-logo-vertical-light_dark.png differ diff --git a/github_assets/img/Huntress.png b/github_assets/img/Huntress.png new file mode 100644 index 000000000000..8fe7421ba341 Binary files /dev/null and b/github_assets/img/Huntress.png differ diff --git a/github_assets/img/Immybot.png b/github_assets/img/Immybot.png new file mode 100644 index 000000000000..66a115fda14d Binary files /dev/null and b/github_assets/img/Immybot.png differ diff --git a/github_assets/img/Logo.png b/github_assets/img/Logo.png new file mode 100644 index 000000000000..8caed1332233 Binary files /dev/null and b/github_assets/img/Logo.png differ diff --git a/github_assets/img/NinjaOne-Dark.png b/github_assets/img/NinjaOne-Dark.png new file mode 100644 index 000000000000..3a4f69f76ce3 Binary files /dev/null and b/github_assets/img/NinjaOne-Dark.png differ diff --git a/github_assets/img/NinjaOne-Light.png b/github_assets/img/NinjaOne-Light.png new file mode 100644 index 000000000000..289fe66e3f61 Binary files /dev/null and b/github_assets/img/NinjaOne-Light.png differ diff --git a/github_assets/img/favicon.png b/github_assets/img/favicon.png new file mode 100644 index 000000000000..8caed1332233 Binary files /dev/null and b/github_assets/img/favicon.png differ diff --git a/github_assets/img/halopsa-red-grey.svg b/github_assets/img/halopsa-red-grey.svg new file mode 100644 index 000000000000..9d45a2b5d619 --- /dev/null +++ b/github_assets/img/halopsa-red-grey.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/github_assets/img/oitpsonsor_light.png b/github_assets/img/oitpsonsor_light.png new file mode 100644 index 000000000000..c023f4c94f98 Binary files /dev/null and b/github_assets/img/oitpsonsor_light.png differ diff --git a/github_assets/img/oitpsonsor_light.webp b/github_assets/img/oitpsonsor_light.webp new file mode 100644 index 000000000000..8c36621827e3 Binary files /dev/null and b/github_assets/img/oitpsonsor_light.webp differ diff --git a/github_assets/img/profilepic.png b/github_assets/img/profilepic.png new file mode 100644 index 000000000000..31dc9315eac7 Binary files /dev/null and b/github_assets/img/profilepic.png differ diff --git a/github_assets/screenshots/AssignLicense.gif b/github_assets/screenshots/AssignLicense.gif new file mode 100644 index 000000000000..100ab1be673c Binary files /dev/null and b/github_assets/screenshots/AssignLicense.gif differ diff --git a/github_assets/screenshots/IntunePolicyEngine.gif b/github_assets/screenshots/IntunePolicyEngine.gif new file mode 100644 index 000000000000..f135793b975f Binary files /dev/null and b/github_assets/screenshots/IntunePolicyEngine.gif differ diff --git a/github_assets/screenshots/MyChocoApp.gif b/github_assets/screenshots/MyChocoApp.gif new file mode 100644 index 000000000000..e41581103e55 Binary files /dev/null and b/github_assets/screenshots/MyChocoApp.gif differ diff --git a/github_assets/screenshots/OffboardUser.gif b/github_assets/screenshots/OffboardUser.gif new file mode 100644 index 000000000000..18ea7c37cbae Binary files /dev/null and b/github_assets/screenshots/OffboardUser.gif differ diff --git a/github_assets/screenshots/SetStandard.gif b/github_assets/screenshots/SetStandard.gif new file mode 100644 index 000000000000..64bc063bd14c Binary files /dev/null and b/github_assets/screenshots/SetStandard.gif differ diff --git a/github_assets/screenshots/Teams.gif b/github_assets/screenshots/Teams.gif new file mode 100644 index 000000000000..20465a3114a8 Binary files /dev/null and b/github_assets/screenshots/Teams.gif differ diff --git a/public/version.json b/public/version.json index f307083d87f9..e7af43a4ee4c 100644 --- a/public/version.json +++ b/public/version.json @@ -1,3 +1,3 @@ { - "version": "7.0.1" + "version": "7.0.2" } diff --git a/src/components/CippCards/CippInfoBar.jsx b/src/components/CippCards/CippInfoBar.jsx index e8861b8cfd65..c7ce557fdfbe 100644 --- a/src/components/CippCards/CippInfoBar.jsx +++ b/src/components/CippCards/CippInfoBar.jsx @@ -1,4 +1,4 @@ -import { Card, Stack, SvgIcon, Typography, Skeleton } from "@mui/material"; +import { Box, Card, Stack, SvgIcon, Typography, Skeleton } from "@mui/material"; import Grid from "@mui/material/Grid"; export const CippInfoBar = ({ data, isFetching }) => ( @@ -31,17 +31,25 @@ export const CippInfoBar = ({ data, isFetching }) => ( }} > - - {item.icon} - -
+ {item?.icon && ( + + {item.icon} + + )} + { + if (!item?.icon) { + return { pl: 2 }; + } + }} + > {item.name} {isFetching ? : item.data} -
+
))} diff --git a/src/components/CippCards/CippPropertyListCard.jsx b/src/components/CippCards/CippPropertyListCard.jsx index 4b175cea9d8a..62b4578358d6 100644 --- a/src/components/CippCards/CippPropertyListCard.jsx +++ b/src/components/CippCards/CippPropertyListCard.jsx @@ -39,6 +39,12 @@ export const CippPropertyListCard = (props) => { const firstHalf = propertyItems.slice(0, half); const secondHalf = propertyItems.slice(half, propertyItems.length); + const isLabelPresent = (item) => { + return item?.label === "" || item?.label === undefined || item?.label === null; + }; + + const setPadding = isLabelPresent ? { py: 0.5, px: 3 } : { py: 1.5, px: 3 }; + return ( <> @@ -56,6 +62,7 @@ export const CippPropertyListCard = (props) => { align={align} label={item.label} value={} + sx={setPadding} /> ))} @@ -66,6 +73,7 @@ export const CippPropertyListCard = (props) => { divider={showDivider} copyItems={copyItems} key={`${index}-index-PropertyListOffCanvas`} + sx={setPadding} {...item} /> )) diff --git a/src/components/CippComponents/CippPropertyList.jsx b/src/components/CippComponents/CippPropertyList.jsx index ee3bfa641034..4c9fd3800820 100644 --- a/src/components/CippComponents/CippPropertyList.jsx +++ b/src/components/CippComponents/CippPropertyList.jsx @@ -16,6 +16,11 @@ export const CippPropertyList = (props) => { const firstHalf = propertyItems.slice(0, half); const secondHalf = propertyItems.slice(half, propertyItems.length); + const isLabelPresent = (item) => { + return item?.label === "" || item?.label === undefined || item?.label === null; + }; + + const setPadding = isLabelPresent ? { py: 0.5, px: 3 } : { py: 1.5, px: 3 }; return ( <> {layout === "single" ? ( @@ -28,6 +33,7 @@ export const CippPropertyList = (props) => { align={align} label={item.label} value={} + sx={setPadding} {...item} /> ))} @@ -39,6 +45,7 @@ export const CippPropertyList = (props) => { divider={showDivider} copyItems={copyItems} key={`${index}-index-PropertyListOffCanvas`} + sx={setPadding} {...item} /> )) @@ -69,6 +76,7 @@ export const CippPropertyList = (props) => { align={align} label={item.label} value={} + sx={setPadding} /> ))} @@ -79,6 +87,7 @@ export const CippPropertyList = (props) => { divider={showDivider} copyItems={copyItems} key={`${index}-index-PropertyListOffCanvas`} + sx={setPadding} {...item} /> )) @@ -93,6 +102,11 @@ export const CippPropertyList = (props) => { align={align} label={item.label} value={} + sx={() => { + if (item?.label === "" || item?.label === undefined || item?.label === null) { + return { py: 0 }; + } + }} /> ))} @@ -103,6 +117,7 @@ export const CippPropertyList = (props) => { divider={showDivider} copyItems={copyItems} key={`${index}-index-PropertyListOffCanvas`} + sx={setPadding} {...item} /> )) diff --git a/src/components/CippComponents/CippTenantSelector.jsx b/src/components/CippComponents/CippTenantSelector.jsx index 5042aefabce7..b7299ceee8df 100644 --- a/src/components/CippComponents/CippTenantSelector.jsx +++ b/src/components/CippComponents/CippTenantSelector.jsx @@ -77,6 +77,11 @@ export const CippTenantSelector = (props) => { ? { value: tenant, label: `${matchingTenant.displayName} (${tenant})`, + addedFields: { + defaultDomainName: matchingTenant.defaultDomainName, + displayName: matchingTenant.displayName, + customerId: matchingTenant.customerId, + }, } : { value: null, @@ -183,7 +188,7 @@ export const CippTenantSelector = (props) => { actions={[ { label: "M365 Admin Portal", - link: `https://admin.microsoft.com/Partner/BeginClientSession.aspx?CTID=${currentTenant?.value}&CSDEST=o365admincenter`, + link: `https://admin.microsoft.com/Partner/BeginClientSession.aspx?CTID=${currentTenant?.addedFields?.customerId}&CSDEST=o365admincenter`, icon: , }, { @@ -213,17 +218,17 @@ export const CippTenantSelector = (props) => { }, { label: "Sharepoint Portal", - link: `https://admin.microsoft.com/Partner/beginclientsession.aspx?CTID=${currentTenant?.value}&CSDEST=SharePoint`, + link: `https://admin.microsoft.com/Partner/beginclientsession.aspx?CTID=${currentTenant?.addedFields?.customerId}&CSDEST=SharePoint`, icon: , }, { label: "Security Portal", - link: `https://security.microsoft.com/?tid=${currentTenant?.value}`, + link: `https://security.microsoft.com/?tid=${currentTenant?.addedFields?.customerId}`, icon: , }, { label: "Compliance Portal", - link: `https://compliance.microsoft.com/?tid=${currentTenant?.value}`, + link: `https://compliance.microsoft.com/?tid=${currentTenant?.addedFields?.customerId}`, icon: , }, ]} diff --git a/src/components/CippSettings/CippCustomRoles.jsx b/src/components/CippSettings/CippCustomRoles.jsx index 311fee517c16..2f8ddd517dcc 100644 --- a/src/components/CippSettings/CippCustomRoles.jsx +++ b/src/components/CippSettings/CippCustomRoles.jsx @@ -142,7 +142,7 @@ export const CippCustomRoles = () => { alltenant = true; } }); - if (alltenant && (blockedTenants?.length === 0 || !blockedTenants)) { + if (alltenant) { setAllTenantSelected(true); } else { setAllTenantSelected(false); @@ -299,7 +299,7 @@ export const CippCustomRoles = () => { name="allowedTenants" fullWidth={true} /> - {allTenantSelected && ( + {allTenantSelected && blockedTenants?.length == 0 && ( All tenants selected, no tenant restrictions will be applied unless blocked tenants are specified. diff --git a/src/components/property-list-item.js b/src/components/property-list-item.js index 70318631bf36..aa61fa0b5d23 100644 --- a/src/components/property-list-item.js +++ b/src/components/property-list-item.js @@ -21,19 +21,15 @@ export const PropertyListItem = (props) => { value = "", type, copyItems, + sx = { + px: 3, + py: 1.5, + }, ...other } = props; const [showPassword, setShowPassword] = useState(false); return ( - + { "LastOccurrence", "Status", "PreferredProcessor", + "ErrorMsg", ]; const offCanvas = { @@ -72,7 +73,15 @@ const Page = () => { isFetching={fetchData.isPending} cardButton={} offCanvas={offCanvas} - actions={[]} + actions={[ + { + label: "Run Now", + type: "POST", + url: apiUrl, + data: { FunctionName: "Command", Parameters: "Parameters" }, + confirmText: "Do you want to run this task now?", + }, + ]} /> { Backups are stored in the storage account associated with your CIPP instance. You can download or restore specific points in time from the list below. Enable automatic - updates to have CIPP create daily backups. + backups to have CIPP create daily backups using the scheduler. {backupList.isSuccess ? ( diff --git a/src/pages/index.js b/src/pages/index.js index 141c71f7831f..fe05b42d532d 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -96,10 +96,15 @@ const Page = () => { // Identify which templates apply: const applicableTemplates = standardsData.filter((template) => { - const tenantInFilter = template?.tenantFilter?.some((tf) => tf.value === currentTenant); + const tenantInFilter = + template?.tenantFilter?.length > 0 && + template.tenantFilter.some((tf) => tf.value === currentTenant); const allTenantsTemplate = - template.tenantFilter?.some((tf) => tf.value === "AllTenants") && - !template.excludedTenants?.some((et) => et.value === currentTenant); + template?.tenantFilter?.length > 0 && + template.tenantFilter.some((tf) => tf.value === "AllTenants") && + (!template?.excludedTenants || + (Array.isArray(template?.excludedTenants) && template?.excludedTenants?.length === 0) || + !template?.excludedTenants?.some((et) => et.value === currentTenant)); return tenantInFilter || allTenantsTemplate; }); @@ -117,7 +122,11 @@ const Page = () => { let reportCount = 0; for (const [, standard] of Object.entries(combinedStandards)) { - const actions = standard.action || []; + let actions = standard.action || []; + if (!Array.isArray(actions)) { + actions = [actions]; + } + actions?.forEach((actionObj) => { if (actionObj?.value === "Remediate") { remediateCount++; @@ -238,10 +247,10 @@ const Page = () => { propertyItems={organization.data?.verifiedDomains ?.slice(0, domainVisible ? undefined : 3) .map((domain, idx) => ({ - label: `Domain`, + label: "", value: domain.name, }))} - actions={ + actionItems={ organization.data?.verifiedDomains?.length > 3 && (