@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,1042 @@
|
|
|
1
|
+
// Behavioural tests for the secrets feature (vendored @voxgig/sekreto) - the
|
|
2
|
+
// scala port of tm/go/test/feature/secrets/secrets_feature_test.go.
|
|
3
|
+
//
|
|
4
|
+
// The contract under test: the `apikey` OPTION keeps its exact old meaning
|
|
5
|
+
// and always wins, because SecretsFeature places it FIRST in the provider
|
|
6
|
+
// chain (a `memory` store named `options`) - explicit-beats-lookup falls out
|
|
7
|
+
// of sekreto's first-hit rule rather than from special-case logic. With the
|
|
8
|
+
// feature inactive nothing changes at all. With it active and the option
|
|
9
|
+
// unset, the chain supplies the credential instead.
|
|
10
|
+
//
|
|
11
|
+
// EVERY ASSERTION IS ON THE WIRE. Each case builds a LIVE client whose
|
|
12
|
+
// `system.fetch` is the recorder below, so the thing being counted IS the
|
|
13
|
+
// transport - not a harness mock that replaced it. That distinction is the
|
|
14
|
+
// whole difference between a fail-closed test and a test that would pass on
|
|
15
|
+
// an SDK with no secrets feature at all: under the test-mode harness the
|
|
16
|
+
// TestFeature swaps `ctx.utility.fetcher` for its own in-memory mock, so a
|
|
17
|
+
// counter hung off `system.fetch` is never reached and "no request went out"
|
|
18
|
+
// holds vacuously. So each fail-closed case carries a CONTROL leg - the same
|
|
19
|
+
// construction with a WORKING provider - which must reach the same recorder
|
|
20
|
+
// exactly once, and the refusal is matched on the PROVIDER'S OWN message so
|
|
21
|
+
// that an unrelated failure cannot stand in for fail-closed.
|
|
22
|
+
//
|
|
23
|
+
// The feature is CONSTRUCTED DIRECTLY and handed in through the `extend`
|
|
24
|
+
// option when the generated config did not already install it, so these
|
|
25
|
+
// tests hold in any generated tree - whether or not the project's model
|
|
26
|
+
// activated the feature.
|
|
27
|
+
//
|
|
28
|
+
// This file lives in the `feature/` container on purpose: it is per-feature
|
|
29
|
+
// source, and travels with the feature.
|
|
30
|
+
|
|
31
|
+
import java.util.{ArrayList, LinkedHashMap, List => JList, Map => JMap}
|
|
32
|
+
import java.util.function.{BiFunction, Supplier}
|
|
33
|
+
|
|
34
|
+
import scala.collection.mutable.ListBuffer
|
|
35
|
+
|
|
36
|
+
import SCALAPACKAGE.core._
|
|
37
|
+
import SCALAPACKAGE.feature._
|
|
38
|
+
import SCALAPACKAGE.utility.Json
|
|
39
|
+
|
|
40
|
+
object SecretsTestMain {
|
|
41
|
+
|
|
42
|
+
// ---- assertion harness --------------------------------------------------
|
|
43
|
+
|
|
44
|
+
private var npass = 0
|
|
45
|
+
private val failures = new ArrayList[String]()
|
|
46
|
+
|
|
47
|
+
private def pass(): Unit = { npass += 1 }
|
|
48
|
+
private def fail(name: String, msg: String): Unit = failures.add(name + ": " + msg)
|
|
49
|
+
private def check(name: String, cond: Boolean, msg: String): Unit =
|
|
50
|
+
if (cond) pass() else fail(name, msg)
|
|
51
|
+
private def eqs(name: String, exp: String, act: String): Unit =
|
|
52
|
+
check(name, exp == act, "expected \"" + exp + "\", got \"" + act + "\"")
|
|
53
|
+
private def eqs(name: String, exp: String, act: String, why: String): Unit =
|
|
54
|
+
check(name, exp == act,
|
|
55
|
+
"expected \"" + exp + "\", got \"" + act + "\" - " + why)
|
|
56
|
+
private def eqi(name: String, exp: Int, act: Int): Unit =
|
|
57
|
+
check(name, exp == act, "expected " + exp + ", got " + act)
|
|
58
|
+
|
|
59
|
+
// The Authorization header carries the SPEC's credential prefix, which a
|
|
60
|
+
// TEMPLATE cannot know: an OpenAPI `http`/`bearer` scheme gives `Bearer
|
|
61
|
+
// <token>`, an apiKey scheme the raw token. So assert on the CREDENTIAL and
|
|
62
|
+
// let the prefix be whatever this SDK's API declares - pinning the whole
|
|
63
|
+
// header value passes only for a prefix-less API, and this file ships to
|
|
64
|
+
// every project that selects the feature.
|
|
65
|
+
private def credentialIs(name: String, header: String, token: String): Unit = {
|
|
66
|
+
val got = if (header == null) "" else header
|
|
67
|
+
check(name, got == token || got.endsWith(" " + token),
|
|
68
|
+
"expected the authorization header to carry " + token + ", got \"" + got + "\"")
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// ---- the recording transport --------------------------------------------
|
|
72
|
+
//
|
|
73
|
+
// system.fetch for a LIVE client: one status per API call (the last
|
|
74
|
+
// repeating), plus a token endpoint for the exchange cases.
|
|
75
|
+
|
|
76
|
+
final class Wire {
|
|
77
|
+
val calls = new ArrayList[JMap[String, Object]]()
|
|
78
|
+
var apistatus: List[Int] = List(200)
|
|
79
|
+
var tokens: List[String] = List("ACCESS01", "ACCESS02", "ACCESS03")
|
|
80
|
+
var tokenpath: String = "auth/token"
|
|
81
|
+
var respfield: String = "access_token"
|
|
82
|
+
var tokenstatus: List[Int] = List(200)
|
|
83
|
+
|
|
84
|
+
private var issued = 0
|
|
85
|
+
private var apicalls = 0
|
|
86
|
+
private var tokencalls = 0
|
|
87
|
+
|
|
88
|
+
val fetch: BiFunction[String, JMap[String, Object], Object] =
|
|
89
|
+
(url: String, fetchdef: JMap[String, Object]) => this.synchronized {
|
|
90
|
+
val headers = fetchdef.get("headers") match {
|
|
91
|
+
case m: JMap[_, _] => m.asInstanceOf[JMap[String, Object]]
|
|
92
|
+
case _ => new LinkedHashMap[String, Object]()
|
|
93
|
+
}
|
|
94
|
+
val call = new LinkedHashMap[String, Object]()
|
|
95
|
+
call.put("url", url)
|
|
96
|
+
call.put("has", java.lang.Boolean.valueOf(headers.containsKey("authorization")))
|
|
97
|
+
call.put("auth", headers.get("authorization") match {
|
|
98
|
+
case s: String => s
|
|
99
|
+
case _ => ""
|
|
100
|
+
})
|
|
101
|
+
call.put("body", fetchdef.get("body") match { case s: String => s; case _ => "" })
|
|
102
|
+
calls.add(call)
|
|
103
|
+
|
|
104
|
+
if (url.endsWith("/" + tokenpath)) {
|
|
105
|
+
val status = tokenstatus(math.min(tokencalls, tokenstatus.length - 1))
|
|
106
|
+
tokencalls += 1
|
|
107
|
+
val token = tokens(math.min(issued, tokens.length - 1))
|
|
108
|
+
issued += 1
|
|
109
|
+
val payload = new LinkedHashMap[String, Object]()
|
|
110
|
+
if (200 <= status && 300 > status) payload.put(respfield, token)
|
|
111
|
+
else payload.put("error", "nope")
|
|
112
|
+
response(status, payload)
|
|
113
|
+
} else {
|
|
114
|
+
val status = apistatus(math.min(apicalls, apistatus.length - 1))
|
|
115
|
+
apicalls += 1
|
|
116
|
+
val payload = new LinkedHashMap[String, Object]()
|
|
117
|
+
payload.put("ok", java.lang.Boolean.valueOf(400 > status))
|
|
118
|
+
response(status, payload)
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
private def response(status: Int, data: JMap[String, Object]): JMap[String, Object] = {
|
|
123
|
+
val js: Supplier[Object] = () => data
|
|
124
|
+
val out = new LinkedHashMap[String, Object]()
|
|
125
|
+
out.put("status", java.lang.Integer.valueOf(status))
|
|
126
|
+
out.put("statusText", if (400 <= status) "ERR" else "OK")
|
|
127
|
+
out.put("headers", new LinkedHashMap[String, Object]())
|
|
128
|
+
out.put("json", js)
|
|
129
|
+
out
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
private def matching(token: Boolean): List[JMap[String, Object]] = {
|
|
133
|
+
val out = ListBuffer.empty[JMap[String, Object]]
|
|
134
|
+
val it = calls.iterator()
|
|
135
|
+
while (it.hasNext) {
|
|
136
|
+
val c = it.next()
|
|
137
|
+
val url = c.get("url") match { case s: String => s; case _ => "" }
|
|
138
|
+
if (url.endsWith("/" + tokenpath) == token) out += c
|
|
139
|
+
}
|
|
140
|
+
out.toList
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Only the calls that went to the API, and only those that went to the
|
|
144
|
+
// token endpoint.
|
|
145
|
+
def api(): List[JMap[String, Object]] = matching(false)
|
|
146
|
+
def token(): List[JMap[String, Object]] = matching(true)
|
|
147
|
+
|
|
148
|
+
def authof(call: JMap[String, Object]): String =
|
|
149
|
+
call.get("auth") match { case s: String => s; case _ => "" }
|
|
150
|
+
def hasauth(call: JMap[String, Object]): Boolean =
|
|
151
|
+
java.lang.Boolean.TRUE == call.get("has")
|
|
152
|
+
|
|
153
|
+
// What went out, for a failure message that names the leak rather than
|
|
154
|
+
// just its count.
|
|
155
|
+
def report(): String =
|
|
156
|
+
api().map(c => String.valueOf(c.get("url")) + " auth=\"" + authof(c) + "\"")
|
|
157
|
+
.mkString(", ")
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// ---- small builders ------------------------------------------------------
|
|
161
|
+
|
|
162
|
+
private val ENVPREFIX = "PROJECTENV_TEST_SECRETS_"
|
|
163
|
+
private val BASE = "http://secrets.test/api"
|
|
164
|
+
|
|
165
|
+
private def jmap(kv: (String, Object)*): JMap[String, Object] = {
|
|
166
|
+
val m = new LinkedHashMap[String, Object]()
|
|
167
|
+
kv.foreach { case (k, v) => m.put(k, v) }
|
|
168
|
+
m
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private def jlist(xs: Object*): JList[Object] = {
|
|
172
|
+
val l = new ArrayList[Object]()
|
|
173
|
+
xs.foreach(l.add)
|
|
174
|
+
l
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
private def sdkopts(w: Wire, extra: (String, Object)*): JMap[String, Object] = {
|
|
178
|
+
val opts = jmap("base" -> BASE, "system" -> jmap("fetch" -> w.fetch))
|
|
179
|
+
extra.foreach { case (k, v) => opts.put(k, v) }
|
|
180
|
+
opts
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// The feature options: a chain of one MEMORY store unless a case says
|
|
184
|
+
// otherwise. `memory` rather than `env` because a JVM cannot set its own
|
|
185
|
+
// environment - see the `env` case at the end, which proves the env
|
|
186
|
+
// built-in is live by reading a variable that is already there.
|
|
187
|
+
private def secretsOpts(providers: JList[Object], extra: (String, Object)*): JMap[String, Object] = {
|
|
188
|
+
val fopts = jmap(
|
|
189
|
+
"active" -> java.lang.Boolean.TRUE,
|
|
190
|
+
"providers" -> providers,
|
|
191
|
+
)
|
|
192
|
+
extra.foreach { case (k, v) => fopts.put(k, v) }
|
|
193
|
+
jmap("secrets" -> fopts)
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
private def memchain(values: (String, Object)*): JList[Object] =
|
|
197
|
+
jlist(jmap("kind" -> "memory", "values" -> jmap(values*)))
|
|
198
|
+
|
|
199
|
+
private def secretsFeatureOf(client: ProjectNameSDK): SecretsFeature = {
|
|
200
|
+
val it = client.features.iterator()
|
|
201
|
+
while (it.hasNext) it.next() match {
|
|
202
|
+
case sf: SecretsFeature => return sf
|
|
203
|
+
case _ =>
|
|
204
|
+
}
|
|
205
|
+
null
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Build the client and ADOPT the feature via `extend` ONLY when the
|
|
209
|
+
// generated config did not already install it - when this SDK was
|
|
210
|
+
// generated with `secrets` model-active the ordinary factory path builds
|
|
211
|
+
// the instance, and adding a second via extend would DOUBLE the feature:
|
|
212
|
+
// two transport wraps, two resolutions, and a token purchase the
|
|
213
|
+
// assertions could not account for. (go's withSecrets and py's
|
|
214
|
+
// _has_feature guard the same way.)
|
|
215
|
+
private def withSecrets(build: Boolean => ProjectNameSDK): ProjectNameSDK = {
|
|
216
|
+
val client = build(false)
|
|
217
|
+
if (null == secretsFeatureOf(client)) build(true) else client
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
private def secretsClient(w: Wire, extra: (String, Object)*): ProjectNameSDK =
|
|
221
|
+
withSecrets { extend =>
|
|
222
|
+
val opts = sdkopts(w, extra*)
|
|
223
|
+
if (extend) opts.put("extend", jlist(new SecretsFeature()))
|
|
224
|
+
new ProjectNameSDK(opts)
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
private def testModeClient(w: Wire, extra: (String, Object)*): ProjectNameSDK =
|
|
228
|
+
withSecrets { extend =>
|
|
229
|
+
val opts = sdkopts(w, extra*)
|
|
230
|
+
if (extend) opts.put("extend", jlist(new SecretsFeature()))
|
|
231
|
+
ProjectNameSDK.testSDK(null, opts)
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// ---- driving real entity operations --------------------------------------
|
|
235
|
+
//
|
|
236
|
+
// Entity names are unknown to a TEMPLATE, so the accessors are found by
|
|
237
|
+
// SHAPE: a one-argument method taking a Map and returning an SdkEntity is
|
|
238
|
+
// what MainEntity emits for every entity. Each op's own outcome is
|
|
239
|
+
// irrelevant (no seeded data, a scripted response); an op the API does not
|
|
240
|
+
// define fails before it reaches the transport, which is why several may
|
|
241
|
+
// need driving.
|
|
242
|
+
|
|
243
|
+
private def entities(client: ProjectNameSDK): List[SdkEntity] = {
|
|
244
|
+
val out = ListBuffer.empty[SdkEntity]
|
|
245
|
+
for (m <- client.getClass.getMethods) {
|
|
246
|
+
if (1 == m.getParameterCount &&
|
|
247
|
+
classOf[JMap[_, _]].isAssignableFrom(m.getParameterTypes()(0)) &&
|
|
248
|
+
classOf[SdkEntity].isAssignableFrom(m.getReturnType)) {
|
|
249
|
+
try m.invoke(client, Array[Object](null)*) match {
|
|
250
|
+
case e: SdkEntity => out += e
|
|
251
|
+
case _ =>
|
|
252
|
+
}
|
|
253
|
+
catch { case _: Throwable => }
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
out.toList
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Drive entity ops until `stop` reports the state the case is waiting for.
|
|
260
|
+
// Returns the last error thrown by an op, which is where a fail-closed
|
|
261
|
+
// refusal surfaces on the entity path.
|
|
262
|
+
private def driveUntil(client: ProjectNameSDK, stop: () => Boolean): (Boolean, String) = {
|
|
263
|
+
var lasterr = ""
|
|
264
|
+
var done = false
|
|
265
|
+
// A plain while, not a for-comprehension: a `return` out of a
|
|
266
|
+
// for-comprehension is a NON-LOCAL return, which scala 3 has deprecated.
|
|
267
|
+
val ops = entities(client).flatMap(ent => List(() => ent.list(null, null), () => ent.load(null, null)))
|
|
268
|
+
var index = 0
|
|
269
|
+
while (!done && index < ops.length) {
|
|
270
|
+
try ops(index)()
|
|
271
|
+
catch { case err: Throwable => lasterr = errtext(err) }
|
|
272
|
+
if (stop()) done = true
|
|
273
|
+
index += 1
|
|
274
|
+
}
|
|
275
|
+
(done, lasterr)
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// An op's failure, with its causes: an SdkError names the operation and
|
|
279
|
+
// carries the underlying refusal beneath it.
|
|
280
|
+
private def errtext(err: Throwable): String = {
|
|
281
|
+
val out = new StringBuilder()
|
|
282
|
+
var cur: Throwable = err
|
|
283
|
+
var depth = 0
|
|
284
|
+
while (cur != null && depth < 8) {
|
|
285
|
+
out.append(String.valueOf(cur.getMessage)).append(" | ")
|
|
286
|
+
cur = cur.getCause
|
|
287
|
+
depth += 1
|
|
288
|
+
}
|
|
289
|
+
out.toString
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Drive until ONE request reaches the recorder.
|
|
293
|
+
private def driveOneCall(client: ProjectNameSDK, w: Wire): Boolean = {
|
|
294
|
+
val before = w.api().length
|
|
295
|
+
driveUntil(client, () => before < w.api().length)._1
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// ---- providers written in code -------------------------------------------
|
|
299
|
+
|
|
300
|
+
final class CodeProvider(
|
|
301
|
+
val answer: String => Option[String],
|
|
302
|
+
val label: String = "custom",
|
|
303
|
+
) extends com.voxgig.sekreto.Provider {
|
|
304
|
+
val asked = new ArrayList[String]()
|
|
305
|
+
override def lookup(name: String): Option[String] = {
|
|
306
|
+
asked.add(name)
|
|
307
|
+
answer(name)
|
|
308
|
+
}
|
|
309
|
+
override def describe(): String = label + ":test"
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
private def broken(): CodeProvider =
|
|
313
|
+
new CodeProvider(_ => throw new com.voxgig.sekreto.SekretoError("vault unreachable"), "broken")
|
|
314
|
+
|
|
315
|
+
private def working(token: String): CodeProvider =
|
|
316
|
+
new CodeProvider(name => if ("apikey" == name) Some(token) else None, "working")
|
|
317
|
+
|
|
318
|
+
// =========================================================================
|
|
319
|
+
// The feature-inactive baseline: bit-identical behaviour.
|
|
320
|
+
|
|
321
|
+
private def testInactive(): Unit = {
|
|
322
|
+
val client = ProjectNameSDK.testSDK(null, jmap("apikey" -> "OPTKEY01"))
|
|
323
|
+
val fetchdef = client.prepare(jmap("path" -> "/"))
|
|
324
|
+
val headers = fetchdef.get("headers").asInstanceOf[JMap[String, Object]]
|
|
325
|
+
credentialIs("inactive.apikey", headers.get("authorization").asInstanceOf[String], "OPTKEY01")
|
|
326
|
+
|
|
327
|
+
check("inactive.nofeature", null == secretsFeatureOf(client),
|
|
328
|
+
"no model activation and no extend: the feature must not be installed")
|
|
329
|
+
|
|
330
|
+
val bare = ProjectNameSDK.testSDK(null, null)
|
|
331
|
+
val bareheaders = bare.prepare(jmap("path" -> "/"))
|
|
332
|
+
.get("headers").asInstanceOf[JMap[String, Object]]
|
|
333
|
+
check("inactive.noapikey", !bareheaders.containsKey("authorization"),
|
|
334
|
+
"unexpected authorization header: " + bareheaders.get("authorization"))
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// =========================================================================
|
|
338
|
+
// The chain, driven through real entity operations.
|
|
339
|
+
|
|
340
|
+
private def testOptionWins(): Unit = {
|
|
341
|
+
val w = new Wire()
|
|
342
|
+
val client = secretsClient(w,
|
|
343
|
+
"apikey" -> "OPTKEY01",
|
|
344
|
+
"feature" -> secretsOpts(memchain("APIKEY" -> "CHAINKEY01")))
|
|
345
|
+
|
|
346
|
+
check("chain.optionwins.drive", driveOneCall(client, w), "no entity op reached the transport")
|
|
347
|
+
if (w.api().nonEmpty) {
|
|
348
|
+
credentialIs("chain.optionwins", w.authof(w.api().head), "OPTKEY01")
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// The explicit option is a real STORE, not a special case: a directed
|
|
352
|
+
// read names it like any other.
|
|
353
|
+
val sf = secretsFeatureOf(client)
|
|
354
|
+
check("chain.optionwins.feature", null != sf, "the extend seam did not install the feature")
|
|
355
|
+
if (null != sf && null != sf.sekreto()) {
|
|
356
|
+
eqs("chain.optionwins.store", "OPTKEY01",
|
|
357
|
+
sf.sekreto().tryfrom("options", "apikey").getOrElse(""))
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
private def testOmittedDefers(): Unit = {
|
|
362
|
+
val w = new Wire()
|
|
363
|
+
val client = secretsClient(w,
|
|
364
|
+
"feature" -> secretsOpts(memchain("APIKEY" -> "CHAINKEY02")))
|
|
365
|
+
|
|
366
|
+
// Before any op, nothing has been resolved.
|
|
367
|
+
eqs("chain.omitted.unresolved", "", secretsFeatureOf(client).credential())
|
|
368
|
+
|
|
369
|
+
check("chain.omitted.drive", driveOneCall(client, w), "no entity op reached the transport")
|
|
370
|
+
if (w.api().nonEmpty) credentialIs("chain.omitted", w.authof(w.api().head), "CHAINKEY02")
|
|
371
|
+
|
|
372
|
+
// Resolution happens AT THE TRANSPORT - the one seam every wire path
|
|
373
|
+
// crosses - so the credential is on the wire, not merely resolved. It is
|
|
374
|
+
// held in FEATURE STATE; the options map is never mutated, so it stays
|
|
375
|
+
// safe to read from every concurrent operation.
|
|
376
|
+
eqs("chain.omitted.state", "CHAINKEY02", secretsFeatureOf(client).credential())
|
|
377
|
+
eqs("chain.omitted.optionsfrozen", "",
|
|
378
|
+
client.optionsMap().get("apikey") match { case s: String => s; case _ => "" })
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
private def testCustomProvider(): Unit = {
|
|
382
|
+
val w = new Wire()
|
|
383
|
+
val prov = working("CUSTOM01")
|
|
384
|
+
val client = secretsClient(w, "feature" -> secretsOpts(jlist(prov)))
|
|
385
|
+
|
|
386
|
+
check("chain.custom.drive", driveOneCall(client, w), "no entity op reached the transport")
|
|
387
|
+
if (w.api().nonEmpty) credentialIs("chain.custom", w.authof(w.api().head), "CUSTOM01")
|
|
388
|
+
check("chain.custom.asked", !prov.asked.isEmpty && "apikey" == prov.asked.get(0),
|
|
389
|
+
"the custom provider was asked " + prov.asked)
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// A spec given as a plain MAP - what a JSON config supplies. The scala
|
|
393
|
+
// sekreto port has no map-taking SpecOf, so SecretsFeature converts the map
|
|
394
|
+
// to plugin's value model itself; a shape that converter mishandles would
|
|
395
|
+
// be lost in silence, which is why it is pinned here.
|
|
396
|
+
private def testSpecFromMap(): Unit = {
|
|
397
|
+
val w = new Wire()
|
|
398
|
+
val client = secretsClient(w,
|
|
399
|
+
"feature" -> secretsOpts(jlist(jmap(
|
|
400
|
+
"kind" -> "memory",
|
|
401
|
+
"name" -> "config",
|
|
402
|
+
"prefix" -> "CFG_",
|
|
403
|
+
"values" -> jmap("CFG_APIKEY" -> "MAPPED01"),
|
|
404
|
+
))))
|
|
405
|
+
|
|
406
|
+
check("chain.specmap.drive", driveOneCall(client, w), "no entity op reached the transport")
|
|
407
|
+
if (w.api().nonEmpty) credentialIs("chain.specmap", w.authof(w.api().head), "MAPPED01")
|
|
408
|
+
|
|
409
|
+
// Every field crossed: `name` made the store addressable, `prefix`
|
|
410
|
+
// reached the provider (without it the value would not have been found).
|
|
411
|
+
val sf = secretsFeatureOf(client)
|
|
412
|
+
if (null != sf && null != sf.sekreto()) {
|
|
413
|
+
eqs("chain.specmap.store", "MAPPED01",
|
|
414
|
+
sf.sekreto().tryfrom("config", "apikey").getOrElse(""))
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
private def testMissLeavesHeaderOff(): Unit = {
|
|
419
|
+
val w = new Wire()
|
|
420
|
+
val client = secretsClient(w, "feature" -> secretsOpts(memchain("OTHER" -> "x")))
|
|
421
|
+
|
|
422
|
+
check("chain.miss.drive", driveOneCall(client, w), "no entity op reached the transport")
|
|
423
|
+
if (w.api().nonEmpty) {
|
|
424
|
+
check("chain.miss", !w.hasauth(w.api().head),
|
|
425
|
+
"a chain MISS must fall through to an unauthenticated request, got header \"" +
|
|
426
|
+
w.authof(w.api().head) + "\"")
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
private def testAuthNullSuppresses(): Unit = {
|
|
431
|
+
val w = new Wire()
|
|
432
|
+
val client = secretsClient(w,
|
|
433
|
+
"auth" -> null,
|
|
434
|
+
"apikey" -> "OPTKEY01",
|
|
435
|
+
"feature" -> secretsOpts(memchain("APIKEY" -> "CHAINKEY03")))
|
|
436
|
+
|
|
437
|
+
check("chain.authnull.drive", driveOneCall(client, w), "no entity op reached the transport")
|
|
438
|
+
if (w.api().nonEmpty) {
|
|
439
|
+
check("chain.authnull", !w.hasauth(w.api().head),
|
|
440
|
+
"auth null must suppress the credential, got header \"" + w.authof(w.api().head) + "\"")
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// The suppression survives option validation rather than being replaced
|
|
444
|
+
// by the optspec's default auth map.
|
|
445
|
+
val opts = client.optionsMap()
|
|
446
|
+
check("chain.authnull.survives", opts.containsKey("auth") && null == opts.get("auth"),
|
|
447
|
+
"options.auth must stay a present null, got " + opts.get("auth"))
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// =========================================================================
|
|
451
|
+
// FAIL CLOSED. A provider MISS falls through; a provider ERROR must fail
|
|
452
|
+
// the operation. Conflating them turns a broken vault into a silent
|
|
453
|
+
// unauthenticated request.
|
|
454
|
+
|
|
455
|
+
private def testFailClosedEntity(): Unit = {
|
|
456
|
+
val prov = broken()
|
|
457
|
+
val w = new Wire()
|
|
458
|
+
val client = secretsClient(w, "feature" -> secretsOpts(jlist(prov)))
|
|
459
|
+
|
|
460
|
+
// THE RULE, asserted first so a regression reports the leak itself.
|
|
461
|
+
val (_, err) = driveUntil(client, () => !prov.asked.isEmpty)
|
|
462
|
+
check("failclosed.entity.asked", !prov.asked.isEmpty,
|
|
463
|
+
"the chain was never consulted - this case proves nothing")
|
|
464
|
+
eqi("failclosed.entity.silent " + w.report(), 0, w.api().length)
|
|
465
|
+
check("failclosed.entity.message", err.contains("vault unreachable"),
|
|
466
|
+
"the operation must fail with the PROVIDER'S OWN error, got: " + err)
|
|
467
|
+
|
|
468
|
+
// CONTROL, which makes that zero mean REFUSED rather than UNWIRED: the
|
|
469
|
+
// same construction with a WORKING provider must reach the same
|
|
470
|
+
// transport, once, carrying the credential.
|
|
471
|
+
val cw = new Wire()
|
|
472
|
+
val control = secretsClient(cw, "feature" -> secretsOpts(jlist(working("RAWKEY01"))))
|
|
473
|
+
check("failclosed.entity.control.drive", driveOneCall(control, cw),
|
|
474
|
+
"the control request never reached system.fetch, so this case cannot " +
|
|
475
|
+
"observe a request going out at all")
|
|
476
|
+
eqi("failclosed.entity.control.count", 1, cw.api().length)
|
|
477
|
+
if (cw.api().nonEmpty) {
|
|
478
|
+
credentialIs("failclosed.entity.control.auth", cw.authof(cw.api().head), "RAWKEY01")
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
// THE RAW PATHS, which run NO feature hooks at all. If resolution lived in
|
|
483
|
+
// a PreSpec hook these would send an unauthenticated request and never
|
|
484
|
+
// notice; they are covered because resolution is at the TRANSPORT.
|
|
485
|
+
private def testFailClosedRaw(): Unit = {
|
|
486
|
+
val allow = jmap("op" -> "direct,graphql")
|
|
487
|
+
|
|
488
|
+
// ---- direct()
|
|
489
|
+
val w = new Wire()
|
|
490
|
+
val client = secretsClient(w,
|
|
491
|
+
"allow" -> allow,
|
|
492
|
+
"feature" -> secretsOpts(jlist(broken())))
|
|
493
|
+
val res = client.direct(jmap("path" -> "/thing"))
|
|
494
|
+
|
|
495
|
+
eqi("failclosed.direct.silent " + w.report(), 0, w.api().length)
|
|
496
|
+
check("failclosed.direct.refused", java.lang.Boolean.FALSE == res.get("ok"),
|
|
497
|
+
"a broken chain must refuse the raw path fail-closed, got " + res)
|
|
498
|
+
check("failclosed.direct.message",
|
|
499
|
+
errtext(res.get("err").asInstanceOf[Throwable]).contains("vault unreachable"),
|
|
500
|
+
"direct must report the PROVIDER'S OWN error, got: " + res.get("err"))
|
|
501
|
+
|
|
502
|
+
// ---- graphql()
|
|
503
|
+
val gw = new Wire()
|
|
504
|
+
val gclient = secretsClient(gw,
|
|
505
|
+
"allow" -> allow,
|
|
506
|
+
"feature" -> secretsOpts(jlist(broken())))
|
|
507
|
+
val gres = gclient.graphql("{ thing }", null, null)
|
|
508
|
+
|
|
509
|
+
eqi("failclosed.graphql.silent " + gw.report(), 0, gw.api().length)
|
|
510
|
+
check("failclosed.graphql.refused", java.lang.Boolean.FALSE == gres.get("ok"),
|
|
511
|
+
"a broken chain must refuse graphql fail-closed, got " + gres)
|
|
512
|
+
check("failclosed.graphql.message",
|
|
513
|
+
errtext(gres.get("err").asInstanceOf[Throwable]).contains("vault unreachable"),
|
|
514
|
+
"graphql must report the PROVIDER'S OWN error, got: " + gres.get("err"))
|
|
515
|
+
|
|
516
|
+
// ---- CONTROL: the same construction, a working provider, one call each,
|
|
517
|
+
// carrying the credential. Without this the two zeros above would also
|
|
518
|
+
// hold for an SDK that never wires system.fetch at all.
|
|
519
|
+
val cw = new Wire()
|
|
520
|
+
val control = secretsClient(cw,
|
|
521
|
+
"allow" -> allow,
|
|
522
|
+
"feature" -> secretsOpts(jlist(working("RAWKEY02"))))
|
|
523
|
+
|
|
524
|
+
val ok = control.direct(jmap("path" -> "/thing"))
|
|
525
|
+
check("failclosed.direct.control.ok", java.lang.Boolean.TRUE == ok.get("ok"),
|
|
526
|
+
"the control direct() failed: " + ok)
|
|
527
|
+
eqi("failclosed.direct.control.count", 1, cw.api().length)
|
|
528
|
+
if (cw.api().nonEmpty) {
|
|
529
|
+
credentialIs("failclosed.direct.control.auth", cw.authof(cw.api().head), "RAWKEY02")
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
val gcw = new Wire()
|
|
533
|
+
val gcontrol = secretsClient(gcw,
|
|
534
|
+
"allow" -> allow,
|
|
535
|
+
"feature" -> secretsOpts(jlist(working("RAWKEY03"))))
|
|
536
|
+
gcontrol.graphql("{ thing }", null, null)
|
|
537
|
+
eqi("failclosed.graphql.control.count", 1, gcw.api().length)
|
|
538
|
+
if (gcw.api().nonEmpty) {
|
|
539
|
+
credentialIs("failclosed.graphql.control.auth", gcw.authof(gcw.api().head), "RAWKEY03")
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// A chain that will not BUILD at all - an unknown provider kind, the shape
|
|
544
|
+
// a typo or a plugin group the model did not select produces. Init cannot
|
|
545
|
+
// fail construction the way ts's throwing init can, so the refusal has to
|
|
546
|
+
// come from the transport gate; a feature that skipped wrapping on a failed
|
|
547
|
+
// init would send every request unauthenticated instead, and no other case
|
|
548
|
+
// here would notice.
|
|
549
|
+
private def testFailClosedUnbuildableChain(): Unit = {
|
|
550
|
+
val w = new Wire()
|
|
551
|
+
val client = secretsClient(w,
|
|
552
|
+
"allow" -> jmap("op" -> "direct"),
|
|
553
|
+
"feature" -> secretsOpts(jlist(jmap("kind" -> "nosuchkind"))))
|
|
554
|
+
|
|
555
|
+
val res = client.direct(jmap("path" -> "/thing"))
|
|
556
|
+
|
|
557
|
+
eqi("failclosed.unbuildable.silent " + w.report(), 0, w.api().length)
|
|
558
|
+
check("failclosed.unbuildable.refused", java.lang.Boolean.FALSE == res.get("ok"),
|
|
559
|
+
"a chain that would not build must refuse, got " + res)
|
|
560
|
+
check("failclosed.unbuildable.message",
|
|
561
|
+
errtext(res.get("err").asInstanceOf[Throwable]).contains("nosuchkind"),
|
|
562
|
+
"the refusal must name the unknown kind, got: " + res.get("err"))
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
// A failed resolution is NEVER kept: a transient vault outage must not
|
|
566
|
+
// poison the client permanently.
|
|
567
|
+
private def testTransientRecovery(): Unit = {
|
|
568
|
+
var calls = 0
|
|
569
|
+
val prov = new CodeProvider(_ => {
|
|
570
|
+
calls += 1
|
|
571
|
+
if (1 == calls) throw new com.voxgig.sekreto.SekretoError("vault unreachable")
|
|
572
|
+
Some("RECOVERED01")
|
|
573
|
+
}, "flaky")
|
|
574
|
+
|
|
575
|
+
val w = new Wire()
|
|
576
|
+
val client = secretsClient(w, "feature" -> secretsOpts(jlist(prov)))
|
|
577
|
+
|
|
578
|
+
driveUntil(client, () => 0 < calls)
|
|
579
|
+
eqi("recovery.firstsilent", 0, w.api().length)
|
|
580
|
+
|
|
581
|
+
check("recovery.drive", driveOneCall(client, w), "the second op never reached the transport")
|
|
582
|
+
if (w.api().nonEmpty) credentialIs("recovery.fresh", w.authof(w.api().head), "RECOVERED01")
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// `cache: false` is documented as "every resolve asks the chain again", and
|
|
586
|
+
// an uncached MISS after an earlier hit is a REVOCATION: the resolved value
|
|
587
|
+
// must stop going out.
|
|
588
|
+
private def testUncachedMissRetracts(): Unit = {
|
|
589
|
+
var have = true
|
|
590
|
+
var calls = 0
|
|
591
|
+
val prov = new CodeProvider(_ => {
|
|
592
|
+
calls += 1
|
|
593
|
+
if (have) Some("REVOCABLE01") else None
|
|
594
|
+
}, "revocable")
|
|
595
|
+
|
|
596
|
+
val w = new Wire()
|
|
597
|
+
val client = secretsClient(w,
|
|
598
|
+
"feature" -> secretsOpts(jlist(prov), "cache" -> java.lang.Boolean.FALSE))
|
|
599
|
+
|
|
600
|
+
check("uncached.drive", driveOneCall(client, w), "no entity op reached the transport")
|
|
601
|
+
if (w.api().nonEmpty) credentialIs("uncached.first", w.authof(w.api().head), "REVOCABLE01")
|
|
602
|
+
|
|
603
|
+
val asked = calls
|
|
604
|
+
have = false
|
|
605
|
+
check("uncached.drive2", driveOneCall(client, w), "the second op never reached the transport")
|
|
606
|
+
check("uncached.reasked", asked < calls,
|
|
607
|
+
"the chain was asked once and cached, despite cache: false")
|
|
608
|
+
|
|
609
|
+
val last = w.api().last
|
|
610
|
+
check("uncached.retracted", !w.hasauth(last) || "" == w.authof(last),
|
|
611
|
+
"after the chain reports a miss, the retracted credential must not go " +
|
|
612
|
+
"out; the wire saw \"" + w.authof(last) + "\"")
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
// A MISS IS NOT A CACHEABLE ANSWER - sekreto's own rule, which this
|
|
616
|
+
// feature used to override from the layer above.
|
|
617
|
+
//
|
|
618
|
+
// DEFAULT caching here, which is the whole point: `cache: true` is about
|
|
619
|
+
// holding a HIT, and keeping the settled resolution after a miss meant the
|
|
620
|
+
// chain was never asked again for the life of the client. A secret
|
|
621
|
+
// provisioned after startup (a mounted file, a vault policy granted a
|
|
622
|
+
// minute late) was invisible forever, and the only workaround was giving
|
|
623
|
+
// up hit caching entirely.
|
|
624
|
+
private def testCachedMissIsReasked(): Unit = {
|
|
625
|
+
var present = false
|
|
626
|
+
var calls = 0
|
|
627
|
+
val prov = new CodeProvider(_ => {
|
|
628
|
+
calls += 1
|
|
629
|
+
if (present) Some("LATEKEY01") else None
|
|
630
|
+
}, "late")
|
|
631
|
+
|
|
632
|
+
val w = new Wire()
|
|
633
|
+
val client = secretsClient(w, "feature" -> secretsOpts(jlist(prov)))
|
|
634
|
+
|
|
635
|
+
check("cachedmiss.drive", driveOneCall(client, w),
|
|
636
|
+
"no entity op reached the transport")
|
|
637
|
+
if (w.api().nonEmpty) {
|
|
638
|
+
val first = w.api().head
|
|
639
|
+
check("cachedmiss.nocred", !w.hasauth(first) || "" == w.authof(first),
|
|
640
|
+
"the chain has nothing yet, so no credential should go out")
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
val asked = calls
|
|
644
|
+
check("cachedmiss.asked", 0 < asked, "the chain was never asked")
|
|
645
|
+
|
|
646
|
+
// The secret is provisioned while the client is live.
|
|
647
|
+
present = true
|
|
648
|
+
check("cachedmiss.drive2", driveOneCall(client, w),
|
|
649
|
+
"the second op never reached the transport")
|
|
650
|
+
|
|
651
|
+
check("cachedmiss.reasked", asked < calls,
|
|
652
|
+
"the MISS was cached: a secret that appears later can never be picked up")
|
|
653
|
+
if (w.api().nonEmpty) {
|
|
654
|
+
credentialIs("cachedmiss.late", w.authof(w.api().last), "LATEKEY01")
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
// The other half of the same rule: a HIT is still cached by default, so
|
|
659
|
+
// the fix above must not turn every request into a chain walk.
|
|
660
|
+
private def testCachedHitIsKept(): Unit = {
|
|
661
|
+
var calls = 0
|
|
662
|
+
val prov = new CodeProvider(_ => {
|
|
663
|
+
calls += 1
|
|
664
|
+
Some("STABLEKEY01")
|
|
665
|
+
}, "counting")
|
|
666
|
+
|
|
667
|
+
val w = new Wire()
|
|
668
|
+
val client = secretsClient(w, "feature" -> secretsOpts(jlist(prov)))
|
|
669
|
+
|
|
670
|
+
check("cachedhit.drive", driveOneCall(client, w),
|
|
671
|
+
"no entity op reached the transport")
|
|
672
|
+
check("cachedhit.drive2", driveOneCall(client, w),
|
|
673
|
+
"the second op never reached the transport")
|
|
674
|
+
|
|
675
|
+
eqi("cachedhit.once", 1, calls)
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
private def testSecretNameConfigurable(): Unit = {
|
|
679
|
+
val w = new Wire()
|
|
680
|
+
val client = secretsClient(w,
|
|
681
|
+
"feature" -> secretsOpts(memchain("API_TOKEN" -> "TOKKEY01"), "name" -> "api.token"))
|
|
682
|
+
|
|
683
|
+
check("name.drive", driveOneCall(client, w), "no entity op reached the transport")
|
|
684
|
+
if (w.api().nonEmpty) credentialIs("name.configurable", w.authof(w.api().head), "TOKKEY01")
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
// The live Sekreto: arbitrary secrets and redaction, the scala spelling of
|
|
688
|
+
// ts's sdk.secrets().
|
|
689
|
+
private def testSekretoIsLive(): Unit = {
|
|
690
|
+
val w = new Wire()
|
|
691
|
+
val client = secretsClient(w,
|
|
692
|
+
"feature" -> secretsOpts(memchain("APIKEY" -> "KEY01", "DB_PASSWORD" -> "dbpass01")))
|
|
693
|
+
|
|
694
|
+
val sek = secretsFeatureOf(client).sekreto()
|
|
695
|
+
check("sekreto.live", null != sek, "no live Sekreto instance")
|
|
696
|
+
if (null != sek) {
|
|
697
|
+
eqs("sekreto.get", "dbpass01", sek.get("db.password"))
|
|
698
|
+
eqs("sekreto.redact", "the password is [redacted], keep it safe",
|
|
699
|
+
sek.redact("the password is dbpass01, keep it safe"))
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
// Every vendored provider MODULE, and the kinds it defines. The pairing is
|
|
704
|
+
// the model's `plugin.<group>.def.scala` map read from the other side, and
|
|
705
|
+
// it is written out here on purpose: a test that asked Config for the
|
|
706
|
+
// mapping would be asking the thing under test.
|
|
707
|
+
//
|
|
708
|
+
// plugins/Httpjson.scala and plugins/Sigv4.scala are absent because they
|
|
709
|
+
// define no kind - they are the two UNGROUPED helper files that ship with
|
|
710
|
+
// the feature core whatever the model selects.
|
|
711
|
+
private val PLUGINMODULES: List[(String, List[String])] = List(
|
|
712
|
+
"Aws" -> List("awsparams", "awssecrets"),
|
|
713
|
+
"Azuresecrets" -> List("azuresecrets"),
|
|
714
|
+
"Boru" -> List("boru"),
|
|
715
|
+
"Doppler" -> List("doppler"),
|
|
716
|
+
"Gcpsecrets" -> List("gcpsecrets"),
|
|
717
|
+
"Hashicorp" -> List("hashicorp"),
|
|
718
|
+
"Infisical" -> List("infisical"),
|
|
719
|
+
"Onepassword" -> List("onepassword"),
|
|
720
|
+
"Secretspec" -> List("secretspec"),
|
|
721
|
+
)
|
|
722
|
+
|
|
723
|
+
// A kind no module defines and no model can select, for the negative
|
|
724
|
+
// control. Deliberately not a plausible provider name.
|
|
725
|
+
private val CONTROLKIND = "vocabulary-control-kind"
|
|
726
|
+
|
|
727
|
+
// Did this SDK compile plugins/<file>.scala? A scala 3 top-level `val`
|
|
728
|
+
// lives in the synthetic `<File>$package` class, so the classloader answers
|
|
729
|
+
// for the FILE - which is what the generate-time plugin trim adds or
|
|
730
|
+
// removes. Asked by name and not by reference: a direct mention of
|
|
731
|
+
// `com.voxgig.sekreto.plugins.hashicorp` would stop this file compiling in
|
|
732
|
+
// every tree the trim did its job on.
|
|
733
|
+
private def moduleShipped(file: String): Boolean =
|
|
734
|
+
try {
|
|
735
|
+
Class.forName("com.voxgig.sekreto.plugins." + file + "$package",
|
|
736
|
+
false, getClass.getClassLoader)
|
|
737
|
+
true
|
|
738
|
+
}
|
|
739
|
+
catch { case _: Throwable => false }
|
|
740
|
+
|
|
741
|
+
// Did the MODEL activate the feature in this SDK? Config's `feature` map is
|
|
742
|
+
// built from the model's active features alone, so the key is present only
|
|
743
|
+
// where an activation put it - which is exactly when the plugin trim ran.
|
|
744
|
+
private def secretsInConfig(): Boolean =
|
|
745
|
+
Config.sharedConfig().get("feature") match {
|
|
746
|
+
case m: JMap[_, _] => m.asInstanceOf[JMap[String, Object]].containsKey("secrets")
|
|
747
|
+
case _ => false
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
// THE PROVIDER VOCABULARY. Since sekreto retired its import-time registry a
|
|
751
|
+
// kind not passed in `plugins` is unknown to that Sekreto, so an SDK whose
|
|
752
|
+
// model selected plugin groups but whose Config failed to hand them over
|
|
753
|
+
// would compile, ship every plugin module, and refuse every one of their
|
|
754
|
+
// kinds at runtime while the built-in cases stayed green.
|
|
755
|
+
//
|
|
756
|
+
// THE EXPECTATION IS DERIVED FROM THE SHIPPED MODULES, NOT FROM CONFIG.
|
|
757
|
+
// The first cut of this read Config.featurePlugins for both sides and
|
|
758
|
+
// looped over it - so on a model selecting no plugin group the list was
|
|
759
|
+
// empty, the loop ran zero times, and deleting the whole emission from
|
|
760
|
+
// Config_scala left the suite green on the same score. Config is the thing
|
|
761
|
+
// under test; it cannot also be the oracle.
|
|
762
|
+
//
|
|
763
|
+
// The independent oracle is the generate-time plugin trim. It deletes an
|
|
764
|
+
// inactive group's FILES, so the set of provider modules compiled into
|
|
765
|
+
// this SDK records what the model selected, and Config's list has to name
|
|
766
|
+
// exactly their kinds - no more (a symbol the trim deleted is a build
|
|
767
|
+
// break) and no fewer (a module whose kind never reaches the feature is
|
|
768
|
+
// refused at runtime).
|
|
769
|
+
private def testPluginVocabulary(): Unit = {
|
|
770
|
+
// (1) The table below has to cover the whole vendored vocabulary, or a
|
|
771
|
+
// kind added upstream would be invisible to every check under it.
|
|
772
|
+
// KINDS.plugin is sekreto's own list, so it answers for upstream.
|
|
773
|
+
val tabled = PLUGINMODULES.flatMap(_._2).toSet
|
|
774
|
+
val untabled = com.voxgig.sekreto.KINDS.plugin.filterNot(tabled.contains)
|
|
775
|
+
check("vocabulary.table", untabled.isEmpty,
|
|
776
|
+
"sekreto ships provider kinds this test does not know about: " +
|
|
777
|
+
untabled.mkString(", ") + " - add them to PLUGINMODULES, and to a " +
|
|
778
|
+
"`plugin` group in model/feature/secrets.aon")
|
|
779
|
+
|
|
780
|
+
val w = new Wire()
|
|
781
|
+
val client = secretsClient(w, "feature" -> secretsOpts(memchain("APIKEY" -> "VOCAB01")))
|
|
782
|
+
val sek = secretsFeatureOf(client).sekreto()
|
|
783
|
+
check("vocabulary.live", null != sek, "no live Sekreto instance")
|
|
784
|
+
if (null == sek) return
|
|
785
|
+
|
|
786
|
+
// (2) CONTROL, both ways. Without these a green run below could mean
|
|
787
|
+
// "catalog.has says yes to anything" or "the `plugins` seam is dead", and
|
|
788
|
+
// on an SDK that selected no group there would be nothing else asserted
|
|
789
|
+
// at all. So: the catalog must be able to say NO to a kind nothing
|
|
790
|
+
// defines, and a definition handed to the SAME constructor parameter
|
|
791
|
+
// Config.featurePlugins feeds must make it say YES.
|
|
792
|
+
check("vocabulary.control.unknown", !sek.catalog.has(CONTROLKIND),
|
|
793
|
+
"the catalog claims to know \"" + CONTROLKIND + "\", which nothing " +
|
|
794
|
+
"defines - catalog.has cannot witness anything")
|
|
795
|
+
|
|
796
|
+
val probe = new com.voxgig.sekreto.Sekreto(
|
|
797
|
+
plugins = List(com.voxgig.sekreto.providerplugin(
|
|
798
|
+
CONTROLKIND, _ => new CodeProvider(_ => None, CONTROLKIND))))
|
|
799
|
+
check("vocabulary.control.handedin", probe.catalog.has(CONTROLKIND),
|
|
800
|
+
"a definition passed in `plugins` did not reach the catalog - the seam " +
|
|
801
|
+
"Config.featurePlugins feeds is dead, so every check here is vacuous")
|
|
802
|
+
|
|
803
|
+
// (3) What Config actually emitted.
|
|
804
|
+
val names = ListBuffer.empty[String]
|
|
805
|
+
for (one <- Config.featurePlugins("secrets")) one match {
|
|
806
|
+
case d: voxgig.plugin.Definition => names += d.name
|
|
807
|
+
case other => fail("vocabulary.type", "not a plugin definition: " + other)
|
|
808
|
+
}
|
|
809
|
+
for (name <- names) {
|
|
810
|
+
check("vocabulary." + name, sek.catalog.has(name),
|
|
811
|
+
"the model selected the " + name + " plugin, but this SDK's Sekreto " +
|
|
812
|
+
"does not know that kind - Config.featurePlugins is not reaching the feature")
|
|
813
|
+
check("vocabulary.known." + name, tabled.contains(name),
|
|
814
|
+
"Config declares a kind no vendored module defines: " + name)
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
// (4) THE SEAM. Both halves of the model are asserted, because the trim
|
|
818
|
+
// that produces the oracle has a half for each: Main_scala excludes an
|
|
819
|
+
// ACTIVE feature's inactive groups, and every group of a feature that is
|
|
820
|
+
// itself off. Each branch names its own failure - a mismatch means
|
|
821
|
+
// something different on either side.
|
|
822
|
+
val shipped = PLUGINMODULES.filter(one => moduleShipped(one._1))
|
|
823
|
+
val here = if (shipped.isEmpty) "(none)" else shipped.map(_._1).mkString(", ")
|
|
824
|
+
val got = names.toList.sorted.mkString(",")
|
|
825
|
+
|
|
826
|
+
if (secretsInConfig()) {
|
|
827
|
+
eqs("vocabulary.matchesmodules", shipped.flatMap(_._2).sorted.mkString(","), got,
|
|
828
|
+
"this SDK compiled the provider modules " + here + ", so " +
|
|
829
|
+
"Config.featurePlugins must name exactly their kinds - it is the " +
|
|
830
|
+
"model's plugin selection that put those modules here")
|
|
831
|
+
}
|
|
832
|
+
else {
|
|
833
|
+
// The model never activated secrets, so it selected no provider kind.
|
|
834
|
+
eqs("vocabulary.off.notrimmed", "", shipped.map(_._1).mkString(","),
|
|
835
|
+
"this SDK's model left secrets off, so no provider client should have " +
|
|
836
|
+
"reached it - Main_scala's inactive-feature plugin trim did not run")
|
|
837
|
+
eqs("vocabulary.off.nodefs", "", got,
|
|
838
|
+
"this SDK's model left secrets off, so Config.featurePlugins must " +
|
|
839
|
+
"declare nothing for it")
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
// The `env` built-in is LIVE. A JVM cannot set its own environment, so this
|
|
844
|
+
// reads a variable that is already there rather than staging one.
|
|
845
|
+
private def testEnvBuiltin(): Unit = {
|
|
846
|
+
val path = System.getenv("PATH")
|
|
847
|
+
if (null == path || path.isEmpty) return
|
|
848
|
+
|
|
849
|
+
val w = new Wire()
|
|
850
|
+
val client = secretsClient(w,
|
|
851
|
+
"feature" -> secretsOpts(jlist(jmap("kind" -> "env")), "name" -> "path"))
|
|
852
|
+
val sek = secretsFeatureOf(client).sekreto()
|
|
853
|
+
eqs("env.builtin", path, if (null == sek) "" else sek.tryget("path").getOrElse(""))
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
// =========================================================================
|
|
857
|
+
// The access-token exchange.
|
|
858
|
+
|
|
859
|
+
private def exchangeOpts(extra: (String, Object)*): JMap[String, Object] = {
|
|
860
|
+
val x = jmap("active" -> java.lang.Boolean.TRUE)
|
|
861
|
+
extra.foreach { case (k, v) => x.put(k, v) }
|
|
862
|
+
secretsOpts(
|
|
863
|
+
memchain("REFRESH_TOKEN" -> "REFRESH01"),
|
|
864
|
+
"name" -> "refresh_token",
|
|
865
|
+
"exchange" -> x)
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
private def testExchangeBuysAndRetries(): Unit = {
|
|
869
|
+
val w = new Wire()
|
|
870
|
+
// First API call is refused, the retry succeeds.
|
|
871
|
+
w.apistatus = List(401, 200)
|
|
872
|
+
|
|
873
|
+
val client = secretsClient(w, "allow" -> jmap("op" -> "direct"), "feature" -> exchangeOpts())
|
|
874
|
+
val res = client.direct(jmap("path" -> "/thing"))
|
|
875
|
+
|
|
876
|
+
eqi("exchange.purchases", 2, w.token().length)
|
|
877
|
+
eqi("exchange.retried", 2, w.api().length)
|
|
878
|
+
if (2 <= w.api().length) {
|
|
879
|
+
credentialIs("exchange.first", w.authof(w.api()(0)), "ACCESS01")
|
|
880
|
+
// The retry must carry the NEW token, not the spent one.
|
|
881
|
+
credentialIs("exchange.retry", w.authof(w.api()(1)), "ACCESS02")
|
|
882
|
+
}
|
|
883
|
+
check("exchange.result", java.lang.Boolean.TRUE == res.get("ok"),
|
|
884
|
+
"the caller sees the successful retry, got " + res)
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
private def testExchangeOnePurchaseManyRequests(): Unit = {
|
|
888
|
+
val w = new Wire()
|
|
889
|
+
val client = secretsClient(w, "allow" -> jmap("op" -> "direct"), "feature" -> exchangeOpts())
|
|
890
|
+
|
|
891
|
+
client.direct(jmap("path" -> "/one"))
|
|
892
|
+
client.direct(jmap("path" -> "/two"))
|
|
893
|
+
client.direct(jmap("path" -> "/three"))
|
|
894
|
+
|
|
895
|
+
eqi("exchange.onepurchase", 1, w.token().length)
|
|
896
|
+
eqi("exchange.threecalls", 3, w.api().length)
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
// The body is MARSHALLED, never concatenated: a refresh token carrying a
|
|
900
|
+
// quote, backslash or newline must arrive as that literal value.
|
|
901
|
+
private def testExchangeBodyIsJson(): Unit = {
|
|
902
|
+
val tricky = "re\"fresh\\to\nken"
|
|
903
|
+
val w = new Wire()
|
|
904
|
+
val client = secretsClient(w,
|
|
905
|
+
"allow" -> jmap("op" -> "direct"),
|
|
906
|
+
"feature" -> exchangeOpts("refresh" -> tricky))
|
|
907
|
+
|
|
908
|
+
client.direct(jmap("path" -> "/thing"))
|
|
909
|
+
|
|
910
|
+
check("exchange.body.purchased", 1 <= w.token().length, "no token purchase was made")
|
|
911
|
+
if (w.token().nonEmpty) {
|
|
912
|
+
val body = w.token().head.get("body") match { case s: String => s; case _ => "" }
|
|
913
|
+
val parsed = Json.parse(body) match {
|
|
914
|
+
case m: JMap[_, _] => m.asInstanceOf[JMap[String, Object]]
|
|
915
|
+
case _ => null
|
|
916
|
+
}
|
|
917
|
+
check("exchange.body.json", null != parsed,
|
|
918
|
+
"the exchange body must be valid JSON, got: " + body)
|
|
919
|
+
if (null != parsed) {
|
|
920
|
+
eqs("exchange.body.literal", tricky,
|
|
921
|
+
parsed.get("refresh_token") match { case s: String => s; case _ => "" })
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
// An explicit exchange.refresh takes the first seat in the chain, so it
|
|
927
|
+
// wins by sekreto's own first-hit rule.
|
|
928
|
+
private def testExchangeExplicitRefreshWins(): Unit = {
|
|
929
|
+
val w = new Wire()
|
|
930
|
+
val client = secretsClient(w,
|
|
931
|
+
"allow" -> jmap("op" -> "direct"),
|
|
932
|
+
"feature" -> exchangeOpts("refresh" -> "EXPLICIT01"))
|
|
933
|
+
|
|
934
|
+
client.direct(jmap("path" -> "/thing"))
|
|
935
|
+
|
|
936
|
+
if (w.token().nonEmpty) {
|
|
937
|
+
val body = w.token().head.get("body") match { case s: String => s; case _ => "" }
|
|
938
|
+
check("exchange.explicitrefresh", body.contains("EXPLICIT01"),
|
|
939
|
+
"an explicit exchange.refresh must win over the chain, body was: " + body)
|
|
940
|
+
} else {
|
|
941
|
+
fail("exchange.explicitrefresh", "no token purchase was made")
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
// A refusal of a deliberately unauthenticated request is not an expired
|
|
946
|
+
// token: buying one and retrying would transmit exactly the credential the
|
|
947
|
+
// caller suppressed.
|
|
948
|
+
private def testExchangeAuthNullNotRetried(): Unit = {
|
|
949
|
+
val w = new Wire()
|
|
950
|
+
w.apistatus = List(401)
|
|
951
|
+
|
|
952
|
+
val client = secretsClient(w,
|
|
953
|
+
"auth" -> null,
|
|
954
|
+
"allow" -> jmap("op" -> "direct"),
|
|
955
|
+
"feature" -> exchangeOpts())
|
|
956
|
+
|
|
957
|
+
client.direct(jmap("path" -> "/thing"))
|
|
958
|
+
|
|
959
|
+
eqi("exchange.authnull.noretry", 1, w.api().length)
|
|
960
|
+
if (w.api().nonEmpty) {
|
|
961
|
+
check("exchange.authnull.nocred", !w.hasauth(w.api().head),
|
|
962
|
+
"no credential may be sent when auth is suppressed, got \"" +
|
|
963
|
+
w.authof(w.api().head) + "\"")
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
// AND NO PURCHASE. resolve() runs before withrefresh's suppression
|
|
967
|
+
// check, so the refresh token used to go to the token endpoint in a
|
|
968
|
+
// request body even here. Stopping the retry does not unsend it, and
|
|
969
|
+
// only the token endpoint can see this.
|
|
970
|
+
eqi("exchange.authnull.nobuy", 0, w.token().length)
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
// No refresh token anywhere is an ERROR, not an unauthenticated call.
|
|
974
|
+
private def testExchangeNoRefresh(): Unit = {
|
|
975
|
+
val w = new Wire()
|
|
976
|
+
val client = secretsClient(w,
|
|
977
|
+
"allow" -> jmap("op" -> "direct"),
|
|
978
|
+
"feature" -> secretsOpts(
|
|
979
|
+
memchain("SOMETHINGELSE" -> "x"),
|
|
980
|
+
"name" -> "refresh_token",
|
|
981
|
+
"exchange" -> jmap("active" -> java.lang.Boolean.TRUE)))
|
|
982
|
+
|
|
983
|
+
val res = client.direct(jmap("path" -> "/thing"))
|
|
984
|
+
|
|
985
|
+
eqi("exchange.norefresh.silent", 0, w.api().length)
|
|
986
|
+
check("exchange.norefresh.refused", java.lang.Boolean.FALSE == res.get("ok"),
|
|
987
|
+
"an empty chain must refuse rather than send unauthenticated, got " + res)
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
// TEST MODE BUYS NOTHING and needs no token endpoint.
|
|
991
|
+
private def testExchangeTestMode(): Unit = {
|
|
992
|
+
val w = new Wire()
|
|
993
|
+
val client = testModeClient(w, "feature" -> exchangeOpts())
|
|
994
|
+
|
|
995
|
+
driveUntil(client, () => "" != secretsFeatureOf(client).credential())
|
|
996
|
+
|
|
997
|
+
eqi("exchange.testmode.noio", 0, w.calls.size())
|
|
998
|
+
eqs("exchange.testmode.token", "test-access_token", secretsFeatureOf(client).credential())
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
// =========================================================================
|
|
1002
|
+
|
|
1003
|
+
def main(args: Array[String]): Unit = {
|
|
1004
|
+
val cases: List[(String, () => Unit)] = List(
|
|
1005
|
+
"inactive" -> testInactive,
|
|
1006
|
+
"optionWins" -> testOptionWins,
|
|
1007
|
+
"omittedDefers" -> testOmittedDefers,
|
|
1008
|
+
"customProvider" -> testCustomProvider,
|
|
1009
|
+
"specFromMap" -> testSpecFromMap,
|
|
1010
|
+
"missLeavesHeaderOff" -> testMissLeavesHeaderOff,
|
|
1011
|
+
"authNullSuppresses" -> testAuthNullSuppresses,
|
|
1012
|
+
"failClosedEntity" -> testFailClosedEntity,
|
|
1013
|
+
"failClosedRaw" -> testFailClosedRaw,
|
|
1014
|
+
"failClosedUnbuildableChain" -> testFailClosedUnbuildableChain,
|
|
1015
|
+
"transientRecovery" -> testTransientRecovery,
|
|
1016
|
+
"uncachedMissRetracts" -> testUncachedMissRetracts,
|
|
1017
|
+
"cachedMissIsReasked" -> testCachedMissIsReasked,
|
|
1018
|
+
"cachedHitIsKept" -> testCachedHitIsKept,
|
|
1019
|
+
"secretNameConfigurable" -> testSecretNameConfigurable,
|
|
1020
|
+
"sekretoIsLive" -> testSekretoIsLive,
|
|
1021
|
+
"pluginVocabulary" -> testPluginVocabulary,
|
|
1022
|
+
"envBuiltin" -> testEnvBuiltin,
|
|
1023
|
+
"exchangeBuysAndRetries" -> testExchangeBuysAndRetries,
|
|
1024
|
+
"exchangeOnePurchaseManyRequests" -> testExchangeOnePurchaseManyRequests,
|
|
1025
|
+
"exchangeBodyIsJson" -> testExchangeBodyIsJson,
|
|
1026
|
+
"exchangeExplicitRefreshWins" -> testExchangeExplicitRefreshWins,
|
|
1027
|
+
"exchangeAuthNullNotRetried" -> testExchangeAuthNullNotRetried,
|
|
1028
|
+
"exchangeNoRefresh" -> testExchangeNoRefresh,
|
|
1029
|
+
"exchangeTestMode" -> testExchangeTestMode,
|
|
1030
|
+
)
|
|
1031
|
+
|
|
1032
|
+
for ((name, body) <- cases) {
|
|
1033
|
+
try body()
|
|
1034
|
+
catch { case err: Throwable => fail(name, "threw " + errtext(err)) }
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
println("SECRETS PASS " + npass + " FAIL " + failures.size())
|
|
1038
|
+
val it = failures.iterator()
|
|
1039
|
+
while (it.hasNext) println(" FAIL " + it.next())
|
|
1040
|
+
if (!failures.isEmpty) System.exit(1)
|
|
1041
|
+
}
|
|
1042
|
+
}
|