@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
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
# VENDORED: @voxgig/sekreto 0.2.0 (python/voxgig_sekreto/sekreto.py)
|
|
2
|
+
# Source: https://github.com/voxgig/sekreto @ 86ba35a646e68a311bdece43cd5689369ca62e9d [tag: sdk-20260907-0029-0]
|
|
3
|
+
# License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
# sekreto: one interface for secrets, wherever they live.
|
|
5
|
+
#
|
|
6
|
+
# A Sekreto is an ordered chain of providers. `get` asks each in turn and
|
|
7
|
+
# returns the first hit, so an app can be configured from environment
|
|
8
|
+
# variables in development and a vault in production without changing a
|
|
9
|
+
# line of its own code.
|
|
10
|
+
#
|
|
11
|
+
# A port of typescript/src/Sekreto.ts, which is canonical.
|
|
12
|
+
#
|
|
13
|
+
# THE CORE IMPORTS NO PROVIDER THAT OPENS A SOCKET, SPAWNS A PROCESS OR
|
|
14
|
+
# SIGNS A REQUEST. The four built-in kinds - env, memory, dotenv, file -
|
|
15
|
+
# read at most a local file; every other kind is a voxgig/plugin
|
|
16
|
+
# definition under plugins/, and a chain may name one only if the calling
|
|
17
|
+
# project handed it in through `plugins`. See
|
|
18
|
+
# docs/design/plugin-providers.md.
|
|
19
|
+
|
|
20
|
+
import json
|
|
21
|
+
import re
|
|
22
|
+
import types
|
|
23
|
+
|
|
24
|
+
from ..voxgig_plugin import check_tag, format_ref, make_catalog, make_host
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class SekretoError(Exception):
|
|
28
|
+
"""Anything sekreto refuses to do: a bad name, a missing secret, a
|
|
29
|
+
provider that could not be reached."""
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# `\z`-style anchors, not `$`. In Python, PCRE, Perl and .NET `$` also
|
|
33
|
+
# matches BEFORE a final newline, so `api.token\n` was accepted here while the
|
|
34
|
+
# canonical port rejected it - and `envkey` then produced the key
|
|
35
|
+
# `API_TOKEN\n`, sending this port looking for a differently named file and
|
|
36
|
+
# variable than the others.
|
|
37
|
+
NAMEPART = re.compile(r'\A[a-z0-9_]+\Z')
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def writejson(value):
|
|
41
|
+
"""JSON text for a value that LEAVES the process.
|
|
42
|
+
|
|
43
|
+
Two defaults have to be turned off. `ensure_ascii` escapes every
|
|
44
|
+
non-ASCII character as \\uXXXX, and `separators` otherwise puts a space
|
|
45
|
+
after each comma and colon. Neither is wrong, and both made python one
|
|
46
|
+
of only three ports whose bytes differed: the rest emit a secret's
|
|
47
|
+
accented or non-Latin characters as the UTF-8 they already are. The
|
|
48
|
+
writer's output is part of what the ports agree on - the CLI line is
|
|
49
|
+
compared byte for byte across all of them - so python matches the
|
|
50
|
+
rest.
|
|
51
|
+
|
|
52
|
+
Use this for a request body, a returned secret, the CLI's line. A
|
|
53
|
+
`json.dumps` whose text is parsed again without ever being emitted
|
|
54
|
+
needs no such care.
|
|
55
|
+
"""
|
|
56
|
+
return json.dumps(value, ensure_ascii=False, separators=(',', ':'))
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def validname(name):
|
|
60
|
+
"""Is this a well-formed secret name?"""
|
|
61
|
+
if not isinstance(name, str) or 0 == len(name):
|
|
62
|
+
return False
|
|
63
|
+
|
|
64
|
+
for part in name.split('.'):
|
|
65
|
+
if not NAMEPART.match(part):
|
|
66
|
+
return False
|
|
67
|
+
|
|
68
|
+
return True
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def checkname(name):
|
|
72
|
+
if not validname(name):
|
|
73
|
+
raise SekretoError('sekreto: invalid name: ' + ('' if name is None else str(name)))
|
|
74
|
+
return name
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def envkey(name, prefix=None):
|
|
78
|
+
"""The environment-variable key for a name: `api.token` -> `API_TOKEN`."""
|
|
79
|
+
checkname(name)
|
|
80
|
+
return (prefix or '') + '_'.join(name.split('.')).upper()
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def vaultref(name):
|
|
84
|
+
"""Where a name lives in a KV vault: `api.token` -> `api` / `token`.
|
|
85
|
+
|
|
86
|
+
A single-segment name has no path of its own, so it becomes a secret of
|
|
87
|
+
that name with the conventional field `value`.
|
|
88
|
+
"""
|
|
89
|
+
checkname(name)
|
|
90
|
+
|
|
91
|
+
parts = name.split('.')
|
|
92
|
+
|
|
93
|
+
if 1 == len(parts):
|
|
94
|
+
return {'path': parts[0], 'field': 'value'}
|
|
95
|
+
|
|
96
|
+
return {'path': '/'.join(parts[:-1]), 'field': parts[-1]}
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def flatname(name, sep):
|
|
100
|
+
"""A name flattened to one segment: `api.token` -> `api_token` (GCP
|
|
101
|
+
Secret Manager, `_`) or `api-token` (Azure Key Vault, `-`).
|
|
102
|
+
|
|
103
|
+
Those stores have no path hierarchy and reject dots in ids, so the
|
|
104
|
+
dots become the store's conventional separator. With `-` as the
|
|
105
|
+
separator, underscores flatten too: Azure Key Vault's alphabet is
|
|
106
|
+
letters, digits and hyphens only, and a valid sekreto name like
|
|
107
|
+
`with_underscore` must still be representable there. (The resulting
|
|
108
|
+
`.`/`_` collision mirrors the documented envkey behaviour, where
|
|
109
|
+
both already map to `_`.)
|
|
110
|
+
"""
|
|
111
|
+
checkname(name)
|
|
112
|
+
flat = sep.join(name.split('.'))
|
|
113
|
+
return '-'.join(flat.split('_')) if '-' == sep else flat
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def awsparam(name, prefix=None):
|
|
117
|
+
"""The AWS SSM Parameter Store name for a name: dots become the path
|
|
118
|
+
hierarchy, rooted at `/` (or at a prefix): `db.pass.main` ->
|
|
119
|
+
`/db/pass/main`, or `/app/db/pass/main` under prefix `/app`.
|
|
120
|
+
"""
|
|
121
|
+
checkname(name)
|
|
122
|
+
|
|
123
|
+
base = prefix or ''
|
|
124
|
+
if '' != base and not base.startswith('/'):
|
|
125
|
+
base = '/' + base
|
|
126
|
+
if base.endswith('/'):
|
|
127
|
+
base = base[:-1]
|
|
128
|
+
|
|
129
|
+
return base + '/' + '/'.join(name.split('.'))
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def parsedotenv(text):
|
|
133
|
+
"""Parse `.env` text into a map of raw keys to values.
|
|
134
|
+
|
|
135
|
+
Deliberately small: `KEY=value`, optional `export`, `#` comments on
|
|
136
|
+
their own line, and single- or double-quoted values (double quotes also
|
|
137
|
+
unescape `\\n`, `\\r`, `\\t` and `\\\\`). A line with no `=` is skipped.
|
|
138
|
+
"""
|
|
139
|
+
out = {}
|
|
140
|
+
|
|
141
|
+
if not isinstance(text, str):
|
|
142
|
+
return out
|
|
143
|
+
|
|
144
|
+
for rawline in text.split('\n'):
|
|
145
|
+
line = rawline[:-1].strip() if rawline.endswith('\r') else rawline.strip()
|
|
146
|
+
|
|
147
|
+
if 0 == len(line) or line.startswith('#'):
|
|
148
|
+
continue
|
|
149
|
+
|
|
150
|
+
body = line[7:].strip() if line.startswith('export ') else line
|
|
151
|
+
|
|
152
|
+
eq = body.find('=')
|
|
153
|
+
if 0 >= eq:
|
|
154
|
+
continue
|
|
155
|
+
|
|
156
|
+
key = body[:eq].strip()
|
|
157
|
+
value = body[eq + 1:].strip()
|
|
158
|
+
|
|
159
|
+
if 2 <= len(value) and value.startswith('"') and value.endswith('"'):
|
|
160
|
+
value = _unescape(value[1:-1])
|
|
161
|
+
elif 2 <= len(value) and value.startswith("'") and value.endswith("'"):
|
|
162
|
+
value = value[1:-1]
|
|
163
|
+
|
|
164
|
+
out[key] = value
|
|
165
|
+
|
|
166
|
+
return out
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _unescape(text):
|
|
170
|
+
out = ''
|
|
171
|
+
index = 0
|
|
172
|
+
|
|
173
|
+
while index < len(text):
|
|
174
|
+
if '\\' == text[index] and index + 1 < len(text):
|
|
175
|
+
nxt = text[index + 1]
|
|
176
|
+
index += 2
|
|
177
|
+
if 'n' == nxt:
|
|
178
|
+
out += '\n'
|
|
179
|
+
elif 'r' == nxt:
|
|
180
|
+
out += '\r'
|
|
181
|
+
elif 't' == nxt:
|
|
182
|
+
out += '\t'
|
|
183
|
+
elif '\\' == nxt:
|
|
184
|
+
out += '\\'
|
|
185
|
+
elif '"' == nxt:
|
|
186
|
+
out += '"'
|
|
187
|
+
else:
|
|
188
|
+
out += '\\' + nxt
|
|
189
|
+
else:
|
|
190
|
+
out += text[index]
|
|
191
|
+
index += 1
|
|
192
|
+
|
|
193
|
+
return out
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def redact(text, values):
|
|
197
|
+
"""Replace known secret values in text with `[redacted]`.
|
|
198
|
+
|
|
199
|
+
Only values of four characters or more are replaced: shorter ones are
|
|
200
|
+
too likely to appear in ordinary text, and redacting them would make
|
|
201
|
+
logs unreadable without making them safer.
|
|
202
|
+
"""
|
|
203
|
+
out = text if isinstance(text, str) else ''
|
|
204
|
+
|
|
205
|
+
usable = [
|
|
206
|
+
value for value in (values or [])
|
|
207
|
+
if isinstance(value, str) and 4 <= len(value)
|
|
208
|
+
]
|
|
209
|
+
|
|
210
|
+
# sorted() returns a new list: `values` belongs to the caller (it is
|
|
211
|
+
# `seen` when called through Sekreto.redact), and sorting in place
|
|
212
|
+
# would reorder it.
|
|
213
|
+
for value in sorted(usable, key=len, reverse=True):
|
|
214
|
+
out = '[redacted]'.join(out.split(value))
|
|
215
|
+
|
|
216
|
+
return out
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def storename(provider):
|
|
220
|
+
"""The store name a live provider answers to.
|
|
221
|
+
|
|
222
|
+
`describe()` opens with the provider's kind - `hashicorp:...`,
|
|
223
|
+
`dotenv:...`, plain `env` - so the kind is the natural default, and a
|
|
224
|
+
custom provider gets a sensible name without implementing anything
|
|
225
|
+
extra. A spec'd provider's store is its `name` or its `kind`, decided
|
|
226
|
+
before the provider exists.
|
|
227
|
+
"""
|
|
228
|
+
return provider.describe().split(':')[0]
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def _definition(plugin):
|
|
232
|
+
"""A plugin entry, checked to be a definition before the catalog sees it.
|
|
233
|
+
|
|
234
|
+
Every plugin module is named after the definition it holds, so `from
|
|
235
|
+
voxgig_sekreto.plugins import hashicorp` hands back the MODULE, and a
|
|
236
|
+
module in the catalog would fail deep inside voxgig/plugin with a
|
|
237
|
+
message about a definition name. Refused here instead, naming the
|
|
238
|
+
import that was meant.
|
|
239
|
+
"""
|
|
240
|
+
if isinstance(plugin, types.ModuleType):
|
|
241
|
+
name = plugin.__name__.rsplit('.', 1)[-1]
|
|
242
|
+
raise SekretoError(
|
|
243
|
+
'sekreto: not a plugin definition: the module ' + plugin.__name__
|
|
244
|
+
+ ' - import the definition it holds: from ' + plugin.__name__
|
|
245
|
+
+ ' import ' + name)
|
|
246
|
+
if not isinstance(plugin, dict):
|
|
247
|
+
raise SekretoError('sekreto: not a plugin definition: ' + repr(plugin))
|
|
248
|
+
return plugin
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def _unknownkind(kind, catalog):
|
|
252
|
+
"""The message for a kind the catalog does not hold.
|
|
253
|
+
|
|
254
|
+
A kind sekreto has never heard of is a typo; a kind that exists as a
|
|
255
|
+
plugin but was not passed in is the split working as designed and
|
|
256
|
+
telling you what to pass. Collapsing the two was the first thing that
|
|
257
|
+
made the split confusing to use.
|
|
258
|
+
"""
|
|
259
|
+
from .providers import KINDS
|
|
260
|
+
|
|
261
|
+
message = ('sekreto: unknown provider kind: ' + str(kind)
|
|
262
|
+
+ ' (available: ' + ', '.join(catalog.names()) + ')')
|
|
263
|
+
if kind in KINDS['plugin']:
|
|
264
|
+
message += (' - ' + str(kind)
|
|
265
|
+
+ ' is a sekreto plugin, not built in: pass it in the plugins option')
|
|
266
|
+
return message
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def _unwrap(err):
|
|
270
|
+
"""A SekretoError that crossed the plugin boundary comes back out as
|
|
271
|
+
itself, byte for byte. Anything else is not sekreto's to rewrite."""
|
|
272
|
+
from .providers import ERROR_CODE
|
|
273
|
+
|
|
274
|
+
details = getattr(err, 'details', None)
|
|
275
|
+
if ERROR_CODE == getattr(err, 'code', None) and isinstance(details, dict) \
|
|
276
|
+
and isinstance(details.get('cause'), str):
|
|
277
|
+
return SekretoError(details['cause'])
|
|
278
|
+
return err
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
class Sekreto:
|
|
282
|
+
"""The secrets facade: a chain of providers plus a cache.
|
|
283
|
+
|
|
284
|
+
Two ways to read. `get` is transparent - it walks the chain and takes
|
|
285
|
+
the first hit, and the caller never learns which store answered.
|
|
286
|
+
`getfrom` is directed - it names the store, and only that store is
|
|
287
|
+
asked.
|
|
288
|
+
"""
|
|
289
|
+
|
|
290
|
+
def __init__(self, options=None):
|
|
291
|
+
from .providers import BUILTINS
|
|
292
|
+
|
|
293
|
+
opts = options or {}
|
|
294
|
+
|
|
295
|
+
# Built-ins first, then the plugins, into one catalog: a plugin
|
|
296
|
+
# that names a built-in kind replaces it, which is how a host
|
|
297
|
+
# substitutes an implementation and never an accident, because the
|
|
298
|
+
# four names are documented.
|
|
299
|
+
#
|
|
300
|
+
# `catalog` is the definitions this Sekreto can build; `host` is
|
|
301
|
+
# the voxgig/plugin host every spec'd provider is an instance of.
|
|
302
|
+
# Read it for introspection - `host.list()` names each store's ref
|
|
303
|
+
# and status - and nothing on it advances the chain.
|
|
304
|
+
self.catalog = make_catalog(BUILTINS + [_definition(p) for p in opts.get('plugins') or []])
|
|
305
|
+
self.host = make_host({'catalog': self.catalog})
|
|
306
|
+
|
|
307
|
+
# (store, provider) pairs, in chain order. A provider handed in
|
|
308
|
+
# live is backed by no instance; a spec'd one is an instance of
|
|
309
|
+
# its kind on the host.
|
|
310
|
+
self.entries = []
|
|
311
|
+
for entry in opts.get('providers') or []:
|
|
312
|
+
if callable(getattr(entry, 'lookup', None)):
|
|
313
|
+
self.entries.append((storename(entry), entry))
|
|
314
|
+
else:
|
|
315
|
+
self.entries.append(self._declare(entry))
|
|
316
|
+
|
|
317
|
+
self.docache = False is not opts.get('cache', True)
|
|
318
|
+
|
|
319
|
+
# A list, not a dict: the store a value came from stays attached,
|
|
320
|
+
# and redaction order does not vary between runs.
|
|
321
|
+
self.cache = []
|
|
322
|
+
|
|
323
|
+
# Every value ever resolved, for redact(). Kept independently of
|
|
324
|
+
# the read cache so that redaction still works when cache is off -
|
|
325
|
+
# otherwise `cache: False` would silently disable redact() and leak
|
|
326
|
+
# secrets to logs.
|
|
327
|
+
self.seen = []
|
|
328
|
+
|
|
329
|
+
def _declare(self, spec):
|
|
330
|
+
"""One chain entry, as a plugin instance.
|
|
331
|
+
|
|
332
|
+
The instance is `kind` for a store named after its kind and
|
|
333
|
+
`kind$store` otherwise - `hashicorp$prod` - so `host.list()` reads
|
|
334
|
+
like the chain. A store name that is already taken gets a numbered
|
|
335
|
+
tag from the host instead, because two providers MAY share a store
|
|
336
|
+
name (a directed read walks both) and an instance ref may not.
|
|
337
|
+
"""
|
|
338
|
+
from .providers import PROVIDER_EXPORT
|
|
339
|
+
|
|
340
|
+
kind = spec.get('kind') if isinstance(spec, dict) else None
|
|
341
|
+
|
|
342
|
+
if kind is None or not self.catalog.has(kind):
|
|
343
|
+
raise SekretoError(_unknownkind(kind, self.catalog))
|
|
344
|
+
|
|
345
|
+
store = spec.get('name') or kind
|
|
346
|
+
|
|
347
|
+
if not check_tag(store):
|
|
348
|
+
raise SekretoError('sekreto: invalid store name: ' + str(store))
|
|
349
|
+
|
|
350
|
+
ref = kind if store == kind else format_ref(kind, store)
|
|
351
|
+
if self.host.instance(ref) is not None:
|
|
352
|
+
ref = self.host.autotag(kind)
|
|
353
|
+
|
|
354
|
+
try:
|
|
355
|
+
# `load` runs the definition's `define`, which builds the
|
|
356
|
+
# provider from the spec; `activate` takes the instance live.
|
|
357
|
+
# Nothing is contacted by either: a provider opens nothing
|
|
358
|
+
# until its first lookup.
|
|
359
|
+
self.host.load(ref, {'options': spec})
|
|
360
|
+
self.host.activate(ref)
|
|
361
|
+
except Exception as err:
|
|
362
|
+
raise _unwrap(err) from None
|
|
363
|
+
|
|
364
|
+
return (store, self.host.exports(ref + '/' + PROVIDER_EXPORT))
|
|
365
|
+
|
|
366
|
+
def get(self, name):
|
|
367
|
+
"""The secret, or a SekretoError if no provider has it."""
|
|
368
|
+
found = self.try_(name)
|
|
369
|
+
|
|
370
|
+
if found is None:
|
|
371
|
+
raise SekretoError('sekreto: unknown secret: ' + name)
|
|
372
|
+
|
|
373
|
+
return found
|
|
374
|
+
|
|
375
|
+
def try_(self, name):
|
|
376
|
+
"""The secret, or None if no provider has it."""
|
|
377
|
+
return self._resolve('', name, self.entries)
|
|
378
|
+
|
|
379
|
+
def getfrom(self, store, name):
|
|
380
|
+
"""The secret from one named store, or a SekretoError if that store
|
|
381
|
+
does not have it."""
|
|
382
|
+
found = self.tryfrom(store, name)
|
|
383
|
+
|
|
384
|
+
if found is None:
|
|
385
|
+
raise SekretoError('sekreto: unknown secret: ' + store + ':' + name)
|
|
386
|
+
|
|
387
|
+
return found
|
|
388
|
+
|
|
389
|
+
def tryfrom(self, store, name):
|
|
390
|
+
"""The secret from one named store, or None if that store does not
|
|
391
|
+
have it.
|
|
392
|
+
|
|
393
|
+
Naming a store that is not in the chain is an error, not a miss:
|
|
394
|
+
`try` already means "this store may not have it", so it cannot also
|
|
395
|
+
mean "this store may not exist" without hiding a typo.
|
|
396
|
+
"""
|
|
397
|
+
matching = [entry for entry in self.entries if entry[0] == store]
|
|
398
|
+
|
|
399
|
+
if 0 == len(matching):
|
|
400
|
+
raise SekretoError('sekreto: unknown store: ' + store)
|
|
401
|
+
|
|
402
|
+
return self._resolve(store, name, matching)
|
|
403
|
+
|
|
404
|
+
def _resolve(self, store, name, entries):
|
|
405
|
+
checkname(name)
|
|
406
|
+
|
|
407
|
+
if self.docache:
|
|
408
|
+
for cached in self.cache:
|
|
409
|
+
if cached[0] == store and cached[1] == name:
|
|
410
|
+
return cached[2]
|
|
411
|
+
|
|
412
|
+
for _storename, provider in entries:
|
|
413
|
+
found = provider.lookup(name)
|
|
414
|
+
|
|
415
|
+
if found is not None:
|
|
416
|
+
if self.docache:
|
|
417
|
+
self.cache.append((store, name, found))
|
|
418
|
+
self.seen.append(found)
|
|
419
|
+
return found
|
|
420
|
+
|
|
421
|
+
return None
|
|
422
|
+
|
|
423
|
+
def has(self, name):
|
|
424
|
+
"""Does any provider have this secret?"""
|
|
425
|
+
return self.try_(name) is not None
|
|
426
|
+
|
|
427
|
+
def hasin(self, store, name):
|
|
428
|
+
"""Does this named store have this secret?"""
|
|
429
|
+
return self.tryfrom(store, name) is not None
|
|
430
|
+
|
|
431
|
+
def all(self, names):
|
|
432
|
+
"""Every named secret at once. Missing ones are an error."""
|
|
433
|
+
return {name: self.get(name) for name in names}
|
|
434
|
+
|
|
435
|
+
def sources(self):
|
|
436
|
+
"""A description of each provider, in resolution order."""
|
|
437
|
+
return [provider.describe() for _store, provider in self.entries]
|
|
438
|
+
|
|
439
|
+
def stores(self):
|
|
440
|
+
"""The name of each store that can be named by `getfrom`, in
|
|
441
|
+
resolution order and without repeats."""
|
|
442
|
+
out = []
|
|
443
|
+
|
|
444
|
+
for store, _provider in self.entries:
|
|
445
|
+
if store not in out:
|
|
446
|
+
out.append(store)
|
|
447
|
+
|
|
448
|
+
return out
|
|
449
|
+
|
|
450
|
+
def redact(self, text):
|
|
451
|
+
"""Replace every value this Sekreto has resolved with `[redacted]`.
|
|
452
|
+
|
|
453
|
+
Works whether or not caching is enabled: the redaction list is kept
|
|
454
|
+
independently of the read cache.
|
|
455
|
+
"""
|
|
456
|
+
return redact(text, self.seen)
|
|
457
|
+
|
|
458
|
+
def refresh(self):
|
|
459
|
+
"""Drop cached values, so the next `get` asks the providers again."""
|
|
460
|
+
self.cache.clear()
|
|
461
|
+
|
|
462
|
+
def close(self):
|
|
463
|
+
"""Tear the chain down: every plugin instance is deactivated and
|
|
464
|
+
unloaded, in reverse, releasing whatever a provider acquired at
|
|
465
|
+
activation. Afterwards there is nothing to read from - `get`
|
|
466
|
+
reports every secret unknown - and the cache is dropped, though
|
|
467
|
+
`redact` still knows every value that was ever resolved."""
|
|
468
|
+
self.host.close()
|
|
469
|
+
self.entries = []
|
|
470
|
+
self.cache.clear()
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
def sekreto(options=None):
|
|
474
|
+
"""Make a Sekreto from options."""
|
|
475
|
+
return Sekreto(options)
|