@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,1380 @@
|
|
|
1
|
+
# VENDORED: @voxgig/sekreto sdk-20260917-1242-0 (perl/plugins/Voxgig/Sekreto/Plugins/Minivault.pm)
|
|
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
|
+
package Voxgig::Sekreto::Plugins::Minivault;
|
|
5
|
+
|
|
6
|
+
# The mini vault: every secret a project owns, encrypted, in one file.
|
|
7
|
+
#
|
|
8
|
+
# A store this library owns outright rather than a client for a server
|
|
9
|
+
# somebody else runs. It has a master key and restricted keys, and it is
|
|
10
|
+
# the port's worked example of a definition publishing an API beside its
|
|
11
|
+
# provider: a chain READS, and writing is a deliberate act with an
|
|
12
|
+
# interface of its own.
|
|
13
|
+
#
|
|
14
|
+
# use Voxgig::Sekreto::Plugins::Minivault qw(createvault minivault vaultof);
|
|
15
|
+
#
|
|
16
|
+
# my $vault = createvault( { file => 'app.skmv', passphrase => $master } );
|
|
17
|
+
# $vault->set( 'api.token', 'tok01' );
|
|
18
|
+
# $vault->grant( { key => 'ci', passphrase => $ci, names => ['api.token'] } );
|
|
19
|
+
#
|
|
20
|
+
# my $secrets = Voxgig::Sekreto->new({
|
|
21
|
+
# plugins => [ minivault() ],
|
|
22
|
+
# providers => [ { kind => 'minivault', file => 'app.skmv',
|
|
23
|
+
# vaultkey => 'ci', passphrase => $ci } ],
|
|
24
|
+
# });
|
|
25
|
+
#
|
|
26
|
+
# $secrets->get('api.token'); # the chain reads
|
|
27
|
+
# vaultof($secrets)->list; # the API writes
|
|
28
|
+
#
|
|
29
|
+
# THE FILE FORMAT IS THE CONTRACT, and the vaults committed under
|
|
30
|
+
# test/fixture/ pin it: a vault written by any port is read by every other.
|
|
31
|
+
#
|
|
32
|
+
# magic 4 'SKMV'
|
|
33
|
+
# version 1 FORMAT
|
|
34
|
+
# kdf 1 1 = PBKDF2-HMAC-SHA256
|
|
35
|
+
# cipher 1 1 = AES-256-GCM
|
|
36
|
+
# reserved 1 0
|
|
37
|
+
# keycount 4 uint32
|
|
38
|
+
# per key:
|
|
39
|
+
# id 1 + bytes the key id, PLAINTEXT
|
|
40
|
+
# salt 1 + bytes
|
|
41
|
+
# iters 4 PBKDF2 rounds for this key
|
|
42
|
+
# ring 1 + iv, 4 + bytes sealed under the passphrase
|
|
43
|
+
# meta 1 + iv, 4 + bytes sealed under the vault's meta key
|
|
44
|
+
# entrycount 4 uint32
|
|
45
|
+
# per entry:
|
|
46
|
+
# id 1 + bytes the blinded lookup id
|
|
47
|
+
# name 1 + iv, 4 + bytes sealed under the vault's name key
|
|
48
|
+
# value 1 + iv, 4 + bytes sealed under that secret's own key
|
|
49
|
+
#
|
|
50
|
+
# Integers are big-endian and every length precedes its bytes, so the file
|
|
51
|
+
# is written with the same two primitives it is read with.
|
|
52
|
+
#
|
|
53
|
+
# NOTHING OUTSIDE A KEY RECORD IS PLAINTEXT. Secret names are sealed, and
|
|
54
|
+
# an entry is addressed by a blinded id derived from its own key, so a
|
|
55
|
+
# restricted key finds what it was granted without the file ever naming
|
|
56
|
+
# the rest. What the file does show anyone is the key ids and how many
|
|
57
|
+
# secrets there are.
|
|
58
|
+
#
|
|
59
|
+
# A port of typescript/plugins/minivault.ts, which is canonical.
|
|
60
|
+
|
|
61
|
+
use strict;
|
|
62
|
+
use warnings;
|
|
63
|
+
|
|
64
|
+
use Exporter 'import';
|
|
65
|
+
|
|
66
|
+
use Fcntl ();
|
|
67
|
+
use JSON::PP ();
|
|
68
|
+
use MIME::Base64 ();
|
|
69
|
+
use Scalar::Util ();
|
|
70
|
+
|
|
71
|
+
use Voxgig::Plugin::Types ();
|
|
72
|
+
|
|
73
|
+
use Voxgig::Sekreto ();
|
|
74
|
+
use Voxgig::Sekreto::Providers qw(PROVIDER_EXPORT ERROR_CODE);
|
|
75
|
+
|
|
76
|
+
our @EXPORT_OK = qw(minivault openvault createvault vaultof minivaultoptions);
|
|
77
|
+
|
|
78
|
+
sub MAGIC { return 'SKMV' }
|
|
79
|
+
sub FORMAT { return 1 }
|
|
80
|
+
|
|
81
|
+
sub KDF_PBKDF2 { return 1 }
|
|
82
|
+
sub CIPHER_AESGCM { return 1 }
|
|
83
|
+
|
|
84
|
+
# AES-256-GCM: 32-byte keys, 12-byte nonces, 16-byte tags.
|
|
85
|
+
sub KEYLEN { return 32 }
|
|
86
|
+
sub IVLEN { return 12 }
|
|
87
|
+
sub TAGLEN { return 16 }
|
|
88
|
+
sub SALTLEN { return 16 }
|
|
89
|
+
|
|
90
|
+
# The PBKDF2-HMAC-SHA256 round count when a caller names none.
|
|
91
|
+
sub ITERATIONS { return 210_000 }
|
|
92
|
+
|
|
93
|
+
# The key id a vault gets when a caller names none.
|
|
94
|
+
sub MASTERKEY { return 'master' }
|
|
95
|
+
|
|
96
|
+
# The export key the vault API is published under, beside the provider.
|
|
97
|
+
sub VAULT_EXPORT { return 'vault' }
|
|
98
|
+
|
|
99
|
+
# Additional authenticated data. Every blob is bound to its PLACE in the
|
|
100
|
+
# file, so no ciphertext can be moved: a restricted key's ring cannot be
|
|
101
|
+
# relabelled as the master's, and one secret's value cannot be served
|
|
102
|
+
# under a name it was never written for.
|
|
103
|
+
sub AAD_RING { return 'skmv1:ring:' }
|
|
104
|
+
sub AAD_META { return 'skmv1:meta:' }
|
|
105
|
+
sub AAD_NAME { return 'skmv1:name' }
|
|
106
|
+
sub AAD_SECRET { return 'skmv1:secret:' }
|
|
107
|
+
|
|
108
|
+
# Everything a master reaches is derived from the root key, so rotating is
|
|
109
|
+
# one new random value rather than a re-wrap of each part.
|
|
110
|
+
sub LABEL_NAMES { return 'skmv1:names' }
|
|
111
|
+
sub LABEL_META { return 'skmv1:meta' }
|
|
112
|
+
sub LABEL_ID { return 'skmv1:id' }
|
|
113
|
+
|
|
114
|
+
# The largest key id the format can record.
|
|
115
|
+
#
|
|
116
|
+
# A length is written in ONE byte. A longer id wraps that byte and the
|
|
117
|
+
# writer then appends the whole thing, so every field after it shifts: a
|
|
118
|
+
# grant with a 300-character id would replace a working vault with an
|
|
119
|
+
# unreadable one, and say nothing. Checked where an id is ACCEPTED, so the
|
|
120
|
+
# refusal names the id rather than the file.
|
|
121
|
+
sub IDMAX { return 255 }
|
|
122
|
+
|
|
123
|
+
sub fail { return Voxgig::Sekreto::fail( 'sekreto: minivault: ' . $_[0] ) }
|
|
124
|
+
|
|
125
|
+
# --- characters in, UTF-8 bytes on disk --------------------------------
|
|
126
|
+
#
|
|
127
|
+
# THE VAULT TAKES TEXT, and the format stores its UTF-8 encoding, because
|
|
128
|
+
# that is what the other twenty ports store: a passphrase, a key id or a
|
|
129
|
+
# value that reaches a KDF or a cipher as anything else produces a vault
|
|
130
|
+
# none of them can open.
|
|
131
|
+
#
|
|
132
|
+
# UNCONDITIONALLY, AND NOT ON `utf8::is_utf8`. That flag is an internal
|
|
133
|
+
# representation, not a meaning: perl holds the same string of characters
|
|
134
|
+
# as Latin-1 bytes or as UTF-8 depending on what has happened to it, and
|
|
135
|
+
# `utf8::upgrade` changes it without changing the string. A conversion
|
|
136
|
+
# that reads the flag therefore hashes one passphrase two ways, which is
|
|
137
|
+
# the defect this replaced. Encoding a copy every time is
|
|
138
|
+
# representation-neutral, which is the property that matters, and ASCII -
|
|
139
|
+
# every passphrase in the fixtures, and most in the world - is unchanged
|
|
140
|
+
# by it.
|
|
141
|
+
#
|
|
142
|
+
# The cost is the other direction: a scalar that is ALREADY UTF-8 bytes,
|
|
143
|
+
# which is what `%ENV` and a file hand back, is encoded twice. So the
|
|
144
|
+
# boundary decodes - `cli/sekreto-cli.pl` does it for the three vault
|
|
145
|
+
# environment variables - and the library works in characters throughout,
|
|
146
|
+
# which is the layering perl asks for anyway.
|
|
147
|
+
|
|
148
|
+
sub bytesof {
|
|
149
|
+
my ($text) = @_;
|
|
150
|
+
|
|
151
|
+
return $text if !defined $text;
|
|
152
|
+
|
|
153
|
+
my $copy = $text;
|
|
154
|
+
utf8::encode($copy);
|
|
155
|
+
|
|
156
|
+
return $copy;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
# ...and the other way, for what comes back out of the vault: a decoded
|
|
160
|
+
# string, as JSON::PP hands a provider its values. Bytes that are not
|
|
161
|
+
# UTF-8 are handed back as they are rather than mangled into replacement
|
|
162
|
+
# characters - the vault stored them, so it returns them.
|
|
163
|
+
sub textof {
|
|
164
|
+
my ($raw) = @_;
|
|
165
|
+
|
|
166
|
+
return $raw if !defined $raw;
|
|
167
|
+
|
|
168
|
+
my $copy = $raw;
|
|
169
|
+
return $copy if utf8::decode($copy);
|
|
170
|
+
|
|
171
|
+
return $raw;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
sub checkid {
|
|
175
|
+
my ( $id, $what ) = @_;
|
|
176
|
+
|
|
177
|
+
fail($what) if !defined $id || ref($id) || '' eq $id;
|
|
178
|
+
|
|
179
|
+
# BYTES, because that is what the one length byte counts.
|
|
180
|
+
fail( 'key id is longer than ' . IDMAX() . ' bytes: ' . substr( $id, 0, 32 ) . '...' )
|
|
181
|
+
if IDMAX() < length( bytesof($id) );
|
|
182
|
+
|
|
183
|
+
return $id;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
# ---------------------------------------------------------- the primitives
|
|
187
|
+
#
|
|
188
|
+
# CryptX, AND NOTHING WRITTEN HERE. Perl's core has SHA-256 in
|
|
189
|
+
# `Digest::SHA` and nothing else the format needs: no AES, no AEAD, no
|
|
190
|
+
# PBKDF2, no CSPRNG. So the whole of the cryptography comes from one
|
|
191
|
+
# audited module rather than three of them plus a block cipher written in
|
|
192
|
+
# this file - which is the thing the dependency rule exists to forbid: a
|
|
193
|
+
# table-driven AES passes every known-answer test in the world and still
|
|
194
|
+
# hands its key to anyone who can time a cache.
|
|
195
|
+
#
|
|
196
|
+
# It is the same posture this port already takes for https, and for the
|
|
197
|
+
# same reason. `HTTP::Tiny` reaches an https store only where
|
|
198
|
+
# `IO::Socket::SSL` is installed; this kind opens a vault only where
|
|
199
|
+
# `CryptX` is. Both are stated in README.md, both fail CLOSED with the
|
|
200
|
+
# package to install, and neither is ever worked around.
|
|
201
|
+
#
|
|
202
|
+
# LOADED ON FIRST USE, not at compile time. A consumer that has this
|
|
203
|
+
# module on @INC and configures no vault must not be stopped by a missing
|
|
204
|
+
# package, and `allplugins` loads every kind whether or not the chain
|
|
205
|
+
# names them.
|
|
206
|
+
|
|
207
|
+
my $CRYPTX;
|
|
208
|
+
|
|
209
|
+
sub cryptx {
|
|
210
|
+
return $CRYPTX if $CRYPTX;
|
|
211
|
+
|
|
212
|
+
my $ok = eval {
|
|
213
|
+
require Crypt::AuthEnc::GCM;
|
|
214
|
+
require Crypt::KeyDerivation;
|
|
215
|
+
require Crypt::Mac::HMAC;
|
|
216
|
+
require Crypt::PRNG;
|
|
217
|
+
1;
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
fail( 'no AES-256-GCM available: CryptX must be installed for the mini vault'
|
|
221
|
+
. ' (Debian and Ubuntu call it libcryptx-perl)' )
|
|
222
|
+
if !$ok;
|
|
223
|
+
|
|
224
|
+
$CRYPTX = 1;
|
|
225
|
+
|
|
226
|
+
return $CRYPTX;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
sub mac {
|
|
230
|
+
my ( $key, $text ) = @_;
|
|
231
|
+
cryptx();
|
|
232
|
+
return Crypt::Mac::HMAC::hmac( 'SHA256', $key, bytesof($text) );
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
# The key-encryption key a passphrase unwraps a ring with.
|
|
236
|
+
sub kek {
|
|
237
|
+
my ( $passphrase, $salt, $iters ) = @_;
|
|
238
|
+
|
|
239
|
+
fail( 'unusable round count: ' . $iters ) if 1 > $iters;
|
|
240
|
+
cryptx();
|
|
241
|
+
|
|
242
|
+
return Crypt::KeyDerivation::pbkdf2( bytesof($passphrase), $salt, $iters, 'SHA256',
|
|
243
|
+
KEYLEN() );
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
# The key one named secret's value is encrypted with.
|
|
247
|
+
#
|
|
248
|
+
# DERIVED, never stored, for a master: it holds the root key and so
|
|
249
|
+
# reaches every name, including ones written after it was made. A
|
|
250
|
+
# restricted key holds the derived keys it was granted and nothing that
|
|
251
|
+
# produces another, so every other name is ciphertext to it in exactly the
|
|
252
|
+
# way it is to a stranger.
|
|
253
|
+
sub secretkey {
|
|
254
|
+
my ( $root, $name ) = @_;
|
|
255
|
+
return mac( $root, AAD_SECRET() . $name );
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
# Where a secret lives in the file, derived from its own key so that
|
|
259
|
+
# finding it needs no plaintext name. One-way: an id yields nothing about
|
|
260
|
+
# the key that produced it.
|
|
261
|
+
sub entryid {
|
|
262
|
+
my ($key) = @_;
|
|
263
|
+
return mac( $key, LABEL_ID() );
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
sub randombytes {
|
|
267
|
+
my ($len) = @_;
|
|
268
|
+
cryptx();
|
|
269
|
+
return Crypt::PRNG::random_bytes($len);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
# Ciphertext followed by the 16-byte tag, which is where every other
|
|
273
|
+
# port's AEAD leaves it and therefore what the format records.
|
|
274
|
+
sub seal {
|
|
275
|
+
my ( $key, $plain, $aad ) = @_;
|
|
276
|
+
|
|
277
|
+
fail('bad key') if KEYLEN() != length($key);
|
|
278
|
+
cryptx();
|
|
279
|
+
|
|
280
|
+
my $iv = randombytes( IVLEN() );
|
|
281
|
+
my ( $body, $tag ) =
|
|
282
|
+
Crypt::AuthEnc::GCM::gcm_encrypt_authenticate( 'AES', $key, $iv, bytesof($aad),
|
|
283
|
+
bytesof($plain) );
|
|
284
|
+
|
|
285
|
+
fail('cannot seal') if !defined $body || !defined $tag || TAGLEN() != length($tag);
|
|
286
|
+
|
|
287
|
+
return { iv => $iv, blob => $body . $tag };
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
# The plaintext, or a refusal.
|
|
291
|
+
#
|
|
292
|
+
# A GCM tag that fails to verify is the only evidence there is, and it
|
|
293
|
+
# cannot tell a wrong passphrase from a damaged file, so `what` names the
|
|
294
|
+
# attempt and the message admits both.
|
|
295
|
+
sub unseal {
|
|
296
|
+
my ( $key, $sealed, $aad, $what ) = @_;
|
|
297
|
+
|
|
298
|
+
fail( $what . ': truncated' )
|
|
299
|
+
if length( $sealed->{blob} ) < TAGLEN() || IVLEN() != length( $sealed->{iv} );
|
|
300
|
+
fail('bad key') if KEYLEN() != length($key);
|
|
301
|
+
cryptx();
|
|
302
|
+
|
|
303
|
+
my $body = substr( $sealed->{blob}, 0, length( $sealed->{blob} ) - TAGLEN() );
|
|
304
|
+
my $tag = substr( $sealed->{blob}, -TAGLEN() );
|
|
305
|
+
|
|
306
|
+
my $plain = Crypt::AuthEnc::GCM::gcm_decrypt_verify( 'AES', $key, $sealed->{iv},
|
|
307
|
+
bytesof($aad), $body, $tag );
|
|
308
|
+
|
|
309
|
+
fail($what) if !defined $plain;
|
|
310
|
+
|
|
311
|
+
return $plain;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
# THE COMPACT JSON EVERY PORT WRITES, with its keys in a fixed order.
|
|
315
|
+
#
|
|
316
|
+
# Perl hash order is randomised per process, so an encoder left to itself
|
|
317
|
+
# would write the same ring differently on every run - which is not a
|
|
318
|
+
# correctness problem, because a ring is read as an object, and IS a
|
|
319
|
+
# reproducibility one. `canonical` sorts the keys, and the sort changes no
|
|
320
|
+
# byte count: the ring is SEALED, so the length is what the fixtures pin.
|
|
321
|
+
sub jsonof {
|
|
322
|
+
return JSON::PP->new->canonical->utf8->encode( $_[0] );
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
sub parsejson {
|
|
326
|
+
my ( $plain, $what ) = @_;
|
|
327
|
+
|
|
328
|
+
my $out = eval { JSON::PP->new->utf8->decode($plain) };
|
|
329
|
+
|
|
330
|
+
fail( 'unreadable ' . $what ) if !defined $out || 'HASH' ne ref($out);
|
|
331
|
+
|
|
332
|
+
return $out;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
sub b64 {
|
|
336
|
+
return MIME::Base64::encode_base64( $_[0], '' );
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
# STRICT. A lenient decoder hands back plausible bytes for a corrupted
|
|
340
|
+
# payload, and those bytes are then used AS A KEY.
|
|
341
|
+
sub unb64 {
|
|
342
|
+
my ( $text, $what ) = @_;
|
|
343
|
+
|
|
344
|
+
fail( 'missing ' . $what )
|
|
345
|
+
if !defined $text || ref($text) || $text =~ m{[^A-Za-z0-9+/=]};
|
|
346
|
+
|
|
347
|
+
return MIME::Base64::decode_base64($text);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
# ---------------------------------------------------------------- the file
|
|
351
|
+
|
|
352
|
+
{
|
|
353
|
+
# A cursor, so that every length check is in one place: a truncated
|
|
354
|
+
# vault is refused rather than read as a short one.
|
|
355
|
+
package Voxgig::Sekreto::Plugins::Minivault::Reader;
|
|
356
|
+
|
|
357
|
+
use strict;
|
|
358
|
+
use warnings;
|
|
359
|
+
|
|
360
|
+
sub new {
|
|
361
|
+
my ( $class, $raw ) = @_;
|
|
362
|
+
return bless { raw => $raw, at => 0 }, $class;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
# Reads `len` bytes, or refuses.
|
|
366
|
+
#
|
|
367
|
+
# The bound is checked AGAINST WHAT IS LEFT, never by adding the
|
|
368
|
+
# length to the cursor: perl's integers would not wrap here, but the
|
|
369
|
+
# check reads the same in every port and is the one that is right
|
|
370
|
+
# everywhere.
|
|
371
|
+
sub take {
|
|
372
|
+
my ( $self, $len ) = @_;
|
|
373
|
+
|
|
374
|
+
Voxgig::Sekreto::Plugins::Minivault::fail('the vault file is truncated')
|
|
375
|
+
if length( $self->{raw} ) - $self->{at} < $len;
|
|
376
|
+
|
|
377
|
+
my $out = substr( $self->{raw}, $self->{at}, $len );
|
|
378
|
+
$self->{at} += $len;
|
|
379
|
+
|
|
380
|
+
return $out;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
sub u8 { return unpack( 'C', $_[0]->take(1) ) }
|
|
384
|
+
sub u32 { return unpack( 'N', $_[0]->take(4) ) }
|
|
385
|
+
|
|
386
|
+
sub small { my ($self) = @_; return $self->take( $self->u8 ) }
|
|
387
|
+
sub large { my ($self) = @_; return $self->take( $self->u32 ) }
|
|
388
|
+
|
|
389
|
+
sub sealed {
|
|
390
|
+
my ($self) = @_;
|
|
391
|
+
return { iv => $self->small, blob => $self->large };
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
sub left { my ($self) = @_; return length( $self->{raw} ) - $self->{at} }
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
sub readfile {
|
|
398
|
+
my ($raw) = @_;
|
|
399
|
+
|
|
400
|
+
my $read = Voxgig::Sekreto::Plugins::Minivault::Reader->new($raw);
|
|
401
|
+
|
|
402
|
+
fail('not a vault file') if MAGIC() ne $read->take(4);
|
|
403
|
+
|
|
404
|
+
my $version = $read->u8;
|
|
405
|
+
fail( 'unsupported format version: ' . $version ) if FORMAT() != $version;
|
|
406
|
+
|
|
407
|
+
my $kdf = $read->u8;
|
|
408
|
+
my $cipher = $read->u8;
|
|
409
|
+
fail( 'unsupported kdf or cipher: ' . $kdf . '/' . $cipher )
|
|
410
|
+
if KDF_PBKDF2() != $kdf || CIPHER_AESGCM() != $cipher;
|
|
411
|
+
$read->u8;
|
|
412
|
+
|
|
413
|
+
my $vault = { keys => [], entries => [] };
|
|
414
|
+
|
|
415
|
+
# A COUNT IS BOUNDED BY WHAT IS LEFT. Each record carries at least a
|
|
416
|
+
# few bytes, so a file claiming four billion of them is damaged; the
|
|
417
|
+
# loop would find that out one truncation at a time, and a caller that
|
|
418
|
+
# preallocated would not.
|
|
419
|
+
my $keycount = $read->u32;
|
|
420
|
+
fail('the vault file is truncated') if $read->left < $keycount;
|
|
421
|
+
|
|
422
|
+
for ( 1 .. $keycount ) {
|
|
423
|
+
push @{ $vault->{keys} },
|
|
424
|
+
{
|
|
425
|
+
id => textof( $read->small ),
|
|
426
|
+
salt => $read->small,
|
|
427
|
+
iters => $read->u32,
|
|
428
|
+
ring => $read->sealed,
|
|
429
|
+
meta => $read->sealed,
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
my $entrycount = $read->u32;
|
|
434
|
+
fail('the vault file is truncated') if $read->left < $entrycount;
|
|
435
|
+
|
|
436
|
+
for ( 1 .. $entrycount ) {
|
|
437
|
+
push @{ $vault->{entries} },
|
|
438
|
+
{
|
|
439
|
+
id => $read->small,
|
|
440
|
+
name => $read->sealed,
|
|
441
|
+
value => $read->sealed,
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
fail('the vault file has trailing bytes') if 0 != $read->left;
|
|
446
|
+
|
|
447
|
+
return $vault;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
sub writefile {
|
|
451
|
+
my ($vault) = @_;
|
|
452
|
+
|
|
453
|
+
my $out = MAGIC() . pack( 'CCCC', FORMAT(), KDF_PBKDF2(), CIPHER_AESGCM(), 0 );
|
|
454
|
+
|
|
455
|
+
my $small = sub { return pack( 'C', length( $_[0] ) ) . $_[0] };
|
|
456
|
+
my $large = sub { return pack( 'N', length( $_[0] ) ) . $_[0] };
|
|
457
|
+
my $sealed = sub { return $small->( $_[0]->{iv} ) . $large->( $_[0]->{blob} ) };
|
|
458
|
+
|
|
459
|
+
$out .= pack( 'N', scalar @{ $vault->{keys} } );
|
|
460
|
+
|
|
461
|
+
for my $record ( @{ $vault->{keys} } ) {
|
|
462
|
+
$out .= $small->( bytesof( $record->{id} ) );
|
|
463
|
+
$out .= $small->( $record->{salt} );
|
|
464
|
+
$out .= pack( 'N', $record->{iters} );
|
|
465
|
+
$out .= $sealed->( $record->{ring} );
|
|
466
|
+
$out .= $sealed->( $record->{meta} );
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
# SORTED BY ID, which is a blinded value: the file therefore records
|
|
470
|
+
# nothing about the order secrets were written in.
|
|
471
|
+
my @entries = sort { $a->{id} cmp $b->{id} } @{ $vault->{entries} };
|
|
472
|
+
|
|
473
|
+
$out .= pack( 'N', scalar @entries );
|
|
474
|
+
|
|
475
|
+
for my $record (@entries) {
|
|
476
|
+
$out .= $small->( $record->{id} );
|
|
477
|
+
$out .= $sealed->( $record->{name} );
|
|
478
|
+
$out .= $sealed->( $record->{value} );
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
return $out;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
sub keyrecord {
|
|
485
|
+
my ( $vault, $id ) = @_;
|
|
486
|
+
|
|
487
|
+
for my $record ( @{ $vault->{keys} } ) {
|
|
488
|
+
return $record if $id eq $record->{id};
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
return undef;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
sub entryrecord {
|
|
495
|
+
my ( $vault, $id ) = @_;
|
|
496
|
+
|
|
497
|
+
for my $record ( @{ $vault->{entries} } ) {
|
|
498
|
+
return $record if $id eq $record->{id};
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
return undef;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
# Is this the same sealed blob, byte for byte?
|
|
505
|
+
sub sameseal {
|
|
506
|
+
my ( $left, $right ) = @_;
|
|
507
|
+
return $left->{iv} eq $right->{iv} && $left->{blob} eq $right->{blob};
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
# ------------------------------------------------------- the file on disk
|
|
511
|
+
|
|
512
|
+
# Writes bytes to a path that is not there yet, and REFUSES one that is.
|
|
513
|
+
#
|
|
514
|
+
# `O_EXCL` refuses an existing path in ONE syscall and will not follow a
|
|
515
|
+
# symlink to make one, and the mode goes on AT CREATION rather than after:
|
|
516
|
+
# a chmod once the bytes are written leaves the file readable for as long
|
|
517
|
+
# as it takes to write them.
|
|
518
|
+
#
|
|
519
|
+
# Returns the errno string on failure, so that both callers can name the
|
|
520
|
+
# VAULT file - the path a caller configured, not the temporary one of them
|
|
521
|
+
# happens to be writing.
|
|
522
|
+
sub spill {
|
|
523
|
+
my ( $path, $raw ) = @_;
|
|
524
|
+
|
|
525
|
+
my $handle;
|
|
526
|
+
if (
|
|
527
|
+
!sysopen( $handle, $path,
|
|
528
|
+
Fcntl::O_WRONLY() | Fcntl::O_CREAT() | Fcntl::O_EXCL(), oct('600') )
|
|
529
|
+
)
|
|
530
|
+
{
|
|
531
|
+
return "$!";
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
binmode($handle);
|
|
535
|
+
|
|
536
|
+
my $written = syswrite( $handle, $raw );
|
|
537
|
+
my $why = defined $written && length($raw) == $written ? undef : "$!";
|
|
538
|
+
|
|
539
|
+
close($handle) or $why ||= "$!";
|
|
540
|
+
|
|
541
|
+
return $why;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
# Writes a vault file that is not there yet, and REFUSES one that is.
|
|
545
|
+
sub putnew {
|
|
546
|
+
my ( $path, $vault ) = @_;
|
|
547
|
+
|
|
548
|
+
my $why = spill( $path, writefile($vault) );
|
|
549
|
+
return if !defined $why;
|
|
550
|
+
|
|
551
|
+
fail( 'vault file already exists: ' . $path ) if -e $path;
|
|
552
|
+
fail( 'cannot write ' . $path . ': ' . $why );
|
|
553
|
+
|
|
554
|
+
return;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
sub readmaybe {
|
|
558
|
+
my ($path) = @_;
|
|
559
|
+
|
|
560
|
+
my $handle;
|
|
561
|
+
if ( !open( $handle, '<', $path ) ) {
|
|
562
|
+
return undef if !-e $path;
|
|
563
|
+
fail( 'cannot read ' . $path . ': ' . $! );
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
binmode($handle);
|
|
567
|
+
local $/ = undef;
|
|
568
|
+
my $raw = <$handle>;
|
|
569
|
+
close($handle);
|
|
570
|
+
|
|
571
|
+
return defined $raw ? $raw : '';
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
# ------------------------------------------------------------- creating
|
|
575
|
+
|
|
576
|
+
# A new vault: one master key, no secrets.
|
|
577
|
+
sub newvault {
|
|
578
|
+
my ( $keyid, $passphrase, $iterations ) = @_;
|
|
579
|
+
|
|
580
|
+
my $root = randombytes( KEYLEN() );
|
|
581
|
+
my $salt = randombytes( SALTLEN() );
|
|
582
|
+
|
|
583
|
+
my $ring = { v => FORMAT(), write => JSON::PP::true, root => b64($root) };
|
|
584
|
+
my $meta = {
|
|
585
|
+
v => FORMAT(),
|
|
586
|
+
master => JSON::PP::true,
|
|
587
|
+
write => JSON::PP::true,
|
|
588
|
+
grants => [],
|
|
589
|
+
};
|
|
590
|
+
|
|
591
|
+
return {
|
|
592
|
+
keys => [
|
|
593
|
+
{
|
|
594
|
+
id => $keyid,
|
|
595
|
+
salt => $salt,
|
|
596
|
+
iters => $iterations,
|
|
597
|
+
ring => seal( kek( $passphrase, $salt, $iterations ),
|
|
598
|
+
jsonof($ring), AAD_RING() . $keyid ),
|
|
599
|
+
meta => seal( mac( $root, LABEL_META() ),
|
|
600
|
+
jsonof($meta), AAD_META() . $keyid ),
|
|
601
|
+
}
|
|
602
|
+
],
|
|
603
|
+
entries => [],
|
|
604
|
+
};
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
# One key record: the ring sealed under the passphrase, the metadata
|
|
608
|
+
# sealed under the vault's meta key.
|
|
609
|
+
sub sealkey {
|
|
610
|
+
my ( $root, $keyid, $passphrase, $iters, $ring, $meta ) = @_;
|
|
611
|
+
|
|
612
|
+
my $salt = randombytes( SALTLEN() );
|
|
613
|
+
|
|
614
|
+
return {
|
|
615
|
+
id => $keyid,
|
|
616
|
+
salt => $salt,
|
|
617
|
+
iters => $iters,
|
|
618
|
+
ring => seal( kek( $passphrase, $salt, $iters ), jsonof($ring),
|
|
619
|
+
AAD_RING() . $keyid ),
|
|
620
|
+
meta => seal( mac( $root, LABEL_META() ), jsonof($meta), AAD_META() . $keyid ),
|
|
621
|
+
};
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
# AN EMPTY KEY IS NO KEY, so it means `master`.
|
|
625
|
+
#
|
|
626
|
+
# A CLI reaches here with SEKRETO_VAULT_KEY set and empty, which is what
|
|
627
|
+
# an unset shell variable expands to, and an empty id is not a key anyone
|
|
628
|
+
# could have granted.
|
|
629
|
+
sub wantkey {
|
|
630
|
+
my ($held) = @_;
|
|
631
|
+
return ( !defined $held || ref($held) || '' eq $held ) ? MASTERKEY() : $held;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
# A detached copy, so that what a caller is handed cannot become what this
|
|
635
|
+
# vault believes.
|
|
636
|
+
sub copyinfo {
|
|
637
|
+
my ($info) = @_;
|
|
638
|
+
|
|
639
|
+
return {
|
|
640
|
+
key => $info->{key},
|
|
641
|
+
master => $info->{master},
|
|
642
|
+
write => $info->{write},
|
|
643
|
+
grants => [ @{ $info->{grants} } ],
|
|
644
|
+
};
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
# --------------------------------------------------------------- the vault
|
|
648
|
+
|
|
649
|
+
{
|
|
650
|
+
# A handle on one vault file, opened as ONE key.
|
|
651
|
+
#
|
|
652
|
+
# Every method answers as that key: `list` shows the names it may
|
|
653
|
+
# read, `get` answers for those and misses on the rest, and the
|
|
654
|
+
# master-only methods refuse for any other key. Nothing is read or
|
|
655
|
+
# derived until the first call that needs the file.
|
|
656
|
+
#
|
|
657
|
+
# `master` and `write` are 1/0, as Perl truth goes, which is what
|
|
658
|
+
# `validname` in the core does with the same question.
|
|
659
|
+
package Voxgig::Sekreto::Plugins::Minivault::Vault;
|
|
660
|
+
|
|
661
|
+
use strict;
|
|
662
|
+
use warnings;
|
|
663
|
+
|
|
664
|
+
use File::Spec ();
|
|
665
|
+
|
|
666
|
+
my $MV = 'Voxgig::Sekreto::Plugins::Minivault';
|
|
667
|
+
|
|
668
|
+
sub new {
|
|
669
|
+
my ( $class, $options ) = @_;
|
|
670
|
+
|
|
671
|
+
my $opts = $options || {};
|
|
672
|
+
|
|
673
|
+
my $self = bless {
|
|
674
|
+
file => $opts->{file},
|
|
675
|
+
keyid => $MV->can('wantkey')->( $opts->{key} ),
|
|
676
|
+
passphrase => $opts->{passphrase},
|
|
677
|
+
iterations => $opts->{iterations} || $MV->can('ITERATIONS')->(),
|
|
678
|
+
create => ( defined $opts->{create} && $opts->{create} ) ? 1 : 0,
|
|
679
|
+
opened => undef,
|
|
680
|
+
}, $class;
|
|
681
|
+
|
|
682
|
+
Voxgig::Sekreto::Plugins::Minivault::fail('a vault needs a file')
|
|
683
|
+
if !defined $self->{file} || ref( $self->{file} ) || '' eq $self->{file};
|
|
684
|
+
|
|
685
|
+
Voxgig::Sekreto::Plugins::Minivault::fail('a vault needs a passphrase')
|
|
686
|
+
if !defined $self->{passphrase}
|
|
687
|
+
|| ref( $self->{passphrase} )
|
|
688
|
+
|| '' eq $self->{passphrase};
|
|
689
|
+
|
|
690
|
+
Voxgig::Sekreto::Plugins::Minivault::checkid( $self->{keyid},
|
|
691
|
+
'a vault needs a key id' );
|
|
692
|
+
|
|
693
|
+
return $self;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
# The file this handle reads.
|
|
697
|
+
sub file { return $_[0]->{file} }
|
|
698
|
+
|
|
699
|
+
# The key id this handle opens with.
|
|
700
|
+
sub key { return $_[0]->{keyid} }
|
|
701
|
+
|
|
702
|
+
# Derive the key and read the file NOW rather than at first use.
|
|
703
|
+
sub open {
|
|
704
|
+
my ($self) = @_;
|
|
705
|
+
my ( undef, $opened ) = $self->load;
|
|
706
|
+
return Voxgig::Sekreto::Plugins::Minivault::copyinfo( $opened->{info} );
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
# Forget the derived keys. The next call opens again.
|
|
710
|
+
sub close {
|
|
711
|
+
my ($self) = @_;
|
|
712
|
+
$self->{opened} = undef;
|
|
713
|
+
return;
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
# The names this key can read, sorted.
|
|
717
|
+
sub list {
|
|
718
|
+
my ($self) = @_;
|
|
719
|
+
my ( $vault, $opened ) = $self->load;
|
|
720
|
+
|
|
721
|
+
if ( defined $opened->{root} ) {
|
|
722
|
+
my $namekey = Voxgig::Sekreto::Plugins::Minivault::mac( $opened->{root},
|
|
723
|
+
Voxgig::Sekreto::Plugins::Minivault::LABEL_NAMES() );
|
|
724
|
+
|
|
725
|
+
return [
|
|
726
|
+
sort map {
|
|
727
|
+
Voxgig::Sekreto::Plugins::Minivault::textof(
|
|
728
|
+
Voxgig::Sekreto::Plugins::Minivault::unseal(
|
|
729
|
+
$namekey, $_->{name},
|
|
730
|
+
Voxgig::Sekreto::Plugins::Minivault::AAD_NAME(),
|
|
731
|
+
'a secret name is damaged'
|
|
732
|
+
)
|
|
733
|
+
)
|
|
734
|
+
} @{ $vault->{entries} }
|
|
735
|
+
];
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
# A restricted key has no name key, so it reports the grants it
|
|
739
|
+
# can actually find: the vault never tells it what else is in
|
|
740
|
+
# there.
|
|
741
|
+
return [
|
|
742
|
+
sort grep { defined $self->findentry( $vault, $opened->{grants}{$_} ) }
|
|
743
|
+
@{ $opened->{info}{grants} }
|
|
744
|
+
];
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
sub has {
|
|
748
|
+
my ( $self, $name ) = @_;
|
|
749
|
+
return defined $self->get($name) ? 1 : 0;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
# The value, or undef when the vault does not hold that name or this
|
|
753
|
+
# key was not granted it.
|
|
754
|
+
sub get {
|
|
755
|
+
my ( $self, $name ) = @_;
|
|
756
|
+
|
|
757
|
+
Voxgig::Sekreto::checkname($name);
|
|
758
|
+
my ( $vault, $opened ) = $self->load;
|
|
759
|
+
|
|
760
|
+
my $key = $self->keyfor( $opened, $name );
|
|
761
|
+
|
|
762
|
+
# OUTSIDE THE GRANT IS A MISS, deliberately. The vault answers as
|
|
763
|
+
# the key that opened it, so a name this key cannot read is a name
|
|
764
|
+
# this store does not hold for this caller.
|
|
765
|
+
return undef if !defined $key;
|
|
766
|
+
|
|
767
|
+
my $entry = $self->findentry( $vault, $key );
|
|
768
|
+
return undef if !defined $entry;
|
|
769
|
+
|
|
770
|
+
return Voxgig::Sekreto::Plugins::Minivault::textof(
|
|
771
|
+
Voxgig::Sekreto::Plugins::Minivault::unseal(
|
|
772
|
+
$key, $entry->{value},
|
|
773
|
+
Voxgig::Sekreto::Plugins::Minivault::AAD_SECRET() . $name,
|
|
774
|
+
'the value of ' . $name . ' is damaged'
|
|
775
|
+
)
|
|
776
|
+
);
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
# Write a value. A master writes any name; a restricted key holding
|
|
780
|
+
# `write` overwrites the names it was granted, and creates none.
|
|
781
|
+
sub set {
|
|
782
|
+
my ( $self, $name, $value ) = @_;
|
|
783
|
+
|
|
784
|
+
Voxgig::Sekreto::checkname($name);
|
|
785
|
+
Voxgig::Sekreto::Plugins::Minivault::fail( 'a secret value must be text: ' . $name )
|
|
786
|
+
if !defined $value || ref($value);
|
|
787
|
+
|
|
788
|
+
my ( $vault, $opened ) = $self->load;
|
|
789
|
+
|
|
790
|
+
Voxgig::Sekreto::Plugins::Minivault::fail(
|
|
791
|
+
'key ' . $opened->{info}{key} . ' is read-only' )
|
|
792
|
+
if !$opened->{info}{write};
|
|
793
|
+
|
|
794
|
+
my $key = $self->keyfor( $opened, $name );
|
|
795
|
+
Voxgig::Sekreto::Plugins::Minivault::fail(
|
|
796
|
+
'key ' . $opened->{info}{key} . ' was not granted ' . $name )
|
|
797
|
+
if !defined $key;
|
|
798
|
+
|
|
799
|
+
my $sealedvalue = Voxgig::Sekreto::Plugins::Minivault::seal( $key, $value,
|
|
800
|
+
Voxgig::Sekreto::Plugins::Minivault::AAD_SECRET() . $name );
|
|
801
|
+
|
|
802
|
+
my $id = Voxgig::Sekreto::Plugins::Minivault::entryid($key);
|
|
803
|
+
my $entry = Voxgig::Sekreto::Plugins::Minivault::entryrecord( $vault, $id );
|
|
804
|
+
|
|
805
|
+
if ( defined $entry ) {
|
|
806
|
+
$entry->{value} = $sealedvalue;
|
|
807
|
+
}
|
|
808
|
+
else {
|
|
809
|
+
# A NEW NAME NEEDS THE NAME KEY, which only a master holds. So
|
|
810
|
+
# a restricted key with `write` updates what it was granted
|
|
811
|
+
# and cannot grow the vault.
|
|
812
|
+
my $root = $self->rootof( $opened, 'creating the secret ' . $name );
|
|
813
|
+
|
|
814
|
+
push @{ $vault->{entries} },
|
|
815
|
+
{
|
|
816
|
+
id => $id,
|
|
817
|
+
name => Voxgig::Sekreto::Plugins::Minivault::seal(
|
|
818
|
+
Voxgig::Sekreto::Plugins::Minivault::mac(
|
|
819
|
+
$root, Voxgig::Sekreto::Plugins::Minivault::LABEL_NAMES()
|
|
820
|
+
),
|
|
821
|
+
$name,
|
|
822
|
+
Voxgig::Sekreto::Plugins::Minivault::AAD_NAME()
|
|
823
|
+
),
|
|
824
|
+
value => $sealedvalue,
|
|
825
|
+
};
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
$self->save($vault);
|
|
829
|
+
|
|
830
|
+
return;
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
# Drop a name. Master only.
|
|
834
|
+
sub remove {
|
|
835
|
+
my ( $self, $name ) = @_;
|
|
836
|
+
|
|
837
|
+
Voxgig::Sekreto::checkname($name);
|
|
838
|
+
my ( $vault, $opened ) = $self->load;
|
|
839
|
+
my $root = $self->rootof( $opened, 'removing a secret' );
|
|
840
|
+
|
|
841
|
+
my $wanted = Voxgig::Sekreto::Plugins::Minivault::entryid(
|
|
842
|
+
Voxgig::Sekreto::Plugins::Minivault::secretkey( $root, $name ) );
|
|
843
|
+
|
|
844
|
+
Voxgig::Sekreto::Plugins::Minivault::fail( 'no such secret: ' . $name )
|
|
845
|
+
if !defined Voxgig::Sekreto::Plugins::Minivault::entryrecord( $vault, $wanted );
|
|
846
|
+
|
|
847
|
+
$vault->{entries} = [ grep { $wanted ne $_->{id} } @{ $vault->{entries} } ];
|
|
848
|
+
$self->save($vault);
|
|
849
|
+
|
|
850
|
+
return;
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
# Every key in the file, with what it may do. Master only.
|
|
854
|
+
sub keys {
|
|
855
|
+
my ($self) = @_;
|
|
856
|
+
my ( $vault, $opened ) = $self->load;
|
|
857
|
+
$self->rootof( $opened, 'listing the keys' );
|
|
858
|
+
|
|
859
|
+
my @out;
|
|
860
|
+
|
|
861
|
+
for my $record ( @{ $vault->{keys} } ) {
|
|
862
|
+
my $meta = $self->metaof( $opened, $record );
|
|
863
|
+
|
|
864
|
+
my $id = $record->{id};
|
|
865
|
+
|
|
866
|
+
if ( !defined $meta ) {
|
|
867
|
+
push @out,
|
|
868
|
+
{ key => $id, master => 0, write => 0, grants => [] };
|
|
869
|
+
}
|
|
870
|
+
else {
|
|
871
|
+
push @out,
|
|
872
|
+
{
|
|
873
|
+
key => $id,
|
|
874
|
+
master => $meta->{master} ? 1 : 0,
|
|
875
|
+
write => $meta->{write} ? 1 : 0,
|
|
876
|
+
grants => [ sort @{ $meta->{grants} || [] } ],
|
|
877
|
+
};
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
return \@out;
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
# Mint a restricted key. Master only.
|
|
885
|
+
sub grant {
|
|
886
|
+
my ( $self, $spec ) = @_;
|
|
887
|
+
|
|
888
|
+
my ( $vault, $opened ) = $self->load;
|
|
889
|
+
my $root = $self->rootof( $opened, 'granting a key' );
|
|
890
|
+
|
|
891
|
+
$spec ||= {};
|
|
892
|
+
Voxgig::Sekreto::Plugins::Minivault::checkid( $spec->{key},
|
|
893
|
+
'a grant needs a key id' );
|
|
894
|
+
|
|
895
|
+
|
|
896
|
+
Voxgig::Sekreto::Plugins::Minivault::fail('a grant needs a passphrase')
|
|
897
|
+
if !defined $spec->{passphrase}
|
|
898
|
+
|| ref( $spec->{passphrase} )
|
|
899
|
+
|| '' eq $spec->{passphrase};
|
|
900
|
+
|
|
901
|
+
Voxgig::Sekreto::Plugins::Minivault::fail( 'key already exists: ' . $spec->{key} )
|
|
902
|
+
if defined Voxgig::Sekreto::Plugins::Minivault::keyrecord( $vault, $spec->{key} );
|
|
903
|
+
|
|
904
|
+
my @names = sort @{ $spec->{names} || [] };
|
|
905
|
+
my %grants;
|
|
906
|
+
|
|
907
|
+
for my $name (@names) {
|
|
908
|
+
Voxgig::Sekreto::checkname($name);
|
|
909
|
+
$grants{$name} = Voxgig::Sekreto::Plugins::Minivault::b64(
|
|
910
|
+
Voxgig::Sekreto::Plugins::Minivault::secretkey( $root, $name ) );
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
my $write = ( defined $spec->{write} && $spec->{write} ) ? 1 : 0;
|
|
914
|
+
|
|
915
|
+
push @{ $vault->{keys} },
|
|
916
|
+
Voxgig::Sekreto::Plugins::Minivault::sealkey(
|
|
917
|
+
$root,
|
|
918
|
+
$spec->{key},
|
|
919
|
+
$spec->{passphrase},
|
|
920
|
+
$spec->{iterations} || $self->{iterations},
|
|
921
|
+
|
|
922
|
+
# GRANTS IS ALWAYS THERE, even granted nothing. A ring without
|
|
923
|
+
# it is a MASTER's ring in every port's reader, so dropping the
|
|
924
|
+
# empty map would be a key that reads the whole vault.
|
|
925
|
+
{
|
|
926
|
+
v => Voxgig::Sekreto::Plugins::Minivault::FORMAT(),
|
|
927
|
+
write => $write ? JSON::PP::true : JSON::PP::false,
|
|
928
|
+
grants => \%grants,
|
|
929
|
+
},
|
|
930
|
+
{
|
|
931
|
+
v => Voxgig::Sekreto::Plugins::Minivault::FORMAT(),
|
|
932
|
+
master => JSON::PP::false,
|
|
933
|
+
write => $write ? JSON::PP::true : JSON::PP::false,
|
|
934
|
+
grants => \@names,
|
|
935
|
+
}
|
|
936
|
+
);
|
|
937
|
+
|
|
938
|
+
$self->save($vault);
|
|
939
|
+
|
|
940
|
+
return;
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
# Drop a key. Master only.
|
|
944
|
+
#
|
|
945
|
+
# Anyone who already copied the file keeps whatever that key could
|
|
946
|
+
# read, so revoking bars future reads of the LIVE file and `rotate` is
|
|
947
|
+
# what takes a secret back.
|
|
948
|
+
sub revoke {
|
|
949
|
+
my ( $self, $key ) = @_;
|
|
950
|
+
|
|
951
|
+
my ( $vault, $opened ) = $self->load;
|
|
952
|
+
$self->rootof( $opened, 'revoking a key' );
|
|
953
|
+
|
|
954
|
+
Voxgig::Sekreto::Plugins::Minivault::fail( 'a key cannot revoke itself: ' . $key )
|
|
955
|
+
if $key eq $opened->{info}{key};
|
|
956
|
+
|
|
957
|
+
Voxgig::Sekreto::Plugins::Minivault::fail( 'no such key: ' . $key )
|
|
958
|
+
if !defined Voxgig::Sekreto::Plugins::Minivault::keyrecord( $vault, $key );
|
|
959
|
+
|
|
960
|
+
$vault->{keys} = [ grep { $key ne $_->{id} } @{ $vault->{keys} } ];
|
|
961
|
+
$self->save($vault);
|
|
962
|
+
|
|
963
|
+
return;
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
# A new root key, every value re-encrypted under it, and EVERY OTHER
|
|
967
|
+
# KEY DROPPED. Master only.
|
|
968
|
+
#
|
|
969
|
+
# The other keys go because they must: their rings are sealed under
|
|
970
|
+
# passphrases this process does not have. Re-grant afterwards.
|
|
971
|
+
sub rotate {
|
|
972
|
+
my ($self) = @_;
|
|
973
|
+
|
|
974
|
+
my ( $vault, $opened ) = $self->load;
|
|
975
|
+
$self->rootof( $opened, 'rotating the vault' );
|
|
976
|
+
|
|
977
|
+
# Read everything out under the old root before anything changes:
|
|
978
|
+
# once the root is replaced the old derived keys are unreachable.
|
|
979
|
+
my @plain = map { [ $_, $self->get($_) ] } @{ $self->list };
|
|
980
|
+
|
|
981
|
+
my $root = Voxgig::Sekreto::Plugins::Minivault::randombytes(
|
|
982
|
+
Voxgig::Sekreto::Plugins::Minivault::KEYLEN() );
|
|
983
|
+
my $namekey = Voxgig::Sekreto::Plugins::Minivault::mac( $root,
|
|
984
|
+
Voxgig::Sekreto::Plugins::Minivault::LABEL_NAMES() );
|
|
985
|
+
|
|
986
|
+
my @entries;
|
|
987
|
+
|
|
988
|
+
for my $pair (@plain) {
|
|
989
|
+
my ( $name, $value ) = @{$pair};
|
|
990
|
+
my $key = Voxgig::Sekreto::Plugins::Minivault::secretkey( $root, $name );
|
|
991
|
+
|
|
992
|
+
push @entries,
|
|
993
|
+
{
|
|
994
|
+
id => Voxgig::Sekreto::Plugins::Minivault::entryid($key),
|
|
995
|
+
name => Voxgig::Sekreto::Plugins::Minivault::seal(
|
|
996
|
+
$namekey, $name, Voxgig::Sekreto::Plugins::Minivault::AAD_NAME()
|
|
997
|
+
),
|
|
998
|
+
value => Voxgig::Sekreto::Plugins::Minivault::seal(
|
|
999
|
+
$key, $value,
|
|
1000
|
+
Voxgig::Sekreto::Plugins::Minivault::AAD_SECRET() . $name
|
|
1001
|
+
),
|
|
1002
|
+
};
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
my $record =
|
|
1006
|
+
Voxgig::Sekreto::Plugins::Minivault::keyrecord( $vault, $self->{keyid} );
|
|
1007
|
+
|
|
1008
|
+
my $fresh = Voxgig::Sekreto::Plugins::Minivault::sealkey(
|
|
1009
|
+
$root, $self->{keyid}, $self->{passphrase}, $record->{iters},
|
|
1010
|
+
{
|
|
1011
|
+
v => Voxgig::Sekreto::Plugins::Minivault::FORMAT(),
|
|
1012
|
+
write => JSON::PP::true,
|
|
1013
|
+
root => Voxgig::Sekreto::Plugins::Minivault::b64($root),
|
|
1014
|
+
},
|
|
1015
|
+
{
|
|
1016
|
+
v => Voxgig::Sekreto::Plugins::Minivault::FORMAT(),
|
|
1017
|
+
master => JSON::PP::true,
|
|
1018
|
+
write => JSON::PP::true,
|
|
1019
|
+
grants => [],
|
|
1020
|
+
}
|
|
1021
|
+
);
|
|
1022
|
+
|
|
1023
|
+
# SAVE FIRST, adopt second. A handle holding the new root over a
|
|
1024
|
+
# file that still holds the old one reads nothing and says the
|
|
1025
|
+
# vault is damaged, which is the wrong story about a failed write.
|
|
1026
|
+
$self->save( { keys => [$fresh], entries => \@entries } );
|
|
1027
|
+
|
|
1028
|
+
$self->{opened} = {
|
|
1029
|
+
info => {
|
|
1030
|
+
key => $self->{keyid},
|
|
1031
|
+
master => 1,
|
|
1032
|
+
write => 1,
|
|
1033
|
+
grants => [],
|
|
1034
|
+
},
|
|
1035
|
+
root => $root,
|
|
1036
|
+
grants => {},
|
|
1037
|
+
ring => $fresh->{ring},
|
|
1038
|
+
};
|
|
1039
|
+
|
|
1040
|
+
return;
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
# ------------------------------------------------------------ inside
|
|
1044
|
+
|
|
1045
|
+
sub bytes {
|
|
1046
|
+
my ($self) = @_;
|
|
1047
|
+
|
|
1048
|
+
my $raw = Voxgig::Sekreto::Plugins::Minivault::readmaybe( $self->{file} );
|
|
1049
|
+
return $raw if defined $raw;
|
|
1050
|
+
|
|
1051
|
+
# A vault is configured deliberately, with a key. Its absence is a
|
|
1052
|
+
# broken deployment and never "no secrets here": answering a miss
|
|
1053
|
+
# would send the chain on to a weaker store.
|
|
1054
|
+
Voxgig::Sekreto::Plugins::Minivault::fail( 'no vault file: ' . $self->{file} )
|
|
1055
|
+
if !$self->{create};
|
|
1056
|
+
|
|
1057
|
+
Voxgig::Sekreto::Plugins::Minivault::putnew(
|
|
1058
|
+
$self->{file},
|
|
1059
|
+
Voxgig::Sekreto::Plugins::Minivault::newvault(
|
|
1060
|
+
$self->{keyid}, $self->{passphrase}, $self->{iterations}
|
|
1061
|
+
)
|
|
1062
|
+
);
|
|
1063
|
+
|
|
1064
|
+
$raw = Voxgig::Sekreto::Plugins::Minivault::readmaybe( $self->{file} );
|
|
1065
|
+
Voxgig::Sekreto::Plugins::Minivault::fail( 'cannot read ' . $self->{file} )
|
|
1066
|
+
if !defined $raw;
|
|
1067
|
+
|
|
1068
|
+
return $raw;
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
sub load {
|
|
1072
|
+
my ($self) = @_;
|
|
1073
|
+
|
|
1074
|
+
my $vault = Voxgig::Sekreto::Plugins::Minivault::readfile( $self->bytes );
|
|
1075
|
+
my $record =
|
|
1076
|
+
Voxgig::Sekreto::Plugins::Minivault::keyrecord( $vault, $self->{keyid} );
|
|
1077
|
+
|
|
1078
|
+
if ( !defined $record ) {
|
|
1079
|
+
# REVOKED, or never there. Either way this handle is finished,
|
|
1080
|
+
# and dropping what it derived is what stops the next call
|
|
1081
|
+
# answering from memory.
|
|
1082
|
+
$self->{opened} = undef;
|
|
1083
|
+
Voxgig::Sekreto::Plugins::Minivault::fail( 'no such key: ' . $self->{keyid} );
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
# The file still holds this key, and holds the SAME ring: a key
|
|
1087
|
+
# revoked and re-granted under another passphrase is a different
|
|
1088
|
+
# key wearing the id, and re-deriving is what refuses it.
|
|
1089
|
+
return ( $vault, $self->{opened} )
|
|
1090
|
+
if defined $self->{opened}
|
|
1091
|
+
&& Voxgig::Sekreto::Plugins::Minivault::sameseal( $self->{opened}{ring},
|
|
1092
|
+
$record->{ring} );
|
|
1093
|
+
|
|
1094
|
+
$self->{opened} = undef;
|
|
1095
|
+
|
|
1096
|
+
my $plain = Voxgig::Sekreto::Plugins::Minivault::unseal(
|
|
1097
|
+
Voxgig::Sekreto::Plugins::Minivault::kek(
|
|
1098
|
+
$self->{passphrase}, $record->{salt}, $record->{iters}
|
|
1099
|
+
),
|
|
1100
|
+
$record->{ring},
|
|
1101
|
+
Voxgig::Sekreto::Plugins::Minivault::AAD_RING() . $self->{keyid},
|
|
1102
|
+
'wrong passphrase for key ' . $self->{keyid} . ', or a damaged vault'
|
|
1103
|
+
);
|
|
1104
|
+
|
|
1105
|
+
my $ring = Voxgig::Sekreto::Plugins::Minivault::parsejson( $plain,
|
|
1106
|
+
'key ring for ' . $self->{keyid} );
|
|
1107
|
+
|
|
1108
|
+
my %grants;
|
|
1109
|
+
my $held = $ring->{grants} || {};
|
|
1110
|
+
|
|
1111
|
+
for my $name ( CORE::keys %{$held} ) {
|
|
1112
|
+
$grants{$name} =
|
|
1113
|
+
Voxgig::Sekreto::Plugins::Minivault::unb64( $held->{$name}, 'a granted key' );
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
my $root = $ring->{root};
|
|
1117
|
+
|
|
1118
|
+
$self->{opened} = {
|
|
1119
|
+
info => {
|
|
1120
|
+
key => $self->{keyid},
|
|
1121
|
+
master => defined $root ? 1 : 0,
|
|
1122
|
+
write => ( defined $root || $ring->{write} ) ? 1 : 0,
|
|
1123
|
+
grants => [ sort CORE::keys %grants ],
|
|
1124
|
+
},
|
|
1125
|
+
root => defined $root
|
|
1126
|
+
? Voxgig::Sekreto::Plugins::Minivault::unb64( $root, 'the root key' )
|
|
1127
|
+
: undef,
|
|
1128
|
+
grants => \%grants,
|
|
1129
|
+
ring => $record->{ring},
|
|
1130
|
+
};
|
|
1131
|
+
|
|
1132
|
+
return ( $vault, $self->{opened} );
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
sub rootof {
|
|
1136
|
+
my ( $self, $opened, $what ) = @_;
|
|
1137
|
+
|
|
1138
|
+
Voxgig::Sekreto::Plugins::Minivault::fail( $what
|
|
1139
|
+
. ' needs a master key, and '
|
|
1140
|
+
. $opened->{info}{key}
|
|
1141
|
+
. ' is restricted' )
|
|
1142
|
+
if !defined $opened->{root};
|
|
1143
|
+
|
|
1144
|
+
return $opened->{root};
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
# The key for one name, or undef when this key cannot reach it.
|
|
1148
|
+
sub keyfor {
|
|
1149
|
+
my ( $self, $opened, $name ) = @_;
|
|
1150
|
+
|
|
1151
|
+
return Voxgig::Sekreto::Plugins::Minivault::secretkey( $opened->{root}, $name )
|
|
1152
|
+
if defined $opened->{root};
|
|
1153
|
+
|
|
1154
|
+
return $opened->{grants}{$name};
|
|
1155
|
+
}
|
|
1156
|
+
|
|
1157
|
+
sub findentry {
|
|
1158
|
+
my ( $self, $vault, $key ) = @_;
|
|
1159
|
+
|
|
1160
|
+
return undef if !defined $key;
|
|
1161
|
+
|
|
1162
|
+
return Voxgig::Sekreto::Plugins::Minivault::entryrecord( $vault,
|
|
1163
|
+
Voxgig::Sekreto::Plugins::Minivault::entryid($key) );
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
sub metaof {
|
|
1167
|
+
my ( $self, $opened, $record ) = @_;
|
|
1168
|
+
|
|
1169
|
+
my $root = $self->rootof( $opened, 'reading key metadata' );
|
|
1170
|
+
my $what = 'metadata for key ' . $record->{id};
|
|
1171
|
+
|
|
1172
|
+
my $meta;
|
|
1173
|
+
my $ok = eval {
|
|
1174
|
+
$meta = Voxgig::Sekreto::Plugins::Minivault::parsejson(
|
|
1175
|
+
Voxgig::Sekreto::Plugins::Minivault::unseal(
|
|
1176
|
+
Voxgig::Sekreto::Plugins::Minivault::mac(
|
|
1177
|
+
$root, Voxgig::Sekreto::Plugins::Minivault::LABEL_META()
|
|
1178
|
+
),
|
|
1179
|
+
$record->{meta},
|
|
1180
|
+
Voxgig::Sekreto::Plugins::Minivault::AAD_META() . $record->{id},
|
|
1181
|
+
$what
|
|
1182
|
+
),
|
|
1183
|
+
$what
|
|
1184
|
+
);
|
|
1185
|
+
1;
|
|
1186
|
+
};
|
|
1187
|
+
|
|
1188
|
+
# A record written under a root key this one has replaced. The key
|
|
1189
|
+
# is still in the file and still opens with its own passphrase, so
|
|
1190
|
+
# it is reported rather than hidden - with what it can do unknown.
|
|
1191
|
+
return undef if !$ok;
|
|
1192
|
+
|
|
1193
|
+
return $meta;
|
|
1194
|
+
}
|
|
1195
|
+
|
|
1196
|
+
# Read, change, and REPLACE - never edit in place.
|
|
1197
|
+
#
|
|
1198
|
+
# THE TEMPORARY IS RANDOM AND EXCLUSIVE. `<vault>.<pid>.tmp` is a name
|
|
1199
|
+
# anyone can predict, so anyone who can write the vault's directory
|
|
1200
|
+
# could put a symlink there and have the next save truncate whatever
|
|
1201
|
+
# it pointed at.
|
|
1202
|
+
sub save {
|
|
1203
|
+
my ( $self, $vault ) = @_;
|
|
1204
|
+
|
|
1205
|
+
my $temp = $self->{file} . '.'
|
|
1206
|
+
. unpack( 'H*', Voxgig::Sekreto::Plugins::Minivault::randombytes(8) ) . '.tmp';
|
|
1207
|
+
|
|
1208
|
+
my $why = Voxgig::Sekreto::Plugins::Minivault::spill( $temp,
|
|
1209
|
+
Voxgig::Sekreto::Plugins::Minivault::writefile($vault) );
|
|
1210
|
+
|
|
1211
|
+
if ( !defined $why && !rename( $temp, $self->{file} ) ) {
|
|
1212
|
+
$why = "$!";
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
if ( defined $why ) {
|
|
1216
|
+
# The vault is unchanged either way, and the write error is
|
|
1217
|
+
# what the caller needs to be told about.
|
|
1218
|
+
unlink($temp);
|
|
1219
|
+
Voxgig::Sekreto::Plugins::Minivault::fail(
|
|
1220
|
+
'cannot write ' . $self->{file} . ': ' . $why );
|
|
1221
|
+
}
|
|
1222
|
+
|
|
1223
|
+
return;
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1226
|
+
|
|
1227
|
+
# Open a vault file as one key.
|
|
1228
|
+
#
|
|
1229
|
+
# The handle is lazy. Nothing is read, and no passphrase is stretched,
|
|
1230
|
+
# until a method needs the file.
|
|
1231
|
+
sub openvault {
|
|
1232
|
+
return Voxgig::Sekreto::Plugins::Minivault::Vault->new( $_[0] );
|
|
1233
|
+
}
|
|
1234
|
+
|
|
1235
|
+
# Make a vault file and return a handle on its master key.
|
|
1236
|
+
#
|
|
1237
|
+
# Refuses a file that is already there: a vault is created once, and
|
|
1238
|
+
# overwriting one discards every secret in it.
|
|
1239
|
+
sub createvault {
|
|
1240
|
+
my ($options) = @_;
|
|
1241
|
+
|
|
1242
|
+
my $opts = $options || {};
|
|
1243
|
+
|
|
1244
|
+
fail('a vault needs a file')
|
|
1245
|
+
if !defined $opts->{file} || ref( $opts->{file} ) || '' eq $opts->{file};
|
|
1246
|
+
|
|
1247
|
+
fail('a vault needs a passphrase')
|
|
1248
|
+
if !defined $opts->{passphrase}
|
|
1249
|
+
|| ref( $opts->{passphrase} )
|
|
1250
|
+
|| '' eq $opts->{passphrase};
|
|
1251
|
+
|
|
1252
|
+
my $keyid = checkid( wantkey( $opts->{key} ), 'a vault needs a key id' );
|
|
1253
|
+
|
|
1254
|
+
# No existence check first: the check and the write would be two
|
|
1255
|
+
# steps, and `putnew` refuses an existing file in ONE.
|
|
1256
|
+
putnew( $opts->{file},
|
|
1257
|
+
newvault( $keyid, $opts->{passphrase}, $opts->{iterations} || ITERATIONS() ) );
|
|
1258
|
+
|
|
1259
|
+
return openvault($opts);
|
|
1260
|
+
}
|
|
1261
|
+
|
|
1262
|
+
# ------------------------------------------------------------ the provider
|
|
1263
|
+
|
|
1264
|
+
{
|
|
1265
|
+
# Read a vault as one store in a chain.
|
|
1266
|
+
#
|
|
1267
|
+
# The provider is the READ half and nothing more: a chain resolves
|
|
1268
|
+
# secrets, and writing one is a deliberate act with an API of its own.
|
|
1269
|
+
package Voxgig::Sekreto::Plugins::Minivault::Provider;
|
|
1270
|
+
|
|
1271
|
+
use strict;
|
|
1272
|
+
use warnings;
|
|
1273
|
+
|
|
1274
|
+
sub new {
|
|
1275
|
+
my ( $class, $vault ) = @_;
|
|
1276
|
+
return bless { vault => $vault }, $class;
|
|
1277
|
+
}
|
|
1278
|
+
|
|
1279
|
+
sub lookup {
|
|
1280
|
+
my ( $self, $name ) = @_;
|
|
1281
|
+
return $self->{vault}->get($name);
|
|
1282
|
+
}
|
|
1283
|
+
|
|
1284
|
+
sub describe {
|
|
1285
|
+
my ($self) = @_;
|
|
1286
|
+
return 'minivault:' . $self->{vault}->file;
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
sub providerof {
|
|
1291
|
+
return Voxgig::Sekreto::Plugins::Minivault::Provider->new( $_[0] );
|
|
1292
|
+
}
|
|
1293
|
+
|
|
1294
|
+
# A vault provider from options, for a chain built by hand.
|
|
1295
|
+
sub minivaultprovider {
|
|
1296
|
+
return providerof( openvault( $_[0] ) );
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1299
|
+
# The vault options a provider spec describes.
|
|
1300
|
+
sub minivaultoptions {
|
|
1301
|
+
my ($spec) = @_;
|
|
1302
|
+
|
|
1303
|
+
return {
|
|
1304
|
+
file => defined $spec->{file} ? $spec->{file} : '',
|
|
1305
|
+
key => $spec->{vaultkey},
|
|
1306
|
+
passphrase => defined $spec->{passphrase} ? $spec->{passphrase} : '',
|
|
1307
|
+
iterations => $spec->{iterations},
|
|
1308
|
+
create => ( defined $spec->{create} && $spec->{create} ) ? 1 : 0,
|
|
1309
|
+
};
|
|
1310
|
+
}
|
|
1311
|
+
|
|
1312
|
+
# The vault behind a store in a chain, as its programmatic API.
|
|
1313
|
+
#
|
|
1314
|
+
# With no store named, the unqualified alias answers: one vault in the
|
|
1315
|
+
# chain resolves whatever it is called, and two raise rather than picking
|
|
1316
|
+
# one.
|
|
1317
|
+
sub vaultof {
|
|
1318
|
+
my ( $secrets, $store ) = @_;
|
|
1319
|
+
|
|
1320
|
+
if ( !defined $store ) {
|
|
1321
|
+
my $found = $secrets->host->exports( 'minivault/' . VAULT_EXPORT() );
|
|
1322
|
+
fail('no minivault store in this chain') if !defined $found;
|
|
1323
|
+
return $found;
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
# A NAMED STORE MUST EXIST, and the alias must not stand in for it.
|
|
1327
|
+
# `exports` falls back to the alias when the exact ref misses, so
|
|
1328
|
+
# asking for `minivault` in a chain whose only vault is named `app`
|
|
1329
|
+
# used to hand back the `app` vault - and then write to it. Naming a
|
|
1330
|
+
# store that is not there raises, which is the rule the whole library
|
|
1331
|
+
# follows: `try` already means "may not have it", so it cannot also
|
|
1332
|
+
# mean "may not exist".
|
|
1333
|
+
my $ref = 'minivault' eq $store ? 'minivault' : 'minivault$' . $store;
|
|
1334
|
+
|
|
1335
|
+
fail( 'no minivault store named ' . $store . ' in this chain' )
|
|
1336
|
+
if !defined $secrets->host->instance($ref);
|
|
1337
|
+
|
|
1338
|
+
return $secrets->host->exports( $ref . '/' . VAULT_EXPORT() );
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1341
|
+
# The plugin: the `minivault` provider kind, as a voxgig/plugin definition.
|
|
1342
|
+
#
|
|
1343
|
+
# Written out rather than built by `providerplugin`, because this
|
|
1344
|
+
# definition publishes TWO exports: `provider`, the read half every kind
|
|
1345
|
+
# publishes, and `vault`, the programmatic API.
|
|
1346
|
+
sub minivault {
|
|
1347
|
+
return {
|
|
1348
|
+
name => 'minivault',
|
|
1349
|
+
define => sub {
|
|
1350
|
+
my ($inst) = @_;
|
|
1351
|
+
|
|
1352
|
+
my $options = minivaultoptions( $inst->options || {} );
|
|
1353
|
+
|
|
1354
|
+
my $vault;
|
|
1355
|
+
|
|
1356
|
+
# `openvault` refuses bad configuration HERE, so a mistyped
|
|
1357
|
+
# chain fails at construction. Reaching the FILE is not
|
|
1358
|
+
# configuration: the handle is lazy.
|
|
1359
|
+
my $ok = eval { $vault = openvault($options); 1 };
|
|
1360
|
+
|
|
1361
|
+
if ( !$ok ) {
|
|
1362
|
+
my $err = $@;
|
|
1363
|
+
|
|
1364
|
+
die $err
|
|
1365
|
+
if !( Scalar::Util::blessed($err)
|
|
1366
|
+
&& $err->isa('Voxgig::Sekreto::SekretoError') );
|
|
1367
|
+
|
|
1368
|
+
Voxgig::Plugin::Types::fail_with( ERROR_CODE(), "$err",
|
|
1369
|
+
{ ref => $inst->ref, cause => "$err" } );
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
$inst->export( PROVIDER_EXPORT(), providerof($vault) );
|
|
1373
|
+
$inst->export( VAULT_EXPORT(), $vault );
|
|
1374
|
+
|
|
1375
|
+
return;
|
|
1376
|
+
},
|
|
1377
|
+
};
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
1;
|