lib/Credentials.ps1


## TM Credentials
Function Get-TMCredential {
    param(
        [Parameter(Mandatory = $false)][String]$TMSession = "Default",
        [Parameter(Mandatory = $false)][String]$Name,
        [Parameter(Mandatory = $false)][String]$Server = $global:TMSessions[$TMSession].TMServer,
        [Parameter(Mandatory = $false)][Switch]$ResetIDs

    )
    ## Get Session Configuration
    $TMSessionConfig = $global:TMSessions[$TMSession]
    if (-not $TMSessionConfig) {
        Write-Host 'TMSession: [' -NoNewline
        Write-Host $TMSession -ForegroundColor Cyan
        Write-Host '] was not Found. Please use the New-TMSession command.'
        Throw "TM Session Not Found. Use New-TMSession command before using features."
    }

    #Honor SSL Settings
    if ($TMSessionConfig.AllowInsecureSSL) {
        $TMCertSettings = @{SkipCertificateCheck = $true }
    } else { 
        $TMCertSettings = @{SkipCertificateCheck = $false }
    }

    $instance = $Server.Replace('/tdstm', '')
    $instance = $instance.Replace('https://', '')
    $instance = $instance.Replace('http://', '')
    
    $uri = "https://"
    $uri += $instance
    $uri += '/tdstm/ws/credential'

    try {
        $response = Invoke-WebRequest -Method Get -Uri $uri -WebSession $TMSessionConfig.TMWebSession @TMCertSettings
    } catch {
        return $_
    }

    if ($response.StatusCode -eq 200) {
        $Result = ($response.Content | ConvertFrom-Json).data
    } else {
        return "Unable to collect Credentials."
    }

    
    ## Reset IDs
    if ($ResetIDs) {
        for ($i = 0; $i -lt $Result.Count; $i++) {
            $Result[$i].id = $null
            $Result[$i].project.id = $null
            $Result[$i].provider.id = $null
            $Result[$i].authenticationUrl = 'localhost'
        }
    }

    ## Return the matching one by name, if provided
    if ($Name) {
        $MatchingResult = $Result | Where-Object { $_.name -eq $Name }
        if ($MatchingResult) {
            return $MatchingResult
        } else {
            return $Result
        }
    }
}

Function New-TMCredential {
    param(
        [Parameter(Mandatory = $false)][String]$TMSession = "Default",
        [Parameter(Mandatory = $true)][PSObject]$TMCredential,
        [Parameter(Mandatory = $false)][String]$Server = $global:TMSessions[$TMSession].TMServer,
        [Parameter(Mandatory = $false)]$AllowInsecureSSL = $global:TMSessions[$TMSession].AllowInsecureSSL,
        [Parameter(Mandatory = $false)][PSObject]$Project
    )
    
    if ($global:TMSessions[$TMSession].TMVersion -like '4.7*') {
        New-TMCredential47 @PSBoundParameters

    } else {
        New-TMCredential46 @PSBoundParameters
    }
}

Function New-TMCredential46 {
    param(
        [Parameter(Mandatory = $false)][String]$TMSession = "Default",
        [Parameter(Mandatory = $true)][PSObject]$TMCredential,
        [Parameter(Mandatory = $false)][String]$Server = $global:TMSessions[$TMSession].TMServer,
        [Parameter(Mandatory = $false)]$AllowInsecureSSL = $global:TMSessions[$TMSession].AllowInsecureSSL,
        [Parameter(Mandatory = $false)][PSObject]$Project
    )    
    ## Get Session Configuration
    $TMSessionConfig = $global:TMSessions[$TMSession]
    if (-not $TMSessionConfig) {
        Write-Host 'TMSession: [' -NoNewline
        Write-Host $TMSession -ForegroundColor Cyan
        Write-Host '] was not Found. Please use the New-TMSession command.'
        Throw "TM Session Not Found. Use New-TMSession command before using features."
    }

    #Honor SSL Settings
    if ($TMSessionConfig.AllowInsecureSSL) {
        $TMCertSettings = @{SkipCertificateCheck = $true }
    } else { 
        $TMCertSettings = @{SkipCertificateCheck = $false }
    }

    # Write-Host "Creating Credential: "$TMCredential.name

    ## Check for existing credential
    $TMCredentialCheck = Get-TMCredential -Name $TMCredential.name -TMSession $TMSession
    if ($TMCredentialCheck) {
        if ($PassThru) {
            return $TMCredentialCheck
        } else { return $true }
    } else {

        ## No Credential exists. Create it
        $instance = $Server.Replace('/tdstm', '')
        $instance = $instance.Replace('https://', '')
        $instance = $instance.Replace('http://', '')
    
        $uri = "https://"
        $uri += $instance
        $uri += '/tdstm/ws/credential'

        ## Lookup Cross References
        if ($Project) {
            $ProjectID = $Project.id
            $TMCredential.project.name = $Project.Name
        } else {
            $ProjectID = ($Projects | Where-Object { $_.name -eq $TMCredential.project.name }).id
        }
        $ProviderID = ($Providers | Where-Object { $_.name -eq $TMCredential.provider.name }).id

        ## Fix up the object
        $TMCredential.PSObject.properties.Remove('id')
        $TMCredential.project.id = $ProjectID
        $TMCredential.provider.id = $ProviderID
        $TMCredential.version = 1
        $TMCredential | Add-Member -NotePropertyName 'password' -NotePropertyValue 'tmemptypassword'
        $PostBodyJSON = $TMCredential | ConvertTo-Json -Depth 100

        Set-TMHeaderAccept "JSON" -TMSession $TMSession
        Set-TMHeaderContentType "JSON" -TMSession $TMSession

        $response = Invoke-WebRequest -Method Post -Uri $uri -WebSession $TMSessionConfig.TMWebSession -Body $PostBodyJSON @TMCertSettings
        if ($response.StatusCode -eq 200) {
            $responseContent = $response.Content | ConvertFrom-Json
            if ($responseContent.status -eq "success") {
                return $responseContent.data
            }    
        }
    }
}
Function New-TMCredential47 {
    param(
        [Parameter(Mandatory = $false)][String]$TMSession = "Default",
        [Parameter(Mandatory = $true)][PSObject]$TMCredential,
        [Parameter(Mandatory = $false)][String]$Server = $global:TMSessions[$TMSession].TMServer,
        [Parameter(Mandatory = $false)]$AllowInsecureSSL = $global:TMSessions[$TMSession].AllowInsecureSSL,
        [Parameter(Mandatory = $false)][int]$ProjectId = $global:TMSessions[$TMSession].UserContext.project.id
    )    
    ## Get Session Configuration
    $TMSessionConfig = $global:TMSessions[$TMSession]
    if (-not $TMSessionConfig) {
        Write-Host 'TMSession: [' -NoNewline
        Write-Host $TMSession -ForegroundColor Cyan
        Write-Host '] was not Found. Please use the New-TMSession command.'
        Throw "TM Session Not Found. Use New-TMSession command before using features."
    }

    #Honor SSL Settings
    if ($TMSessionConfig.AllowInsecureSSL) {
        $TMCertSettings = @{SkipCertificateCheck = $true }
    } else { 
        $TMCertSettings = @{SkipCertificateCheck = $false }
    }

    # Write-Host "Creating Credential: "$TMCredential.name

    ## Check for existing credential
    $TMCredentialCheck = Get-TMCredential -Name $TMCredential.name -TMSession $TMSession
    if ($TMCredentialCheck) {
        return $TMCredentialCheck
    } else {

        ## Provider Reference will be required
        $Providers = Get-TMProvider -TMSession $TMSession

        ## No Credential exists. Create it
        $instance = $Server.Replace('/tdstm', '')
        $instance = $instance.Replace('https://', '')
        $instance = $instance.Replace('http://', '')
    
        $uri = "https://"
        $uri += $instance
        $uri += '/tdstm/ws/credential'

        ## Get the Provider ID from the newly created providers list
        $ProviderID = ($Providers | Where-Object { $_.name -eq $TMCredential.provider.name }).id

        ## Fix up the object
        $TMCredential.PSObject.properties.Remove('id')
        $TMCredential.project.id = $ProjectID
        $TMCredential.provider.id = $ProviderID
        $TMCredential.version = 1
        $TMCredential | Add-Member -NotePropertyName 'password' -NotePropertyValue 'tmemptypassword'
        $PostBodyJSON = $TMCredential | ConvertTo-Json -Depth 100

        Set-TMHeaderAccept "JSON" -TMSession $TMSession
        Set-TMHeaderContentType "JSON" -TMSession $TMSession

        $response = Invoke-WebRequest -Method Post -Uri $uri -WebSession $TMSessionConfig.TMWebSession -Body $PostBodyJSON @TMCertSettings
        if ($response.StatusCode -eq 200) {
            $responseContent = $response.Content | ConvertFrom-Json
            if ($responseContent.status -eq "success") {
                if ($PassThru) {
                    return $responseContent.data
                }
            }    
        } elseif ($response.StatusCode -eq 204) {
            return
        }
    }
}