@voxgig/sdkgen 4.8.1 → 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 +2 -2
- 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,62 @@
|
|
|
1
|
+
# VENDORED: @voxgig/sekreto 0.2.0 (python/voxgig_sekreto/plugins/doppler.py)
|
|
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 doppler plugin: Doppler, one bulk download per config. Needs
|
|
5
|
+
# HTTPS. A port of typescript/plugins/doppler.ts.
|
|
6
|
+
from ..addr import checkaddr
|
|
7
|
+
from ..sekreto import SekretoError, envkey
|
|
8
|
+
from ..providers import Provider, providerplugin
|
|
9
|
+
from .httpjson import fetchjson, urlpart
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DopplerProvider(Provider):
|
|
13
|
+
"""Doppler.
|
|
14
|
+
|
|
15
|
+
The whole config is downloaded once - Doppler's own bulk endpoint -
|
|
16
|
+
and answered from memory, like a remote .env: `api.token` is the
|
|
17
|
+
`API_TOKEN` entry. A service token is config-scoped, so project and
|
|
18
|
+
config are only needed with broader tokens.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(self, options=None):
|
|
22
|
+
self.opts = options or {}
|
|
23
|
+
self.values = None
|
|
24
|
+
|
|
25
|
+
def load(self):
|
|
26
|
+
if self.values is not None:
|
|
27
|
+
return self.values
|
|
28
|
+
|
|
29
|
+
addr = (self.opts.get('addr') or 'https://api.doppler.com').rstrip('/')
|
|
30
|
+
checkaddr(addr)
|
|
31
|
+
|
|
32
|
+
url = addr + '/v3/configs/config/secrets/download?format=json'
|
|
33
|
+
if self.opts.get('project'):
|
|
34
|
+
url += '&project=' + urlpart(self.opts['project'])
|
|
35
|
+
if self.opts.get('config'):
|
|
36
|
+
url += '&config=' + urlpart(self.opts['config'])
|
|
37
|
+
|
|
38
|
+
status, body = fetchjson(
|
|
39
|
+
'GET', url, {'authorization': 'Bearer ' + (self.opts.get('token') or '')}
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
if 200 != status or not isinstance(body, dict):
|
|
43
|
+
raise SekretoError('sekreto: doppler error: ' + str(status))
|
|
44
|
+
|
|
45
|
+
self.values = {}
|
|
46
|
+
for key, value in body.items():
|
|
47
|
+
if value is not None:
|
|
48
|
+
self.values[key] = str(value)
|
|
49
|
+
|
|
50
|
+
return self.values
|
|
51
|
+
|
|
52
|
+
def lookup(self, name):
|
|
53
|
+
return self.load().get(envkey(name))
|
|
54
|
+
|
|
55
|
+
def describe(self):
|
|
56
|
+
if self.opts.get('project'):
|
|
57
|
+
return 'doppler:' + self.opts['project'] + '/' + (self.opts.get('config') or '')
|
|
58
|
+
return 'doppler'
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# The plugin: the `doppler` provider kind, as a voxgig/plugin definition.
|
|
62
|
+
doppler = providerplugin('doppler', DopplerProvider)
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# VENDORED: @voxgig/sekreto 0.2.0 (python/voxgig_sekreto/plugins/gcpsecrets.py)
|
|
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 gcpsecrets plugin: GCP Secret Manager. Needs HTTPS. A port of
|
|
5
|
+
# typescript/plugins/gcpsecrets.ts.
|
|
6
|
+
import base64
|
|
7
|
+
import os
|
|
8
|
+
import time
|
|
9
|
+
|
|
10
|
+
from ..addr import checkaddr
|
|
11
|
+
from ..sekreto import SekretoError, flatname
|
|
12
|
+
from ..providers import Provider, providerplugin
|
|
13
|
+
from .httpjson import fetchjson, tonumber
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class GcpsecretsProvider(Provider):
|
|
17
|
+
"""GCP Secret Manager.
|
|
18
|
+
|
|
19
|
+
`api.token` reads secret `api_token` (dots flattened to `_`; Secret
|
|
20
|
+
Manager ids have no hierarchy and reject dots), latest version. The
|
|
21
|
+
token comes from config, then `GOOGLE_OAUTH_ACCESS_TOKEN`, then the
|
|
22
|
+
GCE/GKE metadata server - so on Google's own platform no credential
|
|
23
|
+
configuration is needed at all.
|
|
24
|
+
|
|
25
|
+
The metadata call itself is plain http to a link-local host by
|
|
26
|
+
platform design; no credential rides on it, so `checkaddr` guards the
|
|
27
|
+
Secret Manager address instead.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def __init__(self, options=None):
|
|
31
|
+
self.opts = options or {}
|
|
32
|
+
|
|
33
|
+
# A configured token is kept forever; a metadata-server token carries
|
|
34
|
+
# expires_in and is renewed shortly before it runs out.
|
|
35
|
+
self.livetoken = None
|
|
36
|
+
self.renewat = float('inf')
|
|
37
|
+
|
|
38
|
+
def metadataaddr(self):
|
|
39
|
+
if self.opts.get('metadataaddr'):
|
|
40
|
+
return self.opts['metadataaddr']
|
|
41
|
+
host = os.environ.get('GCE_METADATA_HOST')
|
|
42
|
+
return 'http://' + host if host else 'http://metadata.google.internal'
|
|
43
|
+
|
|
44
|
+
def login(self):
|
|
45
|
+
configured = self.opts.get('token') or os.environ.get('GOOGLE_OAUTH_ACCESS_TOKEN')
|
|
46
|
+
if configured:
|
|
47
|
+
return configured
|
|
48
|
+
|
|
49
|
+
url = (self.metadataaddr().rstrip('/')
|
|
50
|
+
+ '/computeMetadata/v1/instance/service-accounts/default/token')
|
|
51
|
+
|
|
52
|
+
status, body = fetchjson('GET', url, {'Metadata-Flavor': 'Google'})
|
|
53
|
+
|
|
54
|
+
got = (body or {}).get('access_token')
|
|
55
|
+
if 200 != status or not got:
|
|
56
|
+
raise SekretoError('sekreto: gcp: no token and metadata server did not answer')
|
|
57
|
+
|
|
58
|
+
expires = tonumber((body or {}).get('expires_in'))
|
|
59
|
+
self.renewat = time.time() + max(expires - 60, 1) if 0 < expires else float('inf')
|
|
60
|
+
|
|
61
|
+
return str(got)
|
|
62
|
+
|
|
63
|
+
def lookup(self, name):
|
|
64
|
+
project = self.opts.get('project') or ''
|
|
65
|
+
if '' == project:
|
|
66
|
+
raise SekretoError('sekreto: gcp: no project')
|
|
67
|
+
|
|
68
|
+
addr = self.opts.get('addr') or 'https://secretmanager.googleapis.com'
|
|
69
|
+
checkaddr(addr)
|
|
70
|
+
|
|
71
|
+
if self.livetoken is None or time.time() >= self.renewat:
|
|
72
|
+
self.livetoken = self.login()
|
|
73
|
+
|
|
74
|
+
url = (addr.rstrip('/') + '/v1/projects/' + project + '/secrets/'
|
|
75
|
+
+ flatname(name, '_') + '/versions/latest:access')
|
|
76
|
+
|
|
77
|
+
status, body = fetchjson('GET', url, {'authorization': 'Bearer ' + self.livetoken})
|
|
78
|
+
|
|
79
|
+
if 404 == status:
|
|
80
|
+
return None
|
|
81
|
+
|
|
82
|
+
if 200 != status:
|
|
83
|
+
raise SekretoError('sekreto: gcp error: ' + str(status) + ': ' + url)
|
|
84
|
+
|
|
85
|
+
data = ((body or {}).get('payload') or {}).get('data')
|
|
86
|
+
if not isinstance(data, str):
|
|
87
|
+
return None
|
|
88
|
+
|
|
89
|
+
# See the aws provider: validate=True, and an undecodable payload
|
|
90
|
+
# is an error rather than a miss.
|
|
91
|
+
try:
|
|
92
|
+
return base64.b64decode(data, validate=True).decode('utf8')
|
|
93
|
+
except Exception:
|
|
94
|
+
raise SekretoError('sekreto: gcp: undecodable secret')
|
|
95
|
+
|
|
96
|
+
def describe(self):
|
|
97
|
+
return 'gcpsecrets:' + (self.opts.get('project') or '')
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
# The plugin: the `gcpsecrets` provider kind, as a voxgig/plugin definition.
|
|
101
|
+
gcpsecrets = providerplugin('gcpsecrets', GcpsecretsProvider)
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# VENDORED: @voxgig/sekreto 0.2.0 (python/voxgig_sekreto/plugins/hashicorp.py)
|
|
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 hashicorp plugin: HashiCorp Vault, and OpenBao. Needs HTTPS, and
|
|
5
|
+
# the filesystem for a kubernetes service-account JWT. A port of
|
|
6
|
+
# typescript/plugins/hashicorp.ts.
|
|
7
|
+
import json
|
|
8
|
+
import time
|
|
9
|
+
|
|
10
|
+
from ..addr import checkaddr
|
|
11
|
+
from ..sekreto import SekretoError, vaultref
|
|
12
|
+
from ..providers import Provider, providerplugin
|
|
13
|
+
from .httpjson import fetchjson, tonumber
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class HashicorpProvider(Provider):
|
|
17
|
+
"""HashiCorp Vault.
|
|
18
|
+
|
|
19
|
+
KV v2 (the default): `api.token` reads `{addr}/v1/{mount}/data/api`
|
|
20
|
+
and takes the `token` field of `data.data`. KV v1 (`kv: 1`) reads
|
|
21
|
+
`{addr}/v1/{mount}/api` and takes the field of `data`. A 404 means
|
|
22
|
+
"not here" - a miss - so a vault can sit in a chain with fallbacks.
|
|
23
|
+
|
|
24
|
+
A Vault Enterprise namespace rides the X-Vault-Namespace header, on
|
|
25
|
+
logins as well as reads.
|
|
26
|
+
|
|
27
|
+
Instead of being handed a token, the provider can log in: Kubernetes
|
|
28
|
+
auth (the pod's service-account JWT, from its conventional path) or
|
|
29
|
+
AppRole. A failed login is an error, never a miss - it means this
|
|
30
|
+
store could not answer at all.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __init__(self, addr, token, mount=None, kv=None, vaultnamespace=None, auth=None):
|
|
34
|
+
self.addr = addr
|
|
35
|
+
self.mount = mount or 'secret'
|
|
36
|
+
self.kv = kv or 2
|
|
37
|
+
self.vaultnamespace = vaultnamespace
|
|
38
|
+
self.auth = auth
|
|
39
|
+
|
|
40
|
+
# A version typo like kv: 3 must not quietly behave as v2 and turn
|
|
41
|
+
# its 404s into misses; there is nothing safe to assume it meant.
|
|
42
|
+
if 1 != self.kv and 2 != self.kv:
|
|
43
|
+
raise SekretoError(
|
|
44
|
+
'sekreto: hashicorp: unsupported kv version: ' + str(self.kv)
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
# The working token: a configured token is kept forever, a logged-in
|
|
48
|
+
# token is renewed shortly before its lease runs out - a long-running
|
|
49
|
+
# process must not keep presenting a token the vault already expired.
|
|
50
|
+
self.livetoken = None if '' == token else token
|
|
51
|
+
self.renewat = float('inf')
|
|
52
|
+
|
|
53
|
+
def baseheaders(self):
|
|
54
|
+
headers = {}
|
|
55
|
+
if self.vaultnamespace:
|
|
56
|
+
headers['X-Vault-Namespace'] = self.vaultnamespace
|
|
57
|
+
return headers
|
|
58
|
+
|
|
59
|
+
def login(self):
|
|
60
|
+
auth = self.auth
|
|
61
|
+
if not auth:
|
|
62
|
+
raise SekretoError('sekreto: hashicorp: no token and no auth method')
|
|
63
|
+
|
|
64
|
+
method = auth.get('method')
|
|
65
|
+
mount = auth.get('mount') or method
|
|
66
|
+
url = self.addr.rstrip('/') + '/v1/auth/' + str(mount) + '/login'
|
|
67
|
+
|
|
68
|
+
if 'kubernetes' == method:
|
|
69
|
+
jwt = auth.get('jwt')
|
|
70
|
+
if jwt is None:
|
|
71
|
+
file = (
|
|
72
|
+
auth.get('jwtfile')
|
|
73
|
+
or '/var/run/secrets/kubernetes.io/serviceaccount/token'
|
|
74
|
+
)
|
|
75
|
+
try:
|
|
76
|
+
with open(file, 'r', encoding='utf8') as handle:
|
|
77
|
+
jwt = handle.read().strip()
|
|
78
|
+
except OSError:
|
|
79
|
+
raise SekretoError('sekreto: hashicorp: cannot read jwt file ' + file)
|
|
80
|
+
body = {'role': auth.get('role') or '', 'jwt': jwt}
|
|
81
|
+
elif 'approle' == method:
|
|
82
|
+
body = {
|
|
83
|
+
'role_id': auth.get('roleid') or '',
|
|
84
|
+
'secret_id': auth.get('secretid') or '',
|
|
85
|
+
}
|
|
86
|
+
else:
|
|
87
|
+
raise SekretoError(
|
|
88
|
+
'sekreto: hashicorp: unknown auth method: ' + str(method)
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
status, resbody = fetchjson(
|
|
92
|
+
'POST', url, self.baseheaders(), json.dumps(body, separators=(',', ':'))
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
got = ((resbody or {}).get('auth') or {}).get('client_token')
|
|
96
|
+
if 200 != status or not got:
|
|
97
|
+
raise SekretoError(
|
|
98
|
+
'sekreto: hashicorp login failed: ' + str(status) + ': ' + url
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
lease = tonumber(((resbody or {}).get('auth') or {}).get('lease_duration'))
|
|
102
|
+
self.renewat = time.time() + max(lease - 60, 1) if 0 < lease else float('inf')
|
|
103
|
+
|
|
104
|
+
return str(got)
|
|
105
|
+
|
|
106
|
+
def lookup(self, name):
|
|
107
|
+
checkaddr(self.addr)
|
|
108
|
+
|
|
109
|
+
if self.livetoken is None or time.time() >= self.renewat:
|
|
110
|
+
self.livetoken = self.login()
|
|
111
|
+
|
|
112
|
+
ref = vaultref(name)
|
|
113
|
+
base = self.addr.rstrip('/') + '/v1/' + self.mount
|
|
114
|
+
url = base + '/' + ref['path'] if 1 == self.kv else base + '/data/' + ref['path']
|
|
115
|
+
|
|
116
|
+
headers = self.baseheaders()
|
|
117
|
+
headers['X-Vault-Token'] = self.livetoken
|
|
118
|
+
|
|
119
|
+
status, body = fetchjson('GET', url, headers)
|
|
120
|
+
|
|
121
|
+
if 404 == status:
|
|
122
|
+
return None
|
|
123
|
+
|
|
124
|
+
if 200 != status:
|
|
125
|
+
raise SekretoError('sekreto: hashicorp error: ' + str(status) + ': ' + url)
|
|
126
|
+
|
|
127
|
+
if 1 == self.kv:
|
|
128
|
+
data = (body or {}).get('data')
|
|
129
|
+
else:
|
|
130
|
+
data = ((body or {}).get('data') or {}).get('data')
|
|
131
|
+
|
|
132
|
+
value = data.get(ref['field']) if isinstance(data, dict) else None
|
|
133
|
+
|
|
134
|
+
return None if value is None else str(value)
|
|
135
|
+
|
|
136
|
+
def describe(self):
|
|
137
|
+
return 'hashicorp:' + self.addr + '/' + self.mount
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def _make(spec):
|
|
141
|
+
return HashicorpProvider(
|
|
142
|
+
spec.get('addr') or '',
|
|
143
|
+
spec.get('token') or '',
|
|
144
|
+
spec.get('mount'),
|
|
145
|
+
spec.get('kv'),
|
|
146
|
+
spec.get('vaultnamespace'),
|
|
147
|
+
spec.get('auth'),
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
# The plugin: the `hashicorp` provider kind, as a voxgig/plugin definition.
|
|
152
|
+
hashicorp = providerplugin('hashicorp', _make)
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# VENDORED: @voxgig/sekreto 0.2.0 (python/voxgig_sekreto/plugins/httpjson.py)
|
|
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 HTTP half of every plugin that speaks to a store over the wire, in
|
|
5
|
+
# one place and OUTSIDE the core: a chain of built-ins never imports this
|
|
6
|
+
# module. One JSON round-trip, bounded in time and in size, refusing
|
|
7
|
+
# redirects and ignoring proxies; and the small helpers every store client
|
|
8
|
+
# needs. A port of typescript/plugins/httpjson.ts.
|
|
9
|
+
|
|
10
|
+
import json
|
|
11
|
+
import urllib.error
|
|
12
|
+
import urllib.parse
|
|
13
|
+
import urllib.request
|
|
14
|
+
|
|
15
|
+
from ..sekreto import SekretoError
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# How long any single vault round-trip may take before it is treated as
|
|
19
|
+
# unreachable, in seconds. Ports carry the same bound.
|
|
20
|
+
_HTTP_TIMEOUT = 10
|
|
21
|
+
|
|
22
|
+
# How much of a response body will be read before the store is treated as
|
|
23
|
+
# having answered incoherently. Ports carry the same bound.
|
|
24
|
+
#
|
|
25
|
+
# Far above anything real - the largest legitimate payload this library
|
|
26
|
+
# fetches is Doppler's whole-config download, measured in kilobytes. A bound
|
|
27
|
+
# is needed because the TIMEOUT is not one: ten seconds on a loopback or
|
|
28
|
+
# datacentre link is gigabytes, and the body is accumulated in memory before
|
|
29
|
+
# it is parsed. This runs on an application's startup path, so the failure is
|
|
30
|
+
# the application never starting.
|
|
31
|
+
_HTTP_MAXBODY = 8 * 1024 * 1024
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class _NoRedirect(urllib.request.HTTPRedirectHandler):
|
|
35
|
+
"""A redirect handler that refuses to follow: a vault API never
|
|
36
|
+
legitimately redirects, and following one would resend the vault token
|
|
37
|
+
to the redirect's host."""
|
|
38
|
+
|
|
39
|
+
def redirect_request(self, *args, **kwargs):
|
|
40
|
+
return None
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# A secrets client dials the address it was configured with and nowhere
|
|
44
|
+
# else. urllib installs a ProxyHandler from the environment by default, and
|
|
45
|
+
# its proxy resolution does NOT exempt loopback - so with http_proxy set,
|
|
46
|
+
# `X-Vault-Token` for a local dev vault went, in the clear, to whatever that
|
|
47
|
+
# variable named. checkaddr permits plaintext to loopback precisely because
|
|
48
|
+
# nothing leaves the machine; an environment variable it cannot see must not
|
|
49
|
+
# be able to make that false. An empty ProxyHandler turns the whole
|
|
50
|
+
# mechanism off.
|
|
51
|
+
_opener = urllib.request.build_opener(_NoRedirect, urllib.request.ProxyHandler({}))
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def fetchjson(method, url, headers, body=None):
|
|
55
|
+
"""One JSON round-trip, returning (status, parsed-json-or-None).
|
|
56
|
+
|
|
57
|
+
A 404 is a normal answer here, not an exception: callers decide on
|
|
58
|
+
status. Network failure is always an error - an unreachable store is a
|
|
59
|
+
store that could not answer.
|
|
60
|
+
"""
|
|
61
|
+
data = None if body is None else body.encode('utf8')
|
|
62
|
+
request = urllib.request.Request(url, data=data, headers=headers, method=method)
|
|
63
|
+
|
|
64
|
+
try:
|
|
65
|
+
# No redirects (a followed one carries X-Vault-Token to the target,
|
|
66
|
+
# which checkaddr cannot see) and a bounded wait (an accepted-but-
|
|
67
|
+
# silent endpoint must not hang the caller forever). A 3xx surfaces
|
|
68
|
+
# as an HTTPError below and is treated as a store error.
|
|
69
|
+
with _opener.open(request, timeout=_HTTP_TIMEOUT) as response:
|
|
70
|
+
status = response.status
|
|
71
|
+
raw = response.read(_HTTP_MAXBODY + 1)
|
|
72
|
+
except urllib.error.HTTPError as err:
|
|
73
|
+
status = err.code
|
|
74
|
+
raw = err.read(_HTTP_MAXBODY + 1)
|
|
75
|
+
except urllib.error.URLError as err:
|
|
76
|
+
raise SekretoError(
|
|
77
|
+
'sekreto: cannot reach ' + url.split('?')[0] + ': ' + str(err.reason)
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
# One byte over the bound is enough to know it was exceeded. An endless
|
|
81
|
+
# body is a store that could not answer, so this raises rather than
|
|
82
|
+
# returning a miss - the latter would fall through to a weaker store on
|
|
83
|
+
# an attacker's cue.
|
|
84
|
+
if _HTTP_MAXBODY < len(raw):
|
|
85
|
+
raise SekretoError('sekreto: oversized response from ' + url.split('?')[0])
|
|
86
|
+
|
|
87
|
+
text = raw.decode('utf8', 'replace')
|
|
88
|
+
|
|
89
|
+
try:
|
|
90
|
+
return status, json.loads(text)
|
|
91
|
+
except ValueError:
|
|
92
|
+
# A success status promised JSON; a body that does not parse means
|
|
93
|
+
# the store could not answer coherently, and treating it as a miss
|
|
94
|
+
# would fall through to a weaker store. Error statuses may carry
|
|
95
|
+
# any body - they are decided on status alone.
|
|
96
|
+
if 200 == status:
|
|
97
|
+
raise SekretoError('sekreto: malformed response from ' + url.split('?')[0])
|
|
98
|
+
return status, None
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def urlpart(text):
|
|
102
|
+
"""One URL component, escaped the way encodeURIComponent does it -
|
|
103
|
+
the addresses built here must match the canonical port's byte for
|
|
104
|
+
byte."""
|
|
105
|
+
return urllib.parse.quote(str(text), safe="-_.!~*'()")
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def tonumber(value):
|
|
109
|
+
"""The canonical port's Number() as expiry fields need it: a number
|
|
110
|
+
or numeric string converts (expires_in may arrive as a string);
|
|
111
|
+
anything else becomes 0, which means "never renew"."""
|
|
112
|
+
try:
|
|
113
|
+
return float(value)
|
|
114
|
+
except (TypeError, ValueError):
|
|
115
|
+
return 0
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# VENDORED: @voxgig/sekreto 0.2.0 (python/voxgig_sekreto/plugins/infisical.py)
|
|
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 infisical plugin: Infisical. Needs HTTPS. A port of
|
|
5
|
+
# typescript/plugins/infisical.ts.
|
|
6
|
+
import json
|
|
7
|
+
import time
|
|
8
|
+
|
|
9
|
+
from ..addr import checkaddr
|
|
10
|
+
from ..sekreto import SekretoError, envkey
|
|
11
|
+
from ..providers import Provider, providerplugin
|
|
12
|
+
from .httpjson import fetchjson, tonumber, urlpart
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class InfisicalProvider(Provider):
|
|
16
|
+
"""Infisical.
|
|
17
|
+
|
|
18
|
+
`api.token` reads the secret keyed `API_TOKEN` (Infisical's own
|
|
19
|
+
convention is environment-style keys) at a secret path in one
|
|
20
|
+
environment of a project. Auth is a token, or a universal-auth
|
|
21
|
+
(machine identity) login with clientid/clientsecret.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def __init__(self, options=None):
|
|
25
|
+
self.opts = options or {}
|
|
26
|
+
|
|
27
|
+
# A configured token is kept forever; a universal-auth token carries
|
|
28
|
+
# expiresIn and is renewed shortly before it runs out.
|
|
29
|
+
self.livetoken = None
|
|
30
|
+
self.renewat = float('inf')
|
|
31
|
+
|
|
32
|
+
def login(self, addr):
|
|
33
|
+
if self.opts.get('token'):
|
|
34
|
+
return self.opts['token']
|
|
35
|
+
|
|
36
|
+
if not self.opts.get('clientid') or not self.opts.get('clientsecret'):
|
|
37
|
+
raise SekretoError('sekreto: infisical: no token and no client credentials')
|
|
38
|
+
|
|
39
|
+
status, body = fetchjson(
|
|
40
|
+
'POST',
|
|
41
|
+
addr + '/api/v1/auth/universal-auth/login',
|
|
42
|
+
{'content-type': 'application/json'},
|
|
43
|
+
json.dumps(
|
|
44
|
+
{'clientId': self.opts['clientid'], 'clientSecret': self.opts['clientsecret']},
|
|
45
|
+
separators=(',', ':'),
|
|
46
|
+
),
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
got = (body or {}).get('accessToken')
|
|
50
|
+
if 200 != status or not got:
|
|
51
|
+
raise SekretoError('sekreto: infisical login failed: ' + str(status))
|
|
52
|
+
|
|
53
|
+
expires = tonumber((body or {}).get('expiresIn'))
|
|
54
|
+
self.renewat = time.time() + max(expires - 60, 1) if 0 < expires else float('inf')
|
|
55
|
+
|
|
56
|
+
return str(got)
|
|
57
|
+
|
|
58
|
+
def lookup(self, name):
|
|
59
|
+
addr = (self.opts.get('addr') or 'https://app.infisical.com').rstrip('/')
|
|
60
|
+
checkaddr(addr)
|
|
61
|
+
|
|
62
|
+
project = self.opts.get('project') or ''
|
|
63
|
+
environment = self.opts.get('environment') or ''
|
|
64
|
+
if '' == project or '' == environment:
|
|
65
|
+
raise SekretoError('sekreto: infisical: no project/environment')
|
|
66
|
+
|
|
67
|
+
if self.livetoken is None or time.time() >= self.renewat:
|
|
68
|
+
self.livetoken = self.login(addr)
|
|
69
|
+
|
|
70
|
+
url = (addr + '/api/v3/secrets/raw/' + envkey(name)
|
|
71
|
+
+ '?workspaceId=' + urlpart(project)
|
|
72
|
+
+ '&environment=' + urlpart(environment)
|
|
73
|
+
+ '&secretPath=' + urlpart(self.opts.get('path') or '/'))
|
|
74
|
+
|
|
75
|
+
status, body = fetchjson('GET', url, {'authorization': 'Bearer ' + self.livetoken})
|
|
76
|
+
|
|
77
|
+
if 404 == status:
|
|
78
|
+
return None
|
|
79
|
+
|
|
80
|
+
if 200 != status:
|
|
81
|
+
raise SekretoError('sekreto: infisical error: ' + str(status))
|
|
82
|
+
|
|
83
|
+
value = ((body or {}).get('secret') or {}).get('secretValue')
|
|
84
|
+
return None if value is None else str(value)
|
|
85
|
+
|
|
86
|
+
def describe(self):
|
|
87
|
+
return ('infisical:' + (self.opts.get('project') or '')
|
|
88
|
+
+ '/' + (self.opts.get('environment') or ''))
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
# The plugin: the `infisical` provider kind, as a voxgig/plugin definition.
|
|
92
|
+
infisical = providerplugin('infisical', InfisicalProvider)
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# VENDORED: @voxgig/sekreto 0.2.0 (python/voxgig_sekreto/plugins/onepassword.py)
|
|
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 onepassword plugin: 1Password, through a Connect server. Needs
|
|
5
|
+
# HTTPS. A port of typescript/plugins/onepassword.ts.
|
|
6
|
+
from ..addr import checkaddr
|
|
7
|
+
from ..sekreto import SekretoError, checkname
|
|
8
|
+
from ..providers import Provider, providerplugin
|
|
9
|
+
from .httpjson import fetchjson, urlpart
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class OnepasswordProvider(Provider):
|
|
13
|
+
"""1Password, through a Connect server.
|
|
14
|
+
|
|
15
|
+
The item titled `api.token` (titles keep their dots), in the named
|
|
16
|
+
vault. The value is the field with purpose PASSWORD, or the field
|
|
17
|
+
labelled `value`. A vault that cannot be found is an error - config
|
|
18
|
+
names it, so its absence is a broken store, not a missing secret.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(self, options=None):
|
|
22
|
+
self.opts = options or {}
|
|
23
|
+
self.vaultid = None
|
|
24
|
+
|
|
25
|
+
def authheaders(self):
|
|
26
|
+
return {'authorization': 'Bearer ' + (self.opts.get('token') or '')}
|
|
27
|
+
|
|
28
|
+
def resolvevault(self, addr):
|
|
29
|
+
want = self.opts.get('vault') or ''
|
|
30
|
+
if '' == want:
|
|
31
|
+
raise SekretoError('sekreto: onepassword: no vault')
|
|
32
|
+
|
|
33
|
+
status, body = fetchjson('GET', addr + '/v1/vaults', self.authheaders())
|
|
34
|
+
|
|
35
|
+
if 200 != status or not isinstance(body, list):
|
|
36
|
+
raise SekretoError(
|
|
37
|
+
'sekreto: onepassword error: ' + str(status) + ': listing vaults'
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
for entry in body:
|
|
41
|
+
if isinstance(entry, dict) and (want == entry.get('id') or want == entry.get('name')):
|
|
42
|
+
return str(entry.get('id'))
|
|
43
|
+
|
|
44
|
+
raise SekretoError('sekreto: onepassword: no vault named ' + want)
|
|
45
|
+
|
|
46
|
+
def lookup(self, name):
|
|
47
|
+
checkname(name)
|
|
48
|
+
|
|
49
|
+
addr = (self.opts.get('addr') or '').rstrip('/')
|
|
50
|
+
if '' == addr:
|
|
51
|
+
raise SekretoError('sekreto: onepassword: no addr')
|
|
52
|
+
checkaddr(addr)
|
|
53
|
+
|
|
54
|
+
if self.vaultid is None:
|
|
55
|
+
self.vaultid = self.resolvevault(addr)
|
|
56
|
+
|
|
57
|
+
filterpart = urlpart('title eq "' + name + '"')
|
|
58
|
+
status, found = fetchjson(
|
|
59
|
+
'GET',
|
|
60
|
+
addr + '/v1/vaults/' + self.vaultid + '/items?filter=' + filterpart,
|
|
61
|
+
self.authheaders(),
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
if 200 != status or not isinstance(found, list):
|
|
65
|
+
raise SekretoError(
|
|
66
|
+
'sekreto: onepassword error: ' + str(status) + ': finding ' + name
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
if 0 == len(found):
|
|
70
|
+
return None
|
|
71
|
+
|
|
72
|
+
status, item = fetchjson(
|
|
73
|
+
'GET',
|
|
74
|
+
addr + '/v1/vaults/' + self.vaultid + '/items/' + str(found[0].get('id')),
|
|
75
|
+
self.authheaders(),
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
if 200 != status:
|
|
79
|
+
raise SekretoError(
|
|
80
|
+
'sekreto: onepassword error: ' + str(status) + ': reading ' + name
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
fields = (item or {}).get('fields') or []
|
|
84
|
+
|
|
85
|
+
for field in fields:
|
|
86
|
+
if isinstance(field, dict) and 'PASSWORD' == field.get('purpose'):
|
|
87
|
+
value = field.get('value')
|
|
88
|
+
return None if value is None else str(value)
|
|
89
|
+
for field in fields:
|
|
90
|
+
if isinstance(field, dict) and 'value' == field.get('label'):
|
|
91
|
+
value = field.get('value')
|
|
92
|
+
return None if value is None else str(value)
|
|
93
|
+
|
|
94
|
+
return None
|
|
95
|
+
|
|
96
|
+
def describe(self):
|
|
97
|
+
return 'onepassword:' + (self.opts.get('vault') or '')
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
# The plugin: the `onepassword` provider kind, as a voxgig/plugin definition.
|
|
101
|
+
onepassword = providerplugin('onepassword', OnepasswordProvider)
|