Meca.Tools.WindowsVault.psm1

$dllPath = Join-Path -Path $PSScriptRoot -ChildPath "Microsoft.Windows.SDK.NET.dll"
Add-Type -Path $dllPath

function Add-VaultCredential {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]$Resource,

        [Parameter(Mandatory = $true, HelpMessage = "Username")]
        [string]$Username,

        [Parameter(Mandatory = $false)]
        [string]$Pass = $null
    )

    if ($null -eq $Pass) {
        $Password = Read-Host -MaskInput -Prompt "Password"
    }
    else {
        if (Test-Path $Pass) {
            $Password = (Get-Content -Path $Pass).Trim()
            Write-Host "Password loaded from pass file." -ForegroundColor Green
            return $cleanedPassword
        }
        else {
            Write-Error "Passfile doesn't exist: $FilePath"
            exit 1
        }
    }

    $vault = New-Object Windows.Security.Credentials.PasswordVault
    $credential = New-Object Windows.Security.Credentials.PasswordCredential(
        $Resource,
        $Username,
        $Password
    )

    try {
        $vault.Add($credential)
        Write-Output "Credential added successfully for resource: $Resource"
    }
    catch {
        Write-Error "Failed to add credential: $_"
    }
}

function Remove-VaultCredential {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]$Resource,

        [Parameter(Mandatory = $true, HelpMessage = "Username")]
        [string]$Username
    )

    $vault = New-Object Windows.Security.Credentials.PasswordVault

    $credentials = $vault.RetrieveAll() | Where-Object { $_.Resource -eq $Resource -and $_.UserName -eq $Username }

    if ($credentials.Count -eq 0) {
        Write-Error "No credentials found for resource: $Resource and username: $Username"
        return
    }

    foreach ($credential in $credentials) {
        try {
            $vault.Remove($credential)
            Write-Output "Credential removed successfully for resource: $Resource and username: $Username"
        }
        catch {
            Write-Error "Failed to remove credential: $_"
        }
    }
}

function Get-VaultCredential {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]$Resource,

        [Parameter(Mandatory = $false, HelpMessage = "Username")]
        [string]$Username = "defaultUser",

        [Parameter(Mandatory = $false)]
        [switch]$Plain
    )

    $vault = New-Object Windows.Security.Credentials.PasswordVault
    $credential = $vault.Retrieve($Resource, $Username)
    if ($Plain) {
        return $credential.Password
    }
    return $credential
}

Export-ModuleMember -Function Add-VaultCredential, Remove-VaultCredential, Get-VaultCredential