Public/get-ADFSTkFederationDefaults.ps1

function get-ADFSTkFederationDefaults
{
 [CmdletBinding()]
    param (
        $URL,
        [switch]$InstallDefaults,
        $ExtractionFilter ="ADFSToolkit/config/federation",
        [switch]$ClearCache,
        [switch]$Silent
    )

process 
{
    #Prepare to be able to use zip files
    Add-Type -assembly "system.io.compression.filesystem"

    #Get All paths and assert they exist
       
       if ([string]::IsNullOrEmpty($Global:ADFSTkPaths))
        {
         $Global:ADFSTkPaths = Get-ADFSTKPaths
        
        }   

    # setup our files
    $nowStamp=[DateTime]::Now.ToString("yyyyMMdd-HHmmss")
    $fedCacheFile="federationdefaults.zip"
    $fedCacheFileBackup="federationdefaults" +$nowStamp +".zip"
    $federationDirNameBackup="federation"+$nowStamp
 
    $federationConfigCacheFile=         Join-Path $Global:ADFSTkPaths.cacheDir $fedCacheFile
    $federationConfigCacheFileBackup=   Join-Path $Global:ADFSTkPaths.cacheDir $fedCacheFileBackup
    $federationConfigDirFullBackupPath= Join-Path $Global:ADFSTkPaths.mainBackupDir $federationDirNameBackup

# Begin processing the various states for default handling
#
#

if  ($PSBoundParameters.ContainsKey('ClearCache') -and ($ClearCache -ne $null) )
{

    If  ( ($PSBoundParameters.ContainsKey('InstallDefaults')) -or ($PSBoundParameters.ContainsKey('URL'))    )
    {
        #("ADFSToolkit: When used, ClearCache flag must be the only flag used. Nothing done, exiting ")
        Write-ADFSTkHost feddefaultsErrorFlags -Style Info
        return

    }else
    {
        #Write-Output ("ADFSToolkit: Removing cache file $federationConfigCacheFile")
        Write-ADFSTkHost feddefaultsErrorFlagsElse -f $federationConfigCacheFile -Style Info

        remove-item  $federationConfigCacheFile
        return

    }
}

# Use case A: no url, no config cache available
if ( ( $PSBoundParameters.ContainsKey('URL') -and ($URL -eq  $null) ) -and !(Test-Path ( $federationConfigCacheFile )  ) )
   
    {
        
            #Write-Output ("ADFSToolkit: Federation default behaviour expected with no extra federation settings.")
            Write-ADFSTkHost feddefaultsCaseNoURLNoCacheFile -Style info

        
            if ($InstallDefaults)
            {
             #Write-Output ("ADFSToolkit: InstallDefaults flag found but no defaults to apply, nothing changed, exiting.")
             Write-ADFSTkHost feddefaultsCaseInstallDefNothing -Style Info
            }


            return
        }
# Use case B: no url, config cache detected, tell user about it
elseif ( (  $PSBoundParameters.ContainsKey('URL') -and ($URL -eq  $null) ) -and (Test-Path ( $federationConfigCacheFile )  ) )
     {
        #Write-Output ("ADFSToolkit: Federation defaults in the cache are:")
        Write-ADFSTkHost feddefaultsCaseNoURLConfigCacheYesHeader -Style info

        Get-ChildItem $federationConfigCacheFile -Force | Select-Object FullName, CreationTime, LastAccessTime, LastWriteTime, Mode, Length

    }
#Use case C: URL is not null, and we have a file. If InstallDefaults specified make backup and deploy.
#
# Note that we are now using if statements for presence as the defaults could be on disk if fetched but not installed
#

if ( $PSBoundParameters.ContainsKey('URL') -and ($URL -ne $null)  )
{

    #Write-Output ("ADFSToolkit: Updating federation defaults on disk from: $URL")
    Write-ADFSTkHost feddefaultsCaseNoURLConfigCacheYesHeaderURLOK -f $URL -Style info

    # make backup
    If (Test-Path ( $federationConfigCacheFile ) )
    {
        #Write-Output ("ADFSToolkit: Backing up $fedConfigCacheFile to $fedConfigCacheFileBackup")
        Write-ADFSTkHost feddefaultsCaseNoURLConfigCacheYesHeaderBackingUp -f $fedConfigCacheFile,$fedConfigCacheFileBackup -Style Info
        Copy-item $federationConfigCacheFile -Destination $federationConfigCacheFileBackup
    }

    # Begin fetch file
    $start_time = Get-Date

    #Write-Output ("ADFSToolkit: Fetching $URL to $federationConfigCacheFile")
    Write-ADFSTkHost feddefaultsFetchBegin -f $URL, $federationConfigCacheFilev -Style info
    [System.Net.WebClient]::New().DownloadFile($URL, $federationConfigCacheFile)

    #Write-Output "ADFSToolkit: Time taken: $((Get-Date).Subtract($start_time).Seconds) second(s)"
    Write-ADFSTkHost feddefaultsTimeTaken -f $((Get-Date).Subtract($start_time).Seconds) -Style info

    Get-ChildItem $federationConfigCacheFile -Force | Select-Object FullName, CreationTime, LastAccessTime, LastWriteTime, Mode, Length

    # interrogate the file we just fetched
    #Write-Output ("ADFSToolkit: contents of Federation Cache file: $federationConfigCacheFile :")
      Write-ADFSTkHost feddefaultsContents  -f $federationConfigCacheFile -Style Info
    

    $zip = [io.compression.zipfile]::OpenRead($federationConfigCacheFile)
    
    $zip.Entries|where-object {$_.FullName -match $ExtractionFilter }|Select-object FullName -ExpandProperty "FullName"
    $zip.Dispose()

}

    # deploy configuration that's on disk
    if ( ( $PSBoundParameters.ContainsKey('InstallDefaults')  -and ($InstallDefaults -ne $null) )   -and (Test-Path ( $federationConfigCacheFile ) )  )
    {

        #Write-Output ("ADFSToolkit: Installing federation defaults from: $federationConfigCacheFile ...")
        Write-ADFSTkHost feddefaultsInstalling -f $federationConfigCacheFile -style info

        $zip = [io.compression.zipfile]::OpenRead($federationConfigCacheFile)
        $unzippedDirName=($zip.Entries[0]).FullName
        $unzippedFullNameDir=Join-Path (Join-path $Global:ADFSTkPaths.cacheDir $unzippedDirName) $ExtractionFilter

        #backup previous federation-settings
        move-item  -Path $Global:ADFSTkPaths.federationDir -Destination $federationConfigDirFullBackupPath
        # Get-ChildItem $Global:ADFSTkPaths.federationDir -Exclude backup,federations.xml | Move-Item $_.fullName $Global:ADFSTkPaths.federationBackupDir

        Expand-Archive -Path $federationConfigCacheFile -DestinationPath $Global:ADFSTkPaths.cacheDir -Force

        copy-item $unzippedFullNameDir  $Global:ADFSTkPaths.federationDir -Recurse

        $zip.Dispose()

        # persist url in ADFSTkFederationSettings
        # verify URL exists, then persist
        if ( ( $PSBoundParameters.ContainsKey('URL') -and ($URL -ne $null) ) -and ($Global:ADFSTkPaths.mainConfigFile -ne $null) )
        {

            [xml]$config = Get-Content $Global:ADFSTkPaths.mainConfigFile
            $config.Configuration.FederationConfig.Federation.URL= $URL
            $config.Save( $Global:ADFSTkPaths.mainConfigFile)
        }


        #Write-Output ("ADFSToolkit: Done. Next time a new aggregate is configured, defaults will be used. Existing configurations should remain unchanged")
        Write-ADFSTkHost     feddefaultsUnchanged -Style Info
    }
     else
    {
        Write-Output " "
        #Write-Output "ADFSToolkit: Federation defaults not installed into ADFSToolkit. Specify -InstallDefaults to apply them."
        Write-ADFSTkHost     feddefaultsNotInstalled -Style Info
    }


    return

    

    Write-ADFSTkHost feddefaultsAllDone -Style Info


}


}

<#
.SYNOPSIS
   show,fetch, and install federation defaults zip bundle to augment ADFSToolkit behaviour
    
.DESCRIPTION
   show,fetch, and install federation defaults zip bundle.
   ADFSToolkit will use default behaviour otherwise
.EXAMPLE
get-ADFSTkFederationDefaults
.EXAMPLE
get-ADFSTkFederationDefaults -URL https://someurl/fed.zip
.EXAMPLE
get-ADFSTkFederationDefaults -InstallDefaults -URL https://someurl/fed.zip
 
#>

# SIG # Begin signature block
# MIIRbgYJKoZIhvcNAQcCoIIRXzCCEVsCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUOOBN7vIUwfsUbYU7r7Zdj/M1
# Gieggg51MIIEfTCCA2WgAwIBAgIDG+cVMA0GCSqGSIb3DQEBCwUAMGMxCzAJBgNV
# BAYTAlVTMSEwHwYDVQQKExhUaGUgR28gRGFkZHkgR3JvdXAsIEluYy4xMTAvBgNV
# BAsTKEdvIERhZGR5IENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcN
# MTQwMTAxMDcwMDAwWhcNMzEwNTMwMDcwMDAwWjCBgzELMAkGA1UEBhMCVVMxEDAO
# BgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdv
# RGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmlj
# YXRlIEF1dGhvcml0eSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
# AQEAv3FiCPH6WTT3G8kYo/eASVjpIoMTpsUgQwE7hPHmhUmfJ+r2hBtOoLTbcJjH
# MgGxBT4HTu70+k8vWTAi56sZVmvigAf88xZ1gDlRe+X5NbZ0TqmNghPktj+pA4P6
# or6KFWp/3gvDthkUBcrqw6gElDtGfDIN8wBmIsiNaW02jBEYt9OyHGC0OPoCjM7T
# 3UYH3go+6118yHz7sCtTpJJiaVElBWEaRIGMLKlDliPfrDqBmg4pxRyp6V0etp6e
# MAo5zvGIgPtLXcwy7IViQyU0AlYnAZG0O3AqP26x6JyIAX2f1PnbU21gnb8s51ir
# uF9G/M7EGwM8CetJMVxpRrPgRwIDAQABo4IBFzCCARMwDwYDVR0TAQH/BAUwAwEB
# /zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9BUFuIMGU2g/e
# MB8GA1UdIwQYMBaAFNLEsNKR1EwRcbNhyz2h/t2oatTjMDQGCCsGAQUFBwEBBCgw
# JjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZ29kYWRkeS5jb20vMDIGA1UdHwQr
# MCkwJ6AloCOGIWh0dHA6Ly9jcmwuZ29kYWRkeS5jb20vZ2Ryb290LmNybDBGBgNV
# HSAEPzA9MDsGBFUdIAAwMzAxBggrBgEFBQcCARYlaHR0cHM6Ly9jZXJ0cy5nb2Rh
# ZGR5LmNvbS9yZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAWQtTvZKGEack
# e+1bMc8dH2xwxbhuvk679r6XUOEwf7ooXGKUwuN+M/f7QnaF25UcjCJYdQkMiGVn
# OQoWCcWgOJekxSOTP7QYpgEGRJHjp2kntFolfzq3Ms3dhP8qOCkzpN1nsoX+oYgg
# HFCJyNwq9kIDN0zmiN/VryTyscPfzLXs4Jlet0lUIDyUGAzHHFIYSaRt4bNYC8nY
# 7NmuHDKOKHAN4v6mF56ED71XcLNa6R+ghlO773z/aQvgSMO3kwvIClTErF0UZzds
# yqUvMQg3qm5vjLyb4lddJIGvl5echK1srDdMZvNhkREg5L4wn3qkKQmw4TRfZHcY
# QFHfjDCmrzCCBNAwggO4oAMCAQICAQcwDQYJKoZIhvcNAQELBQAwgYMxCzAJBgNV
# BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRow
# GAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UEAxMoR28gRGFkZHkgUm9v
# dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjAeFw0xMTA1MDMwNzAwMDBaFw0z
# MTA1MDMwNzAwMDBaMIG0MQswCQYDVQQGEwJVUzEQMA4GA1UECBMHQXJpem9uYTET
# MBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5jb20sIEluYy4x
# LTArBgNVBAsTJGh0dHA6Ly9jZXJ0cy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5LzEz
# MDEGA1UEAxMqR28gRGFkZHkgU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eSAt
# IEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAueDLENSvdr3Uk2Lr
# MGS4gQhswwTZYheOL/8+Zc+PzmLmPFIc2hZFS1WreGtjg2KQzg9pbJnIGhSLTMxF
# M+qI3J6jryv+gGGdeVfEzy70PzA8XUf8mha8wzeWQVGOEUtU+Ci+0Iy+8DA4HvOw
# JvhmR2Nt3nEmR484R1PRRh2049wA6kWsvbxx2apvANvbzTA6eU9fTEf4He9bwsSd
# YDuxskOR2KQzTuqz1idPrSWKpcb01dCmrnQFZFeItURV1C0qOj74uL3pMgoClGTE
# FjpQ8Uqu53kzrwwgB3/o3wQ5wmkCbGNS+nfBG8h0h8i5kxhQVDVLaU68O9NJLh/c
# wdJS+wIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
# AQYwHQYDVR0OBBYEFEDCvSeOzDSDMKIz1/tss/C0LIDOMB8GA1UdIwQYMBaAFDqa
# hQcQZyi27/a9BUFuIMGU2g/eMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYY
# aHR0cDovL29jc3AuZ29kYWRkeS5jb20vMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6
# Ly9jcmwuZ29kYWRkeS5jb20vZ2Ryb290LWcyLmNybDBGBgNVHSAEPzA9MDsGBFUd
# IAAwMzAxBggrBgEFBQcCARYlaHR0cHM6Ly9jZXJ0cy5nb2RhZGR5LmNvbS9yZXBv
# c2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEACH5skxDIOLiWqZBL/6FfTwTvbD6c
# iAbJUI+mc/dXMRu+vOQv2/i601vgtOfmeWIODKLXamNzMbX1qEikOwgtol2Q17R8
# JU8RVjDEtkSdeyyd5V7m7wxhqr/kKhvuhJ64g33BQ85EpxNwDZEf9MgTrYNg2dhy
# qHMkHrWsIg7KF4liWEQbq4klAQAPzcQbYttRtNMPUSqb9Lxz/HbONqTN2dgs6q6b
# 9SqykNFNdRiKP4pBkCN9W0v+pANYm0ayw2Bgg/h9UEHOwqGQw7vvAi/SFVTuRBXZ
# Cq6nijPtsS12NibcBOuf92EfFdyHb+5GliitoSZ9CgmnLgSjjbz4vAQwATCCBRww
# ggQEoAMCAQICCDeMqUwECkf0MA0GCSqGSIb3DQEBCwUAMIG0MQswCQYDVQQGEwJV
# UzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UE
# ChMRR29EYWRkeS5jb20sIEluYy4xLTArBgNVBAsTJGh0dHA6Ly9jZXJ0cy5nb2Rh
# ZGR5LmNvbS9yZXBvc2l0b3J5LzEzMDEGA1UEAxMqR28gRGFkZHkgU2VjdXJlIENl
# cnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTIwMDEwODExMjIyNFoXDTIxMDMw
# ODE4NTgwMFowXjELMAkGA1UEBhMCQ0ExEDAOBgNVBAgTB09udGFyaW8xDzANBgNV
# BAcTBk90dGF3YTEVMBMGA1UEChMMQ0FOQVJJRSBJbmMuMRUwEwYDVQQDEwxDQU5B
# UklFIEluYy4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZhfCjFqiT
# mN1uLoySixnwaOjf/ZAL9P6SvjlCaBA2mutoorEgnzUP8HnOIcvMRgEMPmpaZ8eg
# M93Bmx9d41xoarsQpCN3DhYOo+b3fWnPucVtpxbul2OFePv63mw/uvr+dqkv4b/f
# 3Tg+ilQbpsNonbvh9MKEFv8Pn9koj0ySV+qxz34PxTVAe6g//pel3/3i9fqilCnI
# Ecx4zg/+NKBeOWROSs4oXo3IvBjVrunmz+YuieSr78TqIE6hD8JF2q1wKwfMB3+x
# 7dEXZAus9WtIU/qITATtEfO9QAgrrYL4F1MLN+osSp8my5eCOjnLTQc47q574V3z
# QhsIHW7yBXLdAgMBAAGjggGFMIIBgTAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoG
# CCsGAQUFBwMDMA4GA1UdDwEB/wQEAwIHgDA1BgNVHR8ELjAsMCqgKKAmhiRodHRw
# Oi8vY3JsLmdvZGFkZHkuY29tL2dkaWcyczUtNS5jcmwwXQYDVR0gBFYwVDBIBgtg
# hkgBhv1tAQcXAjA5MDcGCCsGAQUFBwIBFitodHRwOi8vY2VydGlmaWNhdGVzLmdv
# ZGFkZHkuY29tL3JlcG9zaXRvcnkvMAgGBmeBDAEEATB2BggrBgEFBQcBAQRqMGgw
# JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmdvZGFkZHkuY29tLzBABggrBgEFBQcw
# AoY0aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5L2dk
# aWcyLmNydDAfBgNVHSMEGDAWgBRAwr0njsw0gzCiM9f7bLPwtCyAzjAdBgNVHQ4E
# FgQUUPnMg2nmYS8l7rmax3weVkrgz5AwDQYJKoZIhvcNAQELBQADggEBAIYabiAR
# aY4KhO6oWgNHPOBjoHuqUH7NwRGN/ztYJznRBZbdD50smoK5GR0FvUZ8TXhYoZOa
# zXe4NlFM4e6YcudU+EA/OF+sZHFBWziz1VS6U3sS+cGyJcxvelSoid0q3W3i9/Zy
# 6Nv2kk/DEJp49O47mPNovpL15yykX3Vo26GwC9peo4s/cKMzthmgrcF2uLkT+LW4
# 4xKhaL7nBTGDMhjno+a3t00SWCId7wzgQadIJ1QlFOKm0xgmuiW3LIqCG0apvaOf
# vWKTPKq68q+FbDPOO48oKrvw1c9K/m8gcnBLz6PX1REVIs5u3pvdOYBCz6uXyKxn
# t+Q5jDEK0NskLu0xggJjMIICXwIBATCBwTCBtDELMAkGA1UEBhMCVVMxEDAOBgNV
# BAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFk
# ZHkuY29tLCBJbmMuMS0wKwYDVQQLEyRodHRwOi8vY2VydHMuZ29kYWRkeS5jb20v
# cmVwb3NpdG9yeS8xMzAxBgNVBAMTKkdvIERhZGR5IFNlY3VyZSBDZXJ0aWZpY2F0
# ZSBBdXRob3JpdHkgLSBHMgIIN4ypTAQKR/QwCQYFKw4DAhoFAKB4MBgGCisGAQQB
# gjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYK
# KwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFA4FRXe7
# 6gN1XleQM2wNxi4nlfjlMA0GCSqGSIb3DQEBAQUABIIBALW5gCoJ5rPvrmXSk9WG
# 6V2mxpAeK9SEG73zChLYq0GQGB2PZrB6ukNIKoPw5bLCeskARx1dPqy4w8+hUSof
# B/TtdDsehecEUv2EdnKkwRHy4SBcih9RiEo775bIHKwWSw/80LB9QdWLZpMKjbzj
# EhJ4YKTl08KWHjSherTnn0qnI8NJQ9KyQ14ndawwf3+DekPDBgHT/Y0yBYL8hr8W
# +i5rNaOpE5TufGK2krrUUKDWS2WeJVlx02Ria82PCSfyu2GvBnTCyUX0IGy97vLQ
# tHQnaeJHrOLdHaYCPww3GKxeODB2hYPkVFXXf5c73LEjdYruGYV64DaTG54zfKJZ
# sd4=
# SIG # End signature block