diff --git a/PowerFGT/Private/Confirm.ps1 b/PowerFGT/Private/Confirm.ps1 index 86e4b2d92..614937be7 100644 --- a/PowerFGT/Private/Confirm.ps1 +++ b/PowerFGT/Private/Confirm.ps1 @@ -386,3 +386,34 @@ Function Confirm-FGTVpnIpsecPhase2Interface { $true } + +Function Confirm-FGTWebfilterUrlfilter { + + Param ( + [Parameter (Mandatory = $true)] + [object]$argument + ) + + #Check if it looks like a Web Filter URL Filter element + + if ( -not ( $argument | get-member -name name -Membertype Properties)) { + throw "Element specified does not contain a name property." + } + if ( -not ( $argument | get-member -name comment -Membertype Properties)) { + throw "Element specified does not contain a comment property." + } + if ( -not ( $argument | get-member -name one-arm-ips-urlfilter -Membertype Properties)) { + throw "Element specified does not contain an one-arm-ips-urlfilter property." + } + if ( -not ( $argument | get-member -name ip-addr-block -Membertype Properties)) { + throw "Element specified does not contain an ip-addr-block property." + } + if ( -not ( $argument | get-member -name ip4-mapped-ip6 -Membertype Properties)) { + throw "Element specified does not contain an ip4-mapped-ip6 property." + } + if ( -not ( $argument | get-member -name entries -Membertype Properties)) { + throw "Element specified does not contain an entries property." + } + + $true +} \ No newline at end of file diff --git a/PowerFGT/Public/cmdb/webfilter/urlfilter.ps1 b/PowerFGT/Public/cmdb/webfilter/urlfilter.ps1 new file mode 100644 index 000000000..c4970a936 --- /dev/null +++ b/PowerFGT/Public/cmdb/webfilter/urlfilter.ps1 @@ -0,0 +1,423 @@ +# +# Copyright 2022, Alexis La Goutte +# Copyright 2022, Cédric Moreau +# +# SPDX-License-Identifier: Apache-2.0 +# + +function Add-FGTWebfilterUrlfilter { + + <# + .SYNOPSIS + Add a FortiGate URL Filter + + .DESCRIPTION + Add a FortiGate URL Filter + + .EXAMPLE + Add-FGTWebfilterUrlfilter -name myURL1 -id 1 -name MyURL -comment "Added by PowerFGT" + + Add URL Filter object named MyURL with comment + + .EXAMPLE + Add-FGTWebfilterUrlfilter -name myURL1 -id 1 -name MyURL -comment "Added by PowerFGT" -url_id 1 -url_type simple -url powerfgt.com -action allow -status enable + + Add URL Filter object named MyURL with an url (URL : powerfgt.com, type : simple, action : allow, status : enable) + + .EXAMPLE + Add-FGTWebfilterUrlfilter -name myURL1 -id 1 -name MyURL -comment "Added by PowerFGT" -url_id 1 -url_type wildcard -url *powerfgt.com -action block -status enable + + Add URL Filter object named MyURL with an url (URL : *powerfgt.com, type : wildcard, action : block, status : enable) + + #> + + Param( + [Parameter (Mandatory = $false)] + [string]$id, + [Parameter (Mandatory = $true)] + [string]$name, + [Parameter (Mandatory = $false)] + [string]$url_id, + [Parameter (Mandatory = $false)] + [ValidateSet('simple', 'regex', 'wildcard')] + [string]$url_type, + [Parameter (Mandatory = $false)] + [string]$url, + [Parameter (Mandatory = $false)] + [ValidateSet("block", "allow", "monitor")] + [string]$action, + [Parameter (Mandatory = $false)] + [ValidateSet("enable", "disable")] + [string]$status, + [Parameter(Mandatory = $false)] + [String[]]$vdom, + [Parameter(Mandatory = $false)] + [psobject]$connection = $DefaultFGTConnection + ) + + Begin { + } + + Process { + + $invokeParams = @{ } + if ( $PsBoundParameters.ContainsKey('vdom') ) { + $invokeParams.add( 'vdom', $vdom ) + } + + if ( Get-FGTWebfilterUrlfilter -connection $connection @invokeParams -name $name ) { + Throw "Already an URL profile object using the same name" + } + + $uri = "api/v2/cmdb/webfilter/urlfilter" + + $urlfilter = new-Object -TypeName PSObject + + $urlfilter | add-member -name "name" -membertype NoteProperty -Value $name + + $urlfilter | add-member -name "id" -membertype NoteProperty -Value $id + + if ( $PsBoundParameters.ContainsKey('comment') ) { + $_urlfilter | add-member -name "comment" -membertype NoteProperty -Value $comment + } + + $_entry = new-Object -TypeName PSObject + + if ( $PsBoundParameters.ContainsKey('url_id') ) { + $_entry | add-member -name "id" -membertype NoteProperty -Value $url_id + } + + if ( $PsBoundParameters.ContainsKey('url_type') ) { + $_entry | add-member -name "type" -membertype NoteProperty -Value $url_type + } + + if ( $PsBoundParameters.ContainsKey('url') ) { + $_entry | add-member -name "url" -membertype NoteProperty -Value $url + } + + if ( $PsBoundParameters.ContainsKey('action') ) { + $_entry | add-member -name "action" -membertype NoteProperty -Value $action + } + + if ( $PsBoundParameters.ContainsKey('status') ) { + $_entry | add-member -name "status" -membertype NoteProperty -Value $status + } + + $urlfilter | add-member -name "entries" -membertype NoteProperty -Value $_entry + + Invoke-FGTRestMethod -method "POST" -body $urlfilter -uri $uri -connection $connection @invokeParams | Out-Null + + Get-FGTWebfilterUrlfilter -connection $connection @invokeParams -name $name + } + + End { + } +} + +function Get-FGTWebfilterUrlfilter { + + <# + .SYNOPSIS + Get list of all URL Filter + + .DESCRIPTION + Get list of all URL Filter (URL, actions, etc ...) + + .EXAMPLE + Get-FGTWebfilterUrlfilter + + Get list of all all URL Filter + + .EXAMPLE + Get-FGTWebfilterUrlfilter -name myFGTURLFilter + + Get URL Filter named myFGTURLFilter + + .EXAMPLE + Get-FGTWebfilterUrlfilter -name FGT -filter_type contains + + Get URL Filter contains *FGT* + + .EXAMPLE + Get-FGTWebfilterUrlfilter -id 1 + + Get URL Filter with id 1 + + .EXAMPLE + Get-FGTWebfilterUrlfilter -skip + + Get list of all URL Filter but only the relevant attributes + + .EXAMPLE + Get-FGTWebfilterUrlfilter -vdom vdomX + + Get list of all URL Filter object on vdomX + #> + + [CmdletBinding(DefaultParameterSetName = "default")] + Param( + [Parameter (Mandatory = $false, Position = 1, ParameterSetName = "name")] + [string]$name, + [Parameter (Mandatory = $false, ParameterSetName = "uuid")] + [string]$id, + [Parameter (Mandatory = $false)] + [Parameter (ParameterSetName = "filter")] + [string]$filter_attribute, + [Parameter (Mandatory = $false)] + [Parameter (ParameterSetName = "name")] + [Parameter (ParameterSetName = "uuid")] + [Parameter (ParameterSetName = "filter")] + [ValidateSet('equal', 'contains')] + [string]$filter_type = "equal", + [Parameter (Mandatory = $false)] + [Parameter (ParameterSetName = "filter")] + [psobject]$filter_value, + [Parameter(Mandatory = $false)] + [switch]$skip, + [Parameter(Mandatory = $false)] + [String[]]$vdom, + [Parameter(Mandatory = $false)] + [psobject]$connection = $DefaultFGTConnection + ) + + Begin { + } + + Process { + + $invokeParams = @{ } + if ( $PsBoundParameters.ContainsKey('skip') ) { + $invokeParams.add( 'skip', $skip ) + } + if ( $PsBoundParameters.ContainsKey('vdom') ) { + $invokeParams.add( 'vdom', $vdom ) + } + + #Filtering + switch ( $PSCmdlet.ParameterSetName ) { + "name" { + $filter_value = $name + $filter_attribute = "name" + } + "uiid" { + $filter_value = $id + $filter_attribute = "id" + } + default { } + } + + #if filter value and filter_attribute, add filter (by default filter_type is equal) + if ( $filter_value -and $filter_attribute ) { + $invokeParams.add( 'filter_value', $filter_value ) + $invokeParams.add( 'filter_attribute', $filter_attribute ) + $invokeParams.add( 'filter_type', $filter_type ) + } + + $response = Invoke-FGTRestMethod -uri 'api/v2/cmdb/webfilter/urlfilter' -method 'GET' -connection $connection @invokeParams + + $response.results + } + + End { + } +} + +function Set-FGTWebfilterUrlfilter { + + <# + .SYNOPSIS + Configure a FortiGate URL Filter + + .DESCRIPTION + Change a FortiGate URL Filter (comment, action, status... ) + + .EXAMPLE + $MyFGTUrl = Get-FGTWebfilterUrlfilter -name MyFGTUrl + PS C:\>$MyFGTUrl | Set-FGTWebfilterUrlfilter -url_id 10 -action block + + Change MyFGTUrl URL ID 10 to value (action) block + + .EXAMPLE + $MyFGTUrl = Get-FGTWebfilterUrlfilter -name MyFGTUrl + PS C:\>$MyFGTUrl | Set-FGTWebfilterUrlfilter -url_id 10 -status disable + + Change MyFGTUrl URL ID 10 to value (status) disable + + .EXAMPLE + $MyFGTUrl = Get-FGTWebfilterUrlfilter -name MyFGTUrl + PS C:\>$MyFGTUrl | Set-FGTWebfilterUrlfilter -comment 'Changed by PowerFGT" + + Change MyFGTUrl to set comment to "Changed by PowerFGT" + + .EXAMPLE + $MyFGTUrl = Get-FGTWebfilterUrlfilter -name MyFGTUrl + PS C:\>$MyFGTUrl | Set-FGTWebfilterUrlfilter -url_id 15 -url_type simple -url powerfgt.com -action allow -status enable + + Add a new URL to the MyFGTUrl profil for the url powerfgt.com + + #> + + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'medium', DefaultParameterSetName = 'default')] + Param( + [Parameter (Mandatory = $true, ValueFromPipeline = $true, Position = 1)] + [ValidateScript({ Confirm-FGTWebfilterUrlfilter $_ })] + [psobject]$urlfilter, + [Parameter (Mandatory = $false)] + [ValidateLength(0, 63)] + [string]$name, + [Parameter (Mandatory = $false)] + [ValidateLength(0, 255)] + [string]$comment, + [Parameter (Mandatory = $false)] + [ValidateRange(0, 4294967295)] + [string]$url_id, + [Parameter (Mandatory = $false)] + [ValidateSet("simple", "regex", "wildcard")] + [string]$url_type, + [Parameter (Mandatory = $false)] + [ValidateLength(0, 511)] + [string]$url, + [Parameter (Mandatory = $false)] + [ValidateSet("block", "allow", "monitor")] + [string]$action, + [Parameter (Mandatory = $false)] + [ValidateSet("enable", "disable")] + [string]$status, + [Parameter (Mandatory = $false)] + [boolean]$visibility, + [Parameter (Mandatory = $false)] + [String[]]$vdom, + [Parameter (Mandatory = $false)] + [psobject]$connection = $DefaultFGTConnection + ) + + Begin { + } + + Process { + + $invokeParams = @{ } + if ( $PsBoundParameters.ContainsKey('vdom') ) { + $invokeParams.add( 'vdom', $vdom ) + } + + $uri = "api/v2/cmdb/webfilter/urlfilter/$($urlfilter.id)" + + $_urlfilter = new-Object -TypeName PSObject + + if ( $PsBoundParameters.ContainsKey('name') ) { + #TODO check if there is no already a object with this name ? + $_urlfilter | add-member -name "name" -membertype NoteProperty -Value $name + $urlfilter.name = $name + } + + if ( $PsBoundParameters.ContainsKey('comment') ) { + $_urlfilter | add-member -name "comment" -membertype NoteProperty -Value $comment + } + + $_entry = new-Object -TypeName PSObject + + if ( $PsBoundParameters.ContainsKey('url_id') ) { + $_entry | add-member -name "id" -membertype NoteProperty -Value $url_id + } + + if ( $PsBoundParameters.ContainsKey('url_type') ) { + $_entry | add-member -name "type" -membertype NoteProperty -Value $url_type + } + + if ( $PsBoundParameters.ContainsKey('url') ) { + $_entry | add-member -name "url" -membertype NoteProperty -Value $url + } + + if ( $PsBoundParameters.ContainsKey('action') ) { + $_entry | add-member -name "action" -membertype NoteProperty -Value $action + } + + if ( $PsBoundParameters.ContainsKey('status') ) { + $_entry | add-member -name "status" -membertype NoteProperty -Value $status + } + + $urlfilter.entries += $_entry + + $_urlfilter | add-member -name "entries" -membertype NoteProperty -Value $urlfilter.entries + + if ( $PsBoundParameters.ContainsKey('visibility') ) { + #with 6.4.x, there is no longer visibility parameter + if ($connection.version -ge "6.4.0") { + Write-Warning "-visibility parameter is no longer available with FortiOS 6.4.x and after" + } + else { + if ( $visibility ) { + $_urlfilter | add-member -name "visibility" -membertype NoteProperty -Value "enable" + } + else { + $_urlfilter | add-member -name "visibility" -membertype NoteProperty -Value "disable" + } + } + } + + if ($PSCmdlet.ShouldProcess($urlfilter.name, 'Configure URL FIlter entry')) { + Invoke-FGTRestMethod -method "PUT" -body $_urlfilter -uri $uri -connection $connection @invokeParams | out-Null + + Get-FGTWebfilterUrlfilter -connection $connection @invokeParams -name $urlfilter.name + } + } + + End { + } +} + +function Remove-FGTWebfilterUrlfilter { + + <# + .SYNOPSIS + Remove a FortiGate Webfilter URLFilter + + .DESCRIPTION + Remove a FortiGate Webfilter URLFilter object on the FortiGate + + .EXAMPLE + $MyFGTURL = Get-FGTWebfilterUrlfilter -name MyFGTURL + PS C:\>$MyFGTURL | Remove-FGTWebfilterUrlfilter + + Remove Webfilter URLFilter object $MyFGTURL + + .EXAMPLE + $MyFGTURL = Get-FGTWebfilterUrlfilter -name MyFGTURL + PS C:\>$MyFGTURL | Remove-FGTWebfilterUrlfilter -confirm:$false + + Remove Webfilter URLFilter object $MyFGTURL with no confirmation + + #> + + [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'high')] + Param( + [Parameter (Mandatory = $true, ValueFromPipeline = $true, Position = 1)] + [ValidateScript({ Confirm-FGTWebfilterUrlfilter $_ })] + [psobject]$url, + [Parameter(Mandatory = $false)] + [String[]]$vdom, + [Parameter(Mandatory = $false)] + [psobject]$connection = $DefaultFGTConnection + ) + + Begin { + } + + Process { + + $invokeParams = @{ } + if ( $PsBoundParameters.ContainsKey('vdom') ) { + $invokeParams.add( 'vdom', $vdom ) + } + + $uri = "api/v2/cmdb/webfilter/urlfilter/$($url.id)" + + if ($PSCmdlet.ShouldProcess($url.name, 'Remove WebFilter UrlFilter')) { + $null = Invoke-FGTRestMethod -method "DELETE" -uri $uri -connection $connection @invokeParams + } + } + + End { + } +} \ No newline at end of file diff --git a/Tests/integration/WebfilterUrlfilter.Tests.ps1 b/Tests/integration/WebfilterUrlfilter.Tests.ps1 new file mode 100644 index 000000000..0af308019 --- /dev/null +++ b/Tests/integration/WebfilterUrlfilter.Tests.ps1 @@ -0,0 +1,328 @@ +# +# Copyright 2022, Cédric Moreau +# +# SPDX-License-Identifier: Apache-2.0 +# + +#include common configuration +. ../common.ps1 + +BeforeAll { + Connect-FGT @invokeParams +} + +Describe "Get WebFilter UrlFilter" { + + BeforeAll { + $urlfilter = Add-FGTWebfilterUrlfilter -name $pester_url1 -url_id 1 -url_type simple -url powerfgt.com -action allow -status enable + $script:uuid = $urlfilter.id + Add-FGTWebfilterUrlfilter -name $pester_url2 -url_id 2 -url_type wildcard -url *powerfgt.com -action allow -status enable + } + + It "Get WebFilter UrlFilter Does not throw an error" { + { + Get-FGTWebfilterUrlfilter + } | Should -Not -Throw + } + + It "Get ALL URL Filter" { + $urlfilter = Get-FGTWebfilterUrlfilter + $urlfilter.count | Should -Not -Be $NULL + } + + It "Get ALL URL Filter with -skip" { + $urlfilter = Get-FGTWebfilterUrlfilter -skip + $urlfilter.count | Should -Not -Be $NULL + } + + It "Get URL Filter ($pester_url1)" { + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + } + + It "Get URL Filter ($pester_url1) and confirm (via Confirm-FGTWebfilterUrlfilter)" { + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + Confirm-FGTWebfilterUrlfilter ($urlfilter) | Should -Be $true + } + + Context "Search" { + + It "Search URL Filter by name ($pester_url1)" { + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + @($urlfilter).count | Should -be 1 + $urlfilter.name | Should -Be $pester_url1 + } + + It "Search URL Filter by uuid ($script:uuid)" { + $urlfilter = Get-FGTWebfilterUrlfilter -id $script:uuid + @($urlfilter).count | Should -be 1 + $urlfilter.name | Should -Be $pester_url1 + } + + } + + AfterAll { + Get-FGTWebfilterUrlfilter -name $pester_url1 | Remove-FGTWebfilterUrlfilter -confirm:$false + Get-FGTWebfilterUrlfilter -name $pester_url2 | Remove-FGTWebfilterUrlfilter -confirm:$false + } + +} + +Describe "Add WebFilter UrlFilter" { + + AfterEach { + Get-FGTWebfilterUrlfilter -name $pester_url1 | Remove-FGTWebfilterUrlfilter -confirm:$false + } + + It "Add URL Filter $pester_url1" { + Add-FGTWebfilterUrlfilter -name $pester_url1 -url_id 1 -url_type simple -url powerfgt.com -action allow -status enable + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.comment | Should -BeNullOrEmpty + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.url | Should -Be "powerfgt.com" + $urlfilter.entries.type | Should -Be "simple" + $urlfilter.entries.action | Should -Be "allow" + $urlfilter.entries.status | Should -Be "enable" + } + + It "Add URL Filter $pester_url1 (with comment)" { + Add-FGTWebfilterUrlfilter -name $pester_url1 -url_id 1 -url_type simple -url powerfgt.com -action allow -status enable -comment "Added by PowerFGT" + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.comment | Should -Be "Added by PowerFGT" + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.url | Should -Be "powerfgt.com" + $urlfilter.entries.type | Should -Be "simple" + $urlfilter.entries.action | Should -Be "allow" + $urlfilter.entries.status | Should -Be "enable" + } + + It "Add URL Filter $pester_url1 with type simple" { + Add-FGTWebfilterUrlfilter -name $pester_url1 -url_id 1 -url_type simple -url powerfgt.com -action allow -status enable + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.comment | Should -BeNullOrEmpty + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.url | Should -Be "powerfgt.com" + $urlfilter.entries.type | Should -Be "simple" + + } + + It "Add URL Filter $pester_url1 with type wildcard" { + Add-FGTWebfilterUrlfilter -name $pester_url1 -url_id 1 -url_type wildcard -url "*powerfgt.com" -action allow -status enable + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.comment | Should -BeNullOrEmpty + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.url | Should -Be "*powerfgt.com" + $urlfilter.entries.type | Should -Be "wildcard" + } + + It "Add URL Filter $pester_url1 with type regex" { + Add-FGTWebfilterUrlfilter -name $pester_url1 -url_id 1 -url_type regex -url "https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)" -action allow -status enable + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.comment | Should -BeNullOrEmpty + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.url | Should -Be "https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)" + $urlfilter.entries.type | Should -Be "regex" + } + + It "Add URL Filter $pester_url1 with action allow" { + Add-FGTWebfilterUrlfilter -name $pester_url1 -url_id 1 -url_type simple -url powerfgt.com -action allow -status enable + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.comment | Should -BeNullOrEmpty + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.url | Should -Be "powerfgt.com" + $urlfilter.entries.type | Should -Be "simple" + $urlfilter.entries.action | Should -Be "allow" + } + + It "Add URL Filter $pester_url1 with action block" { + Add-FGTWebfilterUrlfilter -name $pester_url1 -url_id 1 -url_type simple -url powerfgt.com -action block -status enable + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.comment | Should -BeNullOrEmpty + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.url | Should -Be "powerfgt.com" + $urlfilter.entries.type | Should -Be "simple" + $urlfilter.entries.action | Should -Be "block" + } + + It "Add URL Filter $pester_url1 with action monitor" { + Add-FGTWebfilterUrlfilter -name $pester_url1 -url_id 1 -url_type simple -url powerfgt.com -action monitor -status enable + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.comment | Should -BeNullOrEmpty + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.url | Should -Be "powerfgt.com" + $urlfilter.entries.type | Should -Be "simple" + $urlfilter.entries.action | Should -Be "monitor" + } + + It "Add URL Filter $pester_url1 enabled" { + Add-FGTWebfilterUrlfilter -name $pester_url1 -url_id 1 -url_type simple -url powerfgt.com -action allow -status enable + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.comment | Should -Be "Added by PowerFGT" + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.url | Should -Be "powerfgt.com" + $urlfilter.entries.type | Should -Be "simple" + $urlfilter.entries.action | Should -Be "allow" + $urlfilter.entries.status | Should -Be "enable" + } + + It "Add URL Filter $pester_url1 disabled" { + Add-FGTWebfilterUrlfilter -name $pester_url1 -url_id 1 -url_type simple -url powerfgt.com -action allow -status disable + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.comment | Should -Be "Added by PowerFGT" + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.url | Should -Be "powerfgt.com" + $urlfilter.entries.type | Should -Be "simple" + $urlfilter.entries.action | Should -Be "allow" + $urlfilter.entries.status | Should -Be "disable" + } + + It "Try to Add URL Filter $pester_url1 (but there is already a object with same name)" { + #Add first URL Filter + Add-FGTWebfilterUrlfilter -name $pester_url1 -url_id 1 -url_type simple -url powerfgt.com -action allow -status enable + #Add Second URL Filter with same name + { Add-FGTWebfilterUrlfilter -name $pester_url1 -url_id 1 -url_type simple -url powerfgt.com -action allow -status enable } | Should -Throw "Already a URL profile object using the same name" + } + + It "Try to Add a second URL to Filter $pester_url1 " { + #Add first URL Filter + Add-FGTWebfilterUrlfilter -name $pester_url1 -url_id 1 -url_type simple -url powerfgt.com -action allow -status enable + #Add Second URL + { Add-FGTWebfilterUrlfilter -name $pester_url1 -url_id 2 -url_type simple -url powerfgt2.com -action allow -status enable } | Should -Not -Throw + } + + AfterEach { + Get-FGTWebfilterUrlfilter -name $pester_url1 | Remove-FGTWebfilterUrlfilter -confirm:$false + } + +} + +Describe "Set WebFilter UrlFilter" { + + BeforeAll { + Add-FGTWebfilterUrlfilter -name $pester_url1 -url_id 1 -url_type simple -url powerfgt.com -action allow -status enable + } + + It "Change URL Filter $pester_url1 comment" { + Get-FGTWebfilterUrlfilter -name $pester_url1 | Set-FGTWebfilterUrlfilter -comment "Changed by PowerFGT !" + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.comment | Should -Be "Changed by PowerFGT !" + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.url | Should -Be "powerfgt.com" + $urlfilter.entries.type | Should -Be "simple" + $urlfilter.entries.action | Should -Be "allow" + $urlfilter.entries.status | Should -Be "enable" + } + + It "Change URL Filter $pester_url1 type to wildcard" { + Get-FGTWebfilterUrlfilter -name $pester_url1 | Set-FGTWebfilterUrlfilter -url_id 1 -url_type wildcard -url "*powerfgt.com" + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.url | Should -Be "*powerfgt.com" + $urlfilter.entries.type | Should -Be "wildcard" + } + + It "Change URL Filter $pester_url1 type to regex" { + Get-FGTWebfilterUrlfilter -name $pester_url1 | Set-FGTWebfilterUrlfilter -url_id 1 -url_type regex -url "https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)" + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.url | Should -Be "https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)" + $urlfilter.entries.type | Should -Be "regex" + } + + It "Change URL Filter $pester_url1 type to simple" { + Get-FGTWebfilterUrlfilter -name $pester_url1 | Set-FGTWebfilterUrlfilter -url_id 1 -url_type simple -url powerfgt.com + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.url | Should -Be "powerfgt.com" + $urlfilter.entries.type | Should -Be "simple" + } + + It "Change URL Filter $pester_url1 to action block" { + Get-FGTWebfilterUrlfilter -name $pester_url1 | Set-FGTWebfilterUrlfilter -url_id 1 -action block + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.action | Should -Be "block" + } + + It "Change URL Filter $pester_url1 to action allow" { + Get-FGTWebfilterUrlfilter -name $pester_url1 | Set-FGTWebfilterUrlfilter -url_id 1 -action allow + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.action | Should -Be "allow" + } + + It "Change URL Filter $pester_url1 to action monitor" { + Get-FGTWebfilterUrlfilter -name $pester_url1 | Set-FGTWebfilterUrlfilter -url_id 1 -action monitor + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.action | Should -Be "monitor" + } + + It "Add URL Filter $pester_url1 to status disabled" { + Get-FGTWebfilterUrlfilter -name $pester_url1 | Set-FGTWebfilterUrlfilter -url_id 1 -status disable + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.status | Should -Be "disable" + } + + It "Change URL Filter $pester_url1 to status enabled" { + Get-FGTWebfilterUrlfilter -name $pester_url1 | Set-FGTWebfilterUrlfilter -url_id 1 -status enable + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.status | Should -Be "enable" + } + + It "Change URL Filter $pester_url1 URL" { + Get-FGTWebfilterUrlfilter -name $pester_url1 | Set-FGTWebfilterUrlfilter -url_id 1 -url powerfgt2.com + $urlfilter = Get-FGTWebfilterUrlfilter -name $pester_url1 + $urlfilter.name | Should -Be $pester_url1 + $urlfilter.entries.id | Should -Be 1 + $urlfilter.entries.url | Should -Be "powerfgt2.com" + $urlfilter.entries.type | Should -Be "simple" + } + + AfterEach { + Get-FGTWebfilterUrlfilter -name $pester_url1 | Remove-FGTWebfilterUrlfilter -confirm:$false + } + +} + +Describe "Remove Web Filter Url Filter" { + + BeforeAll { + Add-FGTWebfilterUrlfilter -name $pester_url1 -url_id 1 -url_type simple -url powerfgt.com -action allow -status enable + } + + It "Remove WebFilterURLFilter $pester_url1 by pipeline" { + $url = Get-FGTWebfilterUrlfilter -name $pester_url1 + $url | Remove-FGTFirewallAddress -confirm:$false + $url = Get-FGTWebfilterUrlfilter -name $pester_url1 + $url | Should -Be $NULL + } + + } + +} + +AfterAll { + Disconnect-FGT -confirm:$false +} \ No newline at end of file