@voxgig/sdkgen 4.10.0 → 4.12.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/resolve.js +75 -1
- package/dist/action/resolve.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utility.js +17 -0
- package/dist/utility.js.map +1 -1
- package/package.json +4 -3
- package/project/.sdk/model/feature/secrets.aon +330 -0
- package/project/.sdk/model/target/c.aon +15 -2
- package/project/.sdk/model/target/cpp.aon +18 -0
- package/project/.sdk/model/target/lua.aon +17 -0
- package/project/.sdk/model/target/ocaml.aon +48 -5
- package/project/.sdk/model/target/zig.aon +30 -4
- package/project/.sdk/src/cmp/c/Config_c.ts +338 -1
- package/project/.sdk/src/cmp/c/Main_c.ts +57 -2
- package/project/.sdk/src/cmp/c/Package_c.ts +12 -2
- package/project/.sdk/src/cmp/cpp/Config_cpp.ts +324 -2
- package/project/.sdk/src/cmp/cpp/Gitignore_cpp.ts +2 -0
- package/project/.sdk/src/cmp/cpp/Main_cpp.ts +62 -4
- package/project/.sdk/src/cmp/cpp/Package_cpp.ts +10 -0
- package/project/.sdk/src/cmp/lua/Config_lua.ts +88 -0
- package/project/.sdk/src/cmp/lua/Gitignore_lua.ts +4 -0
- package/project/.sdk/src/cmp/lua/Main_lua.ts +93 -3
- package/project/.sdk/src/cmp/lua/Package_lua.ts +60 -0
- package/project/.sdk/src/cmp/lua/fragment/Main.fragment.lua +10 -0
- package/project/.sdk/src/cmp/ocaml/Config_ocaml.ts +183 -5
- package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +160 -3
- package/project/.sdk/src/cmp/ocaml/Package_ocaml.ts +25 -1
- package/project/.sdk/src/cmp/zig/Config_zig.ts +130 -9
- package/project/.sdk/src/cmp/zig/Main_zig.ts +208 -4
- package/project/.sdk/{tm/zig/build.zig → src/cmp/zig/fragment/Build.fragment.zig} +7 -0
- package/project/.sdk/src/cmp/zig/fragment/Main.fragment.zig +25 -0
- package/project/.sdk/{tm/zig/root.zig → src/cmp/zig/fragment/Root.fragment.zig} +9 -0
- package/project/.sdk/tm/c/Makefile +58 -9
- package/project/.sdk/tm/c/core/sdk.h +10 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/capability.c +133 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/capability.h +39 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/catalog.c +83 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/catalog.h +48 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/config.c +413 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/config.h +24 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/depend.c +264 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/depend.h +29 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/env.c +220 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/env.h +19 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/export.c +97 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/export.h +19 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/graph.c +237 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/graph.h +17 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/host.c +1494 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/host.h +135 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/order.c +288 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/order.h +18 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/point.c +141 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/point.h +80 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/ref.c +170 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/ref.h +52 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/resolve.c +98 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/resolve.h +18 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/types.c +150 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/types.h +104 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/value.c +649 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/value.h +135 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/version.c +151 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/version.h +34 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/aws.c +281 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/azuresecrets.c +207 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/boru.c +164 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/clock.c +75 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/doppler.c +141 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/encode.c +144 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/gcpsecrets.c +177 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/hashicorp.c +239 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/httpjson.c +599 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/infisical.c +165 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/onepassword.c +194 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/proc.c +233 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/secretspec.c +125 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/sekretoplugins.h +125 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/sha256.c +270 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/sigv4.c +382 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/support.h +153 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/tls.c +420 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/internal.h +86 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/json.c +721 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/providers.c +813 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.c +944 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.h +490 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/util.c +442 -0
- package/project/.sdk/tm/c/feature/secrets.c +797 -0
- package/project/.sdk/tm/c/feature/secrets.h +46 -0
- package/project/.sdk/tm/c/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/c/tests/feature/secrets/secrets_test.c +802 -0
- package/project/.sdk/tm/c/tests/vendor/omni/json.c +1 -1
- package/project/.sdk/tm/c/tests/vendor/omni/omni.h +1 -1
- package/project/.sdk/tm/c/tests/vendor/omni/runner.c +1 -1
- package/project/.sdk/tm/c/tests/vendor/omni/util.c +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/sdk/feature/secrets.clj +38 -11
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/capability.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/catalog.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/config.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/depend.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/env.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/export.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/graph.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/host.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/json.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/order.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/point.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/ref.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/resolve.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/types.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/version.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/addr.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/chain.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/core.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/json.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/aws.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/azuresecrets.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/boru.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/doppler.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/gcpsecrets.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/hashicorp.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/httpjson.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/infisical.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/onepassword.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/proc.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/secretspec.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/sigv4.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/provider.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/providers.clj +1 -1
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto.clj +1 -1
- package/project/.sdk/tm/clojure/test/sdk/test/feature/secrets.clj +40 -6
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +1 -1
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +1 -1
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +1 -1
- package/project/.sdk/tm/cpp/Makefile +48 -4
- package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.cpp +121 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.hpp +41 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.cpp +60 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.hpp +66 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/config.cpp +376 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/config.hpp +29 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.cpp +230 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.hpp +31 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/env.cpp +205 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/env.hpp +25 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/export.cpp +84 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/export.hpp +24 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.cpp +222 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.hpp +21 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/host.cpp +1200 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/host.hpp +250 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/order.cpp +250 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/order.hpp +22 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/point.cpp +110 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/point.hpp +79 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.cpp +136 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.hpp +60 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.cpp +82 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.hpp +25 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/types.cpp +90 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/types.hpp +65 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/value.cpp +491 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/value.hpp +120 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/version.cpp +143 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/version.hpp +36 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.cpp +248 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.hpp +30 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.cpp +149 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.cpp +117 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.hpp +27 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.cpp +180 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.hpp +52 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.cpp +87 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.cpp +121 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.cpp +153 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.cpp +666 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.hpp +160 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.cpp +123 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.cpp +125 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.cpp +223 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.hpp +47 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.cpp +104 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.hpp +27 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.cpp +242 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.hpp +58 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.cpp +260 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.hpp +47 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.cpp +476 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.hpp +89 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.cpp +312 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.hpp +263 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.cpp +354 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.hpp +111 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.cpp +613 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.hpp +227 -0
- package/project/.sdk/tm/cpp/feature/secrets.hpp +745 -0
- package/project/.sdk/tm/cpp/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/cpp/test/feature/secrets/secrets_test.cpp +808 -0
- package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +1 -1
- package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +1 -1
- package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +1 -1
- package/project/.sdk/tm/csharp/feature/SecretsFeature.cs +34 -8
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Capability.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Catalog.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Config.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Definition.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Depend.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Entry.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Env.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Export.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Graph.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Host.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Inst.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Json.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Order.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Plugin.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Point.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Refs.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Resolve.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Types.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Version.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Aws.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugins/AzureSecrets.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Boru.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Child.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Doppler.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugins/GcpSecrets.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Hashicorp.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugins/HttpJson.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Infisical.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugins/OnePassword.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugins/SecretSpec.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Sigv4.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/sekreto/Json.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/sekreto/Providers.cs +1 -1
- package/project/.sdk/tm/csharp/feature/secrets/sekreto/Sekreto.cs +1 -1
- package/project/.sdk/tm/csharp/test/feature/secrets/SecretsFeatureTest.cs +85 -0
- package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +1 -1
- package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +1 -1
- package/project/.sdk/tm/csharp/utility/struct/Struct.cs +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/capability.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/catalog.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/config.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/depend.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/env.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/error.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/export.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/graph.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/host.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/inst.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/json.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/order.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/point.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/ref.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/resolve.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/types.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/version.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/voxgig_plugin.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/json.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/aws.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/azuresecrets.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/boru.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/doppler.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/gcpsecrets.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/hashicorp.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/http.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/httpjson.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/infisical.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/onepassword.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/proc.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/secretspec.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/sigv4.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/provider.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/providers.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/sekreto.ex +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets.ex +17 -2
- package/project/.sdk/tm/elixir/test/feature/secrets/secrets_test.exs +41 -0
- package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +1 -1
- package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +1 -1
- package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/capability.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/catalog.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/config.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/depend.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/env.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/export.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/host.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/order.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/point.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/ref.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/resolve.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/types.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/util.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/version.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugins/aws/aws.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +1 -1
- package/project/.sdk/tm/go/feature/secrets_feature.go +32 -10
- package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +116 -0
- package/project/.sdk/tm/go/test/omni/omni.go +1 -1
- package/project/.sdk/tm/go/test/omni/util.go +1 -1
- package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +1 -1
- package/project/.sdk/tm/java/feature/SecretsFeature.java +33 -8
- package/project/.sdk/tm/java/feature/secrets/plugin/Capability.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Catalog.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Config.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Definition.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Depend.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Entry.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Env.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Export.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Graph.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Host.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Inst.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Json.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Order.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Plugin.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/PluginException.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Point.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Refs.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Resolve.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Types.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/plugin/Version.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/Addr.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/Builtins.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/Json.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/Provider.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/Sekreto.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/Support.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Aws.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Azuresecrets.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Boru.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Doppler.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Gcpsecrets.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Hashicorp.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Httpjson.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Infisical.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Onepassword.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Proc.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Secretspec.java +1 -1
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Sigv4.java +1 -1
- package/project/.sdk/tm/java/test/feature/secrets/SecretsFeatureTest.java +64 -0
- package/project/.sdk/tm/java/test/vendor/omni/Json.java +1 -1
- package/project/.sdk/tm/java/test/vendor/omni/Runner.java +1 -1
- package/project/.sdk/tm/java/test/vendor/omni/Util.java +1 -1
- package/project/.sdk/tm/java/utility/struct/Struct.java +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/SecretsFeature.js +34 -11
- package/project/.sdk/tm/js/src/feature/secrets/plugin/capability.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/plugin/catalog.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/plugin/config.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/plugin/depend.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/plugin/env.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/plugin/export.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/plugin/graph.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/plugin/host.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/plugin/index.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/plugin/order.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/plugin/point.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/plugin/ref.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/plugin/resolve.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/plugin/types.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/plugin/version.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/Sekreto.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/index.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/aws.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/azuresecrets.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/boru.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/doppler.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/gcpsecrets.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/hashicorp.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/httpjson.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/infisical.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/onepassword.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/secretspec.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/sigv4.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/addr.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/builtin.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/dotenv.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/env.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/file.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/memory.js +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/support.js +1 -1
- package/project/.sdk/tm/js/src/utility/StructUtility.js +2 -2
- package/project/.sdk/tm/js/src/utility/TransformRequestUtility.js +49 -1
- package/project/.sdk/tm/js/test/feature/secrets/Secrets.test.js +73 -0
- package/project/.sdk/tm/js/test/vendor/omni/index.js +1 -1
- package/project/.sdk/tm/js/test/vendor/omni/runner.js +1 -1
- package/project/.sdk/tm/js/test/vendor/omni/util.js +1 -1
- package/project/.sdk/tm/kotlin/feature/SecretsFeature.kt +32 -7
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Capability.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Catalog.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Config.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Depend.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Env.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Export.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Graph.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Host.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Json.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Order.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Plugin.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Point.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Refs.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Resolve.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Types.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Version.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Json.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Provider.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Providers.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Sekreto.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Spec.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Support.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Aws.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Azuresecrets.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Boru.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Doppler.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Gcpsecrets.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Hashicorp.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Httpjson.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Infisical.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Onepassword.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Secretspec.kt +1 -1
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Sigv4.kt +1 -1
- package/project/.sdk/tm/kotlin/test/feature/secrets/SecretsTest.kt +69 -0
- package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +1 -1
- package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +1 -1
- package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +1 -1
- package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +1 -1
- package/project/.sdk/tm/lua/Makefile +15 -4
- package/project/.sdk/tm/lua/feature/secrets/native/sekretonet.c +806 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/capability.lua +135 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/catalog.lua +63 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/config.lua +361 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/depend.lua +232 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/env.lua +168 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/export.lua +66 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/graph.lua +194 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/host.lua +1190 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/json.lua +169 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/order.lua +207 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/point.lua +106 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/ref.lua +115 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/resolve.lua +78 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/types.lua +275 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/version.lua +131 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin.lua +76 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/addr.lua +124 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/err.lua +47 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/name.lua +315 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/aws.lua +228 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/azuresecrets.lua +137 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/boru.lua +124 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/crypto.lua +212 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/doppler.lua +89 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/gcpsecrets.lua +129 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/hashicorp.lua +154 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/httpjson.lua +248 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/infisical.lua +113 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/json.lua +449 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/net.lua +198 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/onepassword.lua +126 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/secretspec.lua +93 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/sigv4.lua +269 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/support.lua +146 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/providers.lua +346 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto.lua +479 -0
- package/project/.sdk/tm/lua/feature/secrets_feature.lua +690 -0
- package/project/.sdk/tm/lua/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/lua/test/extend_test.lua +105 -0
- package/project/.sdk/tm/lua/test/feature/secrets/secrets_feature_test.lua +862 -0
- package/project/.sdk/tm/lua/test/vendor/omni/json.lua +1 -1
- package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +1 -1
- package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +1 -1
- package/project/.sdk/tm/lua/test/vendor/omni/util.lua +1 -1
- package/project/.sdk/tm/lua/utility/struct/regex.lua +1 -1
- package/project/.sdk/tm/lua/utility/struct/struct.lua +1 -1
- package/project/.sdk/tm/ocaml/Makefile +52 -8
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/capability.ml +106 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/catalog.ml +43 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/config.ml +349 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/defs.ml +143 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/depend.ml +217 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/env.ml +197 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/export.ml +89 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/graph.ml +227 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/host.ml +1112 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/order.ml +202 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/point.ml +138 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/ref.ml +126 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/resolve.ml +62 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/types.ml +97 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/value.ml +387 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/version.ml +139 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/aws.ml +171 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/azuresecrets.ml +116 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/boru.ml +95 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/crypto.ml +149 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/doppler.ml +61 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/gcpsecrets.ml +93 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/hashicorp.ml +120 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/http.ml +421 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/httpjson.ml +66 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/infisical.ml +85 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/onepassword.ml +112 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/runcmd.ml +97 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/secretspec.ml +68 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/sigv4.ml +259 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls.ml +44 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls_stubs.c +358 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/json.ml +376 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/provider.ml +647 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/secret.ml +299 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/sekreto.ml +347 -0
- package/project/.sdk/tm/ocaml/feature/secrets_feature.ml +453 -0
- package/project/.sdk/tm/ocaml/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/ocaml/test/feature/secrets/t_secrets.ml +670 -0
- package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Capability.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Catalog.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Config.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Depend.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Env.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Export.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Graph.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Host.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Order.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Point.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Ref.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Resolve.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Types.pm +25 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Version.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Aws.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Azuresecrets.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Boru.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Doppler.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Gcpsecrets.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Hashicorp.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Httpjson.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Infisical.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Onepassword.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Proc.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Secretspec.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Sigv4.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Addr.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Providers.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto.pm +1 -1
- package/project/.sdk/tm/perl/feature/secrets_feature.pm +33 -12
- package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +1 -1
- package/project/.sdk/tm/perl/t/feature/secrets/secrets.t +47 -0
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Runner.pm +1 -1
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Util.pm +1 -1
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni.pm +1 -1
- package/project/.sdk/tm/php/feature/SecretsFeature.php +30 -6
- package/project/.sdk/tm/php/feature/secrets/plugin/Capability.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/plugin/Catalog.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/plugin/Config.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/plugin/Depend.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/plugin/Env.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/plugin/Export.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/plugin/Graph.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/plugin/Host.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/plugin/Order.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/plugin/Point.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/plugin/Ref.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/plugin/Resolve.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/plugin/Types.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/plugin/Version.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/plugin/plugin.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/aws.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/azuresecrets.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/boru.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/doppler.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/gcpsecrets.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/hashicorp.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/httpjson.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/infisical.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/onepassword.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/runcmd.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/secretspec.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/sigv4.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/sekreto/src/Addr.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/sekreto/src/Providers.php +1 -1
- package/project/.sdk/tm/php/feature/secrets/sekreto/src/Sekreto.php +1 -1
- package/project/.sdk/tm/php/test/feature/secrets/SecretsTest.php +98 -0
- package/project/.sdk/tm/php/test/vendor/omni/Runner.php +1 -1
- package/project/.sdk/tm/php/test/vendor/omni/Util.php +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/__init__.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/capability.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/catalog.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/config.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/depend.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/env.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/export.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/graph.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/host.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/onepassword.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/secretspec.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/sigv4.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/providers.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +28 -6
- package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +1 -1
- package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +114 -0
- package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +1 -1
- package/project/.sdk/tm/py/test/voxgig_omni/runner.py +1 -1
- package/project/.sdk/tm/py/test/voxgig_omni/util.py +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/capability.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/catalog.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/config.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/depend.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/env.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/export.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/graph.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/host.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/order.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/point.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/ref.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/resolve.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/types.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/version.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/addr.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/aws.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/azuresecrets.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/boru.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/doppler.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/hashicorp.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/httpjson.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/infisical.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/onepassword.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/secretspec.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/sigv4.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/providers.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/sekreto.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto.rb +1 -1
- package/project/.sdk/tm/rb/feature/secrets_feature.rb +28 -6
- package/project/.sdk/tm/rb/test/feature/secrets/secrets_feature_test.rb +93 -0
- package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +1 -1
- package/project/.sdk/tm/rb/test/vendor/omni/util.rb +1 -1
- package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugin/capability.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugin/catalog.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugin/config.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugin/depend.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugin/env.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugin/export.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugin/graph.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugin/host.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugin/mod.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugin/order.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugin/point.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugin/refs.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugin/resolve.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugin/types.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugin/value.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugin/version.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugins/aws/crypto.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugins/aws/sigv4.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugins/aws.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugins/azuresecrets.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugins/boru.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugins/doppler.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugins/gcpsecrets.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugins/hashicorp.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/http.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/json.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugins/infisical.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugins/onepassword.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/plugins/secretspec.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/sekreto/addr.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/sekreto/mod.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/sekreto/providers.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets/sekreto/sekreto.rs +1 -1
- package/project/.sdk/tm/rust/feature/secrets.rs +33 -10
- package/project/.sdk/tm/rust/tests/feature/secrets/main.rs +96 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +1 -1
- package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +1 -1
- package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +1 -1
- package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +1 -1
- package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +1 -1
- package/project/.sdk/tm/scala/feature/SecretsFeature.scala +29 -7
- package/project/.sdk/tm/scala/feature/secrets/plugin/Capability.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/plugin/Config.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/plugin/Depend.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/plugin/Env.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/plugin/Export.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/plugin/Graph.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/plugin/Host.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/plugin/Json.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/plugin/Order.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/plugin/Plugin.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/plugin/Point.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/plugin/Refs.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/plugin/Resolve.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/plugin/Types.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/plugin/Value.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/plugin/Version.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Json.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Provider.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Providers.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Sekreto.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Spec.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Support.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Aws.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Azuresecrets.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Boru.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Doppler.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Gcpsecrets.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Hashicorp.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Httpjson.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Infisical.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Onepassword.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Secretspec.scala +1 -1
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Sigv4.scala +1 -1
- package/project/.sdk/tm/scala/sdktest/feature/secrets/SecretsTestMain.scala +71 -0
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +1 -1
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +1 -1
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Capability.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Catalog.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Config.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Depend.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Env.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Export.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Graph.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Host.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Json.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Order.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Point.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Refs.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Resolve.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Types.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Value.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Version.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Aws.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Azuresecrets.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Boru.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Crypto.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Doppler.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Gcpsecrets.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Hashicorp.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Httpjson.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Infisical.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Onepassword.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Proc.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Secretspec.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Sigv4.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Addr.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Json.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Provider.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Providers.swift +1 -1
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Sekreto.swift +1 -1
- package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +1 -1
- package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +1 -1
- package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +35 -12
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Capability.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Catalog.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Config.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Depend.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Env.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Export.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/FeatureHost.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Graph.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Host.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Order.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Point.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Ref.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Resolve.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Types.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Version.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/index.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/aws.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/azuresecrets.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/boru.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/doppler.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/gcpsecrets.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/hashicorp.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/httpjson.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/infisical.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/onepassword.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/secretspec.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/sigv4.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/builtin.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/test/TestFeature.ts +107 -1
- package/project/.sdk/tm/ts/src/utility/StructUtility.ts +2 -2
- package/project/.sdk/tm/ts/src/utility/TransformRequestUtility.ts +49 -1
- package/project/.sdk/tm/ts/test/feature/secrets/Secrets.test.ts +73 -0
- package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +1 -1
- package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +1 -1
- package/project/.sdk/tm/ts/test/vendor/omni/index.ts +1 -1
- package/project/.sdk/tm/zig/feature/secrets/plugin/capability.zig +137 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/catalog.zig +90 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/config.zig +346 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/depend.zig +244 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/env.zig +201 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/export.zig +83 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/graph.zig +212 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/host.zig +1224 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/inst.zig +126 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/order.zig +228 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/plugin.zig +34 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/point.zig +166 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/ref.zig +147 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/resolve.zig +74 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/types.zig +140 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/value.zig +662 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/version.zig +139 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/aws.zig +294 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/azuresecrets.zig +222 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/boru.zig +188 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/doppler.zig +135 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/gcpsecrets.zig +170 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/hashicorp.zig +242 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/httpjson.zig +535 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/infisical.zig +167 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/onepassword.zig +202 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/secretspec.zig +160 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/sigv4.zig +336 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/addr.zig +148 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/builtins.zig +259 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/provider.zig +440 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/sekreto.zig +944 -0
- package/project/.sdk/tm/zig/feature/secrets.zig +854 -0
- package/project/.sdk/tm/zig/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/zig/test/feature/secrets/secrets_test.zig +891 -0
- package/project/.sdk/tm/zig/test/vendor/omni/omni.zig +1 -1
- package/project/.sdk/tm/zig/test/vendor/omni/regex.zig +1 -1
- package/project/.sdk/tm/zig/utility/voxgigstruct/regex.zig +1 -1
- package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +1 -1
- package/project/sdkgen-package.json +1 -1
- package/src/action/resolve.ts +85 -1
- package/src/utility.ts +17 -0
|
@@ -0,0 +1,891 @@
|
|
|
1
|
+
// Behavioural tests for the secrets feature (vendored @voxgig/sekreto) -
|
|
2
|
+
// the zig port of tm/ts/test/feature/secrets/Secrets.test.ts, following the
|
|
3
|
+
// go suite's shape (tm/go/test/feature/secrets/secrets_feature_test.go).
|
|
4
|
+
//
|
|
5
|
+
// The contract under test: the `apikey` OPTION keeps its exact old meaning
|
|
6
|
+
// and always wins, because the feature places it FIRST in the provider
|
|
7
|
+
// chain (a `memory` store named `options`) - explicit-beats-lookup falls
|
|
8
|
+
// out of sekreto's first-hit rule rather than from special-case logic. With
|
|
9
|
+
// the feature inactive nothing changes at all. With it active and the
|
|
10
|
+
// option unset, the chain supplies the credential instead.
|
|
11
|
+
//
|
|
12
|
+
// EVERY CLIENT HERE IS LIVE, and the thing counted is `system.fetch` - the
|
|
13
|
+
// real transport the whole fetcher chain ends at. That is deliberate, and
|
|
14
|
+
// it is the mistake this file exists to avoid: under `test_sdk` the test
|
|
15
|
+
// feature REPLACES the transport with its own in-memory mock, so a counter
|
|
16
|
+
// hung off `system.fetch` is never reached, and "no request was sent" would
|
|
17
|
+
// hold for a healthy SDK carrying no secrets feature at all. An assertion
|
|
18
|
+
// that cannot fail pins no rule. So each fail-closed case proves its own
|
|
19
|
+
// counter FIRST, with the same construction and a WORKING provider: one
|
|
20
|
+
// request must reach `system.fetch` carrying the resolved credential. Only
|
|
21
|
+
// then does a zero from the broken provider mean REFUSED rather than
|
|
22
|
+
// UNWIRED. And the refusal is matched on the PROVIDER'S OWN message, so an
|
|
23
|
+
// unrelated failure cannot stand in for fail-closed.
|
|
24
|
+
//
|
|
25
|
+
// BOTH WIRE PATHS. The entity pipeline is driven through a REAL generated
|
|
26
|
+
// entity op, found by comptime reflection over the client's accessors (the
|
|
27
|
+
// zig spelling of go's reflect-based driver), and the raw paths -
|
|
28
|
+
// `direct()` and `graphql()`, which run NO feature hooks - are driven too:
|
|
29
|
+
// for them the transport gate is the only place resolution can happen.
|
|
30
|
+
//
|
|
31
|
+
// NO ENVIRONMENT VARIABLES ARE SET. A zig test cannot set one for its own
|
|
32
|
+
// process without libc, so the `env` provider is exercised through the
|
|
33
|
+
// feature's `set_environ` seam with a map the test builds - the same seam a
|
|
34
|
+
// zig 0.16 application uses to hand in `init.environ_map` - and every other
|
|
35
|
+
// chain is a `memory` store or a scripted callable provider.
|
|
36
|
+
//
|
|
37
|
+
// This file lives in the test `feature/` container on purpose: build.zig
|
|
38
|
+
// names it only when the model activates `secrets`, alongside the feature
|
|
39
|
+
// source and the vendored library.
|
|
40
|
+
//
|
|
41
|
+
// ONE MODULE. A zig test module reaches only its own directory subtree, so
|
|
42
|
+
// this file cannot `@import("../../fh.zig")`; the small harness it needs is
|
|
43
|
+
// here, and the SDK is reached by module name.
|
|
44
|
+
|
|
45
|
+
const std = @import("std");
|
|
46
|
+
const sdk = @import("sdk");
|
|
47
|
+
const h = sdk.h;
|
|
48
|
+
const Value = sdk.Value;
|
|
49
|
+
const testing = std.testing;
|
|
50
|
+
|
|
51
|
+
const BASE = "http://secrets.test/api";
|
|
52
|
+
|
|
53
|
+
fn vnull() Value {
|
|
54
|
+
return Value{ .null = {} };
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Every block runs only when the feature is in THIS SDK - build.zig lists
|
|
58
|
+
// this file only then, so this is belt and braces rather than a gate.
|
|
59
|
+
fn present() bool {
|
|
60
|
+
const cfg = sdk.make_config();
|
|
61
|
+
return h.getp(h.getp(cfg, "feature"), "secrets") == .object;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// ---- the counted transport ---------------------------------------------
|
|
65
|
+
|
|
66
|
+
/// One recorded request, SNAPSHOT at the moment it was handed to the
|
|
67
|
+
/// transport. A snapshot, not the fetchdef itself: the fetchdef's headers
|
|
68
|
+
/// map is rewritten IN PLACE by the exchange retry, so a recorder that kept
|
|
69
|
+
/// the live map would report every earlier call as carrying the LAST token.
|
|
70
|
+
const Call = struct {
|
|
71
|
+
url: []const u8,
|
|
72
|
+
auth: ?[]const u8,
|
|
73
|
+
body: ?[]const u8,
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/// A `system.fetch` that records every call it is handed, so "sent" is a
|
|
77
|
+
/// fact about the wire rather than about a mock somewhere up the chain. It
|
|
78
|
+
/// also plays the token endpoint for the exchange cases.
|
|
79
|
+
const Wire = struct {
|
|
80
|
+
calls: std.ArrayList(Call) = .empty,
|
|
81
|
+
/// One status per API call, the last repeating - so a case can say
|
|
82
|
+
/// "401 then 200" without counting calls itself.
|
|
83
|
+
apistatus: []const i64 = &.{200},
|
|
84
|
+
/// The access tokens the token endpoint issues, in order.
|
|
85
|
+
tokens: []const []const u8 = &.{ "ACCESS01", "ACCESS02", "ACCESS03" },
|
|
86
|
+
tokenpath: []const u8 = "auth/token",
|
|
87
|
+
tokenfield: []const u8 = "access_token",
|
|
88
|
+
tokenstatus: []const i64 = &.{200},
|
|
89
|
+
issued: usize = 0,
|
|
90
|
+
apicalls: usize = 0,
|
|
91
|
+
|
|
92
|
+
fn new() *Wire {
|
|
93
|
+
const w = h.A().create(Wire) catch unreachable;
|
|
94
|
+
w.* = .{};
|
|
95
|
+
return w;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
fn call(p: *anyopaque, _: std.mem.Allocator, arg: Value) anyerror!Value {
|
|
99
|
+
const self: *Wire = @ptrCast(@alignCast(p));
|
|
100
|
+
const url: []const u8 = if (arg == .array and 1 <= arg.array.data.items.len and arg.array.data.items[0] == .string)
|
|
101
|
+
arg.array.data.items[0].string
|
|
102
|
+
else
|
|
103
|
+
"";
|
|
104
|
+
const fetchdef: Value = if (arg == .array and 2 <= arg.array.data.items.len) arg.array.data.items[1] else vnull();
|
|
105
|
+
const headers = h.getp(fetchdef, "headers");
|
|
106
|
+
const auth: ?[]const u8 = if (h.get_str(headers, "authorization")) |a| (h.A().dupe(u8, a) catch a) else null;
|
|
107
|
+
const body: ?[]const u8 = if (h.get_str(fetchdef, "body")) |b| (h.A().dupe(u8, b) catch b) else null;
|
|
108
|
+
self.calls.append(h.A(), .{ .url = h.A().dupe(u8, url) catch url, .auth = auth, .body = body }) catch {};
|
|
109
|
+
|
|
110
|
+
const suffix = std.fmt.allocPrint(h.A(), "/{s}", .{self.tokenpath}) catch "/auth/token";
|
|
111
|
+
if (std.mem.endsWith(u8, url, suffix)) {
|
|
112
|
+
const token = self.tokens[@min(self.issued, self.tokens.len - 1)];
|
|
113
|
+
const status = self.tokenstatus[@min(self.issued, self.tokenstatus.len - 1)];
|
|
114
|
+
self.issued += 1;
|
|
115
|
+
return response(status, h.jo(&.{.{ self.tokenfield, h.vstr(token) }}));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const status = self.apistatus[@min(self.apicalls, self.apistatus.len - 1)];
|
|
119
|
+
self.apicalls += 1;
|
|
120
|
+
return response(status, h.jo(&.{ .{ "ok", h.vbool(status < 400) }, .{ "id", h.vstr("s01") } }));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
fn fetch_fn(self: *Wire) Value {
|
|
124
|
+
return h.callable(@ptrCast(self), call);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/// The API calls (everything that was not the token endpoint).
|
|
128
|
+
fn api(self: *Wire) []Call {
|
|
129
|
+
var out: std.ArrayList(Call) = .empty;
|
|
130
|
+
const suffix = std.fmt.allocPrint(h.A(), "/{s}", .{self.tokenpath}) catch "/auth/token";
|
|
131
|
+
for (self.calls.items) |c| {
|
|
132
|
+
if (!std.mem.endsWith(u8, c.url, suffix)) out.append(h.A(), c) catch {};
|
|
133
|
+
}
|
|
134
|
+
return out.items;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
fn token_calls(self: *Wire) usize {
|
|
138
|
+
return self.calls.items.len - self.api().len;
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
fn response(status: i64, data: Value) Value {
|
|
143
|
+
return h.jo(&.{
|
|
144
|
+
.{ "status", h.vnum(status) },
|
|
145
|
+
.{ "statusText", h.vstr(if (status >= 400) "ERR" else "OK") },
|
|
146
|
+
.{ "headers", h.omap() },
|
|
147
|
+
.{ "json", h.json_thunk(data) },
|
|
148
|
+
.{ "body", h.vstr("x") },
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// ---- a scripted provider ------------------------------------------------
|
|
153
|
+
|
|
154
|
+
/// A provider given as a callable (the feature's Value-shaped custom
|
|
155
|
+
/// provider seam): a string is a HIT, null a MISS, `{__err__}` an ERROR.
|
|
156
|
+
/// Scriptable per call, and it records every name it was asked.
|
|
157
|
+
const Scripted = struct {
|
|
158
|
+
value: ?[]const u8 = null,
|
|
159
|
+
err: ?[]const u8 = null,
|
|
160
|
+
asked: usize = 0,
|
|
161
|
+
names: std.ArrayList([]const u8) = .empty,
|
|
162
|
+
|
|
163
|
+
fn new(value: ?[]const u8, err: ?[]const u8) *Scripted {
|
|
164
|
+
const s = h.A().create(Scripted) catch unreachable;
|
|
165
|
+
s.* = .{ .value = value, .err = err };
|
|
166
|
+
return s;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
fn call(p: *anyopaque, _: std.mem.Allocator, arg: Value) anyerror!Value {
|
|
170
|
+
const self: *Scripted = @ptrCast(@alignCast(p));
|
|
171
|
+
self.asked += 1;
|
|
172
|
+
if (arg == .string) self.names.append(h.A(), arg.string) catch {};
|
|
173
|
+
if (self.err) |m| return h.jo(&.{.{ "__err__", h.vstr(m) }});
|
|
174
|
+
if (self.value) |v| return h.vstr(v);
|
|
175
|
+
return vnull();
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
fn fn_val(self: *Scripted) Value {
|
|
179
|
+
return h.callable(@ptrCast(self), call);
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
// ---- clients --------------------------------------------------------------
|
|
184
|
+
|
|
185
|
+
/// Feature options: `{ active: true, providers: [...], ...extra }`.
|
|
186
|
+
fn secrets_opts(providers: Value, extra: Value) Value {
|
|
187
|
+
const fo = h.jo(&.{
|
|
188
|
+
.{ "active", h.vbool(true) },
|
|
189
|
+
.{ "providers", providers },
|
|
190
|
+
});
|
|
191
|
+
if (extra == .object) {
|
|
192
|
+
var it = extra.object.iterator();
|
|
193
|
+
while (it.next()) |kv| h.setp(fo, kv.key_ptr.*, kv.value_ptr.*);
|
|
194
|
+
}
|
|
195
|
+
return fo;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/// A LIVE client whose `system.fetch` is the wire, with the secrets feature
|
|
199
|
+
/// handed in through the `extend` seam - installed exactly once whether or
|
|
200
|
+
/// not the generated Config already registered it, so these tests hold in
|
|
201
|
+
/// any generated tree.
|
|
202
|
+
fn live_client(w: *Wire, sdkopts: Value) *sdk.SDK {
|
|
203
|
+
const opts: Value = if (sdkopts == .object) sdkopts else h.omap();
|
|
204
|
+
h.setp(opts, "base", h.vstr(BASE));
|
|
205
|
+
h.setp(opts, "system", h.jo(&.{.{ "fetch", w.fetch_fn() }}));
|
|
206
|
+
return sdk.SDK.new_with(opts, &.{sdk.SecretsFeature.make()});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
fn secrets_client(w: *Wire, sdkopts: Value, feature_opts: Value) *sdk.SDK {
|
|
210
|
+
const opts: Value = if (sdkopts == .object) sdkopts else h.omap();
|
|
211
|
+
h.setp(opts, "feature", h.jo(&.{.{ "secrets", feature_opts }}));
|
|
212
|
+
return live_client(w, opts);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
fn secrets_of(client: *sdk.SDK) ?*sdk.SecretsFeature {
|
|
216
|
+
for (client.features.items) |f| {
|
|
217
|
+
if (std.mem.eql(u8, f.name(), "secrets")) return @ptrCast(@alignCast(f.ptr));
|
|
218
|
+
}
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
fn count_named(client: *sdk.SDK, name: []const u8) usize {
|
|
223
|
+
var n: usize = 0;
|
|
224
|
+
for (client.features.items) |f| {
|
|
225
|
+
if (std.mem.eql(u8, f.name(), name)) n += 1;
|
|
226
|
+
}
|
|
227
|
+
return n;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// The Authorization header carries the SPEC's credential prefix, which a
|
|
231
|
+
// TEMPLATE cannot know: an OpenAPI bearer scheme gives `Bearer <token>`, an
|
|
232
|
+
// apiKey scheme the raw token. So assert on the CREDENTIAL and let the
|
|
233
|
+
// prefix be whatever this SDK's API declares.
|
|
234
|
+
fn credential_is(auth: ?[]const u8, token: []const u8) !void {
|
|
235
|
+
const got = auth orelse "";
|
|
236
|
+
const suffix = std.fmt.allocPrint(h.A(), " {s}", .{token}) catch token;
|
|
237
|
+
if (!(std.mem.eql(u8, got, token) or std.mem.endsWith(u8, got, suffix))) {
|
|
238
|
+
std.debug.print("expected the authorization header to carry {s}, got: {s}\n", .{ token, got });
|
|
239
|
+
return error.TestUnexpectedResult;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
fn contains(text: []const u8, needle: []const u8) bool {
|
|
244
|
+
return std.mem.indexOf(u8, text, needle) != null;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// ---- the entity driver ----------------------------------------------------
|
|
248
|
+
|
|
249
|
+
const Drive = struct {
|
|
250
|
+
ran: bool,
|
|
251
|
+
ok: bool,
|
|
252
|
+
msg: []const u8,
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
/// Drive one REAL generated entity op through the pipeline. The client's
|
|
256
|
+
/// entity accessors are `pub fn <name>(self: *SDK, entopts: Value) *Ent`;
|
|
257
|
+
/// found by comptime reflection (the zig spelling of go's reflect-based
|
|
258
|
+
/// driver), and the first entity whose model op map declares `load` or
|
|
259
|
+
/// `list` is driven. `ran == false` means this SDK has no such entity.
|
|
260
|
+
fn drive_entity(client: *sdk.SDK) Drive {
|
|
261
|
+
const cfg = sdk.make_config();
|
|
262
|
+
const info = @typeInfo(sdk.SDK).@"struct";
|
|
263
|
+
|
|
264
|
+
inline for (info.decls) |d| {
|
|
265
|
+
const F = @TypeOf(@field(sdk.SDK, d.name));
|
|
266
|
+
const fi = @typeInfo(F);
|
|
267
|
+
if (fi == .@"fn") {
|
|
268
|
+
const params = fi.@"fn".params;
|
|
269
|
+
if (params.len == 2 and params[0].type == *sdk.SDK and params[1].type == Value) {
|
|
270
|
+
if (fi.@"fn".return_type) |R| {
|
|
271
|
+
if (@typeInfo(R) == .pointer and @typeInfo(@typeInfo(R).pointer.child) == .@"struct" and
|
|
272
|
+
@hasDecl(@typeInfo(R).pointer.child, "load"))
|
|
273
|
+
{
|
|
274
|
+
const ent = @field(sdk.SDK, d.name)(client, vnull());
|
|
275
|
+
const ops = h.getpath(&.{ "entity", ent.name, "op" }, cfg);
|
|
276
|
+
if (h.getp(ops, "load") == .object) {
|
|
277
|
+
const res = ent.load(h.jo(&.{.{ "id", h.vstr("s01") }}), vnull());
|
|
278
|
+
return switch (res) {
|
|
279
|
+
.err => |e| .{ .ran = true, .ok = false, .msg = e.msg },
|
|
280
|
+
.ok => .{ .ran = true, .ok = true, .msg = "" },
|
|
281
|
+
};
|
|
282
|
+
} else if (h.getp(ops, "list") == .object) {
|
|
283
|
+
const res = ent.list(h.omap(), vnull());
|
|
284
|
+
return switch (res) {
|
|
285
|
+
.err => |e| .{ .ran = true, .ok = false, .msg = e.msg },
|
|
286
|
+
.ok => .{ .ran = true, .ok = true, .msg = "" },
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return .{ .ran = false, .ok = false, .msg = "" };
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
fn direct_probe(client: *sdk.SDK) Value {
|
|
299
|
+
return client.direct(h.jo(&.{.{ "path", h.vstr("/probe") }}));
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// ---- inactive --------------------------------------------------------------
|
|
303
|
+
|
|
304
|
+
test "secrets inactive: apikey option behaves exactly as before" {
|
|
305
|
+
if (!present()) return error.SkipZigTest;
|
|
306
|
+
const w = Wire.new();
|
|
307
|
+
const client = live_client(w, h.jo(&.{.{ "apikey", h.vstr("OPTKEY01") }}));
|
|
308
|
+
// No feature options, no install: `extend` hands the feature in, but an
|
|
309
|
+
// inactive feature installs nothing on the transport.
|
|
310
|
+
const res = direct_probe(client);
|
|
311
|
+
try testing.expect(h.get_bool(res, "ok") orelse false);
|
|
312
|
+
try testing.expect(w.api().len == 1);
|
|
313
|
+
try credential_is(w.api()[0].auth, "OPTKEY01");
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
test "secrets inactive: no apikey means no authorization header" {
|
|
317
|
+
if (!present()) return error.SkipZigTest;
|
|
318
|
+
const w = Wire.new();
|
|
319
|
+
const client = live_client(w, h.omap());
|
|
320
|
+
_ = direct_probe(client);
|
|
321
|
+
try testing.expect(w.api().len == 1);
|
|
322
|
+
try testing.expect(w.api()[0].auth == null);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// ---- the chain ---------------------------------------------------------------
|
|
326
|
+
|
|
327
|
+
test "secrets active: apikey option still wins over the chain" {
|
|
328
|
+
if (!present()) return error.SkipZigTest;
|
|
329
|
+
const w = Wire.new();
|
|
330
|
+
const chain = Scripted.new("CHAINKEY01", null);
|
|
331
|
+
const client = secrets_client(w, h.jo(&.{.{ "apikey", h.vstr("OPTKEY01") }}), secrets_opts(h.ja(&.{chain.fn_val()}), vnull()));
|
|
332
|
+
|
|
333
|
+
const drove = drive_entity(client);
|
|
334
|
+
if (!drove.ran) return error.SkipZigTest;
|
|
335
|
+
try testing.expect(drove.ok);
|
|
336
|
+
try testing.expect(w.api().len == 1);
|
|
337
|
+
try credential_is(w.api()[0].auth, "OPTKEY01");
|
|
338
|
+
|
|
339
|
+
// The explicit option is a real store, not a special case: a directed
|
|
340
|
+
// read names it like any other.
|
|
341
|
+
const sf = secrets_of(client) orelse return error.TestUnexpectedResult;
|
|
342
|
+
switch (sf.getfrom("options", "apikey")) {
|
|
343
|
+
.ok => |v| try testing.expectEqualStrings("OPTKEY01", v),
|
|
344
|
+
.err => |m| {
|
|
345
|
+
std.debug.print("directed read failed: {s}\n", .{m});
|
|
346
|
+
return error.TestUnexpectedResult;
|
|
347
|
+
},
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
test "secrets active: an omitted apikey defers to the chain at the transport seam" {
|
|
352
|
+
if (!present()) return error.SkipZigTest;
|
|
353
|
+
const w = Wire.new();
|
|
354
|
+
const chain = Scripted.new("CHAINKEY02", null);
|
|
355
|
+
const client = secrets_client(w, h.omap(), secrets_opts(h.ja(&.{chain.fn_val()}), vnull()));
|
|
356
|
+
const sf = secrets_of(client) orelse return error.TestUnexpectedResult;
|
|
357
|
+
|
|
358
|
+
// Before any op, nothing has been resolved: resolution happens AT THE
|
|
359
|
+
// TRANSPORT, not at construction.
|
|
360
|
+
try testing.expectEqualStrings("", sf.credential());
|
|
361
|
+
try testing.expect(chain.asked == 0);
|
|
362
|
+
|
|
363
|
+
const drove = drive_entity(client);
|
|
364
|
+
if (!drove.ran) return error.SkipZigTest;
|
|
365
|
+
try testing.expect(drove.ok);
|
|
366
|
+
try credential_is(w.api()[0].auth, "CHAINKEY02");
|
|
367
|
+
try testing.expectEqualStrings("CHAINKEY02", sf.credential());
|
|
368
|
+
|
|
369
|
+
// The options map is never written: the credential lives in feature
|
|
370
|
+
// state and is injected on the wire.
|
|
371
|
+
try testing.expectEqualStrings("", h.get_str(client.options_map(), "apikey") orelse "");
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
test "secrets active: the env provider reads the environment handed in" {
|
|
375
|
+
if (!present()) return error.SkipZigTest;
|
|
376
|
+
var env = std.process.Environ.Map.init(h.A());
|
|
377
|
+
try env.put("PROJECTENV_TEST_SECRETS_APIKEY", "ENVKEY01");
|
|
378
|
+
sdk.SecretsFeature.set_environ(&env);
|
|
379
|
+
defer sdk.SecretsFeature.set_environ(null);
|
|
380
|
+
|
|
381
|
+
const w = Wire.new();
|
|
382
|
+
const client = secrets_client(w, h.omap(), secrets_opts(h.ja(&.{
|
|
383
|
+
h.jo(&.{ .{ "kind", h.vstr("env") }, .{ "prefix", h.vstr("PROJECTENV_TEST_SECRETS_") } }),
|
|
384
|
+
}), vnull()));
|
|
385
|
+
_ = direct_probe(client);
|
|
386
|
+
try testing.expect(w.api().len == 1);
|
|
387
|
+
try credential_is(w.api()[0].auth, "ENVKEY01");
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
test "secrets active: a memory spec map is decoded through sekreto's own specof" {
|
|
391
|
+
if (!present()) return error.SkipZigTest;
|
|
392
|
+
const w = Wire.new();
|
|
393
|
+
const client = secrets_client(w, h.omap(), secrets_opts(h.ja(&.{
|
|
394
|
+
h.jo(&.{
|
|
395
|
+
.{ "kind", h.vstr("memory") },
|
|
396
|
+
.{ "name", h.vstr("literal") },
|
|
397
|
+
.{ "values", h.jo(&.{.{ "APIKEY", h.vstr("MEMKEY01") }}) },
|
|
398
|
+
}),
|
|
399
|
+
}), vnull()));
|
|
400
|
+
_ = direct_probe(client);
|
|
401
|
+
try credential_is(w.api()[0].auth, "MEMKEY01");
|
|
402
|
+
const sf = secrets_of(client) orelse return error.TestUnexpectedResult;
|
|
403
|
+
switch (sf.getfrom("literal", "apikey")) {
|
|
404
|
+
.ok => |v| try testing.expectEqualStrings("MEMKEY01", v),
|
|
405
|
+
.err => return error.TestUnexpectedResult,
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
test "secrets active: a miss everywhere leaves the header off" {
|
|
410
|
+
if (!present()) return error.SkipZigTest;
|
|
411
|
+
const w = Wire.new();
|
|
412
|
+
const chain = Scripted.new(null, null);
|
|
413
|
+
const client = secrets_client(w, h.omap(), secrets_opts(h.ja(&.{chain.fn_val()}), vnull()));
|
|
414
|
+
const drove = drive_entity(client);
|
|
415
|
+
if (!drove.ran) return error.SkipZigTest;
|
|
416
|
+
try testing.expect(drove.ok);
|
|
417
|
+
try testing.expect(chain.asked == 1);
|
|
418
|
+
// A MISS falls through: the request still goes out, unauthenticated.
|
|
419
|
+
try testing.expect(w.api().len == 1);
|
|
420
|
+
try testing.expect(w.api()[0].auth == null);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
test "secrets active: a provider ERROR fails the entity op and nothing reaches the wire" {
|
|
424
|
+
if (!present()) return error.SkipZigTest;
|
|
425
|
+
|
|
426
|
+
// CONTROL FIRST, so the zero below is known to be observable at all.
|
|
427
|
+
const control = Wire.new();
|
|
428
|
+
const good = secrets_client(control, h.omap(), secrets_opts(h.ja(&.{Scripted.new("GOODKEY01", null).fn_val()}), vnull()));
|
|
429
|
+
const cdrove = drive_entity(good);
|
|
430
|
+
if (!cdrove.ran) return error.SkipZigTest;
|
|
431
|
+
try testing.expect(cdrove.ok);
|
|
432
|
+
try testing.expect(control.api().len == 1);
|
|
433
|
+
try credential_is(control.api()[0].auth, "GOODKEY01");
|
|
434
|
+
|
|
435
|
+
// THE RULE.
|
|
436
|
+
const w = Wire.new();
|
|
437
|
+
const broken = Scripted.new(null, "vault unreachable");
|
|
438
|
+
const client = secrets_client(w, h.omap(), secrets_opts(h.ja(&.{broken.fn_val()}), vnull()));
|
|
439
|
+
const drove = drive_entity(client);
|
|
440
|
+
try testing.expect(drove.ran);
|
|
441
|
+
try testing.expect(!drove.ok);
|
|
442
|
+
try testing.expect(broken.asked == 1);
|
|
443
|
+
// The PROVIDER'S OWN message, and ZERO requests on the wire.
|
|
444
|
+
try testing.expect(contains(drove.msg, "vault unreachable"));
|
|
445
|
+
try testing.expect(w.api().len == 0);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
test "secrets active: a provider ERROR fails direct() rather than sending" {
|
|
449
|
+
if (!present()) return error.SkipZigTest;
|
|
450
|
+
|
|
451
|
+
const control = Wire.new();
|
|
452
|
+
const good = secrets_client(control, h.omap(), secrets_opts(h.ja(&.{Scripted.new("GOODKEY02", null).fn_val()}), vnull()));
|
|
453
|
+
const cres = direct_probe(good);
|
|
454
|
+
try testing.expect(h.get_bool(cres, "ok") orelse false);
|
|
455
|
+
try testing.expect(control.api().len == 1);
|
|
456
|
+
try credential_is(control.api()[0].auth, "GOODKEY02");
|
|
457
|
+
|
|
458
|
+
const w = Wire.new();
|
|
459
|
+
const client = secrets_client(w, h.omap(), secrets_opts(h.ja(&.{Scripted.new(null, "vault unreachable").fn_val()}), vnull()));
|
|
460
|
+
const res = direct_probe(client);
|
|
461
|
+
try testing.expect(res == .object);
|
|
462
|
+
try testing.expect(!(h.get_bool(res, "ok") orelse true));
|
|
463
|
+
try testing.expect(contains(h.get_str(res, "err") orelse "", "vault unreachable"));
|
|
464
|
+
try testing.expect(w.api().len == 0);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
test "secrets active: a provider ERROR fails graphql() rather than sending" {
|
|
468
|
+
if (!present()) return error.SkipZigTest;
|
|
469
|
+
|
|
470
|
+
const control = Wire.new();
|
|
471
|
+
const good = secrets_client(control, h.omap(), secrets_opts(h.ja(&.{Scripted.new("GOODKEY03", null).fn_val()}), vnull()));
|
|
472
|
+
const cres = good.graphql("{ ok }", vnull(), vnull());
|
|
473
|
+
try testing.expect(h.get_bool(cres, "ok") orelse false);
|
|
474
|
+
try testing.expect(control.api().len == 1);
|
|
475
|
+
try credential_is(control.api()[0].auth, "GOODKEY03");
|
|
476
|
+
|
|
477
|
+
const w = Wire.new();
|
|
478
|
+
const client = secrets_client(w, h.omap(), secrets_opts(h.ja(&.{Scripted.new(null, "vault unreachable").fn_val()}), vnull()));
|
|
479
|
+
const res = client.graphql("{ ok }", vnull(), vnull());
|
|
480
|
+
try testing.expect(!(h.get_bool(res, "ok") orelse true));
|
|
481
|
+
try testing.expect(contains(h.get_str(res, "err") orelse "", "vault unreachable"));
|
|
482
|
+
try testing.expect(w.api().len == 0);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// FAIL CLOSED ON A CONSTRUCTION FAILURE. The chain a project configures can
|
|
486
|
+
// be wrong before a single lookup happens, and init cannot fail the client
|
|
487
|
+
// construction - so it HOLDS the error and the transport gate refuses to
|
|
488
|
+
// send. The entry pinned here is a bare kind name where a spec belongs: a
|
|
489
|
+
// switch without a fail-closed arm silently DROPS it, the chain gets SHORTER
|
|
490
|
+
// rather than broken, and every request goes out unauthenticated.
|
|
491
|
+
test "secrets active: a malformed providers entry fails closed, never dropped" {
|
|
492
|
+
if (!present()) return error.SkipZigTest;
|
|
493
|
+
const notaprovider = "not a provider or a provider spec";
|
|
494
|
+
|
|
495
|
+
// CONTROL FIRST.
|
|
496
|
+
const control = Wire.new();
|
|
497
|
+
const good = secrets_client(control, h.omap(), secrets_opts(h.ja(&.{Scripted.new("INITKEY01", null).fn_val()}), vnull()));
|
|
498
|
+
const cres = direct_probe(good);
|
|
499
|
+
try testing.expect(h.get_bool(cres, "ok") orelse false);
|
|
500
|
+
try testing.expect(control.api().len == 1);
|
|
501
|
+
try credential_is(control.api()[0].auth, "INITKEY01");
|
|
502
|
+
|
|
503
|
+
// THE RULE: a kind NAME where a provider or spec belongs.
|
|
504
|
+
const w = Wire.new();
|
|
505
|
+
const client = secrets_client(w, h.omap(), secrets_opts(h.ja(&.{h.vstr("hashicorp")}), vnull()));
|
|
506
|
+
|
|
507
|
+
// The feature must still be INSTALLED: a construction failure that
|
|
508
|
+
// silently uninstalled it would be the same fail-open by another route.
|
|
509
|
+
const sf = secrets_of(client) orelse return error.TestUnexpectedResult;
|
|
510
|
+
try testing.expect(contains(sf.init_error() orelse "", notaprovider));
|
|
511
|
+
|
|
512
|
+
// direct runs no feature hook at all, so the ONLY thing that can refuse
|
|
513
|
+
// it is the transport gate - with sekreto's own message.
|
|
514
|
+
const res = direct_probe(client);
|
|
515
|
+
try testing.expect(!(h.get_bool(res, "ok") orelse true));
|
|
516
|
+
try testing.expect(contains(h.get_str(res, "err") orelse "", notaprovider));
|
|
517
|
+
try testing.expect(w.api().len == 0);
|
|
518
|
+
|
|
519
|
+
// And the entity pipeline.
|
|
520
|
+
const drove = drive_entity(client);
|
|
521
|
+
if (drove.ran) {
|
|
522
|
+
try testing.expect(!drove.ok);
|
|
523
|
+
try testing.expect(contains(drove.msg, notaprovider));
|
|
524
|
+
}
|
|
525
|
+
try testing.expect(w.api().len == 0);
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
test "secrets active: an unknown provider kind is refused by name, fail-closed" {
|
|
529
|
+
if (!present()) return error.SkipZigTest;
|
|
530
|
+
const w = Wire.new();
|
|
531
|
+
const client = secrets_client(w, h.omap(), secrets_opts(h.ja(&.{
|
|
532
|
+
h.jo(&.{.{ "kind", h.vstr("nosuchkind") }}),
|
|
533
|
+
}), vnull()));
|
|
534
|
+
const res = direct_probe(client);
|
|
535
|
+
try testing.expect(!(h.get_bool(res, "ok") orelse true));
|
|
536
|
+
try testing.expect(contains(h.get_str(res, "err") orelse "", "sekreto: unknown provider kind: nosuchkind"));
|
|
537
|
+
try testing.expect(w.api().len == 0);
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
// A provider failure closes the gate; a later resolution that SUCCEEDS
|
|
541
|
+
// reopens it and the operation goes out with the FRESH credential - a failed
|
|
542
|
+
// resolution is never cached.
|
|
543
|
+
test "secrets active: the gate recovers after a transient provider failure" {
|
|
544
|
+
if (!present()) return error.SkipZigTest;
|
|
545
|
+
const w = Wire.new();
|
|
546
|
+
const flaky = Scripted.new(null, "vault unreachable");
|
|
547
|
+
const client = secrets_client(w, h.omap(), secrets_opts(h.ja(&.{flaky.fn_val()}), vnull()));
|
|
548
|
+
|
|
549
|
+
const first = direct_probe(client);
|
|
550
|
+
try testing.expect(!(h.get_bool(first, "ok") orelse true));
|
|
551
|
+
try testing.expect(w.api().len == 0);
|
|
552
|
+
|
|
553
|
+
flaky.err = null;
|
|
554
|
+
flaky.value = "FRESH01";
|
|
555
|
+
|
|
556
|
+
const second = direct_probe(client);
|
|
557
|
+
try testing.expect(h.get_bool(second, "ok") orelse false);
|
|
558
|
+
try testing.expect(w.api().len == 1);
|
|
559
|
+
try credential_is(w.api()[0].auth, "FRESH01");
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
test "secrets active: an uncached miss retracts a resolved credential" {
|
|
563
|
+
if (!present()) return error.SkipZigTest;
|
|
564
|
+
const w = Wire.new();
|
|
565
|
+
const revocable = Scripted.new("REVOCABLE01", null);
|
|
566
|
+
const client = secrets_client(w, h.omap(), secrets_opts(h.ja(&.{revocable.fn_val()}), h.jo(&.{.{ "cache", h.vbool(false) }})));
|
|
567
|
+
|
|
568
|
+
_ = direct_probe(client);
|
|
569
|
+
try credential_is(w.api()[0].auth, "REVOCABLE01");
|
|
570
|
+
|
|
571
|
+
revocable.value = null;
|
|
572
|
+
_ = direct_probe(client);
|
|
573
|
+
try testing.expect(w.api().len == 2);
|
|
574
|
+
// After the chain reports a miss, the retracted credential must not go
|
|
575
|
+
// out.
|
|
576
|
+
try testing.expect(w.api()[1].auth == null);
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
test "secrets active: cache true asks the chain once, cache false every request" {
|
|
580
|
+
if (!present()) return error.SkipZigTest;
|
|
581
|
+
const cached = Scripted.new("K", null);
|
|
582
|
+
const cw = Wire.new();
|
|
583
|
+
const cclient = secrets_client(cw, h.omap(), secrets_opts(h.ja(&.{cached.fn_val()}), vnull()));
|
|
584
|
+
_ = direct_probe(cclient);
|
|
585
|
+
_ = direct_probe(cclient);
|
|
586
|
+
try testing.expect(cw.api().len == 2);
|
|
587
|
+
try testing.expect(cached.asked == 1);
|
|
588
|
+
|
|
589
|
+
const fresh = Scripted.new("K", null);
|
|
590
|
+
const fw = Wire.new();
|
|
591
|
+
const fclient = secrets_client(fw, h.omap(), secrets_opts(h.ja(&.{fresh.fn_val()}), h.jo(&.{.{ "cache", h.vbool(false) }})));
|
|
592
|
+
_ = direct_probe(fclient);
|
|
593
|
+
_ = direct_probe(fclient);
|
|
594
|
+
try testing.expect(fw.api().len == 2);
|
|
595
|
+
try testing.expect(fresh.asked == 2);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
// `auth: null` - the documented way to disable auth outright, which
|
|
599
|
+
// prepare_auth honours before it ever reads the apikey. Pinned with an
|
|
600
|
+
// explicit apikey AND a resolving chain: nothing may reach the wire.
|
|
601
|
+
test "secrets active: auth null suppresses the credential, chain or no chain" {
|
|
602
|
+
if (!present()) return error.SkipZigTest;
|
|
603
|
+
const w = Wire.new();
|
|
604
|
+
const chain = Scripted.new("CHAINKEY03", null);
|
|
605
|
+
const client = secrets_client(w, h.jo(&.{
|
|
606
|
+
.{ "apikey", h.vstr("OPTKEY01") },
|
|
607
|
+
.{ "auth", h.vnull() },
|
|
608
|
+
}), secrets_opts(h.ja(&.{chain.fn_val()}), vnull()));
|
|
609
|
+
|
|
610
|
+
const res = direct_probe(client);
|
|
611
|
+
try testing.expect(h.get_bool(res, "ok") orelse false);
|
|
612
|
+
try testing.expect(w.api().len == 1);
|
|
613
|
+
try testing.expect(w.api()[0].auth == null);
|
|
614
|
+
|
|
615
|
+
// And options.auth survives validate as a PRESENT null, not a default.
|
|
616
|
+
const opts = client.options_map();
|
|
617
|
+
try testing.expect(opts == .object);
|
|
618
|
+
const raw = opts.object.get("auth") orelse return error.TestUnexpectedResult;
|
|
619
|
+
try testing.expect(raw == .null);
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
test "secrets active: the secret name is configurable" {
|
|
623
|
+
if (!present()) return error.SkipZigTest;
|
|
624
|
+
const w = Wire.new();
|
|
625
|
+
const chain = Scripted.new("TOKEN01", null);
|
|
626
|
+
const client = secrets_client(w, h.omap(), secrets_opts(h.ja(&.{chain.fn_val()}), h.jo(&.{.{ "name", h.vstr("api.token") }})));
|
|
627
|
+
_ = direct_probe(client);
|
|
628
|
+
try credential_is(w.api()[0].auth, "TOKEN01");
|
|
629
|
+
try testing.expect(chain.names.items.len == 1);
|
|
630
|
+
try testing.expectEqualStrings("api.token", chain.names.items[0]);
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
test "secrets active: sekreto is live for arbitrary secrets and redaction" {
|
|
634
|
+
if (!present()) return error.SkipZigTest;
|
|
635
|
+
const w = Wire.new();
|
|
636
|
+
const client = secrets_client(w, h.omap(), secrets_opts(h.ja(&.{
|
|
637
|
+
h.jo(&.{
|
|
638
|
+
.{ "kind", h.vstr("memory") },
|
|
639
|
+
.{ "values", h.jo(&.{ .{ "APIKEY", h.vstr("MEMKEY02") }, .{ "DB_PASS", h.vstr("hunter22") } }) },
|
|
640
|
+
}),
|
|
641
|
+
}), vnull()));
|
|
642
|
+
const sf = secrets_of(client) orelse return error.TestUnexpectedResult;
|
|
643
|
+
|
|
644
|
+
switch (sf.get("db.pass")) {
|
|
645
|
+
.ok => |v| try testing.expectEqualStrings("hunter22", v),
|
|
646
|
+
.err => return error.TestUnexpectedResult,
|
|
647
|
+
}
|
|
648
|
+
switch (sf.get("nope")) {
|
|
649
|
+
.ok => return error.TestUnexpectedResult,
|
|
650
|
+
.err => |m| try testing.expect(contains(m, "sekreto: unknown secret: nope")),
|
|
651
|
+
}
|
|
652
|
+
// Every value ever resolved is redactable.
|
|
653
|
+
const redacted = sf.redact("pass=hunter22 key=MEMKEY02");
|
|
654
|
+
try testing.expect(!contains(redacted, "hunter22"));
|
|
655
|
+
try testing.expect(contains(redacted, "[redacted]"));
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
// The plugin VOCABULARY: a kind the model selected (Config_zig FeaturePlugins
|
|
659
|
+
// -> feature/secrets/plugins.zig) builds; one it did not is refused by name
|
|
660
|
+
// with sekreto's own "pass it in the plugins option" message. This test
|
|
661
|
+
// selects `hashicorp` (the `vault` group) against a closed loopback port: a
|
|
662
|
+
// selected kind fails CLOSED with a reach error, an unselected one fails
|
|
663
|
+
// closed at construction. Either way nothing reaches the wire.
|
|
664
|
+
test "secrets active: a selected plugin kind is in the SDK vocabulary" {
|
|
665
|
+
if (!present()) return error.SkipZigTest;
|
|
666
|
+
const w = Wire.new();
|
|
667
|
+
const client = secrets_client(w, h.omap(), secrets_opts(h.ja(&.{
|
|
668
|
+
h.jo(&.{
|
|
669
|
+
.{ "kind", h.vstr("hashicorp") },
|
|
670
|
+
.{ "addr", h.vstr("http://127.0.0.1:9") },
|
|
671
|
+
.{ "token", h.vstr("t") },
|
|
672
|
+
}),
|
|
673
|
+
}), vnull()));
|
|
674
|
+
const sf = secrets_of(client) orelse return error.TestUnexpectedResult;
|
|
675
|
+
|
|
676
|
+
if (sf.init_error()) |message| {
|
|
677
|
+
// The vault group was not generated into this SDK: the kind is
|
|
678
|
+
// refused BY NAME, and the suite says so rather than passing.
|
|
679
|
+
try testing.expect(contains(message, "sekreto: unknown provider kind: hashicorp"));
|
|
680
|
+
try testing.expect(contains(message, "pass it in the plugins option"));
|
|
681
|
+
return error.SkipZigTest;
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
const res = direct_probe(client);
|
|
685
|
+
try testing.expect(!(h.get_bool(res, "ok") orelse true));
|
|
686
|
+
try testing.expect(contains(h.get_str(res, "err") orelse "", "sekreto: cannot reach http://127.0.0.1:9/"));
|
|
687
|
+
try testing.expect(w.api().len == 0);
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
test "secrets: the extend seam installs a directly constructed feature exactly once" {
|
|
691
|
+
if (!present()) return error.SkipZigTest;
|
|
692
|
+
const w = Wire.new();
|
|
693
|
+
const client = secrets_client(w, h.omap(), secrets_opts(h.ja(&.{Scripted.new("K", null).fn_val()}), vnull()));
|
|
694
|
+
try testing.expect(count_named(client, "secrets") == 1);
|
|
695
|
+
// Whether Config registered it or extend supplied it, one wrapper: one
|
|
696
|
+
// request reaches the wire per operation.
|
|
697
|
+
_ = direct_probe(client);
|
|
698
|
+
try testing.expect(w.api().len == 1);
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
// ---- the exchange ----------------------------------------------------------
|
|
702
|
+
|
|
703
|
+
fn exchange_opts(providers: Value, extra: Value) Value {
|
|
704
|
+
const xo = h.jo(&.{.{ "active", h.vbool(true) }});
|
|
705
|
+
if (extra == .object) {
|
|
706
|
+
var it = extra.object.iterator();
|
|
707
|
+
while (it.next()) |kv| h.setp(xo, kv.key_ptr.*, kv.value_ptr.*);
|
|
708
|
+
}
|
|
709
|
+
return secrets_opts(providers, h.jo(&.{
|
|
710
|
+
.{ "name", h.vstr("refresh_token") },
|
|
711
|
+
.{ "exchange", xo },
|
|
712
|
+
}));
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
test "secrets exchange: the refresh token buys an access token, and the request carries it" {
|
|
716
|
+
if (!present()) return error.SkipZigTest;
|
|
717
|
+
const w = Wire.new();
|
|
718
|
+
const client = secrets_client(w, h.omap(), exchange_opts(h.ja(&.{Scripted.new("REFRESH01", null).fn_val()}), vnull()));
|
|
719
|
+
const res = direct_probe(client);
|
|
720
|
+
try testing.expect(h.get_bool(res, "ok") orelse false);
|
|
721
|
+
|
|
722
|
+
try testing.expect(w.token_calls() == 1);
|
|
723
|
+
try testing.expect(contains(w.calls.items[0].body orelse "", "\"refresh_token\":\"REFRESH01\""));
|
|
724
|
+
try testing.expect(std.mem.endsWith(u8, w.calls.items[0].url, "/api/auth/token"));
|
|
725
|
+
try testing.expect(w.api().len == 1);
|
|
726
|
+
try credential_is(w.api()[0].auth, "ACCESS01");
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
test "secrets exchange: one purchase serves many requests" {
|
|
730
|
+
if (!present()) return error.SkipZigTest;
|
|
731
|
+
const w = Wire.new();
|
|
732
|
+
const client = secrets_client(w, h.omap(), exchange_opts(h.ja(&.{Scripted.new("REFRESH01", null).fn_val()}), vnull()));
|
|
733
|
+
_ = direct_probe(client);
|
|
734
|
+
_ = direct_probe(client);
|
|
735
|
+
_ = direct_probe(client);
|
|
736
|
+
try testing.expect(w.token_calls() == 1);
|
|
737
|
+
try testing.expect(w.api().len == 3);
|
|
738
|
+
try credential_is(w.api()[2].auth, "ACCESS01");
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
test "secrets exchange: a 401 buys another token and retries the SAME request" {
|
|
742
|
+
if (!present()) return error.SkipZigTest;
|
|
743
|
+
const w = Wire.new();
|
|
744
|
+
w.apistatus = &.{ 401, 200 };
|
|
745
|
+
const client = secrets_client(w, h.omap(), exchange_opts(h.ja(&.{Scripted.new("REFRESH01", null).fn_val()}), vnull()));
|
|
746
|
+
const res = direct_probe(client);
|
|
747
|
+
try testing.expect(h.get_bool(res, "ok") orelse false);
|
|
748
|
+
try testing.expect(w.token_calls() == 2);
|
|
749
|
+
try testing.expect(w.api().len == 2);
|
|
750
|
+
try credential_is(w.api()[0].auth, "ACCESS01");
|
|
751
|
+
try credential_is(w.api()[1].auth, "ACCESS02");
|
|
752
|
+
try testing.expectEqualStrings(w.api()[0].url, w.api()[1].url);
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
test "secrets exchange: the retry happens once, not in a loop" {
|
|
756
|
+
if (!present()) return error.SkipZigTest;
|
|
757
|
+
const w = Wire.new();
|
|
758
|
+
w.apistatus = &.{401};
|
|
759
|
+
const client = secrets_client(w, h.omap(), exchange_opts(h.ja(&.{Scripted.new("REFRESH01", null).fn_val()}), vnull()));
|
|
760
|
+
const res = direct_probe(client);
|
|
761
|
+
try testing.expect(!(h.get_bool(res, "ok") orelse true));
|
|
762
|
+
try testing.expect(h.to_int(h.getp(res, "status")) == 401);
|
|
763
|
+
try testing.expect(w.api().len == 2);
|
|
764
|
+
try testing.expect(w.token_calls() == 2);
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
test "secrets exchange: a status outside exchange.statuses is not an expiry" {
|
|
768
|
+
if (!present()) return error.SkipZigTest;
|
|
769
|
+
const w = Wire.new();
|
|
770
|
+
w.apistatus = &.{500};
|
|
771
|
+
const client = secrets_client(w, h.omap(), exchange_opts(h.ja(&.{Scripted.new("REFRESH01", null).fn_val()}), vnull()));
|
|
772
|
+
_ = direct_probe(client);
|
|
773
|
+
try testing.expect(w.api().len == 1);
|
|
774
|
+
try testing.expect(w.token_calls() == 1);
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
test "secrets exchange: statuses and field names are configurable" {
|
|
778
|
+
if (!present()) return error.SkipZigTest;
|
|
779
|
+
const w = Wire.new();
|
|
780
|
+
w.apistatus = &.{ 403, 200 };
|
|
781
|
+
w.tokenpath = "oauth/refresh";
|
|
782
|
+
w.tokenfield = "token";
|
|
783
|
+
const client = secrets_client(w, h.omap(), exchange_opts(h.ja(&.{Scripted.new("REFRESH01", null).fn_val()}), h.jo(&.{
|
|
784
|
+
.{ "statuses", h.ja(&.{h.vnum(403)}) },
|
|
785
|
+
.{ "path", h.vstr("oauth/refresh") },
|
|
786
|
+
.{ "request", h.vstr("grant") },
|
|
787
|
+
.{ "response", h.vstr("token") },
|
|
788
|
+
})));
|
|
789
|
+
const res = direct_probe(client);
|
|
790
|
+
try testing.expect(h.get_bool(res, "ok") orelse false);
|
|
791
|
+
try testing.expect(w.token_calls() == 2);
|
|
792
|
+
try testing.expect(contains(w.calls.items[0].body orelse "", "\"grant\":\"REFRESH01\""));
|
|
793
|
+
try credential_is(w.api()[1].auth, "ACCESS02");
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
test "secrets exchange: an explicit apikey is spent before anything is bought" {
|
|
797
|
+
if (!present()) return error.SkipZigTest;
|
|
798
|
+
const w = Wire.new();
|
|
799
|
+
w.apistatus = &.{ 401, 200 };
|
|
800
|
+
const client = secrets_client(w, h.jo(&.{.{ "apikey", h.vstr("HELD01") }}), exchange_opts(h.ja(&.{Scripted.new("REFRESH01", null).fn_val()}), vnull()));
|
|
801
|
+
const res = direct_probe(client);
|
|
802
|
+
try testing.expect(h.get_bool(res, "ok") orelse false);
|
|
803
|
+
// The held token went out first, with NO purchase; its expiry bought one.
|
|
804
|
+
try credential_is(w.api()[0].auth, "HELD01");
|
|
805
|
+
try credential_is(w.api()[1].auth, "ACCESS01");
|
|
806
|
+
try testing.expect(w.token_calls() == 1);
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
test "secrets exchange: an explicit exchange.refresh wins over the chain" {
|
|
810
|
+
if (!present()) return error.SkipZigTest;
|
|
811
|
+
const w = Wire.new();
|
|
812
|
+
const client = secrets_client(w, h.omap(), exchange_opts(h.ja(&.{Scripted.new("CHAINREFRESH", null).fn_val()}), h.jo(&.{.{ "refresh", h.vstr("GIVENREFRESH") }})));
|
|
813
|
+
_ = direct_probe(client);
|
|
814
|
+
try testing.expect(contains(w.calls.items[0].body orelse "", "GIVENREFRESH"));
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
test "secrets exchange: no refresh token anywhere is an error, not an unauthenticated call" {
|
|
818
|
+
if (!present()) return error.SkipZigTest;
|
|
819
|
+
const w = Wire.new();
|
|
820
|
+
const client = secrets_client(w, h.omap(), exchange_opts(h.ja(&.{Scripted.new(null, null).fn_val()}), vnull()));
|
|
821
|
+
const res = direct_probe(client);
|
|
822
|
+
try testing.expect(!(h.get_bool(res, "ok") orelse true));
|
|
823
|
+
try testing.expect(contains(h.get_str(res, "err") orelse "", "secrets: no refresh token"));
|
|
824
|
+
try testing.expect(w.calls.items.len == 0);
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
test "secrets exchange: a failing token endpoint surfaces the API refusal, not a spin" {
|
|
828
|
+
if (!present()) return error.SkipZigTest;
|
|
829
|
+
const w = Wire.new();
|
|
830
|
+
w.apistatus = &.{401};
|
|
831
|
+
w.tokenstatus = &.{ 200, 500 };
|
|
832
|
+
const client = secrets_client(w, h.omap(), exchange_opts(h.ja(&.{Scripted.new("REFRESH01", null).fn_val()}), vnull()));
|
|
833
|
+
const res = direct_probe(client);
|
|
834
|
+
try testing.expect(!(h.get_bool(res, "ok") orelse true));
|
|
835
|
+
try testing.expect(h.to_int(h.getp(res, "status")) == 401);
|
|
836
|
+
try testing.expect(h.get_str(res, "err") == null);
|
|
837
|
+
try testing.expect(w.api().len == 1);
|
|
838
|
+
try testing.expect(w.token_calls() == 2);
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
test "secrets exchange: auth null suppresses the credential, refusal or not" {
|
|
842
|
+
if (!present()) return error.SkipZigTest;
|
|
843
|
+
const w = Wire.new();
|
|
844
|
+
w.apistatus = &.{401};
|
|
845
|
+
const client = secrets_client(w, h.jo(&.{.{ "auth", h.vnull() }}), exchange_opts(h.ja(&.{Scripted.new("REFRESH01", null).fn_val()}), vnull()));
|
|
846
|
+
_ = direct_probe(client);
|
|
847
|
+
try testing.expect(w.api().len == 1);
|
|
848
|
+
try testing.expect(w.api()[0].auth == null);
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
test "secrets exchange: exchange off leaves the feature exactly as it was" {
|
|
852
|
+
if (!present()) return error.SkipZigTest;
|
|
853
|
+
const w = Wire.new();
|
|
854
|
+
const client = secrets_client(w, h.omap(), secrets_opts(h.ja(&.{Scripted.new("PLAINKEY01", null).fn_val()}), h.jo(&.{
|
|
855
|
+
.{ "exchange", h.jo(&.{.{ "active", h.vbool(false) }}) },
|
|
856
|
+
})));
|
|
857
|
+
_ = direct_probe(client);
|
|
858
|
+
try testing.expect(w.token_calls() == 0);
|
|
859
|
+
try credential_is(w.api()[0].auth, "PLAINKEY01");
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
test "secrets exchange: test mode buys nothing and needs no token endpoint" {
|
|
863
|
+
if (!present()) return error.SkipZigTest;
|
|
864
|
+
const w = Wire.new();
|
|
865
|
+
const opts = h.jo(&.{
|
|
866
|
+
.{ "system", h.jo(&.{.{ "fetch", w.fetch_fn() }}) },
|
|
867
|
+
.{ "feature", h.jo(&.{.{ "secrets", exchange_opts(h.ja(&.{Scripted.new("REFRESH01", null).fn_val()}), vnull()) }}) },
|
|
868
|
+
});
|
|
869
|
+
const client = sdk.test_sdk(vnull(), opts);
|
|
870
|
+
const sf = secrets_of(client) orelse return error.TestUnexpectedResult;
|
|
871
|
+
_ = direct_probe(client);
|
|
872
|
+
try testing.expectEqualStrings("test-access_token", sf.credential());
|
|
873
|
+
try testing.expect(w.calls.items.len == 0);
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
// THE BUNDLED TRANSPORT OF LAST RESORT. With no `system.fetch`, the exchange
|
|
877
|
+
// uses the vendored sekreto plugins' own HTTP client. A closed loopback port
|
|
878
|
+
// answers with sekreto's own reach error, which proves the path is wired
|
|
879
|
+
// and that its failure is fail-closed - no request reaches the API.
|
|
880
|
+
test "secrets exchange: without system.fetch the bundled HTTP transport buys the token" {
|
|
881
|
+
if (!present()) return error.SkipZigTest;
|
|
882
|
+
const opts = h.jo(&.{
|
|
883
|
+
.{ "base", h.vstr("http://127.0.0.1:9/api") },
|
|
884
|
+
.{ "feature", h.jo(&.{.{ "secrets", exchange_opts(h.ja(&.{Scripted.new("REFRESH01", null).fn_val()}), vnull()) }}) },
|
|
885
|
+
});
|
|
886
|
+
const client = sdk.SDK.new_with(opts, &.{sdk.SecretsFeature.make()});
|
|
887
|
+
const res = direct_probe(client);
|
|
888
|
+
try testing.expect(!(h.get_bool(res, "ok") orelse true));
|
|
889
|
+
const msg = h.get_str(res, "err") orelse "";
|
|
890
|
+
try testing.expect(contains(msg, "sekreto: cannot reach http://127.0.0.1:9/api/auth/token"));
|
|
891
|
+
}
|