@voxgig/sdkgen 4.8.2 → 4.9.0
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/model/target/zig.aon +9 -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/src/cmp/zig/Package_zig.ts +15 -11
- package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +3 -3
- package/project/.sdk/src/cmp/zig/fragment/EntityListOp.fragment.zig +3 -3
- package/project/.sdk/src/cmp/zig/fragment/Main.fragment.zig +3 -3
- package/project/.sdk/src/cmp/zig/utility_zig.ts +50 -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 +208 -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 +150 -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 +442 -0
- package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +714 -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 +902 -0
- package/project/.sdk/tm/go/test/omni/util.go +381 -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 +628 -0
- package/project/.sdk/tm/js/test/vendor/omni/util.js +229 -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 +76 -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 +151 -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 +90 -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 +475 -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 +580 -0
- package/project/.sdk/tm/py/test/voxgig_omni/util.py +252 -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/Makefile +15 -1
- package/project/.sdk/tm/zig/build.zig +23 -5
- package/project/.sdk/tm/zig/core/helpers.zig +52 -11
- package/project/.sdk/tm/zig/core/mem.zig +17 -1
- package/project/.sdk/tm/zig/core/utility.zig +23 -19
- package/project/.sdk/tm/zig/feature/audit.zig +2 -2
- package/project/.sdk/tm/zig/feature/cache.zig +2 -2
- package/project/.sdk/tm/zig/feature/debug.zig +5 -5
- package/project/.sdk/tm/zig/feature/netsim.zig +2 -2
- package/project/.sdk/tm/zig/feature/paging.zig +2 -2
- package/project/.sdk/tm/zig/feature/proxy.zig +15 -8
- package/project/.sdk/tm/zig/feature/streaming.zig +5 -5
- package/project/.sdk/tm/zig/feature/support.zig +3 -3
- package/project/.sdk/tm/zig/feature/telemetry.zig +5 -5
- package/project/.sdk/tm/zig/feature/test.zig +10 -5
- package/project/.sdk/tm/zig/test/fh.zig +10 -10
- package/project/.sdk/tm/zig/test/gotcha_test.zig +5 -5
- package/project/.sdk/tm/zig/test/omniresolver.zig +515 -0
- package/project/.sdk/tm/zig/test/omnismoke_test.zig +284 -0
- package/project/.sdk/tm/zig/test/pipeline_test.zig +8 -8
- package/project/.sdk/tm/zig/test/primary_utility_test.zig +145 -155
- package/project/.sdk/tm/zig/test/struct_corpus.zig +264 -187
- package/project/.sdk/tm/zig/test/vendor/omni/omni.zig +1314 -0
- package/project/.sdk/tm/zig/test/vendor/omni/regex.zig +446 -0
- package/project/.sdk/tm/zig/utility/voxgigstruct/regex.zig +7 -4
- package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +356 -157
- 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
- package/project/.sdk/tm/zig/test/struct_runner.zig +0 -464
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
# Behavioural tests for the secrets feature (vendored voxgig_sekreto).
|
|
2
|
+
#
|
|
3
|
+
# The contract under test: the `apikey` OPTION keeps its exact old meaning
|
|
4
|
+
# and always wins, because the secrets feature places it FIRST in the
|
|
5
|
+
# provider chain (a `memory` store named 'options') - explicit-beats-lookup
|
|
6
|
+
# falls out of sekreto's first-hit rule rather than from special-case
|
|
7
|
+
# logic. With the feature inactive nothing changes at all. With it active
|
|
8
|
+
# and the option unset, the chain (env, dotenv, a custom provider, a
|
|
9
|
+
# vault) supplies the credential instead.
|
|
10
|
+
#
|
|
11
|
+
# Every wire assertion here reads the header A MOCKED TRANSPORT RECEIVES,
|
|
12
|
+
# not the options map: the options map cannot tell a suppressed credential
|
|
13
|
+
# from a missing one, and the auth-null defect this suite pins was
|
|
14
|
+
# invisible to it.
|
|
15
|
+
#
|
|
16
|
+
# The feature instance is CONSTRUCTED HERE when this SDK was generated
|
|
17
|
+
# without the secrets class (the active-path proof cannot depend on the
|
|
18
|
+
# project having switched the feature on): `extend` carries it into the
|
|
19
|
+
# constructor, where feature_init runs it against the model options like
|
|
20
|
+
# any generated feature.
|
|
21
|
+
#
|
|
22
|
+
# This file lives in the test/feature/ container on purpose: `target add`
|
|
23
|
+
# trims it, along with the feature source and the vendored library, for a
|
|
24
|
+
# project whose model does not select `secrets`.
|
|
25
|
+
|
|
26
|
+
import json
|
|
27
|
+
import os
|
|
28
|
+
import http.server
|
|
29
|
+
import threading
|
|
30
|
+
import unittest
|
|
31
|
+
|
|
32
|
+
from projectname_sdk import ProjectNameSDK
|
|
33
|
+
from projectname_sdk.features import _has_feature
|
|
34
|
+
from projectname_sdk.feature.secrets_feature import ProjectNameSecretsFeature
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
ENVPREFIX = "PROJECTENV_TEST_SECRETS_"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def secrets_sdk(sdkopts):
|
|
41
|
+
"""An SDK with the secrets feature ACTIVE.
|
|
42
|
+
|
|
43
|
+
When this SDK was generated with the feature, the ordinary factory
|
|
44
|
+
path builds it; otherwise the instance rides in via `extend`, which is
|
|
45
|
+
the constructor's documented adopt path - init and the PreSpec hook
|
|
46
|
+
then run exactly as generated code would run them.
|
|
47
|
+
"""
|
|
48
|
+
if not _has_feature("secrets"):
|
|
49
|
+
sdkopts = dict(sdkopts)
|
|
50
|
+
sdkopts["extend"] = [ProjectNameSecretsFeature()]
|
|
51
|
+
return ProjectNameSDK(sdkopts)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def envchain(extra=None):
|
|
55
|
+
"""The feature options most of these tests use: an env provider."""
|
|
56
|
+
secrets = {
|
|
57
|
+
"active": True,
|
|
58
|
+
"providers": [{"kind": "env", "prefix": ENVPREFIX}],
|
|
59
|
+
}
|
|
60
|
+
if extra:
|
|
61
|
+
secrets.update(extra)
|
|
62
|
+
return {"feature": {"secrets": secrets}}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class RecordingTransport:
|
|
66
|
+
"""A live-mode system.fetch that records what reaches the wire."""
|
|
67
|
+
|
|
68
|
+
def __init__(self):
|
|
69
|
+
self.calls = []
|
|
70
|
+
|
|
71
|
+
def __call__(self, url, fetchdef):
|
|
72
|
+
self.calls.append({"url": url, "fetchdef": fetchdef})
|
|
73
|
+
return {"status": 200, "statusText": "OK", "headers": {},
|
|
74
|
+
"json": lambda: {}, "body": "{}"}, None
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class TestSecrets(unittest.TestCase):
|
|
78
|
+
|
|
79
|
+
def setUp(self):
|
|
80
|
+
os.environ.pop(ENVPREFIX + "APIKEY", None)
|
|
81
|
+
|
|
82
|
+
tearDown = setUp
|
|
83
|
+
|
|
84
|
+
def _sdk(self, sdkopts):
|
|
85
|
+
transport = RecordingTransport()
|
|
86
|
+
opts = {
|
|
87
|
+
# Concrete base: a live construction must satisfy any server
|
|
88
|
+
# variables a templated base URL declares.
|
|
89
|
+
"base": "http://localhost:8080",
|
|
90
|
+
"system": {"fetch": transport},
|
|
91
|
+
}
|
|
92
|
+
opts.update(sdkopts)
|
|
93
|
+
sdk = secrets_sdk(opts)
|
|
94
|
+
return sdk, transport
|
|
95
|
+
|
|
96
|
+
def _send(self, sdk, transport):
|
|
97
|
+
"""Resolve through the ENTITY-OP SEAM (the PreSpec feature hook -
|
|
98
|
+
exactly the call every generated entity op emits before
|
|
99
|
+
make_spec), build the request, and put it on the mocked wire."""
|
|
100
|
+
utility = sdk._utility
|
|
101
|
+
ctx = utility.make_context({"opname": "load"}, sdk.get_root_ctx())
|
|
102
|
+
utility.feature_hook(ctx, "PreSpec")
|
|
103
|
+
|
|
104
|
+
fetchdef = sdk.prepare({"path": "/"})
|
|
105
|
+
res, err = utility.fetcher(ctx, fetchdef["url"], fetchdef)
|
|
106
|
+
self.assertIsNone(err)
|
|
107
|
+
self.assertEqual(1, len(transport.calls))
|
|
108
|
+
return transport.calls[0]["fetchdef"].get("headers") or {}
|
|
109
|
+
|
|
110
|
+
def assert_credential(self, headers, token):
|
|
111
|
+
# The Authorization header carries the SPEC's credential prefix,
|
|
112
|
+
# which a TEMPLATE cannot know - assert on the CREDENTIAL and let
|
|
113
|
+
# the prefix be whatever this SDK's API declares.
|
|
114
|
+
got = str(headers.get("authorization") or "")
|
|
115
|
+
self.assertTrue(
|
|
116
|
+
got == token or got.endswith(" " + token),
|
|
117
|
+
"expected the authorization header to carry %s, got: %r"
|
|
118
|
+
% (token, got))
|
|
119
|
+
|
|
120
|
+
# --- the chain ---
|
|
121
|
+
|
|
122
|
+
def test_option_wins_over_chain(self):
|
|
123
|
+
os.environ[ENVPREFIX + "APIKEY"] = "ENVKEY01"
|
|
124
|
+
opts = {"apikey": "OPTKEY01"}
|
|
125
|
+
opts.update(envchain())
|
|
126
|
+
sdk, transport = self._sdk(opts)
|
|
127
|
+
|
|
128
|
+
headers = self._send(sdk, transport)
|
|
129
|
+
self.assert_credential(headers, "OPTKEY01")
|
|
130
|
+
|
|
131
|
+
# The explicit option is a real store, not a special case: a
|
|
132
|
+
# directed read names it like any other.
|
|
133
|
+
self.assertEqual(
|
|
134
|
+
"OPTKEY01", sdk._secrets.sekreto().getfrom("options", "apikey"))
|
|
135
|
+
|
|
136
|
+
def test_env_provider_supplies_the_credential(self):
|
|
137
|
+
os.environ[ENVPREFIX + "APIKEY"] = "ENVKEY01"
|
|
138
|
+
sdk, transport = self._sdk(envchain())
|
|
139
|
+
|
|
140
|
+
headers = self._send(sdk, transport)
|
|
141
|
+
self.assert_credential(headers, "ENVKEY01")
|
|
142
|
+
|
|
143
|
+
def test_custom_provider_supplies_the_credential(self):
|
|
144
|
+
# A custom provider is a MAP of callables (the exact parallel of
|
|
145
|
+
# ts's verbatim object-with-functions: python's options clone
|
|
146
|
+
# flattens a class instance, so the map shape is the contract).
|
|
147
|
+
asked = []
|
|
148
|
+
|
|
149
|
+
def lookup(name):
|
|
150
|
+
asked.append(name)
|
|
151
|
+
return "CUSTKEY01" if "apikey" == name else None
|
|
152
|
+
|
|
153
|
+
sdk, transport = self._sdk({
|
|
154
|
+
"feature": {"secrets": {
|
|
155
|
+
"active": True,
|
|
156
|
+
"providers": [{
|
|
157
|
+
"lookup": lookup,
|
|
158
|
+
"describe": lambda: "custom:test",
|
|
159
|
+
}],
|
|
160
|
+
}},
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
headers = self._send(sdk, transport)
|
|
164
|
+
self.assert_credential(headers, "CUSTKEY01")
|
|
165
|
+
self.assertEqual(["apikey"], asked)
|
|
166
|
+
|
|
167
|
+
# --- miss vs error ---
|
|
168
|
+
|
|
169
|
+
def test_a_miss_falls_through_to_no_credential(self):
|
|
170
|
+
# No env var, no option: the chain answers None, and the request
|
|
171
|
+
# goes out UNAUTHENTICATED - a miss is an answer, not a failure.
|
|
172
|
+
sdk, transport = self._sdk(envchain())
|
|
173
|
+
|
|
174
|
+
headers = self._send(sdk, transport)
|
|
175
|
+
self.assertNotIn("authorization", headers)
|
|
176
|
+
|
|
177
|
+
def test_a_provider_error_fails_the_op(self):
|
|
178
|
+
# A broken store is NOT a miss: resolution must raise (failing the
|
|
179
|
+
# op at the PreSpec seam), never fall through to an
|
|
180
|
+
# unauthenticated request because a vault was unreachable.
|
|
181
|
+
def broken_lookup(name):
|
|
182
|
+
raise RuntimeError("vault unreachable")
|
|
183
|
+
|
|
184
|
+
sdk, _transport = self._sdk({
|
|
185
|
+
"feature": {"secrets": {
|
|
186
|
+
"active": True,
|
|
187
|
+
"providers": [{
|
|
188
|
+
"lookup": broken_lookup,
|
|
189
|
+
"describe": lambda: "broken",
|
|
190
|
+
}],
|
|
191
|
+
}},
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
utility = sdk._utility
|
|
195
|
+
ctx = utility.make_context({"opname": "load"}, sdk.get_root_ctx())
|
|
196
|
+
with self.assertRaises(RuntimeError):
|
|
197
|
+
utility.feature_hook(ctx, "PreSpec")
|
|
198
|
+
|
|
199
|
+
# --- auth: None suppression ---
|
|
200
|
+
|
|
201
|
+
def test_auth_none_still_suppresses_the_credential(self):
|
|
202
|
+
# `auth: None` is the documented way to send NO credential, and it
|
|
203
|
+
# must beat BOTH the explicit option and the chain: the resolved
|
|
204
|
+
# value may land in options.apikey, but prepare_auth honours the
|
|
205
|
+
# suppression before it ever reads the apikey. The struct resync
|
|
206
|
+
# (validate now answers the optspec default for a stored None)
|
|
207
|
+
# makes make_options' capture-and-restore the only thing holding
|
|
208
|
+
# this - so it is pinned at the transport, where a leak would
|
|
209
|
+
# actually happen.
|
|
210
|
+
os.environ[ENVPREFIX + "APIKEY"] = "ENVKEY01"
|
|
211
|
+
opts = {"apikey": "LEAKKEY01", "auth": None}
|
|
212
|
+
opts.update(envchain())
|
|
213
|
+
sdk, transport = self._sdk(opts)
|
|
214
|
+
|
|
215
|
+
headers = self._send(sdk, transport)
|
|
216
|
+
self.assertNotIn("authorization", headers)
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
if __name__ == "__main__":
|
|
220
|
+
unittest.main()
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
# ---------------------------------------------------------------------
|
|
224
|
+
# Review-hardening pins (vendor-tag rollout, PR review): the exchange
|
|
225
|
+
# works with ORDINARY options (no custom transport, the stdlib fallback
|
|
226
|
+
# carries the purchase), and an uncached miss retracts the credential.
|
|
227
|
+
|
|
228
|
+
class _TokenEndpoint(http.server.BaseHTTPRequestHandler):
|
|
229
|
+
refresh_seen = None
|
|
230
|
+
|
|
231
|
+
def do_POST(self):
|
|
232
|
+
raw = self.rfile.read(int(self.headers.get("content-length") or 0))
|
|
233
|
+
try:
|
|
234
|
+
body = json.loads(raw.decode("utf-8"))
|
|
235
|
+
except Exception:
|
|
236
|
+
body = {}
|
|
237
|
+
_TokenEndpoint.refresh_seen = body.get("refresh_token")
|
|
238
|
+
out = json.dumps({"access_token": "RAWTOK01"}).encode("utf-8")
|
|
239
|
+
self.send_response(200)
|
|
240
|
+
self.send_header("content-type", "application/json")
|
|
241
|
+
self.send_header("content-length", str(len(out)))
|
|
242
|
+
self.end_headers()
|
|
243
|
+
self.wfile.write(out)
|
|
244
|
+
|
|
245
|
+
def log_message(self, *args):
|
|
246
|
+
pass
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
class TestSecretsReviewPins(unittest.TestCase):
|
|
250
|
+
|
|
251
|
+
def test_exchange_uses_the_raw_fallback_and_marshals_the_body(self):
|
|
252
|
+
# A refresh token full of JSON-hostile characters must arrive at
|
|
253
|
+
# the endpoint as its literal value, through the feature's OWN
|
|
254
|
+
# raw transport - ordinary options carry no system.fetch for it.
|
|
255
|
+
tricky = 're"fresh\\to\nken'
|
|
256
|
+
_TokenEndpoint.refresh_seen = None
|
|
257
|
+
|
|
258
|
+
srv = http.server.HTTPServer(("127.0.0.1", 0), _TokenEndpoint)
|
|
259
|
+
thread = threading.Thread(target=srv.serve_forever, daemon=True)
|
|
260
|
+
thread.start()
|
|
261
|
+
try:
|
|
262
|
+
# NO system.fetch anywhere: with the seam set, the purchase
|
|
263
|
+
# rightly prefers it - the point of this pin is the OTHER
|
|
264
|
+
# case, ordinary options, where the feature's own stdlib
|
|
265
|
+
# fallback must carry the exchange. Only PreSpec runs, so no
|
|
266
|
+
# API call ever leaves; the one HTTP request is the purchase.
|
|
267
|
+
sdk = secrets_sdk({
|
|
268
|
+
"base": "http://127.0.0.1:%d/api" % srv.server_port,
|
|
269
|
+
"feature": {"secrets": {
|
|
270
|
+
"active": True,
|
|
271
|
+
"name": "refresh_token",
|
|
272
|
+
"exchange": {"active": True, "refresh": tricky},
|
|
273
|
+
}},
|
|
274
|
+
})
|
|
275
|
+
|
|
276
|
+
utility = sdk._utility
|
|
277
|
+
ctx = utility.make_context({"opname": "load"}, sdk.get_root_ctx())
|
|
278
|
+
utility.feature_hook(ctx, "PreSpec")
|
|
279
|
+
|
|
280
|
+
self.assertEqual(tricky, _TokenEndpoint.refresh_seen)
|
|
281
|
+
self.assertEqual("RAWTOK01", sdk.options.get("apikey"))
|
|
282
|
+
finally:
|
|
283
|
+
srv.shutdown()
|
|
284
|
+
srv.server_close()
|
|
285
|
+
|
|
286
|
+
def test_uncached_miss_retracts_the_credential(self):
|
|
287
|
+
# `cache: False` re-asks the chain per operation; when a provider
|
|
288
|
+
# that answered once reports a MISS (a revoked secret), the value
|
|
289
|
+
# this feature wrote must stop going out on the wire.
|
|
290
|
+
state = {"have": True}
|
|
291
|
+
|
|
292
|
+
def lookup(name):
|
|
293
|
+
return "REVOCABLE01" if state["have"] else None
|
|
294
|
+
|
|
295
|
+
sdk, transport = self._pair({
|
|
296
|
+
"feature": {"secrets": {
|
|
297
|
+
"active": True,
|
|
298
|
+
"cache": False,
|
|
299
|
+
"providers": [{"lookup": lookup, "describe": lambda: "revocable"}],
|
|
300
|
+
}},
|
|
301
|
+
})
|
|
302
|
+
|
|
303
|
+
headers = self._wire(sdk, transport)
|
|
304
|
+
self.assert_credential(headers, "REVOCABLE01")
|
|
305
|
+
|
|
306
|
+
state["have"] = False
|
|
307
|
+
headers = self._wire(sdk, transport)
|
|
308
|
+
self.assertEqual("", str(headers.get("authorization") or ""),
|
|
309
|
+
"after the chain reports a miss, the retracted "
|
|
310
|
+
"credential must not go out")
|
|
311
|
+
|
|
312
|
+
# Local mirrors of TestSecrets' helpers (kept self-contained so this
|
|
313
|
+
# class needs none of its state).
|
|
314
|
+
def _pair(self, sdkopts):
|
|
315
|
+
transport = RecordingTransport()
|
|
316
|
+
opts = {
|
|
317
|
+
"base": "http://localhost:8080",
|
|
318
|
+
"system": {"fetch": transport},
|
|
319
|
+
}
|
|
320
|
+
opts.update(sdkopts)
|
|
321
|
+
return secrets_sdk(opts), transport
|
|
322
|
+
|
|
323
|
+
def _wire(self, sdk, transport):
|
|
324
|
+
utility = sdk._utility
|
|
325
|
+
ctx = utility.make_context({"opname": "load"}, sdk.get_root_ctx())
|
|
326
|
+
utility.feature_hook(ctx, "PreSpec")
|
|
327
|
+
fetchdef = sdk.prepare({"path": "/"})
|
|
328
|
+
res, err = utility.fetcher(ctx, fetchdef["url"], fetchdef)
|
|
329
|
+
self.assertIsNone(err)
|
|
330
|
+
return transport.calls[-1]["fetchdef"].get("headers") or {}
|
|
331
|
+
|
|
332
|
+
def assert_credential(self, headers, token):
|
|
333
|
+
got = str(headers.get("authorization") or "")
|
|
334
|
+
self.assertTrue(
|
|
335
|
+
got == token or got.endswith(" " + token),
|
|
336
|
+
"expected the authorization header to carry %s, got: %r"
|
|
337
|
+
% (token, got))
|