Skip to content

Commit 6f594fd

Browse files
authored
Merge pull request #552 from KelvinTegelaar/dev
[pull] dev from KelvinTegelaar:dev
2 parents ea86e1f + 6af8b42 commit 6f594fd

File tree

13 files changed

+695
-10
lines changed

13 files changed

+695
-10
lines changed

Modules/CIPPCore/Public/Entrypoints/Activity Triggers/Standards/Push-CIPPStandard.ps1

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,19 @@ function Push-CIPPStandard {
2727
Write-Information "Rerun is set to false. We'll be running $FunctionName"
2828
}
2929

30-
$script:StandardInfo = @{
30+
$StandardInfo = @{
3131
Standard = $Standard
3232
StandardTemplateId = $Item.templateId
3333
}
3434
if ($Standard -eq 'IntuneTemplate') {
35-
$script:StandardInfo.IntuneTemplateId = $Item.Settings.TemplateList.value
35+
$StandardInfo.IntuneTemplateId = $Item.Settings.TemplateList.value
3636
}
3737
if ($Standard -eq 'ConditionalAccessTemplate') {
38-
$script:StandardInfo.ConditionalAccessTemplateId = $Item.Settings.TemplateList.value
38+
$StandardInfo.ConditionalAccessTemplateId = $Item.Settings.TemplateList.value
3939
}
4040

41+
$Script:StandardInfo = $StandardInfo
42+
4143
try {
4244
# Convert settings to JSON, replace %variables%, then convert back to object
4345
$SettingsJSON = $Item.Settings | ConvertTo-Json -Depth 10 -Compress
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
function Invoke-ExecCloneTemplate {
2+
<#
3+
.FUNCTIONALITY
4+
Entrypoint,AnyTenant
5+
.ROLE
6+
CIPP.Core.ReadWrite
7+
#>
8+
param(
9+
$Request,
10+
$TriggerMetadata
11+
)
12+
13+
$GUID = $Request.Query.GUID ?? $Request.Body.GUID
14+
$Type = $Request.Query.Type ?? $Request.Body.Type
15+
16+
if ($GUID -and $Type) {
17+
$Table = Get-CIPPTable -tablename templates
18+
$Template = Get-CIPPAzDataTableEntity @Table -Filter "PartitionKey eq '$Type' and RowKey eq '$GUID'"
19+
20+
if ($Template) {
21+
$NewGuid = [guid]::NewGuid().ToString()
22+
$Template.RowKey = $NewGuid
23+
$Template.JSON = $Template.JSON -replace $GUID, $NewGuid
24+
$Template.Package = $null
25+
$Template.SHA = $null
26+
try {
27+
Add-CIPPAzDataTableEntity @Table -Entity $Template
28+
$body = @{
29+
Results = @{
30+
state = 'success'
31+
resultText = 'Template cloned successfully'
32+
}
33+
}
34+
} catch {
35+
$body = @{
36+
Results = @{
37+
state = 'error'
38+
resultText = 'Failed to clone template'
39+
details = Get-CIPPException -Exception $_
40+
}
41+
}
42+
}
43+
} else {
44+
$body = @{
45+
Results = @{
46+
state = 'error'
47+
resultText = 'Template not found'
48+
}
49+
}
50+
}
51+
} else {
52+
$body = @{
53+
Results = @{
54+
state = 'error'
55+
resultText = 'GUID or Type not provided'
56+
}
57+
}
58+
}
59+
return ([HttpResponseContext]@{
60+
StatusCode = [HttpStatusCode]::OK
61+
Body = $body
62+
})
63+
}

Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Core/Invoke-ExecEditTemplate.ps1

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,30 @@ function Invoke-ExecEditTemplate {
1717

1818
if ($Type -eq 'IntuneTemplate') {
1919
Write-Host 'Intune Template'
20-
$OriginalTemplate = Get-CIPPAzDataTableEntity @Table -Filter "PartitionKey eq 'IntuneTemplate' and RowKey eq '$GUID'"
21-
$OriginalJSON = $OriginalTemplate.JSON
22-
$OriginalTemplate = ($OriginalJSON | ConvertFrom-Json -Depth 100)
20+
$Template = Get-CIPPAzDataTableEntity @Table -Filter "PartitionKey eq 'IntuneTemplate' and RowKey eq '$GUID'"
21+
$OriginalJSON = $Template.JSON
22+
23+
if ($Template.SHA) {
24+
$NewGuid = [guid]::NewGuid().ToString()
25+
} else {
26+
$NewGuid = $GUID
27+
}
2328
if ($Request.Body.parsedRAWJson) {
2429
$RawJSON = ConvertTo-Json -Compress -Depth 100 -InputObject $Request.Body.parsedRAWJson
2530
} else {
2631
$RawJSON = $OriginalJSON
2732
}
28-
Set-CIPPIntuneTemplate -RawJSON $RawJSON -GUID $GUID -DisplayName $Request.Body.displayName -Description $Request.Body.description -templateType $OriginalTemplate.Type -Headers $Request.Headers
33+
34+
$IntuneTemplate = @{
35+
GUID = $NewGuid
36+
RawJson = $RawJSON
37+
DisplayName = $Request.Body.displayName
38+
Description = $Request.Body.description
39+
templateType = $Template.Type
40+
Package = $Template.Package
41+
Headers = $Request.Headers
42+
}
43+
Set-CIPPIntuneTemplate @IntuneTemplate
2944
} else {
3045
$Table.Force = $true
3146
Add-CIPPAzDataTableEntity @Table -Entity @{

Modules/CIPPCore/Public/Entrypoints/HTTP Functions/CIPP/Settings/Invoke-ListCustomVariables.ps1

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,14 @@ function Invoke-ListCustomVariables {
174174
$ReservedVariables = $ReservedVariables | Where-Object { $_.Category -ne 'system' }
175175
}
176176

177+
# Filter out global reserved variables if requested (for tenant group rules)
178+
# These variables are the same for all tenants so they're not useful for grouping
179+
if ($Request.Query.excludeGlobalReserved -eq 'true') {
180+
$ReservedVariables = $ReservedVariables | Where-Object {
181+
$_.Category -notin @('partner', 'cipp', 'system')
182+
}
183+
}
184+
177185
# Add reserved variables first
178186
foreach ($Variable in $ReservedVariables) {
179187
$VariableMap[$Variable.Name] = $Variable
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
function Invoke-AddUserDefaults {
2+
<#
3+
.FUNCTIONALITY
4+
Entrypoint
5+
.ROLE
6+
Identity.User.ReadWrite
7+
#>
8+
[CmdletBinding()]
9+
param($Request, $TriggerMetadata)
10+
11+
$APIName = $Request.Params.CIPPEndpoint
12+
$Headers = $Request.Headers
13+
14+
try {
15+
# Extract data from request body - matching CippAddEditUser.jsx field names
16+
$TenantFilter = $Request.Body.tenantFilter
17+
$TemplateName = $Request.Body.templateName
18+
$DefaultForTenant = $Request.Body.defaultForTenant
19+
20+
Write-Host "Creating template '$TemplateName' for tenant: $TenantFilter"
21+
22+
# User fields
23+
$GivenName = $Request.Body.givenName
24+
$Surname = $Request.Body.surname
25+
$DisplayName = $Request.Body.displayName
26+
27+
# Handle autocomplete fields - extract value if it's an object
28+
$UsernameFormat = if ($Request.Body.usernameFormat -is [string]) {
29+
$Request.Body.usernameFormat
30+
} else {
31+
$Request.Body.usernameFormat.value
32+
}
33+
34+
$PrimDomain = if ($Request.Body.primDomain -is [string]) {
35+
$Request.Body.primDomain
36+
} else {
37+
$Request.Body.primDomain.value
38+
}
39+
40+
$AddedAliases = $Request.Body.addedAliases
41+
42+
# Settings
43+
$Autopassword = $Request.Body.Autopassword
44+
$Password = $Request.Body.password
45+
$MustChangePass = $Request.Body.MustChangePass
46+
47+
$UsageLocation = if ($Request.Body.usageLocation -is [string]) {
48+
$Request.Body.usageLocation
49+
} else {
50+
$Request.Body.usageLocation.value
51+
}
52+
53+
$Licenses = $Request.Body.licenses
54+
$RemoveLicenses = $Request.Body.removeLicenses
55+
56+
# Job and Location fields
57+
$JobTitle = $Request.Body.jobTitle
58+
$StreetAddress = $Request.Body.streetAddress
59+
$City = $Request.Body.city
60+
$State = $Request.Body.state
61+
$PostalCode = $Request.Body.postalCode
62+
$Country = $Request.Body.country
63+
$CompanyName = $Request.Body.companyName
64+
$Department = $Request.Body.department
65+
66+
# Contact fields
67+
$MobilePhone = $Request.Body.mobilePhone
68+
$BusinessPhones = $Request.Body.'businessPhones[0]'
69+
$OtherMails = $Request.Body.otherMails
70+
71+
# User relations
72+
$SetManager = $Request.Body.setManager
73+
$SetSponsor = $Request.Body.setSponsor
74+
$CopyFrom = $Request.Body.copyFrom
75+
76+
# Create template object with all fields from CippAddEditUser
77+
$TemplateObject = @{
78+
tenantFilter = $TenantFilter
79+
templateName = $TemplateName
80+
defaultForTenant = [bool]$DefaultForTenant
81+
givenName = $GivenName
82+
surname = $Surname
83+
displayName = $DisplayName
84+
usernameFormat = $UsernameFormat
85+
primDomain = $PrimDomain
86+
addedAliases = $AddedAliases
87+
Autopassword = $Autopassword
88+
password = $Password
89+
MustChangePass = $MustChangePass
90+
usageLocation = $UsageLocation
91+
licenses = $Licenses
92+
removeLicenses = $RemoveLicenses
93+
jobTitle = $JobTitle
94+
streetAddress = $StreetAddress
95+
city = $City
96+
state = $State
97+
postalCode = $PostalCode
98+
country = $Country
99+
companyName = $CompanyName
100+
department = $Department
101+
mobilePhone = $MobilePhone
102+
businessPhones = $BusinessPhones
103+
otherMails = $OtherMails
104+
setManager = $SetManager
105+
setSponsor = $SetSponsor
106+
copyFrom = $CopyFrom
107+
}
108+
109+
# Generate GUID for the template
110+
$GUID = (New-Guid).GUID
111+
112+
# Convert to JSON
113+
$JSON = ConvertTo-Json -InputObject $TemplateObject -Depth 100 -Compress
114+
115+
# Store in table
116+
$Table = Get-CippTable -tablename 'templates'
117+
$Table.Force = $true
118+
Add-CIPPAzDataTableEntity @Table -Entity @{
119+
JSON = "$JSON"
120+
RowKey = "$GUID"
121+
PartitionKey = 'UserDefaultTemplate'
122+
GUID = "$GUID"
123+
}
124+
125+
$Result = "Created User Default Template '$($TemplateName)' with GUID $GUID"
126+
Write-LogMessage -headers $Headers -API $APIName -message $Result -Sev 'Info'
127+
$StatusCode = [HttpStatusCode]::OK
128+
129+
} catch {
130+
$ErrorMessage = Get-CippException -Exception $_
131+
$Result = "Failed to create User Default Template: $($ErrorMessage.NormalizedError)"
132+
Write-LogMessage -headers $Headers -API $APIName -message $Result -Sev 'Error' -LogData $ErrorMessage
133+
$StatusCode = [HttpStatusCode]::InternalServerError
134+
}
135+
136+
return ([HttpResponseContext]@{
137+
StatusCode = $StatusCode
138+
Body = @{'Results' = "$Result" }
139+
})
140+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
function Invoke-ListNewUserDefaults {
2+
<#
3+
.FUNCTIONALITY
4+
Entrypoint,AnyTenant
5+
.ROLE
6+
Identity.User.Read
7+
#>
8+
[CmdletBinding()]
9+
param($Request, $TriggerMetadata)
10+
11+
Write-Host 'Listing New User Default Templates'
12+
13+
# Get the TenantFilter from query parameters
14+
$TenantFilter = $Request.Query.TenantFilter
15+
Write-Host "TenantFilter from request: $TenantFilter"
16+
17+
# Get the templates table
18+
$Table = Get-CippTable -tablename 'templates'
19+
$Filter = "PartitionKey eq 'UserDefaultTemplate'"
20+
21+
# Retrieve all User Default templates
22+
$Templates = (Get-CIPPAzDataTableEntity @Table -Filter $Filter) | ForEach-Object {
23+
try {
24+
$row = $_
25+
$data = $row.JSON | ConvertFrom-Json -Depth 100 -ErrorAction Stop
26+
$data | Add-Member -NotePropertyName 'GUID' -NotePropertyValue $row.GUID -Force
27+
$data | Add-Member -NotePropertyName 'RowKey' -NotePropertyValue $row.RowKey -Force
28+
Write-Host "Template found: $($data.templateName), tenantFilter: $($data.tenantFilter)"
29+
$data
30+
} catch {
31+
Write-Warning "Failed to process User Default template: $($row.RowKey) - $($_.Exception.Message)"
32+
}
33+
}
34+
35+
Write-Host "Total templates before filtering: $($Templates.Count)"
36+
37+
# Filter by tenant if TenantFilter is provided
38+
if ($TenantFilter) {
39+
$Templates = $Templates | Where-Object -Property tenantFilter -EQ $TenantFilter
40+
Write-Host "Templates after filtering: $($Templates.Count)"
41+
}
42+
43+
# Sort by template name
44+
$Templates = $Templates | Sort-Object -Property templateName
45+
46+
# If a specific ID is requested, filter to that template
47+
if ($Request.query.ID) {
48+
$Templates = $Templates | Where-Object -Property GUID -EQ $Request.query.ID
49+
}
50+
51+
$Templates = ConvertTo-Json -InputObject @($Templates) -Depth 100
52+
53+
return ([HttpResponseContext]@{
54+
StatusCode = [HttpStatusCode]::OK
55+
Body = $Templates
56+
})
57+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
function Invoke-RemoveUserDefaultTemplate {
2+
<#
3+
.FUNCTIONALITY
4+
Entrypoint
5+
.ROLE
6+
Identity.User.ReadWrite
7+
#>
8+
[CmdletBinding()]
9+
param($Request, $TriggerMetadata)
10+
11+
$APIName = $Request.Params.CIPPEndpoint
12+
$Headers = $Request.Headers
13+
14+
try {
15+
$ID = $Request.Query.ID ?? $Request.Body.ID
16+
$Table = Get-CippTable -tablename 'templates'
17+
$Filter = "PartitionKey eq 'UserDefaultTemplate' and RowKey eq '$ID'"
18+
$Template = Get-CIPPAzDataTableEntity @Table -Filter $Filter
19+
20+
if ($Template) {
21+
Remove-AzDataTableEntity @Table -Entity $Template
22+
$Result = "Successfully deleted User Default Template with ID: $ID"
23+
Write-LogMessage -headers $Headers -API $APIName -message $Result -Sev 'Info'
24+
$StatusCode = [HttpStatusCode]::OK
25+
} else {
26+
$Result = "User Default Template with ID $ID not found"
27+
Write-LogMessage -headers $Headers -API $APIName -message $Result -Sev 'Warning'
28+
$StatusCode = [HttpStatusCode]::NotFound
29+
}
30+
31+
} catch {
32+
$ErrorMessage = Get-CippException -Exception $_
33+
$Result = "Failed to delete User Default Template: $($ErrorMessage.NormalizedError)"
34+
Write-LogMessage -headers $Headers -API $APIName -message $Result -Sev 'Error' -LogData $ErrorMessage
35+
$StatusCode = [HttpStatusCode]::InternalServerError
36+
}
37+
38+
return ([HttpResponseContext]@{
39+
StatusCode = $StatusCode
40+
Body = @{'Results' = "$Result" }
41+
})
42+
}

0 commit comments

Comments
 (0)