@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,808 @@
|
|
|
1
|
+
// ProjectName SDK — behavioural tests for the secrets feature (vendored
|
|
2
|
+
// @voxgig/sekreto): the cpp port of tm/ts/test/feature/secrets/
|
|
3
|
+
// Secrets.test.ts, in the shape of tm/js/test/feature/secrets/Secrets.test.js
|
|
4
|
+
// and c's tests/feature/secrets/secrets_test.c.
|
|
5
|
+
//
|
|
6
|
+
// The contract under test: the `apikey` OPTION keeps its exact old meaning
|
|
7
|
+
// and always wins, because the feature places it FIRST in the provider chain
|
|
8
|
+
// (a `memory` store named `options`) - explicit-beats-lookup falls out of
|
|
9
|
+
// sekreto's first-hit rule rather than from special-case logic. With the
|
|
10
|
+
// feature inactive nothing changes at all. With it active and the option
|
|
11
|
+
// unset, the chain (a memory store, a custom provider, a vault) supplies the
|
|
12
|
+
// credential instead.
|
|
13
|
+
//
|
|
14
|
+
// This file lives in the test/feature/ container on purpose: `target add`
|
|
15
|
+
// trims it, along with the feature header and the vendored library, for a
|
|
16
|
+
// project whose model does not select `secrets`; the Makefile compiles it
|
|
17
|
+
// only when the feature is wired in (feature/secrets/kinds.cpp exists).
|
|
18
|
+
//
|
|
19
|
+
// THE CLIENT IS LIVE AND THE TRANSPORT IS THE THING COUNTED. Every wire
|
|
20
|
+
// assertion here runs against a real ProjectNameSDK whose
|
|
21
|
+
// `options.system.fetch` is the recorder below - never testSDK(), whose test
|
|
22
|
+
// feature REPLACES the fetcher with its own in-memory mock and would leave a
|
|
23
|
+
// system.fetch counter at zero for a healthy SDK carrying no secrets feature
|
|
24
|
+
// at all. An assertion that cannot fail pins no rule, so each fail-closed
|
|
25
|
+
// case carries a CONTROL leg: the same construction with a WORKING provider
|
|
26
|
+
// must reach the same recorder exactly once, carrying the credential. Only
|
|
27
|
+
// then does a zero from the broken provider mean REFUSED rather than
|
|
28
|
+
// UNWIRED. And the refusal is matched on the PROVIDER'S OWN message, so an
|
|
29
|
+
// unrelated failure (a blocked op, a missing route) cannot stand in for
|
|
30
|
+
// fail-closed.
|
|
31
|
+
//
|
|
32
|
+
// Both raw paths (direct, graphql) are driven, because they run no feature
|
|
33
|
+
// hooks at all and are guarded ONLY by the transport wrapper. The entity
|
|
34
|
+
// pipeline is driven through the feature harness (test/harness.hpp fhMake -
|
|
35
|
+
// the same miniature pipeline every other cpp feature test uses, since a
|
|
36
|
+
// template cannot name an entity), whose recorder is the Fetcher the wrapper
|
|
37
|
+
// wraps; that is also the direct-construction vehicle cpp has instead of
|
|
38
|
+
// `extend`.
|
|
39
|
+
//
|
|
40
|
+
// NO ENVIRONMENT VARIABLES, NO NETWORK: the ts/go suites' `env` chains
|
|
41
|
+
// become `memory` chains and `custom` providers here, and the provider that
|
|
42
|
+
// ERRORS is a `dotenv` pointed at a directory (readfile answers EISDIR, which
|
|
43
|
+
// sekreto reports as a FAILURE, never a MISS). The rule under test - the
|
|
44
|
+
// chain answers when the option does not, and a store that cannot answer
|
|
45
|
+
// fails the op - is identical either way.
|
|
46
|
+
|
|
47
|
+
#include "../../harness.hpp"
|
|
48
|
+
|
|
49
|
+
#include "../../../feature/secrets.hpp"
|
|
50
|
+
|
|
51
|
+
#include <cstdio>
|
|
52
|
+
#include <memory>
|
|
53
|
+
#include <string>
|
|
54
|
+
#include <vector>
|
|
55
|
+
|
|
56
|
+
using namespace sdk;
|
|
57
|
+
using namespace sdk::fh;
|
|
58
|
+
|
|
59
|
+
static int CASES = 0;
|
|
60
|
+
#define RUN(fn) \
|
|
61
|
+
do { \
|
|
62
|
+
CASES++; \
|
|
63
|
+
T_RUN(fn); \
|
|
64
|
+
} while (0)
|
|
65
|
+
|
|
66
|
+
// ---- the recording live transport ------------------------------------------
|
|
67
|
+
|
|
68
|
+
struct Rec {
|
|
69
|
+
std::vector<Value> calls; // every call, API and token endpoint alike
|
|
70
|
+
int api = 0; // API calls seen
|
|
71
|
+
int token = 0; // token-endpoint calls seen
|
|
72
|
+
std::vector<int> script; // status per API call index; missing/0 means 200
|
|
73
|
+
std::vector<std::string> tokens; // token per token call; missing means ACCESS0N
|
|
74
|
+
int tokenstatus = 0; // 0 means 200
|
|
75
|
+
std::string tokenpath = "/auth/token";
|
|
76
|
+
std::string tokenfield = "access_token";
|
|
77
|
+
|
|
78
|
+
Value fetch(const std::string& url, const Value& fetchdef) {
|
|
79
|
+
// SNAPSHOT the fetchdef: the exchange retry rewrites the authorization
|
|
80
|
+
// header of the same map in place (as go does), so a recorded reference
|
|
81
|
+
// would show every attempt carrying the LAST token.
|
|
82
|
+
calls.push_back(vmap({{"url", Value(url)}, {"fetchdef", Struct::clone(fetchdef)}}));
|
|
83
|
+
|
|
84
|
+
if (std::string::npos != url.find(tokenpath)) {
|
|
85
|
+
int n = ++token;
|
|
86
|
+
std::string tok = (n <= (int)tokens.size() && !tokens[n - 1].empty())
|
|
87
|
+
? tokens[n - 1] : "ACCESS0" + std::to_string(n);
|
|
88
|
+
int status = 0 == tokenstatus ? 200 : tokenstatus;
|
|
89
|
+
return fhResponse(status, vmap({{tokenfield, Value(tok)}}), Value::undef());
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
int n = ++api;
|
|
93
|
+
int status = (n <= (int)script.size() && 0 != script[n - 1]) ? script[n - 1] : 200;
|
|
94
|
+
return fhResponse(status, vmap({{"ok", Value(true)}, {"n", Value(n)}}), Value::undef());
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// The authorization header the i-th call left with ("" when none).
|
|
98
|
+
std::string auth(size_t i) const {
|
|
99
|
+
if (i >= calls.size()) return "";
|
|
100
|
+
Value fd = getp(calls[i], "fetchdef");
|
|
101
|
+
Value h = getp(fd, "headers");
|
|
102
|
+
Value a = getp(h, "authorization");
|
|
103
|
+
return a.is_string() ? a.as_string() : "";
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
bool hasAuth(size_t i) const {
|
|
107
|
+
if (i >= calls.size()) return false;
|
|
108
|
+
Value h = getp(getp(calls[i], "fetchdef"), "headers");
|
|
109
|
+
return h.is_map() && !mapget(h, "authorization").is_undef();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
std::string body(size_t i) const {
|
|
113
|
+
if (i >= calls.size()) return "";
|
|
114
|
+
Value b = getp(getp(calls[i], "fetchdef"), "body");
|
|
115
|
+
return b.is_string() ? b.as_string() : Struct::stringify(b);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
std::string url(size_t i) const {
|
|
119
|
+
if (i >= calls.size()) return "";
|
|
120
|
+
return as_str(getp(calls[i], "url"));
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
static Value recFetch(std::shared_ptr<Rec> rec) {
|
|
125
|
+
vs::Injector fn = [rec](vs::Injection&, const Value& args, const std::string&,
|
|
126
|
+
const Value&) -> Value {
|
|
127
|
+
Value url = vs::getelem(args, Value(int64_t(0)));
|
|
128
|
+
Value fetchdef = vs::getelem(args, Value(int64_t(1)));
|
|
129
|
+
return rec->fetch(url.is_string() ? url.as_string() : "", fetchdef);
|
|
130
|
+
};
|
|
131
|
+
return Value(fn);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// A LIVE client: the recorder is system.fetch, the secrets feature comes
|
|
135
|
+
// from the generated makeFeature("secrets") through the options - the only
|
|
136
|
+
// route that proves the model wiring. `extra` lands at the top level of the
|
|
137
|
+
// options (apikey, auth).
|
|
138
|
+
static std::shared_ptr<ProjectNameSDK> liveClient(std::shared_ptr<Rec> rec, const Value& fopts,
|
|
139
|
+
const Value& extra = Value::undef()) {
|
|
140
|
+
Value opts = vmap({
|
|
141
|
+
{"base", Value(std::string("http://api.test"))},
|
|
142
|
+
{"system", vmap({{"fetch", recFetch(rec)}})}});
|
|
143
|
+
if (fopts.is_map()) map_put(opts, "feature", vmap({{"secrets", fopts}}));
|
|
144
|
+
if (extra.is_map()) {
|
|
145
|
+
for (const auto& kv : *extra.as_map()) map_put(opts, kv.first, kv.second);
|
|
146
|
+
}
|
|
147
|
+
return std::make_shared<ProjectNameSDK>(opts);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
static Value memoryProvider(const std::string& key, const std::string& value) {
|
|
151
|
+
return vmap({{"kind", Value(std::string("memory"))},
|
|
152
|
+
{"values", vmap({{key, Value(value)}})}});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// A provider that ERRORS on lookup with no network: dotenv reading a
|
|
156
|
+
// DIRECTORY. readfile opens it fine and read(2) fails with EISDIR, which the
|
|
157
|
+
// port reports as Readstate::Failed - an ERROR, never a MISS.
|
|
158
|
+
static Value brokenProvider() {
|
|
159
|
+
return vmap({{"kind", Value(std::string("dotenv"))}, {"file", Value(std::string("/"))}});
|
|
160
|
+
}
|
|
161
|
+
static const char* BROKEN_MSG = "sekreto: dotenv provider cannot read /";
|
|
162
|
+
|
|
163
|
+
static Value secretsOpts(const Value& providers, const Value& more = Value::undef()) {
|
|
164
|
+
Value o = vmap({{"active", Value(true)}});
|
|
165
|
+
if (providers.is_list()) map_put(o, "providers", providers);
|
|
166
|
+
if (more.is_map()) {
|
|
167
|
+
for (const auto& kv : *more.as_map()) map_put(o, kv.first, kv.second);
|
|
168
|
+
}
|
|
169
|
+
return o;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// The header prepareAuth would build for this client and token: the model
|
|
173
|
+
// decides the prefix, so it is read off the live options rather than assumed.
|
|
174
|
+
static std::string expectAuth(SdkClient* client, const std::string& token) {
|
|
175
|
+
std::string prefix = as_str(Struct::getpath(client->options, {"auth", "prefix"}));
|
|
176
|
+
return prefix.empty() ? token : prefix + " " + token;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
static Value direct(std::shared_ptr<ProjectNameSDK> client) {
|
|
180
|
+
return client->direct(vmap({{"path", Value(std::string("/thing"))},
|
|
181
|
+
{"method", Value(std::string("GET"))}}));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
static bool okOf(const Value& res) { return is_true(getp(res, "ok")); }
|
|
185
|
+
static std::string errOf(const Value& res) { return as_str(getp(getp(res, "err"), "message")); }
|
|
186
|
+
static bool contains(const std::string& hay, const std::string& needle) {
|
|
187
|
+
return std::string::npos != hay.find(needle);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// A custom provider Injector over a small script: answers `values[i]` on the
|
|
191
|
+
// i-th call ("" -> MISS, "!msg" -> ERROR msg), the last entry repeating.
|
|
192
|
+
struct Script {
|
|
193
|
+
std::vector<std::string> values;
|
|
194
|
+
int calls = 0;
|
|
195
|
+
};
|
|
196
|
+
static Value scripted(std::shared_ptr<Script> s) {
|
|
197
|
+
vs::Injector fn = [s](vs::Injection&, const Value&, const std::string&, const Value&) -> Value {
|
|
198
|
+
int n = s->calls++;
|
|
199
|
+
if (s->values.empty()) return Value::undef();
|
|
200
|
+
const std::string& v = s->values[std::min<size_t>(n, s->values.size() - 1)];
|
|
201
|
+
if (v.empty()) return Value::undef();
|
|
202
|
+
if ('!' == v[0]) return vmap({{"__err__", Value(v.substr(1))}});
|
|
203
|
+
return Value(v);
|
|
204
|
+
};
|
|
205
|
+
return Value(fn);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// ---- inactive: nothing changes -----------------------------------------------
|
|
209
|
+
|
|
210
|
+
static void t_inactive_apikey_as_before() {
|
|
211
|
+
auto rec = std::make_shared<Rec>();
|
|
212
|
+
auto client = liveClient(rec, vmap({{"active", Value(false)}}),
|
|
213
|
+
vmap({{"apikey", Value(std::string("K1"))}}));
|
|
214
|
+
Value res = direct(client);
|
|
215
|
+
ASSERT_TRUE(okOf(res), "inactive: direct failed: " + errOf(res));
|
|
216
|
+
ASSERT_EQ(rec->api, 1, "inactive: one API call");
|
|
217
|
+
ASSERT_EQ(rec->auth(0), expectAuth(client.get(), "K1"), "inactive: apikey header as before");
|
|
218
|
+
ASSERT_TRUE(nullptr == SecretsFeature::of(client.get()) ||
|
|
219
|
+
!SecretsFeature::of(client.get())->getActive(),
|
|
220
|
+
"inactive: feature must not be active");
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
static void t_inactive_no_apikey_no_header() {
|
|
224
|
+
auto rec = std::make_shared<Rec>();
|
|
225
|
+
auto client = liveClient(rec, vmap({{"active", Value(false)}}));
|
|
226
|
+
Value res = direct(client);
|
|
227
|
+
ASSERT_TRUE(okOf(res), "inactive: direct failed: " + errOf(res));
|
|
228
|
+
ASSERT_EQ(rec->api, 1, "inactive: one API call");
|
|
229
|
+
ASSERT_FALSE(rec->hasAuth(0), "inactive: no apikey means no header");
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// ---- the apikey option keeps its meaning ------------------------------------
|
|
233
|
+
|
|
234
|
+
static void t_apikey_wins_over_chain() {
|
|
235
|
+
auto rec = std::make_shared<Rec>();
|
|
236
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "CHAINKEY")})),
|
|
237
|
+
vmap({{"apikey", Value(std::string("K1"))}}));
|
|
238
|
+
Value res = direct(client);
|
|
239
|
+
ASSERT_TRUE(okOf(res), "apikey wins: direct failed: " + errOf(res));
|
|
240
|
+
ASSERT_EQ(rec->api, 1, "apikey wins: one API call");
|
|
241
|
+
ASSERT_EQ(rec->auth(0), expectAuth(client.get(), "K1"), "apikey wins: the OPTION is on the wire");
|
|
242
|
+
auto f = SecretsFeature::of(client.get());
|
|
243
|
+
ASSERT_NOTNULL(f, "apikey wins: feature installed");
|
|
244
|
+
if (f) ASSERT_EQ(f->credential(), std::string("K1"), "apikey wins: resolved credential");
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
static void t_omitted_apikey_defers() {
|
|
248
|
+
auto rec = std::make_shared<Rec>();
|
|
249
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "CHAINKEY")})));
|
|
250
|
+
Value res = direct(client);
|
|
251
|
+
ASSERT_TRUE(okOf(res), "defers: direct failed: " + errOf(res));
|
|
252
|
+
ASSERT_EQ(rec->api, 1, "defers: one API call");
|
|
253
|
+
ASSERT_EQ(rec->auth(0), expectAuth(client.get(), "CHAINKEY"), "defers: the CHAIN is on the wire");
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
static void t_empty_apikey_defers() {
|
|
257
|
+
auto rec = std::make_shared<Rec>();
|
|
258
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "CHAINKEY")})),
|
|
259
|
+
vmap({{"apikey", Value(std::string(""))}}));
|
|
260
|
+
Value res = direct(client);
|
|
261
|
+
ASSERT_TRUE(okOf(res), "empty apikey: direct failed: " + errOf(res));
|
|
262
|
+
ASSERT_EQ(rec->auth(0), expectAuth(client.get(), "CHAINKEY"),
|
|
263
|
+
"empty apikey: an explicitly empty option defers to the chain");
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
static void t_auth_null_suppresses() {
|
|
267
|
+
auto rec = std::make_shared<Rec>();
|
|
268
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "CHAINKEY")})),
|
|
269
|
+
vmap({{"auth", Value(nullptr)}}));
|
|
270
|
+
Value res = direct(client);
|
|
271
|
+
ASSERT_TRUE(okOf(res), "auth null: direct failed: " + errOf(res));
|
|
272
|
+
ASSERT_EQ(rec->api, 1, "auth null: the op still proceeds");
|
|
273
|
+
ASSERT_FALSE(rec->hasAuth(0), "auth null: NO header even though the chain resolved");
|
|
274
|
+
auto f = SecretsFeature::of(client.get());
|
|
275
|
+
if (f) ASSERT_EQ(f->credential(), std::string("CHAINKEY"),
|
|
276
|
+
"auth null: the chain still resolved (suppression is at the header)");
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
static void t_custom_provider_verbatim() {
|
|
280
|
+
auto rec = std::make_shared<Rec>();
|
|
281
|
+
auto s = std::make_shared<Script>();
|
|
282
|
+
s->values = {"CUSTOMKEY"};
|
|
283
|
+
auto client = liveClient(rec, secretsOpts(vlist({scripted(s)})));
|
|
284
|
+
Value res = direct(client);
|
|
285
|
+
ASSERT_TRUE(okOf(res), "custom: direct failed: " + errOf(res));
|
|
286
|
+
ASSERT_EQ(rec->auth(0), expectAuth(client.get(), "CUSTOMKEY"), "custom: a bare callable is a provider");
|
|
287
|
+
|
|
288
|
+
// The map form, named, with a memory store behind it.
|
|
289
|
+
auto rec2 = std::make_shared<Rec>();
|
|
290
|
+
auto s2 = std::make_shared<Script>();
|
|
291
|
+
s2->values = {""}; // a MISS
|
|
292
|
+
auto client2 = liveClient(rec2, secretsOpts(vlist({
|
|
293
|
+
vmap({{"kind", Value(std::string("custom"))}, {"lookup", scripted(s2)},
|
|
294
|
+
{"name", Value(std::string("mine"))}}),
|
|
295
|
+
memoryProvider("APIKEY", "BEHIND")})));
|
|
296
|
+
Value res2 = direct(client2);
|
|
297
|
+
ASSERT_TRUE(okOf(res2), "custom miss: direct failed: " + errOf(res2));
|
|
298
|
+
ASSERT_EQ(rec2->auth(0), expectAuth(client2.get(), "BEHIND"),
|
|
299
|
+
"custom miss: a MISS falls through to the next store");
|
|
300
|
+
ASSERT_EQ(s2->calls, 1, "custom miss: the custom provider was asked");
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
static void t_miss_everywhere_no_header() {
|
|
304
|
+
auto rec = std::make_shared<Rec>();
|
|
305
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("OTHER", "X")})));
|
|
306
|
+
Value res = direct(client);
|
|
307
|
+
ASSERT_TRUE(okOf(res), "miss: direct failed: " + errOf(res));
|
|
308
|
+
ASSERT_EQ(rec->api, 1, "miss: the op proceeds");
|
|
309
|
+
ASSERT_FALSE(rec->hasAuth(0), "miss: a miss everywhere sends no header");
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// ---- fail-closed: a provider ERROR never degrades into an unauthenticated send
|
|
313
|
+
|
|
314
|
+
static void t_provider_error_fails_direct() {
|
|
315
|
+
auto rec = std::make_shared<Rec>();
|
|
316
|
+
auto client = liveClient(rec, secretsOpts(vlist({brokenProvider()})));
|
|
317
|
+
Value res = direct(client);
|
|
318
|
+
ASSERT_FALSE(okOf(res), "error: direct must FAIL");
|
|
319
|
+
ASSERT_TRUE(contains(errOf(res), BROKEN_MSG),
|
|
320
|
+
"error: the refusal carries the PROVIDER'S OWN message, got: " + errOf(res));
|
|
321
|
+
ASSERT_EQ(rec->api, 0, "error: NOTHING left the process");
|
|
322
|
+
|
|
323
|
+
// CONTROL: the same construction with a working store reaches the same
|
|
324
|
+
// recorder exactly once, carrying the credential.
|
|
325
|
+
auto crec = std::make_shared<Rec>();
|
|
326
|
+
auto cclient = liveClient(crec, secretsOpts(vlist({memoryProvider("APIKEY", "CHAINKEY")})));
|
|
327
|
+
Value cres = direct(cclient);
|
|
328
|
+
ASSERT_TRUE(okOf(cres), "error control: direct failed: " + errOf(cres));
|
|
329
|
+
ASSERT_EQ(crec->api, 1, "error control: exactly one call reached the transport");
|
|
330
|
+
ASSERT_EQ(crec->auth(0), expectAuth(cclient.get(), "CHAINKEY"), "error control: with the credential");
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
static void t_provider_error_fails_graphql() {
|
|
334
|
+
auto rec = std::make_shared<Rec>();
|
|
335
|
+
auto client = liveClient(rec, secretsOpts(vlist({brokenProvider()})));
|
|
336
|
+
Value res = client->graphql("query { thing { id } }");
|
|
337
|
+
ASSERT_FALSE(okOf(res), "error: graphql must FAIL");
|
|
338
|
+
ASSERT_TRUE(contains(errOf(res), BROKEN_MSG),
|
|
339
|
+
"error: graphql refusal carries the provider's message, got: " + errOf(res));
|
|
340
|
+
ASSERT_EQ(rec->api, 0, "error: graphql sent nothing");
|
|
341
|
+
|
|
342
|
+
auto crec = std::make_shared<Rec>();
|
|
343
|
+
auto cclient = liveClient(crec, secretsOpts(vlist({memoryProvider("APIKEY", "CHAINKEY")})));
|
|
344
|
+
Value cres = cclient->graphql("query { thing { id } }");
|
|
345
|
+
ASSERT_TRUE(okOf(cres), "error control: graphql failed: " + errOf(cres));
|
|
346
|
+
ASSERT_EQ(crec->api, 1, "error control: graphql reached the transport once");
|
|
347
|
+
ASSERT_EQ(crec->auth(0), expectAuth(cclient.get(), "CHAINKEY"), "error control: graphql credential");
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// The ENTITY pipeline, through the harness (direct construction - cpp's
|
|
351
|
+
// stand-in for `extend`): fhMake installs the recorder as the utility's
|
|
352
|
+
// fetcher, then init wraps it, so h->op crosses the wrapper.
|
|
353
|
+
static void t_provider_error_fails_entity_op() {
|
|
354
|
+
auto rec = std::make_shared<FhRecorder>();
|
|
355
|
+
auto server = [rec](CtxPtr ctx, const std::string& url, const Value& fd) {
|
|
356
|
+
return rec->fetch(ctx, url, fd);
|
|
357
|
+
};
|
|
358
|
+
auto h = fhMake(server, {fhF(std::make_shared<SecretsFeature>(),
|
|
359
|
+
fhMap({{"providers", vlist({brokenProvider()})}}))});
|
|
360
|
+
FhOpResult r = h->op(fhOp("load"));
|
|
361
|
+
ASSERT_FALSE(r.ok, "entity: the op must FAIL");
|
|
362
|
+
ASSERT_TRUE(r.err && contains(r.err->msg, BROKEN_MSG),
|
|
363
|
+
"entity: the refusal carries the provider's message, got: " +
|
|
364
|
+
(r.err ? r.err->msg : std::string("(none)")));
|
|
365
|
+
ASSERT_EQ(rec->calls.size(), (size_t)0, "entity: NOTHING left the pipeline");
|
|
366
|
+
|
|
367
|
+
auto crec = std::make_shared<FhRecorder>();
|
|
368
|
+
auto cserver = [crec](CtxPtr ctx, const std::string& url, const Value& fd) {
|
|
369
|
+
return crec->fetch(ctx, url, fd);
|
|
370
|
+
};
|
|
371
|
+
auto ch = fhMake(cserver, {fhF(std::make_shared<SecretsFeature>(),
|
|
372
|
+
fhMap({{"providers", vlist({memoryProvider("APIKEY", "CHAINKEY")})}}))});
|
|
373
|
+
FhOpResult cr = ch->op(fhOp("load"));
|
|
374
|
+
ASSERT_TRUE(cr.ok, "entity control: op failed: " + (cr.err ? cr.err->msg : std::string("")));
|
|
375
|
+
ASSERT_EQ(crec->calls.size(), (size_t)1, "entity control: exactly one call");
|
|
376
|
+
Value auth = getp(crec->headers(0), "authorization");
|
|
377
|
+
ASSERT_EQ(as_str(auth), expectAuth(ch->client.get(), "CHAINKEY"),
|
|
378
|
+
"entity control: the chain credential reached the header");
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
static void t_recovers_after_transient_failure() {
|
|
382
|
+
auto rec = std::make_shared<Rec>();
|
|
383
|
+
auto s = std::make_shared<Script>();
|
|
384
|
+
s->values = {"!sekreto: vault is down", "BACK"};
|
|
385
|
+
auto client = liveClient(rec, secretsOpts(vlist({scripted(s)})));
|
|
386
|
+
Value first = direct(client);
|
|
387
|
+
ASSERT_FALSE(okOf(first), "transient: the first request fails");
|
|
388
|
+
ASSERT_TRUE(contains(errOf(first), "sekreto: vault is down"), "transient: with the provider's message");
|
|
389
|
+
ASSERT_EQ(rec->api, 0, "transient: nothing sent while failed");
|
|
390
|
+
Value second = direct(client);
|
|
391
|
+
ASSERT_TRUE(okOf(second), "transient: a failure is never cached: " + errOf(second));
|
|
392
|
+
ASSERT_EQ(rec->api, 1, "transient: the second request went out");
|
|
393
|
+
ASSERT_EQ(rec->auth(0), expectAuth(client.get(), "BACK"), "transient: with the recovered credential");
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// ---- caching ---------------------------------------------------------------------
|
|
397
|
+
|
|
398
|
+
static void t_cache_false_asks_every_time() {
|
|
399
|
+
auto rec = std::make_shared<Rec>();
|
|
400
|
+
auto s = std::make_shared<Script>();
|
|
401
|
+
s->values = {"K"};
|
|
402
|
+
auto client = liveClient(rec, secretsOpts(vlist({scripted(s)}), vmap({{"cache", Value(false)}})));
|
|
403
|
+
direct(client); direct(client); direct(client);
|
|
404
|
+
ASSERT_EQ(rec->api, 3, "cache false: three calls");
|
|
405
|
+
ASSERT_EQ(s->calls, 3, "cache false: the chain is asked once per REQUEST");
|
|
406
|
+
|
|
407
|
+
auto rec2 = std::make_shared<Rec>();
|
|
408
|
+
auto s2 = std::make_shared<Script>();
|
|
409
|
+
s2->values = {"K"};
|
|
410
|
+
auto client2 = liveClient(rec2, secretsOpts(vlist({scripted(s2)})));
|
|
411
|
+
direct(client2); direct(client2); direct(client2);
|
|
412
|
+
ASSERT_EQ(rec2->api, 3, "cache true: three calls");
|
|
413
|
+
ASSERT_EQ(s2->calls, 1, "cache true (default): the chain is asked once");
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
static void t_cache_false_miss_retracts() {
|
|
417
|
+
auto rec = std::make_shared<Rec>();
|
|
418
|
+
auto s = std::make_shared<Script>();
|
|
419
|
+
s->values = {"K", ""}; // a hit, then revoked
|
|
420
|
+
auto client = liveClient(rec, secretsOpts(vlist({scripted(s)}), vmap({{"cache", Value(false)}})));
|
|
421
|
+
direct(client);
|
|
422
|
+
ASSERT_EQ(rec->auth(0), expectAuth(client.get(), "K"), "retract: first request carries the hit");
|
|
423
|
+
direct(client);
|
|
424
|
+
ASSERT_EQ(rec->api, 2, "retract: the second request still goes (a miss is not an error)");
|
|
425
|
+
ASSERT_FALSE(rec->hasAuth(1), "retract: an uncached MISS after a hit stops the old value going out");
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
static void t_secret_name_configurable() {
|
|
429
|
+
auto rec = std::make_shared<Rec>();
|
|
430
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("API_TOKEN", "T1")}),
|
|
431
|
+
vmap({{"name", Value(std::string("api.token"))}})));
|
|
432
|
+
Value res = direct(client);
|
|
433
|
+
ASSERT_TRUE(okOf(res), "name: direct failed: " + errOf(res));
|
|
434
|
+
ASSERT_EQ(rec->auth(0), expectAuth(client.get(), "T1"), "name: `api.token` reads API_TOKEN");
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
static void t_chain_is_live() {
|
|
438
|
+
auto rec = std::make_shared<Rec>();
|
|
439
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "CHAINKEY"),
|
|
440
|
+
memoryProvider("OTHER_SECRET", "SECRET02")})));
|
|
441
|
+
auto f = SecretsFeature::of(client.get());
|
|
442
|
+
ASSERT_NOTNULL(f, "live: feature installed");
|
|
443
|
+
if (!f) return;
|
|
444
|
+
ASSERT_TRUE(f->initError().empty(), "live: no init error: " + f->initError());
|
|
445
|
+
auto chain = f->chain();
|
|
446
|
+
ASSERT_NOTNULL(chain, "live: the chain is exposed");
|
|
447
|
+
if (!chain) return;
|
|
448
|
+
std::optional<std::string> other = chain->tryget("other.secret");
|
|
449
|
+
ASSERT_TRUE(other.has_value() && "SECRET02" == other.value(), "live: arbitrary secrets through the same chain");
|
|
450
|
+
// Only values of four characters or more are redacted (sekreto's rule).
|
|
451
|
+
ASSERT_EQ(chain->redact("token SECRET02 here"), std::string("token [redacted] here"), "live: redaction");
|
|
452
|
+
ASSERT_EQ(f->credential(), std::string(""), "live: nothing resolved before a request");
|
|
453
|
+
direct(client);
|
|
454
|
+
ASSERT_EQ(f->credential(), std::string("CHAINKEY"), "live: the credential after a request");
|
|
455
|
+
ASSERT_EQ(f->track().resolves, 1LL, "live: one resolution");
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// ---- construction failures refuse to send -------------------------------------
|
|
459
|
+
|
|
460
|
+
static void t_unknown_kind_refused() {
|
|
461
|
+
auto rec = std::make_shared<Rec>();
|
|
462
|
+
auto client = liveClient(rec, secretsOpts(vlist({
|
|
463
|
+
vmap({{"kind", Value(std::string("nosuchkind"))}})})));
|
|
464
|
+
auto f = SecretsFeature::of(client.get());
|
|
465
|
+
ASSERT_NOTNULL(f, "unknown kind: feature installed");
|
|
466
|
+
if (f) ASSERT_TRUE(contains(f->initError(), "sekreto: unknown provider kind: nosuchkind"),
|
|
467
|
+
"unknown kind: sekreto's own message, got: " + f->initError());
|
|
468
|
+
Value res = direct(client);
|
|
469
|
+
ASSERT_FALSE(okOf(res), "unknown kind: direct refused");
|
|
470
|
+
ASSERT_TRUE(contains(errOf(res), "sekreto: unknown provider kind: nosuchkind"),
|
|
471
|
+
"unknown kind: the refusal is sekreto's, got: " + errOf(res));
|
|
472
|
+
ASSERT_EQ(rec->api, 0, "unknown kind: NOTHING left the process (wrap-first)");
|
|
473
|
+
|
|
474
|
+
// A shipped PLUGIN kind this model did not select is refused with the
|
|
475
|
+
// hint that names the fix - checked against the vocabulary this SDK
|
|
476
|
+
// actually has, so the case holds whatever groups the model turned on.
|
|
477
|
+
std::vector<std::string> selected;
|
|
478
|
+
for (const auto& erased : featurePlugins("secrets")) {
|
|
479
|
+
selected.push_back(std::static_pointer_cast<plugin::Definition>(erased)->name);
|
|
480
|
+
}
|
|
481
|
+
std::string unselected;
|
|
482
|
+
for (const std::string& kind : sekreto::KINDS().plugin) {
|
|
483
|
+
if (selected.end() == std::find(selected.begin(), selected.end(), kind)) {
|
|
484
|
+
unselected = kind;
|
|
485
|
+
break;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
if (!unselected.empty()) {
|
|
489
|
+
auto rec2 = std::make_shared<Rec>();
|
|
490
|
+
auto client2 = liveClient(rec2, secretsOpts(vlist({
|
|
491
|
+
vmap({{"kind", Value(unselected)}, {"addr", Value(std::string("https://127.0.0.1:9"))},
|
|
492
|
+
{"token", Value(std::string("t"))}})})));
|
|
493
|
+
Value res2 = direct(client2);
|
|
494
|
+
ASSERT_FALSE(okOf(res2), "unselected plugin kind: refused");
|
|
495
|
+
ASSERT_TRUE(contains(errOf(res2), unselected + " is a sekreto plugin, not built in: pass it in the plugins option"),
|
|
496
|
+
"unselected plugin kind: the hint names the fix, got: " + errOf(res2));
|
|
497
|
+
ASSERT_EQ(rec2->api, 0, "unselected plugin kind: nothing sent");
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
static void t_malformed_entry_never_dropped() {
|
|
502
|
+
auto rec = std::make_shared<Rec>();
|
|
503
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "CHAINKEY"), Value(42)})));
|
|
504
|
+
Value res = direct(client);
|
|
505
|
+
ASSERT_FALSE(okOf(res), "malformed: a bad entry fails the chain, never shortens it");
|
|
506
|
+
ASSERT_TRUE(contains(errOf(res), "sekreto: not a provider or a provider spec: 42"),
|
|
507
|
+
"malformed: sekreto's own wording, got: " + errOf(res));
|
|
508
|
+
ASSERT_EQ(rec->api, 0, "malformed: nothing sent");
|
|
509
|
+
|
|
510
|
+
auto rec2 = std::make_shared<Rec>();
|
|
511
|
+
auto client2 = liveClient(rec2, secretsOpts(vlist({
|
|
512
|
+
vmap({{"kind", Value(std::string("custom"))}})})));
|
|
513
|
+
Value res2 = direct(client2);
|
|
514
|
+
ASSERT_FALSE(okOf(res2), "malformed custom: refused");
|
|
515
|
+
ASSERT_TRUE(contains(errOf(res2), "sekreto: not a provider or a provider spec:") &&
|
|
516
|
+
contains(errOf(res2), "needs a `lookup` callable"),
|
|
517
|
+
"malformed custom: says what is missing, got: " + errOf(res2));
|
|
518
|
+
ASSERT_EQ(rec2->api, 0, "malformed custom: nothing sent");
|
|
519
|
+
|
|
520
|
+
// CONTROL: the same chain without the bad entry sends once with the key.
|
|
521
|
+
auto crec = std::make_shared<Rec>();
|
|
522
|
+
auto cclient = liveClient(crec, secretsOpts(vlist({memoryProvider("APIKEY", "CHAINKEY")})));
|
|
523
|
+
Value cres = direct(cclient);
|
|
524
|
+
ASSERT_TRUE(okOf(cres), "malformed control: direct failed: " + errOf(cres));
|
|
525
|
+
ASSERT_EQ(crec->api, 1, "malformed control: exactly one call");
|
|
526
|
+
ASSERT_EQ(crec->auth(0), expectAuth(cclient.get(), "CHAINKEY"), "malformed control: credential");
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
static void t_selected_kinds_in_vocabulary() {
|
|
530
|
+
std::vector<std::shared_ptr<void>> defs = featurePlugins("secrets");
|
|
531
|
+
std::printf("secrets: %zu plugin definition(s) selected by the model\n", defs.size());
|
|
532
|
+
const std::vector<std::string>& shipped = sekreto::KINDS().plugin;
|
|
533
|
+
for (const auto& erased : defs) {
|
|
534
|
+
auto def = std::static_pointer_cast<plugin::Definition>(erased);
|
|
535
|
+
ASSERT_NOTNULL(def, "vocabulary: a definition is not null");
|
|
536
|
+
if (!def) continue;
|
|
537
|
+
ASSERT_TRUE(shipped.end() != std::find(shipped.begin(), shipped.end(), def->name),
|
|
538
|
+
"vocabulary: " + def->name + " is a kind sekreto ships");
|
|
539
|
+
// A chain naming a selected kind CONSTRUCTS (nothing is contacted until
|
|
540
|
+
// the first lookup), which is the whole point of passing it in.
|
|
541
|
+
if ("hashicorp" == def->name) {
|
|
542
|
+
auto rec = std::make_shared<Rec>();
|
|
543
|
+
auto client = liveClient(rec, secretsOpts(vlist({
|
|
544
|
+
vmap({{"kind", Value(std::string("hashicorp"))},
|
|
545
|
+
{"addr", Value(std::string("https://127.0.0.1:9"))},
|
|
546
|
+
{"token", Value(std::string("t"))}})})));
|
|
547
|
+
auto f = SecretsFeature::of(client.get());
|
|
548
|
+
ASSERT_TRUE(f && f->initError().empty(),
|
|
549
|
+
"vocabulary: a selected kind builds: " + (f ? f->initError() : std::string("(no feature)")));
|
|
550
|
+
// Its lookup fails to CONNECT (nothing listens on 127.0.0.1:9), and
|
|
551
|
+
// that ERROR must refuse the request: the vault kind is fail-closed
|
|
552
|
+
// through the same gate as everything else.
|
|
553
|
+
Value res = direct(client);
|
|
554
|
+
ASSERT_FALSE(okOf(res), "vocabulary: an unreachable vault refuses the request");
|
|
555
|
+
ASSERT_TRUE(contains(errOf(res), "sekreto"), "vocabulary: with sekreto's message: " + errOf(res));
|
|
556
|
+
ASSERT_EQ(rec->api, 0, "vocabulary: nothing sent past an unreachable vault");
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
ASSERT_TRUE(true, "vocabulary: read");
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
static void t_raw_paths_get_chain_credential() {
|
|
563
|
+
auto rec = std::make_shared<Rec>();
|
|
564
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "CHAINKEY")})));
|
|
565
|
+
Value d = direct(client);
|
|
566
|
+
ASSERT_TRUE(okOf(d), "raw: direct failed: " + errOf(d));
|
|
567
|
+
Value g = client->graphql("query { thing { id } }");
|
|
568
|
+
ASSERT_TRUE(okOf(g), "raw: graphql failed: " + errOf(g));
|
|
569
|
+
ASSERT_EQ(rec->api, 2, "raw: two calls");
|
|
570
|
+
ASSERT_EQ(rec->auth(0), expectAuth(client.get(), "CHAINKEY"), "raw: direct carries the chain credential");
|
|
571
|
+
ASSERT_EQ(rec->auth(1), expectAuth(client.get(), "CHAINKEY"), "raw: graphql carries the chain credential");
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// ---- the exchange ------------------------------------------------------------------
|
|
575
|
+
|
|
576
|
+
static Value exchangeOn(const Value& more = Value::undef()) {
|
|
577
|
+
Value x = vmap({{"active", Value(true)}});
|
|
578
|
+
if (more.is_map()) for (const auto& kv : *more.as_map()) map_put(x, kv.first, kv.second);
|
|
579
|
+
return x;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
static void t_exchange_buys_and_carries() {
|
|
583
|
+
auto rec = std::make_shared<Rec>();
|
|
584
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "REFRESH1")}),
|
|
585
|
+
vmap({{"exchange", exchangeOn()}})));
|
|
586
|
+
Value res = direct(client);
|
|
587
|
+
ASSERT_TRUE(okOf(res), "exchange: direct failed: " + errOf(res));
|
|
588
|
+
ASSERT_EQ(rec->token, 1, "exchange: one token purchase");
|
|
589
|
+
ASSERT_EQ(rec->api, 1, "exchange: one API call");
|
|
590
|
+
ASSERT_TRUE(contains(rec->url(0), "http://api.test/auth/token"), "exchange: endpoint relative to base: " + rec->url(0));
|
|
591
|
+
ASSERT_TRUE(contains(rec->body(0), "\"refresh_token\":\"REFRESH1\""), "exchange: marshalled body: " + rec->body(0));
|
|
592
|
+
ASSERT_EQ(rec->auth(1), expectAuth(client.get(), "ACCESS01"), "exchange: the ACCESS token is on the wire");
|
|
593
|
+
ASSERT_FALSE(contains(rec->auth(1), "REFRESH1"), "exchange: the refresh token never is");
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
static void t_exchange_explicit_refresh_wins() {
|
|
597
|
+
auto rec = std::make_shared<Rec>();
|
|
598
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "CHAINREFRESH")}),
|
|
599
|
+
vmap({{"exchange", exchangeOn(vmap({{"refresh", Value(std::string("R2"))}}))}})));
|
|
600
|
+
direct(client);
|
|
601
|
+
ASSERT_EQ(rec->token, 1, "explicit refresh: one purchase");
|
|
602
|
+
ASSERT_TRUE(contains(rec->body(0), "\"R2\""), "explicit refresh: exchange.refresh seats first: " + rec->body(0));
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
static void t_exchange_one_purchase_many_requests() {
|
|
606
|
+
auto rec = std::make_shared<Rec>();
|
|
607
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "REFRESH1")}),
|
|
608
|
+
vmap({{"exchange", exchangeOn()}})));
|
|
609
|
+
direct(client); direct(client); direct(client);
|
|
610
|
+
ASSERT_EQ(rec->token, 1, "many: one purchase serves many requests");
|
|
611
|
+
ASSERT_EQ(rec->api, 3, "many: three API calls");
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
static void t_exchange_401_rebuys_and_retries() {
|
|
615
|
+
auto rec = std::make_shared<Rec>();
|
|
616
|
+
rec->script = {401, 200};
|
|
617
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "REFRESH1")}),
|
|
618
|
+
vmap({{"exchange", exchangeOn()}})));
|
|
619
|
+
Value res = direct(client);
|
|
620
|
+
ASSERT_TRUE(okOf(res), "401: the retried request succeeded: " + errOf(res));
|
|
621
|
+
ASSERT_EQ(rec->token, 2, "401: bought again");
|
|
622
|
+
ASSERT_EQ(rec->api, 2, "401: retried once");
|
|
623
|
+
// calls: token, api(401), token, api(200)
|
|
624
|
+
ASSERT_EQ(rec->auth(1), expectAuth(client.get(), "ACCESS01"), "401: first attempt with the first token");
|
|
625
|
+
ASSERT_EQ(rec->auth(3), expectAuth(client.get(), "ACCESS02"), "401: the retry carries the NEW token");
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
static void t_exchange_retry_once_not_loop() {
|
|
629
|
+
auto rec = std::make_shared<Rec>();
|
|
630
|
+
rec->script = {401, 401, 401};
|
|
631
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "REFRESH1")}),
|
|
632
|
+
vmap({{"exchange", exchangeOn()}})));
|
|
633
|
+
Value res = direct(client);
|
|
634
|
+
ASSERT_FALSE(okOf(res), "loop: a second 401 is returned, not spun on");
|
|
635
|
+
ASSERT_EQ(rec->api, 2, "loop: exactly one retry (retries: 1)");
|
|
636
|
+
ASSERT_EQ(rec->token, 2, "loop: exactly two purchases");
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
static void t_exchange_other_status_not_expiry() {
|
|
640
|
+
auto rec = std::make_shared<Rec>();
|
|
641
|
+
rec->script = {403};
|
|
642
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "REFRESH1")}),
|
|
643
|
+
vmap({{"exchange", exchangeOn()}})));
|
|
644
|
+
direct(client);
|
|
645
|
+
ASSERT_EQ(rec->api, 1, "403: not an expiry, no retry");
|
|
646
|
+
ASSERT_EQ(rec->token, 1, "403: no second purchase");
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
static void t_exchange_statuses_configurable() {
|
|
650
|
+
auto rec = std::make_shared<Rec>();
|
|
651
|
+
rec->script = {403, 200};
|
|
652
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "REFRESH1")}),
|
|
653
|
+
vmap({{"exchange", exchangeOn(vmap({{"statuses", vlist({Value(403)})}}))}})));
|
|
654
|
+
Value res = direct(client);
|
|
655
|
+
ASSERT_TRUE(okOf(res), "statuses: retried on the configured status: " + errOf(res));
|
|
656
|
+
ASSERT_EQ(rec->api, 2, "statuses: one retry");
|
|
657
|
+
ASSERT_EQ(rec->token, 2, "statuses: two purchases");
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
static void t_exchange_fields_configurable() {
|
|
661
|
+
auto rec = std::make_shared<Rec>();
|
|
662
|
+
rec->tokenfield = "at";
|
|
663
|
+
rec->tokenpath = "/oauth/token";
|
|
664
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "REFRESH1")}),
|
|
665
|
+
vmap({{"exchange", exchangeOn(vmap({
|
|
666
|
+
{"path", Value(std::string("oauth/token"))},
|
|
667
|
+
{"request", Value(std::string("rt"))},
|
|
668
|
+
{"response", Value(std::string("at"))}}))}})));
|
|
669
|
+
Value res = direct(client);
|
|
670
|
+
ASSERT_TRUE(okOf(res), "fields: direct failed: " + errOf(res));
|
|
671
|
+
ASSERT_TRUE(contains(rec->url(0), "/oauth/token"), "fields: configured path");
|
|
672
|
+
ASSERT_TRUE(contains(rec->body(0), "\"rt\":\"REFRESH1\""), "fields: configured request field: " + rec->body(0));
|
|
673
|
+
ASSERT_EQ(rec->auth(1), expectAuth(client.get(), "ACCESS01"), "fields: configured response field read");
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
static void t_exchange_explicit_apikey_spent_first() {
|
|
677
|
+
auto rec = std::make_shared<Rec>();
|
|
678
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "REFRESH1")}),
|
|
679
|
+
vmap({{"exchange", exchangeOn()}})),
|
|
680
|
+
vmap({{"apikey", Value(std::string("OLDACCESS"))}}));
|
|
681
|
+
Value res = direct(client);
|
|
682
|
+
ASSERT_TRUE(okOf(res), "spent first: direct failed: " + errOf(res));
|
|
683
|
+
ASSERT_EQ(rec->token, 0, "spent first: a held access token is spent before any purchase");
|
|
684
|
+
ASSERT_EQ(rec->auth(0), expectAuth(client.get(), "OLDACCESS"), "spent first: the option is the starting token");
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
static void t_exchange_expired_apikey_falls_through() {
|
|
688
|
+
auto rec = std::make_shared<Rec>();
|
|
689
|
+
rec->script = {401, 200};
|
|
690
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "REFRESH1")}),
|
|
691
|
+
vmap({{"exchange", exchangeOn()}})),
|
|
692
|
+
vmap({{"apikey", Value(std::string("OLDACCESS"))}}));
|
|
693
|
+
Value res = direct(client);
|
|
694
|
+
ASSERT_TRUE(okOf(res), "expired: the retry succeeded: " + errOf(res));
|
|
695
|
+
ASSERT_EQ(rec->token, 1, "expired: one purchase after the refusal");
|
|
696
|
+
ASSERT_EQ(rec->api, 2, "expired: one retry");
|
|
697
|
+
ASSERT_EQ(rec->auth(2), expectAuth(client.get(), "ACCESS01"), "expired: the retry carries the bought token");
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
static void t_exchange_no_refresh_is_error() {
|
|
701
|
+
auto rec = std::make_shared<Rec>();
|
|
702
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("OTHER", "X")}),
|
|
703
|
+
vmap({{"exchange", exchangeOn()}})));
|
|
704
|
+
Value res = direct(client);
|
|
705
|
+
ASSERT_FALSE(okOf(res), "no refresh: refused");
|
|
706
|
+
ASSERT_TRUE(contains(errOf(res), "secrets: no refresh token"), "no refresh: says so: " + errOf(res));
|
|
707
|
+
ASSERT_EQ(rec->api, 0, "no refresh: nothing sent");
|
|
708
|
+
ASSERT_EQ(rec->token, 0, "no refresh: nothing bought");
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
static void t_exchange_failing_endpoint_surfaces_refusal() {
|
|
712
|
+
auto rec = std::make_shared<Rec>();
|
|
713
|
+
rec->script = {401};
|
|
714
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "REFRESH1")}),
|
|
715
|
+
vmap({{"exchange", exchangeOn()}})),
|
|
716
|
+
vmap({{"apikey", Value(std::string("OLDACCESS"))}}));
|
|
717
|
+
rec->tokenstatus = 500;
|
|
718
|
+
Value res = direct(client);
|
|
719
|
+
ASSERT_FALSE(okOf(res), "failing endpoint: the API's refusal is answered");
|
|
720
|
+
ASSERT_EQ(rec->api, 1, "failing endpoint: no retry without a token");
|
|
721
|
+
ASSERT_EQ(rec->token, 1, "failing endpoint: one attempted purchase");
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
static void t_exchange_auth_null_suppresses() {
|
|
725
|
+
auto rec = std::make_shared<Rec>();
|
|
726
|
+
rec->script = {401};
|
|
727
|
+
auto client = liveClient(rec, secretsOpts(vlist({memoryProvider("APIKEY", "REFRESH1")}),
|
|
728
|
+
vmap({{"exchange", exchangeOn()}})),
|
|
729
|
+
vmap({{"auth", Value(nullptr)}}));
|
|
730
|
+
Value res = direct(client);
|
|
731
|
+
ASSERT_FALSE(okOf(res), "auth null exchange: the 401 comes back");
|
|
732
|
+
ASSERT_EQ(rec->api, 1, "auth null exchange: no retry for a deliberately unauthenticated request");
|
|
733
|
+
ASSERT_FALSE(rec->hasAuth(rec->calls.size() - 1), "auth null exchange: no header");
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
// Test mode buys nothing: through the harness, whose client is testSDK().
|
|
737
|
+
static void t_exchange_test_mode_buys_nothing() {
|
|
738
|
+
auto rec = std::make_shared<FhRecorder>();
|
|
739
|
+
auto server = [rec](CtxPtr ctx, const std::string& url, const Value& fd) {
|
|
740
|
+
return rec->fetch(ctx, url, fd);
|
|
741
|
+
};
|
|
742
|
+
auto h = fhMake(server, {fhF(std::make_shared<SecretsFeature>(),
|
|
743
|
+
fhMap({{"providers", vlist({memoryProvider("APIKEY", "REFRESH1")})},
|
|
744
|
+
{"exchange", exchangeOn()}}))});
|
|
745
|
+
FhOpResult r = h->op(fhOp("load"));
|
|
746
|
+
ASSERT_TRUE(r.ok, "test mode: op failed: " + (r.err ? r.err->msg : std::string("")));
|
|
747
|
+
ASSERT_EQ(rec->calls.size(), (size_t)1, "test mode: exactly one call, and it is the API call");
|
|
748
|
+
Value auth = getp(rec->headers(0), "authorization");
|
|
749
|
+
ASSERT_EQ(as_str(auth), expectAuth(h->client.get(), "test-access_token"),
|
|
750
|
+
"test mode: the deterministic fake token");
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
// The entity pipeline through the harness carries the chain credential too
|
|
754
|
+
// (the happy path of t_provider_error_fails_entity_op).
|
|
755
|
+
static void t_entity_op_gets_chain_credential() {
|
|
756
|
+
auto rec = std::make_shared<FhRecorder>();
|
|
757
|
+
auto server = [rec](CtxPtr ctx, const std::string& url, const Value& fd) {
|
|
758
|
+
return rec->fetch(ctx, url, fd);
|
|
759
|
+
};
|
|
760
|
+
auto h = fhMake(server, {fhF(std::make_shared<SecretsFeature>(),
|
|
761
|
+
fhMap({{"providers", vlist({memoryProvider("APIKEY", "CHAINKEY")})}}))});
|
|
762
|
+
FhOpResult r = h->op(fhOp("list"));
|
|
763
|
+
ASSERT_TRUE(r.ok, "entity: op failed: " + (r.err ? r.err->msg : std::string("")));
|
|
764
|
+
ASSERT_EQ(rec->calls.size(), (size_t)1, "entity: one call");
|
|
765
|
+
ASSERT_EQ(as_str(getp(rec->headers(0), "authorization")), expectAuth(h->client.get(), "CHAINKEY"),
|
|
766
|
+
"entity: the chain credential on the entity path");
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
int main() {
|
|
770
|
+
RUN(t_inactive_apikey_as_before);
|
|
771
|
+
RUN(t_inactive_no_apikey_no_header);
|
|
772
|
+
RUN(t_apikey_wins_over_chain);
|
|
773
|
+
RUN(t_omitted_apikey_defers);
|
|
774
|
+
RUN(t_empty_apikey_defers);
|
|
775
|
+
RUN(t_auth_null_suppresses);
|
|
776
|
+
RUN(t_custom_provider_verbatim);
|
|
777
|
+
RUN(t_miss_everywhere_no_header);
|
|
778
|
+
RUN(t_provider_error_fails_direct);
|
|
779
|
+
RUN(t_provider_error_fails_graphql);
|
|
780
|
+
RUN(t_provider_error_fails_entity_op);
|
|
781
|
+
RUN(t_recovers_after_transient_failure);
|
|
782
|
+
RUN(t_cache_false_asks_every_time);
|
|
783
|
+
RUN(t_cache_false_miss_retracts);
|
|
784
|
+
RUN(t_secret_name_configurable);
|
|
785
|
+
RUN(t_chain_is_live);
|
|
786
|
+
RUN(t_unknown_kind_refused);
|
|
787
|
+
RUN(t_malformed_entry_never_dropped);
|
|
788
|
+
RUN(t_selected_kinds_in_vocabulary);
|
|
789
|
+
RUN(t_raw_paths_get_chain_credential);
|
|
790
|
+
RUN(t_entity_op_gets_chain_credential);
|
|
791
|
+
RUN(t_exchange_buys_and_carries);
|
|
792
|
+
RUN(t_exchange_explicit_refresh_wins);
|
|
793
|
+
RUN(t_exchange_one_purchase_many_requests);
|
|
794
|
+
RUN(t_exchange_401_rebuys_and_retries);
|
|
795
|
+
RUN(t_exchange_retry_once_not_loop);
|
|
796
|
+
RUN(t_exchange_other_status_not_expiry);
|
|
797
|
+
RUN(t_exchange_statuses_configurable);
|
|
798
|
+
RUN(t_exchange_fields_configurable);
|
|
799
|
+
RUN(t_exchange_explicit_apikey_spent_first);
|
|
800
|
+
RUN(t_exchange_expired_apikey_falls_through);
|
|
801
|
+
RUN(t_exchange_no_refresh_is_error);
|
|
802
|
+
RUN(t_exchange_failing_endpoint_surfaces_refusal);
|
|
803
|
+
RUN(t_exchange_auth_null_suppresses);
|
|
804
|
+
RUN(t_exchange_test_mode_buys_nothing);
|
|
805
|
+
|
|
806
|
+
std::printf("secrets: ran %d case(s)\n", CASES);
|
|
807
|
+
return sdktest::summary("secrets_test");
|
|
808
|
+
}
|