diff --git a/.gitignore b/.gitignore index 23b12a9..126777e 100644 --- a/.gitignore +++ b/.gitignore @@ -39,5 +39,3 @@ CLAUDE.md extra .direnv .claude -e2e-test/*tfstate* -e2e-test/.terraformrc diff --git a/GNUmakefile b/GNUmakefile index df4f989..e339a0a 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -21,15 +21,4 @@ test: testacc: TF_ACC=1 go test -v -cover -timeout 120m ./... -e2e: - @echo "Running end-to-end test..." - cd e2e-test && \ - rm -rf .terraform/ .terraform.lock.hcl terraform.tfstate* && \ - ./setup-dev.sh && \ - TF_CLI_CONFIG_FILE=.terraformrc terraform plan && \ - TF_CLI_CONFIG_FILE=.terraformrc terraform apply -auto-approve && \ - echo "✓ E2E test passed! Cleaning up..." && \ - TF_CLI_CONFIG_FILE=.terraformrc terraform destroy -auto-approve && \ - echo "✓ E2E test completed successfully" - -.PHONY: fmt lint test testacc build install generate e2e +.PHONY: fmt lint test testacc build install generate diff --git a/docs/data-sources/obfs4_bridge_line.md b/docs/data-sources/obfs4_bridge_line.md index 9b2b5c5..49777cf 100644 --- a/docs/data-sources/obfs4_bridge_line.md +++ b/docs/data-sources/obfs4_bridge_line.md @@ -13,6 +13,9 @@ Generates a complete Tor bridge line using obfs4 state and network details ## Example Usage ```terraform +# Copyright (c) Abel Luck +# SPDX-License-Identifier: GPL-3.0-or-later + terraform { required_providers { tor = { diff --git a/docs/index.md b/docs/index.md index 22036bb..22d0753 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,6 +13,9 @@ The Tor provider generates cryptographic identity materials for obfs4 Tor bridge ## Example Usage ```terraform +# Copyright (c) Abel Luck +# SPDX-License-Identifier: GPL-3.0-or-later + terraform { required_providers { tor = { diff --git a/docs/resources/obfs4_state.md b/docs/resources/obfs4_state.md index 068ca9c..2d83ea5 100644 --- a/docs/resources/obfs4_state.md +++ b/docs/resources/obfs4_state.md @@ -13,6 +13,9 @@ Generates obfs4 state and certificate for Tor bridges using external relay ident ## Example Usage ```terraform +# Copyright (c) Abel Luck +# SPDX-License-Identifier: GPL-3.0-or-later + terraform { required_providers { tor = { @@ -24,7 +27,9 @@ terraform { provider "tor" {} # Example: Generate obfs4 state using existing identity keys -resource "tor_relay_identity_rsa" "bridge" {} +resource "tor_relay_identity_rsa" "bridge" { + key_size = 2048 +} resource "tor_relay_identity_ed25519" "bridge" {} diff --git a/docs/resources/relay_identity_ed25519.md b/docs/resources/relay_identity_ed25519.md index b1662d9..2f3c9a3 100644 --- a/docs/resources/relay_identity_ed25519.md +++ b/docs/resources/relay_identity_ed25519.md @@ -13,6 +13,9 @@ Generates Ed25519 private key for Tor relay identity as required by the Tor spec ## Example Usage ```terraform +# Copyright (c) Abel Luck +# SPDX-License-Identifier: GPL-3.0-or-later + terraform { required_providers { tor = { @@ -37,6 +40,10 @@ output "public_key_pem" { value = tor_relay_identity_ed25519.example.public_key_pem } +output "public_key_fingerprint_sha1" { + description = "SHA1 fingerprint of the Ed25519 public key" + value = tor_relay_identity_ed25519.example.public_key_fingerprint_sha1 +} output "public_key_fingerprint_sha256" { description = "SHA256 fingerprint of the Ed25519 public key" diff --git a/docs/resources/relay_identity_rsa.md b/docs/resources/relay_identity_rsa.md index b67920d..3b4a271 100644 --- a/docs/resources/relay_identity_rsa.md +++ b/docs/resources/relay_identity_rsa.md @@ -27,7 +27,9 @@ terraform { provider "tor" {} # Example: Generate RSA identity key for Tor relay -resource "tor_relay_identity_rsa" "example" {} +resource "tor_relay_identity_rsa" "example" { + key_size = 2048 # Default RSA key size for Tor relays +} output "private_key_pem" { description = "RSA private key in PEM format" diff --git a/e2e-test/README.md b/e2e-test/README.md deleted file mode 100644 index 01c17d1..0000000 --- a/e2e-test/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# End-to-End Testing - -This directory contains a complete end-to-end test setup for the terraform-provider-tor. - -## Quick Start - -1. **Setup development environment:** - ```bash - ./setup-dev.sh - ``` - This script will: - - Create local `.terraformrc` with dev overrides (no global config changes) - - Build and install the provider locally - -2. **Run the test:** - ```bash - ./tf plan - ./tf apply - ``` - - Or using the full command: - ```bash - TF_CLI_CONFIG_FILE=.terraformrc terraform plan - TF_CLI_CONFIG_FILE=.terraformrc terraform apply - ``` - - Note: Skip `terraform init` when using dev overrides - it's not needed and may cause errors. - -3. **Clean up:** - ```bash - ./tf destroy - ``` - -## Troubleshooting - -If you encounter issues: - -1. **Provider not found**: Run `./setup-dev.sh` again -2. **Build errors**: Check that Go >= 1.23 is installed -3. **Permission errors**: Ensure the setup script is executable - -## Resetting - -To reset your Terraform configuration: -```bash -rm -rf .terraform/ .terraform.lock.hcl terraform.tfstate* -``` - -Then run the setup and init process again. diff --git a/e2e-test/main.tf b/e2e-test/main.tf deleted file mode 100644 index 8c3ecea..0000000 --- a/e2e-test/main.tf +++ /dev/null @@ -1,62 +0,0 @@ -terraform { - required_providers { - tor = { - source = "guardianproject/tor" - version = "99.0.0" - } - } -} - -provider "tor" {} - -# Generate RSA identity key for the bridge -resource "tor_relay_identity_rsa" "bridge" {} - -# Generate Ed25519 identity key for the bridge -resource "tor_relay_identity_ed25519" "bridge" {} - -# Generate obfs4 state using the identity keys -resource "tor_obfs4_state" "bridge" { - rsa_identity_private_key = tor_relay_identity_rsa.bridge.private_key_pem - ed25519_identity_private_key = tor_relay_identity_ed25519.bridge.private_key_pem -} - -# Generate bridge line for client distribution -data "tor_obfs4_bridge_line" "bridge" { - ip_address = "203.0.113.1" - port = 9001 - identity_fingerprint_sha1 = tor_relay_identity_rsa.bridge.public_key_fingerprint_sha1 - obfs4_state_certificate = tor_obfs4_state.bridge.certificate - obfs4_state_iat_mode = tor_obfs4_state.bridge.iat_mode -} - -# Outputs for verification -output "rsa_fingerprint_sha1" { - description = "RSA identity fingerprint (SHA1)" - value = tor_relay_identity_rsa.bridge.public_key_fingerprint_sha1 -} - -output "rsa_fingerprint_sha256" { - description = "RSA identity fingerprint (SHA256)" - value = tor_relay_identity_rsa.bridge.public_key_fingerprint_sha256 -} - -output "ed25519_fingerprint_sha256" { - description = "Ed25519 identity fingerprint (SHA256)" - value = tor_relay_identity_ed25519.bridge.public_key_fingerprint_sha256 -} - -output "obfs4_certificate" { - description = "obfs4 certificate for bridge line" - value = tor_obfs4_state.bridge.certificate -} - -output "obfs4_iat_mode" { - description = "obfs4 IAT mode" - value = tor_obfs4_state.bridge.iat_mode -} - -output "bridge_line" { - description = "Complete bridge line for clients" - value = data.tor_obfs4_bridge_line.bridge.bridge_line -} diff --git a/e2e-test/setup-dev.sh b/e2e-test/setup-dev.sh deleted file mode 100755 index 1899c53..0000000 --- a/e2e-test/setup-dev.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env bash -set -e - -echo "Setting up development environment for terraform-provider-tor..." - -# Get the Go bin path -GOBIN=$(go env GOPATH)/bin -if [ -z "$GOBIN" ]; then - GOBIN=$(go env GOROOT)/bin -fi - -echo "Go bin path: $GOBIN" - -# Create local .terraformrc with dev overrides -TERRAFORMRC="$(pwd)/.terraformrc" -echo "Creating $TERRAFORMRC..." - -# Create local .terraformrc with dev overrides -cat > "$TERRAFORMRC" << EOF -provider_installation { - dev_overrides { - "guardianproject/tor" = "$GOBIN" - } - direct {} -} -EOF - -echo "✓ Created local $TERRAFORMRC with dev overrides" - -# Build and install the provider -echo "Building and installing provider..." -cd "$(dirname "$0")/.." - -# Build with proper naming for dev overrides -go build -o "$GOBIN/terraform-provider-tor_v99.0.0" - -echo "✓ Provider built and installed to $GOBIN/terraform-provider-tor_v99.0.0" - -echo "" -echo "Setup complete! You can now run:" -echo " cd e2e-test" -echo " ./tf plan" -echo " ./tf apply" -echo "" -echo "Or use the full command:" -echo " TF_CLI_CONFIG_FILE=.terraformrc terraform plan" -echo "" -echo "Note: Using local .terraformrc to avoid modifying your global configuration." diff --git a/e2e-test/tf b/e2e-test/tf deleted file mode 100755 index 2df7ce0..0000000 --- a/e2e-test/tf +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash -# Wrapper script to run terraform with local config - -export TF_CLI_CONFIG_FILE=.terraformrc -exec tofu "$@" diff --git a/examples/resources/tor_obfs4_state/resource.tf b/examples/resources/tor_obfs4_state/resource.tf index f0f3be0..67f85f9 100644 --- a/examples/resources/tor_obfs4_state/resource.tf +++ b/examples/resources/tor_obfs4_state/resource.tf @@ -9,7 +9,9 @@ terraform { provider "tor" {} # Example: Generate obfs4 state using existing identity keys -resource "tor_relay_identity_rsa" "bridge" {} +resource "tor_relay_identity_rsa" "bridge" { + key_size = 2048 +} resource "tor_relay_identity_ed25519" "bridge" {} diff --git a/examples/resources/tor_relay_identity_ed25519/resource.tf b/examples/resources/tor_relay_identity_ed25519/resource.tf index 214c239..4a0a251 100644 --- a/examples/resources/tor_relay_identity_ed25519/resource.tf +++ b/examples/resources/tor_relay_identity_ed25519/resource.tf @@ -22,6 +22,10 @@ output "public_key_pem" { value = tor_relay_identity_ed25519.example.public_key_pem } +output "public_key_fingerprint_sha1" { + description = "SHA1 fingerprint of the Ed25519 public key" + value = tor_relay_identity_ed25519.example.public_key_fingerprint_sha1 +} output "public_key_fingerprint_sha256" { description = "SHA256 fingerprint of the Ed25519 public key" diff --git a/examples/resources/tor_relay_identity_rsa/resource.tf b/examples/resources/tor_relay_identity_rsa/resource.tf index d88113f..b9d6c5b 100644 --- a/examples/resources/tor_relay_identity_rsa/resource.tf +++ b/examples/resources/tor_relay_identity_rsa/resource.tf @@ -12,7 +12,9 @@ terraform { provider "tor" {} # Example: Generate RSA identity key for Tor relay -resource "tor_relay_identity_rsa" "example" {} +resource "tor_relay_identity_rsa" "example" { + key_size = 2048 # Default RSA key size for Tor relays +} output "private_key_pem" { description = "RSA private key in PEM format" diff --git a/flake.nix b/flake.nix index edead20..8b5a7d7 100644 --- a/flake.nix +++ b/flake.nix @@ -47,8 +47,6 @@ pkgs.go pkgs.golangci-lint pkgs.obfs4 - pkgs.gnumake - pkgs.opentofu ]; buildInputs = libraries; inputsFrom = libraries; diff --git a/go.sum.broken b/go.sum.broken new file mode 100644 index 0000000..5093bb4 --- /dev/null +++ b/go.sum.broken @@ -0,0 +1,134 @@ +github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= +github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= +github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= +github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= +github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= +github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= +github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRjRuY4O1FJmsbNOvSFE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/cli v1.1.6 h1:KMHVPR7kZruGy7vbOn5W2M7PcOWJwkXaHLe8rjUV4dY= +github.com/hashicorp/cli v1.1.6/go.mod h1:6p7uk6XBr7g+W4hy7N7NYqYSBXPa5Z1C/VvQpPCMH9Y= +github.com/hashicorp/go-checkpoint v0.5.0 h1:MFYpPZCnQqQTE18jFwSII6eUQrD/oxMFp3mlgcqk5mU= +github.com/hashicorp/go-checkpoint v0.5.0/go.mod h1:7nfLNL10NsxqO4iWuW6tWW0HjZuDrwkBuEQsVcpCOgg= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320 h1:1/D3zfFHttUKaCaGKZ/dR2roBXv0vKbSCnssIldfQdI= +github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320/go.mod h1:EiZBMaudVLy8fmjf9Npq1dq9RalhveqZG5w/yz3mHWs= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-plugin v1.6.1 h1:P7MR2UP6gNKGPp+y7EZw2kOiq4IR9WiqLvp0XOsVdwI= +github.com/hashicorp/go-plugin v1.6.1/go.mod h1:XPHFku2tFo3o3QKFgSYo+cghcUhw1NA1hZyMK0PWAw0= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKdqZHlqU+s3zB+A/8bV3psmIos= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/hc-install v0.8.0 h1:W5l9fjCIhG/QAImWR0LE4AOKiDUxGR3+V8SCMvQnb2Y= +github.com/hashicorp/hc-install v0.8.0/go.mod h1:vRJU/PIsZbJBT0DgpXzRH7ZQJgE8YlGV2/ZnbTsJgJ8= +github.com/hashicorp/hcl/v2 v2.21.0 h1:lve4q/o/2rqwYOgUg3y3V2YPyD2RtlUIQ/2UyfrxYtI= +github.com/hashicorp/hcl/v2 v2.21.0/go.mod h1:62ZYHrXgPoX8xBnzl8QzbWq4dyDsDtfCRgIq1rbJEvA= +github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/terraform-exec v0.21.0 h1:uNkLAe95ey5Uux6KJdua6+cv8asgILFVWkd/RG0D2XQ= +github.com/hashicorp/terraform-exec v0.21.0/go.mod h1:1PPeMYou+KDUSSeRE9szMZ/oHf4fYUmB923Wzbq1ICg= +github.com/hashicorp/terraform-json v0.22.1 h1:xft84GZR0QzjPVWs4lRUwvTcPnegqlyS7orfb5Ltvec= +github.com/hashicorp/terraform-json v0.22.1/go.mod h1:JbWSQCLFSXFFhg42T7l9iJwdGXBYV8fmmD6o/ML4p3A= +github.com/hashicorp/terraform-plugin-docs v0.19.4 h1:CfI1r+Fb8jDjdADp5GTDPYB/LEU0CTJ0NkF/1RSSB8A= +github.com/hashicorp/terraform-plugin-docs v0.19.4/go.mod h1:DCF27O5RpcNm/p4v7WMTRmP1DQSA9ZMNj3ux6Nzx7MY= +github.com/hashicorp/terraform-plugin-framework v1.12.0 h1:CZBXAzKXNUCJXAz7my/4LgWDBbKIz+8IW7E6wlJFbOo= +github.com/hashicorp/terraform-plugin-framework v1.12.0/go.mod h1:k0btlrW8IMR7Gq+k2zJzqUK8MhLeR2RSrOGNw8qODmU= +github.com/hashicorp/terraform-plugin-go v0.23.0 h1:AALVuU1gD1kPb48aPQUjug9Ir/125t+AAurhqphJ2Co= +github.com/hashicorp/terraform-plugin-go v0.23.0/go.mod h1:1E3Cr9h2vMlahWMbsSEcNrOCxovCZhOOIXjFHbjc/lQ= +github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0= +github.com/hashicorp/terraform-plugin-log v0.9.0/go.mod h1:rKL8egZQ/eXSyDqzLUuwUYLVdlYeamldAHSxjUFADow= +github.com/hashicorp/terraform-plugin-sdk/v2 v2.34.0 h1:kJoLKl3xJB54AtNsLvGZVDmzf+qzUlqOTe4jqp7L+ZU= +github.com/hashicorp/terraform-plugin-sdk/v2 v2.34.0/go.mod h1:sl/UbXl1zzUQupPCavdMdAQHGGODhSgVjrOF3Nd1UrA= +github.com/hashicorp/terraform-plugin-testing v1.10.0 h1:j/2S0ZM9m7QVm8b3t2B4PqT4PmQbxkM/CgJnr0YFGyk= +github.com/hashicorp/terraform-plugin-testing v1.10.0/go.mod h1:t7O9LSoYLyT88fT9jEX7sFcMSvKM7pU4pDsb6PrSdq8= +github.com/hashicorp/terraform-registry-address v0.2.3 h1:2TAiKJ1A3MAkZlH1YI/aTVcLZRu7JseiXNRHbOAyoTI= +github.com/hashicorp/terraform-registry-address v0.2.3/go.mod h1:lFHA76T8jfQteVfT7caREqguFrW3c4MFSPhZB7HHgUM= +github.com/hashicorp/terraform-svchost v0.1.1 h1:EZZimZ1GxdqFRinZ1tpJwVxxt49xc/S52uzrw4x0jKQ= +github.com/hashicorp/terraform-svchost v0.1.1/go.mod h1:mNsjQfZyf/Jhz35v6/0LWcv26+X7JPS+buii2c9/ctc= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= +github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mitchellh/cli v1.1.5 h1:OxRIeJXpAMztws/XHlN2vu6imG5Dpq+j61AzAX5fLng= +github.com/mitchellh/cli v1.1.5/go.mod h1:v8+iFts2sPIKUV1ltktPXMCC8fumSKFItNcD2cLtRR4= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxBiscop= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= +github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWFro0E= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGPiK/92rKx= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI= +github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= +github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= +github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/zclconf/go-cty v1.15.0 h1:tTCRWxsexYUmtt/wVxgDClUe+uQusuI443uL6e+5sXQ= +github.com/zclconf/go-cty v1.15.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird v0.4.0 h1:NHnO+9dGWkXpSWwC8Y3xHu9PTLwDfKWYKQeNS1tPBR0= +gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird v0.4.0/go.mod h1:Kxv+0sWNVD5VrFdIGQwE8VWLRtOg4g4lxr5IiMH74o= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/grpc v1.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c= +google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= \ No newline at end of file