Skip to content

Commit 62214b6

Browse files
Merge pull request KelvinTegelaar#243 from CyberDrain/dev
fix: dev to hotfix Synced from CyberDrain/CIPP@037779e
1 parent adf3242 commit 62214b6

59 files changed

Lines changed: 3411 additions & 415 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
{
2+
"name": "ConditionalAccessTemplatePackage",
3+
"label": "Conditional Access Template Package",
4+
"cat": "Templates",
5+
"tag": ["HighImpact"],
6+
"impact": "High Impact",
7+
"helpText": "Deploys and drift-checks EVERY Conditional Access template tagged with the selected package. Membership is resolved fresh on every run: tag a new template with the package and it joins this baseline automatically, untag it and it leaves. All templates in the package share the deployment state configured here - add a template individually instead when it needs a different state.",
8+
"executiveText": "Deploys a complete, named bundle of sign-in security policies in one step - for example a full zero-trust Conditional Access set - and keeps every policy in the bundle enforced as the bundle evolves.",
9+
"recommendedBy": ["CIPP"],
10+
"requiredCapabilities": ["AAD_PREMIUM", "AAD_PREMIUM_P2"],
11+
"secureScoreImpact": 30,
12+
"instanceIdentity": "caTemplatePackage",
13+
"multiple": true,
14+
"package": {
15+
"memberStandard": "ConditionalAccessTemplate",
16+
"memberVariable": "caTemplate",
17+
"variable": "caTemplatePackage",
18+
"templatePartition": "CATemplate"
19+
},
20+
"variables": {
21+
"caTemplatePackage": {
22+
"type": "autoComplete",
23+
"label": "Select a package of Conditional Access Templates",
24+
"api": {
25+
"url": "/api/ListCATemplates?mode=Tag",
26+
"labelField": "label",
27+
"valueField": "value",
28+
"queryKey": "ListCATemplates-tags",
29+
"showRefresh": true
30+
}
31+
},
32+
"state": {
33+
"type": "autoComplete",
34+
"label": "What state should we deploy these templates in?",
35+
"options": [
36+
{
37+
"label": "Do not change state",
38+
"value": "donotchange"
39+
},
40+
{
41+
"label": "Report only",
42+
"value": "enabledForReportingButNotEnforced"
43+
},
44+
{
45+
"label": "Enabled",
46+
"value": "enabled"
47+
},
48+
{
49+
"label": "Disabled",
50+
"value": "disabled"
51+
}
52+
],
53+
"default": "enabledForReportingButNotEnforced",
54+
"recommended": "enabled"
55+
},
56+
"disableSD": {
57+
"type": "switch",
58+
"label": "Disable Security Defaults when deploying policy",
59+
"default": false
60+
},
61+
"createGroups": {
62+
"type": "switch",
63+
"label": "Create groups if they do not exist",
64+
"default": false
65+
}
66+
}
67+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
{
2+
"name": "IntuneTemplatePackage",
3+
"label": "Intune Template Package",
4+
"cat": "Templates",
5+
"tag": ["HighImpact"],
6+
"impact": "High Impact",
7+
"helpText": "Deploys and drift-checks EVERY Intune template tagged with the selected package. Membership is resolved fresh on every run: tag a new template with the package and it joins this baseline automatically, untag it and it leaves. All templates in the package share the assignment options configured here - add a template individually instead when it needs different options.",
8+
"executiveText": "Deploys a complete, named bundle of device management configurations in one step - for example an entire Windows security baseline - and keeps every policy in the bundle enforced as the bundle evolves.",
9+
"recommendedBy": ["CIPP"],
10+
"requiredCapabilities": [
11+
"INTUNE_A",
12+
"MDM_Services",
13+
"EMS",
14+
"SCCM",
15+
"MICROSOFTINTUNEPLAN1"
16+
],
17+
"secureScoreImpact": 20,
18+
"instanceIdentity": "intuneTemplatePackage",
19+
"multiple": true,
20+
"package": {
21+
"memberStandard": "IntuneTemplate",
22+
"memberVariable": "intuneTemplate",
23+
"variable": "intuneTemplatePackage",
24+
"templatePartition": "IntuneTemplate"
25+
},
26+
"variables": {
27+
"intuneTemplatePackage": {
28+
"type": "autoComplete",
29+
"label": "Select a package of Intune Templates",
30+
"api": {
31+
"url": "/api/ListIntuneTemplates?mode=Tag",
32+
"labelField": "label",
33+
"valueField": "value",
34+
"queryKey": "ListIntuneTemplates-tags",
35+
"showRefresh": true
36+
}
37+
},
38+
"assignTo": {
39+
"type": "autoComplete",
40+
"label": "Who should these templates be assigned to?",
41+
"options": [
42+
{
43+
"label": "Do not assign",
44+
"value": "On"
45+
},
46+
{
47+
"label": "Assign to all users",
48+
"value": "allLicensedUsers"
49+
},
50+
{
51+
"label": "Assign to all devices",
52+
"value": "AllDevices"
53+
},
54+
{
55+
"label": "Assign to all users and devices",
56+
"value": "AllDevicesAndUsers"
57+
},
58+
{
59+
"label": "Assign to Custom Group",
60+
"value": "customGroup"
61+
}
62+
],
63+
"default": "On"
64+
},
65+
"customGroup": {
66+
"type": "textField",
67+
"label": "Custom group name (if assigning to a custom group; wildcards allowed)",
68+
"default": ""
69+
},
70+
"excludeGroup": {
71+
"type": "textField",
72+
"label": "Exclude groups (comma-separated, wildcards allowed)",
73+
"default": ""
74+
},
75+
"assignmentFilter": {
76+
"type": "textField",
77+
"label": "Assignment filter name (optional, wildcards allowed)",
78+
"default": ""
79+
},
80+
"assignmentFilterType": {
81+
"type": "autoComplete",
82+
"label": "Assignment filter mode",
83+
"options": [
84+
{
85+
"label": "Include - assign to devices matching the filter",
86+
"value": "include"
87+
},
88+
{
89+
"label": "Exclude - assign to devices NOT matching the filter",
90+
"value": "exclude"
91+
}
92+
],
93+
"default": "include"
94+
},
95+
"verifyAssignments": {
96+
"type": "switch",
97+
"label": "Verify policy assignments",
98+
"default": false
99+
},
100+
"levenshteinDistance": {
101+
"type": "number",
102+
"label": "Fuzzy match distance (0 = exact name match only; values above 5 can match unrelated policies)",
103+
"default": 0
104+
}
105+
}
106+
}

Config/openapi.json

Lines changed: 66 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -667,9 +667,9 @@
667667
"tags": [
668668
"Tenant > Standards"
669669
],
670-
"description": "Creates or updates a baseline. There is no baseline blob: the Baselines\ndelta rows (design doc §4.1) are the editable source of truth for every standard's\nconfiguration, and the BaselineRollouts row (§12.2) holds the baseline-level data -\nname, description, exclusions, alert destinations, and the ordered stage definitions.\nBaselines are reconstructed from those rows on read.",
670+
"description": "Creates or updates a baseline. There is no baseline blob: the Baselines\ndelta rows (design doc §4.1) are the editable source of truth for every standard's\nconfiguration, and the BaselineRollouts row (§12.2) holds the baseline-level data -\nname, description, exclusions, alert destinations, and the ordered stage definitions.\nBaselines are reconstructed from those rows on read. The actual write lives in\nNew-CIPPBaseline, shared with the community-repo import.",
671671
"requestBody": {
672-
"required": true,
672+
"required": false,
673673
"content": {
674674
"application/json": {
675675
"schema": {
@@ -722,9 +722,9 @@
722722
"type": "string"
723723
}
724724
},
725-
"required": [
726-
"templateName"
727-
]
725+
"additionalProperties": true,
726+
"x-cipp-passthrough": true,
727+
"description": "This endpoint forwards the request body onward rather than reading a fixed set of fields. The properties listed here are the ones it is known to read; others may be accepted."
728728
}
729729
}
730730
}
@@ -764,7 +764,10 @@
764764
"bearerAuth": []
765765
}
766766
],
767-
"x-cipp-role": "Tenant.Standards.ReadWrite"
767+
"x-cipp-role": "Tenant.Standards.ReadWrite",
768+
"x-cipp-reads-via": [
769+
"New-CIPPBaseline"
770+
]
768771
}
769772
},
770773
"/api/AddBPATemplate": {
@@ -15079,7 +15082,8 @@
1507915082
"bearerAuth": []
1508015083
}
1508115084
],
15082-
"x-cipp-role": "CIPP.AppSettings.ReadWrite"
15085+
"x-cipp-role": "CIPP.AppSettings.ReadWrite",
15086+
"x-cipp-any-tenant": true
1508315087
}
1508415088
},
1508515089
"/api/ExecBreachSearch": {
@@ -16301,6 +16305,7 @@
1630116305
"SetBranch",
1630216306
"SetTemplateTypes",
1630316307
"Update",
16308+
"UploadBaseline",
1630416309
"UploadScript",
1630516310
"UploadTemplate"
1630616311
]
@@ -16315,7 +16320,8 @@
1631516320
"type": "string"
1631616321
},
1631716322
"GUID": {
16318-
"type": "string"
16323+
"type": "string",
16324+
"description": "A baseline is not a templates-table row: Export-CIPPBaselineTemplate assembles the portable set - the BaselineTemplate file plus one standard template file per referenced CA/Intune template (packages expanded to their current members). Related templates are separate files, exactly the shape UploadTemplate writes, so they import through the untouched path."
1631916325
},
1632016326
"Id": {
1632116327
"type": "string"
@@ -18595,6 +18601,9 @@
1859518601
}
1859618602
}
1859718603
},
18604+
"400": {
18605+
"description": "Bad request - missing required field or invalid input"
18606+
},
1859818607
"401": {
1859918608
"description": "Unauthorized - invalid or missing bearer token"
1860018609
},
@@ -30165,6 +30174,53 @@
3016530174
"x-cipp-role": "CIPP.SuperAdmin.ReadWrite"
3016630175
}
3016730176
},
30177+
"/api/ExecSamSecretStatus": {
30178+
"post": {
30179+
"summary": "Reports whether the stored SAM application secret is usable yet.",
30180+
"operationId": "ExecSamSecretStatus",
30181+
"tags": [
30182+
"CIPP > Setup"
30183+
],
30184+
"description": "The setup wizard creates a client secret on one step and uses it on the next, but Entra\ncan take several minutes to replicate a newly created secret. Until it has, every token\nrequest fails with AADSTS7000215 even though the value CIPP holds is correct. This lets\nthe wizard wait on that instead of failing the user after they have already signed in.",
30185+
"requestBody": {
30186+
"required": false,
30187+
"content": {
30188+
"application/json": {
30189+
"schema": {
30190+
"type": "object",
30191+
"properties": {}
30192+
}
30193+
}
30194+
}
30195+
},
30196+
"responses": {
30197+
"200": {
30198+
"description": "Success",
30199+
"content": {
30200+
"application/json": {
30201+
"schema": {
30202+
"type": "object",
30203+
"description": "Not described statically: this endpoint returns the upstream response as-is, so its fields are determined by the upstream API rather than by CIPP. Call the endpoint to see the actual shape, or add a response schema in backend/Config/openapi-overrides."
30204+
}
30205+
}
30206+
}
30207+
},
30208+
"401": {
30209+
"description": "Unauthorized - invalid or missing bearer token"
30210+
},
30211+
"403": {
30212+
"description": "Forbidden - caller lacks the required RBAC role"
30213+
}
30214+
},
30215+
"security": [
30216+
{
30217+
"bearerAuth": []
30218+
}
30219+
],
30220+
"x-cipp-role": "CIPP.AppSettings.ReadWrite",
30221+
"x-cipp-any-tenant": true
30222+
}
30223+
},
3016830224
"/api/ExecScheduleForwardingVacation": {
3016930225
"post": {
3017030226
"summary": "ExecScheduleForwardingVacation",
@@ -38369,7 +38425,7 @@
3836938425
"tags": [
3837038426
"CIPP > Settings"
3837138427
],
38372-
"description": "Returns the report branding: colours, logo and cover images, footer and watermark text.\n\nThis used to ride along inside ListUserSettings, which meant every page load carried every\nuploaded cover as an inline data URL — megabytes of images fetched to render a settings\nmenu. Worse, hydrating branding also ran the legacy-image migration, so a GET issued on\nevery page load wrote the BrandingSettings row back from a snapshot it had read moments\nearlier, and any upload that landed in between was overwritten.\n\nBranding therefore has its own endpoint, fetched by the things that actually draw it, and\nthis read never writes. Migration belongs to ExecBrandingSettings -Action Get: the settings\npage opening is a deliberate, infrequent, single-user action, which is the one place where\nrewriting the row is safe.\n\nIts role matches ListUserSettings rather than the branding write role — every user who\nrenders a report needs the branding on it, and that is exactly who could read it before.",
38428+
"description": "Returns the report branding: colours, logo and cover images, footer and watermark text.\n\nBranding was previously returned by ListUserSettings, which put every uploaded cover\ninline on every page load and ran the legacy-image migration - a write - on that read\npath. This read never writes; migration belongs to ExecBrandingSettings -Action Get.\n\nThe role matches ListUserSettings rather than the branding write role, since every user\nwho renders a report needs the branding on it.",
3837338429
"parameters": [
3837438430
{
3837538431
"name": "includeGallery",
@@ -44396,7 +44452,7 @@
4439644452
"tags": [
4439744453
"Tools > GitHub"
4439844454
],
44399-
"description": "Returns release metadata for the provided repository and semantic version. Hotfix\nversions (e.g. v8.5.2) map back to the base release tag (v8.5.0).",
44455+
"description": "Returns release metadata for the provided repository. Results are cached and refreshed\nwhen the cache has no entry for the running version - hotfix releases (e.g. v8.5.2)\npublish their own notes, so a v8.5.0 entry no longer counts as current.",
4440044456
"responses": {
4440144457
"200": {
4440244458
"description": "Success",
0 Bytes
Binary file not shown.
8.5 KB
Binary file not shown.

0 commit comments

Comments
 (0)