@voxgig/sdkgen 4.10.0 → 4.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/voxgig-sdkgen +1 -1
- package/package.json +1 -1
- package/project/.sdk/model/feature/secrets.aon +330 -0
- package/project/.sdk/model/target/c.aon +15 -2
- package/project/.sdk/model/target/cpp.aon +18 -0
- package/project/.sdk/model/target/lua.aon +17 -0
- package/project/.sdk/model/target/ocaml.aon +48 -5
- package/project/.sdk/model/target/zig.aon +30 -4
- package/project/.sdk/src/cmp/c/Config_c.ts +338 -1
- package/project/.sdk/src/cmp/c/Main_c.ts +57 -2
- package/project/.sdk/src/cmp/c/Package_c.ts +12 -2
- package/project/.sdk/src/cmp/cpp/Config_cpp.ts +324 -2
- package/project/.sdk/src/cmp/cpp/Gitignore_cpp.ts +2 -0
- package/project/.sdk/src/cmp/cpp/Main_cpp.ts +62 -4
- package/project/.sdk/src/cmp/cpp/Package_cpp.ts +10 -0
- package/project/.sdk/src/cmp/lua/Config_lua.ts +88 -0
- package/project/.sdk/src/cmp/lua/Gitignore_lua.ts +4 -0
- package/project/.sdk/src/cmp/lua/Main_lua.ts +93 -3
- package/project/.sdk/src/cmp/lua/Package_lua.ts +60 -0
- package/project/.sdk/src/cmp/lua/fragment/Main.fragment.lua +10 -0
- package/project/.sdk/src/cmp/ocaml/Config_ocaml.ts +183 -5
- package/project/.sdk/src/cmp/ocaml/Main_ocaml.ts +160 -3
- package/project/.sdk/src/cmp/ocaml/Package_ocaml.ts +25 -1
- package/project/.sdk/src/cmp/zig/Config_zig.ts +130 -9
- package/project/.sdk/src/cmp/zig/Main_zig.ts +208 -4
- package/project/.sdk/{tm/zig/build.zig → src/cmp/zig/fragment/Build.fragment.zig} +7 -0
- package/project/.sdk/src/cmp/zig/fragment/Main.fragment.zig +25 -0
- package/project/.sdk/{tm/zig/root.zig → src/cmp/zig/fragment/Root.fragment.zig} +9 -0
- package/project/.sdk/tm/c/Makefile +58 -9
- package/project/.sdk/tm/c/core/sdk.h +10 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/capability.c +133 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/capability.h +39 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/catalog.c +83 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/catalog.h +48 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/config.c +413 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/config.h +24 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/depend.c +264 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/depend.h +29 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/env.c +220 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/env.h +19 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/export.c +97 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/export.h +19 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/graph.c +237 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/graph.h +17 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/host.c +1494 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/host.h +135 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/order.c +288 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/order.h +18 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/point.c +141 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/point.h +80 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/ref.c +170 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/ref.h +52 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/resolve.c +98 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/resolve.h +18 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/types.c +150 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/types.h +104 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/value.c +649 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/value.h +135 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/version.c +151 -0
- package/project/.sdk/tm/c/feature/secrets/plugin/version.h +34 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/aws.c +281 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/azuresecrets.c +207 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/boru.c +164 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/clock.c +75 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/doppler.c +141 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/encode.c +144 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/gcpsecrets.c +177 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/hashicorp.c +239 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/httpjson.c +599 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/infisical.c +165 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/onepassword.c +194 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/proc.c +233 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/secretspec.c +125 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/sekretoplugins.h +125 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/sha256.c +270 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/sigv4.c +382 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/support.h +153 -0
- package/project/.sdk/tm/c/feature/secrets/plugins/tls.c +420 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/internal.h +86 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/json.c +721 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/providers.c +813 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.c +944 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/sekreto.h +490 -0
- package/project/.sdk/tm/c/feature/secrets/sekreto/util.c +442 -0
- package/project/.sdk/tm/c/feature/secrets.c +797 -0
- package/project/.sdk/tm/c/feature/secrets.h +46 -0
- package/project/.sdk/tm/c/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/c/tests/feature/secrets/secrets_test.c +802 -0
- package/project/.sdk/tm/clojure/feature/secrets/sdk/feature/secrets.clj +38 -11
- package/project/.sdk/tm/clojure/test/sdk/test/feature/secrets.clj +40 -6
- package/project/.sdk/tm/cpp/Makefile +48 -4
- package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.cpp +121 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/capability.hpp +41 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.cpp +60 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/catalog.hpp +66 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/config.cpp +376 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/config.hpp +29 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.cpp +230 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/depend.hpp +31 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/env.cpp +205 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/env.hpp +25 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/export.cpp +84 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/export.hpp +24 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.cpp +222 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/graph.hpp +21 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/host.cpp +1200 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/host.hpp +250 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/order.cpp +250 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/order.hpp +22 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/point.cpp +110 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/point.hpp +79 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.cpp +136 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/ref.hpp +60 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.cpp +82 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/resolve.hpp +25 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/types.cpp +90 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/types.hpp +65 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/value.cpp +491 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/value.hpp +120 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/version.cpp +143 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugin/version.hpp +36 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.cpp +248 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Aws.hpp +30 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.cpp +149 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Azuresecrets.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.cpp +117 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Boru.hpp +27 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.cpp +180 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Crypto.hpp +52 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.cpp +87 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Doppler.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.cpp +121 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Gcpsecrets.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.cpp +153 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Hashicorp.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.cpp +666 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Httpjson.hpp +160 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.cpp +123 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Infisical.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.cpp +125 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Onepassword.hpp +23 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.cpp +223 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Proc.hpp +47 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.cpp +104 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Secretspec.hpp +27 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.cpp +242 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Sigv4.hpp +58 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.cpp +260 -0
- package/project/.sdk/tm/cpp/feature/secrets/plugins/Tls.hpp +47 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.cpp +476 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Json.hpp +89 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.cpp +312 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Provider.hpp +263 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.cpp +354 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Providers.hpp +111 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.cpp +613 -0
- package/project/.sdk/tm/cpp/feature/secrets/sekreto/Sekreto.hpp +227 -0
- package/project/.sdk/tm/cpp/feature/secrets.hpp +745 -0
- package/project/.sdk/tm/cpp/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/cpp/test/feature/secrets/secrets_test.cpp +808 -0
- package/project/.sdk/tm/csharp/feature/SecretsFeature.cs +34 -8
- package/project/.sdk/tm/csharp/test/feature/secrets/SecretsFeatureTest.cs +85 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets.ex +17 -2
- package/project/.sdk/tm/elixir/test/feature/secrets/secrets_test.exs +41 -0
- package/project/.sdk/tm/go/feature/secrets_feature.go +32 -10
- package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +116 -0
- package/project/.sdk/tm/java/feature/SecretsFeature.java +33 -8
- package/project/.sdk/tm/java/test/feature/secrets/SecretsFeatureTest.java +64 -0
- package/project/.sdk/tm/js/src/feature/secrets/SecretsFeature.js +34 -11
- package/project/.sdk/tm/js/test/feature/secrets/Secrets.test.js +73 -0
- package/project/.sdk/tm/kotlin/feature/SecretsFeature.kt +32 -7
- package/project/.sdk/tm/kotlin/test/feature/secrets/SecretsTest.kt +69 -0
- package/project/.sdk/tm/lua/Makefile +15 -4
- package/project/.sdk/tm/lua/feature/secrets/native/sekretonet.c +806 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/capability.lua +135 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/catalog.lua +63 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/config.lua +361 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/depend.lua +232 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/env.lua +168 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/export.lua +66 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/graph.lua +194 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/host.lua +1190 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/json.lua +169 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/order.lua +207 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/point.lua +106 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/ref.lua +115 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/resolve.lua +78 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/types.lua +275 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin/version.lua +131 -0
- package/project/.sdk/tm/lua/feature/secrets/plugin.lua +76 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/addr.lua +124 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/err.lua +47 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/name.lua +315 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/aws.lua +228 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/azuresecrets.lua +137 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/boru.lua +124 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/crypto.lua +212 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/doppler.lua +89 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/gcpsecrets.lua +129 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/hashicorp.lua +154 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/httpjson.lua +248 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/infisical.lua +113 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/json.lua +449 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/net.lua +198 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/onepassword.lua +126 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/secretspec.lua +93 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/sigv4.lua +269 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/plugins/support.lua +146 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto/providers.lua +346 -0
- package/project/.sdk/tm/lua/feature/secrets/sekreto.lua +479 -0
- package/project/.sdk/tm/lua/feature/secrets_feature.lua +690 -0
- package/project/.sdk/tm/lua/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/lua/test/extend_test.lua +105 -0
- package/project/.sdk/tm/lua/test/feature/secrets/secrets_feature_test.lua +862 -0
- package/project/.sdk/tm/ocaml/Makefile +52 -8
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/capability.ml +106 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/catalog.ml +43 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/config.ml +349 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/defs.ml +143 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/depend.ml +217 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/env.ml +197 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/export.ml +89 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/graph.ml +227 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/host.ml +1112 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/order.ml +202 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/point.ml +138 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/ref.ml +126 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/resolve.ml +62 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/types.ml +97 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/value.ml +387 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugin/version.ml +139 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/aws.ml +171 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/azuresecrets.ml +116 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/boru.ml +95 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/crypto.ml +149 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/doppler.ml +61 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/gcpsecrets.ml +93 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/hashicorp.ml +120 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/http.ml +421 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/httpjson.ml +66 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/infisical.ml +85 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/onepassword.ml +112 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/runcmd.ml +97 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/secretspec.ml +68 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/sigv4.ml +259 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls.ml +44 -0
- package/project/.sdk/tm/ocaml/feature/secrets/plugins/tls_stubs.c +358 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/json.ml +376 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/provider.ml +647 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/secret.ml +299 -0
- package/project/.sdk/tm/ocaml/feature/secrets/sekreto/sekreto.ml +347 -0
- package/project/.sdk/tm/ocaml/feature/secrets_feature.ml +453 -0
- package/project/.sdk/tm/ocaml/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/ocaml/test/feature/secrets/t_secrets.ml +670 -0
- package/project/.sdk/tm/perl/feature/secrets_feature.pm +33 -12
- package/project/.sdk/tm/perl/t/feature/secrets/secrets.t +47 -0
- package/project/.sdk/tm/php/feature/SecretsFeature.php +30 -6
- package/project/.sdk/tm/php/test/feature/secrets/SecretsTest.php +98 -0
- package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +28 -6
- package/project/.sdk/tm/py/test/feature/secrets/test_secrets.py +114 -0
- package/project/.sdk/tm/rb/feature/secrets_feature.rb +28 -6
- package/project/.sdk/tm/rb/test/feature/secrets/secrets_feature_test.rb +93 -0
- package/project/.sdk/tm/rust/feature/secrets.rs +33 -10
- package/project/.sdk/tm/rust/tests/feature/secrets/main.rs +96 -0
- package/project/.sdk/tm/scala/feature/SecretsFeature.scala +29 -7
- package/project/.sdk/tm/scala/sdktest/feature/secrets/SecretsTestMain.scala +71 -0
- package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +35 -12
- package/project/.sdk/tm/ts/test/feature/secrets/Secrets.test.ts +73 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/capability.zig +137 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/catalog.zig +90 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/config.zig +346 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/depend.zig +244 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/env.zig +201 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/export.zig +83 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/graph.zig +212 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/host.zig +1224 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/inst.zig +126 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/order.zig +228 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/plugin.zig +34 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/point.zig +166 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/ref.zig +147 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/resolve.zig +74 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/types.zig +140 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/value.zig +662 -0
- package/project/.sdk/tm/zig/feature/secrets/plugin/version.zig +139 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/aws.zig +294 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/azuresecrets.zig +222 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/boru.zig +188 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/doppler.zig +135 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/gcpsecrets.zig +170 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/hashicorp.zig +242 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/httpjson.zig +535 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/infisical.zig +167 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/onepassword.zig +202 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/secretspec.zig +160 -0
- package/project/.sdk/tm/zig/feature/secrets/plugins/sigv4.zig +336 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/addr.zig +148 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/builtins.zig +259 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/provider.zig +440 -0
- package/project/.sdk/tm/zig/feature/secrets/sekreto/sekreto.zig +944 -0
- package/project/.sdk/tm/zig/feature/secrets.zig +854 -0
- package/project/.sdk/tm/zig/src/feature/secrets/.gitkeep +0 -0
- package/project/.sdk/tm/zig/test/feature/secrets/secrets_test.zig +891 -0
- package/project/sdkgen-package.json +1 -1
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
// VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (zig/plugins/boru.zig)
|
|
2
|
+
// Source: https://github.com/voxgig/sekreto @ 1267ee2e5f49566bc92695bc9eb3a60ef4924998 [tag: sdk-20260908-1556-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
//! A boru vault (https://github.com/boru-lang/boru) - a sekreto plugin.
|
|
5
|
+
//!
|
|
6
|
+
//! Spawns the boru CLI, or speaks its wire protocol over HTTPS; either
|
|
7
|
+
//! way it reaches outside the process, which is why it is a plugin.
|
|
8
|
+
|
|
9
|
+
const std = @import("std");
|
|
10
|
+
|
|
11
|
+
const sekreto = @import("sekreto");
|
|
12
|
+
const httpjson = @import("httpjson.zig");
|
|
13
|
+
|
|
14
|
+
const Allocator = std.mem.Allocator;
|
|
15
|
+
const Answer = sekreto.Answer;
|
|
16
|
+
const Found = sekreto.Found;
|
|
17
|
+
const Provider = sekreto.Provider;
|
|
18
|
+
const ProviderSpec = sekreto.ProviderSpec;
|
|
19
|
+
|
|
20
|
+
/// A boru vault (https://github.com/boru-lang/boru).
|
|
21
|
+
///
|
|
22
|
+
/// Two ways in, both boru's own.
|
|
23
|
+
///
|
|
24
|
+
/// With no `addr`, the CLI: `boru vault get --reveal <alias>` prints the
|
|
25
|
+
/// secret on stdout and nothing else. The passphrase is read by boru itself
|
|
26
|
+
/// from `BORU_VAULT_PASSPHRASE`; sekreto never accepts it as config and
|
|
27
|
+
/// never puts it on a command line, where it would show up in the process
|
|
28
|
+
/// table.
|
|
29
|
+
///
|
|
30
|
+
/// With an `addr`, boru's wire protocol: `boru vault serve` publishes a
|
|
31
|
+
/// read-only, HashiCorp-shaped provision API, authenticated by a capability
|
|
32
|
+
/// token from `boru vault grant`. A sekreto name is already a valid boru
|
|
33
|
+
/// alias, and boru aliases keep their dots, so `api.token` is the single
|
|
34
|
+
/// path segment `api.token` - not the `api`/`token` split a HashiCorp KV
|
|
35
|
+
/// gets. The value is the `value` field. A 404 is a miss; anything else the
|
|
36
|
+
/// server refuses (a revoked capability, a sealed vault) is an error.
|
|
37
|
+
///
|
|
38
|
+
/// boru's `vault proxy` and `vault mcp` remain out of bounds: they are a
|
|
39
|
+
/// credential *broker*, built precisely so the caller never receives the
|
|
40
|
+
/// credential. `vault serve` is the provision endpoint, built to hand the
|
|
41
|
+
/// value back - that is the one sekreto uses.
|
|
42
|
+
pub const BoruProvider = struct {
|
|
43
|
+
alloc: Allocator,
|
|
44
|
+
config: sekreto.Config,
|
|
45
|
+
command: []const u8,
|
|
46
|
+
namespace: []const u8,
|
|
47
|
+
home: []const u8,
|
|
48
|
+
addr: []const u8,
|
|
49
|
+
token: []const u8,
|
|
50
|
+
mount: []const u8,
|
|
51
|
+
|
|
52
|
+
pub fn lookup(self: *BoruProvider, alloc: Allocator, name: []const u8) Allocator.Error!Found {
|
|
53
|
+
switch (try sekreto.checkname(alloc, name)) {
|
|
54
|
+
.err => |message| return .{ .err = message },
|
|
55
|
+
.ok => {},
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (0 != self.addr.len) {
|
|
59
|
+
return self.lookupwire(alloc, name);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return self.lookupcli(alloc, name);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
fn lookupwire(self: *BoruProvider, alloc: Allocator, name: []const u8) Allocator.Error!Found {
|
|
66
|
+
const addr = httpjson.trimslash(self.addr);
|
|
67
|
+
|
|
68
|
+
switch (try sekreto.checkaddr(alloc, addr)) {
|
|
69
|
+
.err => |message| return .{ .err = message },
|
|
70
|
+
.ok => {},
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const alias = if (0 != self.namespace.len)
|
|
74
|
+
try std.fmt.allocPrint(alloc, "{s}/{s}", .{ self.namespace, name })
|
|
75
|
+
else
|
|
76
|
+
name;
|
|
77
|
+
|
|
78
|
+
const url = try std.fmt.allocPrint(alloc, "{s}/v1/{s}/data/{s}", .{ addr, self.mount, alias });
|
|
79
|
+
|
|
80
|
+
const headers = [_]httpjson.Header{.{ .name = "X-Vault-Token", .value = self.token }};
|
|
81
|
+
|
|
82
|
+
const res = switch (try httpjson.fetchjson(alloc, self.config.io, .GET, url, &headers, null)) {
|
|
83
|
+
.err => |message| return .{ .err = message },
|
|
84
|
+
.ok => |got| got,
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
if (404 == res.status) {
|
|
88
|
+
return .{ .ok = null };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (200 != res.status) {
|
|
92
|
+
return .{ .err = try sekreto.fail(
|
|
93
|
+
alloc,
|
|
94
|
+
"sekreto: boru serve error: {d}: {s}",
|
|
95
|
+
.{ res.status, url },
|
|
96
|
+
) };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const data = httpjson.jget(httpjson.jget(res.body, "data"), "data");
|
|
100
|
+
return .{ .ok = httpjson.jstr(httpjson.jget(data, "value")) };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
fn lookupcli(self: *BoruProvider, alloc: Allocator, name: []const u8) Allocator.Error!Found {
|
|
104
|
+
const alias = if (0 != self.namespace.len)
|
|
105
|
+
try std.fmt.allocPrint(alloc, "{s}:{s}", .{ self.namespace, name })
|
|
106
|
+
else
|
|
107
|
+
name;
|
|
108
|
+
|
|
109
|
+
// BORU_HOME is added to a copy of the environment, never to the
|
|
110
|
+
// command line: the passphrase boru reads from the environment must
|
|
111
|
+
// not end up in the process table beside it.
|
|
112
|
+
var environ = try self.config.env.clone(alloc);
|
|
113
|
+
defer environ.deinit();
|
|
114
|
+
|
|
115
|
+
if (0 != self.home.len) {
|
|
116
|
+
try environ.put("BORU_HOME", self.home);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const run = std.process.run(alloc, self.config.io, .{
|
|
120
|
+
.argv = &.{ self.command, "vault", "get", "--reveal", alias },
|
|
121
|
+
.environ_map = &environ,
|
|
122
|
+
}) catch |err| {
|
|
123
|
+
return .{ .err = try sekreto.fail(
|
|
124
|
+
alloc,
|
|
125
|
+
"sekreto: cannot run {s}: {s}",
|
|
126
|
+
.{ self.command, @errorName(err) },
|
|
127
|
+
) };
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
const exited = switch (run.term) {
|
|
131
|
+
.exited => |code| code,
|
|
132
|
+
else => 1,
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
if (0 == exited) {
|
|
136
|
+
// boru prints the value and one newline, and nothing else.
|
|
137
|
+
var value: []const u8 = run.stdout;
|
|
138
|
+
if (0 != value.len and '\n' == value[value.len - 1]) {
|
|
139
|
+
value = value[0 .. value.len - 1];
|
|
140
|
+
}
|
|
141
|
+
return .{ .ok = value };
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const why = std.mem.trim(u8, run.stderr, " \t\r\n");
|
|
145
|
+
|
|
146
|
+
// "no alias named" is boru saying it does not hold this secret,
|
|
147
|
+
// which is a miss: the chain carries on to the next provider. A
|
|
148
|
+
// locked vault or a wrong passphrase is not a miss - treating it as
|
|
149
|
+
// one would fall through to a weaker store without saying so.
|
|
150
|
+
if (null != std.mem.indexOf(u8, why, "no alias named")) {
|
|
151
|
+
return .{ .ok = null };
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (0 != why.len) {
|
|
155
|
+
return .{ .err = try sekreto.fail(alloc, "sekreto: boru vault error: {s}", .{why}) };
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return .{ .err = try sekreto.fail(alloc, "sekreto: boru vault error: exit {d}", .{exited}) };
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
pub fn describe(self: *BoruProvider, alloc: Allocator) Allocator.Error![]const u8 {
|
|
162
|
+
if (0 != self.addr.len) {
|
|
163
|
+
return std.fmt.allocPrint(alloc, "boru:{s}", .{httpjson.trimslash(self.addr)});
|
|
164
|
+
}
|
|
165
|
+
if (0 != self.namespace.len) {
|
|
166
|
+
return std.fmt.allocPrint(alloc, "boru:{s}", .{self.namespace});
|
|
167
|
+
}
|
|
168
|
+
return alloc.dupe(u8, "boru");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
pub fn deinit(_: *BoruProvider, _: Allocator) void {}
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
fn make(alloc: Allocator, config: sekreto.Config, spec: ProviderSpec) Allocator.Error!Answer(Provider) {
|
|
175
|
+
return .{ .ok = try sekreto.provide(alloc, BoruProvider, .{
|
|
176
|
+
.alloc = alloc,
|
|
177
|
+
.config = config,
|
|
178
|
+
.command = if (0 != spec.command.len) spec.command else "boru",
|
|
179
|
+
.namespace = spec.namespace,
|
|
180
|
+
.home = spec.home,
|
|
181
|
+
.addr = spec.addr,
|
|
182
|
+
.token = spec.token,
|
|
183
|
+
.mount = if (0 != spec.mount.len) spec.mount else "secret",
|
|
184
|
+
}) };
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/// The `boru` kind.
|
|
188
|
+
pub const boru: sekreto.Definition = sekreto.providerplugin("boru", make);
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (zig/plugins/doppler.zig)
|
|
2
|
+
// Source: https://github.com/voxgig/sekreto @ 1267ee2e5f49566bc92695bc9eb3a60ef4924998 [tag: sdk-20260908-1556-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
//! Doppler - a sekreto plugin. Needs HTTPS.
|
|
5
|
+
|
|
6
|
+
const std = @import("std");
|
|
7
|
+
|
|
8
|
+
const sekreto = @import("sekreto");
|
|
9
|
+
const httpjson = @import("httpjson.zig");
|
|
10
|
+
|
|
11
|
+
const Allocator = std.mem.Allocator;
|
|
12
|
+
const Answer = sekreto.Answer;
|
|
13
|
+
const Found = sekreto.Found;
|
|
14
|
+
const Provider = sekreto.Provider;
|
|
15
|
+
const ProviderSpec = sekreto.ProviderSpec;
|
|
16
|
+
|
|
17
|
+
/// Doppler.
|
|
18
|
+
///
|
|
19
|
+
/// The whole config is downloaded once - Doppler's own bulk endpoint - and
|
|
20
|
+
/// answered from memory, like a remote .env: `api.token` is the `API_TOKEN`
|
|
21
|
+
/// entry. A service token is config-scoped, so project and config are only
|
|
22
|
+
/// needed with broader tokens.
|
|
23
|
+
pub const DopplerProvider = struct {
|
|
24
|
+
alloc: Allocator,
|
|
25
|
+
config: sekreto.Config,
|
|
26
|
+
token: []const u8,
|
|
27
|
+
project: []const u8,
|
|
28
|
+
dopplerconfig: []const u8,
|
|
29
|
+
addr: []const u8,
|
|
30
|
+
state: std.heap.ArenaAllocator,
|
|
31
|
+
values: ?[]const sekreto.KeyValue,
|
|
32
|
+
|
|
33
|
+
fn load(self: *DopplerProvider, alloc: Allocator) Allocator.Error!Answer([]const sekreto.KeyValue) {
|
|
34
|
+
if (self.values) |values| {
|
|
35
|
+
return .{ .ok = values };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const addr = httpjson.trimslash(if (0 != self.addr.len) self.addr else "https://api.doppler.com");
|
|
39
|
+
|
|
40
|
+
switch (try sekreto.checkaddr(alloc, addr)) {
|
|
41
|
+
.err => |message| return .{ .err = message },
|
|
42
|
+
.ok => {},
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
var url: std.ArrayList(u8) = .empty;
|
|
46
|
+
try url.appendSlice(alloc, addr);
|
|
47
|
+
try url.appendSlice(alloc, "/v3/configs/config/secrets/download?format=json");
|
|
48
|
+
|
|
49
|
+
if (0 != self.project.len) {
|
|
50
|
+
try url.appendSlice(alloc, "&project=");
|
|
51
|
+
try url.appendSlice(alloc, try httpjson.escape(alloc, self.project));
|
|
52
|
+
}
|
|
53
|
+
if (0 != self.dopplerconfig.len) {
|
|
54
|
+
try url.appendSlice(alloc, "&config=");
|
|
55
|
+
try url.appendSlice(alloc, try httpjson.escape(alloc, self.dopplerconfig));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const bearer = try std.fmt.allocPrint(alloc, "Bearer {s}", .{self.token});
|
|
59
|
+
const headers = [_]httpjson.Header{.{ .name = "authorization", .value = bearer }};
|
|
60
|
+
|
|
61
|
+
const res = switch (try httpjson.fetchjson(alloc, self.config.io, .GET, url.items, &headers, null)) {
|
|
62
|
+
.err => |message| return .{ .err = message },
|
|
63
|
+
.ok => |got| got,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const body = res.body orelse std.json.Value{ .null = {} };
|
|
67
|
+
|
|
68
|
+
if (200 != res.status or .object != body) {
|
|
69
|
+
return .{ .err = try sekreto.fail(alloc, "sekreto: doppler error: {d}", .{res.status}) };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Loaded once, so it outlives the lookup's scratch arena.
|
|
73
|
+
const keep = self.state.allocator();
|
|
74
|
+
var values: std.ArrayList(sekreto.KeyValue) = .empty;
|
|
75
|
+
|
|
76
|
+
var it = body.object.iterator();
|
|
77
|
+
while (it.next()) |field| {
|
|
78
|
+
const value = httpjson.jstr(field.value_ptr.*) orelse continue;
|
|
79
|
+
try values.append(keep, .{
|
|
80
|
+
.key = try keep.dupe(u8, field.key_ptr.*),
|
|
81
|
+
.value = try keep.dupe(u8, value),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
self.values = values.items;
|
|
86
|
+
return .{ .ok = values.items };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
pub fn lookup(self: *DopplerProvider, alloc: Allocator, name: []const u8) Allocator.Error!Found {
|
|
90
|
+
const key = switch (try sekreto.envkey(alloc, name, "")) {
|
|
91
|
+
.err => |message| return .{ .err = message },
|
|
92
|
+
.ok => |made| made,
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const values = switch (try self.load(alloc)) {
|
|
96
|
+
.err => |message| return .{ .err = message },
|
|
97
|
+
.ok => |loaded| loaded,
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
for (values) |entry| {
|
|
101
|
+
if (std.mem.eql(u8, entry.key, key)) {
|
|
102
|
+
return .{ .ok = entry.value };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return .{ .ok = null };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
pub fn describe(self: *DopplerProvider, alloc: Allocator) Allocator.Error![]const u8 {
|
|
110
|
+
if (0 == self.project.len) {
|
|
111
|
+
return alloc.dupe(u8, "doppler");
|
|
112
|
+
}
|
|
113
|
+
return std.fmt.allocPrint(alloc, "doppler:{s}/{s}", .{ self.project, self.dopplerconfig });
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
pub fn deinit(self: *DopplerProvider, _: Allocator) void {
|
|
117
|
+
self.state.deinit();
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
fn make(alloc: Allocator, config: sekreto.Config, spec: ProviderSpec) Allocator.Error!Answer(Provider) {
|
|
122
|
+
return .{ .ok = try sekreto.provide(alloc, DopplerProvider, .{
|
|
123
|
+
.alloc = alloc,
|
|
124
|
+
.config = config,
|
|
125
|
+
.token = spec.token,
|
|
126
|
+
.project = spec.project,
|
|
127
|
+
.dopplerconfig = spec.config,
|
|
128
|
+
.addr = spec.addr,
|
|
129
|
+
.state = std.heap.ArenaAllocator.init(alloc),
|
|
130
|
+
.values = null,
|
|
131
|
+
}) };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/// The `doppler` kind.
|
|
135
|
+
pub const doppler: sekreto.Definition = sekreto.providerplugin("doppler", make);
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
// VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (zig/plugins/gcpsecrets.zig)
|
|
2
|
+
// Source: https://github.com/voxgig/sekreto @ 1267ee2e5f49566bc92695bc9eb3a60ef4924998 [tag: sdk-20260908-1556-0]
|
|
3
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
4
|
+
//! GCP Secret Manager - a sekreto plugin. Needs HTTPS.
|
|
5
|
+
|
|
6
|
+
const std = @import("std");
|
|
7
|
+
|
|
8
|
+
const sekreto = @import("sekreto");
|
|
9
|
+
const httpjson = @import("httpjson.zig");
|
|
10
|
+
|
|
11
|
+
const Allocator = std.mem.Allocator;
|
|
12
|
+
const Answer = sekreto.Answer;
|
|
13
|
+
const Found = sekreto.Found;
|
|
14
|
+
const Provider = sekreto.Provider;
|
|
15
|
+
const ProviderSpec = sekreto.ProviderSpec;
|
|
16
|
+
|
|
17
|
+
/// GCP Secret Manager.
|
|
18
|
+
///
|
|
19
|
+
/// `api.token` reads secret `api_token` (dots flattened to `_`; Secret
|
|
20
|
+
/// Manager ids have no hierarchy and reject dots), latest version. The token
|
|
21
|
+
/// comes from config, then `GOOGLE_OAUTH_ACCESS_TOKEN`, then the GCE/GKE
|
|
22
|
+
/// metadata server - so on Google's own platform no credential
|
|
23
|
+
/// configuration is needed at all.
|
|
24
|
+
///
|
|
25
|
+
/// The metadata call itself is plain http to a link-local host by platform
|
|
26
|
+
/// design; no credential rides on it, so `checkaddr` guards the Secret
|
|
27
|
+
/// Manager address instead.
|
|
28
|
+
pub const GcpSecretsProvider = struct {
|
|
29
|
+
alloc: Allocator,
|
|
30
|
+
config: sekreto.Config,
|
|
31
|
+
project: []const u8,
|
|
32
|
+
token: []const u8,
|
|
33
|
+
addr: []const u8,
|
|
34
|
+
metadataaddr: []const u8,
|
|
35
|
+
livetoken: ?[]const u8,
|
|
36
|
+
renewat: i64,
|
|
37
|
+
|
|
38
|
+
fn metadata(self: *GcpSecretsProvider, alloc: Allocator) Allocator.Error![]const u8 {
|
|
39
|
+
if (0 != self.metadataaddr.len) {
|
|
40
|
+
return self.metadataaddr;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (self.config.env.get("GCE_METADATA_HOST")) |host| {
|
|
44
|
+
if (0 != host.len) {
|
|
45
|
+
return std.fmt.allocPrint(alloc, "http://{s}", .{host});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return "http://metadata.google.internal";
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
fn login(self: *GcpSecretsProvider, alloc: Allocator) Allocator.Error!Answer([]const u8) {
|
|
53
|
+
const configured = httpjson.firstof(self.config, self.token, &.{"GOOGLE_OAUTH_ACCESS_TOKEN"});
|
|
54
|
+
if (0 != configured.len) {
|
|
55
|
+
return .{ .ok = configured };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const url = try std.fmt.allocPrint(
|
|
59
|
+
alloc,
|
|
60
|
+
"{s}/computeMetadata/v1/instance/service-accounts/default/token",
|
|
61
|
+
.{httpjson.trimslash(try self.metadata(alloc))},
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
const headers = [_]httpjson.Header{.{ .name = "Metadata-Flavor", .value = "Google" }};
|
|
65
|
+
|
|
66
|
+
const res = switch (try httpjson.fetchjson(alloc, self.config.io, .GET, url, &headers, null)) {
|
|
67
|
+
.err => |message| return .{ .err = message },
|
|
68
|
+
.ok => |got| got,
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const access = httpjson.jstr(httpjson.jget(res.body, "access_token"));
|
|
72
|
+
|
|
73
|
+
if (200 != res.status or null == access) {
|
|
74
|
+
return .{ .err = try sekreto.fail(
|
|
75
|
+
alloc,
|
|
76
|
+
"sekreto: gcp: no token and metadata server did not answer",
|
|
77
|
+
.{},
|
|
78
|
+
) };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
self.renewat = httpjson.renewafter(self.config.io, httpjson.jnum(httpjson.jget(res.body, "expires_in")));
|
|
82
|
+
|
|
83
|
+
return .{ .ok = access.? };
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
pub fn lookup(self: *GcpSecretsProvider, alloc: Allocator, name: []const u8) Allocator.Error!Found {
|
|
87
|
+
if (0 == self.project.len) {
|
|
88
|
+
return .{ .err = try sekreto.fail(alloc, "sekreto: gcp: no project", .{}) };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const addr = if (0 != self.addr.len) self.addr else "https://secretmanager.googleapis.com";
|
|
92
|
+
|
|
93
|
+
switch (try sekreto.checkaddr(alloc, addr)) {
|
|
94
|
+
.err => |message| return .{ .err = message },
|
|
95
|
+
.ok => {},
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (null == self.livetoken or httpjson.nowms(self.config.io) >= self.renewat) {
|
|
99
|
+
const fresh = switch (try self.login(alloc)) {
|
|
100
|
+
.err => |message| return .{ .err = message },
|
|
101
|
+
.ok => |got| got,
|
|
102
|
+
};
|
|
103
|
+
if (self.livetoken) |old| {
|
|
104
|
+
self.alloc.free(old);
|
|
105
|
+
}
|
|
106
|
+
self.livetoken = try self.alloc.dupe(u8, fresh);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const flat = switch (try sekreto.flatname(alloc, name, "_")) {
|
|
110
|
+
.err => |message| return .{ .err = message },
|
|
111
|
+
.ok => |got| got,
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const url = try std.fmt.allocPrint(
|
|
115
|
+
alloc,
|
|
116
|
+
"{s}/v1/projects/{s}/secrets/{s}/versions/latest:access",
|
|
117
|
+
.{ httpjson.trimslash(addr), self.project, flat },
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
const bearer = try std.fmt.allocPrint(alloc, "Bearer {s}", .{self.livetoken.?});
|
|
121
|
+
const headers = [_]httpjson.Header{.{ .name = "authorization", .value = bearer }};
|
|
122
|
+
|
|
123
|
+
const res = switch (try httpjson.fetchjson(alloc, self.config.io, .GET, url, &headers, null)) {
|
|
124
|
+
.err => |message| return .{ .err = message },
|
|
125
|
+
.ok => |got| got,
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
if (404 == res.status) {
|
|
129
|
+
return .{ .ok = null };
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (200 != res.status) {
|
|
133
|
+
return .{ .err = try sekreto.fail(alloc, "sekreto: gcp error: {d}: {s}", .{ res.status, url }) };
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const data = httpjson.jstr(httpjson.jget(httpjson.jget(res.body, "payload"), "data")) orelse
|
|
137
|
+
return .{ .ok = null };
|
|
138
|
+
|
|
139
|
+
// See the aws provider: an undecodable payload is an error, not a
|
|
140
|
+
// miss.
|
|
141
|
+
return .{ .ok = try sekreto.unbase64(alloc, data) orelse
|
|
142
|
+
return .{ .err = try sekreto.fail(alloc, "sekreto: gcp: undecodable secret", .{}) } };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
pub fn describe(self: *GcpSecretsProvider, alloc: Allocator) Allocator.Error![]const u8 {
|
|
146
|
+
return std.fmt.allocPrint(alloc, "gcpsecrets:{s}", .{self.project});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
pub fn deinit(self: *GcpSecretsProvider, alloc: Allocator) void {
|
|
150
|
+
if (self.livetoken) |token| {
|
|
151
|
+
alloc.free(token);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
fn make(alloc: Allocator, config: sekreto.Config, spec: ProviderSpec) Allocator.Error!Answer(Provider) {
|
|
157
|
+
return .{ .ok = try sekreto.provide(alloc, GcpSecretsProvider, .{
|
|
158
|
+
.alloc = alloc,
|
|
159
|
+
.config = config,
|
|
160
|
+
.project = spec.project,
|
|
161
|
+
.token = spec.token,
|
|
162
|
+
.addr = spec.addr,
|
|
163
|
+
.metadataaddr = spec.metadataaddr,
|
|
164
|
+
.livetoken = null,
|
|
165
|
+
.renewat = httpjson.NEVER,
|
|
166
|
+
}) };
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/// The `gcpsecrets` kind.
|
|
170
|
+
pub const gcpsecrets: sekreto.Definition = sekreto.providerplugin("gcpsecrets", make);
|