@voxgig/sdkgen 4.20.0 → 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/tsconfig.tsbuildinfo +1 -1
- package/model/sdkgen.aon +49 -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/Main_c.ts +3 -0
- package/project/.sdk/src/cmp/c/Schema_c.ts +106 -0
- package/project/.sdk/src/cmp/clojure/Main_clojure.ts +2 -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/Main_cpp.ts +3 -0
- package/project/.sdk/src/cmp/cpp/Schema_cpp.ts +105 -0
- package/project/.sdk/src/cmp/csharp/Main_csharp.ts +3 -0
- package/project/.sdk/src/cmp/csharp/Schema_csharp.ts +85 -0
- package/project/.sdk/src/cmp/elixir/Main_elixir.ts +2 -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/Main_go.ts +2 -0
- package/project/.sdk/src/cmp/go/Schema_go.ts +93 -0
- package/project/.sdk/src/cmp/java/Main_java.ts +2 -0
- package/project/.sdk/src/cmp/java/Schema_java.ts +125 -0
- package/project/.sdk/src/cmp/kotlin/Main_kotlin.ts +2 -0
- package/project/.sdk/src/cmp/kotlin/Schema_kotlin.ts +111 -0
- package/project/.sdk/src/cmp/lua/Main_lua.ts +46 -9
- package/project/.sdk/src/cmp/lua/Package_lua.ts +1 -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 +24 -1
- package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +34 -13
- 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/Main_perl.ts +2 -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/Main_php.ts +2 -0
- package/project/.sdk/src/cmp/php/Package_php.ts +1 -1
- 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/Main_py.ts +2 -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/Main_rb.ts +2 -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/Main_rust.ts +3 -0
- package/project/.sdk/src/cmp/rust/Schema_rust.ts +107 -0
- package/project/.sdk/src/cmp/scala/Main_scala.ts +3 -0
- package/project/.sdk/src/cmp/scala/Schema_scala.ts +108 -0
- package/project/.sdk/src/cmp/swift/Main_swift.ts +3 -0
- package/project/.sdk/src/cmp/swift/Schema_swift.ts +92 -0
- package/project/.sdk/src/cmp/zig/Main_zig.ts +3 -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 +31 -41
- 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 +24 -41
- 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 -85
- 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 +10 -46
- 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 -45
- 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 -35
- package/project/.sdk/tm/kotlin/utility/MakeSpecUrl.kt +6 -0
- 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 +12 -7
- 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_runtime.ml +12 -37
- package/project/.sdk/tm/ocaml/src/feature/validate/.gitkeep +0 -0
- 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 -43
- 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 -31
- 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 -63
- 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 -41
- package/project/.sdk/tm/scala/utility/MakeSpec.scala +8 -1
- 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 -87
- 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 +20 -44
- 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/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
|
@@ -0,0 +1,1033 @@
|
|
|
1
|
+
# VENDORED: @voxgig/sekreto sdk-20260917-1242-0 (elixir/plugins/minivault.ex)
|
|
2
|
+
# Source: https://github.com/voxgig/sekreto @ 108c4a914bee7b6534c30d1c68c25cd1b9377696 [tag: sdk-20260917-1242-0]
|
|
3
|
+
# License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
# The mini vault, as a voxgig/plugin definition.
|
|
5
|
+
#
|
|
6
|
+
# A port of typescript/plugins/minivault.ts, which is canonical.
|
|
7
|
+
#
|
|
8
|
+
# A PLUGIN, not a built-in: it needs crypto, which is the line the four
|
|
9
|
+
# built-ins stay behind. See docs/design/plugin-providers.md.
|
|
10
|
+
#
|
|
11
|
+
# THE KEY DECIDES WHAT THE VAULT HOLDS. A master key reads and writes
|
|
12
|
+
# every name and mints restricted keys. A restricted key reads the names
|
|
13
|
+
# it was granted and CANNOT DERIVE ANY OTHER - the restriction is the
|
|
14
|
+
# cryptography rather than a check this code performs. What that does and
|
|
15
|
+
# does not protect is set out in DOCS.md under "What the mini vault
|
|
16
|
+
# protects".
|
|
17
|
+
#
|
|
18
|
+
# Erlang's `:crypto` carries all four primitives, so nothing here is
|
|
19
|
+
# hand-rolled (AGENTS.md rule 3).
|
|
20
|
+
|
|
21
|
+
defmodule Sekreto.Plugins.Minivault do
|
|
22
|
+
@moduledoc """
|
|
23
|
+
A mini vault: every secret a project owns, encrypted, in ONE FILE.
|
|
24
|
+
|
|
25
|
+
The format:
|
|
26
|
+
|
|
27
|
+
magic 4 'SKMV'
|
|
28
|
+
version 1 FORMAT
|
|
29
|
+
kdf 1 1 = PBKDF2-HMAC-SHA256
|
|
30
|
+
cipher 1 1 = AES-256-GCM
|
|
31
|
+
reserved 1 0
|
|
32
|
+
keycount 4 uint32
|
|
33
|
+
per key:
|
|
34
|
+
id 1 + bytes the key id, PLAINTEXT
|
|
35
|
+
salt 1 + bytes
|
|
36
|
+
iters 4 PBKDF2 rounds for this key
|
|
37
|
+
ring 1 + iv, 4 + bytes sealed under the passphrase
|
|
38
|
+
meta 1 + iv, 4 + bytes sealed under the vault's meta key
|
|
39
|
+
entrycount 4 uint32
|
|
40
|
+
per entry:
|
|
41
|
+
id 1 + bytes the blinded lookup id
|
|
42
|
+
name 1 + iv, 4 + bytes sealed under the vault's name key
|
|
43
|
+
value 1 + iv, 4 + bytes sealed under that secret's own key
|
|
44
|
+
|
|
45
|
+
Integers are big-endian, and every length precedes its bytes. A file one
|
|
46
|
+
port writes is read by every other; `test/fixture` pins that with a
|
|
47
|
+
committed vault rather than with agreement.
|
|
48
|
+
|
|
49
|
+
THE HANDLE IS A PROCESS. Every other port keeps the derived keys in a
|
|
50
|
+
closure or a field and mutates them; a vault handle here is an Agent,
|
|
51
|
+
because a handle that caches what it derived and a handle that notices a
|
|
52
|
+
revoked key are the same handle, and elixir has no other way to be both.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
alias Sekreto.Error
|
|
56
|
+
alias Sekreto.Json
|
|
57
|
+
alias Sekreto.Providers
|
|
58
|
+
alias Sekreto.ProviderSpec
|
|
59
|
+
alias Voxgig.Plugin.Types
|
|
60
|
+
alias Voxgig.Plugin.Host
|
|
61
|
+
alias Voxgig.Plugin.Inst
|
|
62
|
+
|
|
63
|
+
@magic "SKMV"
|
|
64
|
+
@format 1
|
|
65
|
+
@kdf_pbkdf2 1
|
|
66
|
+
@cipher_aesgcm 1
|
|
67
|
+
|
|
68
|
+
# AES-256-GCM: 32-byte keys, 12-byte nonces, 16-byte tags.
|
|
69
|
+
@keylen 32
|
|
70
|
+
@ivlen 12
|
|
71
|
+
@taglen 16
|
|
72
|
+
@saltlen 16
|
|
73
|
+
|
|
74
|
+
@doc "PBKDF2-HMAC-SHA256 rounds when a caller names none."
|
|
75
|
+
def iterations, do: 210_000
|
|
76
|
+
|
|
77
|
+
@doc "The key id a vault gets when a caller names none."
|
|
78
|
+
def masterkey, do: "master"
|
|
79
|
+
|
|
80
|
+
# Additional authenticated data. Every blob is bound to its PLACE in the
|
|
81
|
+
# file, so no ciphertext can be moved.
|
|
82
|
+
@aad_ring "skmv1:ring:"
|
|
83
|
+
@aad_meta "skmv1:meta:"
|
|
84
|
+
@aad_name "skmv1:name"
|
|
85
|
+
@aad_secret "skmv1:secret:"
|
|
86
|
+
|
|
87
|
+
# Everything a master can reach is derived from the root key, so a
|
|
88
|
+
# rotation is one new random value rather than a re-wrap of each part.
|
|
89
|
+
@label_names "skmv1:names"
|
|
90
|
+
@label_meta "skmv1:meta"
|
|
91
|
+
@label_id "skmv1:id"
|
|
92
|
+
|
|
93
|
+
# The largest key id the format can record.
|
|
94
|
+
#
|
|
95
|
+
# `small` writes a length in ONE byte. A longer id wrapped that byte and
|
|
96
|
+
# the writer then appended the whole thing, so every field after it
|
|
97
|
+
# shifted. Checked where an id is ACCEPTED, so the refusal names the id
|
|
98
|
+
# rather than the file.
|
|
99
|
+
@idmax 255
|
|
100
|
+
|
|
101
|
+
@doc "The export key the vault API is published under, beside `provider`."
|
|
102
|
+
def vault_export, do: "vault"
|
|
103
|
+
|
|
104
|
+
defp fail(text) do
|
|
105
|
+
raise Error, message: "sekreto: minivault: " <> text
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# THE LOCK EVERY HANDLE ON ONE FILE SHARES.
|
|
109
|
+
#
|
|
110
|
+
# Each handle is its own map, so two of them on one path did not
|
|
111
|
+
# coordinate: both could finish `load` before either saved, and the
|
|
112
|
+
# second rename then discarded the first one's change while reporting
|
|
113
|
+
# success. Keyed by the ABSOLUTE path, so two handles spelled
|
|
114
|
+
# differently still meet.
|
|
115
|
+
#
|
|
116
|
+
# `:global.trans/2` rather than a mutex, because the BEAM has no shared
|
|
117
|
+
# memory to put one in: processes are the unit here, and this is OTP's
|
|
118
|
+
# own per-key lock over them. Given `[node()]` it is a lock within one
|
|
119
|
+
# node, which is what DOCS.md promises and what the go port arranges
|
|
120
|
+
# with a mutex. Two OS processes still race, and the format's answer to
|
|
121
|
+
# that is the exclusive create and the atomic rename: a reader sees one
|
|
122
|
+
# whole vault or the other, never half of one.
|
|
123
|
+
#
|
|
124
|
+
# It is RE-ENTRANT per process, so a mutating call that ever reached
|
|
125
|
+
# another would wait rather than deadlock; none of them does.
|
|
126
|
+
defp locked(file, body) do
|
|
127
|
+
key =
|
|
128
|
+
case File.cwd() do
|
|
129
|
+
{:ok, _} -> Path.expand(file)
|
|
130
|
+
_ -> file
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
:global.trans({{:sekreto_minivault, key}, self()}, body, [node()])
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# The key a caller asked for, or `masterkey()`: an EMPTY key is no key.
|
|
137
|
+
# The canonical's `opts.key || MASTERKEY` answers for both nil and
|
|
138
|
+
# empty, where elixir's `||` answers for nil alone - `""` is truthy
|
|
139
|
+
# here. A CLI reaches this with SEKRETO_VAULT_KEY set and empty, which
|
|
140
|
+
# is what an unset shell variable expands to.
|
|
141
|
+
defp wantkey(nil), do: masterkey()
|
|
142
|
+
defp wantkey(""), do: masterkey()
|
|
143
|
+
defp wantkey(value), do: value
|
|
144
|
+
|
|
145
|
+
defp checkid(id, _what) when is_binary(id) and id != "" do
|
|
146
|
+
if byte_size(id) > @idmax do
|
|
147
|
+
fail("key id is longer than #{@idmax} bytes: #{String.slice(id, 0, 32)}...")
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
id
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
defp checkid(_id, what), do: fail(what)
|
|
154
|
+
|
|
155
|
+
# --- keys ------------------------------------------------------------
|
|
156
|
+
|
|
157
|
+
defp hmac(key, text), do: :crypto.mac(:hmac, :sha256, key, text)
|
|
158
|
+
|
|
159
|
+
# The key-encryption key a passphrase unwraps a ring with.
|
|
160
|
+
defp kek(passphrase, salt, iters) do
|
|
161
|
+
:crypto.pbkdf2_hmac(:sha256, passphrase, salt, iters, @keylen)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# The key one named secret's value is encrypted with.
|
|
165
|
+
#
|
|
166
|
+
# DERIVED, never stored, for a master: it holds the root key and so
|
|
167
|
+
# reaches every name, including ones written after it was made. A
|
|
168
|
+
# restricted key holds the derived keys it was granted and nothing that
|
|
169
|
+
# produces another.
|
|
170
|
+
defp secretkey(root, name), do: hmac(root, @aad_secret <> name)
|
|
171
|
+
|
|
172
|
+
# Where a secret lives in the file, derived from its own key so that
|
|
173
|
+
# finding it needs no plaintext name.
|
|
174
|
+
defp entryid(key), do: hmac(key, @label_id)
|
|
175
|
+
|
|
176
|
+
defp random(len), do: :crypto.strong_rand_bytes(len)
|
|
177
|
+
|
|
178
|
+
# --- sealing ---------------------------------------------------------
|
|
179
|
+
|
|
180
|
+
defp seal(key, plain, aad) do
|
|
181
|
+
iv = random(@ivlen)
|
|
182
|
+
|
|
183
|
+
{body, tag} =
|
|
184
|
+
:crypto.crypto_one_time_aead(:aes_256_gcm, key, iv, plain, aad, @taglen, true)
|
|
185
|
+
|
|
186
|
+
%{"iv" => iv, "blob" => body <> tag}
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# The plaintext, or a refusal. A GCM tag that fails to verify is the only
|
|
190
|
+
# evidence there is, and it cannot tell a wrong passphrase from a damaged
|
|
191
|
+
# file, so `what` names the attempt and the message admits both.
|
|
192
|
+
defp unseal(key, sealed, aad, what) do
|
|
193
|
+
blob = sealed["blob"]
|
|
194
|
+
iv = sealed["iv"]
|
|
195
|
+
|
|
196
|
+
if byte_size(blob) < @taglen or byte_size(iv) != @ivlen do
|
|
197
|
+
fail(what <> ": truncated")
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
bodylen = byte_size(blob) - @taglen
|
|
201
|
+
<<body::binary-size(bodylen), tag::binary>> = blob
|
|
202
|
+
|
|
203
|
+
# `crypto_one_time_aead` ANSWERS :error rather than raising when the
|
|
204
|
+
# tag does not verify, and raises on a nonce of the wrong length. Both
|
|
205
|
+
# are the same refusal to a caller.
|
|
206
|
+
try do
|
|
207
|
+
case :crypto.crypto_one_time_aead(:aes_256_gcm, key, iv, body, aad, tag, false) do
|
|
208
|
+
:error -> fail(what)
|
|
209
|
+
plain when is_binary(plain) -> plain
|
|
210
|
+
end
|
|
211
|
+
rescue
|
|
212
|
+
err in Error -> reraise err, __STACKTRACE__
|
|
213
|
+
_ -> fail(what)
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
# THE JSON IS TAGGED HERE and plain everywhere else. This port's Json
|
|
218
|
+
# carries `{:obj, pairs}` / `{:str, text}` rather than a bare map, so a
|
|
219
|
+
# ring crosses the boundary twice: `plainof` on the way in, `tagged` on
|
|
220
|
+
# the way out. The bytes are the same either way - the tag is this
|
|
221
|
+
# port's representation, not the format's.
|
|
222
|
+
defp jsonof(plain, what) do
|
|
223
|
+
case Json.parse(plain) do
|
|
224
|
+
{:ok, {:obj, pairs}} -> plainof({:obj, pairs})
|
|
225
|
+
_ -> fail("unreadable " <> what)
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
defp plainof({:obj, pairs}), do: Map.new(pairs, fn {key, value} -> {key, plainof(value)} end)
|
|
230
|
+
defp plainof({:arr, entries}), do: Enum.map(entries, &plainof/1)
|
|
231
|
+
defp plainof({:str, text}), do: text
|
|
232
|
+
defp plainof({:num, value}), do: value
|
|
233
|
+
defp plainof({:bool, value}), do: value
|
|
234
|
+
defp plainof(:null), do: nil
|
|
235
|
+
defp plainof(:none), do: nil
|
|
236
|
+
|
|
237
|
+
defp tagged(value) when is_map(value) do
|
|
238
|
+
{:obj, Enum.map(value, fn {key, one} -> {key, tagged(one)} end)}
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
defp tagged(value) when is_list(value), do: {:arr, Enum.map(value, &tagged/1)}
|
|
242
|
+
defp tagged(value) when is_binary(value), do: {:str, value}
|
|
243
|
+
defp tagged(value) when is_boolean(value), do: {:bool, value}
|
|
244
|
+
defp tagged(value) when is_number(value), do: {:num, value}
|
|
245
|
+
defp tagged(nil), do: :null
|
|
246
|
+
|
|
247
|
+
defp stringify(value), do: Json.stringify(tagged(value))
|
|
248
|
+
|
|
249
|
+
defp b64(bytes), do: Base.encode64(bytes)
|
|
250
|
+
|
|
251
|
+
defp unb64(text, what) when is_binary(text) do
|
|
252
|
+
case Base.decode64(text) do
|
|
253
|
+
{:ok, bytes} -> bytes
|
|
254
|
+
:error -> fail("missing " <> what)
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
defp unb64(_text, what), do: fail("missing " <> what)
|
|
259
|
+
|
|
260
|
+
# --- the file --------------------------------------------------------
|
|
261
|
+
|
|
262
|
+
# A cursor, so that every length check is in one place: a truncated vault
|
|
263
|
+
# is refused rather than read as a short one.
|
|
264
|
+
defp take(bytes, len) when byte_size(bytes) >= len do
|
|
265
|
+
<<out::binary-size(len), rest::binary>> = bytes
|
|
266
|
+
{out, rest}
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
defp take(_bytes, _len), do: fail("the vault file is truncated")
|
|
270
|
+
|
|
271
|
+
defp u8(bytes) do
|
|
272
|
+
{one, rest} = take(bytes, 1)
|
|
273
|
+
<<value>> = one
|
|
274
|
+
{value, rest}
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
defp u32(bytes) do
|
|
278
|
+
{four, rest} = take(bytes, 4)
|
|
279
|
+
<<value::unsigned-big-integer-size(32)>> = four
|
|
280
|
+
{value, rest}
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
defp small(bytes) do
|
|
284
|
+
{len, rest} = u8(bytes)
|
|
285
|
+
take(rest, len)
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
defp large(bytes) do
|
|
289
|
+
{len, rest} = u32(bytes)
|
|
290
|
+
take(rest, len)
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
defp sealed(bytes) do
|
|
294
|
+
{iv, rest} = small(bytes)
|
|
295
|
+
{blob, rest} = large(rest)
|
|
296
|
+
{%{"iv" => iv, "blob" => blob}, rest}
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
defp readfile(bytes) do
|
|
300
|
+
{magic, rest} = take(bytes, 4)
|
|
301
|
+
if magic != @magic, do: fail("not a vault file")
|
|
302
|
+
|
|
303
|
+
{version, rest} = u8(rest)
|
|
304
|
+
if version != @format, do: fail("unsupported format version: #{version}")
|
|
305
|
+
|
|
306
|
+
{kdf, rest} = u8(rest)
|
|
307
|
+
{cipher, rest} = u8(rest)
|
|
308
|
+
|
|
309
|
+
if kdf != @kdf_pbkdf2 or cipher != @cipher_aesgcm do
|
|
310
|
+
fail("unsupported kdf or cipher: #{kdf}/#{cipher}")
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
{_reserved, rest} = u8(rest)
|
|
314
|
+
|
|
315
|
+
{keycount, rest} = u32(rest)
|
|
316
|
+
{keys, rest} = readkeys(rest, keycount, [])
|
|
317
|
+
|
|
318
|
+
{entrycount, rest} = u32(rest)
|
|
319
|
+
{entries, rest} = readentries(rest, entrycount, [])
|
|
320
|
+
|
|
321
|
+
if rest != "", do: fail("the vault file has trailing bytes")
|
|
322
|
+
|
|
323
|
+
%{"keys" => keys, "entries" => entries}
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
defp readkeys(bytes, 0, out), do: {Enum.reverse(out), bytes}
|
|
327
|
+
|
|
328
|
+
defp readkeys(bytes, left, out) do
|
|
329
|
+
{id, rest} = small(bytes)
|
|
330
|
+
{salt, rest} = small(rest)
|
|
331
|
+
{iters, rest} = u32(rest)
|
|
332
|
+
{ring, rest} = sealed(rest)
|
|
333
|
+
{meta, rest} = sealed(rest)
|
|
334
|
+
|
|
335
|
+
readkeys(rest, left - 1, [
|
|
336
|
+
%{"id" => id, "salt" => salt, "iters" => iters, "ring" => ring, "meta" => meta} | out
|
|
337
|
+
])
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
defp readentries(bytes, 0, out), do: {Enum.reverse(out), bytes}
|
|
341
|
+
|
|
342
|
+
defp readentries(bytes, left, out) do
|
|
343
|
+
{id, rest} = small(bytes)
|
|
344
|
+
{name, rest} = sealed(rest)
|
|
345
|
+
{value, rest} = sealed(rest)
|
|
346
|
+
|
|
347
|
+
readentries(rest, left - 1, [
|
|
348
|
+
%{"id" => id, "name" => name, "value" => value} | out
|
|
349
|
+
])
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
defp putsmall(bytes), do: <<byte_size(bytes)::unsigned-big-integer-size(8)>> <> bytes
|
|
353
|
+
defp putlarge(bytes), do: <<byte_size(bytes)::unsigned-big-integer-size(32)>> <> bytes
|
|
354
|
+
defp putsealed(value), do: putsmall(value["iv"]) <> putlarge(value["blob"])
|
|
355
|
+
defp putu32(value), do: <<value::unsigned-big-integer-size(32)>>
|
|
356
|
+
|
|
357
|
+
defp writefile(vault) do
|
|
358
|
+
head =
|
|
359
|
+
@magic <>
|
|
360
|
+
<<@format::8, @kdf_pbkdf2::8, @cipher_aesgcm::8, 0::8>> <>
|
|
361
|
+
putu32(length(vault["keys"]))
|
|
362
|
+
|
|
363
|
+
keys =
|
|
364
|
+
Enum.map_join(vault["keys"], "", fn key ->
|
|
365
|
+
putsmall(key["id"]) <>
|
|
366
|
+
putsmall(key["salt"]) <>
|
|
367
|
+
putu32(key["iters"]) <>
|
|
368
|
+
putsealed(key["ring"]) <> putsealed(key["meta"])
|
|
369
|
+
end)
|
|
370
|
+
|
|
371
|
+
# SORTED BY ID, which is a blinded value: the file therefore records
|
|
372
|
+
# nothing about the order secrets were written in.
|
|
373
|
+
entries = Enum.sort_by(vault["entries"], & &1["id"], :asc)
|
|
374
|
+
|
|
375
|
+
body =
|
|
376
|
+
Enum.map_join(entries, "", fn entry ->
|
|
377
|
+
putsmall(entry["id"]) <> putsealed(entry["name"]) <> putsealed(entry["value"])
|
|
378
|
+
end)
|
|
379
|
+
|
|
380
|
+
head <> keys <> putu32(length(entries)) <> body
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
# --- creating --------------------------------------------------------
|
|
384
|
+
|
|
385
|
+
# A new vault: one master key, no secrets.
|
|
386
|
+
defp newvault(keyid, passphrase, iters) do
|
|
387
|
+
root = random(@keylen)
|
|
388
|
+
salt = random(@saltlen)
|
|
389
|
+
|
|
390
|
+
ring = %{"v" => @format, "write" => true, "root" => b64(root)}
|
|
391
|
+
meta = %{"v" => @format, "master" => true, "write" => true, "grants" => []}
|
|
392
|
+
|
|
393
|
+
%{
|
|
394
|
+
"keys" => [
|
|
395
|
+
%{
|
|
396
|
+
"id" => keyid,
|
|
397
|
+
"salt" => salt,
|
|
398
|
+
"iters" => iters,
|
|
399
|
+
"ring" =>
|
|
400
|
+
seal(kek(passphrase, salt, iters), stringify(ring), @aad_ring <> keyid),
|
|
401
|
+
"meta" => seal(hmac(root, @label_meta), stringify(meta), @aad_meta <> keyid)
|
|
402
|
+
}
|
|
403
|
+
],
|
|
404
|
+
"entries" => []
|
|
405
|
+
}
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
# Write a vault file that is not there yet, and REFUSE one that is.
|
|
409
|
+
#
|
|
410
|
+
# `:exclusive` is O_CREAT|O_EXCL, rather than a temporary and a rename.
|
|
411
|
+
# A rename REPLACES its destination, so two processes creating the same
|
|
412
|
+
# vault both succeeded and the second discarded the first one's secrets.
|
|
413
|
+
defp putnew(file, vault) do
|
|
414
|
+
case File.open(file, [:write, :binary, :exclusive]) do
|
|
415
|
+
{:ok, handle} ->
|
|
416
|
+
IO.binwrite(handle, writefile(vault))
|
|
417
|
+
File.close(handle)
|
|
418
|
+
File.chmod(file, 0o600)
|
|
419
|
+
:ok
|
|
420
|
+
|
|
421
|
+
{:error, :eexist} ->
|
|
422
|
+
fail("vault file already exists: " <> file)
|
|
423
|
+
|
|
424
|
+
{:error, why} ->
|
|
425
|
+
fail("cannot write " <> file <> ": " <> to_string(:file.format_error(why)))
|
|
426
|
+
end
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
# --- the handle ------------------------------------------------------
|
|
430
|
+
|
|
431
|
+
@doc """
|
|
432
|
+
Open a vault file as one key.
|
|
433
|
+
|
|
434
|
+
The handle is lazy. Nothing is read, and no passphrase is stretched,
|
|
435
|
+
until a call needs the file.
|
|
436
|
+
"""
|
|
437
|
+
def openvault(options) do
|
|
438
|
+
opts = options || %{}
|
|
439
|
+
file = opts["file"]
|
|
440
|
+
passphrase = opts["passphrase"]
|
|
441
|
+
|
|
442
|
+
if not is_binary(file) or file == "", do: fail("a vault needs a file")
|
|
443
|
+
if not is_binary(passphrase) or passphrase == "", do: fail("a vault needs a passphrase")
|
|
444
|
+
|
|
445
|
+
keyid = checkid(wantkey(opts["key"]), "a vault needs a key id")
|
|
446
|
+
|
|
447
|
+
{:ok, agent} = Agent.start_link(fn -> nil end)
|
|
448
|
+
|
|
449
|
+
%{
|
|
450
|
+
file: file,
|
|
451
|
+
key: keyid,
|
|
452
|
+
passphrase: passphrase,
|
|
453
|
+
iterations: opts["iterations"] || iterations(),
|
|
454
|
+
create: opts["create"] == true,
|
|
455
|
+
agent: agent
|
|
456
|
+
}
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
@doc """
|
|
460
|
+
Make a vault file and return a handle on its master key.
|
|
461
|
+
|
|
462
|
+
Refuses a file that is already there: a vault is created once, and
|
|
463
|
+
overwriting one discards every secret in it.
|
|
464
|
+
"""
|
|
465
|
+
def createvault(options) do
|
|
466
|
+
opts = options || %{}
|
|
467
|
+
file = opts["file"]
|
|
468
|
+
passphrase = opts["passphrase"]
|
|
469
|
+
|
|
470
|
+
if not is_binary(file) or file == "", do: fail("a vault needs a file")
|
|
471
|
+
if not is_binary(passphrase) or passphrase == "", do: fail("a vault needs a passphrase")
|
|
472
|
+
|
|
473
|
+
keyid = checkid(wantkey(opts["key"]), "a vault needs a key id")
|
|
474
|
+
|
|
475
|
+
# No existence check first: the check and the write would be two
|
|
476
|
+
# steps, and `putnew` refuses an existing file in ONE.
|
|
477
|
+
putnew(file, newvault(keyid, passphrase, opts["iterations"] || iterations()))
|
|
478
|
+
|
|
479
|
+
openvault(opts)
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
@doc "The file this handle reads."
|
|
483
|
+
def file(vault), do: vault.file
|
|
484
|
+
|
|
485
|
+
@doc "The key id this handle opens with."
|
|
486
|
+
def key(vault), do: vault.key
|
|
487
|
+
|
|
488
|
+
@doc """
|
|
489
|
+
Derive the key and read the file NOW rather than at first use.
|
|
490
|
+
|
|
491
|
+
A COPY, so that what a caller is handed cannot become what this vault
|
|
492
|
+
believes: `open(v) |> Map.put("write", true)` changes a map nobody reads.
|
|
493
|
+
"""
|
|
494
|
+
def open(vault) do
|
|
495
|
+
{_file, opened} = load(vault)
|
|
496
|
+
|
|
497
|
+
%{
|
|
498
|
+
"key" => opened["info"]["key"],
|
|
499
|
+
"master" => opened["info"]["master"],
|
|
500
|
+
"write" => opened["info"]["write"],
|
|
501
|
+
"grants" => opened["info"]["grants"]
|
|
502
|
+
}
|
|
503
|
+
end
|
|
504
|
+
|
|
505
|
+
@doc "Forget the derived keys. The next call opens again."
|
|
506
|
+
def close(vault) do
|
|
507
|
+
Agent.update(vault.agent, fn _ -> nil end)
|
|
508
|
+
:ok
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
@doc "The names this key can read, sorted."
|
|
512
|
+
def list(vault) do
|
|
513
|
+
{file, opened} = load(vault)
|
|
514
|
+
|
|
515
|
+
if opened["root"] do
|
|
516
|
+
namekey = hmac(opened["root"], @label_names)
|
|
517
|
+
|
|
518
|
+
file["entries"]
|
|
519
|
+
|> Enum.map(&unseal(namekey, &1["name"], @aad_name, "a secret name is damaged"))
|
|
520
|
+
|> Enum.sort()
|
|
521
|
+
else
|
|
522
|
+
# A restricted key has no name key, so it reports the grants it can
|
|
523
|
+
# actually find: the vault never tells it what else is in there.
|
|
524
|
+
opened["info"]["grants"]
|
|
525
|
+
|> Enum.filter(&(nil != findentry(file, opened["grants"][&1])))
|
|
526
|
+
|> Enum.sort()
|
|
527
|
+
end
|
|
528
|
+
end
|
|
529
|
+
|
|
530
|
+
@doc "Does this key hold a value for `name`?"
|
|
531
|
+
def has?(vault, name), do: nil != get(vault, name)
|
|
532
|
+
|
|
533
|
+
@doc """
|
|
534
|
+
The value, or nil when the vault does not hold that name or this key was
|
|
535
|
+
not granted it.
|
|
536
|
+
"""
|
|
537
|
+
def get(vault, name) do
|
|
538
|
+
Sekreto.checkname(name)
|
|
539
|
+
{file, opened} = load(vault)
|
|
540
|
+
|
|
541
|
+
case keyfor(opened, name) do
|
|
542
|
+
# OUTSIDE THE GRANT IS A MISS, deliberately. The vault answers as the
|
|
543
|
+
# key that opened it, so a name this key cannot read is a name this
|
|
544
|
+
# store does not hold for this caller.
|
|
545
|
+
nil ->
|
|
546
|
+
nil
|
|
547
|
+
|
|
548
|
+
key ->
|
|
549
|
+
case findentry(file, key) do
|
|
550
|
+
nil ->
|
|
551
|
+
nil
|
|
552
|
+
|
|
553
|
+
entry ->
|
|
554
|
+
unseal(key, entry["value"], @aad_secret <> name,
|
|
555
|
+
"the value of " <> name <> " is damaged")
|
|
556
|
+
end
|
|
557
|
+
end
|
|
558
|
+
end
|
|
559
|
+
|
|
560
|
+
@doc """
|
|
561
|
+
Write a value. A master writes any name; a restricted key holding
|
|
562
|
+
`write` overwrites the names it was granted, and creates none.
|
|
563
|
+
"""
|
|
564
|
+
def set(vault, name, value) do
|
|
565
|
+
# Every write on this file, from any handle in this process,
|
|
566
|
+
# serializes here; see locked.
|
|
567
|
+
locked(vault.file, fn ->
|
|
568
|
+
Sekreto.checkname(name)
|
|
569
|
+
if not is_binary(value), do: fail("a secret value must be text: " <> name)
|
|
570
|
+
|
|
571
|
+
{file, opened} = load(vault)
|
|
572
|
+
|
|
573
|
+
if not opened["info"]["write"] do
|
|
574
|
+
fail("key " <> opened["info"]["key"] <> " is read-only")
|
|
575
|
+
end
|
|
576
|
+
|
|
577
|
+
key = keyfor(opened, name)
|
|
578
|
+
|
|
579
|
+
if nil == key do
|
|
580
|
+
fail("key " <> opened["info"]["key"] <> " was not granted " <> name)
|
|
581
|
+
end
|
|
582
|
+
|
|
583
|
+
sealedvalue = seal(key, value, @aad_secret <> name)
|
|
584
|
+
id = entryid(key)
|
|
585
|
+
|
|
586
|
+
entries =
|
|
587
|
+
if Enum.any?(file["entries"], &(&1["id"] == id)) do
|
|
588
|
+
Enum.map(file["entries"], fn entry ->
|
|
589
|
+
if entry["id"] == id, do: Map.put(entry, "value", sealedvalue), else: entry
|
|
590
|
+
end)
|
|
591
|
+
else
|
|
592
|
+
# A NEW NAME NEEDS THE NAME KEY, which only a master holds. So a
|
|
593
|
+
# restricted key with `write` updates what it was granted and
|
|
594
|
+
# cannot grow the vault.
|
|
595
|
+
root = rootof(opened, "creating the secret " <> name)
|
|
596
|
+
|
|
597
|
+
file["entries"] ++
|
|
598
|
+
[
|
|
599
|
+
%{
|
|
600
|
+
"id" => id,
|
|
601
|
+
"name" => seal(hmac(root, @label_names), name, @aad_name),
|
|
602
|
+
"value" => sealedvalue
|
|
603
|
+
}
|
|
604
|
+
]
|
|
605
|
+
end
|
|
606
|
+
|
|
607
|
+
save(vault, Map.put(file, "entries", entries))
|
|
608
|
+
end)
|
|
609
|
+
end
|
|
610
|
+
|
|
611
|
+
@doc "Drop a name. Master only."
|
|
612
|
+
def remove(vault, name) do
|
|
613
|
+
# Every write on this file, from any handle in this process,
|
|
614
|
+
# serializes here; see locked.
|
|
615
|
+
locked(vault.file, fn ->
|
|
616
|
+
Sekreto.checkname(name)
|
|
617
|
+
{file, opened} = load(vault)
|
|
618
|
+
root = rootof(opened, "removing a secret")
|
|
619
|
+
|
|
620
|
+
wanted = entryid(secretkey(root, name))
|
|
621
|
+
|
|
622
|
+
if not Enum.any?(file["entries"], &(&1["id"] == wanted)) do
|
|
623
|
+
fail("no such secret: " <> name)
|
|
624
|
+
end
|
|
625
|
+
|
|
626
|
+
save(vault, Map.put(file, "entries", Enum.reject(file["entries"], &(&1["id"] == wanted))))
|
|
627
|
+
end)
|
|
628
|
+
end
|
|
629
|
+
|
|
630
|
+
@doc "Every key in the file, with what it may do. Master only."
|
|
631
|
+
def keys(vault) do
|
|
632
|
+
{file, opened} = load(vault)
|
|
633
|
+
rootof(opened, "listing the keys")
|
|
634
|
+
|
|
635
|
+
Enum.map(file["keys"], fn record ->
|
|
636
|
+
case metaof(opened, record) do
|
|
637
|
+
nil ->
|
|
638
|
+
%{"key" => record["id"], "master" => false, "write" => false, "grants" => []}
|
|
639
|
+
|
|
640
|
+
meta ->
|
|
641
|
+
%{
|
|
642
|
+
"key" => record["id"],
|
|
643
|
+
"master" => meta["master"] == true,
|
|
644
|
+
"write" => meta["write"] == true,
|
|
645
|
+
"grants" => Enum.sort(meta["grants"] || [])
|
|
646
|
+
}
|
|
647
|
+
end
|
|
648
|
+
end)
|
|
649
|
+
end
|
|
650
|
+
|
|
651
|
+
@doc "Mint a restricted key. Master only."
|
|
652
|
+
def grant(vault, spec) do
|
|
653
|
+
# Every write on this file, from any handle in this process,
|
|
654
|
+
# serializes here; see locked.
|
|
655
|
+
locked(vault.file, fn ->
|
|
656
|
+
{file, opened} = load(vault)
|
|
657
|
+
root = rootof(opened, "granting a key")
|
|
658
|
+
|
|
659
|
+
want = spec || %{}
|
|
660
|
+
id = checkid(want["key"], "a grant needs a key id")
|
|
661
|
+
phrase = want["passphrase"]
|
|
662
|
+
|
|
663
|
+
if not is_binary(phrase) or phrase == "", do: fail("a grant needs a passphrase")
|
|
664
|
+
if Enum.any?(file["keys"], &(&1["id"] == id)), do: fail("key already exists: " <> id)
|
|
665
|
+
|
|
666
|
+
names = Enum.sort(want["names"] || [])
|
|
667
|
+
|
|
668
|
+
grants =
|
|
669
|
+
Enum.reduce(names, %{}, fn name, out ->
|
|
670
|
+
Sekreto.checkname(name)
|
|
671
|
+
Map.put(out, name, b64(secretkey(root, name)))
|
|
672
|
+
end)
|
|
673
|
+
|
|
674
|
+
write = want["write"] == true
|
|
675
|
+
|
|
676
|
+
record =
|
|
677
|
+
sealkey(root, id, phrase, want["iterations"] || vault.iterations,
|
|
678
|
+
%{"v" => @format, "write" => write, "grants" => grants},
|
|
679
|
+
%{"v" => @format, "master" => false, "write" => write, "grants" => names})
|
|
680
|
+
|
|
681
|
+
save(vault, Map.put(file, "keys", file["keys"] ++ [record]))
|
|
682
|
+
end)
|
|
683
|
+
end
|
|
684
|
+
|
|
685
|
+
@doc """
|
|
686
|
+
Drop a key. Master only.
|
|
687
|
+
|
|
688
|
+
Anyone who already copied the file keeps whatever that key could read,
|
|
689
|
+
so revoking bars future reads of the LIVE file and `rotate` is what
|
|
690
|
+
takes a secret back.
|
|
691
|
+
"""
|
|
692
|
+
def revoke(vault, key) do
|
|
693
|
+
# Every write on this file, from any handle in this process,
|
|
694
|
+
# serializes here; see locked.
|
|
695
|
+
locked(vault.file, fn ->
|
|
696
|
+
{file, opened} = load(vault)
|
|
697
|
+
rootof(opened, "revoking a key")
|
|
698
|
+
|
|
699
|
+
if key == opened["info"]["key"], do: fail("a key cannot revoke itself: " <> key)
|
|
700
|
+
if not Enum.any?(file["keys"], &(&1["id"] == key)), do: fail("no such key: " <> key)
|
|
701
|
+
|
|
702
|
+
save(vault, Map.put(file, "keys", Enum.reject(file["keys"], &(&1["id"] == key))))
|
|
703
|
+
end)
|
|
704
|
+
end
|
|
705
|
+
|
|
706
|
+
@doc """
|
|
707
|
+
A new root key, every value re-encrypted under it, and EVERY OTHER KEY
|
|
708
|
+
DROPPED. Master only.
|
|
709
|
+
|
|
710
|
+
The other keys go because they must: their rings are sealed under
|
|
711
|
+
passphrases this process does not have. Re-grant afterwards.
|
|
712
|
+
"""
|
|
713
|
+
def rotate(vault) do
|
|
714
|
+
# Every write on this file, from any handle in this process,
|
|
715
|
+
# serializes here; see locked.
|
|
716
|
+
locked(vault.file, fn ->
|
|
717
|
+
{file, opened} = load(vault)
|
|
718
|
+
rootof(opened, "rotating the vault")
|
|
719
|
+
|
|
720
|
+
# Read everything out under the old root before anything changes: once
|
|
721
|
+
# the root is replaced the old derived keys are unreachable.
|
|
722
|
+
plain = Enum.map(list(vault), fn name -> {name, get(vault, name)} end)
|
|
723
|
+
|
|
724
|
+
root = random(@keylen)
|
|
725
|
+
namekey = hmac(root, @label_names)
|
|
726
|
+
|
|
727
|
+
entries =
|
|
728
|
+
Enum.map(plain, fn {name, value} ->
|
|
729
|
+
key = secretkey(root, name)
|
|
730
|
+
|
|
731
|
+
%{
|
|
732
|
+
"id" => entryid(key),
|
|
733
|
+
"name" => seal(namekey, name, @aad_name),
|
|
734
|
+
"value" => seal(key, value, @aad_secret <> name)
|
|
735
|
+
}
|
|
736
|
+
end)
|
|
737
|
+
|
|
738
|
+
iters =
|
|
739
|
+
case Enum.find(file["keys"], &(&1["id"] == vault.key)) do
|
|
740
|
+
nil -> vault.iterations
|
|
741
|
+
record -> record["iters"]
|
|
742
|
+
end
|
|
743
|
+
|
|
744
|
+
fresh =
|
|
745
|
+
sealkey(root, vault.key, vault.passphrase, iters,
|
|
746
|
+
%{"v" => @format, "write" => true, "root" => b64(root)},
|
|
747
|
+
%{"v" => @format, "master" => true, "write" => true, "grants" => []})
|
|
748
|
+
|
|
749
|
+
# SAVE FIRST, adopt second. A handle holding the new root over a file
|
|
750
|
+
# that still holds the old one reads nothing and says the vault is
|
|
751
|
+
# damaged.
|
|
752
|
+
:ok = write(vault, %{"keys" => [fresh], "entries" => entries})
|
|
753
|
+
|
|
754
|
+
Agent.update(vault.agent, fn _ ->
|
|
755
|
+
%{
|
|
756
|
+
"info" => %{
|
|
757
|
+
"key" => vault.key,
|
|
758
|
+
"master" => true,
|
|
759
|
+
"write" => true,
|
|
760
|
+
"grants" => []
|
|
761
|
+
},
|
|
762
|
+
"root" => root,
|
|
763
|
+
"grants" => %{},
|
|
764
|
+
"ring" => fresh["ring"]
|
|
765
|
+
}
|
|
766
|
+
end)
|
|
767
|
+
|
|
768
|
+
:ok
|
|
769
|
+
end)
|
|
770
|
+
end
|
|
771
|
+
|
|
772
|
+
# --- the inside ------------------------------------------------------
|
|
773
|
+
|
|
774
|
+
defp bytes(vault) do
|
|
775
|
+
case File.read(vault.file) do
|
|
776
|
+
{:ok, raw} ->
|
|
777
|
+
raw
|
|
778
|
+
|
|
779
|
+
{:error, :enoent} ->
|
|
780
|
+
# A vault is configured deliberately, with a key. Its absence is a
|
|
781
|
+
# broken deployment and never "no secrets here": answering a miss
|
|
782
|
+
# would send the chain on to a weaker store.
|
|
783
|
+
if not vault.create, do: fail("no vault file: " <> vault.file)
|
|
784
|
+
|
|
785
|
+
putnew(vault.file, newvault(vault.key, vault.passphrase, vault.iterations))
|
|
786
|
+
File.read!(vault.file)
|
|
787
|
+
|
|
788
|
+
{:error, why} ->
|
|
789
|
+
fail("cannot read " <> vault.file <> ": " <> to_string(:file.format_error(why)))
|
|
790
|
+
end
|
|
791
|
+
end
|
|
792
|
+
|
|
793
|
+
defp load(vault) do
|
|
794
|
+
file = readfile(bytes(vault))
|
|
795
|
+
record = Enum.find(file["keys"], &(&1["id"] == vault.key))
|
|
796
|
+
|
|
797
|
+
if nil == record do
|
|
798
|
+
# REVOKED, or never there. Either way this handle is finished, and
|
|
799
|
+
# dropping what it derived is what stops the next call answering from
|
|
800
|
+
# memory.
|
|
801
|
+
Agent.update(vault.agent, fn _ -> nil end)
|
|
802
|
+
fail("no such key: " <> vault.key)
|
|
803
|
+
end
|
|
804
|
+
|
|
805
|
+
held = Agent.get(vault.agent, & &1)
|
|
806
|
+
|
|
807
|
+
# The file still holds this key, and holds the SAME ring: a key revoked
|
|
808
|
+
# and re-granted under another passphrase is a different key wearing
|
|
809
|
+
# the id, and re-deriving is what refuses it.
|
|
810
|
+
if held && held["ring"] == record["ring"] do
|
|
811
|
+
{file, held}
|
|
812
|
+
else
|
|
813
|
+
Agent.update(vault.agent, fn _ -> nil end)
|
|
814
|
+
|
|
815
|
+
plain =
|
|
816
|
+
unseal(
|
|
817
|
+
kek(vault.passphrase, record["salt"], record["iters"]),
|
|
818
|
+
record["ring"],
|
|
819
|
+
@aad_ring <> vault.key,
|
|
820
|
+
"wrong passphrase for key " <> vault.key <> ", or a damaged vault"
|
|
821
|
+
)
|
|
822
|
+
|
|
823
|
+
ring = jsonof(plain, "key ring for " <> vault.key)
|
|
824
|
+
|
|
825
|
+
grants =
|
|
826
|
+
Enum.reduce(ring["grants"] || %{}, %{}, fn {name, key}, out ->
|
|
827
|
+
Map.put(out, name, unb64(key, "a granted key"))
|
|
828
|
+
end)
|
|
829
|
+
|
|
830
|
+
root = ring["root"]
|
|
831
|
+
|
|
832
|
+
opened = %{
|
|
833
|
+
"info" => %{
|
|
834
|
+
"key" => vault.key,
|
|
835
|
+
"master" => nil != root,
|
|
836
|
+
"write" => nil != root or ring["write"] == true,
|
|
837
|
+
"grants" => Enum.sort(Map.keys(grants))
|
|
838
|
+
},
|
|
839
|
+
"root" => if(nil == root, do: nil, else: unb64(root, "the root key")),
|
|
840
|
+
"grants" => grants,
|
|
841
|
+
"ring" => record["ring"]
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
Agent.update(vault.agent, fn _ -> opened end)
|
|
845
|
+
{file, opened}
|
|
846
|
+
end
|
|
847
|
+
end
|
|
848
|
+
|
|
849
|
+
defp rootof(opened, what) do
|
|
850
|
+
if nil == opened["root"] do
|
|
851
|
+
fail(what <> " needs a master key, and " <> opened["info"]["key"] <> " is restricted")
|
|
852
|
+
end
|
|
853
|
+
|
|
854
|
+
opened["root"]
|
|
855
|
+
end
|
|
856
|
+
|
|
857
|
+
# The key for one name, or nil when this key cannot reach it.
|
|
858
|
+
defp keyfor(opened, name) do
|
|
859
|
+
if opened["root"] do
|
|
860
|
+
secretkey(opened["root"], name)
|
|
861
|
+
else
|
|
862
|
+
opened["grants"][name]
|
|
863
|
+
end
|
|
864
|
+
end
|
|
865
|
+
|
|
866
|
+
defp findentry(_file, nil), do: nil
|
|
867
|
+
|
|
868
|
+
defp findentry(file, key) do
|
|
869
|
+
id = entryid(key)
|
|
870
|
+
Enum.find(file["entries"], &(&1["id"] == id))
|
|
871
|
+
end
|
|
872
|
+
|
|
873
|
+
defp metaof(opened, record) do
|
|
874
|
+
root = rootof(opened, "reading key metadata")
|
|
875
|
+
what = "metadata for key " <> record["id"]
|
|
876
|
+
|
|
877
|
+
jsonof(
|
|
878
|
+
unseal(hmac(root, @label_meta), record["meta"], @aad_meta <> record["id"], what),
|
|
879
|
+
what
|
|
880
|
+
)
|
|
881
|
+
rescue
|
|
882
|
+
# A record written under a root key this one has replaced. The key is
|
|
883
|
+
# still in the file and still opens with its own passphrase, so it is
|
|
884
|
+
# reported rather than hidden - with what it can do unknown.
|
|
885
|
+
Error -> nil
|
|
886
|
+
end
|
|
887
|
+
|
|
888
|
+
defp sealkey(root, id, phrase, iters, ring, meta) do
|
|
889
|
+
salt = random(@saltlen)
|
|
890
|
+
|
|
891
|
+
%{
|
|
892
|
+
"id" => id,
|
|
893
|
+
"salt" => salt,
|
|
894
|
+
"iters" => iters,
|
|
895
|
+
"ring" => seal(kek(phrase, salt, iters), stringify(ring), @aad_ring <> id),
|
|
896
|
+
"meta" => seal(hmac(root, @label_meta), stringify(meta), @aad_meta <> id)
|
|
897
|
+
}
|
|
898
|
+
end
|
|
899
|
+
|
|
900
|
+
defp save(vault, file) do
|
|
901
|
+
:ok = write(vault, file)
|
|
902
|
+
# The next call re-reads and re-checks the ring, which is what makes a
|
|
903
|
+
# revoked key stop answering.
|
|
904
|
+
:ok
|
|
905
|
+
end
|
|
906
|
+
|
|
907
|
+
# Read, change, and REPLACE - never edit in place.
|
|
908
|
+
#
|
|
909
|
+
# THE TEMPORARY IS RANDOM AND EXCLUSIVE. `<vault>.<pid>.tmp` is a name
|
|
910
|
+
# anyone can predict, so anyone who can write the vault's directory could
|
|
911
|
+
# put a symlink there and have the next save truncate whatever it pointed
|
|
912
|
+
# at.
|
|
913
|
+
defp write(vault, file) do
|
|
914
|
+
temp = vault.file <> "." <> Base.encode16(random(8), case: :lower) <> ".tmp"
|
|
915
|
+
|
|
916
|
+
case File.open(temp, [:write, :binary, :exclusive]) do
|
|
917
|
+
{:ok, handle} ->
|
|
918
|
+
IO.binwrite(handle, writefile(file))
|
|
919
|
+
File.close(handle)
|
|
920
|
+
File.chmod(temp, 0o600)
|
|
921
|
+
|
|
922
|
+
case File.rename(temp, vault.file) do
|
|
923
|
+
:ok ->
|
|
924
|
+
:ok
|
|
925
|
+
|
|
926
|
+
{:error, why} ->
|
|
927
|
+
File.rm(temp)
|
|
928
|
+
fail("cannot write " <> vault.file <> ": " <> to_string(:file.format_error(why)))
|
|
929
|
+
end
|
|
930
|
+
|
|
931
|
+
{:error, why} ->
|
|
932
|
+
fail("cannot write " <> vault.file <> ": " <> to_string(:file.format_error(why)))
|
|
933
|
+
end
|
|
934
|
+
end
|
|
935
|
+
|
|
936
|
+
# --- the provider ----------------------------------------------------
|
|
937
|
+
|
|
938
|
+
@doc """
|
|
939
|
+
Read a vault as one store in a chain.
|
|
940
|
+
|
|
941
|
+
The provider is the READ half and nothing more: a chain resolves
|
|
942
|
+
secrets, and writing one is a deliberate act with an API of its own.
|
|
943
|
+
"""
|
|
944
|
+
def providerof(vault) do
|
|
945
|
+
%{
|
|
946
|
+
lookup: fn name -> get(vault, name) end,
|
|
947
|
+
describe: fn -> "minivault:" <> vault.file end
|
|
948
|
+
}
|
|
949
|
+
end
|
|
950
|
+
|
|
951
|
+
@doc "A vault provider from options, for a chain built by hand."
|
|
952
|
+
def minivaultprovider(options), do: providerof(openvault(options))
|
|
953
|
+
|
|
954
|
+
# The options arrive as a `ProviderSpec` STRUCT here, not as a map: this
|
|
955
|
+
# port types the chain rather than passing dictionaries around, so a
|
|
956
|
+
# field is read by name and a typo does not compile.
|
|
957
|
+
defp vaultoptions(%ProviderSpec{} = spec) do
|
|
958
|
+
%{
|
|
959
|
+
"file" => blankor(spec.file, ""),
|
|
960
|
+
"key" => blankor(spec.vaultkey, nil),
|
|
961
|
+
"passphrase" => blankor(spec.passphrase, ""),
|
|
962
|
+
"iterations" => spec.iterations,
|
|
963
|
+
"create" => spec.create == true
|
|
964
|
+
}
|
|
965
|
+
end
|
|
966
|
+
|
|
967
|
+
defp blankor(value, fallback) do
|
|
968
|
+
if is_binary(value) and value != "", do: value, else: fallback
|
|
969
|
+
end
|
|
970
|
+
|
|
971
|
+
@doc """
|
|
972
|
+
The `minivault` provider kind, as a voxgig/plugin definition.
|
|
973
|
+
|
|
974
|
+
Written out rather than built by `providerplugin`, because this
|
|
975
|
+
definition publishes TWO exports: `provider`, the read half every kind
|
|
976
|
+
publishes, and `vault`, the programmatic API.
|
|
977
|
+
"""
|
|
978
|
+
def minivault do
|
|
979
|
+
%{
|
|
980
|
+
"name" => "minivault",
|
|
981
|
+
"define" => fn inst ->
|
|
982
|
+
options = vaultoptions(Inst.options(inst))
|
|
983
|
+
|
|
984
|
+
vault =
|
|
985
|
+
try do
|
|
986
|
+
# `openvault` refuses bad configuration HERE, so a mistyped
|
|
987
|
+
# chain fails at construction. Reaching the FILE is not
|
|
988
|
+
# configuration: the handle is lazy.
|
|
989
|
+
openvault(options)
|
|
990
|
+
rescue
|
|
991
|
+
err in Error ->
|
|
992
|
+
Types.fail(Providers.error_code(), Exception.message(err), %{
|
|
993
|
+
"ref" => Inst.ref(inst),
|
|
994
|
+
"cause" => Exception.message(err)
|
|
995
|
+
})
|
|
996
|
+
end
|
|
997
|
+
|
|
998
|
+
Inst.export(inst, Providers.provider_export(), providerof(vault))
|
|
999
|
+
Inst.export(inst, vault_export(), vault)
|
|
1000
|
+
end
|
|
1001
|
+
}
|
|
1002
|
+
end
|
|
1003
|
+
|
|
1004
|
+
@doc """
|
|
1005
|
+
The vault behind a store in a chain, as its programmatic API.
|
|
1006
|
+
|
|
1007
|
+
With no store named, the unqualified alias answers: one vault in the
|
|
1008
|
+
chain resolves whatever it is called, and two raise rather than picking
|
|
1009
|
+
one.
|
|
1010
|
+
"""
|
|
1011
|
+
def vaultof(secrets), do: vaultof(secrets, nil)
|
|
1012
|
+
|
|
1013
|
+
def vaultof(secrets, nil) do
|
|
1014
|
+
case Host.exports(secrets.host, "minivault/" <> vault_export()) do
|
|
1015
|
+
nil -> fail("no minivault store in this chain")
|
|
1016
|
+
found -> found
|
|
1017
|
+
end
|
|
1018
|
+
end
|
|
1019
|
+
|
|
1020
|
+
def vaultof(secrets, store) do
|
|
1021
|
+
# A NAMED STORE MUST EXIST, and the alias must not stand in for it.
|
|
1022
|
+
# `host.exports` falls back to the alias when the exact ref misses, so
|
|
1023
|
+
# asking for `minivault` in a chain whose only vault is named `app`
|
|
1024
|
+
# used to hand back the `app` vault - and then write to it.
|
|
1025
|
+
ref = if store == "minivault", do: "minivault", else: "minivault$" <> store
|
|
1026
|
+
|
|
1027
|
+
if nil == Host.instance(secrets.host, ref) do
|
|
1028
|
+
fail("no minivault store named " <> store <> " in this chain")
|
|
1029
|
+
end
|
|
1030
|
+
|
|
1031
|
+
Host.exports(secrets.host, ref <> "/" <> vault_export())
|
|
1032
|
+
end
|
|
1033
|
+
end
|