From ec6cb191aa47312343411fe410fed60601e27291 Mon Sep 17 00:00:00 2001 From: Mikey O'Toole Date: Mon, 22 Jun 2026 23:19:31 +0100 Subject: [PATCH 1/3] fix: suppress endpoint support check return value leak from request pipeline - Add Out-Null pipe to Test-NinjaOneEndpointSupport calls in all request wrapper functions - Fixes issue where cmdlets returned arrays with spurious boolean as first element - Affected functions: New-NinjaOneGETRequest, New-NinjaOnePOSTRequest, New-NinjaOnePUTRequest, New-NinjaOnePATCHRequest, New-NinjaOneDELETERequest --- CHANGELOG.md | 5 +++++ Source/NinjaOne.psd1 | 2 +- Source/Private/New-NinjaOneDELETERequest.ps1 | 7 ++++--- Source/Private/New-NinjaOneGETRequest.ps1 | 2 +- Source/Private/New-NinjaOnePATCHRequest.ps1 | 5 ++++- Source/Private/New-NinjaOnePOSTRequest.ps1 | 4 +++- Source/Private/New-NinjaOnePUTRequest.ps1 | 2 +- 7 files changed, 19 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5d8104c..f3049a53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ Please note that backwards compatibility breaks are prefixed with `{"BC"}` (shor Note: Version 2.3.0 was released in error and will be skipped. +## 2026-06-22 - Version 2.7.2 + +* Fixes: + * Fix request wrapper functions leaking boolean return value from endpoint support checks into the output pipeline, causing cmdlets to return arrays with spurious `$true` as the first element. + ## 2026-06-22 - Version 2.7.1 * Fixes: diff --git a/Source/NinjaOne.psd1 b/Source/NinjaOne.psd1 index 8cb04308..ef1f515f 100644 --- a/Source/NinjaOne.psd1 +++ b/Source/NinjaOne.psd1 @@ -12,7 +12,7 @@ RootModule = '.\NinjaOne.psm1' # Version number of this module. - ModuleVersion = '2.7.1' + ModuleVersion = '2.7.2' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/Source/Private/New-NinjaOneDELETERequest.ps1 b/Source/Private/New-NinjaOneDELETERequest.ps1 index 0d1d3d8b..c071f58f 100644 --- a/Source/Private/New-NinjaOneDELETERequest.ps1 +++ b/Source/Private/New-NinjaOneDELETERequest.ps1 @@ -27,7 +27,7 @@ function New-NinjaOneDELETERequest { if ($null -eq $Script:NRAPIAuthenticationInformation) { throw "Missing NinjaOne authentication tokens, please run 'Connect-NinjaOne' first." } - Test-NinjaOneEndpointSupport -Method 'DELETE' -resource $resource -Verbose:$VerbosePreference + Test-NinjaOneEndpointSupport -Method 'DELETE' -resource $resource -Verbose:$VerbosePreference | Out-Null try { if ($QSCollection) { Write-Verbose ('Query string in New-NinjaOneDELETERequest contains: {0}' -f ($QSCollection | Out-String)) @@ -54,9 +54,10 @@ function New-NinjaOneDELETERequest { try { $Result = Invoke-NinjaOneRequest @WebRequestParams Write-Verbose ('NinjaOne request returned {0}' -f ($Result | Out-String)) - if ($Result.results) { + # Only process object properties if Result is a PSObject or hashtable, not a scalar boolean + if (($Result -is [System.Management.Automation.PSCustomObject] -or $Result -is [hashtable]) -and $Result.results) { return $Result.results - } elseif ($Result.result) { + } elseif (($Result -is [System.Management.Automation.PSCustomObject] -or $Result -is [hashtable]) -and $Result.result) { return $Result.result } else { return $Result diff --git a/Source/Private/New-NinjaOneGETRequest.ps1 b/Source/Private/New-NinjaOneGETRequest.ps1 index f6790d95..80bd863d 100644 --- a/Source/Private/New-NinjaOneGETRequest.ps1 +++ b/Source/Private/New-NinjaOneGETRequest.ps1 @@ -31,7 +31,7 @@ function New-NinjaOneGETRequest { if ($null -eq $Script:NRAPIAuthenticationInformation) { throw "Missing NinjaOne authentication tokens, please run 'Connect-NinjaOne' first." } - Test-NinjaOneEndpointSupport -Method 'GET' -resource $resource -Verbose:$VerbosePreference + Test-NinjaOneEndpointSupport -Method 'GET' -resource $resource -Verbose:$VerbosePreference | Out-Null try { if ($qSCollection) { Write-Verbose ('Query string in New-NinjaOneGETRequest contains: {0}' -f ($qSCollection | Out-String)) diff --git a/Source/Private/New-NinjaOnePATCHRequest.ps1 b/Source/Private/New-NinjaOnePATCHRequest.ps1 index ac6db61a..09de97fc 100644 --- a/Source/Private/New-NinjaOnePATCHRequest.ps1 +++ b/Source/Private/New-NinjaOnePATCHRequest.ps1 @@ -32,7 +32,7 @@ function New-NinjaOnePATCHRequest { if ($null -eq $Script:NRAPIAuthenticationInformation) { throw "Missing NinjaOne authentication tokens, please run 'Connect-NinjaOne' first." } - Test-NinjaOneEndpointSupport -Method 'PATCH' -resource $resource -Verbose:$VerbosePreference + Test-NinjaOneEndpointSupport -Method 'PATCH' -resource $resource -Verbose:$VerbosePreference | Out-Null try { if ($qSCollection) { Write-Verbose ('Query string in New-NinjaOnePATCHRequest contains: {0}' -f ($qSCollection | Out-String)) @@ -70,6 +70,9 @@ function New-NinjaOnePATCHRequest { } else { return $Result } + } else { + return $Result + } } catch { $ExceptionType = if ($IsCoreCLR) { [Microsoft.PowerShell.Commands.HttpResponseException] diff --git a/Source/Private/New-NinjaOnePOSTRequest.ps1 b/Source/Private/New-NinjaOnePOSTRequest.ps1 index b2b9fd81..1c34c469 100644 --- a/Source/Private/New-NinjaOnePOSTRequest.ps1 +++ b/Source/Private/New-NinjaOnePOSTRequest.ps1 @@ -244,7 +244,7 @@ function New-NinjaOnePOSTRequest { if ($null -eq $Script:NRAPIAuthenticationInformation) { throw "Missing NinjaOne authentication tokens, please run 'Connect-NinjaOne' first." } - Test-NinjaOneEndpointSupport -method 'POST' -resource $resource -Verbose:$VerbosePreference + Test-NinjaOneEndpointSupport -Method 'POST' -resource $resource -Verbose:$VerbosePreference | Out-Null try { if ($qSCollection) { Write-Verbose ('Query string in New-NinjaOnePOSTRequest contains: {0}' -f ($qSCollection | Out-String)) @@ -310,6 +310,8 @@ function New-NinjaOnePOSTRequest { } else { return $Result } + return $Result + } } catch { $ExceptionType = if ($IsCoreCLR) { [Microsoft.PowerShell.Commands.HttpResponseException] diff --git a/Source/Private/New-NinjaOnePUTRequest.ps1 b/Source/Private/New-NinjaOnePUTRequest.ps1 index e12ee276..95267634 100644 --- a/Source/Private/New-NinjaOnePUTRequest.ps1 +++ b/Source/Private/New-NinjaOnePUTRequest.ps1 @@ -32,7 +32,7 @@ function New-NinjaOnePUTRequest { if ($null -eq $Script:NRAPIAuthenticationInformation) { throw "Missing NinjaOne authentication tokens, please run 'Connect-NinjaOne' first." } - Test-NinjaOneEndpointSupport -Method 'PUT' -resource $resource -Verbose:$VerbosePreference + Test-NinjaOneEndpointSupport -Method 'PUT' -resource $resource -Verbose:$VerbosePreference | Out-Null try { if ($qSCollection) { Write-Verbose ('Query string in New-NinjaOnePUTRequest contains: {0}' -f ($qSCollection | Out-String)) From 6c2f68d98b2a4ae44b4f835580e7b5228e703cc8 Mon Sep 17 00:00:00 2001 From: Mikey O'Toole Date: Tue, 23 Jun 2026 10:05:00 +0100 Subject: [PATCH 2/3] fix: correct malformed try blocks in POST/PATCH request wrappers --- Source/Private/New-NinjaOnePATCHRequest.ps1 | 3 --- Source/Private/New-NinjaOnePOSTRequest.ps1 | 2 -- 2 files changed, 5 deletions(-) diff --git a/Source/Private/New-NinjaOnePATCHRequest.ps1 b/Source/Private/New-NinjaOnePATCHRequest.ps1 index 09de97fc..3a1a3d51 100644 --- a/Source/Private/New-NinjaOnePATCHRequest.ps1 +++ b/Source/Private/New-NinjaOnePATCHRequest.ps1 @@ -70,9 +70,6 @@ function New-NinjaOnePATCHRequest { } else { return $Result } - } else { - return $Result - } } catch { $ExceptionType = if ($IsCoreCLR) { [Microsoft.PowerShell.Commands.HttpResponseException] diff --git a/Source/Private/New-NinjaOnePOSTRequest.ps1 b/Source/Private/New-NinjaOnePOSTRequest.ps1 index 1c34c469..54d420a0 100644 --- a/Source/Private/New-NinjaOnePOSTRequest.ps1 +++ b/Source/Private/New-NinjaOnePOSTRequest.ps1 @@ -310,8 +310,6 @@ function New-NinjaOnePOSTRequest { } else { return $Result } - return $Result - } } catch { $ExceptionType = if ($IsCoreCLR) { [Microsoft.PowerShell.Commands.HttpResponseException] From 2265c90e2db3e34698e560e8b4198d9a6fae9cc9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 23 Jun 2026 09:32:10 +0000 Subject: [PATCH 3/3] test: cover GET endpoint support output suppression --- Tests/NinjaOne.Private.Tests.ps1 | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Tests/NinjaOne.Private.Tests.ps1 b/Tests/NinjaOne.Private.Tests.ps1 index 0fc528bd..60a70b7f 100644 --- a/Tests/NinjaOne.Private.Tests.ps1 +++ b/Tests/NinjaOne.Private.Tests.ps1 @@ -1288,6 +1288,20 @@ Describe 'New-NinjaOneGETRequest' { Assert-MockCalled -CommandName Test-NinjaOneEndpointSupport -ModuleName $ModuleName -Times 1 -ParameterFilter { $Method -eq 'GET' -and $resource -eq '/v2/organizations' } } + It 'should not leak endpoint support output into the request result' { + Mock -CommandName Test-NinjaOneEndpointSupport -ModuleName $ModuleName -MockWith { $true } + Mock -CommandName Invoke-NinjaOneRequest -ModuleName $ModuleName -MockWith { + [pscustomobject]@{ result = [pscustomobject]@{ id = 42 } } + } + + $module = Get-Module -Name $ModuleName + & $module { + $result = @(New-NinjaOneGETRequest -Resource '/v2/organizations') + $result.Count | Should -Be 1 + $result[0].id | Should -Be 42 + } + } + It 'should return the results property when present' { Mock -CommandName Invoke-NinjaOneRequest -ModuleName $ModuleName -MockWith { [pscustomobject]@{ results = @('a', 'b') }