@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,165 @@
|
|
|
1
|
+
// VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (c/plugins/infisical.c)
|
|
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
|
+
/* Infisical, with universal-auth login.
|
|
5
|
+
*
|
|
6
|
+
* A plugin because it opens a socket.
|
|
7
|
+
*
|
|
8
|
+
* A port of typescript/plugins/infisical.ts, which is canonical.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#define _POSIX_C_SOURCE 200809L
|
|
12
|
+
|
|
13
|
+
#include <stdlib.h>
|
|
14
|
+
#include <string.h>
|
|
15
|
+
|
|
16
|
+
#include "support.h"
|
|
17
|
+
|
|
18
|
+
typedef struct {
|
|
19
|
+
sek_pool *pool;
|
|
20
|
+
const char *addr;
|
|
21
|
+
const char *token;
|
|
22
|
+
const char *clientid;
|
|
23
|
+
const char *clientsecret;
|
|
24
|
+
const char *project;
|
|
25
|
+
const char *environment;
|
|
26
|
+
const char *path;
|
|
27
|
+
char *livetoken;
|
|
28
|
+
long long renewat;
|
|
29
|
+
char *described;
|
|
30
|
+
} infisicaldata;
|
|
31
|
+
|
|
32
|
+
static sek_err infisical_login(infisicaldata *data, const char *addr, char **out) {
|
|
33
|
+
sek_pool *pool = data->pool;
|
|
34
|
+
sek_json *payload;
|
|
35
|
+
sek_map *headers;
|
|
36
|
+
sek_answer res;
|
|
37
|
+
sek_err err;
|
|
38
|
+
const char *got;
|
|
39
|
+
|
|
40
|
+
if (!sek_empty(data->token)) {
|
|
41
|
+
*out = sek_strdup(pool, data->token);
|
|
42
|
+
return NULL;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (sek_empty(data->clientid) || sek_empty(data->clientsecret)) {
|
|
46
|
+
return sek_strdup(pool, "sekreto: infisical: no token and no client credentials");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
payload = sek_json_obj(pool);
|
|
50
|
+
sek_json_set(pool, payload, "clientId", sek_json_str(pool, data->clientid));
|
|
51
|
+
sek_json_set(pool, payload, "clientSecret", sek_json_str(pool, data->clientsecret));
|
|
52
|
+
|
|
53
|
+
headers = sek_map_new(pool);
|
|
54
|
+
sek_map_set(headers, "content-type", "application/json");
|
|
55
|
+
|
|
56
|
+
err = sek_fetchjson(pool, "POST", sek_fmt(pool, "%s/api/v1/auth/universal-auth/login", addr),
|
|
57
|
+
headers, sek_json_stringify(pool, payload), &res);
|
|
58
|
+
if (NULL != err) {
|
|
59
|
+
return err;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
got = sek_json_text(pool, sek_json_dig(res.body, "accessToken", NULL));
|
|
63
|
+
if (200 != res.status || sek_empty(got)) {
|
|
64
|
+
return sek_fmt(pool, "sekreto: infisical login failed: %d", res.status);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* camelCase, unlike everyone else's expires_in. */
|
|
68
|
+
data->renewat = sek_renewtime(sek_json_dig(res.body, "expiresIn", NULL));
|
|
69
|
+
*out = sek_strdup(pool, got);
|
|
70
|
+
|
|
71
|
+
return NULL;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
static sek_err infisical_lookup(sek_provider *self, const char *name, char **out) {
|
|
75
|
+
infisicaldata *data = (infisicaldata *)self->data;
|
|
76
|
+
sek_pool *pool = data->pool;
|
|
77
|
+
char *addr = sek_trimslash(pool, sek_first(data->addr, "https://app.infisical.com"));
|
|
78
|
+
char *key = NULL;
|
|
79
|
+
char *url;
|
|
80
|
+
sek_map *headers;
|
|
81
|
+
sek_answer res;
|
|
82
|
+
sek_err err = sek_checkaddr(pool, addr);
|
|
83
|
+
const char *text;
|
|
84
|
+
|
|
85
|
+
*out = NULL;
|
|
86
|
+
|
|
87
|
+
if (NULL != err) {
|
|
88
|
+
return err;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (sek_empty(data->project) || sek_empty(data->environment)) {
|
|
92
|
+
return sek_strdup(pool, "sekreto: infisical: no project/environment");
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (NULL == data->livetoken || sek_nowms() >= data->renewat) {
|
|
96
|
+
err = infisical_login(data, addr, &data->livetoken);
|
|
97
|
+
if (NULL != err) {
|
|
98
|
+
return err;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* envkey here takes NO prefix: Infisical's own convention is plain
|
|
103
|
+
* environment-style keys. */
|
|
104
|
+
err = sek_envkey(pool, name, NULL, &key);
|
|
105
|
+
if (NULL != err) {
|
|
106
|
+
return err;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
url = sek_fmt(pool, "%s/api/v3/secrets/raw/%s?workspaceId=%s&environment=%s&secretPath=%s", addr,
|
|
110
|
+
key, sek_uriescape(pool, data->project), sek_uriescape(pool, data->environment),
|
|
111
|
+
sek_uriescape(pool, sek_first(data->path, "/")));
|
|
112
|
+
|
|
113
|
+
headers = sek_map_new(pool);
|
|
114
|
+
sek_map_set(headers, "authorization", sek_fmt(pool, "Bearer %s", sek_orempty(data->livetoken)));
|
|
115
|
+
|
|
116
|
+
err = sek_fetchjson(pool, "GET", url, headers, NULL, &res);
|
|
117
|
+
if (NULL != err) {
|
|
118
|
+
return err;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (404 == res.status) {
|
|
122
|
+
return NULL;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (200 != res.status) {
|
|
126
|
+
return sek_fmt(pool, "sekreto: infisical error: %d", res.status);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
text = sek_json_text(pool, sek_json_dig(res.body, "secret", "secretValue", NULL));
|
|
130
|
+
if (NULL != text) {
|
|
131
|
+
*out = sek_strdup(pool, text);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return NULL;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
static const char *infisical_describe(sek_provider *self) {
|
|
138
|
+
return ((infisicaldata *)self->data)->described;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/* ---- the definition ------------------------------------------------ */
|
|
142
|
+
|
|
143
|
+
static sek_err infisical_make(sek_pool *pool, const sek_spec *spec, sek_provider **out) {
|
|
144
|
+
infisicaldata *data = (infisicaldata *)sek_alloc(pool, sizeof(infisicaldata));
|
|
145
|
+
data->pool = pool;
|
|
146
|
+
data->addr = sek_own(pool, spec->addr);
|
|
147
|
+
data->token = sek_own(pool, spec->token);
|
|
148
|
+
data->clientid = sek_own(pool, spec->clientid);
|
|
149
|
+
data->clientsecret = sek_own(pool, spec->clientsecret);
|
|
150
|
+
data->project = sek_own(pool, spec->project);
|
|
151
|
+
data->environment = sek_own(pool, spec->environment);
|
|
152
|
+
data->path = sek_own(pool, spec->path);
|
|
153
|
+
data->livetoken = NULL;
|
|
154
|
+
data->renewat = SEK_NEVER;
|
|
155
|
+
data->described = sek_fmt(pool, "infisical:%s/%s", sek_orempty(spec->project),
|
|
156
|
+
sek_orempty(spec->environment));
|
|
157
|
+
*out = sek_provider_new(pool, infisical_lookup, infisical_describe, data);
|
|
158
|
+
return NULL;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
static sek_providerkind INFISICAL_KIND;
|
|
162
|
+
|
|
163
|
+
Definition *sek_plugin_infisical(void) {
|
|
164
|
+
return sek_providerplugin(&INFISICAL_KIND, "infisical", infisical_make);
|
|
165
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
// VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (c/plugins/onepassword.c)
|
|
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
|
+
/* 1Password Connect.
|
|
5
|
+
*
|
|
6
|
+
* A plugin because it opens a socket.
|
|
7
|
+
*
|
|
8
|
+
* A port of typescript/plugins/onepassword.ts, which is canonical.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#define _POSIX_C_SOURCE 200809L
|
|
12
|
+
|
|
13
|
+
#include <stdlib.h>
|
|
14
|
+
#include <string.h>
|
|
15
|
+
|
|
16
|
+
#include "support.h"
|
|
17
|
+
|
|
18
|
+
typedef struct {
|
|
19
|
+
sek_pool *pool;
|
|
20
|
+
const char *addr;
|
|
21
|
+
const char *token;
|
|
22
|
+
const char *vault;
|
|
23
|
+
char *vaultid;
|
|
24
|
+
char *described;
|
|
25
|
+
} onepassworddata;
|
|
26
|
+
|
|
27
|
+
static sek_map *opauth(onepassworddata *data) {
|
|
28
|
+
sek_map *out = sek_map_new(data->pool);
|
|
29
|
+
|
|
30
|
+
sek_map_set(out, "authorization", sek_fmt(data->pool, "Bearer %s", sek_orempty(data->token)));
|
|
31
|
+
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* The vault id, resolved once and memoised. A vault that cannot be found
|
|
36
|
+
* is an ERROR, not a miss: config names it, so its absence is a broken
|
|
37
|
+
* store rather than a missing secret. */
|
|
38
|
+
static sek_err opvault(onepassworddata *data, const char *addr, char **out) {
|
|
39
|
+
sek_pool *pool = data->pool;
|
|
40
|
+
sek_answer res;
|
|
41
|
+
sek_err err;
|
|
42
|
+
const sek_json *list;
|
|
43
|
+
size_t index;
|
|
44
|
+
|
|
45
|
+
if (sek_empty(data->vault)) {
|
|
46
|
+
return sek_strdup(pool, "sekreto: onepassword: no vault");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
err = sek_fetchjson(pool, "GET", sek_fmt(pool, "%s/v1/vaults", addr), opauth(data), NULL, &res);
|
|
50
|
+
if (NULL != err) {
|
|
51
|
+
return err;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
list = sek_json_asarr(res.body);
|
|
55
|
+
if (200 != res.status || NULL == list) {
|
|
56
|
+
return sek_fmt(pool, "sekreto: onepassword error: %d: listing vaults", res.status);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
for (index = 0; index < list->itemlen; index++) {
|
|
60
|
+
const char *id = sek_json_text(pool, sek_json_dig(list->items[index], "id", NULL));
|
|
61
|
+
const char *label = sek_json_text(pool, sek_json_dig(list->items[index], "name", NULL));
|
|
62
|
+
|
|
63
|
+
if ((NULL != id && 0 == strcmp(data->vault, id)) ||
|
|
64
|
+
(NULL != label && 0 == strcmp(data->vault, label))) {
|
|
65
|
+
*out = sek_strdup(pool, sek_orempty(id));
|
|
66
|
+
return NULL;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return sek_fmt(pool, "sekreto: onepassword: no vault named %s", data->vault);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
static sek_err onepassword_lookup(sek_provider *self, const char *name, char **out) {
|
|
74
|
+
onepassworddata *data = (onepassworddata *)self->data;
|
|
75
|
+
sek_pool *pool = data->pool;
|
|
76
|
+
sek_err err = sek_checkname(pool, name);
|
|
77
|
+
char *addr;
|
|
78
|
+
sek_answer found;
|
|
79
|
+
sek_answer item;
|
|
80
|
+
const sek_json *items;
|
|
81
|
+
const sek_json *fields;
|
|
82
|
+
size_t index;
|
|
83
|
+
|
|
84
|
+
*out = NULL;
|
|
85
|
+
|
|
86
|
+
if (NULL != err) {
|
|
87
|
+
return err;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
addr = sek_trimslash(pool, sek_orempty(data->addr));
|
|
91
|
+
if (sek_empty(addr)) {
|
|
92
|
+
return sek_strdup(pool, "sekreto: onepassword: no addr");
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
err = sek_checkaddr(pool, addr);
|
|
96
|
+
if (NULL != err) {
|
|
97
|
+
return err;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (NULL == data->vaultid) {
|
|
101
|
+
err = opvault(data, addr, &data->vaultid);
|
|
102
|
+
if (NULL != err) {
|
|
103
|
+
return err;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* Item titles keep their dots. */
|
|
108
|
+
err = sek_fetchjson(
|
|
109
|
+
pool, "GET",
|
|
110
|
+
sek_fmt(pool, "%s/v1/vaults/%s/items?filter=%s", addr, data->vaultid,
|
|
111
|
+
sek_uriescape(pool, sek_fmt(pool, "title eq \"%s\"", name))),
|
|
112
|
+
opauth(data), NULL, &found);
|
|
113
|
+
if (NULL != err) {
|
|
114
|
+
return err;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
items = sek_json_asarr(found.body);
|
|
118
|
+
if (200 != found.status || NULL == items) {
|
|
119
|
+
return sek_fmt(pool, "sekreto: onepassword error: %d: finding %s", found.status, name);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/* An empty list is the secret not being there: a miss. */
|
|
123
|
+
if (0 == items->itemlen) {
|
|
124
|
+
return NULL;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
err = sek_fetchjson(pool, "GET",
|
|
128
|
+
sek_fmt(pool, "%s/v1/vaults/%s/items/%s", addr, data->vaultid,
|
|
129
|
+
sek_orempty(sek_json_text(pool, sek_json_dig(items->items[0], "id",
|
|
130
|
+
NULL)))),
|
|
131
|
+
opauth(data), NULL, &item);
|
|
132
|
+
if (NULL != err) {
|
|
133
|
+
return err;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (200 != item.status) {
|
|
137
|
+
return sek_fmt(pool, "sekreto: onepassword error: %d: reading %s", item.status, name);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
fields = sek_json_asarr(sek_json_dig(item.body, "fields", NULL));
|
|
141
|
+
if (NULL == fields) {
|
|
142
|
+
return NULL;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/* Two full passes, in this order: the password field first, then a
|
|
146
|
+
* field labelled `value`. */
|
|
147
|
+
for (index = 0; index < fields->itemlen; index++) {
|
|
148
|
+
const char *purpose = sek_json_asstr(sek_json_dig(fields->items[index], "purpose", NULL));
|
|
149
|
+
if (NULL != purpose && 0 == strcmp(purpose, "PASSWORD")) {
|
|
150
|
+
const char *value = sek_json_text(pool, sek_json_dig(fields->items[index], "value", NULL));
|
|
151
|
+
if (NULL != value) {
|
|
152
|
+
*out = sek_strdup(pool, value);
|
|
153
|
+
}
|
|
154
|
+
return NULL;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
for (index = 0; index < fields->itemlen; index++) {
|
|
159
|
+
const char *label = sek_json_asstr(sek_json_dig(fields->items[index], "label", NULL));
|
|
160
|
+
if (NULL != label && 0 == strcmp(label, "value")) {
|
|
161
|
+
const char *value = sek_json_text(pool, sek_json_dig(fields->items[index], "value", NULL));
|
|
162
|
+
if (NULL != value) {
|
|
163
|
+
*out = sek_strdup(pool, value);
|
|
164
|
+
}
|
|
165
|
+
return NULL;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return NULL;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
static const char *onepassword_describe(sek_provider *self) {
|
|
173
|
+
return ((onepassworddata *)self->data)->described;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* ---- the definition ------------------------------------------------ */
|
|
177
|
+
|
|
178
|
+
static sek_err onepassword_make(sek_pool *pool, const sek_spec *spec, sek_provider **out) {
|
|
179
|
+
onepassworddata *data = (onepassworddata *)sek_alloc(pool, sizeof(onepassworddata));
|
|
180
|
+
data->pool = pool;
|
|
181
|
+
data->addr = sek_own(pool, spec->addr);
|
|
182
|
+
data->token = sek_own(pool, spec->token);
|
|
183
|
+
data->vault = sek_own(pool, spec->vault);
|
|
184
|
+
data->vaultid = NULL;
|
|
185
|
+
data->described = sek_fmt(pool, "onepassword:%s", sek_orempty(spec->vault));
|
|
186
|
+
*out = sek_provider_new(pool, onepassword_lookup, onepassword_describe, data);
|
|
187
|
+
return NULL;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
static sek_providerkind ONEPASSWORD_KIND;
|
|
191
|
+
|
|
192
|
+
Definition *sek_plugin_onepassword(void) {
|
|
193
|
+
return sek_providerplugin(&ONEPASSWORD_KIND, "onepassword", onepassword_make);
|
|
194
|
+
}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
// VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (c/plugins/proc.c)
|
|
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
|
+
/* Running a child: the ONE object in this library that forks.
|
|
5
|
+
*
|
|
6
|
+
* The boru and secretspec providers read their secret from a CLI, which
|
|
7
|
+
* is the interface those tools offer a program in another language. Two
|
|
8
|
+
* things about doing that are not optional.
|
|
9
|
+
*
|
|
10
|
+
* BOTH STREAMS ARE DRAINED CONCURRENTLY. Reading stdout to EOF and only
|
|
11
|
+
* then reading stderr deadlocks the moment the child writes more than one
|
|
12
|
+
* pipe buffer (64 KiB on Linux) to stderr: the parent waits on stdout,
|
|
13
|
+
* the child waits for room on stderr, and neither can move. Nothing here
|
|
14
|
+
* sets a timeout, so that hang is permanent - get() simply never returns.
|
|
15
|
+
* secretspec's diagnostics are box-drawn and reach that size easily. A
|
|
16
|
+
* single poll() over both pipes is what avoids it.
|
|
17
|
+
*
|
|
18
|
+
* THE CHILD'S STDIN IS AT EOF, not an open pipe nobody writes to, so a
|
|
19
|
+
* CLI that reads it - one prompting for a passphrase when its environment
|
|
20
|
+
* variable is absent - gives up instead of waiting forever.
|
|
21
|
+
*
|
|
22
|
+
* argv is an array and never a shell string, and no secret is ever put on
|
|
23
|
+
* a command line, where the process table publishes it.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
#define _POSIX_C_SOURCE 200809L
|
|
27
|
+
|
|
28
|
+
#include <errno.h>
|
|
29
|
+
#include <fcntl.h>
|
|
30
|
+
#include <poll.h>
|
|
31
|
+
#include <stdio.h>
|
|
32
|
+
#include <stdlib.h>
|
|
33
|
+
#include <string.h>
|
|
34
|
+
#include <sys/wait.h>
|
|
35
|
+
#include <unistd.h>
|
|
36
|
+
|
|
37
|
+
#include "support.h"
|
|
38
|
+
|
|
39
|
+
static void drainpipe(sek_buf *into, int fd) {
|
|
40
|
+
char chunk[4096];
|
|
41
|
+
ssize_t got = read(fd, chunk, sizeof(chunk));
|
|
42
|
+
|
|
43
|
+
if (0 < got) {
|
|
44
|
+
sek_buf_addn(into, chunk, (size_t)got);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
sek_err sek_runcmd(sek_pool *pool, char *const argv[], const char *command, const char *envkey,
|
|
49
|
+
const char *envval, sek_ran *out) {
|
|
50
|
+
int outpipe[2];
|
|
51
|
+
int errpipe[2];
|
|
52
|
+
int failpipe[2];
|
|
53
|
+
pid_t child;
|
|
54
|
+
sek_buf stdoutbuf;
|
|
55
|
+
sek_buf stderrbuf;
|
|
56
|
+
int status = 0;
|
|
57
|
+
int childerrno = 0;
|
|
58
|
+
|
|
59
|
+
out->out = NULL;
|
|
60
|
+
out->why = NULL;
|
|
61
|
+
out->status = 0;
|
|
62
|
+
|
|
63
|
+
if (0 != pipe(outpipe)) {
|
|
64
|
+
return sek_fmt(pool, "sekreto: cannot run %s: %s", command, strerror(errno));
|
|
65
|
+
}
|
|
66
|
+
if (0 != pipe(errpipe)) {
|
|
67
|
+
close(outpipe[0]);
|
|
68
|
+
close(outpipe[1]);
|
|
69
|
+
return sek_fmt(pool, "sekreto: cannot run %s: %s", command, strerror(errno));
|
|
70
|
+
}
|
|
71
|
+
/* A close-on-exec pipe: the child writes its errno into it if exec
|
|
72
|
+
* fails, and the successful exec closes it silently. Without it a
|
|
73
|
+
* missing binary is indistinguishable from one that ran and exited. */
|
|
74
|
+
if (0 != pipe(failpipe)) {
|
|
75
|
+
close(outpipe[0]);
|
|
76
|
+
close(outpipe[1]);
|
|
77
|
+
close(errpipe[0]);
|
|
78
|
+
close(errpipe[1]);
|
|
79
|
+
return sek_fmt(pool, "sekreto: cannot run %s: %s", command, strerror(errno));
|
|
80
|
+
}
|
|
81
|
+
fcntl(failpipe[1], F_SETFD, FD_CLOEXEC);
|
|
82
|
+
|
|
83
|
+
child = fork();
|
|
84
|
+
|
|
85
|
+
if (0 > child) {
|
|
86
|
+
close(outpipe[0]);
|
|
87
|
+
close(outpipe[1]);
|
|
88
|
+
close(errpipe[0]);
|
|
89
|
+
close(errpipe[1]);
|
|
90
|
+
close(failpipe[0]);
|
|
91
|
+
close(failpipe[1]);
|
|
92
|
+
return sek_fmt(pool, "sekreto: cannot run %s: %s", command, strerror(errno));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (0 == child) {
|
|
96
|
+
int devnull = open("/dev/null", O_RDONLY);
|
|
97
|
+
int problem;
|
|
98
|
+
|
|
99
|
+
if (0 <= devnull) {
|
|
100
|
+
dup2(devnull, 0);
|
|
101
|
+
close(devnull);
|
|
102
|
+
} else {
|
|
103
|
+
close(0);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
dup2(outpipe[1], 1);
|
|
107
|
+
dup2(errpipe[1], 2);
|
|
108
|
+
|
|
109
|
+
close(outpipe[0]);
|
|
110
|
+
close(outpipe[1]);
|
|
111
|
+
close(errpipe[0]);
|
|
112
|
+
close(errpipe[1]);
|
|
113
|
+
close(failpipe[0]);
|
|
114
|
+
|
|
115
|
+
if (NULL != envkey && NULL != envval) {
|
|
116
|
+
setenv(envkey, envval, 1);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
execvp(argv[0], argv);
|
|
120
|
+
|
|
121
|
+
problem = errno;
|
|
122
|
+
if (sizeof(problem) != (size_t)write(failpipe[1], &problem, sizeof(problem))) {
|
|
123
|
+
/* Nothing left to do: the parent will see a closed pipe and an
|
|
124
|
+
* exit status instead. */
|
|
125
|
+
}
|
|
126
|
+
_exit(127);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
close(outpipe[1]);
|
|
130
|
+
close(errpipe[1]);
|
|
131
|
+
close(failpipe[1]);
|
|
132
|
+
|
|
133
|
+
sek_buf_init(&stdoutbuf, pool);
|
|
134
|
+
sek_buf_init(&stderrbuf, pool);
|
|
135
|
+
|
|
136
|
+
{
|
|
137
|
+
struct pollfd watch[2];
|
|
138
|
+
int open_count = 2;
|
|
139
|
+
|
|
140
|
+
watch[0].fd = outpipe[0];
|
|
141
|
+
watch[1].fd = errpipe[0];
|
|
142
|
+
watch[0].events = POLLIN;
|
|
143
|
+
watch[1].events = POLLIN;
|
|
144
|
+
|
|
145
|
+
while (0 < open_count) {
|
|
146
|
+
int ready;
|
|
147
|
+
|
|
148
|
+
watch[0].revents = 0;
|
|
149
|
+
watch[1].revents = 0;
|
|
150
|
+
|
|
151
|
+
ready = poll(watch, 2, -1);
|
|
152
|
+
if (0 > ready) {
|
|
153
|
+
if (EINTR == errno) {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
{
|
|
160
|
+
int index;
|
|
161
|
+
for (index = 0; index < 2; index++) {
|
|
162
|
+
if (0 > watch[index].fd) {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (0 != (watch[index].revents & POLLIN)) {
|
|
167
|
+
drainpipe(0 == index ? &stdoutbuf : &stderrbuf, watch[index].fd);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (0 != (watch[index].revents & (POLLHUP | POLLERR))) {
|
|
171
|
+
/* Drain whatever is still buffered before letting go: a
|
|
172
|
+
* short-lived child can write and exit between two polls. */
|
|
173
|
+
for (;;) {
|
|
174
|
+
char chunk[4096];
|
|
175
|
+
ssize_t got = read(watch[index].fd, chunk, sizeof(chunk));
|
|
176
|
+
if (0 >= got) {
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
sek_buf_addn(0 == index ? &stdoutbuf : &stderrbuf, chunk, (size_t)got);
|
|
180
|
+
}
|
|
181
|
+
close(watch[index].fd);
|
|
182
|
+
watch[index].fd = -1;
|
|
183
|
+
open_count--;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (0 <= watch[0].fd) {
|
|
190
|
+
close(watch[0].fd);
|
|
191
|
+
}
|
|
192
|
+
if (0 <= watch[1].fd) {
|
|
193
|
+
close(watch[1].fd);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (sizeof(childerrno) != (size_t)read(failpipe[0], &childerrno, sizeof(childerrno))) {
|
|
198
|
+
childerrno = 0;
|
|
199
|
+
}
|
|
200
|
+
close(failpipe[0]);
|
|
201
|
+
|
|
202
|
+
while (0 > waitpid(child, &status, 0)) {
|
|
203
|
+
if (EINTR != errno) {
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
if (0 != childerrno) {
|
|
209
|
+
return sek_fmt(pool, "sekreto: cannot run %s: %s", command, strerror(childerrno));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
out->out = stdoutbuf.data;
|
|
213
|
+
|
|
214
|
+
/* stderr trimmed, because the miss/failure decision is made on its
|
|
215
|
+
* text and a trailing newline is not part of what a tool said. */
|
|
216
|
+
{
|
|
217
|
+
size_t start = 0;
|
|
218
|
+
size_t end = stderrbuf.len;
|
|
219
|
+
while (start < end && (' ' == stderrbuf.data[start] || '\n' == stderrbuf.data[start] ||
|
|
220
|
+
'\r' == stderrbuf.data[start] || '\t' == stderrbuf.data[start])) {
|
|
221
|
+
start++;
|
|
222
|
+
}
|
|
223
|
+
while (end > start && (' ' == stderrbuf.data[end - 1] || '\n' == stderrbuf.data[end - 1] ||
|
|
224
|
+
'\r' == stderrbuf.data[end - 1] || '\t' == stderrbuf.data[end - 1])) {
|
|
225
|
+
end--;
|
|
226
|
+
}
|
|
227
|
+
out->why = sek_strndup(pool, stderrbuf.data + start, end - start);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
out->status = WIFEXITED(status) ? WEXITSTATUS(status) : 1;
|
|
231
|
+
|
|
232
|
+
return NULL;
|
|
233
|
+
}
|