Public/Request-TokenRefresh.ps1

function Request-TokenRefresh {
    [CmdletBinding()]
    param (
        # TODO put settingsfile and tokenfile into parameters?
         [Parameter(Mandatory=$true)][String]$SettingsFile
        ,[Parameter(Mandatory=$true)][String]$NewAccessToken
        ,[Parameter(Mandatory=$false)][String]$NewRefreshToken = ""
        ,[Parameter(Mandatory=$false)][Switch]$BackupPreviousFile = $false
    )

    begin {

        If ( $NewAccessToken -eq $null ) {
            throw "Accesstoken is null"
        } else {
            If ( $NewAccessToken.Trim().Length -eq 0 ) {
                throw "Accesstoken has no length"
            }
        }

    }

    process {

        #-----------------------------------------------
        # SET LOGFILE
        #-----------------------------------------------

        # Set log file here, otherwise it could interrupt the process when launched headless from .net in System32
        Set-Logfile -Path "./psoauth.log"


        #-----------------------------------------------
        # EXCHANGE THE TOKEN
        #-----------------------------------------------

        # Read the settingsfile
        $set = Get-Content -Path $SettingsFile -Encoding utf8 -Raw | ConvertFrom-Json

        # Encrypt tokens, if wished
        $refreshToken = ""
        If ( $EncryptToken -eq $true) {
            $accessToken = Get-PlaintextToSecure $NewAccessToken
            If ( $NewRefreshToken -ne "" ) {
                $refreshToken = Get-PlaintextToSecure $NewRefreshToken
                $set.refreshtoken = $refreshToken
            }
        } else {
            $accessToken = $NewAccessToken
            If ( $NewRefreshToken -ne "" ) {
                $refreshToken = $NewRefreshToken
                $set.refreshtoken = $refreshToken
            }
        }

        # The changed settings to save for refreshing
        $set.accesstoken = $accessToken
        $set.unixtime = Get-Unixtime

        # create json object
        $json = ConvertTo-Json -InputObject $set -Depth 99 # -compress

        # TODO implement PSNotify here for email notifications


        #-----------------------------------------------
        # SAVING TO FILE
        #-----------------------------------------------

        # rename settings file if it already exists
        If ( $BackupPreviousFile -eq $true ) {
            If ( Test-Path -Path $SettingsFile ) {
                $backupPath = "$( $SettingsFile ).$( $timestamp.ToString("yyyyMMddHHmmss") )"
                Write-Log -message "Moving previous settings file to $( $backupPath )" -severity ( [Logseverity]::WARNING )
                Move-Item -Path $SettingsFile -Destination $backupPath
            } else {
                Write-Log -message "There was no settings file existing yet"
            }
        }

        # print settings to console
        #$json

        # save settings to file
        $json | Set-Content -path $SettingsFile -Encoding UTF8 -Force


        #-----------------------------------------------
        # SAVE THE TOKENS AS SEPARATE FILE UNENCRYPTED
        #-----------------------------------------------

        If ( $set.saveSeparateTokenFile -eq $true ) {
            Write-Log -message "Saving token to '$( $set.tokenFile )'"
            $NewAccessToken | Set-Content -path "$( $set.tokenFile )" -Encoding UTF8 -Force
        }


    }

    end {

    }

}