SecretsManagementExtension/SecretsManagementExtension.psm1

# Licensed under the MIT License.

function Get-Secret
{
    param (
        [string]$Name,
        [hashtable]$AdditionalParameters
    )
        $where = $AdditionalParameters.secretserveruri
        $ws = New-WebServiceProxy -uri $where -Credential $AdditionalParameters.secretservercredential #-ErrorAction SilentlyContinue
        $wsResult = $ws.GetSecret([int]$name, $false, $null)
        [PSCredential]::new($wsResult.Secret.Items[1].value.ToString(), ($wsResult.Secret.Items[2].value.ToString()|ConvertTo-SecureString -AsPlainText -Force))       
}

function set-secret
{
    param (
        [string] $Name,
        [object] $Secret,
        [hashtable] $AdditionalParameters
    )
   
    $where =  $AdditionalParameters.secretserveruri
    $cred= $AdditionalParameters.secretservercredential
    $secretserverfolder=$AdditionalParameters.secretserverfolderid    
    if($secretserverfolder -eq $null){
        $secretserverfolder=44
    }
    $domain=$Name
    $templatename=$AdditionalParameters.secretservertemplate
    if($templatename -eq $null){
        $templatename= "Windows Account"
    }
        if($Secret -eq $null){
        throw "Secret can not be null."
    }
    elseif($secret -is [string]){
        throw "String is currently not supported"
    }
    elseif($secret -is [hashtable]){
        throw "String is currently not supported"
    }
    elseif ($secret -is [PSCredential]){
        $username = $Secret.username
        $password = $secret.GetNetworkCredential().password
    }    
    $ws = New-WebServiceProxy -uri $where -Credential $cred 
    # Get Template
    $template = $ws.GetSecretTemplates().SecretTemplates | Where {$_.Name -eq $templateName}
    # Set fields info
    $secretName = $domain + "-" + $UserName
    $secretItemFields = (($template.Fields | Where {$_.DisplayName -eq "Machine"}).Id, ($template.Fields | Where {$_.DisplayName -eq "Username"}).Id, ($template.Fields | Where {$_.DisplayName -eq "Password"}).Id, ($template.Fields | Where {$_.DisplayName -eq "Notes"}).Id)
    $secretItemValues=($domain,$UserName,$password, "")
    $folderId = $secretserverfolder
    # Add secret to secretserver.
    $addResult = $ws.AddSecret($template.Id, $secretName, $secretItemFields, $secretItemValues, $folderId)
    if($addResult.Errors.Count -gt 0){
        return $false
    }else{
        return $true
    }
}

function Remove-Secret
{
    param (
        [string] $Name,
        [hashtable] $AdditionalParameters
    )
    throw "Not implemented"
}

function Get-SecretInfo
{
    param(
        [string] $filter,
        [hashtable] $AdditionalParameters
    )
    if ([string]::IsNullOrEmpty($filter)) { $filter = "*" }
    $where =  $AdditionalParameters.secretserveruri
    $ws = New-WebServiceProxy -uri $where -Credential $AdditionalParameters.secretservercredential # -ErrorAction SilentlyContinue
    $hits=$ws.SearchSecrets($filter,$null,$null)
    $result=@()
    foreach($hit in $hits.SecretSummaries){
    $result+= ([pscustomobject] @{
        Name = $($hit.secretid.tostring())                                                                   
        Value  = $($hit.secretName.ToString())
        })
    }
    $result
}