SecretManagement.Keeper.Extension/SecretManagement.Keeper.Extension.psm1

function Get-Config {
    param (
        [string] $LocalVaultName
    )
    $vaults = Microsoft.Powershell.SecretManagement\Get-SecretVault
    $localVault = $vaults.Where( { $_.Name -eq $LocalVaultName } )
    if (!$localVault) {
        return $null
    }
    $moduleInstance = Import-Module -Name $localVault.ModuleName -PassThru
    $configSecretName = 'KeeperVault.' + $VaultName
    $config = & $moduleInstance Get-Secret -Name $configSecretName -VaultName $localVault.Name
    if ($config -isnot [Hashtable]) { 
        $config = $config[0] # SecretStore returns a List
    }
    return $config
}

function Get-Secret {
    [CmdletBinding()]
    param (
        [string] $Name,
        [string] $VaultName,
        [hashtable] $AdditionalParameters
    )
    $config = Get-Config -LocalVaultName $AdditionalParameters.LocalVaultName
    if (!$config) {
        Write-Error "Unable to find configuration Vault $($AdditionalParameters.LocalVaultName) for Keeper Vault $($VaultName)"
        return $null
    }
    return [SecretManagement.Keeper.Client]::GetSecret($Name, $config).GetAwaiter().GetResult()
}

function Get-SecretInfo {
    [CmdletBinding()]
    param (
        [string] $Filter,
        [string] $VaultName,
        [hashtable] $AdditionalParameters
    )
    $config = Get-Config -LocalVaultName $AdditionalParameters.LocalVaultName
    if (!$config) {
        Write-Error "Unable to find configuration Vault $($AdditionalParameters.LocalVaultName) for Keeper Vault $($VaultName)"
        return $null
    }

    $secrets = [SecretManagement.Keeper.Client]::GetSecretsInfo($Filter, $config).GetAwaiter().GetResult()

    $secretsInfo = New-Object System.Collections.Generic.List[System.Object]
    foreach ($secret in $secrets) {
        $secretsInfo.Add([Microsoft.PowerShell.SecretManagement.SecretInformation]::new($secret, "Hashtable", $VaultName, $Metadata))                  
    }
    return $secretsInfo
}

function Set-Secret {
    [CmdletBinding()]
    param (
        [string] $Name,
        [object] $Secret,
        [string] $VaultName,
        [hashtable] $AdditionalParameters
    )
    
    $config = Get-Config -LocalVaultName $AdditionalParameters.LocalVaultName
    if (!$config) {
        Write-Error "Unable to find configuration Vault $($AdditionalParameters.LocalVaultName) for Keeper Vault $($VaultName)"
        return $null
    }

    $result = [SecretManagement.Keeper.Client]::SetSecret($Name, $Secret, $config).GetAwaiter().GetResult()
    if ($result.IsFailure) {
        Write-Error $result.ErrorMessage
        return
    }
}


function Remove-Secret {
    [CmdletBinding()]
    param (
        [string] $Name,
        [string] $VaultName,
        [hashtable] $AdditionalParameters
    )

    if ($Name -eq "ALL") {
        $vaults = Microsoft.Powershell.SecretManagement\Get-SecretVault
        $localVault = $vaults.Where( { $_.Name -eq $AdditionalParameters.LocalVaultName } )
        if ($localVault) {
            $moduleInstance = Import-Module -Name $localVault.ModuleName -PassThru
            $configSecretName = 'KeeperVault.' + $VaultName
            & $moduleInstance Remove-Secret -Name $configSecretName -VaultName $localVault.Name
        }
        $moduleInstance = Import-Module -Name Microsoft.PowerShell.SecretManagement -PassThru
        Microsoft.PowerShell.SecretManagement\Unregister-SecretVault -Name $VaultName
        Write-Host "Keeper Vault $($Name) has been removed"
        return
    }
    
    Write-Error "Remove-Secret is not supported for Keeper Vault"
}

function Test-SecretVault {
    [CmdletBinding()]
    param (
        [string] $VaultName,
        [hashtable] $AdditionalParameters
    )
    
    $config = Get-Config -LocalVaultName $AdditionalParameters.LocalVaultName
    if (!$config) {
        Write-Error "Unable to find configuration Vault $($AdditionalParameters.LocalVaultName) for Keeper Vault $($VaultName)"
        return $null
    }

    return [SecretManagement.Keeper.Client]::TestVault($config).GetAwaiter().GetResult()
}