@voxgig/sdkgen 4.9.0 → 4.11.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/helpers/manifest.d.ts +2 -1
- package/dist/helpers/manifest.js +75 -1
- package/dist/helpers/manifest.js.map +1 -1
- package/dist/helpers/modelNames.d.ts +7 -0
- package/dist/helpers/modelNames.js +232 -0
- package/dist/helpers/modelNames.js.map +1 -0
- package/dist/helpers/naming.d.ts +2 -1
- package/dist/helpers/naming.js +45 -1
- package/dist/helpers/naming.js.map +1 -1
- package/dist/sdkgen.d.ts +3 -2
- package/dist/sdkgen.js +12 -3
- package/dist/sdkgen.js.map +1 -1
- package/dist/testkit.d.ts +2 -0
- package/dist/testkit.js +80 -24
- package/dist/testkit.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utility.js +17 -7
- package/dist/utility.js.map +1 -1
- package/package.json +1 -1
- package/project/.sdk/model/feature/secrets.aon +1001 -0
- package/project/.sdk/model/target/c.aon +15 -2
- package/project/.sdk/model/target/clojure.aon +10 -0
- package/project/.sdk/model/target/cpp.aon +18 -0
- package/project/.sdk/model/target/csharp.aon +5 -0
- package/project/.sdk/model/target/elixir.aon +6 -0
- package/project/.sdk/model/target/java.aon +5 -0
- package/project/.sdk/model/target/js.aon +5 -0
- package/project/.sdk/model/target/kotlin.aon +7 -0
- package/project/.sdk/model/target/lua.aon +17 -0
- package/project/.sdk/model/target/ocaml.aon +48 -5
- package/project/.sdk/model/target/perl.aon +5 -0
- package/project/.sdk/model/target/php.aon +5 -0
- package/project/.sdk/model/target/rb.aon +5 -0
- package/project/.sdk/model/target/rust.aon +5 -0
- package/project/.sdk/model/target/scala.aon +38 -2
- package/project/.sdk/model/target/swift.aon +10 -0
- 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/clojure/Config_clojure.ts +51 -4
- package/project/.sdk/src/cmp/clojure/Main_clojure.ts +43 -1
- package/project/.sdk/src/cmp/clojure/Package_clojure.ts +17 -1
- package/project/.sdk/src/cmp/clojure/featureextra_clojure.ts +130 -0
- 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/csharp/Config_csharp.ts +70 -0
- package/project/.sdk/src/cmp/csharp/Main_csharp.ts +9 -1
- package/project/.sdk/src/cmp/csharp/Package_csharp.ts +25 -1
- package/project/.sdk/src/cmp/elixir/Config_elixir.ts +68 -2
- package/project/.sdk/src/cmp/elixir/Main_elixir.ts +16 -0
- package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +14 -1
- package/project/.sdk/src/cmp/java/Config_java.ts +84 -2
- package/project/.sdk/src/cmp/java/Main_java.ts +10 -1
- package/project/.sdk/src/cmp/js/Config_js.ts +75 -8
- package/project/.sdk/src/cmp/js/Main_js.ts +66 -2
- package/project/.sdk/src/cmp/js/fragment/Config.data.fragment.js +18 -1
- package/project/.sdk/src/cmp/js/fragment/Config.fragment.js +18 -1
- package/project/.sdk/src/cmp/js/fragment/Main.fragment.js +7 -0
- package/project/.sdk/src/cmp/kotlin/Config_kotlin.ts +63 -1
- package/project/.sdk/src/cmp/kotlin/Main_kotlin.ts +32 -2
- 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/perl/Config_perl.ts +129 -3
- package/project/.sdk/src/cmp/perl/Main_perl.ts +41 -1
- package/project/.sdk/src/cmp/perl/Package_perl.ts +13 -1
- package/project/.sdk/src/cmp/perl/fragment/Main.fragment.pm +1 -0
- package/project/.sdk/src/cmp/php/Config_php.ts +105 -1
- package/project/.sdk/src/cmp/php/Gitignore_php.ts +4 -2
- package/project/.sdk/src/cmp/php/Main_php.ts +16 -1
- package/project/.sdk/src/cmp/rb/Config_rb.ts +92 -2
- package/project/.sdk/src/cmp/rb/EntityTypes_rb.ts +11 -1
- package/project/.sdk/src/cmp/rb/Main_rb.ts +7 -1
- package/project/.sdk/src/cmp/rust/Main_rust.ts +99 -1
- package/project/.sdk/src/cmp/rust/Package_rust.ts +72 -6
- package/project/.sdk/src/cmp/scala/Config_scala.ts +44 -0
- package/project/.sdk/src/cmp/scala/Main_scala.ts +68 -1
- package/project/.sdk/src/cmp/swift/Config_swift.ts +62 -1
- package/project/.sdk/src/cmp/swift/Main_swift.ts +35 -1
- package/project/.sdk/src/cmp/swift/Package_swift.ts +81 -11
- package/project/.sdk/src/cmp/swift/fragment/Main.fragment.swift +58 -44
- package/project/.sdk/src/cmp/swift/utility_swift.ts +22 -0
- 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/tests/feature/secrets/secrets_test.c +802 -0
- package/project/.sdk/tm/c/tests/vendor/omni/json.c +2 -2
- package/project/.sdk/tm/c/tests/vendor/omni/omni.h +2 -2
- package/project/.sdk/tm/c/tests/vendor/omni/runner.c +2 -2
- package/project/.sdk/tm/c/tests/vendor/omni/util.c +2 -2
- package/project/.sdk/tm/clojure/Makefile +3 -0
- package/project/.sdk/tm/clojure/feature/secrets/sdk/feature/secrets.clj +530 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/capability.clj +84 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/catalog.clj +44 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/config.clj +240 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/depend.clj +199 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/env.clj +111 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/export.clj +46 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/graph.clj +122 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/host.clj +1018 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/json.clj +106 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/order.clj +157 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/point.clj +77 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/ref.clj +92 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/resolve.clj +46 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/types.clj +177 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/version.clj +90 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin.clj +40 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/addr.clj +111 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/chain.clj +297 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/core.clj +192 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/json.clj +261 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/aws.clj +165 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/azuresecrets.clj +111 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/boru.clj +107 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/doppler.clj +61 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/gcpsecrets.clj +88 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/hashicorp.clj +115 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/httpjson.clj +214 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/infisical.clj +80 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/onepassword.clj +93 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/proc.clj +63 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/secretspec.clj +99 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/sigv4.clj +142 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/provider.clj +25 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/providers.clj +196 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto.clj +113 -0
- package/project/.sdk/tm/clojure/src/sdk/core.clj +9 -0
- package/project/.sdk/tm/clojure/src/sdk/features.clj +13 -1
- package/project/.sdk/tm/clojure/test/sdk/test/feature/secrets.clj +581 -0
- package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +103 -14
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +2 -2
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +2 -2
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +2 -2
- 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/test/feature/secrets/secrets_test.cpp +808 -0
- package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +2 -2
- package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +2 -2
- package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +2 -2
- package/project/.sdk/tm/csharp/feature/SecretsFeature.cs +915 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Capability.cs +196 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Catalog.cs +70 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Config.cs +505 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Definition.cs +52 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Depend.cs +285 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Entry.cs +55 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Env.cs +228 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Export.cs +102 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Graph.cs +256 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Host.cs +1379 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Inst.cs +177 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Json.cs +326 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Order.cs +295 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Plugin.cs +113 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Point.cs +177 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Refs.cs +198 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Resolve.cs +95 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Types.cs +351 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Version.cs +196 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Aws.cs +325 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/AzureSecrets.cs +195 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Boru.cs +192 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Child.cs +75 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Doppler.cs +112 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/GcpSecrets.cs +167 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Hashicorp.cs +221 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/HttpJson.cs +213 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Infisical.cs +155 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/OnePassword.cs +169 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/SecretSpec.cs +172 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Sigv4.cs +240 -0
- package/project/.sdk/tm/csharp/feature/secrets/sekreto/Json.cs +192 -0
- package/project/.sdk/tm/csharp/feature/secrets/sekreto/Providers.cs +503 -0
- package/project/.sdk/tm/csharp/feature/secrets/sekreto/Sekreto.cs +775 -0
- package/project/.sdk/tm/csharp/test/feature/secrets/SecretsFeatureTest.cs +1787 -0
- package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +2 -2
- package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +2 -2
- package/project/.sdk/tm/csharp/utility/MakeOptions.cs +10 -0
- package/project/.sdk/tm/csharp/utility/struct/Struct.cs +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/capability.ex +118 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/catalog.ex +56 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/config.ex +320 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/depend.ex +205 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/env.ex +166 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/error.ex +13 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/export.ex +73 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/graph.ex +185 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/host.ex +1182 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/inst.ex +139 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/json.ex +132 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/order.ex +179 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/point.ex +99 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/ref.ex +129 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/resolve.ex +59 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/types.ex +190 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/version.ex +136 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/voxgig_plugin.ex +42 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/json.ex +368 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/aws.ex +257 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/azuresecrets.ex +160 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/boru.ex +127 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/doppler.ex +96 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/gcpsecrets.ex +124 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/hashicorp.ex +162 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/http.ex +627 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/httpjson.ex +134 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/infisical.ex +125 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/onepassword.ex +152 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/proc.ex +80 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/secretspec.ex +101 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/sigv4.ex +176 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/provider.ex +67 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/providers.ex +536 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/sekreto.ex +662 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets.ex +839 -0
- package/project/.sdk/tm/elixir/test/feature/secrets/secrets_test.exs +1113 -0
- package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +2 -2
- package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +2 -2
- package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +2 -2
- 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 +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +2 -2
- package/project/.sdk/tm/go/feature/secrets_feature.go +48 -10
- package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +239 -0
- package/project/.sdk/tm/go/test/omni/omni.go +2 -2
- package/project/.sdk/tm/go/test/omni/util.go +2 -2
- package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +1 -1
- package/project/.sdk/tm/java/feature/SecretsFeature.java +791 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Capability.java +181 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Catalog.java +64 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Config.java +433 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Definition.java +54 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Depend.java +292 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Entry.java +49 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Env.java +204 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Export.java +93 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Graph.java +244 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Host.java +1196 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Inst.java +173 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Json.java +339 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Order.java +274 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Plugin.java +94 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/PluginException.java +37 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Point.java +172 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Refs.java +171 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Resolve.java +89 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Types.java +232 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Version.java +198 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Addr.java +142 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Builtins.java +229 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Json.java +302 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Provider.java +21 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Sekreto.java +698 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Support.java +100 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Aws.java +294 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Azuresecrets.java +164 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Boru.java +161 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Doppler.java +103 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Gcpsecrets.java +143 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Hashicorp.java +186 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Httpjson.java +192 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Infisical.java +139 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Onepassword.java +143 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Proc.java +80 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Secretspec.java +138 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Sigv4.java +243 -0
- package/project/.sdk/tm/java/test/feature/secrets/SecretsFeatureTest.java +1050 -0
- package/project/.sdk/tm/java/test/vendor/omni/Json.java +2 -2
- package/project/.sdk/tm/java/test/vendor/omni/Runner.java +2 -2
- package/project/.sdk/tm/java/test/vendor/omni/Util.java +2 -2
- package/project/.sdk/tm/java/utility/MakeOptions.java +7 -0
- package/project/.sdk/tm/java/utility/struct/Struct.java +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/SecretsFeature.js +454 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/capability.js +119 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/catalog.js +42 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/config.js +323 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/depend.js +196 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/env.js +120 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/export.js +48 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/graph.js +150 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/host.js +949 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/index.js +35 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/order.js +165 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/point.js +94 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/ref.js +106 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/resolve.js +59 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/types.js +79 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/version.js +100 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/Sekreto.js +574 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/index.js +56 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/aws.js +188 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/azuresecrets.js +135 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/boru.js +128 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/doppler.js +67 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/gcpsecrets.js +115 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/hashicorp.js +139 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/httpjson.js +93 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/infisical.js +99 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/onepassword.js +111 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/secretspec.js +105 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/sigv4.js +157 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/addr.js +119 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/builtin.js +39 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/dotenv.js +40 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/env.js +21 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/file.js +42 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/memory.js +18 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/support.js +151 -0
- package/project/.sdk/tm/js/src/utility/StructUtility.js +1 -1
- package/project/.sdk/tm/js/test/feature/secrets/Secrets.test.js +1019 -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 +684 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Capability.kt +117 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Catalog.kt +40 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Config.kt +322 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Depend.kt +227 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Env.kt +163 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Export.kt +57 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Graph.kt +179 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Host.kt +1131 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Json.kt +241 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Order.kt +180 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Plugin.kt +64 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Point.kt +124 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Refs.kt +125 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Resolve.kt +66 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Types.kt +171 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Version.kt +132 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Json.kt +359 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Provider.kt +21 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Providers.kt +308 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Sekreto.kt +525 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Spec.kt +126 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Support.kt +205 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Aws.kt +251 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Azuresecrets.kt +145 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Boru.kt +130 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Doppler.kt +77 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Gcpsecrets.kt +119 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Hashicorp.kt +156 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Httpjson.kt +219 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Infisical.kt +114 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Onepassword.kt +114 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Secretspec.kt +118 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Sigv4.kt +220 -0
- package/project/.sdk/tm/kotlin/test/feature/secrets/SecretsTest.kt +1217 -0
- package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +2 -2
- package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +2 -2
- package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +2 -2
- 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/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 +2 -2
- package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +2 -2
- package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +2 -2
- package/project/.sdk/tm/lua/test/vendor/omni/util.lua +2 -2
- 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/test/feature/secrets/t_secrets.ml +670 -0
- package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +2 -2
- package/project/.sdk/tm/perl/Makefile +6 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Capability.pm +141 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Catalog.pm +65 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Config.pm +346 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Depend.pm +216 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Env.pm +176 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Export.pm +59 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Graph.pm +157 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Host.pm +1139 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Order.pm +187 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Point.pm +100 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Ref.pm +119 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Resolve.pm +71 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Types.pm +251 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Version.pm +122 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin.pm +70 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Aws.pm +263 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Azuresecrets.pm +159 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Boru.pm +180 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Doppler.pm +92 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Gcpsecrets.pm +138 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Hashicorp.pm +213 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Httpjson.pm +173 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Infisical.pm +132 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Onepassword.pm +132 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Proc.pm +102 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Secretspec.pm +132 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Sigv4.pm +190 -0
- package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Addr.pm +124 -0
- package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Providers.pm +301 -0
- package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto.pm +605 -0
- package/project/.sdk/tm/perl/feature/secrets_feature.pm +696 -0
- package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +1 -1
- package/project/.sdk/tm/perl/t/feature/secrets/secrets.t +1004 -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 +694 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Capability.php +226 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Catalog.php +75 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Config.php +444 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Depend.php +262 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Env.php +202 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Export.php +74 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Graph.php +195 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Host.php +1514 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Order.php +260 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Point.php +129 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Ref.php +169 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Resolve.php +79 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Types.php +348 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Version.php +163 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/plugin.php +40 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/aws.php +274 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/azuresecrets.php +170 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/boru.php +163 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/doppler.php +106 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/gcpsecrets.php +144 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/hashicorp.php +194 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/httpjson.php +113 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/infisical.php +131 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/onepassword.php +150 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/runcmd.php +101 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/secretspec.php +146 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/sigv4.php +161 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/src/Addr.php +129 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/src/Providers.php +322 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/src/Sekreto.php +724 -0
- package/project/.sdk/tm/php/test/feature/secrets/SecretsTest.php +1165 -0
- package/project/.sdk/tm/php/test/vendor/omni/Runner.php +2 -2
- package/project/.sdk/tm/php/test/vendor/omni/Util.php +2 -2
- 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 +2 -2
- 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/Makefile +7 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/capability.rb +118 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/catalog.rb +55 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/config.rb +315 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/depend.rb +197 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/env.rb +143 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/export.rb +52 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/graph.rb +147 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/host.rb +1079 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/order.rb +169 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/point.rb +93 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/ref.rb +112 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/resolve.rb +56 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/types.rb +99 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/version.rb +106 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin.rb +24 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/addr.rb +111 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/aws.rb +200 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/azuresecrets.rb +130 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/boru.rb +121 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/doppler.rb +66 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.rb +107 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/hashicorp.rb +137 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/httpjson.rb +136 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/infisical.rb +97 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/onepassword.rb +104 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/secretspec.rb +113 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/sigv4.rb +127 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/providers.rb +210 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/sekreto.rb +465 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto.rb +30 -0
- package/project/.sdk/tm/rb/feature/secrets_feature.rb +583 -0
- package/project/.sdk/tm/rb/test/feature/secrets/secrets_feature_test.rb +935 -0
- package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +2 -2
- package/project/.sdk/tm/rb/test/vendor/omni/util.rb +2 -2
- package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/capability.rs +130 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/catalog.rs +114 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/config.rs +416 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/depend.rs +245 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/env.rs +200 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/export.rs +90 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/graph.rs +231 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/host.rs +1565 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/mod.rs +18 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/order.rs +226 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/point.rs +137 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/refs.rs +148 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/resolve.rs +83 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/types.rs +132 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/value.rs +433 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/version.rs +174 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/aws/crypto.rs +146 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/aws/sigv4.rs +230 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/aws.rs +328 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/azuresecrets.rs +184 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/boru.rs +172 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/doppler.rs +102 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/gcpsecrets.rs +153 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/hashicorp.rs +228 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/http.rs +537 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/json.rs +300 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson.rs +137 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/infisical.rs +148 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/onepassword.rs +165 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/secretspec.rs +150 -0
- package/project/.sdk/tm/rust/feature/secrets/sekreto/addr.rs +144 -0
- package/project/.sdk/tm/rust/feature/secrets/sekreto/mod.rs +51 -0
- package/project/.sdk/tm/rust/feature/secrets/sekreto/providers.rs +637 -0
- package/project/.sdk/tm/rust/feature/secrets/sekreto/sekreto.rs +677 -0
- package/project/.sdk/tm/rust/feature/secrets.rs +984 -0
- package/project/.sdk/tm/rust/tests/feature/secrets/main.rs +1605 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +2 -2
- package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +2 -2
- package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +2 -2
- package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +2 -2
- package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +2 -2
- package/project/.sdk/tm/scala/Makefile +8 -3
- package/project/.sdk/tm/scala/feature/SecretsFeature.scala +578 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Capability.scala +96 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Config.scala +270 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Depend.scala +216 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Env.scala +144 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Export.scala +59 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Graph.scala +149 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Host.scala +1089 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Json.scala +156 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Order.scala +169 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Plugin.scala +47 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Point.scala +107 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Refs.scala +131 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Resolve.scala +53 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Types.scala +110 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Value.scala +157 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Version.scala +136 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Json.scala +302 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Provider.scala +20 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Providers.scala +281 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Sekreto.scala +473 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Spec.scala +123 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Support.scala +216 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Aws.scala +225 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Azuresecrets.scala +124 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Boru.scala +104 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Doppler.scala +68 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Gcpsecrets.scala +97 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Hashicorp.scala +131 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Httpjson.scala +209 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Infisical.scala +98 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Onepassword.scala +90 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Secretspec.scala +95 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Sigv4.scala +214 -0
- package/project/.sdk/tm/scala/sdktest/feature/secrets/SecretsTestMain.scala +1042 -0
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +2 -2
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +2 -2
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +2 -2
- package/project/.sdk/tm/scala/utility/Make.scala +7 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/SecretsFeature.swift +669 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Capability.swift +98 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Catalog.swift +87 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Config.swift +298 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Depend.swift +209 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Env.swift +191 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Export.swift +63 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Graph.swift +158 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Host.swift +1141 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Json.swift +192 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Order.swift +183 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Point.swift +130 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Refs.swift +141 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Resolve.swift +59 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Types.swift +125 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Value.swift +198 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Version.swift +139 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Aws.swift +271 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Azuresecrets.swift +173 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Boru.swift +139 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Crypto.swift +198 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Doppler.swift +86 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Gcpsecrets.swift +129 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Hashicorp.swift +175 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Httpjson.swift +310 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Infisical.swift +140 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Onepassword.swift +118 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Proc.swift +105 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Secretspec.swift +111 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Sigv4.swift +297 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Addr.swift +120 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Json.swift +452 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Provider.swift +25 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Providers.swift +689 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Sekreto.swift +755 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/MakeOptions.swift +9 -0
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +30 -0
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/feature/secrets/SecretsFeatureTest.swift +1030 -0
- package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +2 -2
- package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +2 -2
- package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +2 -2
- 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/utility/StructUtility.ts +1 -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/test/feature/secrets/secrets_test.zig +891 -0
- package/project/.sdk/tm/zig/test/vendor/omni/omni.zig +2 -2
- package/project/.sdk/tm/zig/test/vendor/omni/regex.zig +2 -2
- package/project/.sdk/tm/zig/utility/voxgigstruct/regex.zig +2 -2
- package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +2 -2
- package/project/sdkgen-package.json +1 -4
- package/src/helpers/manifest.ts +81 -1
- package/src/helpers/modelNames.ts +284 -0
- package/src/helpers/naming.ts +45 -1
- package/src/sdkgen.ts +11 -1
- package/src/testkit.ts +115 -26
- package/src/utility.ts +17 -7
- package/project/.sdk/model/target/dart.aon +0 -58
- package/project/.sdk/model/target/lean.aon +0 -91
- package/project/.sdk/model/target/seneca-provider.aon +0 -120
- package/project/.sdk/src/cmp/dart/Config_dart.ts +0 -176
- package/project/.sdk/src/cmp/dart/EntityBase_dart.ts +0 -34
- package/project/.sdk/src/cmp/dart/EntityOperation_dart.ts +0 -43
- package/project/.sdk/src/cmp/dart/EntityTypes_dart.ts +0 -207
- package/project/.sdk/src/cmp/dart/Entity_dart.ts +0 -87
- package/project/.sdk/src/cmp/dart/Gitignore_dart.ts +0 -34
- package/project/.sdk/src/cmp/dart/MainEntity_dart.ts +0 -33
- package/project/.sdk/src/cmp/dart/Main_dart.ts +0 -106
- package/project/.sdk/src/cmp/dart/Package_dart.ts +0 -82
- package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +0 -177
- package/project/.sdk/src/cmp/dart/ReadmeExamplesTest_dart.ts +0 -238
- package/project/.sdk/src/cmp/dart/ReadmeExplanation_dart.ts +0 -53
- package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +0 -152
- package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +0 -59
- package/project/.sdk/src/cmp/dart/ReadmeIntro_dart.ts +0 -65
- package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +0 -151
- package/project/.sdk/src/cmp/dart/ReadmeOptions_dart.ts +0 -63
- package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +0 -225
- package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +0 -397
- package/project/.sdk/src/cmp/dart/ReadmeTopHowto_dart.ts +0 -24
- package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +0 -106
- package/project/.sdk/src/cmp/dart/ReadmeTopTest_dart.ts +0 -78
- package/project/.sdk/src/cmp/dart/SdkError_dart.ts +0 -42
- package/project/.sdk/src/cmp/dart/TestDirect_dart.ts +0 -516
- package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +0 -628
- package/project/.sdk/src/cmp/dart/Test_dart.ts +0 -116
- package/project/.sdk/src/cmp/dart/fragment/Config.data.fragment.dart +0 -79
- package/project/.sdk/src/cmp/dart/fragment/Config.fragment.dart +0 -51
- package/project/.sdk/src/cmp/dart/fragment/Direct.test.fragment.dart +0 -25
- package/project/.sdk/src/cmp/dart/fragment/Entity.fragment.dart +0 -29
- package/project/.sdk/src/cmp/dart/fragment/Entity.test.fragment.dart +0 -28
- package/project/.sdk/src/cmp/dart/fragment/EntityBase.fragment.dart +0 -302
- package/project/.sdk/src/cmp/dart/fragment/EntityCreateOp.fragment.dart +0 -98
- package/project/.sdk/src/cmp/dart/fragment/EntityListOp.fragment.dart +0 -90
- package/project/.sdk/src/cmp/dart/fragment/EntityLoadOp.fragment.dart +0 -102
- package/project/.sdk/src/cmp/dart/fragment/EntityRemoveOp.fragment.dart +0 -108
- package/project/.sdk/src/cmp/dart/fragment/EntityUpdateOp.fragment.dart +0 -102
- package/project/.sdk/src/cmp/dart/fragment/Main.fragment.dart +0 -338
- package/project/.sdk/src/cmp/dart/fragment/SdkError.fragment.dart +0 -26
- package/project/.sdk/src/cmp/dart/tsconfig.json +0 -15
- package/project/.sdk/src/cmp/dart/utility_dart.ts +0 -155
- package/project/.sdk/src/cmp/lean/Config_lean.ts +0 -93
- package/project/.sdk/src/cmp/lean/Entity_lean.ts +0 -9
- package/project/.sdk/src/cmp/lean/Gitignore_lean.ts +0 -18
- package/project/.sdk/src/cmp/lean/Main_lean.ts +0 -120
- package/project/.sdk/src/cmp/lean/Package_lean.ts +0 -93
- package/project/.sdk/src/cmp/lean/ReadmeEntity_lean.ts +0 -29
- package/project/.sdk/src/cmp/lean/ReadmeExplanation_lean.ts +0 -19
- package/project/.sdk/src/cmp/lean/ReadmeHowto_lean.ts +0 -25
- package/project/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +0 -39
- package/project/.sdk/src/cmp/lean/ReadmeIntro_lean.ts +0 -25
- package/project/.sdk/src/cmp/lean/ReadmeModel_lean.ts +0 -24
- package/project/.sdk/src/cmp/lean/ReadmeOptions_lean.ts +0 -22
- package/project/.sdk/src/cmp/lean/ReadmeQuick_lean.ts +0 -50
- package/project/.sdk/src/cmp/lean/ReadmeRef_lean.ts +0 -40
- package/project/.sdk/src/cmp/lean/ReadmeTopHowto_lean.ts +0 -16
- package/project/.sdk/src/cmp/lean/ReadmeTopQuick_lean.ts +0 -23
- package/project/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +0 -19
- package/project/.sdk/src/cmp/lean/Test_lean.ts +0 -261
- package/project/.sdk/src/cmp/lean/utility_lean.ts +0 -129
- package/project/.sdk/src/cmp/seneca-provider/Extras_seneca-provider.ts +0 -4080
- package/project/.sdk/src/cmp/seneca-provider/Gitignore_seneca-provider.ts +0 -161
- package/project/.sdk/src/cmp/seneca-provider/Main_seneca-provider.ts +0 -1011
- package/project/.sdk/tm/dart/LICENSE +0 -22
- package/project/.sdk/tm/dart/Makefile +0 -50
- package/project/.sdk/tm/dart/lib/Context.dart +0 -150
- package/project/.sdk/tm/dart/lib/Control.dart +0 -15
- package/project/.sdk/tm/dart/lib/Operation.dart +0 -31
- package/project/.sdk/tm/dart/lib/Point.dart +0 -51
- package/project/.sdk/tm/dart/lib/Response.dart +0 -32
- package/project/.sdk/tm/dart/lib/Result.dart +0 -39
- package/project/.sdk/tm/dart/lib/Spec.dart +0 -49
- package/project/.sdk/tm/dart/lib/feature/audit/AuditFeature.dart +0 -103
- package/project/.sdk/tm/dart/lib/feature/base/BaseFeature.dart +0 -76
- package/project/.sdk/tm/dart/lib/feature/cache/CacheFeature.dart +0 -152
- package/project/.sdk/tm/dart/lib/feature/clienttrack/ClienttrackFeature.dart +0 -104
- package/project/.sdk/tm/dart/lib/feature/cost/CostFeature.dart +0 -446
- package/project/.sdk/tm/dart/lib/feature/debug/DebugFeature.dart +0 -153
- package/project/.sdk/tm/dart/lib/feature/idempotency/IdempotencyFeature.dart +0 -92
- package/project/.sdk/tm/dart/lib/feature/log/LogFeature.dart +0 -85
- package/project/.sdk/tm/dart/lib/feature/metrics/MetricsFeature.dart +0 -103
- package/project/.sdk/tm/dart/lib/feature/netsim/NetsimFeature.dart +0 -186
- package/project/.sdk/tm/dart/lib/feature/paging/PagingFeature.dart +0 -240
- package/project/.sdk/tm/dart/lib/feature/proxy/ProxyFeature.dart +0 -118
- package/project/.sdk/tm/dart/lib/feature/ratelimit/RatelimitFeature.dart +0 -103
- package/project/.sdk/tm/dart/lib/feature/rbac/RbacFeature.dart +0 -121
- package/project/.sdk/tm/dart/lib/feature/retry/RetryFeature.dart +0 -155
- package/project/.sdk/tm/dart/lib/feature/streaming/StreamingFeature.dart +0 -97
- package/project/.sdk/tm/dart/lib/feature/telemetry/TelemetryFeature.dart +0 -136
- package/project/.sdk/tm/dart/lib/feature/test/TestFeature.dart +0 -328
- package/project/.sdk/tm/dart/lib/feature/timeout/TimeoutFeature.dart +0 -104
- package/project/.sdk/tm/dart/lib/utility/CleanUtility.dart +0 -12
- package/project/.sdk/tm/dart/lib/utility/DoneUtility.dart +0 -18
- package/project/.sdk/tm/dart/lib/utility/ErrUtility.dart +0 -46
- package/project/.sdk/tm/dart/lib/utility/FeatureAddUtility.dart +0 -35
- package/project/.sdk/tm/dart/lib/utility/FeatureHookUtility.dart +0 -20
- package/project/.sdk/tm/dart/lib/utility/FeatureInitUtility.dart +0 -9
- package/project/.sdk/tm/dart/lib/utility/FetcherUtility.dart +0 -104
- package/project/.sdk/tm/dart/lib/utility/GraphqlUtility.dart +0 -162
- package/project/.sdk/tm/dart/lib/utility/MakeContextUtility.dart +0 -6
- package/project/.sdk/tm/dart/lib/utility/MakeErrorUtility.dart +0 -71
- package/project/.sdk/tm/dart/lib/utility/MakeFetchDefUtility.dart +0 -42
- package/project/.sdk/tm/dart/lib/utility/MakeOptionsUtility.dart +0 -233
- package/project/.sdk/tm/dart/lib/utility/MakePointUtility.dart +0 -130
- package/project/.sdk/tm/dart/lib/utility/MakeRequestUtility.dart +0 -66
- package/project/.sdk/tm/dart/lib/utility/MakeResponseUtility.dart +0 -59
- package/project/.sdk/tm/dart/lib/utility/MakeResultUtility.dart +0 -49
- package/project/.sdk/tm/dart/lib/utility/MakeSpecUtility.dart +0 -77
- package/project/.sdk/tm/dart/lib/utility/MakeUrlUtility.dart +0 -51
- package/project/.sdk/tm/dart/lib/utility/ParamUtility.dart +0 -56
- package/project/.sdk/tm/dart/lib/utility/PrepareAuthUtility.dart +0 -46
- package/project/.sdk/tm/dart/lib/utility/PrepareBodyUtility.dart +0 -19
- package/project/.sdk/tm/dart/lib/utility/PrepareHeadersUtility.dart +0 -11
- package/project/.sdk/tm/dart/lib/utility/PrepareMethodUtility.dart +0 -30
- package/project/.sdk/tm/dart/lib/utility/PrepareParamsUtility.dart +0 -23
- package/project/.sdk/tm/dart/lib/utility/PreparePathUtility.dart +0 -9
- package/project/.sdk/tm/dart/lib/utility/PrepareQueryUtility.dart +0 -18
- package/project/.sdk/tm/dart/lib/utility/ResultBasicUtility.dart +0 -29
- package/project/.sdk/tm/dart/lib/utility/ResultBodyUtility.dart +0 -15
- package/project/.sdk/tm/dart/lib/utility/ResultHeadersUtility.dart +0 -18
- package/project/.sdk/tm/dart/lib/utility/StructUtility.dart +0 -127
- package/project/.sdk/tm/dart/lib/utility/TransformRequestUtility.dart +0 -28
- package/project/.sdk/tm/dart/lib/utility/TransformResponseUtility.dart +0 -44
- package/project/.sdk/tm/dart/lib/utility/Utility.dart +0 -239
- package/project/.sdk/tm/dart/lib/utility/voxgig_struct.dart +0 -2462
- package/project/.sdk/tm/dart/src/feature/README.md +0 -3
- package/project/.sdk/tm/dart/src/feature/telemetry/.gitkeep +0 -0
- package/project/.sdk/tm/dart/src/feature/test/.gitkeep +0 -0
- package/project/.sdk/tm/dart/src/feature/timeout/.gitkeep +0 -0
- package/project/.sdk/tm/dart/test/custom_test.dart +0 -65
- package/project/.sdk/tm/dart/test/exists_test.dart +0 -12
- package/project/.sdk/tm/dart/test/feature/harness.dart +0 -329
- package/project/.sdk/tm/dart/test/feature_test.dart +0 -1193
- package/project/.sdk/tm/dart/test/harness.dart +0 -153
- package/project/.sdk/tm/dart/test/netsim_test.dart +0 -48
- package/project/.sdk/tm/dart/test/omni.dart +0 -520
- package/project/.sdk/tm/dart/test/omni_smoke_test.dart +0 -143
- package/project/.sdk/tm/dart/test/pipeline_test.dart +0 -608
- package/project/.sdk/tm/dart/test/primary_test.dart +0 -476
- package/project/.sdk/tm/dart/test/sdk-test-control.json +0 -19
- package/project/.sdk/tm/dart/test/struct_test.dart +0 -468
- package/project/.sdk/tm/dart/test/utility.dart +0 -198
- package/project/.sdk/tm/dart/test/vendor/omni/omni.dart +0 -7
- package/project/.sdk/tm/dart/test/vendor/omni/runner.dart +0 -653
- package/project/.sdk/tm/dart/test/vendor/omni/util.dart +0 -232
- package/project/.sdk/tm/lean/LICENSE +0 -21
- package/project/.sdk/tm/lean/Makefile +0 -32
- package/project/.sdk/tm/lean/VERSION +0 -1
- package/project/.sdk/tm/lean/src/SdkFeature.lean +0 -171
- package/project/.sdk/tm/lean/src/SdkFeatures.lean +0 -787
- package/project/.sdk/tm/lean/src/SdkJson.lean +0 -134
- package/project/.sdk/tm/lean/src/SdkRuntime.lean +0 -374
- package/project/.sdk/tm/lean/src/SdkUtility.lean +0 -809
- package/project/.sdk/tm/lean/src/VoxgigStruct.lean +0 -2880
- package/project/.sdk/tm/lean/src/Vregex.lean +0 -412
- package/project/.sdk/tm/lean/src/feature/README.md +0 -5
- package/project/.sdk/tm/lean/src/feature/audit/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/base/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/cache/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/clienttrack/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/cost/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/debug/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/idempotency/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/log/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/metrics/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/netsim/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/paging/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/proxy/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/ratelimit/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/rbac/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/retry/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/streaming/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/telemetry/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/test/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/timeout/.gitkeep +0 -0
- package/project/.sdk/tm/lean/test/OmniResolver.lean +0 -358
- package/project/.sdk/tm/lean/test/OmniSmoke.lean +0 -174
- package/project/.sdk/tm/lean/test/StructCorpus.lean +0 -368
- package/project/.sdk/tm/lean/test/TFeature.lean +0 -281
- package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +0 -227
- package/project/.sdk/tm/lean/test/vendor/omni/Omni.lean +0 -997
- package/project/.sdk/tm/seneca-provider/CODE_OF_CONDUCT.md +0 -132
- package/project/.sdk/tm/seneca-provider/LICENSE +0 -21
- package/project/.sdk/tm/seneca-provider/Makefile +0 -15
- package/project/.sdk/tm/seneca-provider/src/tsconfig.json +0 -18
- package/project/.sdk/tm/seneca-provider/test/tsconfig.json +0 -16
- package/project/.sdk/tm/seneca-provider/tsfmt.json +0 -3
- /package/project/.sdk/tm/{dart/src/feature/audit → c/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/base → clojure/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/cache → cpp/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/clienttrack → csharp/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/cost → elixir/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/debug → java/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/idempotency → kotlin/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/log → lua/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/metrics → ocaml/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/netsim → perl/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/paging → php/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/proxy → rb/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/ratelimit → rust/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/rbac → scala/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/retry → swift/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/streaming → zig/src/feature/secrets}/.gitkeep +0 -0
|
@@ -0,0 +1,1217 @@
|
|
|
1
|
+
package KOTLINPACKAGE.sdktest
|
|
2
|
+
|
|
3
|
+
// Behavioural tests for the secrets feature (vendored @voxgig/sekreto) -
|
|
4
|
+
// the kotlin port of tm/ts/test/feature/secrets/Secrets.test.ts.
|
|
5
|
+
//
|
|
6
|
+
// The contract under test: the `apikey` OPTION keeps its exact old meaning
|
|
7
|
+
// and always wins, because SecretsFeature places it FIRST in the provider
|
|
8
|
+
// chain (a `memory` store named `options`) - explicit-beats-lookup falls
|
|
9
|
+
// out of sekreto's first-hit rule rather than from special-case logic.
|
|
10
|
+
// With the feature inactive nothing changes at all. With it active and the
|
|
11
|
+
// option unset, the chain (a memory store, a custom provider, a vault)
|
|
12
|
+
// supplies the credential instead.
|
|
13
|
+
//
|
|
14
|
+
// This file lives in the test `feature/` container on purpose: `target add`
|
|
15
|
+
// trims it, along with the feature source and the vendored library, for a
|
|
16
|
+
// project whose model does not select `secrets`.
|
|
17
|
+
//
|
|
18
|
+
// THE CLIENT IS LIVE AND THE TRANSPORT IS THE THING COUNTED. Every wire
|
|
19
|
+
// assertion here runs against a real client whose `system.fetch` is the
|
|
20
|
+
// recorder - never `testSDK`, whose test feature REPLACES the fetcher with
|
|
21
|
+
// its own in-memory mock and would leave a `system.fetch` counter at zero
|
|
22
|
+
// for a healthy SDK carrying no secrets feature at all. An assertion that
|
|
23
|
+
// cannot fail pins no rule, so each fail-closed case additionally carries a
|
|
24
|
+
// CONTROL leg: the same construction with a WORKING provider must reach the
|
|
25
|
+
// same recorder exactly once, carrying the credential. Only then does a
|
|
26
|
+
// zero from the broken provider mean REFUSED rather than UNWIRED. And the
|
|
27
|
+
// refusal is matched on the PROVIDER'S OWN message, so an unrelated failure
|
|
28
|
+
// (a missing route, a blocked op) cannot stand in for fail-closed.
|
|
29
|
+
//
|
|
30
|
+
// The feature is CONSTRUCTED DIRECTLY and adopted through the `extend`
|
|
31
|
+
// option ONLY when the generated Config did not already install it, so
|
|
32
|
+
// these tests hold in any generated tree - and never double the feature
|
|
33
|
+
// (two transport wraps, two purchases) in one that did.
|
|
34
|
+
//
|
|
35
|
+
// NO ENVIRONMENT VARIABLES. The JVM has no supported way to set one for the
|
|
36
|
+
// current process, so the ts/go/js suites' `env` chains become `memory`
|
|
37
|
+
// chains and custom Provider objects here. The rule under test - the chain
|
|
38
|
+
// answers when the option does not - is identical either way.
|
|
39
|
+
|
|
40
|
+
import java.lang.reflect.Method
|
|
41
|
+
import java.util.concurrent.CountDownLatch
|
|
42
|
+
import java.util.concurrent.TimeUnit
|
|
43
|
+
import java.util.function.BiFunction
|
|
44
|
+
import java.util.function.Supplier
|
|
45
|
+
|
|
46
|
+
import org.junit.jupiter.api.Assertions.assertEquals
|
|
47
|
+
import org.junit.jupiter.api.Assertions.assertFalse
|
|
48
|
+
import org.junit.jupiter.api.Assertions.assertNotNull
|
|
49
|
+
import org.junit.jupiter.api.Assertions.assertNull
|
|
50
|
+
import org.junit.jupiter.api.Assertions.assertTrue
|
|
51
|
+
import org.junit.jupiter.api.Assertions.fail
|
|
52
|
+
import org.junit.jupiter.api.Test
|
|
53
|
+
|
|
54
|
+
import KOTLINPACKAGE.core.Config
|
|
55
|
+
import KOTLINPACKAGE.core.ProjectNameSDK
|
|
56
|
+
import KOTLINPACKAGE.core.SdkEntity
|
|
57
|
+
import KOTLINPACKAGE.feature.SecretsFeature
|
|
58
|
+
import KOTLINPACKAGE.feature.secrets.sekreto.Provider
|
|
59
|
+
import KOTLINPACKAGE.feature.secrets.sekreto.ProviderSpec
|
|
60
|
+
|
|
61
|
+
@Suppress("UNCHECKED_CAST")
|
|
62
|
+
class SecretsTest {
|
|
63
|
+
|
|
64
|
+
// -------------------------------------------------------------------
|
|
65
|
+
// The recording transport: system.fetch for a LIVE client, scripting one
|
|
66
|
+
// status per API call (the last repeating) and a token endpoint for the
|
|
67
|
+
// exchange tests.
|
|
68
|
+
|
|
69
|
+
class Call(
|
|
70
|
+
val url: String,
|
|
71
|
+
val auth: String,
|
|
72
|
+
val hasAuth: Boolean,
|
|
73
|
+
val body: String,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
class Wire {
|
|
77
|
+
private val lock = Object()
|
|
78
|
+
private val recorded = mutableListOf<Call>()
|
|
79
|
+
|
|
80
|
+
var apistatus: List<Int> = listOf(200)
|
|
81
|
+
var tokens: List<String> = listOf("ACCESS01", "ACCESS02", "ACCESS03")
|
|
82
|
+
var tokenpath: String = "auth/token"
|
|
83
|
+
var respfield: String = "access_token"
|
|
84
|
+
|
|
85
|
+
// A token endpoint that starts refusing after `tokenok` successful
|
|
86
|
+
// purchases (0 refuses the first).
|
|
87
|
+
var tokenok: Int = Int.MAX_VALUE
|
|
88
|
+
|
|
89
|
+
private var issued = 0
|
|
90
|
+
private var apicalls = 0
|
|
91
|
+
|
|
92
|
+
// A java.util.function.BiFunction, not a bare kotlin lambda: that is the
|
|
93
|
+
// shape utility/Fetcher.kt dispatches on, and a Function2 would be
|
|
94
|
+
// silently ignored.
|
|
95
|
+
val fetch: BiFunction<String, MutableMap<String, Any?>, Any?> =
|
|
96
|
+
BiFunction { url, fetchdef -> serve(url, fetchdef) }
|
|
97
|
+
|
|
98
|
+
private fun serve(url: String, fetchdef: MutableMap<String, Any?>): Any? {
|
|
99
|
+
synchronized(lock) {
|
|
100
|
+
// The header value is SNAPSHOT here, not referenced: the retry path
|
|
101
|
+
// rewrites the same headers map in place, so a stored reference
|
|
102
|
+
// would make every earlier record show the newest token.
|
|
103
|
+
var auth = ""
|
|
104
|
+
var hasAuth = false
|
|
105
|
+
val headers = fetchdef["headers"]
|
|
106
|
+
if (headers is Map<*, *>) {
|
|
107
|
+
for (e in headers.entries) {
|
|
108
|
+
if ("authorization".equals(e.key.toString(), ignoreCase = true)) {
|
|
109
|
+
hasAuth = true
|
|
110
|
+
auth = e.value?.toString() ?: ""
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
val body = fetchdef["body"]
|
|
115
|
+
recorded.add(Call(url, auth, hasAuth, if (body is String) body else ""))
|
|
116
|
+
|
|
117
|
+
if (url.endsWith("/$tokenpath")) {
|
|
118
|
+
if (issued >= tokenok) {
|
|
119
|
+
issued++
|
|
120
|
+
return response(500, linkedMapOf<String, Any?>("error" to "nope"))
|
|
121
|
+
}
|
|
122
|
+
val token = tokens[minOf(issued, tokens.size - 1)]
|
|
123
|
+
issued++
|
|
124
|
+
return response(200, linkedMapOf<String, Any?>(respfield to token))
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
val status = apistatus[minOf(apicalls, apistatus.size - 1)]
|
|
128
|
+
apicalls++
|
|
129
|
+
return response(status, linkedMapOf<String, Any?>("ok" to (status < 400)))
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
private fun response(status: Int, payload: Any?): MutableMap<String, Any?> =
|
|
134
|
+
linkedMapOf(
|
|
135
|
+
"status" to status,
|
|
136
|
+
"statusText" to if (status < 400) "OK" else "ERR",
|
|
137
|
+
"headers" to linkedMapOf<String, Any?>(),
|
|
138
|
+
"json" to Supplier<Any?> { payload },
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
fun calls(): List<Call> = synchronized(lock) { recorded.toList() }
|
|
142
|
+
|
|
143
|
+
/** The recorded calls that did NOT go to the token endpoint. */
|
|
144
|
+
fun api(): List<Call> = calls().filter { !it.url.endsWith("/$tokenpath") }
|
|
145
|
+
|
|
146
|
+
fun token(): List<Call> = calls().filter { it.url.endsWith("/$tokenpath") }
|
|
147
|
+
|
|
148
|
+
/** What went out, for a message that names the leak rather than counting it. */
|
|
149
|
+
fun wire(): String = calls().joinToString(", ") { it.url + " auth=" + it.auth }
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// -------------------------------------------------------------------
|
|
153
|
+
// Support.
|
|
154
|
+
|
|
155
|
+
companion object {
|
|
156
|
+
const val BASE = "http://secrets.test/api"
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// A sekreto Provider built in code.
|
|
160
|
+
class TestProvider(
|
|
161
|
+
private val onlookup: (String) -> String?,
|
|
162
|
+
private val label: String = "custom:test",
|
|
163
|
+
) : Provider {
|
|
164
|
+
override fun lookup(name: String): String? = onlookup(name)
|
|
165
|
+
override fun describe(): String = label
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// The Authorization header carries the SPEC's credential prefix, which a
|
|
169
|
+
// TEMPLATE cannot know: an OpenAPI `http`/`bearer` scheme gives
|
|
170
|
+
// `Bearer <token>`, an apiKey scheme the raw token. So assert on the
|
|
171
|
+
// CREDENTIAL and let the prefix be whatever this SDK's API declares.
|
|
172
|
+
private fun credentialIs(header: String?, token: String) {
|
|
173
|
+
val got = header ?: ""
|
|
174
|
+
assertTrue(got == token || got.endsWith(" $token"),
|
|
175
|
+
"expected the authorization header to carry $token, got: \"$got\"")
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private fun map(vararg pairs: Pair<String, Any?>): MutableMap<String, Any?> =
|
|
179
|
+
linkedMapOf(*pairs)
|
|
180
|
+
|
|
181
|
+
private fun secretsFeatureOf(client: ProjectNameSDK): SecretsFeature? =
|
|
182
|
+
client.features.firstOrNull { it is SecretsFeature } as? SecretsFeature
|
|
183
|
+
|
|
184
|
+
// Build the client, and ADOPT the feature via `extend` ONLY when the
|
|
185
|
+
// generated Config did not already install it: when this SDK was generated
|
|
186
|
+
// with `secrets` model-active, the ordinary factory path builds the
|
|
187
|
+
// instance, and adding a second via extend would DOUBLE the feature - two
|
|
188
|
+
// transport wraps, two resolutions, and a token purchase the assertions
|
|
189
|
+
// cannot account for.
|
|
190
|
+
private fun withSecrets(build: (Boolean) -> ProjectNameSDK): ProjectNameSDK {
|
|
191
|
+
val client = build(false)
|
|
192
|
+
if (null != secretsFeatureOf(client)) {
|
|
193
|
+
return client
|
|
194
|
+
}
|
|
195
|
+
return build(true)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// A LIVE client carrying the secrets feature, wired to the recorder.
|
|
199
|
+
private fun secretsClient(w: Wire, sdkopts: MutableMap<String, Any?>): ProjectNameSDK {
|
|
200
|
+
val opts = map(
|
|
201
|
+
"base" to BASE,
|
|
202
|
+
"system" to map("fetch" to w.fetch),
|
|
203
|
+
)
|
|
204
|
+
opts.putAll(sdkopts)
|
|
205
|
+
|
|
206
|
+
return withSecrets { extend ->
|
|
207
|
+
val use = LinkedHashMap(opts)
|
|
208
|
+
if (extend) {
|
|
209
|
+
use["extend"] = mutableListOf<Any?>(SecretsFeature())
|
|
210
|
+
}
|
|
211
|
+
ProjectNameSDK(use)
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// The feature options block: one provider (a live Provider object, or a
|
|
216
|
+
// declarative spec / plain map), plus any extra feature options.
|
|
217
|
+
private fun chainOpts(
|
|
218
|
+
provider: Any?,
|
|
219
|
+
extra: MutableMap<String, Any?>? = null,
|
|
220
|
+
): MutableMap<String, Any?> {
|
|
221
|
+
val fopts = map(
|
|
222
|
+
"active" to true,
|
|
223
|
+
"providers" to mutableListOf<Any?>(provider),
|
|
224
|
+
)
|
|
225
|
+
if (extra != null) {
|
|
226
|
+
fopts.putAll(extra)
|
|
227
|
+
}
|
|
228
|
+
return map("secrets" to fopts)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
private val BROKEN = TestProvider(
|
|
232
|
+
{ throw RuntimeException("vault unreachable") }, "broken:test")
|
|
233
|
+
|
|
234
|
+
private fun working(value: String) =
|
|
235
|
+
TestProvider({ name -> if ("apikey" == name) value else null }, "working:test")
|
|
236
|
+
|
|
237
|
+
// -------------------------------------------------------------------
|
|
238
|
+
// Driving real entity operations - which is what runs the whole pipeline
|
|
239
|
+
// and reaches the transport. Entity accessors are discovered by SHAPE (one
|
|
240
|
+
// Map argument, an SdkEntity return) rather than by name, because this
|
|
241
|
+
// file is a TEMPLATE and no project's entity names are known here. An op
|
|
242
|
+
// the API does not define fails BEFORE the transport, which is why several
|
|
243
|
+
// may need driving.
|
|
244
|
+
|
|
245
|
+
private fun accessors(client: ProjectNameSDK): List<Method> =
|
|
246
|
+
client.javaClass.methods
|
|
247
|
+
.filter {
|
|
248
|
+
1 == it.parameterCount &&
|
|
249
|
+
SdkEntity::class.java.isAssignableFrom(it.returnType) &&
|
|
250
|
+
java.util.Map::class.java.isAssignableFrom(it.parameterTypes[0])
|
|
251
|
+
}
|
|
252
|
+
.sortedBy { it.name }
|
|
253
|
+
|
|
254
|
+
// Drives ops until `stop` reports the observable state a test waits for,
|
|
255
|
+
// and returns the last error an op raised (the operation's own outcome is
|
|
256
|
+
// otherwise irrelevant: no seeded data, a scripted response). `stop` is
|
|
257
|
+
// handed that last error too, so a fail-closed case can stop on EITHER
|
|
258
|
+
// outcome - the refusal it wants, or a request going out, which is the
|
|
259
|
+
// failure it exists to catch; stopping only on the refusal would report
|
|
260
|
+
// "nothing to assert on" for the leak.
|
|
261
|
+
private fun driveEntityOpUntil(
|
|
262
|
+
client: ProjectNameSDK,
|
|
263
|
+
what: String,
|
|
264
|
+
stop: (Throwable?) -> Boolean,
|
|
265
|
+
): Throwable? {
|
|
266
|
+
var last: Throwable? = null
|
|
267
|
+
|
|
268
|
+
for (m in accessors(client)) {
|
|
269
|
+
val ent = m.invoke(client, null) as? SdkEntity ?: continue
|
|
270
|
+
|
|
271
|
+
for (op in listOf<(SdkEntity) -> Any?>(
|
|
272
|
+
{ it.list(null, null) },
|
|
273
|
+
{ it.load(null, null) },
|
|
274
|
+
)) {
|
|
275
|
+
try {
|
|
276
|
+
op(ent)
|
|
277
|
+
} catch (err: Throwable) {
|
|
278
|
+
last = err
|
|
279
|
+
}
|
|
280
|
+
if (stop(last)) {
|
|
281
|
+
return last
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
fail<Unit>("no entity operation $what - nothing to assert on")
|
|
287
|
+
return last
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
private fun driveEntityOp(client: ProjectNameSDK, w: Wire): Throwable? {
|
|
291
|
+
val before = w.api().size
|
|
292
|
+
return driveEntityOpUntil(client, "reached the transport") { before < w.api().size }
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
private fun messageOf(err: Throwable?): String {
|
|
296
|
+
var e = err
|
|
297
|
+
val parts = mutableListOf<String>()
|
|
298
|
+
while (null != e) {
|
|
299
|
+
parts.add(e.message ?: e.toString())
|
|
300
|
+
e = e.cause
|
|
301
|
+
}
|
|
302
|
+
return parts.joinToString(" <- ")
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// ===================================================================
|
|
306
|
+
// The feature-inactive baseline: bit-identical behaviour.
|
|
307
|
+
|
|
308
|
+
@Test
|
|
309
|
+
fun inactiveApikeyOptionBehavesExactlyAsBefore() {
|
|
310
|
+
val client = ProjectNameSDK.testSDK(null, map("apikey" to "OPTKEY01"))
|
|
311
|
+
val fetchdef = client.prepare(map("path" to "/"))
|
|
312
|
+
val headers = fetchdef["headers"] as MutableMap<String, Any?>
|
|
313
|
+
credentialIs(headers["authorization"] as? String, "OPTKEY01")
|
|
314
|
+
|
|
315
|
+
// No runtime activation, no extend: the feature must not be installed,
|
|
316
|
+
// whatever this project's model says.
|
|
317
|
+
assertNull(secretsFeatureOf(client),
|
|
318
|
+
"the feature must not install itself without feature.secrets.active")
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
@Test
|
|
322
|
+
fun inactiveNoApikeyMeansNoAuthorizationHeader() {
|
|
323
|
+
val client = ProjectNameSDK.testSDK(null, null)
|
|
324
|
+
val fetchdef = client.prepare(map("path" to "/"))
|
|
325
|
+
val headers = fetchdef["headers"] as MutableMap<String, Any?>
|
|
326
|
+
assertFalse(headers.containsKey("authorization"),
|
|
327
|
+
"unexpected authorization header: " + headers["authorization"])
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// ===================================================================
|
|
331
|
+
// Active: the provider chain, driven through real entity operations.
|
|
332
|
+
|
|
333
|
+
@Test
|
|
334
|
+
fun apikeyOptionStillWinsOverTheChain() {
|
|
335
|
+
val w = Wire()
|
|
336
|
+
val client = secretsClient(w, map(
|
|
337
|
+
"apikey" to "OPTKEY01",
|
|
338
|
+
"feature" to chainOpts(working("CHAINKEY01")),
|
|
339
|
+
))
|
|
340
|
+
|
|
341
|
+
driveEntityOp(client, w)
|
|
342
|
+
credentialIs(w.api()[0].auth, "OPTKEY01")
|
|
343
|
+
|
|
344
|
+
// The explicit option is a real store, not a special case: a directed
|
|
345
|
+
// read names it like any other.
|
|
346
|
+
val sf = secretsFeatureOf(client)
|
|
347
|
+
assertNotNull(sf, "the extend seam did not install the feature")
|
|
348
|
+
assertEquals("OPTKEY01", sf!!.sekreto()!!.getfrom("options", "apikey"))
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
@Test
|
|
352
|
+
fun anOmittedApikeyDefersToTheChainAtTheTransportSeam() {
|
|
353
|
+
val w = Wire()
|
|
354
|
+
val client = secretsClient(w, map(
|
|
355
|
+
"feature" to chainOpts(working("CHAINKEY02")),
|
|
356
|
+
))
|
|
357
|
+
|
|
358
|
+
// Before any op, nothing has been resolved.
|
|
359
|
+
assertEquals("", secretsFeatureOf(client)!!.credential(),
|
|
360
|
+
"the chain was consulted before any operation")
|
|
361
|
+
|
|
362
|
+
driveEntityOp(client, w)
|
|
363
|
+
|
|
364
|
+
// Resolution happens AT THE TRANSPORT - the one seam every wire path
|
|
365
|
+
// crosses - so the credential is ON THE WIRE, not merely resolved.
|
|
366
|
+
credentialIs(w.api()[0].auth, "CHAINKEY02")
|
|
367
|
+
assertEquals("CHAINKEY02", secretsFeatureOf(client)!!.credential())
|
|
368
|
+
|
|
369
|
+
// And the shared options map stays FROZEN: prepareAuth clones it on
|
|
370
|
+
// every request, so a feature writing to it would race every concurrent
|
|
371
|
+
// operation.
|
|
372
|
+
assertEquals("", client.optionsMap()["apikey"],
|
|
373
|
+
"the options map must stay unwritten after construction")
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
@Test
|
|
377
|
+
fun anExplicitlyEmptyApikeyAlsoDefersToTheChain() {
|
|
378
|
+
val w = Wire()
|
|
379
|
+
val client = secretsClient(w, map(
|
|
380
|
+
"apikey" to "",
|
|
381
|
+
"feature" to chainOpts(working("CHAINKEY03")),
|
|
382
|
+
))
|
|
383
|
+
|
|
384
|
+
driveEntityOp(client, w)
|
|
385
|
+
credentialIs(w.api()[0].auth, "CHAINKEY03")
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
@Test
|
|
389
|
+
fun customProviderObjectsAreAcceptedVerbatim() {
|
|
390
|
+
val asked = mutableListOf<String>()
|
|
391
|
+
val w = Wire()
|
|
392
|
+
val client = secretsClient(w, map(
|
|
393
|
+
"feature" to chainOpts(TestProvider({ name ->
|
|
394
|
+
synchronized(asked) { asked.add(name) }
|
|
395
|
+
"CUSTOM01"
|
|
396
|
+
})),
|
|
397
|
+
))
|
|
398
|
+
|
|
399
|
+
driveEntityOp(client, w)
|
|
400
|
+
credentialIs(w.api()[0].auth, "CUSTOM01")
|
|
401
|
+
assertTrue(asked.contains("apikey"),
|
|
402
|
+
"the custom provider was asked $asked, want it to include apikey")
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
@Test
|
|
406
|
+
fun typedProviderSpecsAreAcceptedVerbatim() {
|
|
407
|
+
// The typed arm of the providers list: a ProviderSpec built in code
|
|
408
|
+
// joins the chain without going through `specof`.
|
|
409
|
+
val w = Wire()
|
|
410
|
+
val client = secretsClient(w, map(
|
|
411
|
+
"feature" to chainOpts(ProviderSpec(
|
|
412
|
+
kind = "memory",
|
|
413
|
+
values = mapOf("APIKEY" to "SPECKEY01"),
|
|
414
|
+
)),
|
|
415
|
+
))
|
|
416
|
+
|
|
417
|
+
driveEntityOp(client, w)
|
|
418
|
+
credentialIs(w.api()[0].auth, "SPECKEY01")
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
@Test
|
|
422
|
+
fun declarativeMemorySpecsAreAcceptedAsMaps() {
|
|
423
|
+
// A chain given as plain maps (the shape a config file produces) is
|
|
424
|
+
// turned into ProviderSpecs by sekreto's own `specof`.
|
|
425
|
+
val w = Wire()
|
|
426
|
+
val client = secretsClient(w, map(
|
|
427
|
+
"feature" to chainOpts(map(
|
|
428
|
+
"kind" to "memory",
|
|
429
|
+
"values" to map("APIKEY" to "MAPKEY01"),
|
|
430
|
+
)),
|
|
431
|
+
))
|
|
432
|
+
|
|
433
|
+
driveEntityOp(client, w)
|
|
434
|
+
credentialIs(w.api()[0].auth, "MAPKEY01")
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
@Test
|
|
438
|
+
fun aMissEverywhereLeavesTheHeaderOff() {
|
|
439
|
+
val w = Wire()
|
|
440
|
+
val client = secretsClient(w, map(
|
|
441
|
+
"feature" to chainOpts(TestProvider({ null }, "empty:test")),
|
|
442
|
+
))
|
|
443
|
+
|
|
444
|
+
driveEntityOp(client, w)
|
|
445
|
+
|
|
446
|
+
// A MISS falls through to an unauthenticated request - and leaves the
|
|
447
|
+
// header ABSENT rather than empty, which is what prepareAuth does.
|
|
448
|
+
assertFalse(w.api()[0].hasAuth,
|
|
449
|
+
"a chain MISS must leave the header off, got \"" + w.api()[0].auth + "\"")
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
// A MISS IS NOT A CACHEABLE ANSWER - sekreto's own rule, which this
|
|
453
|
+
// feature used to override from the layer above.
|
|
454
|
+
//
|
|
455
|
+
// DEFAULT caching here, which is the whole point: `cache: true` is about
|
|
456
|
+
// holding a HIT, and keeping the settled resolution after a miss meant
|
|
457
|
+
// the chain was never asked again for the life of the client. A secret
|
|
458
|
+
// provisioned after startup (a mounted file, a vault policy granted a
|
|
459
|
+
// minute late) was invisible forever, and the only workaround was giving
|
|
460
|
+
// up hit caching entirely.
|
|
461
|
+
@Test
|
|
462
|
+
fun aCachedMissIsReasked() {
|
|
463
|
+
var present = false
|
|
464
|
+
var calls = 0
|
|
465
|
+
val w = Wire()
|
|
466
|
+
val client = secretsClient(w, map(
|
|
467
|
+
"feature" to chainOpts(TestProvider({ _ ->
|
|
468
|
+
synchronized(this) {
|
|
469
|
+
calls++
|
|
470
|
+
if (present) "LATEKEY01" else null
|
|
471
|
+
}
|
|
472
|
+
}, "late:test")),
|
|
473
|
+
))
|
|
474
|
+
|
|
475
|
+
driveEntityOp(client, w)
|
|
476
|
+
val first = w.api()[0]
|
|
477
|
+
assertFalse(first.hasAuth && "" != first.auth,
|
|
478
|
+
"the chain has nothing yet, so no credential should go out")
|
|
479
|
+
|
|
480
|
+
val asked = synchronized(this) { calls }
|
|
481
|
+
assertTrue(0 < asked)
|
|
482
|
+
|
|
483
|
+
// The secret is provisioned while the client is live.
|
|
484
|
+
synchronized(this) { present = true }
|
|
485
|
+
|
|
486
|
+
driveEntityOp(client, w)
|
|
487
|
+
credentialIs(w.api().last().auth, "LATEKEY01")
|
|
488
|
+
|
|
489
|
+
assertTrue(asked < synchronized(this) { calls },
|
|
490
|
+
"the MISS was cached: a secret that appears later can never be picked up")
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
// The other half of the same rule: a HIT is still cached by default, so
|
|
494
|
+
// the fix above must not turn every request into a chain walk.
|
|
495
|
+
@Test
|
|
496
|
+
fun aCachedHitIsKept() {
|
|
497
|
+
var calls = 0
|
|
498
|
+
val w = Wire()
|
|
499
|
+
val client = secretsClient(w, map(
|
|
500
|
+
"feature" to chainOpts(TestProvider({ _ ->
|
|
501
|
+
synchronized(this) { calls++ }
|
|
502
|
+
"STABLEKEY01"
|
|
503
|
+
}, "counting:test")),
|
|
504
|
+
))
|
|
505
|
+
|
|
506
|
+
driveEntityOp(client, w)
|
|
507
|
+
driveEntityOp(client, w)
|
|
508
|
+
|
|
509
|
+
assertEquals(1, synchronized(this) { calls },
|
|
510
|
+
"a hit must be cached under the default cache: true")
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
@Test
|
|
514
|
+
fun authNullSuppressesTheCredentialChainOrNoChain() {
|
|
515
|
+
val w = Wire()
|
|
516
|
+
val client = secretsClient(w, map(
|
|
517
|
+
"auth" to null,
|
|
518
|
+
"apikey" to "OPTKEY01",
|
|
519
|
+
"feature" to chainOpts(working("CHAINKEY04")),
|
|
520
|
+
))
|
|
521
|
+
|
|
522
|
+
driveEntityOp(client, w)
|
|
523
|
+
|
|
524
|
+
// Nothing on the wire, even though the chain would have resolved AND an
|
|
525
|
+
// explicit apikey was given.
|
|
526
|
+
assertFalse(w.api()[0].hasAuth,
|
|
527
|
+
"auth null must suppress the credential, got \"" + w.api()[0].auth + "\"")
|
|
528
|
+
|
|
529
|
+
// The suppression survives option validation rather than being replaced
|
|
530
|
+
// by the optspec's default auth map.
|
|
531
|
+
val opts = client.optionsMap()
|
|
532
|
+
assertTrue(opts.containsKey("auth"), "options.auth must stay present")
|
|
533
|
+
assertNull(opts["auth"], "options.auth must stay a null")
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
@Test
|
|
537
|
+
fun secretNameIsConfigurable() {
|
|
538
|
+
val w = Wire()
|
|
539
|
+
val client = secretsClient(w, map(
|
|
540
|
+
"feature" to chainOpts(
|
|
541
|
+
map("kind" to "memory", "values" to map("API_TOKEN" to "TOKKEY01")),
|
|
542
|
+
map("name" to "api.token")),
|
|
543
|
+
))
|
|
544
|
+
|
|
545
|
+
driveEntityOp(client, w)
|
|
546
|
+
credentialIs(w.api()[0].auth, "TOKKEY01")
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
@Test
|
|
550
|
+
fun sekretoIsLiveForArbitrarySecretsAndRedaction() {
|
|
551
|
+
val w = Wire()
|
|
552
|
+
val client = secretsClient(w, map(
|
|
553
|
+
"feature" to chainOpts(map(
|
|
554
|
+
"kind" to "memory",
|
|
555
|
+
"values" to map("DB_PASSWORD" to "dbpass01"),
|
|
556
|
+
)),
|
|
557
|
+
))
|
|
558
|
+
|
|
559
|
+
val secrets = secretsFeatureOf(client)!!.sekreto()!!
|
|
560
|
+
assertEquals("dbpass01", secrets.get("db.password"))
|
|
561
|
+
assertEquals("the password is [redacted], keep it safe",
|
|
562
|
+
secrets.redact("the password is dbpass01, keep it safe"))
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
// THE PROVIDER VOCABULARY IS NON-EMPTY.
|
|
566
|
+
//
|
|
567
|
+
// The model's choice of plugin groups IS the SDK's provider vocabulary:
|
|
568
|
+
// Config emits the selected definitions and the feature hands them to
|
|
569
|
+
// Sekreto, which refuses at CONSTRUCTION any kind it was not given. A
|
|
570
|
+
// feature that dropped them on the floor would carry every selected plugin
|
|
571
|
+
// FILE and refuse every one of their kinds at runtime, while every test
|
|
572
|
+
// using only built-in kinds stayed green.
|
|
573
|
+
//
|
|
574
|
+
// Conditional on this project selecting a group at all.
|
|
575
|
+
@Test
|
|
576
|
+
fun aSelectedPluginKindIsInTheSdkVocabulary() {
|
|
577
|
+
val plugins = Config.featurePlugins("secrets")
|
|
578
|
+
if (plugins.isEmpty()) {
|
|
579
|
+
return
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
val w = Wire()
|
|
583
|
+
val client = secretsClient(w, map(
|
|
584
|
+
"feature" to chainOpts(map(
|
|
585
|
+
"kind" to "memory", "values" to map("APIKEY" to "VOCAB01"))),
|
|
586
|
+
))
|
|
587
|
+
|
|
588
|
+
val catalog = secretsFeatureOf(client)!!.sekreto()!!.catalog
|
|
589
|
+
for (d in plugins) {
|
|
590
|
+
val kind = (d as? Map<String, Any?>)?.get("name") as? String
|
|
591
|
+
assertNotNull(kind, "a selected plugin definition has no kind: $d")
|
|
592
|
+
assertTrue(catalog.has(kind!!),
|
|
593
|
+
"the model selected plugin kind '$kind' but the feature's Sekreto " +
|
|
594
|
+
"does not know it - the definitions never reached the chain")
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
driveEntityOp(client, w)
|
|
598
|
+
credentialIs(w.api()[0].auth, "VOCAB01")
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
// ===================================================================
|
|
602
|
+
// FAIL CLOSED. sekreto's miss-vs-error invariant: a MISS falls through, an
|
|
603
|
+
// ERROR does not. A broken vault must never degrade into an
|
|
604
|
+
// unauthenticated request.
|
|
605
|
+
|
|
606
|
+
@Test
|
|
607
|
+
fun aProviderErrorFailsTheEntityOpAndNothingReachesTheWire() {
|
|
608
|
+
// THE RULE, asserted first so a regression reports the leak itself.
|
|
609
|
+
val w = Wire()
|
|
610
|
+
val client = secretsClient(w, map("feature" to chainOpts(BROKEN)))
|
|
611
|
+
|
|
612
|
+
// Stop on EITHER outcome - the refusal, or a request going out. Stopping
|
|
613
|
+
// on the first op driven would report an op the API does not define
|
|
614
|
+
// (which fails BEFORE the transport) as the provider's refusal.
|
|
615
|
+
val err = driveEntityOpUntil(client, "refused the operation or sent one") {
|
|
616
|
+
last -> 0 < w.api().size || messageOf(last).contains("vault unreachable")
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
assertEquals(0, w.api().size,
|
|
620
|
+
"a request must not go out unauthenticated because a provider broke," +
|
|
621
|
+
" but one reached the transport: " + w.wire())
|
|
622
|
+
assertNotNull(err, "the operation must fail rather than proceed")
|
|
623
|
+
assertTrue(messageOf(err).contains("vault unreachable"),
|
|
624
|
+
"the failure must carry the PROVIDER'S own message, got: " + messageOf(err))
|
|
625
|
+
|
|
626
|
+
// CONTROL, which makes that zero mean REFUSED rather than UNWIRED: the
|
|
627
|
+
// same construction with a WORKING provider must reach the same
|
|
628
|
+
// transport, once, carrying the credential.
|
|
629
|
+
val control = Wire()
|
|
630
|
+
val ok = secretsClient(control, map("feature" to chainOpts(working("RAWKEY01"))))
|
|
631
|
+
driveEntityOp(ok, control)
|
|
632
|
+
|
|
633
|
+
assertEquals(1, control.api().size,
|
|
634
|
+
"the control operation did not reach system.fetch exactly once, so " +
|
|
635
|
+
"this test cannot observe a request going out at all: " + control.wire())
|
|
636
|
+
credentialIs(control.api()[0].auth, "RAWKEY01")
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
// THE RAW PATHS, which run NO feature hooks at all. If resolution lived in
|
|
640
|
+
// the PreSpec hook these would send an unauthenticated request and never
|
|
641
|
+
// notice; they are covered because the TRANSPORT is where resolution
|
|
642
|
+
// happens.
|
|
643
|
+
//
|
|
644
|
+
// `allow.op` is named explicitly: a project that narrows the default set
|
|
645
|
+
// would otherwise turn these into a false RED (the control leg refused
|
|
646
|
+
// before it reached the transport).
|
|
647
|
+
|
|
648
|
+
@Test
|
|
649
|
+
fun directCarriesTheChainCredentialAndFailsClosed() {
|
|
650
|
+
val w = Wire()
|
|
651
|
+
val client = secretsClient(w, map(
|
|
652
|
+
"allow" to map("op" to "direct,graphql"),
|
|
653
|
+
"feature" to chainOpts(working("DIRECTKEY01")),
|
|
654
|
+
))
|
|
655
|
+
|
|
656
|
+
val res = client.direct(map("path" to "/direct-probe"))
|
|
657
|
+
assertEquals(true, res["ok"], "direct refused: " + res["err"])
|
|
658
|
+
assertEquals(1, w.api().size, "expected one direct call on the wire: " + w.wire())
|
|
659
|
+
credentialIs(w.api()[0].auth, "DIRECTKEY01")
|
|
660
|
+
|
|
661
|
+
// And fail-closed holds for raw access too: a broken chain refuses the
|
|
662
|
+
// direct call before anything reaches the wire, IN BAND.
|
|
663
|
+
val broken = Wire()
|
|
664
|
+
val bclient = secretsClient(broken, map(
|
|
665
|
+
"allow" to map("op" to "direct,graphql"),
|
|
666
|
+
"feature" to chainOpts(BROKEN),
|
|
667
|
+
))
|
|
668
|
+
|
|
669
|
+
val bres = bclient.direct(map("path" to "/direct-probe"))
|
|
670
|
+
assertEquals(0, broken.api().size,
|
|
671
|
+
"a broken chain must not yield a raw request: " + broken.wire())
|
|
672
|
+
assertEquals(false, bres["ok"], "a broken chain must refuse the raw path")
|
|
673
|
+
assertTrue(messageOf(bres["err"] as? Throwable).contains("vault unreachable"),
|
|
674
|
+
"direct must report the PROVIDER'S own refusal, got: " +
|
|
675
|
+
messageOf(bres["err"] as? Throwable))
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
@Test
|
|
679
|
+
fun graphqlCarriesTheChainCredentialAndFailsClosed() {
|
|
680
|
+
val w = Wire()
|
|
681
|
+
val client = secretsClient(w, map(
|
|
682
|
+
"allow" to map("op" to "direct,graphql"),
|
|
683
|
+
"feature" to chainOpts(working("GQLKEY01")),
|
|
684
|
+
))
|
|
685
|
+
|
|
686
|
+
val res = client.graphql("{ thing }", null, null)
|
|
687
|
+
assertEquals(true, res["ok"], "graphql refused: " + res["err"])
|
|
688
|
+
assertEquals(1, w.api().size, "expected one graphql call on the wire: " + w.wire())
|
|
689
|
+
credentialIs(w.api()[0].auth, "GQLKEY01")
|
|
690
|
+
|
|
691
|
+
val broken = Wire()
|
|
692
|
+
val bclient = secretsClient(broken, map(
|
|
693
|
+
"allow" to map("op" to "direct,graphql"),
|
|
694
|
+
"feature" to chainOpts(BROKEN),
|
|
695
|
+
))
|
|
696
|
+
|
|
697
|
+
val bres = bclient.graphql("{ thing }", null, null)
|
|
698
|
+
assertEquals(0, broken.api().size,
|
|
699
|
+
"a broken chain must not yield a graphql request: " + broken.wire())
|
|
700
|
+
assertEquals(false, bres["ok"], "a broken chain must refuse graphql")
|
|
701
|
+
assertTrue(messageOf(bres["err"] as? Throwable).contains("vault unreachable"),
|
|
702
|
+
"graphql must report the PROVIDER'S own refusal, got: " +
|
|
703
|
+
messageOf(bres["err"] as? Throwable))
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
// ===================================================================
|
|
707
|
+
// FAIL CLOSED ON A CONSTRUCTION FAILURE. The chain a project configures
|
|
708
|
+
// can be wrong before a single lookup happens, and init() cannot fail the
|
|
709
|
+
// client construction the way ts's throwing init does - so it HOLDS the
|
|
710
|
+
// error (`initerr`) and the transport gate refuses to send.
|
|
711
|
+
//
|
|
712
|
+
// The entry pinned here is one the constructor refuses but init used to
|
|
713
|
+
// never SHOW it: a bare kind name where a spec belongs. init's `when`
|
|
714
|
+
// over the providers list had arms for a Provider, a ProviderSpec and a
|
|
715
|
+
// Map, and no `else` - so the entry was silently DROPPED, the chain got
|
|
716
|
+
// SHORTER rather than broken, and every request went out unauthenticated
|
|
717
|
+
// while the gate had nothing to refuse. That is fail-open by omission,
|
|
718
|
+
// and it survived every other case in this file because each of them
|
|
719
|
+
// configures the chain correctly.
|
|
720
|
+
//
|
|
721
|
+
// Three cases for the three wire paths - the entity pipeline, direct()
|
|
722
|
+
// and graphql() - each with its own CONTROL leg through the SAME live
|
|
723
|
+
// transport, so a zero means REFUSED and not UNWIRED. The refusal is
|
|
724
|
+
// matched on sekreto's OWN message, so an unrelated failure cannot
|
|
725
|
+
// stand in for it.
|
|
726
|
+
|
|
727
|
+
// A kind NAME where a provider or spec belongs - the natural slip for a
|
|
728
|
+
// reader of the ts docs. sekreto's constructor refuses exactly this.
|
|
729
|
+
private val MALFORMED: Any? = "hashicorp"
|
|
730
|
+
private val NOTAPROVIDER = "not a provider or a provider spec"
|
|
731
|
+
|
|
732
|
+
private fun saysNotAProvider(err: Any?): Boolean =
|
|
733
|
+
(if (err is Throwable) messageOf(err) else err?.toString() ?: "")
|
|
734
|
+
.contains(NOTAPROVIDER)
|
|
735
|
+
|
|
736
|
+
@Test
|
|
737
|
+
fun aMalformedProviderEntryFailsTheEntityOpAndNothingReachesTheWire() {
|
|
738
|
+
// CONTROL FIRST, so the zero below is known to be observable at all.
|
|
739
|
+
val control = Wire()
|
|
740
|
+
val ok = secretsClient(control, map("feature" to chainOpts(working("INITKEY01"))))
|
|
741
|
+
driveEntityOp(ok, control)
|
|
742
|
+
assertEquals(1, control.api().size,
|
|
743
|
+
"the control operation did not reach system.fetch exactly once, so " +
|
|
744
|
+
"this test cannot observe a request going out at all: " + control.wire())
|
|
745
|
+
credentialIs(control.api()[0].auth, "INITKEY01")
|
|
746
|
+
|
|
747
|
+
// THE RULE.
|
|
748
|
+
val w = Wire()
|
|
749
|
+
val client = secretsClient(w, map("feature" to chainOpts(MALFORMED)))
|
|
750
|
+
|
|
751
|
+
// The feature must still be INSTALLED: a construction failure that
|
|
752
|
+
// silently uninstalled it would be the same fail-open by another route,
|
|
753
|
+
// with nothing downstream gating anything.
|
|
754
|
+
assertNotNull(secretsFeatureOf(client),
|
|
755
|
+
"the secrets feature must stay installed on a construction failure")
|
|
756
|
+
|
|
757
|
+
val err = driveEntityOpUntil(client, "refused the operation or sent one") {
|
|
758
|
+
last -> 0 < w.api().size || saysNotAProvider(last)
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
assertEquals(0, w.api().size,
|
|
762
|
+
"a malformed providers entry was DROPPED and the shortened chain sent " +
|
|
763
|
+
"an UNAUTHENTICATED request: " + w.wire())
|
|
764
|
+
assertNotNull(err, "the entity op must fail when the chain cannot be built")
|
|
765
|
+
assertTrue(saysNotAProvider(err),
|
|
766
|
+
"the refusal must carry sekreto's own message ($NOTAPROVIDER), got: " +
|
|
767
|
+
messageOf(err))
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
@Test
|
|
771
|
+
fun aMalformedProviderEntryFailsDirectRatherThanSending() {
|
|
772
|
+
// CONTROL FIRST.
|
|
773
|
+
val control = Wire()
|
|
774
|
+
val res = secretsClient(control, map(
|
|
775
|
+
"allow" to map("op" to "direct,graphql"),
|
|
776
|
+
"feature" to chainOpts(working("INITKEY01")),
|
|
777
|
+
)).direct(map("path" to "/thing"))
|
|
778
|
+
assertEquals(true, res["ok"], "the control request failed: " + res["err"])
|
|
779
|
+
assertEquals(1, control.api().size,
|
|
780
|
+
"the control request did not reach system.fetch exactly once, so " +
|
|
781
|
+
"this test cannot observe a request going out at all: " + control.wire())
|
|
782
|
+
credentialIs(control.api()[0].auth, "INITKEY01")
|
|
783
|
+
|
|
784
|
+
// THE RULE. direct() runs no feature hook at all, so the ONLY thing
|
|
785
|
+
// that can refuse it is the transport gate.
|
|
786
|
+
val w = Wire()
|
|
787
|
+
val out = secretsClient(w, map(
|
|
788
|
+
"allow" to map("op" to "direct,graphql"),
|
|
789
|
+
"feature" to chainOpts(MALFORMED),
|
|
790
|
+
)).direct(map("path" to "/thing"))
|
|
791
|
+
|
|
792
|
+
assertEquals(0, w.api().size,
|
|
793
|
+
"a malformed providers entry was DROPPED and the shortened chain sent " +
|
|
794
|
+
"an UNAUTHENTICATED direct request: " + w.wire())
|
|
795
|
+
assertEquals(false, out["ok"],
|
|
796
|
+
"a chain that could not be built must refuse the raw path fail-closed")
|
|
797
|
+
assertTrue(saysNotAProvider(out["err"]),
|
|
798
|
+
"the refusal must carry sekreto's own message ($NOTAPROVIDER), got: " +
|
|
799
|
+
messageOf(out["err"] as? Throwable))
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
@Test
|
|
803
|
+
fun aMalformedProviderEntryFailsGraphqlRatherThanSending() {
|
|
804
|
+
// CONTROL FIRST.
|
|
805
|
+
val control = Wire()
|
|
806
|
+
val res = secretsClient(control, map(
|
|
807
|
+
"allow" to map("op" to "direct,graphql"),
|
|
808
|
+
"feature" to chainOpts(working("INITKEY01")),
|
|
809
|
+
)).graphql("{ thing }", null, null)
|
|
810
|
+
assertEquals(true, res["ok"], "the control request failed: " + res["err"])
|
|
811
|
+
assertEquals(1, control.api().size,
|
|
812
|
+
"the control request did not reach system.fetch exactly once, so " +
|
|
813
|
+
"this test cannot observe a request going out at all: " + control.wire())
|
|
814
|
+
credentialIs(control.api()[0].auth, "INITKEY01")
|
|
815
|
+
|
|
816
|
+
// THE RULE.
|
|
817
|
+
val w = Wire()
|
|
818
|
+
val out = secretsClient(w, map(
|
|
819
|
+
"allow" to map("op" to "direct,graphql"),
|
|
820
|
+
"feature" to chainOpts(MALFORMED),
|
|
821
|
+
)).graphql("{ thing }", null, null)
|
|
822
|
+
|
|
823
|
+
assertEquals(0, w.api().size,
|
|
824
|
+
"a malformed providers entry was DROPPED and the shortened chain sent " +
|
|
825
|
+
"an UNAUTHENTICATED graphql request: " + w.wire())
|
|
826
|
+
assertEquals(false, out["ok"],
|
|
827
|
+
"a chain that could not be built must refuse graphql fail-closed")
|
|
828
|
+
assertTrue(saysNotAProvider(out["err"]),
|
|
829
|
+
"the refusal must carry sekreto's own message ($NOTAPROVIDER), got: " +
|
|
830
|
+
messageOf(out["err"] as? Throwable))
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
@Test
|
|
834
|
+
fun aProviderRecoversAfterATransientFailure() {
|
|
835
|
+
var calls = 0
|
|
836
|
+
val w = Wire()
|
|
837
|
+
val client = secretsClient(w, map(
|
|
838
|
+
"feature" to chainOpts(TestProvider({ _ ->
|
|
839
|
+
val n = synchronized(this) { ++calls }
|
|
840
|
+
if (1 == n) {
|
|
841
|
+
throw RuntimeException("vault unreachable")
|
|
842
|
+
}
|
|
843
|
+
"RECOVERED01"
|
|
844
|
+
}, "flaky:test")),
|
|
845
|
+
))
|
|
846
|
+
|
|
847
|
+
// A failed resolution is never cached, so the second op asks the chain
|
|
848
|
+
// again and succeeds. Holding the failure would mean a transient vault
|
|
849
|
+
// outage poisoned the client permanently.
|
|
850
|
+
driveEntityOpUntil(client, "consulted the chain") { 0 < calls }
|
|
851
|
+
assertEquals(0, w.api().size, "the first op must not reach the wire")
|
|
852
|
+
|
|
853
|
+
driveEntityOp(client, w)
|
|
854
|
+
credentialIs(w.api()[0].auth, "RECOVERED01")
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
@Test
|
|
858
|
+
fun uncachedMissRetractsTheCredential() {
|
|
859
|
+
var have = true
|
|
860
|
+
val w = Wire()
|
|
861
|
+
val client = secretsClient(w, map(
|
|
862
|
+
"feature" to chainOpts(
|
|
863
|
+
TestProvider({ _ -> if (synchronized(this) { have }) "REVOCABLE01" else null },
|
|
864
|
+
"revocable:test"),
|
|
865
|
+
map("cache" to false)),
|
|
866
|
+
))
|
|
867
|
+
|
|
868
|
+
driveEntityOp(client, w)
|
|
869
|
+
credentialIs(w.api()[0].auth, "REVOCABLE01")
|
|
870
|
+
|
|
871
|
+
synchronized(this) { have = false }
|
|
872
|
+
|
|
873
|
+
driveEntityOp(client, w)
|
|
874
|
+
val last = w.api().last()
|
|
875
|
+
assertFalse(last.hasAuth && "" != last.auth,
|
|
876
|
+
"after the chain reports a miss the retracted credential must not go " +
|
|
877
|
+
"out; the wire saw \"" + last.auth + "\"")
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
// A provider failure closes the transport gate; a later retry that
|
|
881
|
+
// SUCCEEDS reopens it and every waiting operation goes out with the FRESH
|
|
882
|
+
// credential - never the stale pre-failure header, and never nothing.
|
|
883
|
+
@Test
|
|
884
|
+
fun gateRecoveryLetsWaitingOperationsOutWithTheFreshCredential() {
|
|
885
|
+
var mode = "fail"
|
|
886
|
+
val release = CountDownLatch(1)
|
|
887
|
+
val w = Wire()
|
|
888
|
+
|
|
889
|
+
val client = secretsClient(w, map(
|
|
890
|
+
"feature" to chainOpts(
|
|
891
|
+
TestProvider({ _ ->
|
|
892
|
+
val m = synchronized(this) { mode }
|
|
893
|
+
if ("fail" == m) {
|
|
894
|
+
throw RuntimeException("vault unreachable")
|
|
895
|
+
}
|
|
896
|
+
if ("slow" == m) {
|
|
897
|
+
release.await(5, TimeUnit.SECONDS)
|
|
898
|
+
}
|
|
899
|
+
"FRESH01"
|
|
900
|
+
}, "gate:test"),
|
|
901
|
+
map("cache" to false)),
|
|
902
|
+
))
|
|
903
|
+
|
|
904
|
+
// 1. The failure closes the gate: nothing reaches the wire. Stop on
|
|
905
|
+
// EITHER outcome, so an op the API does not define (which fails before
|
|
906
|
+
// the transport) is not mistaken for the gate's refusal.
|
|
907
|
+
driveEntityOpUntil(client, "was refused by the gate or sent one") {
|
|
908
|
+
last -> 0 < w.api().size || messageOf(last).contains("vault unreachable")
|
|
909
|
+
}
|
|
910
|
+
assertEquals(0, w.api().size,
|
|
911
|
+
"a failed resolution must keep the wire silent, saw: " + w.wire())
|
|
912
|
+
|
|
913
|
+
// 2. Recovery under concurrency: two operations race the slow retry;
|
|
914
|
+
// both must come out carrying the fresh credential.
|
|
915
|
+
synchronized(this) { mode = "slow" }
|
|
916
|
+
|
|
917
|
+
// Each thread drives until SOMETHING reached the wire - its own op or
|
|
918
|
+
// the other thread's - which is the state the assertion reads.
|
|
919
|
+
val threads = (1..2).map {
|
|
920
|
+
Thread { driveEntityOpUntil(client, "recovered") { 0 < w.api().size } }
|
|
921
|
+
}
|
|
922
|
+
threads.forEach { it.start() }
|
|
923
|
+
Thread.sleep(50)
|
|
924
|
+
release.countDown()
|
|
925
|
+
threads.forEach { it.join(10000) }
|
|
926
|
+
|
|
927
|
+
assertTrue(0 < w.api().size, "recovery must let the operations out")
|
|
928
|
+
for (call in w.api()) {
|
|
929
|
+
credentialIs(call.auth, "FRESH01")
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
// ===================================================================
|
|
934
|
+
// ACCESS-TOKEN EXCHANGE.
|
|
935
|
+
//
|
|
936
|
+
// What the chain resolves is a REFRESH token, which is POSTed to a token
|
|
937
|
+
// endpoint for a short-lived ACCESS token; the access token is what the
|
|
938
|
+
// Authorization header carries; and when the API answers 401 the client
|
|
939
|
+
// buys another and tries the same request again, once.
|
|
940
|
+
|
|
941
|
+
private fun exchangeClient(
|
|
942
|
+
w: Wire,
|
|
943
|
+
refresh: String,
|
|
944
|
+
exchange: MutableMap<String, Any?>?,
|
|
945
|
+
extra: MutableMap<String, Any?>?,
|
|
946
|
+
): ProjectNameSDK {
|
|
947
|
+
val x = map("active" to true)
|
|
948
|
+
if (exchange != null) {
|
|
949
|
+
x.putAll(exchange)
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
val fopts = map(
|
|
953
|
+
"active" to true,
|
|
954
|
+
"name" to "refresh_token",
|
|
955
|
+
"providers" to mutableListOf<Any?>(
|
|
956
|
+
if ("" == refresh) TestProvider({ null }, "norefresh:test")
|
|
957
|
+
else TestProvider(
|
|
958
|
+
{ name -> if ("refresh_token" == name) refresh else null }, "refresh:test")),
|
|
959
|
+
"exchange" to x,
|
|
960
|
+
)
|
|
961
|
+
|
|
962
|
+
val opts = map("allow" to map("op" to "direct,graphql"), "feature" to map("secrets" to fopts))
|
|
963
|
+
if (extra != null) {
|
|
964
|
+
opts.putAll(extra)
|
|
965
|
+
}
|
|
966
|
+
return secretsClient(w, opts)
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
private fun bodyField(body: String, field: String): String? {
|
|
970
|
+
val parsed = KOTLINPACKAGE.utility.Json.parse(body)
|
|
971
|
+
return (parsed as? Map<String, Any?>)?.get(field) as? String
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
@Test
|
|
975
|
+
fun theRefreshTokenBuysAnAccessTokenAndTheRequestCarriesIt() {
|
|
976
|
+
val w = Wire()
|
|
977
|
+
val client = exchangeClient(w, "REFRESH01", null, null)
|
|
978
|
+
|
|
979
|
+
client.direct(map("path" to "/thing"))
|
|
980
|
+
|
|
981
|
+
assertEquals(1, w.token().size, "expected exactly one token purchase")
|
|
982
|
+
assertEquals("REFRESH01", bodyField(w.token()[0].body, "refresh_token"),
|
|
983
|
+
"the refresh token is sent in the request field")
|
|
984
|
+
assertEquals(1, w.api().size)
|
|
985
|
+
credentialIs(w.api()[0].auth, "ACCESS01")
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
@Test
|
|
989
|
+
fun theRefreshTokenIsMarshalledNotConcatenated() {
|
|
990
|
+
// A refresh token carrying a quote, backslash or newline must arrive as
|
|
991
|
+
// that literal value, not as malformed JSON.
|
|
992
|
+
val tricky = "re\"fresh\\to\nken"
|
|
993
|
+
val w = Wire()
|
|
994
|
+
val client = exchangeClient(w, "", map("refresh" to tricky), null)
|
|
995
|
+
|
|
996
|
+
client.direct(map("path" to "/thing"))
|
|
997
|
+
|
|
998
|
+
assertEquals(1, w.token().size)
|
|
999
|
+
assertEquals(tricky, bodyField(w.token()[0].body, "refresh_token"),
|
|
1000
|
+
"the refresh token must arrive as its literal value: " + w.token()[0].body)
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
@Test
|
|
1004
|
+
fun anExplicitExchangeRefreshWinsOverTheChain() {
|
|
1005
|
+
val w = Wire()
|
|
1006
|
+
val client = exchangeClient(w, "FROMCHAIN", map("refresh" to "EXPLICIT01"), null)
|
|
1007
|
+
|
|
1008
|
+
client.direct(map("path" to "/thing"))
|
|
1009
|
+
assertEquals("EXPLICIT01", bodyField(w.token()[0].body, "refresh_token"))
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
@Test
|
|
1013
|
+
fun onePurchaseServesManyRequests() {
|
|
1014
|
+
val w = Wire()
|
|
1015
|
+
val client = exchangeClient(w, "REFRESH01", null, null)
|
|
1016
|
+
|
|
1017
|
+
client.direct(map("path" to "/one"))
|
|
1018
|
+
client.direct(map("path" to "/two"))
|
|
1019
|
+
client.direct(map("path" to "/three"))
|
|
1020
|
+
|
|
1021
|
+
assertEquals(1, w.token().size, "a token still working must not be re-bought")
|
|
1022
|
+
assertEquals(3, w.api().size)
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
@Test
|
|
1026
|
+
fun concurrentFirstRequestsShareOnePurchase() {
|
|
1027
|
+
val w = Wire()
|
|
1028
|
+
val client = exchangeClient(w, "REFRESH01", null, null)
|
|
1029
|
+
|
|
1030
|
+
val threads = listOf("/a", "/b", "/c", "/d").map { p ->
|
|
1031
|
+
Thread { client.direct(map("path" to p)) }
|
|
1032
|
+
}
|
|
1033
|
+
threads.forEach { it.start() }
|
|
1034
|
+
threads.forEach { it.join(10000) }
|
|
1035
|
+
|
|
1036
|
+
assertEquals(1, w.token().size,
|
|
1037
|
+
"four operations at once must not open four token requests")
|
|
1038
|
+
assertEquals(4, w.api().size)
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
@Test
|
|
1042
|
+
fun anExpiryBuysAnotherTokenAndRetriesTheSameRequest() {
|
|
1043
|
+
val w = Wire()
|
|
1044
|
+
w.apistatus = listOf(401, 200)
|
|
1045
|
+
val client = exchangeClient(w, "REFRESH01", null, null)
|
|
1046
|
+
|
|
1047
|
+
val res = client.direct(map("path" to "/thing"))
|
|
1048
|
+
|
|
1049
|
+
assertEquals(2, w.token().size, "expected a second token purchase")
|
|
1050
|
+
assertEquals(2, w.api().size, "expected the request to be retried")
|
|
1051
|
+
credentialIs(w.api()[0].auth, "ACCESS01")
|
|
1052
|
+
// The retry must carry the NEW token, not the spent one.
|
|
1053
|
+
credentialIs(w.api()[1].auth, "ACCESS02")
|
|
1054
|
+
assertEquals(true, res["ok"], "the caller sees the successful retry")
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
@Test
|
|
1058
|
+
fun theRetryHappensOnceNotInALoop() {
|
|
1059
|
+
val w = Wire()
|
|
1060
|
+
w.apistatus = listOf(401)
|
|
1061
|
+
val client = exchangeClient(w, "REFRESH01", null, null)
|
|
1062
|
+
|
|
1063
|
+
client.direct(map("path" to "/thing"))
|
|
1064
|
+
|
|
1065
|
+
assertEquals(2, w.api().size, "exactly one retry")
|
|
1066
|
+
assertEquals(2, w.token().size)
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
@Test
|
|
1070
|
+
fun aStatusOutsideExchangeStatusesIsNotAnExpiry() {
|
|
1071
|
+
val w = Wire()
|
|
1072
|
+
w.apistatus = listOf(403)
|
|
1073
|
+
val client = exchangeClient(w, "REFRESH01", null, null)
|
|
1074
|
+
|
|
1075
|
+
client.direct(map("path" to "/thing"))
|
|
1076
|
+
|
|
1077
|
+
assertEquals(1, w.api().size, "403 is not in the default statuses")
|
|
1078
|
+
assertEquals(1, w.token().size)
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
@Test
|
|
1082
|
+
fun exchangeStatusesIsConfigurable() {
|
|
1083
|
+
val w = Wire()
|
|
1084
|
+
w.apistatus = listOf(403, 200)
|
|
1085
|
+
val client = exchangeClient(w, "REFRESH01",
|
|
1086
|
+
map("statuses" to mutableListOf<Any?>(403)), null)
|
|
1087
|
+
|
|
1088
|
+
client.direct(map("path" to "/thing"))
|
|
1089
|
+
assertEquals(2, w.api().size, "403 was declared an expiry")
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
@Test
|
|
1093
|
+
fun theRequestAndResponseFieldNamesAndPathAreConfigurable() {
|
|
1094
|
+
val w = Wire()
|
|
1095
|
+
w.tokenpath = "oauth/grant"
|
|
1096
|
+
w.respfield = "token"
|
|
1097
|
+
val client = exchangeClient(w, "REFRESH01", map(
|
|
1098
|
+
"path" to "oauth/grant",
|
|
1099
|
+
"request" to "grant",
|
|
1100
|
+
"response" to "token",
|
|
1101
|
+
), null)
|
|
1102
|
+
|
|
1103
|
+
client.direct(map("path" to "/thing"))
|
|
1104
|
+
|
|
1105
|
+
assertEquals(1, w.token().size)
|
|
1106
|
+
assertTrue(w.token()[0].url.endsWith("/oauth/grant"),
|
|
1107
|
+
"the token endpoint is relative to base: " + w.token()[0].url)
|
|
1108
|
+
assertEquals("REFRESH01", bodyField(w.token()[0].body, "grant"))
|
|
1109
|
+
credentialIs(w.api()[0].auth, "ACCESS01")
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
@Test
|
|
1113
|
+
fun anExplicitApikeyIsSpentBeforeAnythingIsBought() {
|
|
1114
|
+
val w = Wire()
|
|
1115
|
+
val client = exchangeClient(w, "REFRESH01", null, map("apikey" to "HELDTOKEN01"))
|
|
1116
|
+
|
|
1117
|
+
client.direct(map("path" to "/thing"))
|
|
1118
|
+
|
|
1119
|
+
assertEquals(0, w.token().size, "nothing needed buying")
|
|
1120
|
+
credentialIs(w.api()[0].auth, "HELDTOKEN01")
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
@Test
|
|
1124
|
+
fun aHeldApikeyThatHasExpiredFallsThroughToTheExchange() {
|
|
1125
|
+
val w = Wire()
|
|
1126
|
+
w.apistatus = listOf(401, 200)
|
|
1127
|
+
val client = exchangeClient(w, "REFRESH01", null, map("apikey" to "STALETOKEN01"))
|
|
1128
|
+
|
|
1129
|
+
client.direct(map("path" to "/thing"))
|
|
1130
|
+
|
|
1131
|
+
credentialIs(w.api()[0].auth, "STALETOKEN01")
|
|
1132
|
+
credentialIs(w.api()[1].auth, "ACCESS01")
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
@Test
|
|
1136
|
+
fun noRefreshTokenAnywhereIsAnErrorNotAnUnauthenticatedCall() {
|
|
1137
|
+
val w = Wire()
|
|
1138
|
+
val client = exchangeClient(w, "", null, null)
|
|
1139
|
+
|
|
1140
|
+
val res = client.direct(map("path" to "/thing"))
|
|
1141
|
+
|
|
1142
|
+
assertEquals(false, res["ok"], "expected a failure, got: $res")
|
|
1143
|
+
assertEquals(0, w.api().size,
|
|
1144
|
+
"a request must not go out unauthenticated because the chain was " +
|
|
1145
|
+
"empty: " + w.wire())
|
|
1146
|
+
assertTrue(messageOf(res["err"] as? Throwable).contains("no refresh token"),
|
|
1147
|
+
"expected the no-refresh-token refusal, got: " +
|
|
1148
|
+
messageOf(res["err"] as? Throwable))
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
@Test
|
|
1152
|
+
fun aFailingTokenEndpointSurfacesTheApiRefusalNotASpin() {
|
|
1153
|
+
val w = Wire()
|
|
1154
|
+
w.apistatus = listOf(401)
|
|
1155
|
+
// The first purchase succeeds; the second (after the 401) does not.
|
|
1156
|
+
w.tokenok = 1
|
|
1157
|
+
val client = exchangeClient(w, "REFRESH01", null, null)
|
|
1158
|
+
|
|
1159
|
+
val res = client.direct(map("path" to "/thing"))
|
|
1160
|
+
|
|
1161
|
+
assertNotNull(res, "the caller got an answer rather than a hang")
|
|
1162
|
+
assertEquals(1, w.api().size, "no retry after a failed purchase")
|
|
1163
|
+
assertEquals(false, res["ok"], "the API's own 401 is what the caller sees")
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
@Test
|
|
1167
|
+
fun authNullSuppressesTheCredentialRefusalOrNot() {
|
|
1168
|
+
val w = Wire()
|
|
1169
|
+
w.apistatus = listOf(401)
|
|
1170
|
+
val client = exchangeClient(w, "REFRESH01", null, map("auth" to null))
|
|
1171
|
+
|
|
1172
|
+
client.direct(map("path" to "/thing"))
|
|
1173
|
+
|
|
1174
|
+
assertEquals(1, w.api().size, "a suppressed request must not be retried")
|
|
1175
|
+
assertFalse(w.api()[0].hasAuth,
|
|
1176
|
+
"no credential may be sent when auth is suppressed, got \"" +
|
|
1177
|
+
w.api()[0].auth + "\"")
|
|
1178
|
+
|
|
1179
|
+
// AND NO PURCHASE. resolve() runs before withrefresh's suppression
|
|
1180
|
+
// check, so the refresh token used to go to the token endpoint in a
|
|
1181
|
+
// request body even here. Stopping the retry does not unsend it, and
|
|
1182
|
+
// only the token endpoint can see this.
|
|
1183
|
+
assertEquals(0, w.token().size,
|
|
1184
|
+
"auth null suppressed the credential but the refresh token was still " +
|
|
1185
|
+
"POSTed to the exchange endpoint")
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
@Test
|
|
1189
|
+
fun testModeBuysNothingAndNeedsNoTokenEndpoint() {
|
|
1190
|
+
val w = Wire()
|
|
1191
|
+
|
|
1192
|
+
val client = withSecrets { extend ->
|
|
1193
|
+
val opts = map(
|
|
1194
|
+
"base" to BASE,
|
|
1195
|
+
"allow" to map("op" to "direct,graphql"),
|
|
1196
|
+
"system" to map("fetch" to w.fetch),
|
|
1197
|
+
"feature" to map("secrets" to map(
|
|
1198
|
+
"active" to true,
|
|
1199
|
+
"name" to "refresh_token",
|
|
1200
|
+
"providers" to mutableListOf<Any?>(TestProvider(
|
|
1201
|
+
{ name -> if ("refresh_token" == name) "REFRESH01" else null })),
|
|
1202
|
+
"exchange" to map("active" to true),
|
|
1203
|
+
)),
|
|
1204
|
+
)
|
|
1205
|
+
if (extend) {
|
|
1206
|
+
opts["extend"] = mutableListOf<Any?>(SecretsFeature())
|
|
1207
|
+
}
|
|
1208
|
+
ProjectNameSDK.testSDK(null, opts)
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1211
|
+
client.direct(map("path" to "/thing"))
|
|
1212
|
+
|
|
1213
|
+
assertEquals(0, w.calls().size, "test mode must not do IO: " + w.wire())
|
|
1214
|
+
// A deterministic placeholder, so offline suites need no configuration.
|
|
1215
|
+
assertEquals("test-access_token", secretsFeatureOf(client)!!.credential())
|
|
1216
|
+
}
|
|
1217
|
+
}
|