@voxgig/sdkgen 4.19.1 → 4.21.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/applicability.js +11 -6
- package/dist/helpers/applicability.js.map +1 -1
- package/dist/helpers/collectDeps.js +31 -6
- package/dist/helpers/collectDeps.js.map +1 -1
- package/dist/helpers/naming.js +2 -2
- package/dist/helpers/naming.js.map +1 -1
- package/dist/sdkgen.d.ts +2 -2
- package/dist/sdkgen.js +6 -3
- package/dist/sdkgen.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utility.d.ts +4 -1
- package/dist/utility.js +60 -0
- package/dist/utility.js.map +1 -1
- package/model/sdkgen.aon +59 -3
- package/package.json +1 -1
- package/project/.sdk/model/feature/secrets.aon +128 -0
- package/project/.sdk/model/feature/validate.aon +3 -2
- package/project/.sdk/model/target/c.aon +1 -1
- package/project/.sdk/model/target/clojure.aon +1 -1
- package/project/.sdk/model/target/cpp.aon +1 -1
- package/project/.sdk/model/target/csharp.aon +1 -1
- package/project/.sdk/model/target/elixir.aon +1 -1
- package/project/.sdk/model/target/go.aon +1 -1
- package/project/.sdk/model/target/java.aon +1 -1
- package/project/.sdk/model/target/kotlin.aon +1 -1
- package/project/.sdk/model/target/lua.aon +1 -1
- package/project/.sdk/model/target/ocaml.aon +1 -1
- package/project/.sdk/model/target/perl.aon +1 -1
- package/project/.sdk/model/target/php.aon +1 -1
- package/project/.sdk/model/target/py.aon +1 -1
- package/project/.sdk/model/target/rb.aon +1 -1
- package/project/.sdk/model/target/rust.aon +1 -1
- package/project/.sdk/model/target/scala.aon +1 -1
- package/project/.sdk/model/target/swift.aon +1 -1
- package/project/.sdk/model/target/zig.aon +1 -1
- package/project/.sdk/src/cmp/c/Config_c.ts +15 -0
- package/project/.sdk/src/cmp/c/Main_c.ts +18 -0
- package/project/.sdk/src/cmp/c/PrepareAuth_c.ts +371 -0
- package/project/.sdk/src/cmp/c/Schema_c.ts +106 -0
- package/project/.sdk/src/cmp/clojure/Config_clojure.ts +47 -1
- package/project/.sdk/src/cmp/clojure/Main_clojure.ts +13 -1
- package/project/.sdk/src/cmp/clojure/PrepareAuth_clojure.ts +374 -0
- package/project/.sdk/src/cmp/clojure/ReadmeExplanation_clojure.ts +1 -0
- package/project/.sdk/src/cmp/clojure/Schema_clojure.ts +73 -0
- package/project/.sdk/src/cmp/cpp/Config_cpp.ts +40 -0
- package/project/.sdk/src/cmp/cpp/Main_cpp.ts +20 -0
- package/project/.sdk/src/cmp/cpp/PrepareAuth_cpp.ts +441 -0
- package/project/.sdk/src/cmp/cpp/Schema_cpp.ts +105 -0
- package/project/.sdk/src/cmp/csharp/Config_csharp.ts +42 -1
- package/project/.sdk/src/cmp/csharp/Main_csharp.ts +21 -0
- package/project/.sdk/src/cmp/csharp/PrepareAuth_csharp.ts +392 -0
- package/project/.sdk/src/cmp/csharp/Schema_csharp.ts +85 -0
- package/project/.sdk/src/cmp/elixir/Config_elixir.ts +36 -1
- package/project/.sdk/src/cmp/elixir/Main_elixir.ts +17 -0
- package/project/.sdk/src/cmp/elixir/PrepareAuth_elixir.ts +418 -0
- package/project/.sdk/src/cmp/elixir/ReadmeExplanation_elixir.ts +1 -0
- package/project/.sdk/src/cmp/elixir/Schema_elixir.ts +88 -0
- package/project/.sdk/src/cmp/go/Config_go.ts +12 -1
- package/project/.sdk/src/cmp/go/Main_go.ts +16 -0
- package/project/.sdk/src/cmp/go/PrepareAuth_go.ts +322 -0
- package/project/.sdk/src/cmp/go/Schema_go.ts +93 -0
- package/project/.sdk/src/cmp/java/Config_java.ts +20 -1
- package/project/.sdk/src/cmp/java/Main_java.ts +16 -0
- package/project/.sdk/src/cmp/java/PrepareAuth_java.ts +298 -0
- package/project/.sdk/src/cmp/java/Schema_java.ts +125 -0
- package/project/.sdk/src/cmp/js/Config_js.ts +12 -1
- package/project/.sdk/src/cmp/js/Main_js.ts +6 -0
- package/project/.sdk/src/cmp/js/PrepareAuth_js.ts +244 -0
- package/project/.sdk/src/cmp/kotlin/Config_kotlin.ts +23 -1
- package/project/.sdk/src/cmp/kotlin/Main_kotlin.ts +22 -0
- package/project/.sdk/src/cmp/kotlin/PrepareAuth_kotlin.ts +440 -0
- package/project/.sdk/src/cmp/kotlin/Schema_kotlin.ts +111 -0
- package/project/.sdk/src/cmp/lua/Config_lua.ts +15 -1
- package/project/.sdk/src/cmp/lua/Main_lua.ts +57 -9
- package/project/.sdk/src/cmp/lua/Package_lua.ts +1 -0
- package/project/.sdk/src/cmp/lua/PrepareAuth_lua.ts +364 -0
- package/project/.sdk/src/cmp/lua/ReadmeExplanation_lua.ts +1 -0
- package/project/.sdk/src/cmp/lua/Schema_lua.ts +72 -0
- package/project/.sdk/src/cmp/ocaml/Config_ocaml.ts +55 -2
- package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +53 -13
- package/project/.sdk/src/cmp/ocaml/PrepareAuth_ocaml.ts +454 -0
- package/project/.sdk/src/cmp/ocaml/ReadmeExplanation_ocaml.ts +1 -0
- package/project/.sdk/src/cmp/ocaml/Schema_ocaml.ts +99 -0
- package/project/.sdk/src/cmp/perl/Config_perl.ts +30 -0
- package/project/.sdk/src/cmp/perl/Main_perl.ts +16 -0
- package/project/.sdk/src/cmp/perl/PrepareAuth_perl.ts +387 -0
- package/project/.sdk/src/cmp/perl/ReadmeExplanation_perl.ts +1 -0
- package/project/.sdk/src/cmp/perl/Schema_perl.ts +107 -0
- package/project/.sdk/src/cmp/php/Config_php.ts +12 -1
- package/project/.sdk/src/cmp/php/Main_php.ts +9 -0
- package/project/.sdk/src/cmp/php/Package_php.ts +1 -1
- package/project/.sdk/src/cmp/php/PrepareAuth_php.ts +325 -0
- package/project/.sdk/src/cmp/php/ReadmeExplanation_php.ts +1 -0
- package/project/.sdk/src/cmp/php/Schema_php.ts +129 -0
- package/project/.sdk/src/cmp/py/Config_py.ts +12 -1
- package/project/.sdk/src/cmp/py/Main_py.ts +14 -0
- package/project/.sdk/src/cmp/py/PrepareAuth_py.ts +389 -0
- package/project/.sdk/src/cmp/py/ReadmeExplanation_py.ts +1 -0
- package/project/.sdk/src/cmp/py/Schema_py.ts +72 -0
- package/project/.sdk/src/cmp/rb/Config_rb.ts +18 -1
- package/project/.sdk/src/cmp/rb/Main_rb.ts +12 -0
- package/project/.sdk/src/cmp/rb/PrepareAuth_rb.ts +305 -0
- package/project/.sdk/src/cmp/rb/ReadmeExplanation_rb.ts +1 -0
- package/project/.sdk/src/cmp/rb/Schema_rb.ts +70 -0
- package/project/.sdk/src/cmp/rust/Config_rust.ts +41 -1
- package/project/.sdk/src/cmp/rust/Main_rust.ts +19 -0
- package/project/.sdk/src/cmp/rust/PrepareAuth_rust.ts +410 -0
- package/project/.sdk/src/cmp/rust/Schema_rust.ts +107 -0
- package/project/.sdk/src/cmp/scala/Config_scala.ts +21 -1
- package/project/.sdk/src/cmp/scala/Main_scala.ts +17 -0
- package/project/.sdk/src/cmp/scala/PrepareAuth_scala.ts +415 -0
- package/project/.sdk/src/cmp/scala/Schema_scala.ts +108 -0
- package/project/.sdk/src/cmp/swift/Config_swift.ts +37 -1
- package/project/.sdk/src/cmp/swift/Main_swift.ts +13 -0
- package/project/.sdk/src/cmp/swift/PrepareAuth_swift.ts +439 -0
- package/project/.sdk/src/cmp/swift/Schema_swift.ts +92 -0
- package/project/.sdk/src/cmp/ts/Config_ts.ts +12 -1
- package/project/.sdk/src/cmp/ts/Main_ts.ts +5 -0
- package/project/.sdk/src/cmp/ts/PrepareAuth_ts.ts +237 -0
- package/project/.sdk/src/cmp/zig/Config_zig.ts +33 -1
- package/project/.sdk/src/cmp/zig/Main_zig.ts +19 -0
- package/project/.sdk/src/cmp/zig/PrepareAuth_zig.ts +545 -0
- package/project/.sdk/src/cmp/zig/Schema_zig.ts +114 -0
- package/project/.sdk/tm/c/core/context.c +3 -0
- package/project/.sdk/tm/c/core/sdk.h +14 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/capability.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/capability.h +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/catalog.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/catalog.h +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/config.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/config.h +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/depend.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/depend.h +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/env.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/env.h +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/export.c +3 -3
- package/project/.sdk/tm/c/feature/secrets/plugin/export.h +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/graph.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/graph.h +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/host.c +25 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/host.h +3 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/order.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/order.h +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/point.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/point.h +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/ref.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/ref.h +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/resolve.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/resolve.h +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/types.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/types.h +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/value.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/value.h +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/version.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugin/version.h +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugins/aws.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugins/azuresecrets.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugins/boru.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugins/clock.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugins/doppler.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugins/encode.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugins/gcpsecrets.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugins/hashicorp.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugins/httpjson.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugins/infisical.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugins/minivault.c +2072 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/onepassword.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugins/proc.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugins/secretspec.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugins/sekretoplugins.h +151 -10
- package/project/.sdk/tm/c/feature/secrets/plugins/sha256.c +16 -10
- package/project/.sdk/tm/c/feature/secrets/plugins/sigv4.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/plugins/support.h +12 -8
- package/project/.sdk/tm/c/feature/secrets/plugins/tls.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/sekreto/internal.h +17 -2
- package/project/.sdk/tm/c/feature/secrets/sekreto/json.c +5 -5
- package/project/.sdk/tm/c/feature/secrets/sekreto/providers.c +37 -9
- package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.c +2 -2
- package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.h +17 -2
- package/project/.sdk/tm/c/feature/secrets/sekreto/util.c +16 -2
- package/project/.sdk/tm/c/feature/validate.c +364 -0
- package/project/.sdk/tm/c/feature/validate.h +29 -0
- package/project/.sdk/tm/c/src/feature/validate/.gitkeep +0 -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/c/utility/make_options.c +12 -24
- package/project/.sdk/tm/c/utility/make_spec.c +8 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/capability.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/catalog.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/config.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/depend.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/env.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/export.clj +3 -3
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/graph.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/host.clj +17 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/json.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/order.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/point.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/ref.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/resolve.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/types.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/version.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/addr.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/chain.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/core.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/json.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/aws.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/azuresecrets.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/boru.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/doppler.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/gcpsecrets.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/hashicorp.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/httpjson.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/infisical.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/minivault.clj +837 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/onepassword.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/proc.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/secretspec.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/sigv4.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/provider.clj +2 -2
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/providers.clj +6 -4
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto.clj +2 -2
- package/project/.sdk/tm/clojure/src/feature/validate/.gitkeep +0 -0
- package/project/.sdk/tm/clojure/src/sdk/core.clj +52 -51
- package/project/.sdk/tm/clojure/src/sdk/features.clj +202 -0
- 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/core/types.hpp +4 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/config.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/config.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/env.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/env.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/export.cpp +3 -3
- package/project/.sdk/tm/cpp/feature/secrets/plugin/export.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/host.cpp +21 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/host.hpp +3 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/order.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/order.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/point.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/point.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/types.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/types.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/value.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/value.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/version.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugin/version.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.hpp +9 -7
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Minivault.cpp +1345 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Minivault.hpp +219 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.cpp +22 -2
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.hpp +12 -2
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.cpp +3 -3
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.cpp +2 -2
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.hpp +2 -2
- package/project/.sdk/tm/cpp/feature/validate.hpp +301 -0
- package/project/.sdk/tm/cpp/src/feature/validate/.gitkeep +0 -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/cpp/utility/pipeline.hpp +42 -63
- package/project/.sdk/tm/csharp/feature/ValidateFeature.cs +343 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Capability.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Catalog.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Config.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Definition.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Depend.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Entry.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Env.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Export.cs +3 -3
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Graph.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Host.cs +9 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Inst.cs +21 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Json.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Order.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Plugin.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Point.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Refs.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Resolve.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Types.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Version.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Aws.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugins/AzureSecrets.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Boru.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Child.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Doppler.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugins/GcpSecrets.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Hashicorp.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugins/HttpJson.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Infisical.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugins/MiniVault.cs +1572 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/OnePassword.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugins/SecretSpec.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Sigv4.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/sekreto/Json.cs +2 -2
- package/project/.sdk/tm/csharp/feature/secrets/sekreto/Providers.cs +3 -2
- package/project/.sdk/tm/csharp/feature/secrets/sekreto/Sekreto.cs +2 -2
- package/project/.sdk/tm/csharp/src/feature/validate/.gitkeep +0 -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 +12 -74
- package/project/.sdk/tm/csharp/utility/struct/Struct.cs +24 -3
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/capability.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/catalog.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/config.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/depend.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/env.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/error.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/export.ex +7 -4
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/graph.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/host.ex +13 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/inst.ex +15 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/json.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/order.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/point.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/ref.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/resolve.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/types.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/version.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/voxgig_plugin.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/json.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/aws.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/azuresecrets.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/boru.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/doppler.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/gcpsecrets.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/hashicorp.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/http.ex +3 -3
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/httpjson.ex +3 -3
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/infisical.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/minivault.ex +1033 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/onepassword.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/proc.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/secretspec.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/sigv4.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/provider.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/providers.ex +17 -5
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/sekreto.ex +2 -2
- package/project/.sdk/tm/elixir/lib/projectname/feature/validate.ex +320 -0
- package/project/.sdk/tm/elixir/lib/projectname/utility.ex +17 -66
- package/project/.sdk/tm/elixir/src/feature/validate/.gitkeep +0 -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 +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/host.go +25 -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/minivault/format.go +493 -0
- package/project/.sdk/tm/go/feature/secrets/plugins/minivault/minivault.go +1131 -0
- 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 +14 -2
- package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +2 -2
- package/project/.sdk/tm/go/feature/validate_feature.go +346 -0
- package/project/.sdk/tm/go/src/feature/validate/.gitkeep +0 -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/make_options.go +13 -54
- package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +24 -8
- package/project/.sdk/tm/java/feature/ValidateFeature.java +330 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Capability.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/plugin/Catalog.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/plugin/Config.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/plugin/Definition.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/plugin/Depend.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/plugin/Entry.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/plugin/Env.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/plugin/Export.java +3 -3
- package/project/.sdk/tm/java/feature/secrets/plugin/Graph.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/plugin/Host.java +3 -3
- package/project/.sdk/tm/java/feature/secrets/plugin/Inst.java +21 -2
- package/project/.sdk/tm/java/feature/secrets/plugin/Json.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/plugin/Order.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/plugin/Plugin.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/plugin/PluginException.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/plugin/Point.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/plugin/Refs.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/plugin/Resolve.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/plugin/Types.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/plugin/Version.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/sekreto/Addr.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/sekreto/Builtins.java +4 -3
- package/project/.sdk/tm/java/feature/secrets/sekreto/Json.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/sekreto/Provider.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/sekreto/Sekreto.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/sekreto/Support.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Aws.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Azuresecrets.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Boru.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Doppler.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Gcpsecrets.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Hashicorp.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Httpjson.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Infisical.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Minivault.java +1448 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Onepassword.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Proc.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Secretspec.java +2 -2
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Sigv4.java +2 -2
- package/project/.sdk/tm/java/src/feature/validate/.gitkeep +0 -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 +13 -33
- package/project/.sdk/tm/java/utility/struct/Struct.java +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/plugin/capability.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/plugin/catalog.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/plugin/config.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/plugin/depend.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/plugin/env.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/plugin/export.js +3 -3
- package/project/.sdk/tm/js/src/feature/secrets/plugin/graph.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/plugin/host.js +17 -2
- package/project/.sdk/tm/js/src/feature/secrets/plugin/index.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/plugin/order.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/plugin/point.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/plugin/ref.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/plugin/resolve.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/plugin/types.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/plugin/version.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/Sekreto.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/index.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/aws.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/azuresecrets.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/boru.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/doppler.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/gcpsecrets.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/hashicorp.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/httpjson.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/infisical.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/minivault.js +866 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/onepassword.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/secretspec.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/sigv4.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/addr.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/builtin.js +3 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/dotenv.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/env.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/file.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/memory.js +2 -2
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/support.js +2 -2
- package/project/.sdk/tm/js/src/utility/StructUtility.js +1 -1
- 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/ValidateFeature.kt +297 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Capability.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Catalog.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Config.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Depend.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Env.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Export.kt +3 -3
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Graph.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Host.kt +21 -2
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Json.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Order.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Plugin.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Point.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Refs.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Resolve.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Types.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Version.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Json.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Provider.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Providers.kt +3 -2
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Sekreto.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Spec.kt +14 -2
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Support.kt +10 -2
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Aws.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Azuresecrets.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Boru.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Doppler.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Gcpsecrets.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Hashicorp.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Httpjson.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Infisical.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Minivault.kt +1095 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Onepassword.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Secretspec.kt +2 -2
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Sigv4.kt +2 -2
- package/project/.sdk/tm/kotlin/src/feature/validate/.gitkeep +0 -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/MakeOptions.kt +13 -22
- package/project/.sdk/tm/kotlin/utility/MakeSpecUrl.kt +6 -0
- package/project/.sdk/tm/kotlin/utility/Prepare.kt +13 -46
- package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +1 -1
- package/project/.sdk/tm/lua/feature/secrets/native/sekretonet.c +2 -2
- package/project/.sdk/tm/lua/feature/secrets/native/sekretovault.c +240 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/capability.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/plugin/catalog.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/plugin/config.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/plugin/depend.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/plugin/env.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/plugin/export.lua +12 -3
- package/project/.sdk/tm/lua/feature/secrets/plugin/graph.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/plugin/host.lua +18 -2
- package/project/.sdk/tm/lua/feature/secrets/plugin/json.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/plugin/order.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/plugin/point.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/plugin/ref.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/plugin/resolve.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/plugin/types.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/plugin/version.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/plugin.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/addr.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/err.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/name.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/aws.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/azuresecrets.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/boru.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/crypto.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/doppler.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/gcpsecrets.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/hashicorp.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/httpjson.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/infisical.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/json.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/minivault.lua +1227 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/net.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/onepassword.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/secretspec.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/sigv4.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/support.lua +2 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto/providers.lua +3 -2
- package/project/.sdk/tm/lua/feature/secrets/sekreto.lua +2 -2
- package/project/.sdk/tm/lua/feature/validate_feature.lua +333 -0
- package/project/.sdk/tm/lua/src/feature/validate/.gitkeep +0 -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/make_options.lua +74 -55
- package/project/.sdk/tm/lua/utility/make_spec.lua +8 -1
- package/project/.sdk/tm/lua/utility/struct/regex.lua +1 -1
- package/project/.sdk/tm/lua/utility/struct/struct.lua +1 -1
- package/project/.sdk/tm/ocaml/Makefile +16 -1
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/capability.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/catalog.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/config.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/defs.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/depend.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/env.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/export.ml +5 -3
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/graph.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/host.ml +18 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/order.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/point.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/ref.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/resolve.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/types.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/value.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/version.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/aws.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/azuresecrets.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/boru.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/crypto.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/doppler.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/gcpsecrets.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/hashicorp.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/http.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/httpjson.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/infisical.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/minivault.ml +1086 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/minivault_stubs.c +222 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/onepassword.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/runcmd.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/secretspec.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/sigv4.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls_stubs.c +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/json.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/provider.ml +33 -3
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/secret.ml +2 -2
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/sekreto.ml +4 -3
- package/project/.sdk/tm/ocaml/sdk_features.ml +174 -0
- package/project/.sdk/tm/ocaml/sdk_helpers.ml +15 -0
- package/project/.sdk/tm/ocaml/sdk_runtime.ml +30 -49
- package/project/.sdk/tm/ocaml/src/feature/validate/.gitkeep +0 -0
- package/project/.sdk/tm/ocaml/test/feature/secrets/t_secrets.ml +125 -12
- package/project/.sdk/tm/ocaml/test/t_pipeline.ml +64 -6
- package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +2 -2
- package/project/.sdk/tm/perl/core/helpers.pm +64 -16
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Capability.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Catalog.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Config.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Depend.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Env.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Export.pm +3 -3
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Graph.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Host.pm +19 -2
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Order.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Point.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Ref.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Resolve.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Types.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Version.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Aws.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Azuresecrets.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Boru.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Doppler.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Gcpsecrets.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Hashicorp.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Httpjson.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Infisical.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Minivault.pm +1380 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Onepassword.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Proc.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Secretspec.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Sigv4.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Addr.pm +2 -2
- package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Providers.pm +4 -3
- package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto.pm +2 -2
- package/project/.sdk/tm/perl/feature/validate_feature.pm +319 -0
- package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +1 -1
- package/project/.sdk/tm/perl/src/feature/validate/.gitkeep +0 -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/perl/utility/make_options.pm +25 -34
- package/project/.sdk/tm/php/feature/ValidateFeature.php +361 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Capability.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/plugin/Catalog.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/plugin/Config.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/plugin/Depend.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/plugin/Env.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/plugin/Export.php +3 -3
- package/project/.sdk/tm/php/feature/secrets/plugin/Graph.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/plugin/Host.php +26 -2
- package/project/.sdk/tm/php/feature/secrets/plugin/Order.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/plugin/Point.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/plugin/Ref.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/plugin/Resolve.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/plugin/Types.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/plugin/Version.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/plugin/plugin.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/aws.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/azuresecrets.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/boru.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/doppler.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/gcpsecrets.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/hashicorp.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/httpjson.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/infisical.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/minivault.php +1250 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/onepassword.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/runcmd.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/secretspec.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/sigv4.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/sekreto/src/Addr.php +2 -2
- package/project/.sdk/tm/php/feature/secrets/sekreto/src/Providers.php +5 -3
- package/project/.sdk/tm/php/feature/secrets/sekreto/src/Sekreto.php +2 -2
- package/project/.sdk/tm/php/src/feature/validate/.gitkeep +0 -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/php/utility/MakeOptions.php +15 -24
- package/project/.sdk/tm/php/utility/struct/Struct.php +56 -7
- 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 +2 -2
- 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 +17 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/minivault.py +1202 -0
- 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 +2 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/validate_feature.py +273 -0
- package/project/.sdk/tm/py/pkg/utility/make_options.py +14 -53
- package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +1 -1
- package/project/.sdk/tm/py/src/feature/validate/.gitkeep +0 -0
- package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +1 -1
- package/project/.sdk/tm/py/test/voxgig_omni/runner.py +1 -1
- package/project/.sdk/tm/py/test/voxgig_omni/util.py +1 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/capability.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/catalog.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/config.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/depend.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/env.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/export.rb +3 -3
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/graph.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/host.rb +16 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/order.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/point.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/ref.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/resolve.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/types.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/version.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/addr.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/aws.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/azuresecrets.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/boru.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/doppler.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/hashicorp.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/httpjson.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/infisical.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/minivault.rb +979 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/onepassword.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/secretspec.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/sigv4.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/providers.rb +6 -5
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/sekreto.rb +2 -2
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto.rb +2 -2
- package/project/.sdk/tm/rb/feature/validate_feature.rb +265 -0
- package/project/.sdk/tm/rb/src/feature/validate/.gitkeep +0 -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/rb/utility/make_options.rb +15 -32
- package/project/.sdk/tm/rb/utility/struct/voxgig_struct.rb +24 -1
- package/project/.sdk/tm/rust/core/mod.rs +3 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/capability.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/catalog.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/config.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/depend.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/env.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/export.rs +3 -3
- package/project/.sdk/tm/rust/feature/secrets/plugin/graph.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/host.rs +24 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/mod.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/order.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/point.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/refs.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/resolve.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/types.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/value.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/version.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugins/aws/crypto.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugins/aws/sigv4.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugins/aws.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugins/azuresecrets.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugins/boru.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugins/doppler.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugins/gcpsecrets.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugins/hashicorp.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/http.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/json.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugins/infisical.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugins/minivault/format.rs +425 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/minivault.rs +1076 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/onepassword.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugins/secretspec.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/sekreto/addr.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/sekreto/mod.rs +2 -2
- package/project/.sdk/tm/rust/feature/secrets/sekreto/providers.rs +30 -4
- package/project/.sdk/tm/rust/feature/secrets/sekreto/sekreto.rs +2 -2
- package/project/.sdk/tm/rust/feature/validate.rs +387 -0
- package/project/.sdk/tm/rust/src/feature/validate/.gitkeep +0 -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/rust/utility/make_options.rs +12 -51
- package/project/.sdk/tm/rust/utility/make_spec.rs +10 -3
- package/project/.sdk/tm/scala/feature/ValidateFeature.scala +286 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Capability.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/plugin/Config.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/plugin/Depend.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/plugin/Env.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/plugin/Export.scala +3 -3
- package/project/.sdk/tm/scala/feature/secrets/plugin/Graph.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/plugin/Host.scala +19 -2
- package/project/.sdk/tm/scala/feature/secrets/plugin/Json.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/plugin/Order.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/plugin/Plugin.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/plugin/Point.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/plugin/Refs.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/plugin/Resolve.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/plugin/Types.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/plugin/Value.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/plugin/Version.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Json.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Provider.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Providers.scala +3 -2
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Sekreto.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Spec.scala +13 -2
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Support.scala +11 -2
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Aws.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Azuresecrets.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Boru.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Doppler.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Gcpsecrets.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Hashicorp.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Httpjson.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Infisical.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Minivault.scala +979 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Onepassword.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Secretspec.scala +2 -2
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Sigv4.scala +2 -2
- 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/src/feature/validate/.gitkeep +0 -0
- package/project/.sdk/tm/scala/utility/Make.scala +12 -28
- package/project/.sdk/tm/scala/utility/MakeSpec.scala +8 -1
- package/project/.sdk/tm/scala/utility/Prepare.scala +16 -40
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/ValidateFeature.swift +273 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Capability.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Catalog.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Config.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Depend.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Env.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Export.swift +3 -3
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Graph.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Host.swift +17 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Json.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Order.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Point.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Refs.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Resolve.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Types.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Value.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Version.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Aws.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Azuresecrets.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Boru.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Crypto.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Doppler.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Gcpsecrets.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Hashicorp.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Httpjson.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Infisical.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Onepassword.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Proc.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Secretspec.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Sigv4.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Addr.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Json.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Provider.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Providers.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Sekreto.swift +2 -2
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/Make.swift +9 -3
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/MakeOptions.swift +12 -60
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/Prepare.swift +21 -39
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +3 -3
- 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/swift/src/feature/validate/.gitkeep +0 -0
- 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 +13 -2
- 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 +27 -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/minivault.ts +1034 -0
- 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 +2 -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 +11 -1
- package/project/.sdk/tm/ts/src/utility/StructUtility.ts +1 -1
- 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/core/utility.zig +45 -77
- package/project/.sdk/tm/zig/feature/secrets/plugin/capability.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugin/catalog.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugin/config.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugin/depend.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugin/env.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugin/export.zig +3 -3
- package/project/.sdk/tm/zig/feature/secrets/plugin/graph.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugin/host.zig +18 -2
- package/project/.sdk/tm/zig/feature/secrets/plugin/inst.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugin/order.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugin/plugin.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugin/point.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugin/ref.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugin/resolve.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugin/types.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugin/value.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugin/version.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugins/aws.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugins/azuresecrets.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugins/boru.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugins/doppler.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugins/gcpsecrets.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugins/hashicorp.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugins/httpjson.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugins/infisical.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugins/minivault.zig +1930 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/onepassword.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugins/secretspec.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/plugins/sigv4.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/sekreto/addr.zig +2 -2
- package/project/.sdk/tm/zig/feature/secrets/sekreto/builtins.zig +3 -2
- package/project/.sdk/tm/zig/feature/secrets/sekreto/provider.zig +19 -2
- package/project/.sdk/tm/zig/feature/secrets/sekreto/sekreto.zig +2 -2
- package/project/.sdk/tm/zig/feature/validate.zig +293 -0
- package/project/.sdk/tm/zig/src/feature/validate/.gitkeep +0 -0
- package/project/.sdk/tm/zig/test/pipeline_test.zig +34 -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 -1
- package/src/helpers/applicability.ts +11 -6
- package/src/helpers/collectDeps.ts +30 -5
- package/src/helpers/naming.ts +2 -2
- package/src/sdkgen.ts +4 -1
- package/src/utility.ts +75 -0
- package/project/.sdk/tm/c/utility/prepare_auth.c +0 -65
- package/project/.sdk/tm/csharp/utility/PrepareAuth.cs +0 -54
- package/project/.sdk/tm/go/utility/prepare_auth.go +0 -59
- package/project/.sdk/tm/java/utility/PrepareAuth.java +0 -66
- package/project/.sdk/tm/js/src/utility/PrepareAuthUtility.js +0 -49
- package/project/.sdk/tm/lua/utility/prepare_auth.lua +0 -52
- package/project/.sdk/tm/perl/utility/prepare_auth.pm +0 -56
- package/project/.sdk/tm/php/utility/PrepareAuth.php +0 -45
- package/project/.sdk/tm/py/pkg/utility/prepare_auth.py +0 -46
- package/project/.sdk/tm/rb/utility/prepare_auth.rb +0 -35
- package/project/.sdk/tm/rust/utility/prepare_auth.rs +0 -65
- package/project/.sdk/tm/ts/src/utility/PrepareAuthUtility.ts +0 -78
|
@@ -0,0 +1,979 @@
|
|
|
1
|
+
// VENDORED: @voxgig/sekreto sdk-20260917-1242-0 (scala/plugins/Minivault.scala)
|
|
2
|
+
// Source: https://github.com/voxgig/sekreto @ 108c4a914bee7b6534c30d1c68c25cd1b9377696 [tag: sdk-20260917-1242-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
// The mini vault, as a voxgig/plugin definition.
|
|
5
|
+
//
|
|
6
|
+
// A port of typescript/plugins/minivault.ts, which is canonical.
|
|
7
|
+
//
|
|
8
|
+
// PLUGIN CODE, not core: it needs crypto, which is the line the four
|
|
9
|
+
// built-ins stay behind. See docs/design/plugin-providers.md.
|
|
10
|
+
//
|
|
11
|
+
// THE KEY DECIDES WHAT THE VAULT HOLDS. A master key reads and writes
|
|
12
|
+
// every name and mints restricted keys. A restricted key reads the names
|
|
13
|
+
// it was granted and CANNOT DERIVE ANY OTHER - the restriction is the
|
|
14
|
+
// cryptography rather than a check this code performs. What that does and
|
|
15
|
+
// does not protect is set out in DOCS.md under "What the mini vault
|
|
16
|
+
// protects".
|
|
17
|
+
//
|
|
18
|
+
// `javax.crypto` carries all four primitives, so nothing here is
|
|
19
|
+
// hand-rolled (AGENTS.md rule 3).
|
|
20
|
+
|
|
21
|
+
package com.voxgig.sekreto.plugins
|
|
22
|
+
|
|
23
|
+
import java.io.IOException
|
|
24
|
+
import java.nio.ByteBuffer
|
|
25
|
+
import java.nio.charset.StandardCharsets
|
|
26
|
+
import java.nio.file.FileAlreadyExistsException
|
|
27
|
+
import java.nio.file.Files
|
|
28
|
+
import java.nio.file.NoSuchFileException
|
|
29
|
+
import java.nio.file.Path
|
|
30
|
+
import java.nio.file.Paths
|
|
31
|
+
import java.nio.file.StandardCopyOption
|
|
32
|
+
import java.nio.file.StandardOpenOption
|
|
33
|
+
import java.nio.file.attribute.PosixFilePermissions
|
|
34
|
+
import java.security.GeneralSecurityException
|
|
35
|
+
import java.security.SecureRandom
|
|
36
|
+
import java.util.Base64
|
|
37
|
+
import javax.crypto.Cipher
|
|
38
|
+
import javax.crypto.Mac
|
|
39
|
+
import javax.crypto.SecretKeyFactory
|
|
40
|
+
import javax.crypto.spec.GCMParameterSpec
|
|
41
|
+
import javax.crypto.spec.PBEKeySpec
|
|
42
|
+
import javax.crypto.spec.SecretKeySpec
|
|
43
|
+
import scala.collection.immutable.ListMap
|
|
44
|
+
import scala.util.control.NonFatal
|
|
45
|
+
|
|
46
|
+
import voxgig.plugin.Definition
|
|
47
|
+
import voxgig.plugin.Inst
|
|
48
|
+
import voxgig.plugin.PluginError
|
|
49
|
+
import voxgig.plugin.VOpaque
|
|
50
|
+
import voxgig.plugin.VStr
|
|
51
|
+
import com.voxgig.sekreto.*
|
|
52
|
+
|
|
53
|
+
// --- the format ------------------------------------------------------
|
|
54
|
+
//
|
|
55
|
+
// magic 4 'SKMV'
|
|
56
|
+
// version 1 FORMAT
|
|
57
|
+
// kdf 1 1 = PBKDF2-HMAC-SHA256
|
|
58
|
+
// cipher 1 1 = AES-256-GCM
|
|
59
|
+
// reserved 1 0
|
|
60
|
+
// keycount 4 uint32
|
|
61
|
+
// per key:
|
|
62
|
+
// id 1 + bytes the key id, PLAINTEXT
|
|
63
|
+
// salt 1 + bytes
|
|
64
|
+
// iters 4 PBKDF2 rounds for this key
|
|
65
|
+
// ring 1 + iv, 4 + bytes sealed under the passphrase
|
|
66
|
+
// meta 1 + iv, 4 + bytes sealed under the vault's meta key
|
|
67
|
+
// entrycount 4 uint32
|
|
68
|
+
// per entry:
|
|
69
|
+
// id 1 + bytes the blinded lookup id
|
|
70
|
+
// name 1 + iv, 4 + bytes sealed under the vault's name key
|
|
71
|
+
// value 1 + iv, 4 + bytes sealed under that secret's own key
|
|
72
|
+
//
|
|
73
|
+
// Integers are big-endian, and every length precedes its bytes. A file one
|
|
74
|
+
// port writes is read by every other; `test/fixture` pins that with a
|
|
75
|
+
// committed vault rather than with agreement.
|
|
76
|
+
|
|
77
|
+
private val MAGIC = "SKMV"
|
|
78
|
+
private val FORMAT = 1
|
|
79
|
+
private val KDF_PBKDF2 = 1
|
|
80
|
+
private val CIPHER_AESGCM = 1
|
|
81
|
+
|
|
82
|
+
/** AES-256-GCM: 32-byte keys, 12-byte nonces, 16-byte tags. */
|
|
83
|
+
private val KEYLEN = 32
|
|
84
|
+
private val IVLEN = 12
|
|
85
|
+
private val TAGLEN = 16
|
|
86
|
+
private val SALTLEN = 16
|
|
87
|
+
|
|
88
|
+
/** PBKDF2-HMAC-SHA256 rounds when a caller names none. */
|
|
89
|
+
val MINIVAULT_ITERATIONS = 210000
|
|
90
|
+
|
|
91
|
+
/** The key id a vault gets when a caller names none. */
|
|
92
|
+
val MASTERKEY = "master"
|
|
93
|
+
|
|
94
|
+
// Additional authenticated data. Every blob is bound to its PLACE in the
|
|
95
|
+
// file, so no ciphertext can be moved.
|
|
96
|
+
private val AAD_RING = "skmv1:ring:"
|
|
97
|
+
private val AAD_META = "skmv1:meta:"
|
|
98
|
+
private val AAD_NAME = "skmv1:name"
|
|
99
|
+
private val AAD_SECRET = "skmv1:secret:"
|
|
100
|
+
|
|
101
|
+
// Everything a master can reach is derived from the root key, so a
|
|
102
|
+
// rotation is one new random value rather than a re-wrap of each part.
|
|
103
|
+
private val LABEL_NAMES = "skmv1:names"
|
|
104
|
+
private val LABEL_META = "skmv1:meta"
|
|
105
|
+
private val LABEL_ID = "skmv1:id"
|
|
106
|
+
|
|
107
|
+
/** The largest key id the format can record.
|
|
108
|
+
*
|
|
109
|
+
* `small` writes a length in ONE byte. A longer id wrapped that byte and
|
|
110
|
+
* the writer then appended the whole thing, so every field after it
|
|
111
|
+
* shifted. Checked where an id is ACCEPTED, so the refusal names the id
|
|
112
|
+
* rather than the file.
|
|
113
|
+
*/
|
|
114
|
+
private val IDMAX = 255
|
|
115
|
+
|
|
116
|
+
/** The export key the vault API is published under, beside `provider`. */
|
|
117
|
+
val VAULT_EXPORT = "vault"
|
|
118
|
+
|
|
119
|
+
private val MVRANDOM = SecureRandom()
|
|
120
|
+
|
|
121
|
+
private def mvfail(text: String): Nothing =
|
|
122
|
+
throw SekretoError("sekreto: minivault: " + text)
|
|
123
|
+
|
|
124
|
+
private def mvutf8(text: String): Array[Byte] = text.getBytes(StandardCharsets.UTF_8)
|
|
125
|
+
|
|
126
|
+
/** The key a caller asked for, or [[MASTERKEY]]: an EMPTY key is no key.
|
|
127
|
+
* The canonical's `opts.key || MASTERKEY` answers for both absent and
|
|
128
|
+
* empty, where `getOrElse` answers for absent alone - and a CLI reaches
|
|
129
|
+
* this with SEKRETO_VAULT_KEY set and empty, which is what an unset shell
|
|
130
|
+
* variable expands to.
|
|
131
|
+
*/
|
|
132
|
+
/** The lock every handle on one file shares.
|
|
133
|
+
*
|
|
134
|
+
* Each [[MiniVault]] is its own object, so two handles on one path did
|
|
135
|
+
* not coordinate: both could finish `load` before either saved, and the
|
|
136
|
+
* second rename then discarded the first one's change while reporting
|
|
137
|
+
* success. Keyed by the ABSOLUTE path, so two handles spelled
|
|
138
|
+
* differently still meet.
|
|
139
|
+
*
|
|
140
|
+
* A guarantee WITHIN one process, which is what DOCS.md promises and
|
|
141
|
+
* what the go port arranges the same way. Two processes still race, and
|
|
142
|
+
* the format's answer to that is the exclusive create and the atomic
|
|
143
|
+
* rename: a reader sees one whole vault or the other, never half of one.
|
|
144
|
+
*/
|
|
145
|
+
private val MVLOCKS = java.util.concurrent.ConcurrentHashMap[String, AnyRef]()
|
|
146
|
+
|
|
147
|
+
private def mvlockfor(file: String): AnyRef =
|
|
148
|
+
val key =
|
|
149
|
+
try Paths.get(file).toAbsolutePath.normalize.toString
|
|
150
|
+
catch case _: RuntimeException => file
|
|
151
|
+
|
|
152
|
+
MVLOCKS.computeIfAbsent(key, _ => Object())
|
|
153
|
+
|
|
154
|
+
private def mvwantkey(value: String): String =
|
|
155
|
+
if value.isEmpty then MASTERKEY else value
|
|
156
|
+
|
|
157
|
+
private def mvcheckid(id: Option[String], what: String): String =
|
|
158
|
+
val text = id.getOrElse("")
|
|
159
|
+
if text.isEmpty then mvfail(what)
|
|
160
|
+
if mvutf8(text).length > IDMAX then
|
|
161
|
+
mvfail(s"key id is longer than $IDMAX bytes: ${text.take(32)}...")
|
|
162
|
+
text
|
|
163
|
+
|
|
164
|
+
// --- keys ------------------------------------------------------------
|
|
165
|
+
|
|
166
|
+
private def mvhmac(key: Array[Byte], text: String): Array[Byte] =
|
|
167
|
+
try
|
|
168
|
+
val mac = Mac.getInstance("HmacSHA256")
|
|
169
|
+
mac.init(SecretKeySpec(key, "HmacSHA256"))
|
|
170
|
+
mac.doFinal(mvutf8(text))
|
|
171
|
+
catch case err: GeneralSecurityException => mvfail("hmac: " + err.getMessage)
|
|
172
|
+
|
|
173
|
+
/** The key-encryption key a passphrase unwraps a ring with. */
|
|
174
|
+
private def mvkek(passphrase: String, salt: Array[Byte], iters: Int): Array[Byte] =
|
|
175
|
+
try
|
|
176
|
+
SecretKeyFactory
|
|
177
|
+
.getInstance("PBKDF2WithHmacSHA256")
|
|
178
|
+
.generateSecret(PBEKeySpec(passphrase.toCharArray, salt, iters, KEYLEN * 8))
|
|
179
|
+
.getEncoded
|
|
180
|
+
catch case err: GeneralSecurityException => mvfail("pbkdf2: " + err.getMessage)
|
|
181
|
+
|
|
182
|
+
/** The key one named secret's value is encrypted with.
|
|
183
|
+
*
|
|
184
|
+
* DERIVED, never stored, for a master: it holds the root key and so
|
|
185
|
+
* reaches every name, including ones written after it was made. A
|
|
186
|
+
* restricted key holds the derived keys it was granted and nothing that
|
|
187
|
+
* produces another.
|
|
188
|
+
*/
|
|
189
|
+
private def mvsecretkey(root: Array[Byte], name: String): Array[Byte] =
|
|
190
|
+
mvhmac(root, AAD_SECRET + name)
|
|
191
|
+
|
|
192
|
+
/** Where a secret lives in the file, derived from its own key so that
|
|
193
|
+
* finding it needs no plaintext name.
|
|
194
|
+
*/
|
|
195
|
+
private def mventryid(key: Array[Byte]): Array[Byte] = mvhmac(key, LABEL_ID)
|
|
196
|
+
|
|
197
|
+
private def mvrandom(len: Int): Array[Byte] =
|
|
198
|
+
val out = new Array[Byte](len)
|
|
199
|
+
MVRANDOM.nextBytes(out)
|
|
200
|
+
out
|
|
201
|
+
|
|
202
|
+
// --- sealing ---------------------------------------------------------
|
|
203
|
+
|
|
204
|
+
/** A nonce and the ciphertext with its tag appended. */
|
|
205
|
+
private final case class Sealed(iv: Array[Byte], blob: Array[Byte]):
|
|
206
|
+
def same(other: Sealed): Boolean =
|
|
207
|
+
java.util.Arrays.equals(iv, other.iv) && java.util.Arrays.equals(blob, other.blob)
|
|
208
|
+
|
|
209
|
+
private def mvseal(key: Array[Byte], plain: Array[Byte], aad: String): Sealed =
|
|
210
|
+
try
|
|
211
|
+
val iv = mvrandom(IVLEN)
|
|
212
|
+
val cipher = Cipher.getInstance("AES/GCM/NoPadding")
|
|
213
|
+
cipher.init(Cipher.ENCRYPT_MODE, SecretKeySpec(key, "AES"), GCMParameterSpec(TAGLEN * 8, iv))
|
|
214
|
+
cipher.updateAAD(mvutf8(aad))
|
|
215
|
+
Sealed(iv, cipher.doFinal(plain))
|
|
216
|
+
catch case err: GeneralSecurityException => mvfail("cannot seal: " + err.getMessage)
|
|
217
|
+
|
|
218
|
+
/** The plaintext, or a refusal. A GCM tag that fails to verify is the only
|
|
219
|
+
* evidence there is, and it cannot tell a wrong passphrase from a damaged
|
|
220
|
+
* file, so `what` names the attempt and the message admits both.
|
|
221
|
+
*/
|
|
222
|
+
private def mvunseal(key: Array[Byte], sealed_ : Sealed, aad: String, what: String): Array[Byte] =
|
|
223
|
+
if sealed_.blob.length < TAGLEN || IVLEN != sealed_.iv.length then
|
|
224
|
+
mvfail(what + ": truncated")
|
|
225
|
+
|
|
226
|
+
// The WHOLE round-trip is guarded, not only the tag check: a nonce of the
|
|
227
|
+
// wrong length makes `init` itself raise, and a damaged file reaching a
|
|
228
|
+
// caller as a raw GeneralSecurityException is a refusal nobody can act
|
|
229
|
+
// on.
|
|
230
|
+
try
|
|
231
|
+
val cipher = Cipher.getInstance("AES/GCM/NoPadding")
|
|
232
|
+
cipher.init(
|
|
233
|
+
Cipher.DECRYPT_MODE,
|
|
234
|
+
SecretKeySpec(key, "AES"),
|
|
235
|
+
GCMParameterSpec(TAGLEN * 8, sealed_.iv),
|
|
236
|
+
)
|
|
237
|
+
cipher.updateAAD(mvutf8(aad))
|
|
238
|
+
cipher.doFinal(sealed_.blob)
|
|
239
|
+
catch case NonFatal(_) => mvfail(what)
|
|
240
|
+
|
|
241
|
+
// THE JSON IS AN ENUM HERE and a plain map everywhere else. This port's
|
|
242
|
+
// `Json` carries `Json.Obj` / `Json.Str` rather than `Any`, so a ring
|
|
243
|
+
// crosses the boundary twice: `mvplain` on the way in, `mvtagged` on the
|
|
244
|
+
// way out. The bytes are the same either way.
|
|
245
|
+
private def mvjsonof(plain: Array[Byte], what: String): Map[String, Any] =
|
|
246
|
+
Json.parse(String(plain, StandardCharsets.UTF_8)) match
|
|
247
|
+
case Some(Json.Obj(value)) => value.map((key, one) => (key, mvplain(one))).toMap
|
|
248
|
+
case _ => mvfail("unreadable " + what)
|
|
249
|
+
|
|
250
|
+
private def mvplain(value: Json): Any = value match
|
|
251
|
+
case Json.Null => null
|
|
252
|
+
case Json.Bool(one) => one
|
|
253
|
+
case Json.Num(one) => one
|
|
254
|
+
case Json.Str(one) => one
|
|
255
|
+
case Json.Arr(items) => items.map(mvplain)
|
|
256
|
+
case Json.Obj(pairs) => pairs.map((key, one) => (key, mvplain(one))).toMap
|
|
257
|
+
|
|
258
|
+
private def mvtagged(value: Any): Json = value match
|
|
259
|
+
case null => Json.Null
|
|
260
|
+
case one: Boolean => Json.Bool(one)
|
|
261
|
+
case one: Int => Json.Num(one.toDouble)
|
|
262
|
+
case one: Double => Json.Num(one)
|
|
263
|
+
case one: String => Json.Str(one)
|
|
264
|
+
case one: List[?] => Json.Arr(one.map(mvtagged))
|
|
265
|
+
case one: ListMap[?, ?] =>
|
|
266
|
+
Json.Obj(ListMap.from(one.map((key, item) => (key.toString, mvtagged(item)))))
|
|
267
|
+
case one: Map[?, ?] =>
|
|
268
|
+
Json.Obj(ListMap.from(one.map((key, item) => (key.toString, mvtagged(item)))))
|
|
269
|
+
case other => mvfail("cannot encode " + other)
|
|
270
|
+
|
|
271
|
+
private def mvstringify(value: ListMap[String, Any]): String = Json.stringify(mvtagged(value))
|
|
272
|
+
|
|
273
|
+
private def mvb64(bytes: Array[Byte]): String = Base64.getEncoder.encodeToString(bytes)
|
|
274
|
+
|
|
275
|
+
private def mvunb64(text: Any, what: String): Array[Byte] = text match
|
|
276
|
+
case one: String =>
|
|
277
|
+
try Base64.getDecoder.decode(one)
|
|
278
|
+
catch case _: IllegalArgumentException => mvfail("missing " + what)
|
|
279
|
+
case _ => mvfail("missing " + what)
|
|
280
|
+
|
|
281
|
+
// --- the file --------------------------------------------------------
|
|
282
|
+
|
|
283
|
+
private final case class KeyRecord(
|
|
284
|
+
id: String,
|
|
285
|
+
salt: Array[Byte],
|
|
286
|
+
iters: Int,
|
|
287
|
+
ring: Sealed,
|
|
288
|
+
meta: Sealed,
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
private final case class EntryRecord(id: Array[Byte], name: Sealed, value: Sealed)
|
|
292
|
+
|
|
293
|
+
private final case class VaultFile(keys: List[KeyRecord], entries: List[EntryRecord])
|
|
294
|
+
|
|
295
|
+
/** A cursor, so that every length check is in one place: a truncated vault
|
|
296
|
+
* is refused rather than read as a short one.
|
|
297
|
+
*/
|
|
298
|
+
private final class MvReader(bytes: Array[Byte]):
|
|
299
|
+
private var at = 0
|
|
300
|
+
|
|
301
|
+
def take(len: Int): Array[Byte] =
|
|
302
|
+
if len < 0 || bytes.length < at + len then mvfail("the vault file is truncated")
|
|
303
|
+
val out = bytes.slice(at, at + len)
|
|
304
|
+
at += len
|
|
305
|
+
out
|
|
306
|
+
|
|
307
|
+
def u8: Int = take(1)(0) & 0xff
|
|
308
|
+
|
|
309
|
+
def u32: Int =
|
|
310
|
+
// A length over Int.MaxValue cannot address an array, and reading it as
|
|
311
|
+
// a negative int is what turned a damaged file into a crash instead of
|
|
312
|
+
// a refusal.
|
|
313
|
+
val value = ByteBuffer.wrap(take(4)).getInt.toLong & 0xffffffffL
|
|
314
|
+
if value > Int.MaxValue then mvfail("the vault file is truncated")
|
|
315
|
+
value.toInt
|
|
316
|
+
|
|
317
|
+
def small: Array[Byte] = take(u8)
|
|
318
|
+
def large: Array[Byte] = take(u32)
|
|
319
|
+
def magic: String = String(take(4), StandardCharsets.ISO_8859_1)
|
|
320
|
+
def sealedvalue: Sealed = Sealed(small, large)
|
|
321
|
+
def done: Boolean = at == bytes.length
|
|
322
|
+
|
|
323
|
+
private def mvreadfile(bytes: Array[Byte]): VaultFile =
|
|
324
|
+
val read = MvReader(bytes)
|
|
325
|
+
|
|
326
|
+
if MAGIC != read.magic then mvfail("not a vault file")
|
|
327
|
+
|
|
328
|
+
val version = read.u8
|
|
329
|
+
if FORMAT != version then mvfail(s"unsupported format version: $version")
|
|
330
|
+
|
|
331
|
+
val kdf = read.u8
|
|
332
|
+
val cipher = read.u8
|
|
333
|
+
if KDF_PBKDF2 != kdf || CIPHER_AESGCM != cipher then
|
|
334
|
+
mvfail(s"unsupported kdf or cipher: $kdf/$cipher")
|
|
335
|
+
read.u8
|
|
336
|
+
|
|
337
|
+
val keys = List.fill(read.u32):
|
|
338
|
+
KeyRecord(
|
|
339
|
+
String(read.small, StandardCharsets.UTF_8),
|
|
340
|
+
read.small,
|
|
341
|
+
read.u32,
|
|
342
|
+
read.sealedvalue,
|
|
343
|
+
read.sealedvalue,
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
val entries = List.fill(read.u32):
|
|
347
|
+
EntryRecord(read.small, read.sealedvalue, read.sealedvalue)
|
|
348
|
+
|
|
349
|
+
if !read.done then mvfail("the vault file has trailing bytes")
|
|
350
|
+
|
|
351
|
+
VaultFile(keys, entries)
|
|
352
|
+
|
|
353
|
+
/** Unsigned, byte by byte, the way every other port sorts. */
|
|
354
|
+
private def mvcompare(left: Array[Byte], right: Array[Byte]): Int =
|
|
355
|
+
var index = 0
|
|
356
|
+
var out = 0
|
|
357
|
+
|
|
358
|
+
while out == 0 && index < math.min(left.length, right.length) do
|
|
359
|
+
val one = left(index) & 0xff
|
|
360
|
+
val two = right(index) & 0xff
|
|
361
|
+
if one != two then out = if one < two then -1 else 1
|
|
362
|
+
index += 1
|
|
363
|
+
|
|
364
|
+
if out != 0 then out else left.length.compare(right.length)
|
|
365
|
+
|
|
366
|
+
private def mvwritefile(vault: VaultFile): Array[Byte] =
|
|
367
|
+
val out = java.io.ByteArrayOutputStream()
|
|
368
|
+
|
|
369
|
+
def raw(bytes: Array[Byte]): Unit = out.write(bytes)
|
|
370
|
+
def u8(value: Int): Unit = out.write(value & 0xff)
|
|
371
|
+
def u32(value: Int): Unit = raw(ByteBuffer.allocate(4).putInt(value).array)
|
|
372
|
+
def small(bytes: Array[Byte]): Unit = { u8(bytes.length); raw(bytes) }
|
|
373
|
+
def large(bytes: Array[Byte]): Unit = { u32(bytes.length); raw(bytes) }
|
|
374
|
+
def sealedvalue(value: Sealed): Unit = { small(value.iv); large(value.blob) }
|
|
375
|
+
|
|
376
|
+
raw(MAGIC.getBytes(StandardCharsets.ISO_8859_1))
|
|
377
|
+
u8(FORMAT)
|
|
378
|
+
u8(KDF_PBKDF2)
|
|
379
|
+
u8(CIPHER_AESGCM)
|
|
380
|
+
u8(0)
|
|
381
|
+
|
|
382
|
+
u32(vault.keys.length)
|
|
383
|
+
for key <- vault.keys do
|
|
384
|
+
small(mvutf8(key.id))
|
|
385
|
+
small(key.salt)
|
|
386
|
+
u32(key.iters)
|
|
387
|
+
sealedvalue(key.ring)
|
|
388
|
+
sealedvalue(key.meta)
|
|
389
|
+
|
|
390
|
+
// SORTED BY ID, which is a blinded value: the file therefore records
|
|
391
|
+
// nothing about the order secrets were written in.
|
|
392
|
+
val entries = vault.entries.sortWith((left, right) => mvcompare(left.id, right.id) < 0)
|
|
393
|
+
|
|
394
|
+
u32(entries.length)
|
|
395
|
+
for entry <- entries do
|
|
396
|
+
small(entry.id)
|
|
397
|
+
sealedvalue(entry.name)
|
|
398
|
+
sealedvalue(entry.value)
|
|
399
|
+
|
|
400
|
+
out.toByteArray
|
|
401
|
+
|
|
402
|
+
// --- what a key is ---------------------------------------------------
|
|
403
|
+
|
|
404
|
+
/** What a key may do. `grants` is empty for a master key.
|
|
405
|
+
*
|
|
406
|
+
* A case class of `val` fields over an immutable list, so what a caller is
|
|
407
|
+
* handed cannot become what the vault believes: `info.write = true` does
|
|
408
|
+
* not compile.
|
|
409
|
+
*/
|
|
410
|
+
final case class VaultKeyInfo(
|
|
411
|
+
key: String,
|
|
412
|
+
master: Boolean,
|
|
413
|
+
write: Boolean,
|
|
414
|
+
grants: List[String],
|
|
415
|
+
):
|
|
416
|
+
def show: String = s"$key/$master/$write/${grants.mkString("[", ", ", "]")}"
|
|
417
|
+
|
|
418
|
+
/** What a caller asks for when minting a restricted key. */
|
|
419
|
+
final case class GrantSpec(
|
|
420
|
+
key: String,
|
|
421
|
+
passphrase: String,
|
|
422
|
+
names: List[String] = Nil,
|
|
423
|
+
write: Boolean = false,
|
|
424
|
+
iterations: Option[Int] = None,
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
/** How a vault handle is configured. */
|
|
428
|
+
final case class VaultOptions(
|
|
429
|
+
file: String,
|
|
430
|
+
passphrase: String,
|
|
431
|
+
key: String = MASTERKEY,
|
|
432
|
+
iterations: Int = MINIVAULT_ITERATIONS,
|
|
433
|
+
create: Boolean = false,
|
|
434
|
+
)
|
|
435
|
+
|
|
436
|
+
private final case class Opened(
|
|
437
|
+
info: VaultKeyInfo,
|
|
438
|
+
root: Option[Array[Byte]],
|
|
439
|
+
grants: Map[String, Array[Byte]],
|
|
440
|
+
ring: Sealed,
|
|
441
|
+
)
|
|
442
|
+
|
|
443
|
+
// --- creating --------------------------------------------------------
|
|
444
|
+
|
|
445
|
+
private def mvnewvault(keyid: String, passphrase: String, iterations: Int): VaultFile =
|
|
446
|
+
val root = mvrandom(KEYLEN)
|
|
447
|
+
val salt = mvrandom(SALTLEN)
|
|
448
|
+
|
|
449
|
+
val ring = ListMap[String, Any]("v" -> FORMAT, "write" -> true, "root" -> mvb64(root))
|
|
450
|
+
val meta =
|
|
451
|
+
ListMap[String, Any]("v" -> FORMAT, "master" -> true, "write" -> true, "grants" -> List())
|
|
452
|
+
|
|
453
|
+
VaultFile(
|
|
454
|
+
List(
|
|
455
|
+
KeyRecord(
|
|
456
|
+
keyid,
|
|
457
|
+
salt,
|
|
458
|
+
iterations,
|
|
459
|
+
mvseal(mvkek(passphrase, salt, iterations), mvutf8(mvstringify(ring)), AAD_RING + keyid),
|
|
460
|
+
mvseal(mvhmac(root, LABEL_META), mvutf8(mvstringify(meta)), AAD_META + keyid),
|
|
461
|
+
),
|
|
462
|
+
),
|
|
463
|
+
Nil,
|
|
464
|
+
)
|
|
465
|
+
|
|
466
|
+
private def mvowneronly(path: Path): Unit =
|
|
467
|
+
try Files.setPosixFilePermissions(path, PosixFilePermissions.fromString("rw-------"))
|
|
468
|
+
catch
|
|
469
|
+
// A filesystem with no POSIX permissions is not a reason to refuse a
|
|
470
|
+
// write that otherwise succeeded.
|
|
471
|
+
case _: IOException => ()
|
|
472
|
+
case _: UnsupportedOperationException => ()
|
|
473
|
+
|
|
474
|
+
/** Write a vault file that is not there yet, and REFUSE one that is.
|
|
475
|
+
*
|
|
476
|
+
* Straight to the target with CREATE_NEW rather than through a temporary
|
|
477
|
+
* and a rename. A rename REPLACES its destination, so two processes
|
|
478
|
+
* creating the same vault both succeeded and the second discarded the
|
|
479
|
+
* first one's secrets.
|
|
480
|
+
*/
|
|
481
|
+
private def mvputnew(file: String, vault: VaultFile): Unit =
|
|
482
|
+
val path = Path.of(file)
|
|
483
|
+
try
|
|
484
|
+
Files.write(path, mvwritefile(vault), StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE)
|
|
485
|
+
mvowneronly(path)
|
|
486
|
+
catch
|
|
487
|
+
case _: FileAlreadyExistsException => mvfail("vault file already exists: " + file)
|
|
488
|
+
case err: IOException => mvfail(s"cannot write $file: ${err.getMessage}")
|
|
489
|
+
|
|
490
|
+
/** A handle on one vault file, opened as ONE key.
|
|
491
|
+
*
|
|
492
|
+
* Every method answers as that key: `list` shows the names it may read,
|
|
493
|
+
* `get` answers for those and misses on the rest, and the master-only
|
|
494
|
+
* methods refuse for any other key. Nothing is read or derived until the
|
|
495
|
+
* first call that needs the file.
|
|
496
|
+
*/
|
|
497
|
+
final class MiniVault private[plugins] (options: VaultOptions):
|
|
498
|
+
|
|
499
|
+
if options.file.isEmpty then mvfail("a vault needs a file")
|
|
500
|
+
if options.passphrase.isEmpty then mvfail("a vault needs a passphrase")
|
|
501
|
+
|
|
502
|
+
private val thefile = options.file
|
|
503
|
+
private val thekey = mvcheckid(Some(mvwantkey(options.key)), "a vault needs a key id")
|
|
504
|
+
private val thephrase = options.passphrase
|
|
505
|
+
private val theiters = options.iterations
|
|
506
|
+
private val thecreate = options.create
|
|
507
|
+
|
|
508
|
+
private var opened: Option[Opened] = None
|
|
509
|
+
|
|
510
|
+
/** The file this handle reads. */
|
|
511
|
+
def file: String = thefile
|
|
512
|
+
|
|
513
|
+
/** The key id this handle opens with. */
|
|
514
|
+
def key: String = thekey
|
|
515
|
+
|
|
516
|
+
/** Derive the key and read the file NOW rather than at first use. */
|
|
517
|
+
def open: VaultKeyInfo = load._2.info
|
|
518
|
+
|
|
519
|
+
/** Forget the derived keys. The next call opens again. */
|
|
520
|
+
def close(): Unit = opened = None
|
|
521
|
+
|
|
522
|
+
/** The names this key can read, sorted. */
|
|
523
|
+
def list: List[String] =
|
|
524
|
+
val (vault, state) = load
|
|
525
|
+
|
|
526
|
+
state.root match
|
|
527
|
+
case Some(root) =>
|
|
528
|
+
val namekey = mvhmac(root, LABEL_NAMES)
|
|
529
|
+
vault.entries
|
|
530
|
+
.map(entry =>
|
|
531
|
+
String(
|
|
532
|
+
mvunseal(namekey, entry.name, AAD_NAME, "a secret name is damaged"),
|
|
533
|
+
StandardCharsets.UTF_8,
|
|
534
|
+
),
|
|
535
|
+
)
|
|
536
|
+
.sorted
|
|
537
|
+
|
|
538
|
+
// A restricted key has no name key, so it reports the grants it can
|
|
539
|
+
// actually find: the vault never tells it what else is in there.
|
|
540
|
+
case None =>
|
|
541
|
+
state.info.grants.filter(name => findentry(vault, state.grants.get(name)).isDefined).sorted
|
|
542
|
+
|
|
543
|
+
def has(name: String): Boolean = get(name).isDefined
|
|
544
|
+
|
|
545
|
+
/** The value, or None when the vault does not hold that name or this key
|
|
546
|
+
* was not granted it.
|
|
547
|
+
*/
|
|
548
|
+
def get(name: String): Option[String] =
|
|
549
|
+
checkname(name)
|
|
550
|
+
val (vault, state) = load
|
|
551
|
+
|
|
552
|
+
// OUTSIDE THE GRANT IS A MISS, deliberately. The vault answers as the
|
|
553
|
+
// key that opened it, so a name this key cannot read is a name this
|
|
554
|
+
// store does not hold for this caller.
|
|
555
|
+
keyfor(state, name).flatMap: key =>
|
|
556
|
+
findentry(vault, Some(key)).map: entry =>
|
|
557
|
+
String(
|
|
558
|
+
mvunseal(key, entry.value, AAD_SECRET + name, s"the value of $name is damaged"),
|
|
559
|
+
StandardCharsets.UTF_8,
|
|
560
|
+
)
|
|
561
|
+
|
|
562
|
+
/** Write a value. A master writes any name; a restricted key holding
|
|
563
|
+
* `write` overwrites the names it was granted, and creates none.
|
|
564
|
+
*/
|
|
565
|
+
def set(name: String, value: String): Unit =
|
|
566
|
+
// Every write on this file, from any handle in this process,
|
|
567
|
+
// serializes here; see mvlockfor.
|
|
568
|
+
mvlockfor(file).synchronized:
|
|
569
|
+
checkname(name)
|
|
570
|
+
val (vault, state) = load
|
|
571
|
+
|
|
572
|
+
if !state.info.write then mvfail(s"key ${state.info.key} is read-only")
|
|
573
|
+
|
|
574
|
+
val key = keyfor(state, name).getOrElse(
|
|
575
|
+
mvfail(s"key ${state.info.key} was not granted $name"),
|
|
576
|
+
)
|
|
577
|
+
|
|
578
|
+
val sealedvalue = mvseal(key, mvutf8(value), AAD_SECRET + name)
|
|
579
|
+
val id = mventryid(key)
|
|
580
|
+
|
|
581
|
+
val entries =
|
|
582
|
+
if vault.entries.exists(entry => java.util.Arrays.equals(entry.id, id)) then
|
|
583
|
+
vault.entries.map: entry =>
|
|
584
|
+
if java.util.Arrays.equals(entry.id, id) then entry.copy(value = sealedvalue) else entry
|
|
585
|
+
else
|
|
586
|
+
// A NEW NAME NEEDS THE NAME KEY, which only a master holds. So a
|
|
587
|
+
// restricted key with `write` updates what it was granted and cannot
|
|
588
|
+
// grow the vault.
|
|
589
|
+
val root = rootof(state, s"creating the secret $name")
|
|
590
|
+
vault.entries :+ EntryRecord(
|
|
591
|
+
id,
|
|
592
|
+
mvseal(mvhmac(root, LABEL_NAMES), mvutf8(name), AAD_NAME),
|
|
593
|
+
sealedvalue,
|
|
594
|
+
)
|
|
595
|
+
|
|
596
|
+
save(vault.copy(entries = entries))
|
|
597
|
+
|
|
598
|
+
/** Drop a name. Master only. */
|
|
599
|
+
def remove(name: String): Unit =
|
|
600
|
+
// Every write on this file, from any handle in this process,
|
|
601
|
+
// serializes here; see mvlockfor.
|
|
602
|
+
mvlockfor(file).synchronized:
|
|
603
|
+
checkname(name)
|
|
604
|
+
val (vault, state) = load
|
|
605
|
+
val root = rootof(state, "removing a secret")
|
|
606
|
+
|
|
607
|
+
val wanted = mventryid(mvsecretkey(root, name))
|
|
608
|
+
if !vault.entries.exists(entry => java.util.Arrays.equals(entry.id, wanted)) then
|
|
609
|
+
mvfail(s"no such secret: $name")
|
|
610
|
+
|
|
611
|
+
save(
|
|
612
|
+
vault.copy(entries =
|
|
613
|
+
vault.entries.filterNot(entry => java.util.Arrays.equals(entry.id, wanted)),
|
|
614
|
+
),
|
|
615
|
+
)
|
|
616
|
+
|
|
617
|
+
/** Every key in the file, with what it may do. Master only. */
|
|
618
|
+
def keys: List[VaultKeyInfo] =
|
|
619
|
+
val (vault, state) = load
|
|
620
|
+
rootof(state, "listing the keys")
|
|
621
|
+
|
|
622
|
+
vault.keys.map: record =>
|
|
623
|
+
metaof(state, record) match
|
|
624
|
+
case None => VaultKeyInfo(record.id, false, false, Nil)
|
|
625
|
+
case Some(meta) =>
|
|
626
|
+
val grants = meta.get("grants") match
|
|
627
|
+
case Some(items: List[?]) => items.map(_.toString).sorted
|
|
628
|
+
case _ => Nil
|
|
629
|
+
VaultKeyInfo(
|
|
630
|
+
record.id,
|
|
631
|
+
meta.get("master").contains(true),
|
|
632
|
+
meta.get("write").contains(true),
|
|
633
|
+
grants,
|
|
634
|
+
)
|
|
635
|
+
|
|
636
|
+
/** Mint a restricted key. Master only. */
|
|
637
|
+
def grant(spec: GrantSpec): Unit =
|
|
638
|
+
// Every write on this file, from any handle in this process,
|
|
639
|
+
// serializes here; see mvlockfor.
|
|
640
|
+
mvlockfor(file).synchronized:
|
|
641
|
+
val (vault, state) = load
|
|
642
|
+
val root = rootof(state, "granting a key")
|
|
643
|
+
|
|
644
|
+
val id = mvcheckid(Some(spec.key), "a grant needs a key id")
|
|
645
|
+
if spec.passphrase.isEmpty then mvfail("a grant needs a passphrase")
|
|
646
|
+
if vault.keys.exists(_.id == id) then mvfail(s"key already exists: $id")
|
|
647
|
+
|
|
648
|
+
val names = spec.names.sorted
|
|
649
|
+
|
|
650
|
+
// A ListMap built from the sorted names, for a ring whose JSON is the
|
|
651
|
+
// same text on every run. It is NOT an interop requirement - the ring
|
|
652
|
+
// is sealed under a fresh nonce, so its ciphertext differs per write
|
|
653
|
+
// whatever the key order is.
|
|
654
|
+
val grants = ListMap.from(names.map: name =>
|
|
655
|
+
checkname(name)
|
|
656
|
+
(name, mvb64(mvsecretkey(root, name))))
|
|
657
|
+
|
|
658
|
+
val record = sealkey(
|
|
659
|
+
root,
|
|
660
|
+
id,
|
|
661
|
+
spec.passphrase,
|
|
662
|
+
spec.iterations.getOrElse(theiters),
|
|
663
|
+
ListMap[String, Any]("v" -> FORMAT, "write" -> spec.write, "grants" -> grants),
|
|
664
|
+
ListMap[String, Any](
|
|
665
|
+
"v" -> FORMAT,
|
|
666
|
+
"master" -> false,
|
|
667
|
+
"write" -> spec.write,
|
|
668
|
+
"grants" -> names,
|
|
669
|
+
),
|
|
670
|
+
)
|
|
671
|
+
|
|
672
|
+
save(vault.copy(keys = vault.keys :+ record))
|
|
673
|
+
|
|
674
|
+
/** Drop a key. Master only.
|
|
675
|
+
*
|
|
676
|
+
* Anyone who already copied the file keeps whatever that key could read,
|
|
677
|
+
* so revoking bars future reads of the LIVE file and `rotate` is what
|
|
678
|
+
* takes a secret back.
|
|
679
|
+
*/
|
|
680
|
+
def revoke(key: String): Unit =
|
|
681
|
+
// Every write on this file, from any handle in this process,
|
|
682
|
+
// serializes here; see mvlockfor.
|
|
683
|
+
mvlockfor(file).synchronized:
|
|
684
|
+
val (vault, state) = load
|
|
685
|
+
rootof(state, "revoking a key")
|
|
686
|
+
|
|
687
|
+
if key == state.info.key then mvfail(s"a key cannot revoke itself: $key")
|
|
688
|
+
if !vault.keys.exists(_.id == key) then mvfail(s"no such key: $key")
|
|
689
|
+
|
|
690
|
+
save(vault.copy(keys = vault.keys.filterNot(_.id == key)))
|
|
691
|
+
|
|
692
|
+
/** A new root key, every value re-encrypted under it, and EVERY OTHER KEY
|
|
693
|
+
* DROPPED. Master only.
|
|
694
|
+
*
|
|
695
|
+
* The other keys go because they must: their rings are sealed under
|
|
696
|
+
* passphrases this process does not have. Re-grant afterwards.
|
|
697
|
+
*/
|
|
698
|
+
def rotate(): Unit =
|
|
699
|
+
// Every write on this file, from any handle in this process,
|
|
700
|
+
// serializes here; see mvlockfor.
|
|
701
|
+
mvlockfor(file).synchronized:
|
|
702
|
+
val (vault, state) = load
|
|
703
|
+
rootof(state, "rotating the vault")
|
|
704
|
+
|
|
705
|
+
// Read everything out under the old root before anything changes: once
|
|
706
|
+
// the root is replaced the old derived keys are unreachable.
|
|
707
|
+
val plain = list.map(name => (name, get(name).getOrElse("")))
|
|
708
|
+
|
|
709
|
+
val root = mvrandom(KEYLEN)
|
|
710
|
+
val namekey = mvhmac(root, LABEL_NAMES)
|
|
711
|
+
|
|
712
|
+
val entries = plain.map: (name, value) =>
|
|
713
|
+
val key = mvsecretkey(root, name)
|
|
714
|
+
EntryRecord(
|
|
715
|
+
mventryid(key),
|
|
716
|
+
mvseal(namekey, mvutf8(name), AAD_NAME),
|
|
717
|
+
mvseal(key, mvutf8(value), AAD_SECRET + name),
|
|
718
|
+
)
|
|
719
|
+
|
|
720
|
+
val iters = vault.keys.find(_.id == thekey).map(_.iters).getOrElse(theiters)
|
|
721
|
+
|
|
722
|
+
val record = sealkey(
|
|
723
|
+
root,
|
|
724
|
+
thekey,
|
|
725
|
+
thephrase,
|
|
726
|
+
iters,
|
|
727
|
+
ListMap[String, Any]("v" -> FORMAT, "write" -> true, "root" -> mvb64(root)),
|
|
728
|
+
ListMap[String, Any]("v" -> FORMAT, "master" -> true, "write" -> true, "grants" -> List()),
|
|
729
|
+
)
|
|
730
|
+
|
|
731
|
+
// SAVE FIRST, adopt second. A handle holding the new root over a file
|
|
732
|
+
// that still holds the old one reads nothing and says the vault is
|
|
733
|
+
// damaged.
|
|
734
|
+
write(VaultFile(List(record), entries))
|
|
735
|
+
|
|
736
|
+
opened = Some(
|
|
737
|
+
Opened(VaultKeyInfo(thekey, true, true, Nil), Some(root), Map.empty, record.ring),
|
|
738
|
+
)
|
|
739
|
+
|
|
740
|
+
// --- the inside ----------------------------------------------------
|
|
741
|
+
|
|
742
|
+
private def bytes: Array[Byte] =
|
|
743
|
+
try Files.readAllBytes(Path.of(thefile))
|
|
744
|
+
catch
|
|
745
|
+
case _: NoSuchFileException =>
|
|
746
|
+
// A vault is configured deliberately, with a key. Its absence is a
|
|
747
|
+
// broken deployment and never "no secrets here": answering a miss
|
|
748
|
+
// would send the chain on to a weaker store.
|
|
749
|
+
if !thecreate then mvfail(s"no vault file: $thefile")
|
|
750
|
+
mvputnew(thefile, mvnewvault(thekey, thephrase, theiters))
|
|
751
|
+
try Files.readAllBytes(Path.of(thefile))
|
|
752
|
+
catch case err: IOException => mvfail(s"cannot read $thefile: ${err.getMessage}")
|
|
753
|
+
case err: IOException => mvfail(s"cannot read $thefile: ${err.getMessage}")
|
|
754
|
+
|
|
755
|
+
private def load: (VaultFile, Opened) =
|
|
756
|
+
val vault = mvreadfile(bytes)
|
|
757
|
+
|
|
758
|
+
val record = vault.keys.find(_.id == thekey).getOrElse:
|
|
759
|
+
// REVOKED, or never there. Either way this handle is finished, and
|
|
760
|
+
// dropping what it derived is what stops the next call answering from
|
|
761
|
+
// memory.
|
|
762
|
+
opened = None
|
|
763
|
+
mvfail(s"no such key: $thekey")
|
|
764
|
+
|
|
765
|
+
// The file still holds this key, and holds the SAME ring: a key revoked
|
|
766
|
+
// and re-granted under another passphrase is a different key wearing
|
|
767
|
+
// the id, and re-deriving is what refuses it.
|
|
768
|
+
opened match
|
|
769
|
+
case Some(held) if held.ring.same(record.ring) => (vault, held)
|
|
770
|
+
case _ =>
|
|
771
|
+
opened = None
|
|
772
|
+
|
|
773
|
+
val plain = mvunseal(
|
|
774
|
+
mvkek(thephrase, record.salt, record.iters),
|
|
775
|
+
record.ring,
|
|
776
|
+
AAD_RING + thekey,
|
|
777
|
+
s"wrong passphrase for key $thekey, or a damaged vault",
|
|
778
|
+
)
|
|
779
|
+
|
|
780
|
+
val ring = mvjsonof(plain, s"key ring for $thekey")
|
|
781
|
+
|
|
782
|
+
val grants = ring.get("grants") match
|
|
783
|
+
case Some(pairs: Map[?, ?]) =>
|
|
784
|
+
pairs.map((name, one) => (name.toString, mvunb64(one, "a granted key"))).toMap
|
|
785
|
+
case _ => Map.empty[String, Array[Byte]]
|
|
786
|
+
|
|
787
|
+
val root = ring.get("root")
|
|
788
|
+
|
|
789
|
+
val next = Opened(
|
|
790
|
+
VaultKeyInfo(
|
|
791
|
+
thekey,
|
|
792
|
+
root.isDefined,
|
|
793
|
+
root.isDefined || ring.get("write").contains(true),
|
|
794
|
+
grants.keys.toList.sorted,
|
|
795
|
+
),
|
|
796
|
+
root.map(one => mvunb64(one, "the root key")),
|
|
797
|
+
grants,
|
|
798
|
+
record.ring,
|
|
799
|
+
)
|
|
800
|
+
|
|
801
|
+
opened = Some(next)
|
|
802
|
+
(vault, next)
|
|
803
|
+
|
|
804
|
+
private def rootof(state: Opened, what: String): Array[Byte] =
|
|
805
|
+
state.root.getOrElse(
|
|
806
|
+
mvfail(s"$what needs a master key, and ${state.info.key} is restricted"),
|
|
807
|
+
)
|
|
808
|
+
|
|
809
|
+
/** The key for one name, or None when this key cannot reach it. */
|
|
810
|
+
private def keyfor(state: Opened, name: String): Option[Array[Byte]] =
|
|
811
|
+
state.root match
|
|
812
|
+
case Some(root) => Some(mvsecretkey(root, name))
|
|
813
|
+
case None => state.grants.get(name)
|
|
814
|
+
|
|
815
|
+
private def findentry(vault: VaultFile, key: Option[Array[Byte]]): Option[EntryRecord] =
|
|
816
|
+
key.flatMap: one =>
|
|
817
|
+
val id = mventryid(one)
|
|
818
|
+
vault.entries.find(entry => java.util.Arrays.equals(entry.id, id))
|
|
819
|
+
|
|
820
|
+
private def metaof(state: Opened, record: KeyRecord): Option[Map[String, Any]] =
|
|
821
|
+
val root = rootof(state, "reading key metadata")
|
|
822
|
+
val what = s"metadata for key ${record.id}"
|
|
823
|
+
|
|
824
|
+
try
|
|
825
|
+
Some(
|
|
826
|
+
mvjsonof(
|
|
827
|
+
mvunseal(mvhmac(root, LABEL_META), record.meta, AAD_META + record.id, what),
|
|
828
|
+
what,
|
|
829
|
+
),
|
|
830
|
+
)
|
|
831
|
+
catch
|
|
832
|
+
// A record written under a root key this one has replaced. The key is
|
|
833
|
+
// still in the file and still opens with its own passphrase, so it is
|
|
834
|
+
// reported rather than hidden - with what it can do unknown.
|
|
835
|
+
case _: SekretoError => None
|
|
836
|
+
|
|
837
|
+
private def sealkey(
|
|
838
|
+
root: Array[Byte],
|
|
839
|
+
id: String,
|
|
840
|
+
phrase: String,
|
|
841
|
+
iters: Int,
|
|
842
|
+
ring: ListMap[String, Any],
|
|
843
|
+
meta: ListMap[String, Any],
|
|
844
|
+
): KeyRecord =
|
|
845
|
+
val salt = mvrandom(SALTLEN)
|
|
846
|
+
KeyRecord(
|
|
847
|
+
id,
|
|
848
|
+
salt,
|
|
849
|
+
iters,
|
|
850
|
+
mvseal(mvkek(phrase, salt, iters), mvutf8(mvstringify(ring)), AAD_RING + id),
|
|
851
|
+
mvseal(mvhmac(root, LABEL_META), mvutf8(mvstringify(meta)), AAD_META + id),
|
|
852
|
+
)
|
|
853
|
+
|
|
854
|
+
private def save(vault: VaultFile): Unit = write(vault)
|
|
855
|
+
|
|
856
|
+
/** Read, change, and REPLACE - never edit in place.
|
|
857
|
+
*
|
|
858
|
+
* THE TEMPORARY IS RANDOM AND EXCLUSIVE. `<vault>.<pid>.tmp` is a name
|
|
859
|
+
* anyone can predict, so anyone who can write the vault's directory
|
|
860
|
+
* could put a symlink there and have the next save truncate whatever it
|
|
861
|
+
* pointed at.
|
|
862
|
+
*/
|
|
863
|
+
private def write(vault: VaultFile): Unit =
|
|
864
|
+
val suffix = mvrandom(8).map(one => f"${one & 0xff}%02x").mkString
|
|
865
|
+
val temp = Path.of(s"$thefile.$suffix.tmp")
|
|
866
|
+
|
|
867
|
+
try
|
|
868
|
+
Files.write(temp, mvwritefile(vault), StandardOpenOption.CREATE_NEW,
|
|
869
|
+
StandardOpenOption.WRITE)
|
|
870
|
+
mvowneronly(temp)
|
|
871
|
+
Files.move(temp, Path.of(thefile), StandardCopyOption.REPLACE_EXISTING)
|
|
872
|
+
catch
|
|
873
|
+
case err: IOException =>
|
|
874
|
+
try Files.deleteIfExists(temp)
|
|
875
|
+
catch
|
|
876
|
+
// The vault is unchanged either way, and the write error is what
|
|
877
|
+
// the caller needs to be told about.
|
|
878
|
+
case _: IOException => ()
|
|
879
|
+
mvfail(s"cannot write $thefile: ${err.getMessage}")
|
|
880
|
+
|
|
881
|
+
/** Open a vault file as one key.
|
|
882
|
+
*
|
|
883
|
+
* The handle is lazy. Nothing is read, and no passphrase is stretched,
|
|
884
|
+
* until a method needs the file.
|
|
885
|
+
*/
|
|
886
|
+
def openvault(options: VaultOptions): MiniVault = MiniVault(options)
|
|
887
|
+
|
|
888
|
+
/** Make a vault file and return a handle on its master key.
|
|
889
|
+
*
|
|
890
|
+
* Refuses a file that is already there: a vault is created once, and
|
|
891
|
+
* overwriting one discards every secret in it.
|
|
892
|
+
*/
|
|
893
|
+
def createvault(options: VaultOptions): MiniVault =
|
|
894
|
+
if options.file.isEmpty then mvfail("a vault needs a file")
|
|
895
|
+
if options.passphrase.isEmpty then mvfail("a vault needs a passphrase")
|
|
896
|
+
val keyid = mvcheckid(Some(mvwantkey(options.key)), "a vault needs a key id")
|
|
897
|
+
|
|
898
|
+
// No existence check first: the check and the write would be two steps,
|
|
899
|
+
// and `mvputnew` refuses an existing file in ONE.
|
|
900
|
+
mvputnew(options.file, mvnewvault(keyid, options.passphrase, options.iterations))
|
|
901
|
+
|
|
902
|
+
MiniVault(options)
|
|
903
|
+
|
|
904
|
+
// --- the provider ----------------------------------------------------
|
|
905
|
+
|
|
906
|
+
/** Read a vault as one store in a chain.
|
|
907
|
+
*
|
|
908
|
+
* The provider is the READ half and nothing more: a chain resolves
|
|
909
|
+
* secrets, and writing one is a deliberate act with an API of its own.
|
|
910
|
+
*/
|
|
911
|
+
private final class MiniVaultProvider(vault: MiniVault) extends Provider:
|
|
912
|
+
def lookup(name: String): Option[String] = vault.get(name)
|
|
913
|
+
def describe(): String = "minivault:" + vault.file
|
|
914
|
+
|
|
915
|
+
def providerof(vault: MiniVault): Provider = MiniVaultProvider(vault)
|
|
916
|
+
|
|
917
|
+
/** A vault provider from options, for a chain built by hand. */
|
|
918
|
+
def minivaultprovider(options: VaultOptions): Provider = providerof(openvault(options))
|
|
919
|
+
|
|
920
|
+
/** The `minivault` provider kind, as a voxgig/plugin definition.
|
|
921
|
+
*
|
|
922
|
+
* Written out rather than built by `providerplugin`, because this
|
|
923
|
+
* definition publishes TWO exports: `provider`, the read half every kind
|
|
924
|
+
* publishes, and `vault`, the programmatic API.
|
|
925
|
+
*/
|
|
926
|
+
val minivault: Definition =
|
|
927
|
+
val define: Inst => Unit = inst =>
|
|
928
|
+
val spec = specof(inst.options)
|
|
929
|
+
|
|
930
|
+
val vault =
|
|
931
|
+
try
|
|
932
|
+
// `openvault` refuses bad configuration HERE, so a mistyped chain
|
|
933
|
+
// fails at construction. Reaching the FILE is not configuration:
|
|
934
|
+
// the handle is lazy.
|
|
935
|
+
openvault(
|
|
936
|
+
VaultOptions(
|
|
937
|
+
file = spec.file.getOrElse(""),
|
|
938
|
+
passphrase = spec.passphrase.getOrElse(""),
|
|
939
|
+
key = mvwantkey(spec.vaultkey.getOrElse("")),
|
|
940
|
+
iterations = spec.iterations.getOrElse(MINIVAULT_ITERATIONS),
|
|
941
|
+
create = spec.create.contains(true),
|
|
942
|
+
),
|
|
943
|
+
)
|
|
944
|
+
catch
|
|
945
|
+
case err: SekretoError =>
|
|
946
|
+
val text = Option(err.getMessage).getOrElse("")
|
|
947
|
+
throw PluginError(ERROR_CODE, text, Map("ref" -> VStr(inst.ref), "cause" -> VStr(text)))
|
|
948
|
+
|
|
949
|
+
inst.`export`(PROVIDER_EXPORT, VOpaque(providerof(vault)))
|
|
950
|
+
inst.`export`(VAULT_EXPORT, VOpaque(vault))
|
|
951
|
+
|
|
952
|
+
voxgig.plugin.Definition(name = "minivault", define = Some(define))
|
|
953
|
+
|
|
954
|
+
/** The vault behind a store in a chain, as its programmatic API.
|
|
955
|
+
*
|
|
956
|
+
* With no store named, the unqualified alias answers: one vault in the
|
|
957
|
+
* chain resolves whatever it is called, and two raise rather than picking
|
|
958
|
+
* one.
|
|
959
|
+
*/
|
|
960
|
+
def vaultof(secrets: Sekreto, store: Option[String] = None): MiniVault =
|
|
961
|
+
store match
|
|
962
|
+
case None =>
|
|
963
|
+
secrets.host.exports("minivault/" + VAULT_EXPORT) match
|
|
964
|
+
case VOpaque(vault: MiniVault) => vault
|
|
965
|
+
case _ => mvfail("no minivault store in this chain")
|
|
966
|
+
|
|
967
|
+
case Some(name) =>
|
|
968
|
+
// A NAMED STORE MUST EXIST, and the alias must not stand in for it.
|
|
969
|
+
// `host.exports` falls back to the alias when the exact ref misses,
|
|
970
|
+
// so asking for `minivault` in a chain whose only vault is named
|
|
971
|
+
// `app` used to hand back the `app` vault - and then write to it.
|
|
972
|
+
val eref = if "minivault" == name then "minivault" else "minivault$" + name
|
|
973
|
+
|
|
974
|
+
if secrets.host.instance(VStr(eref)).isEmpty then
|
|
975
|
+
mvfail(s"no minivault store named $name in this chain")
|
|
976
|
+
|
|
977
|
+
secrets.host.exports(eref + "/" + VAULT_EXPORT) match
|
|
978
|
+
case VOpaque(vault: MiniVault) => vault
|
|
979
|
+
case _ => mvfail(s"no minivault store named $name in this chain")
|