Skip to content

Commit 3a763c8

Browse files
Merge pull request #2646 from KelvinTegelaar/dev
Dev to release
2 parents 6224b50 + 4da1071 commit 3a763c8

31 files changed

+2218
-266
lines changed

.github/workflows/dev_deploy.yml

+1-5
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,10 @@ on:
44
push:
55
branches:
66
- dev
7-
pull_request:
8-
types: [opened, synchronize, reopened, closed]
9-
branches:
10-
- dev
117

128
jobs:
139
build_and_deploy_job:
14-
if: github.event.repository.fork == false && github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed')
10+
if: github.event.repository.fork == false && github.event_name == 'push'
1511
runs-on: ubuntu-latest
1612
name: Build and Deploy Job
1713
steps:

.vscode/extensions.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"eg2.vscode-npm-script",
66
"christian-kohler.npm-intellisense",
77
"esbenp.prettier-vscode",
8-
"stylelint.vscode-stylelint"
8+
"stylelint.vscode-stylelint",
9+
"editorconfig.editorconfig"
910
]
1011
}

README.md

+6-15
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,13 @@
11
![CyberDrain Light](github_assets/img/CIPP.png#gh-dark-mode-only)
22
![CyberDrain Dark](github_assets/img/CIPP-Light.png#gh-light-mode-only)
33

4-
<center><h1>Sponsored by</h1></center>
5-
<p align="center">
6-
7-
![OIT](github_assets/img/oitpsonsor_light.png)&nbsp;&nbsp;&nbsp;&nbsp;
8-
![Immybot](github_assets/img/Immybot.png)&nbsp;&nbsp;&nbsp;&nbsp;
9-
![NinjaOne](github_assets/img/NinjaOne-Light.png#gh-dark-mode-only)
10-
![NinjaOne](github_assets/img/NinjaOne-Dark.png#gh-light-mode-only)&nbsp;&nbsp;&nbsp;&nbsp;
11-
![Huntress](github_assets/img/Huntress.png)
12-
![HaloPSA](github_assets/img/halopsa-red-grey.svg)
13-
14-
</p>
15-
164
# What is this?
175

18-
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.
6+
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.
7+
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.
8+
For more information, we recommend checking out our website [here](https://cipp.app)
9+
For detailed documentation about features of CIPP, please check out our [documentation.](https://docs.cipp.app)
1910

20-
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.
11+
# Our sponsors
2112

22-
for more information, we recommend checking out our website [here](https://cipp.app)
13+
You can find our sponsors [here.](https://docs.cipp.app/#our-sponsors)

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "cipp",
3-
"version": "5.9.3",
3+
"version": "6.0.0",
44
"description": "The CyberDrain Improved Partner Portal is a portal to help manage administration for Microsoft Partners.",
55
"homepage": "https://cipp.app/",
66
"bugs": {

public/version_latest.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5.9.3
1+
6.0.0

src/_nav.jsx

+30
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
faUserShield,
2020
faEnvelope,
2121
faToolbox,
22+
faDownload,
2223
} from '@fortawesome/free-solid-svg-icons'
2324

2425
const _nav = [
@@ -162,6 +163,11 @@ const _nav = [
162163
name: 'App Consent Requests',
163164
to: '/tenant/administration/app-consent-requests',
164165
},
166+
{
167+
component: CNavItem,
168+
name: 'Authentication Methods',
169+
to: '/tenant/administration/authentication-methods',
170+
},
165171
{
166172
component: CNavItem,
167173
name: 'Tenant Onboarding',
@@ -179,6 +185,25 @@ const _nav = [
179185
},
180186
],
181187
},
188+
{
189+
component: CNavGroup,
190+
name: 'Configuration Backup',
191+
section: 'Tenant Administration',
192+
to: '/cipp/gdap',
193+
icon: <FontAwesomeIcon icon={faDownload} className="nav-icon" />,
194+
items: [
195+
{
196+
component: CNavItem,
197+
name: 'Backup Wizard',
198+
to: '/tenant/backup/backup-wizard',
199+
},
200+
{
201+
component: CNavItem,
202+
name: 'Restore Wizard',
203+
to: '/tenant/backup/restore-wizard',
204+
},
205+
],
206+
},
182207
{
183208
component: CNavGroup,
184209
name: 'Tools',
@@ -608,6 +633,11 @@ const _nav = [
608633
name: 'Mailboxes',
609634
to: '/email/administration/mailboxes',
610635
},
636+
{
637+
component: CNavItem,
638+
name: 'Deleted Mailboxes',
639+
to: '/email/administration/deleted-mailboxes',
640+
},
611641
{
612642
component: CNavItem,
613643
name: 'Mailbox Rules',

src/components/contentcards/CippButtonCard.jsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ export default function CippButtonCard({
99
CardButton,
1010
children,
1111
isFetching,
12+
className = 'h-100',
1213
}) {
1314
return (
14-
<CCard className="h-100 mb-3">
15+
<CCard className={`${className} mb-3`}>
1516
<CCardHeader>
1617
<CCardTitle>
1718
{titleType === 'big' ? <h3 className="underline mb-3">{title}</h3> : title}
@@ -32,4 +33,5 @@ CippButtonCard.propTypes = {
3233
CardButton: PropTypes.element.isRequired,
3334
children: PropTypes.element.isRequired,
3435
isFetching: PropTypes.bool.isRequired,
36+
className: PropTypes.string,
3537
}

src/components/tables/CellBytes.jsx

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import PropTypes from 'prop-types'
2+
3+
export function CellBytes({ cell }) {
4+
return (cell / 1024 ** 3).toFixed(2)
5+
}
6+
7+
CellBytes.propTypes = {
8+
propName: PropTypes.string,
9+
cell: PropTypes.object,
10+
}
11+
12+
export function CellBytesToPercentage({ row, value, dividedBy }) {
13+
return Math.round((row[value] / row[dividedBy]) * 100 * 10) / 10
14+
}
15+
16+
CellBytesToPercentage.propTypes = {
17+
propName: PropTypes.string,
18+
cell: PropTypes.object,
19+
}
20+
21+
export const cellBytesFormatter = () => (row, index, column, id) => {
22+
const cell = column.selector(row)
23+
return CellBytes({ cell })
24+
}
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import PropTypes from 'prop-types'
2+
import CippCopyToClipboard from '../utilities/CippCopyToClipboard'
3+
4+
export function CellCopyButton({ cell }) {
5+
return <CippCopyToClipboard text={cell} />
6+
}
7+
8+
CellCopyButton.propTypes = {
9+
propName: PropTypes.string,
10+
cell: PropTypes.object,
11+
}
12+
13+
export const cellCopyButtonFormatter = () => (row, index, column, id) => {
14+
const cell = column.selector(row)
15+
return CellCopyButton({ cell })
16+
}

src/components/tables/CippTable.jsx

+7-5
Original file line numberDiff line numberDiff line change
@@ -629,12 +629,14 @@ export default function CippTable({
629629
if (!disablePDFExport || !disableCSVExport) {
630630
const keys = []
631631
const exportFormatter = {}
632+
const exportFormatterArgs = {}
632633
columns.map((col) => {
633634
if (col.exportSelector) keys.push(col.exportSelector)
634635
if (col.exportFormatter) exportFormatter[col.exportSelector] = col.exportFormatter
636+
if (col.exportFormatterArgs)
637+
exportFormatterArgs[col.exportSelector] = col.exportFormatterArgs
635638
return null
636639
})
637-
638640
// Define the flatten function
639641
const flatten = (obj, prefix = '') => {
640642
if (obj === null) return {}
@@ -664,18 +666,18 @@ export default function CippTable({
664666
// Define the applyFormatter function
665667
const applyFormatter = (obj) => {
666668
return Object.keys(obj).reduce((acc, key) => {
669+
const formatterArgs = exportFormatterArgs[key]
667670
const formatter = exportFormatter[key]
668-
// Since the keys after flattening will be dot-separated, we need to adjust this to support nested keys if necessary.
669671
const keyParts = key.split('.')
670672
const finalKeyPart = keyParts[keyParts.length - 1]
671673
const formattedValue =
672-
typeof formatter === 'function' ? formatter({ cell: obj[key] }) : obj[key]
674+
typeof formatter === 'function'
675+
? formatter({ row: obj, cell: obj[key], ...formatterArgs })
676+
: obj[key]
673677
acc[key] = formattedValue
674678
return acc
675679
}, {})
676680
}
677-
678-
// Process exportData function
679681
const processExportData = (exportData, selectedColumns) => {
680682
//filter out the columns that are not selected via selectedColumns
681683
exportData = exportData.map((item) => {

src/data/AuditLogSchema.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,12 @@
7070
},
7171
"List:Operation": [
7272
{ "value": "UserLoggedIn", "name": "A user logged in" },
73-
{ "value": "accessed mailbox items", "name": "accessed mailbox items" },
73+
{ "value": "mailitemsaccessed", "name": "accessed mailbox items" },
7474
{ "value": "add delegation entry.", "name": "added delegation entry" },
7575
{ "value": "add domain to company.", "name": "added domain to company" },
7676
{ "value": "add group.", "name": "added group" },
7777
{ "value": "add member to group.", "name": "added member to group" },
78-
{ "value": "add mailboxpermission", "name": "added delegate mailbox permissions" },
78+
{ "value": "add-mailboxpermission", "name": "added delegate mailbox permissions" },
7979
{ "value": "add member to role.", "name": "added member to role" },
8080
{ "value": "add partner to company.", "name": "added a partner to the directory" },
8181
{ "value": "add service principal.", "name": "added service principal" },
@@ -111,7 +111,7 @@
111111
"value": "remove service principal credentials.",
112112
"name": "removed credentials from a service principal"
113113
},
114-
{ "value": "remove mailboxpermission", "name": "removed delegate mailbox permissions" },
114+
{ "value": "remove-mailboxpermission", "name": "removed delegate mailbox permissions" },
115115
{ "value": "remove member from role.", "name": "removed a user from a directory role" },
116116
{ "value": "remove partner from company.", "name": "removed a partner from the directory" },
117117
{ "value": "removefolderpermissions", "name": "removed permissions from folder" },
@@ -132,7 +132,7 @@
132132
"value": "set force change user password.",
133133
"name": "set property that forces user to change password"
134134
},
135-
{ "value": "set inboxrule", "name": "modified inbox rule from outlook web app" },
135+
{ "value": "set-inboxrule", "name": "modified inbox rule from outlook web app" },
136136
{ "value": "set license properties.", "name": "set license properties" },
137137
{ "value": "set password policy.", "name": "set password policy" },
138138
{ "value": "softdelete", "name": "deleted messages from deleted items folder" },

src/data/Extensions.json

+56-11
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
[
22
{
3-
"name": "CIPP-API Integration",
3+
"name": "CIPP-API",
44
"type": "CIPP-API",
55
"cat": "API",
66
"forceSyncButton": false,
7+
"disableWhenhosted": true,
78
"helpText": "This integration allows you to enable CIPP-API access outside of CIPP. Requires Global Administrator permissions inside your tenant for activation of the API. The API credentials will only be shown once.",
89
"SettingOptions": [
910
{
@@ -20,7 +21,7 @@
2021
"mappingRequired": false
2122
},
2223
{
23-
"name": "Gradient Integration",
24+
"name": "Gradient",
2425
"type": "Gradient",
2526
"cat": "Billing & Invoicing",
2627
"forceSyncButton": true,
@@ -54,7 +55,7 @@
5455
"mappingRequired": false
5556
},
5657
{
57-
"name": "Halo PSA Ticketing Integration",
58+
"name": "Halo PSA Ticketing",
5859
"type": "HaloPSA",
5960
"cat": "Ticketing",
6061
"forceSyncButton": false,
@@ -111,7 +112,7 @@
111112
"mappingRequired": true
112113
},
113114
{
114-
"name": "NinjaOne Integration",
115+
"name": "NinjaOne",
115116
"type": "NinjaOne",
116117
"cat": "Documentation & Monitoring",
117118
"forceSyncButton": true,
@@ -121,7 +122,7 @@
121122
"type": "input",
122123
"fieldtype": "input",
123124
"name": "NinjaOne.Instance",
124-
"label": "Please enter your NinjaOne Instance",
125+
"label": "Please enter your NinjaOne Instance hostname",
125126
"placeholder": "app.ninjarmm.com, eu.ninjarmm.com, oc.ninjarmm.com, ca.ninjarmm.com, us2.ninjarmm.com"
126127
},
127128
{
@@ -140,26 +141,70 @@
140141
},
141142
{
142143
"type": "checkbox",
143-
"name": "NinjaOne.UserDocumentsEnabled",
144-
"label": "Synchronize Detailed User Information (Requires NinjaOne Documentation)"
144+
"name": "NinjaOne.LicenseDocumentsEnabled",
145+
"label": "Sync Licenses (Requires NinjaOne Documentation)"
145146
},
146147
{
147148
"type": "checkbox",
148-
"name": "NinjaOne.LicenseDocumentsEnabled",
149-
"label": "Synchronize Detailed License Information (Requires NinjaOne Documentation)"
149+
"name": "NinjaOne.UserDocumentsEnabled",
150+
"label": "Sync Users (Requires NinjaOne Documentation)"
150151
},
151152
{
152153
"type": "checkbox",
153154
"name": "NinjaOne.LicensedOnly",
154-
"label": "Only Synchronize Licensed Users"
155+
"label": "Only Sync Licensed Users (Requires NinjaOne Documentation)"
155156
},
156157
{
157158
"type": "checkbox",
158159
"name": "NinjaOne.Enabled",
159160
"label": "Enable Integration"
160161
}
161162
],
162-
"mappingRequired": true
163+
"mappingRequired": true,
164+
"fieldMapping": true,
165+
"autoMapSyncApi": true,
166+
"showSyncButton": true
167+
},
168+
{
169+
"name": "Hudu",
170+
"type": "Hudu",
171+
"cat": "Documentation",
172+
"forceSyncButton": true,
173+
"helpText": "This integration allows you to populate custom asset layouts with Tenant information, monitor device compliance state, document other items and generate relationships inside Hudu.",
174+
"SettingOptions": [
175+
{
176+
"type": "input",
177+
"fieldtype": "input",
178+
"name": "Hudu.BaseUrl",
179+
"label": "Please enter your Hudu URL",
180+
"placeholder": "https://yourcompany.huducloud.com"
181+
},
182+
{
183+
"type": "input",
184+
"fieldtype": "password",
185+
"name": "Hudu.APIKey",
186+
"label": "Hudu API Key",
187+
"placeholder": "Enter your Hudu API Key"
188+
},
189+
{
190+
"type": "checkbox",
191+
"name": "Hudu.CreateMissingUsers",
192+
"label": "Create missing users in Hudu"
193+
},
194+
{
195+
"type": "checkbox",
196+
"name": "Hudu.CreateMissingDevices",
197+
"label": "Create missing devices in Hudu"
198+
},
199+
{
200+
"type": "checkbox",
201+
"name": "Hudu.Enabled",
202+
"label": "Enable Integration"
203+
}
204+
],
205+
"mappingRequired": true,
206+
"fieldMapping": true,
207+
"showSyncButton": true
163208
},
164209
{
165210
"name": "PasswordPusher",

src/data/alerts.json

+6-1
Original file line numberDiff line numberDiff line change
@@ -89,5 +89,10 @@
8989
"name": "DepTokenExpiry",
9090
"label": "Alert on expiring DEP tokens",
9191
"recommendedRunInterval": "1d"
92+
},
93+
{
94+
"name": "SoftDeletedMailboxes",
95+
"label": "Alert on soft deleted mailboxes",
96+
"recommendedRunInterval": "1d"
9297
}
93-
]
98+
]

0 commit comments

Comments
 (0)