@voxgig/sdkgen 4.8.2 → 4.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/voxgig-sdkgen +1 -1
- package/dist/action/doctor.d.ts +1 -0
- package/dist/action/doctor.js +50 -2
- package/dist/action/doctor.js.map +1 -1
- package/dist/helpers/naming.js +4 -2
- package/dist/helpers/naming.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/model/sdkgen.aon +21 -0
- package/package.json +1 -1
- package/project/.sdk/model/feature/secrets.aon +120 -18
- package/project/.sdk/model/target/c.aon +10 -0
- package/project/.sdk/model/target/clojure.aon +13 -0
- package/project/.sdk/model/target/cpp.aon +10 -0
- package/project/.sdk/model/target/csharp.aon +9 -0
- package/project/.sdk/model/target/dart.aon +10 -0
- package/project/.sdk/model/target/elixir.aon +9 -0
- package/project/.sdk/model/target/go.aon +13 -0
- package/project/.sdk/model/target/java.aon +9 -0
- package/project/.sdk/model/target/js.aon +7 -0
- package/project/.sdk/model/target/kotlin.aon +9 -0
- package/project/.sdk/model/target/lean.aon +17 -0
- package/project/.sdk/model/target/lua.aon +8 -0
- package/project/.sdk/model/target/ocaml.aon +9 -0
- package/project/.sdk/model/target/perl.aon +8 -0
- package/project/.sdk/model/target/php.aon +8 -0
- package/project/.sdk/model/target/py.aon +13 -0
- package/project/.sdk/model/target/rb.aon +8 -0
- package/project/.sdk/model/target/rust.aon +10 -0
- package/project/.sdk/model/target/scala.aon +21 -2
- package/project/.sdk/model/target/swift.aon +18 -0
- package/project/.sdk/model/target/ts.aon +13 -0
- package/project/.sdk/src/cmp/clojure/Package_clojure.ts +9 -2
- package/project/.sdk/src/cmp/cpp/Gitignore_cpp.ts +3 -0
- package/project/.sdk/src/cmp/dart/Test_dart.ts +2 -0
- package/project/.sdk/src/cmp/elixir/Package_elixir.ts +4 -1
- package/project/.sdk/src/cmp/go/Config_go.ts +59 -2
- package/project/.sdk/src/cmp/go/Main_go.ts +8 -2
- package/project/.sdk/src/cmp/java/Test_java.ts +6 -5
- package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +6 -5
- package/project/.sdk/src/cmp/lean/Package_lean.ts +23 -0
- package/project/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +1 -0
- package/project/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +1 -0
- package/project/.sdk/src/cmp/ocaml/Gitignore_ocaml.ts +1 -0
- package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +7 -3
- package/project/.sdk/src/cmp/py/Config_py.ts +82 -1
- package/project/.sdk/src/cmp/py/Main_py.ts +44 -0
- package/project/.sdk/src/cmp/py/fragment/Main.fragment.py +2 -0
- package/project/.sdk/src/cmp/swift/Main_swift.ts +10 -0
- package/project/.sdk/src/cmp/swift/Package_swift.ts +13 -1
- package/project/.sdk/src/cmp/ts/Config_ts.ts +42 -17
- package/project/.sdk/src/cmp/ts/fragment/Config.data.fragment.ts +13 -1
- package/project/.sdk/src/cmp/ts/fragment/Config.fragment.ts +13 -1
- package/project/.sdk/tm/c/Makefile +38 -3
- package/project/.sdk/tm/c/tests/omni_resolver.h +361 -0
- package/project/.sdk/tm/c/tests/omni_smoke_test.c +237 -0
- package/project/.sdk/tm/c/tests/primary_corpus_test.c +205 -284
- package/project/.sdk/tm/c/tests/struct_corpus_test.c +292 -212
- package/project/.sdk/tm/c/tests/vendor/omni/json.c +811 -0
- package/project/.sdk/tm/c/tests/vendor/omni/omni.h +240 -0
- package/project/.sdk/tm/c/tests/vendor/omni/runner.c +940 -0
- package/project/.sdk/tm/c/tests/vendor/omni/util.c +351 -0
- package/project/.sdk/tm/c/utility/struct/utility.c +7 -2
- package/project/.sdk/tm/clojure/test/sdk/test/omni.clj +401 -0
- package/project/.sdk/tm/clojure/test/sdk/test/omni_smoke.clj +81 -0
- package/project/.sdk/tm/clojure/test/sdk/test/primary.clj +92 -58
- package/project/.sdk/tm/clojure/test/sdk/test/struct_corpus.clj +122 -149
- package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +8 -3
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +145 -0
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +445 -0
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +145 -0
- package/project/.sdk/tm/cpp/Makefile +5 -1
- package/project/.sdk/tm/cpp/test/omni_resolver.hpp +473 -0
- package/project/.sdk/tm/cpp/test/omni_smoke_test.cpp +209 -0
- package/project/.sdk/tm/cpp/test/primary_utility_test.cpp +243 -184
- package/project/.sdk/tm/cpp/test/runner_support.hpp +68 -181
- package/project/.sdk/tm/cpp/test/struct_corpus_test.cpp +183 -56
- package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +406 -0
- package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +751 -0
- package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +256 -0
- package/project/.sdk/tm/cpp/utility/pipeline.hpp +7 -1
- package/project/.sdk/tm/csharp/test/OmniResolver.cs +491 -0
- package/project/.sdk/tm/csharp/test/OmniSmokeTest.cs +106 -0
- package/project/.sdk/tm/csharp/test/PrimaryUtilityTest.cs +299 -316
- package/project/.sdk/tm/csharp/test/Runner.cs +104 -269
- package/project/.sdk/tm/csharp/test/StructUtilityTest.cs +535 -724
- package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +864 -0
- package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +347 -0
- package/project/.sdk/tm/csharp/utility/MakeSpec.cs +3 -1
- package/project/.sdk/tm/csharp/utility/PrepareMethod.cs +6 -1
- package/project/.sdk/tm/csharp/utility/struct/Struct.cs +21 -5
- package/project/.sdk/tm/dart/test/omni.dart +520 -0
- package/project/.sdk/tm/dart/test/omni_smoke_test.dart +143 -0
- package/project/.sdk/tm/dart/test/primary_test.dart +86 -28
- package/project/.sdk/tm/dart/test/struct_test.dart +438 -11
- package/project/.sdk/tm/dart/test/vendor/omni/omni.dart +7 -0
- package/project/.sdk/tm/dart/test/vendor/omni/runner.dart +653 -0
- package/project/.sdk/tm/dart/test/vendor/omni/util.dart +232 -0
- package/project/.sdk/tm/elixir/Makefile +11 -3
- package/project/.sdk/tm/elixir/test/omni_smoke_test.exs +117 -0
- package/project/.sdk/tm/elixir/test/primary_utility_test.exs +341 -16
- package/project/.sdk/tm/elixir/test/struct_corpus_test.exs +554 -9
- package/project/.sdk/tm/elixir/test/support/omni.ex +377 -0
- package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +122 -0
- package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +623 -0
- package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +187 -0
- package/project/.sdk/tm/go/core/context.go +32 -16
- package/project/.sdk/tm/go/feature/secrets/plugin/capability.go +261 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/catalog.go +78 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/config.go +652 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/depend.go +250 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/env.go +194 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/export.go +80 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +238 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/host.go +1575 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/order.go +248 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/point.go +184 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/ref.go +123 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/resolve.go +79 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/types.go +296 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/util.go +87 -0
- package/project/.sdk/tm/go/feature/secrets/plugin/version.go +161 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/aws/aws.go +292 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +201 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +187 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +184 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +114 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +156 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +209 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +241 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +151 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +152 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +143 -0
- package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +120 -0
- package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +439 -0
- package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +685 -0
- package/project/.sdk/tm/go/feature/secrets_feature.go +675 -0
- package/project/.sdk/tm/go/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +799 -0
- package/project/.sdk/tm/go/test/omni/omni.go +897 -0
- package/project/.sdk/tm/go/test/omni/util.go +360 -0
- package/project/.sdk/tm/go/test/omniresolver_test.go +748 -0
- package/project/.sdk/tm/go/test/omnismoke_test.go +112 -0
- package/project/.sdk/tm/go/test/primary_utility_test.go +123 -191
- package/project/.sdk/tm/go/test/struct_utility_test.go +323 -16
- package/project/.sdk/tm/go/test/testsupport_test.go +294 -0
- package/project/.sdk/tm/go/utility/make_options.go +8 -1
- package/project/.sdk/tm/go/utility/prepare_method.go +5 -1
- package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +2 -2
- package/project/.sdk/tm/java/test/OmniResolver.java +355 -0
- package/project/.sdk/tm/java/test/OmniSmokeTest.java +99 -0
- package/project/.sdk/tm/java/test/PrimaryUtilityTest.java +254 -280
- package/project/.sdk/tm/java/test/RunnerSupport.java +9 -194
- package/project/.sdk/tm/java/test/StructCorpusTest.java +119 -42
- package/project/.sdk/tm/java/test/vendor/omni/Json.java +287 -0
- package/project/.sdk/tm/java/test/vendor/omni/Runner.java +851 -0
- package/project/.sdk/tm/java/test/vendor/omni/Util.java +322 -0
- package/project/.sdk/tm/java/utility/MakeSpec.java +3 -1
- package/project/.sdk/tm/java/utility/PrepareMethod.java +5 -5
- package/project/.sdk/tm/java/utility/struct/Struct.java +17 -4
- package/project/.sdk/tm/js/src/utility/StructUtility.js +3 -3
- package/project/.sdk/tm/js/test/omni.js +251 -0
- package/project/.sdk/tm/js/test/omni.test.js +105 -0
- package/project/.sdk/tm/js/test/utility/PrimaryUtility.test.js +6 -2
- package/project/.sdk/tm/js/test/utility/StructUtility.test.js +27 -2
- package/project/.sdk/tm/js/test/vendor/omni/index.js +77 -0
- package/project/.sdk/tm/js/test/vendor/omni/runner.js +613 -0
- package/project/.sdk/tm/js/test/vendor/omni/util.js +212 -0
- package/project/.sdk/tm/kotlin/core/Utility.kt +1 -1
- package/project/.sdk/tm/kotlin/test/OmniResolver.kt +343 -0
- package/project/.sdk/tm/kotlin/test/OmniSmokeTest.kt +100 -0
- package/project/.sdk/tm/kotlin/test/PrimaryUtilityTest.kt +244 -262
- package/project/.sdk/tm/kotlin/test/RunnerSupport.kt +9 -178
- package/project/.sdk/tm/kotlin/test/StructCorpusTest.kt +121 -32
- package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +264 -0
- package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +615 -0
- package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +139 -0
- package/project/.sdk/tm/kotlin/utility/MakeSpecUrl.kt +6 -3
- package/project/.sdk/tm/kotlin/utility/Prepare.kt +6 -6
- package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +18 -2
- package/project/.sdk/tm/lean/Makefile +12 -5
- package/project/.sdk/tm/lean/src/SdkUtility.lean +14 -1
- package/project/.sdk/tm/lean/test/OmniResolver.lean +358 -0
- package/project/.sdk/tm/lean/test/OmniSmoke.lean +174 -0
- package/project/.sdk/tm/lean/test/StructCorpus.lean +245 -574
- package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +155 -291
- package/project/.sdk/tm/lean/test/vendor/omni/Omni.lean +997 -0
- package/project/.sdk/tm/lua/test/omni.lua +456 -0
- package/project/.sdk/tm/lua/test/omni_smoke_test.lua +103 -0
- package/project/.sdk/tm/lua/test/primary_utility_test.lua +250 -509
- package/project/.sdk/tm/lua/test/struct_utility_test.lua +161 -70
- package/project/.sdk/tm/lua/test/vendor/omni/json.lua +268 -0
- package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +385 -0
- package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +641 -0
- package/project/.sdk/tm/lua/test/vendor/omni/util.lua +282 -0
- package/project/.sdk/tm/lua/utility/prepare_method.lua +5 -1
- package/project/.sdk/tm/lua/utility/struct/regex.lua +663 -0
- package/project/.sdk/tm/lua/utility/struct/struct.lua +660 -420
- package/project/.sdk/tm/ocaml/Makefile +37 -12
- package/project/.sdk/tm/ocaml/test/omni_resolver.ml +284 -0
- package/project/.sdk/tm/ocaml/test/omni_smoke_test.ml +169 -0
- package/project/.sdk/tm/ocaml/test/primary_utility_test.ml +84 -100
- package/project/.sdk/tm/ocaml/test/struct_corpus.ml +225 -201
- package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +1157 -0
- package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +88 -12
- package/project/.sdk/tm/perl/t/omni.pm +647 -0
- package/project/.sdk/tm/perl/t/omni_smoke.t +87 -0
- package/project/.sdk/tm/perl/t/primary_utility.t +189 -487
- package/project/.sdk/tm/perl/t/struct_utility.t +455 -389
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Runner.pm +649 -0
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Util.pm +253 -0
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni.pm +24 -0
- package/project/.sdk/tm/perl/utility/prepare_method.pm +7 -2
- package/project/.sdk/tm/php/test/Omni.php +691 -0
- package/project/.sdk/tm/php/test/OmniSmokeTest.php +93 -0
- package/project/.sdk/tm/php/test/PrimaryUtilityTest.php +210 -571
- package/project/.sdk/tm/php/test/StructUtilityTest.php +320 -342
- package/project/.sdk/tm/php/test/vendor/omni/Runner.php +644 -0
- package/project/.sdk/tm/php/test/vendor/omni/Util.php +283 -0
- package/project/.sdk/tm/php/utility/MakeSpec.php +10 -3
- package/project/.sdk/tm/php/utility/PrepareBody.php +7 -1
- package/project/.sdk/tm/php/utility/PrepareMethod.php +6 -2
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/__init__.py +36 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/capability.py +141 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/catalog.py +50 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/config.py +333 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/depend.py +198 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/env.py +147 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/export.py +52 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/graph.py +139 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/host.py +1053 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +171 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +95 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +116 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +59 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +87 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +112 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +74 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +116 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +192 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +120 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +140 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +62 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +101 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +152 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +115 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +92 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/onepassword.py +101 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/secretspec.py +119 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/sigv4.py +125 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/providers.py +211 -0
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +455 -0
- package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +467 -0
- package/project/.sdk/tm/py/pkg/utility/prepare_method.py +5 -1
- package/project/.sdk/tm/py/pkg/utility/voxgig_struct/__init__.py +0 -2
- package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +780 -529
- package/project/.sdk/tm/py/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/py/test/feature/__init__.py +0 -0
- package/project/.sdk/tm/py/test/feature/secrets/__init__.py +0 -0
- package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +337 -0
- package/project/.sdk/tm/py/test/omni.py +415 -0
- package/project/.sdk/tm/py/test/test_omni_smoke.py +74 -0
- package/project/.sdk/tm/py/test/test_primary_utility.py +144 -668
- package/project/.sdk/tm/py/test/test_struct_utility.py +74 -27
- package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +62 -0
- package/project/.sdk/tm/py/test/voxgig_omni/runner.py +566 -0
- package/project/.sdk/tm/py/test/voxgig_omni/util.py +237 -0
- package/project/.sdk/tm/rb/test/omni.rb +505 -0
- package/project/.sdk/tm/rb/test/omni_smoke_test.rb +72 -0
- package/project/.sdk/tm/rb/test/primary_utility_test.rb +174 -560
- package/project/.sdk/tm/rb/test/struct_utility_test.rb +13 -7
- package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +493 -0
- package/project/.sdk/tm/rb/test/vendor/omni/util.rb +199 -0
- package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +15 -0
- package/project/.sdk/tm/rb/utility/prepare_method.rb +5 -1
- package/project/.sdk/tm/rust/tests/common/mod.rs +19 -242
- package/project/.sdk/tm/rust/tests/omni_resolver/mod.rs +888 -0
- package/project/.sdk/tm/rust/tests/omni_smoke_test.rs +286 -0
- package/project/.sdk/tm/rust/tests/primary_utility_test.rs +318 -312
- package/project/.sdk/tm/rust/tests/struct_utility_test.rs +66 -28
- package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +412 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +38 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +392 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +1001 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +161 -0
- package/project/.sdk/tm/rust/utility/prepare_method.rs +5 -1
- package/project/.sdk/tm/scala/Makefile +16 -6
- package/project/.sdk/tm/scala/sdktest/OmniResolver.scala +497 -0
- package/project/.sdk/tm/scala/sdktest/OmniSmoke.scala +192 -0
- package/project/.sdk/tm/scala/sdktest/PrimaryCorpus.scala +47 -19
- package/project/.sdk/tm/scala/sdktest/StructCorpus.scala +0 -0
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +229 -0
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +552 -0
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +104 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Constants.swift +10 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Inject.swift +28 -5
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Injection.swift +5 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Minor.swift +4 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/Struct/Validate.swift +15 -5
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/Prepare.swift +6 -1
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniResolver.swift +474 -0
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/OmniSmokeTest.swift +107 -0
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +141 -178
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/Runner.swift +17 -113
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/StructUtilityTest.swift +295 -446
- package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +364 -0
- package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +730 -0
- package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +162 -0
- package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +7 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Capability.ts +148 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Catalog.ts +55 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Config.ts +344 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Depend.ts +205 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Env.ts +138 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Export.ts +46 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/FeatureHost.ts +349 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Graph.ts +181 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Host.ts +1132 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Order.ts +177 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Point.ts +119 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Ref.ts +102 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Resolve.ts +61 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Types.ts +112 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Version.ts +100 -0
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/index.ts +37 -0
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +163 -30
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +27 -22
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/aws.ts +26 -36
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/azuresecrets.ts +19 -21
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/boru.ts +36 -17
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/doppler.ts +14 -21
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/gcpsecrets.ts +27 -27
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/hashicorp.ts +25 -39
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/httpjson.ts +99 -0
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/infisical.ts +14 -16
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{provider → plugins}/onepassword.ts +15 -22
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/secretspec.ts +98 -0
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/{Sigv4.ts → plugins/sigv4.ts} +7 -6
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +97 -23
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/builtin.ts +37 -0
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +4 -17
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +4 -16
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +11 -25
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +6 -23
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +106 -39
- package/project/.sdk/tm/ts/src/utility/StructUtility.ts +3 -3
- package/project/.sdk/tm/ts/test/omni.ts +104 -32
- package/project/.sdk/tm/ts/test/utility/StructUtility.test.ts +27 -0
- package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +32 -5
- package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +2 -2
- package/project/.sdk/tm/ts/test/vendor/omni/index.ts +2 -2
- package/project/.sdk/tm/zig/test/primary_utility_test.zig +1 -1
- package/project/.sdk/tm/zig/test/struct_runner.zig +5 -4
- package/project/sdkgen-package.json +1 -1
- package/src/action/doctor.ts +66 -2
- package/src/helpers/naming.ts +4 -2
- package/project/.sdk/tm/c/tests/runner.h +0 -274
- package/project/.sdk/tm/cpp/test/struct_runner.hpp +0 -314
- package/project/.sdk/tm/csharp/test/StructRunner.cs +0 -276
- package/project/.sdk/tm/dart/test/runner.dart +0 -406
- package/project/.sdk/tm/dart/test/struct_corpus.dart +0 -531
- package/project/.sdk/tm/elixir/test/support/struct_corpus.ex +0 -1088
- package/project/.sdk/tm/go/test/runner_test.go +0 -629
- package/project/.sdk/tm/go/test/struct_runner_test.go +0 -1094
- package/project/.sdk/tm/java/test/StructRunner.java +0 -281
- package/project/.sdk/tm/js/test/runner.js +0 -387
- package/project/.sdk/tm/kotlin/test/StructRunner.kt +0 -177
- package/project/.sdk/tm/lua/test/struct_runner.lua +0 -602
- package/project/.sdk/tm/ocaml/test/corpus_runner.ml +0 -185
- package/project/.sdk/tm/perl/t/struct_runner.pm +0 -275
- package/project/.sdk/tm/php/test/StructRunner.php +0 -275
- package/project/.sdk/tm/py/test/struct_runner.py +0 -411
- package/project/.sdk/tm/rb/test/struct_runner.rb +0 -309
- package/project/.sdk/tm/rust/tests/struct_runner/mod.rs +0 -424
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/Registry.ts +0 -90
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/http.ts +0 -66
- package/project/.sdk/tm/ts/test/vendor/omni/compat.ts +0 -188
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// VENDORED: @voxgig/sekreto sdk-20260904-1610-0 (go/sekreto/addr.go)
|
|
2
|
+
// Source: https://github.com/voxgig/sekreto @ a5a00db6e6d3a1ddbdef7ac62e8a75be53a9e042 [tag: sdk-20260904-1610-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
// The plaintext-address guard, in the core because it is pure - a
|
|
5
|
+
// handful of string steps, no socket - and because it is on the spec:
|
|
6
|
+
// every port answers the same for every address in spec/def/store.aon.
|
|
7
|
+
// The plugins that dial an address call CheckAddr before they do.
|
|
8
|
+
//
|
|
9
|
+
// A port of typescript/src/provider/addr.ts.
|
|
10
|
+
|
|
11
|
+
package sekreto
|
|
12
|
+
|
|
13
|
+
import "strings"
|
|
14
|
+
|
|
15
|
+
// SafeAddr returns the address with any userinfo replaced by [redacted],
|
|
16
|
+
// for messages.
|
|
17
|
+
//
|
|
18
|
+
// Every refusal in CheckAddr names the address it refused, and one of them fires
|
|
19
|
+
// precisely because the address carries a credential - so printing it
|
|
20
|
+
// verbatim wrote the password to stderr and into the logs. It cannot be
|
|
21
|
+
// cleaned up afterwards either: that password was never resolved as a
|
|
22
|
+
// secret, so Redact has never seen it and never will. The host is what a
|
|
23
|
+
// reader needs to identify which chain entry is at fault; the userinfo is
|
|
24
|
+
// not.
|
|
25
|
+
func SafeAddr(addr string) string {
|
|
26
|
+
mark := strings.Index(addr, "://")
|
|
27
|
+
if -1 == mark {
|
|
28
|
+
return addr
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
rest := addr[mark+3:]
|
|
32
|
+
authority := rest
|
|
33
|
+
if end := strings.IndexAny(rest, "/?#"); -1 != end {
|
|
34
|
+
authority = rest[:end]
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
at := strings.LastIndex(authority, "@")
|
|
38
|
+
if -1 == at {
|
|
39
|
+
return addr
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return addr[:mark+3] + "[redacted]" + addr[mark+3+at:]
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// CheckAddr refuses to send a Vault token in the clear.
|
|
46
|
+
//
|
|
47
|
+
// Vault's API is HTTPS in any real deployment; plaintext is a dev-mode
|
|
48
|
+
// convenience. Sending X-Vault-Token over http to anything but the local
|
|
49
|
+
// machine puts both the token and the secret it fetches on the wire for
|
|
50
|
+
// anyone on the path, so sekreto will not do it. Loopback stays allowed:
|
|
51
|
+
// that is `vault server -dev` and this repo's own test harness.
|
|
52
|
+
//
|
|
53
|
+
// The address is read by hand, in the same handful of steps in every port,
|
|
54
|
+
// rather than by each platform's URL parser. That is deliberate. Twelve
|
|
55
|
+
// parsers disagree about malformed input - where userinfo ends, whether
|
|
56
|
+
// 0177.0.0.1 is loopback, what an unclosed bracket means - and a check that
|
|
57
|
+
// answers differently in different ports is not a check.
|
|
58
|
+
//
|
|
59
|
+
// The rule this parse obeys, and the reason it can be trusted: it is never
|
|
60
|
+
// more permissive than the HTTP client that will dial the address. It ends
|
|
61
|
+
// the authority at '/', '?' or '#' only, so a client that also breaks on
|
|
62
|
+
// '\' (WHATWG does) can only ever see a SHORTER host than this does. It
|
|
63
|
+
// refuses userinfo outright rather than locating its end. It compares the
|
|
64
|
+
// host literally, so a numeric form no parser here agrees on is refused
|
|
65
|
+
// rather than guessed at.
|
|
66
|
+
func CheckAddr(addr string) error {
|
|
67
|
+
scheme := ""
|
|
68
|
+
if strings.HasPrefix(addr, "https://") {
|
|
69
|
+
scheme = "https://"
|
|
70
|
+
} else if strings.HasPrefix(addr, "http://") {
|
|
71
|
+
scheme = "http://"
|
|
72
|
+
} else {
|
|
73
|
+
return Fail("sekreto: not an http(s) address: " + SafeAddr(addr))
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
rest := addr[len(scheme):]
|
|
77
|
+
end := strings.IndexAny(rest, "/?#")
|
|
78
|
+
authority := rest
|
|
79
|
+
if -1 != end {
|
|
80
|
+
authority = rest[:end]
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Userinfo is refused outright rather than parsed around, and on https as
|
|
84
|
+
// well as http. No store this library speaks authenticates by userinfo -
|
|
85
|
+
// they take a token or a signature - so an address carrying one is a
|
|
86
|
+
// mistake at best. At worst it is the attack this whole function exists
|
|
87
|
+
// to stop: http://localhost:8200@evil.example.com/ is a request to
|
|
88
|
+
// evil.example.com that reads, to anything that splits the authority on
|
|
89
|
+
// ':', as loopback.
|
|
90
|
+
if strings.Contains(authority, "@") {
|
|
91
|
+
return Fail("sekreto: refusing an address with embedded credentials: " + SafeAddr(addr))
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// An opening bracket with no closing one is not an address at all.
|
|
95
|
+
if strings.HasPrefix(authority, "[") && !strings.Contains(authority, "]") {
|
|
96
|
+
return Fail("sekreto: not a valid http(s) address: " + SafeAddr(addr))
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if "https://" == scheme {
|
|
100
|
+
return nil
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// A bracketed IPv6 literal keeps its brackets. Splitting the authority on
|
|
104
|
+
// the first colon yields "[", so http://[::1]:8200 could never match -
|
|
105
|
+
// which made the "[::1]" entry below unreachable, and refused a
|
|
106
|
+
// legitimate local vault.
|
|
107
|
+
host := authority
|
|
108
|
+
if strings.HasPrefix(authority, "[") {
|
|
109
|
+
host = authority[:strings.Index(authority, "]")+1]
|
|
110
|
+
} else {
|
|
111
|
+
host = strings.Split(authority, ":")[0]
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
switch strings.ToLower(host) {
|
|
115
|
+
case "localhost", "127.0.0.1", "::1", "[::1]":
|
|
116
|
+
return nil
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return Fail("sekreto: refusing to send a token in plaintext to " + SafeAddr(addr) + " (use https)")
|
|
120
|
+
}
|
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
// VENDORED: @voxgig/sekreto sdk-20260904-1610-0 (go/sekreto/providers.go)
|
|
2
|
+
// Source: https://github.com/voxgig/sekreto @ a5a00db6e6d3a1ddbdef7ac62e8a75be53a9e042 [tag: sdk-20260904-1610-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
// What a provider is, what its declarative form looks like, how a provider
|
|
5
|
+
// kind becomes a voxgig/plugin definition - and the four BUILT-IN kinds.
|
|
6
|
+
//
|
|
7
|
+
// A provider answers one question: "do you have this secret?" It returns
|
|
8
|
+
// the value and whether it had it - a false means "ask the next one".
|
|
9
|
+
// Nothing else about a provider is visible to the caller, which is the
|
|
10
|
+
// point: an app reads `api.token` and never learns whether it came from the
|
|
11
|
+
// environment, a .env file, HashiCorp Vault, AWS, GCP, Azure or a boru
|
|
12
|
+
// vault.
|
|
13
|
+
//
|
|
14
|
+
// Two failure shapes, and they are never interchangeable. A store that does
|
|
15
|
+
// not hold the secret is a MISS (false) - the chain carries on. A store
|
|
16
|
+
// that could not answer - bad credentials, unreachable host, missing
|
|
17
|
+
// configuration - is an ERROR: falling through there would quietly reach
|
|
18
|
+
// for a weaker store.
|
|
19
|
+
//
|
|
20
|
+
// THIS PACKAGE IMPORTS NO net/http, NO crypto AND NO os/exec. What makes a
|
|
21
|
+
// kind built in is that it needs nothing of the platform beyond reading a
|
|
22
|
+
// local file; every kind that opens a socket, signs a request or spawns a
|
|
23
|
+
// process is a plugin under plugins/, its own package, linked only by a
|
|
24
|
+
// binary that imports it (docs/design/plugin-providers.md).
|
|
25
|
+
//
|
|
26
|
+
// A port of typescript/src/provider/support.ts and
|
|
27
|
+
// typescript/src/provider/builtin.ts, which are canonical.
|
|
28
|
+
|
|
29
|
+
package sekreto
|
|
30
|
+
|
|
31
|
+
import (
|
|
32
|
+
"encoding/json"
|
|
33
|
+
"errors"
|
|
34
|
+
"io/fs"
|
|
35
|
+
"os"
|
|
36
|
+
"path/filepath"
|
|
37
|
+
"strings"
|
|
38
|
+
"sync"
|
|
39
|
+
"syscall"
|
|
40
|
+
|
|
41
|
+
plugin "GOMODULE/feature/secrets/plugin"
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
// Provider is a source of secrets.
|
|
45
|
+
type Provider interface {
|
|
46
|
+
// Lookup returns the value and whether this provider has it.
|
|
47
|
+
Lookup(name string) (string, bool, error)
|
|
48
|
+
// Describe is a short description, shown by Sekreto.Sources.
|
|
49
|
+
Describe() string
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ProviderSpec is the declarative form of a provider, as used in config and
|
|
53
|
+
// in the shared spec: a Kind naming a built-in or a plugin, plus that
|
|
54
|
+
// kind's own configuration.
|
|
55
|
+
//
|
|
56
|
+
// The JSON tags are the spec's own key names, and they are also how the
|
|
57
|
+
// spec reaches a plugin: New hands each spec to the voxgig/plugin host as
|
|
58
|
+
// the instance's options map, and the plugin's definition reads it back
|
|
59
|
+
// with SpecOf. `omitempty` keeps that map to the keys actually set.
|
|
60
|
+
//
|
|
61
|
+
// A spec may instead CARRY a provider already built - Provider set, Kind
|
|
62
|
+
// empty - which is how a custom provider that is not a plugin joins the
|
|
63
|
+
// chain. Its store name is Name, or the kind its Describe opens with.
|
|
64
|
+
type ProviderSpec struct {
|
|
65
|
+
Kind string `json:"kind,omitempty"`
|
|
66
|
+
// Name is the store name GetFrom addresses. Defaults to Kind.
|
|
67
|
+
Name string `json:"name,omitempty"`
|
|
68
|
+
Prefix string `json:"prefix,omitempty"`
|
|
69
|
+
File string `json:"file,omitempty"`
|
|
70
|
+
Values map[string]string `json:"values,omitempty"`
|
|
71
|
+
// Dir is the file provider's directory of one-secret-per-file entries.
|
|
72
|
+
Dir string `json:"dir,omitempty"`
|
|
73
|
+
// hashicorp / boru (wire) / gcp / 1password / doppler / infisical:
|
|
74
|
+
// the base URL and the access token.
|
|
75
|
+
Addr string `json:"addr,omitempty"`
|
|
76
|
+
Token string `json:"token,omitempty"`
|
|
77
|
+
// Mount is the hashicorp / boru (wire) KV mount (default `secret`).
|
|
78
|
+
Mount string `json:"mount,omitempty"`
|
|
79
|
+
// KV is the hashicorp KV engine version, 1 or 2 (default 2).
|
|
80
|
+
KV int `json:"kv,omitempty"`
|
|
81
|
+
// VaultNamespace is the Vault Enterprise namespace (X-Vault-Namespace).
|
|
82
|
+
VaultNamespace string `json:"vaultnamespace,omitempty"`
|
|
83
|
+
// Auth logs hashicorp in for a token instead of being handed one.
|
|
84
|
+
Auth *AuthSpec `json:"auth,omitempty"`
|
|
85
|
+
// Command is the boru / secretspec executable to run (default: the
|
|
86
|
+
// kind's own name).
|
|
87
|
+
Command string `json:"command,omitempty"`
|
|
88
|
+
// boru
|
|
89
|
+
Namespace string `json:"namespace,omitempty"`
|
|
90
|
+
Home string `json:"home,omitempty"`
|
|
91
|
+
// Profile is the secretspec profile to read (--profile).
|
|
92
|
+
Profile string `json:"profile,omitempty"`
|
|
93
|
+
// Backend is which of secretspec's OWN backends to read from
|
|
94
|
+
// (--provider), e.g. `keyring` or `dotenv://.env`. Named Backend here
|
|
95
|
+
// because Provider already means a sekreto provider.
|
|
96
|
+
Backend string `json:"backend,omitempty"`
|
|
97
|
+
// Reason is the audit reason recorded for a secretspec read
|
|
98
|
+
// (--reason). SecretSpec refuses to read without one.
|
|
99
|
+
Reason string `json:"reason,omitempty"`
|
|
100
|
+
// aws: region and credentials; the standard AWS_* environment
|
|
101
|
+
// variables fill whichever are not given.
|
|
102
|
+
Region string `json:"region,omitempty"`
|
|
103
|
+
KeyID string `json:"keyid,omitempty"`
|
|
104
|
+
Secret string `json:"secret,omitempty"`
|
|
105
|
+
Session string `json:"session,omitempty"`
|
|
106
|
+
// Project is the gcp / doppler / infisical project (GCP project id,
|
|
107
|
+
// Doppler project slug, Infisical workspace id).
|
|
108
|
+
Project string `json:"project,omitempty"`
|
|
109
|
+
// Vault is the azure Key Vault name or full URL, or the 1password
|
|
110
|
+
// vault name or id.
|
|
111
|
+
Vault string `json:"vault,omitempty"`
|
|
112
|
+
// azure: client-credential login. infisical: universal-auth login
|
|
113
|
+
// (tenant is Azure-only).
|
|
114
|
+
Tenant string `json:"tenant,omitempty"`
|
|
115
|
+
ClientID string `json:"clientid,omitempty"`
|
|
116
|
+
ClientSecret string `json:"clientsecret,omitempty"`
|
|
117
|
+
// azure: where to log in / where IMDS answers. gcp: where the
|
|
118
|
+
// metadata server answers. Overridable for tests and for clouds with
|
|
119
|
+
// nonstandard endpoints.
|
|
120
|
+
LoginAddr string `json:"loginaddr,omitempty"`
|
|
121
|
+
ImdsAddr string `json:"imdsaddr,omitempty"`
|
|
122
|
+
MetadataAddr string `json:"metadataaddr,omitempty"`
|
|
123
|
+
// ApiVersion is the azure Key Vault API version (default 7.4).
|
|
124
|
+
ApiVersion string `json:"apiversion,omitempty"`
|
|
125
|
+
// Config is the doppler config slug (with Project).
|
|
126
|
+
Config string `json:"config,omitempty"`
|
|
127
|
+
// infisical: the environment slug and secret path.
|
|
128
|
+
Environment string `json:"environment,omitempty"`
|
|
129
|
+
Path string `json:"path,omitempty"`
|
|
130
|
+
|
|
131
|
+
// Provider is a provider already built, joining the chain as it is.
|
|
132
|
+
// Never serialized: a live provider is not data.
|
|
133
|
+
Provider Provider `json:"-"`
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// AuthSpec is how the hashicorp provider logs in for a token instead of
|
|
137
|
+
// being handed one.
|
|
138
|
+
type AuthSpec struct {
|
|
139
|
+
Method string `json:"method,omitempty"`
|
|
140
|
+
// Mount is the auth mount, defaulting to the method name.
|
|
141
|
+
Mount string `json:"mount,omitempty"`
|
|
142
|
+
// kubernetes: the Vault role to log in as.
|
|
143
|
+
Role string `json:"role,omitempty"`
|
|
144
|
+
// Jwt is the service-account JWT itself (tests).
|
|
145
|
+
Jwt string `json:"jwt,omitempty"`
|
|
146
|
+
// JwtFile is where the JWT lives; the conventional pod path by
|
|
147
|
+
// default.
|
|
148
|
+
JwtFile string `json:"jwtfile,omitempty"`
|
|
149
|
+
// approle: the role and secret ids.
|
|
150
|
+
RoleID string `json:"roleid,omitempty"`
|
|
151
|
+
SecretID string `json:"secretid,omitempty"`
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// EnvProvider reads environment variables: api.token from API_TOKEN.
|
|
155
|
+
type EnvProvider struct {
|
|
156
|
+
Prefix string
|
|
157
|
+
// Source overrides the process environment, for tests.
|
|
158
|
+
Source map[string]string
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
func (provider *EnvProvider) Lookup(name string) (string, bool, error) {
|
|
162
|
+
key, err := EnvKey(name, provider.Prefix)
|
|
163
|
+
if nil != err {
|
|
164
|
+
return "", false, err
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if nil != provider.Source {
|
|
168
|
+
value, has := provider.Source[key]
|
|
169
|
+
return value, has, nil
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
value, has := os.LookupEnv(key)
|
|
173
|
+
return value, has, nil
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
func (provider *EnvProvider) Describe() string {
|
|
177
|
+
if "" != provider.Prefix {
|
|
178
|
+
return "env:" + provider.Prefix
|
|
179
|
+
}
|
|
180
|
+
return "env"
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// DotenvProvider reads a `.env` file once, keyed exactly like the
|
|
184
|
+
// environment.
|
|
185
|
+
type DotenvProvider struct {
|
|
186
|
+
File string
|
|
187
|
+
Prefix string
|
|
188
|
+
// Guards the memoised state below: a Sekreto may resolve from several
|
|
189
|
+
// goroutines, and a racy map read is either a crash or a zero value - a
|
|
190
|
+
// MISS where the store does hold the secret, which falls through to a
|
|
191
|
+
// weaker store.
|
|
192
|
+
mu sync.Mutex
|
|
193
|
+
values map[string]string
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
func (provider *DotenvProvider) load() (map[string]string, error) {
|
|
197
|
+
provider.mu.Lock()
|
|
198
|
+
defer provider.mu.Unlock()
|
|
199
|
+
|
|
200
|
+
if nil == provider.values {
|
|
201
|
+
text, err := os.ReadFile(provider.File)
|
|
202
|
+
if nil != err {
|
|
203
|
+
// An absent file - or an absent directory - means "no secrets
|
|
204
|
+
// here", exactly like FileProvider. Anything else (permission
|
|
205
|
+
// denied, an unreadable mount) is a store that could not
|
|
206
|
+
// answer, and swallowing it would fall through to a weaker
|
|
207
|
+
// store.
|
|
208
|
+
if !errors.Is(err, fs.ErrNotExist) && !errors.Is(err, syscall.ENOTDIR) {
|
|
209
|
+
return nil, Fail("sekreto: dotenv provider cannot read " +
|
|
210
|
+
provider.File + ": " + err.Error())
|
|
211
|
+
}
|
|
212
|
+
provider.values = map[string]string{}
|
|
213
|
+
} else {
|
|
214
|
+
provider.values = ParseDotenv(string(text))
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return provider.values, nil
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
func (provider *DotenvProvider) Lookup(name string) (string, bool, error) {
|
|
222
|
+
key, err := EnvKey(name, provider.Prefix)
|
|
223
|
+
if nil != err {
|
|
224
|
+
return "", false, err
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
values, err := provider.load()
|
|
228
|
+
if nil != err {
|
|
229
|
+
return "", false, err
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
value, has := values[key]
|
|
233
|
+
return value, has, nil
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
func (provider *DotenvProvider) Describe() string {
|
|
237
|
+
return "dotenv:" + provider.File
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// MemoryProvider holds literal values, keyed like environment variables.
|
|
241
|
+
// The spec uses this to test chain behaviour without touching the outside
|
|
242
|
+
// world.
|
|
243
|
+
type MemoryProvider struct {
|
|
244
|
+
Values map[string]string
|
|
245
|
+
Prefix string
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
func (provider *MemoryProvider) Lookup(name string) (string, bool, error) {
|
|
249
|
+
key, err := EnvKey(name, provider.Prefix)
|
|
250
|
+
if nil != err {
|
|
251
|
+
return "", false, err
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
value, has := provider.Values[key]
|
|
255
|
+
return value, has, nil
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
func (provider *MemoryProvider) Describe() string {
|
|
259
|
+
if "" != provider.Prefix {
|
|
260
|
+
return "memory:" + provider.Prefix
|
|
261
|
+
}
|
|
262
|
+
return "memory"
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// FileProvider reads a directory of one-secret-per-file entries, keyed
|
|
266
|
+
// like the environment: api.token reads <dir>/API_TOKEN.
|
|
267
|
+
//
|
|
268
|
+
// This is the shape of a mounted Kubernetes Secret, a Docker or Swarm
|
|
269
|
+
// secret, and a systemd credentials directory, so those all work with no
|
|
270
|
+
// further configuration. One trailing newline is stripped - tools that
|
|
271
|
+
// write these files disagree about it, and a newline is never part of a
|
|
272
|
+
// secret on purpose.
|
|
273
|
+
type FileProvider struct {
|
|
274
|
+
Dir string
|
|
275
|
+
Prefix string
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
func (provider *FileProvider) Lookup(name string) (string, bool, error) {
|
|
279
|
+
key, err := EnvKey(name, provider.Prefix)
|
|
280
|
+
if nil != err {
|
|
281
|
+
return "", false, err
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
file := filepath.Join(provider.Dir, key)
|
|
285
|
+
|
|
286
|
+
raw, err := os.ReadFile(file)
|
|
287
|
+
if nil != err {
|
|
288
|
+
// An absent file - or an absent directory - means "no secrets
|
|
289
|
+
// here", exactly like a missing .env. Anything else (permission
|
|
290
|
+
// denied, an unreadable mount) is a store that could not answer.
|
|
291
|
+
if errors.Is(err, fs.ErrNotExist) || errors.Is(err, syscall.ENOTDIR) {
|
|
292
|
+
return "", false, nil
|
|
293
|
+
}
|
|
294
|
+
return "", false, Fail("sekreto: file provider cannot read " + file + ": " + err.Error())
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
text := string(raw)
|
|
298
|
+
if strings.HasSuffix(text, "\n") {
|
|
299
|
+
text = strings.TrimSuffix(strings.TrimSuffix(text, "\n"), "\r")
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return text, true, nil
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
func (provider *FileProvider) Describe() string {
|
|
306
|
+
return "file:" + provider.Dir
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// --- providers as voxgig/plugin definitions ----------------------------
|
|
310
|
+
|
|
311
|
+
// ProviderExport is the export key under which a provider definition
|
|
312
|
+
// publishes the provider it built. New reads `<ref>/provider` off the host.
|
|
313
|
+
const ProviderExport = "provider"
|
|
314
|
+
|
|
315
|
+
// ErrorCode is the voxgig/plugin error code a SekretoError travels under
|
|
316
|
+
// when a definition's Define returns it.
|
|
317
|
+
//
|
|
318
|
+
// plugin wraps a code-less error returned by a callback as
|
|
319
|
+
// `plugin_define_failed`, and keeps an error that already carries a code.
|
|
320
|
+
// A provider that refuses its own configuration - `kv: 3`, a missing
|
|
321
|
+
// project - returns a SekretoError, and that message is pinned by the
|
|
322
|
+
// spec byte for byte, so it must come back out of the host exactly as it
|
|
323
|
+
// went in. ProviderPlugin gives it this code on the way in; New turns it
|
|
324
|
+
// back into a SekretoError on the way out.
|
|
325
|
+
const ErrorCode = "sekreto_error"
|
|
326
|
+
|
|
327
|
+
// ProviderPlugin is a provider kind, as a voxgig/plugin definition.
|
|
328
|
+
//
|
|
329
|
+
// This is the whole bridge between the two libraries. The definition's
|
|
330
|
+
// Name is the Kind a ProviderSpec names; its Define reads the spec back
|
|
331
|
+
// off the instance's options, builds the provider with make, and exports
|
|
332
|
+
// it. Nothing runs at activate: a provider opens nothing until its first
|
|
333
|
+
// Lookup, so there is nothing to capture - a provider that does hold a
|
|
334
|
+
// resource acquires it there and lets the instance scope unwind it.
|
|
335
|
+
//
|
|
336
|
+
// Every built-in and every plugin is made this way, so a custom provider
|
|
337
|
+
// kind is one call:
|
|
338
|
+
//
|
|
339
|
+
// sekreto.ProviderPlugin("mystore", func(spec *sekreto.ProviderSpec) (sekreto.Provider, error) {
|
|
340
|
+
// return &MyStore{Addr: spec.Addr}, nil
|
|
341
|
+
// })
|
|
342
|
+
func ProviderPlugin(kind string, make func(spec *ProviderSpec) (Provider, error)) plugin.Definition {
|
|
343
|
+
return plugin.Definition{
|
|
344
|
+
Name: kind,
|
|
345
|
+
Define: func(inst *plugin.Inst) error {
|
|
346
|
+
spec, err := SpecOf(inst.Options())
|
|
347
|
+
if nil != err {
|
|
348
|
+
return err
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
provider, err := make(spec)
|
|
352
|
+
if nil != err {
|
|
353
|
+
var serr *SekretoError
|
|
354
|
+
if errors.As(err, &serr) {
|
|
355
|
+
return plugin.Fail(ErrorCode, serr.Message,
|
|
356
|
+
map[string]any{"ref": inst.Ref(), "cause": serr.Message})
|
|
357
|
+
}
|
|
358
|
+
return err
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
inst.Export(ProviderExport, provider)
|
|
362
|
+
return nil
|
|
363
|
+
},
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// SpecOf reads a ProviderSpec back off a plugin instance's options map -
|
|
368
|
+
// the JSON shape OptionsOf produced, and the shape a config document
|
|
369
|
+
// would.
|
|
370
|
+
func SpecOf(options map[string]any) (*ProviderSpec, error) {
|
|
371
|
+
text, err := json.Marshal(options)
|
|
372
|
+
if nil != err {
|
|
373
|
+
return nil, Fail("sekreto: unreadable provider options: " + err.Error())
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
spec := &ProviderSpec{}
|
|
377
|
+
if err := json.Unmarshal(text, spec); nil != err {
|
|
378
|
+
return nil, Fail("sekreto: unreadable provider options: " + err.Error())
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
return spec, nil
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// OptionsOf is a ProviderSpec as a plugin instance's options map: its
|
|
385
|
+
// JSON form, which is the spec's own key names.
|
|
386
|
+
func OptionsOf(spec *ProviderSpec) (map[string]any, error) {
|
|
387
|
+
text, err := json.Marshal(spec)
|
|
388
|
+
if nil != err {
|
|
389
|
+
return nil, Fail("sekreto: unwritable provider spec: " + err.Error())
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
options := map[string]any{}
|
|
393
|
+
if err := json.Unmarshal(text, &options); nil != err {
|
|
394
|
+
return nil, Fail("sekreto: unwritable provider spec: " + err.Error())
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
return options, nil
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// Builtins is the four built-in provider kinds, as definitions, in a fresh
|
|
401
|
+
// slice: env, memory, dotenv and file - the same four in every port. New
|
|
402
|
+
// puts them in every catalog ahead of the plugins it is handed.
|
|
403
|
+
func Builtins() []plugin.Definition {
|
|
404
|
+
return []plugin.Definition{
|
|
405
|
+
ProviderPlugin("env", func(spec *ProviderSpec) (Provider, error) {
|
|
406
|
+
return &EnvProvider{Prefix: spec.Prefix}, nil
|
|
407
|
+
}),
|
|
408
|
+
ProviderPlugin("memory", func(spec *ProviderSpec) (Provider, error) {
|
|
409
|
+
values := spec.Values
|
|
410
|
+
if nil == values {
|
|
411
|
+
values = map[string]string{}
|
|
412
|
+
}
|
|
413
|
+
return &MemoryProvider{Values: values, Prefix: spec.Prefix}, nil
|
|
414
|
+
}),
|
|
415
|
+
ProviderPlugin("dotenv", func(spec *ProviderSpec) (Provider, error) {
|
|
416
|
+
file := spec.File
|
|
417
|
+
if "" == file {
|
|
418
|
+
file = ".env"
|
|
419
|
+
}
|
|
420
|
+
return &DotenvProvider{File: file, Prefix: spec.Prefix}, nil
|
|
421
|
+
}),
|
|
422
|
+
ProviderPlugin("file", func(spec *ProviderSpec) (Provider, error) {
|
|
423
|
+
return &FileProvider{Dir: spec.Dir, Prefix: spec.Prefix}, nil
|
|
424
|
+
}),
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// Kinds is every kind this library ships, built in or as a plugin, so that
|
|
429
|
+
// an unknown kind can be told from a plugin that was not loaded.
|
|
430
|
+
var Kinds = struct {
|
|
431
|
+
Builtin []string
|
|
432
|
+
Plugin []string
|
|
433
|
+
}{
|
|
434
|
+
Builtin: []string{"env", "memory", "dotenv", "file"},
|
|
435
|
+
Plugin: []string{
|
|
436
|
+
"hashicorp", "boru", "awssecrets", "awsparams", "gcpsecrets",
|
|
437
|
+
"azuresecrets", "onepassword", "doppler", "infisical", "secretspec",
|
|
438
|
+
},
|
|
439
|
+
}
|