@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,449 @@
|
|
|
1
|
+
-- VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (lua/src/sekreto/plugins/json.lua)
|
|
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
|
+
-- sekreto's own JSON, because Lua has none.
|
|
5
|
+
--
|
|
6
|
+
-- Lua 5.4's whole standard library is basic, coroutine, package, string,
|
|
7
|
+
-- utf8, table, math, io, os and debug - so a JSON parser is written here
|
|
8
|
+
-- rather than depended on. Two properties the vendor payloads need and a
|
|
9
|
+
-- naive table would not give: object keys keep their INSERTION ORDER (an
|
|
10
|
+
-- AWS payload's field order is signed, so it cannot be re-ordered by a
|
|
11
|
+
-- hash table), and a parse FAILURE is distinguishable from the literal
|
|
12
|
+
-- `null` (fetchjson must tell "this text is not JSON" from "this text is
|
|
13
|
+
-- the JSON null", and Lua's `nil` cannot say both).
|
|
14
|
+
--
|
|
15
|
+
-- A port of typescript's JSON handling, which is canonical.
|
|
16
|
+
|
|
17
|
+
local M = {}
|
|
18
|
+
|
|
19
|
+
-- The JSON null. A Lua nil cannot live in a table and cannot be returned
|
|
20
|
+
-- distinguishably, so null is a sentinel of its own.
|
|
21
|
+
M.NULL = setmetatable({}, { __tostring = function() return 'null' end })
|
|
22
|
+
|
|
23
|
+
local ARRMT = { __sekretojson = 'arr' }
|
|
24
|
+
local OBJMT = { __sekretojson = 'obj' }
|
|
25
|
+
|
|
26
|
+
-- The recursion bound. A response body arrives before any trust check has
|
|
27
|
+
-- been made, so `[[[[[...` must fail rather than take the process down.
|
|
28
|
+
local MAXDEPTH = 128
|
|
29
|
+
|
|
30
|
+
--- A JSON array, from a Lua sequence.
|
|
31
|
+
function M.arr(items)
|
|
32
|
+
return setmetatable({ items = items or {} }, ARRMT)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
--- A JSON object, from a list of {key, value} pairs, in that order.
|
|
36
|
+
function M.obj(pairlist)
|
|
37
|
+
local keys = {}
|
|
38
|
+
local vals = {}
|
|
39
|
+
|
|
40
|
+
for _, pair in ipairs(pairlist or {}) do
|
|
41
|
+
if nil == vals[pair[1]] then
|
|
42
|
+
keys[#keys + 1] = pair[1]
|
|
43
|
+
end
|
|
44
|
+
vals[pair[1]] = pair[2]
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
return setmetatable({ keys = keys, vals = vals }, OBJMT)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
function M.isarr(val)
|
|
51
|
+
return 'table' == type(val) and ARRMT == getmetatable(val)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
function M.isobj(val)
|
|
55
|
+
return 'table' == type(val) and OBJMT == getmetatable(val)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
function M.isnull(val)
|
|
59
|
+
return M.NULL == val
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
--- Set one key on an object, keeping insertion order.
|
|
63
|
+
function M.set(object, key, value)
|
|
64
|
+
if nil == object.vals[key] then
|
|
65
|
+
object.keys[#object.keys + 1] = key
|
|
66
|
+
end
|
|
67
|
+
object.vals[key] = value
|
|
68
|
+
return object
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
--- Walk nested objects, stopping at the first missing step. Returns nil.
|
|
72
|
+
function M.dig(val, ...)
|
|
73
|
+
local at = val
|
|
74
|
+
|
|
75
|
+
for _, key in ipairs({ ... }) do
|
|
76
|
+
if not M.isobj(at) then
|
|
77
|
+
return nil
|
|
78
|
+
end
|
|
79
|
+
at = at.vals[key]
|
|
80
|
+
if nil == at then
|
|
81
|
+
return nil
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
return at
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
--- The value as a string, or nil for anything else.
|
|
89
|
+
function M.asstr(val)
|
|
90
|
+
return 'string' == type(val) and val or nil
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
--- The value as a number, or nil for anything else.
|
|
94
|
+
function M.asnum(val)
|
|
95
|
+
return 'number' == type(val) and val or nil
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
--- The value as an array's item list, or nil.
|
|
99
|
+
function M.asarr(val)
|
|
100
|
+
return M.isarr(val) and val.items or nil
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
--- The value as an object, or nil.
|
|
104
|
+
function M.asobj(val)
|
|
105
|
+
return M.isobj(val) and val or nil
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
--- Render a number the same way in every port: 5.0 prints as 5.
|
|
109
|
+
function M.numstr(val)
|
|
110
|
+
if val ~= val or math.huge == val or -math.huge == val then
|
|
111
|
+
return 'null'
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
if math.type(val) == 'integer' then
|
|
115
|
+
return string.format('%d', val)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
if val == math.floor(val) and math.abs(val) < 9007199254740992.0 then
|
|
119
|
+
return string.format('%d', math.tointeger(val) or val)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
return (string.format('%.17g', val))
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
--- Printable text, or nil. A JSON null yields nil, so a null field is a
|
|
126
|
+
--- miss rather than the string "null".
|
|
127
|
+
function M.text(val)
|
|
128
|
+
if nil == val or M.NULL == val then
|
|
129
|
+
return nil
|
|
130
|
+
end
|
|
131
|
+
if 'string' == type(val) then
|
|
132
|
+
return val
|
|
133
|
+
end
|
|
134
|
+
if 'number' == type(val) then
|
|
135
|
+
return M.numstr(val)
|
|
136
|
+
end
|
|
137
|
+
if 'boolean' == type(val) then
|
|
138
|
+
return val and 'true' or 'false'
|
|
139
|
+
end
|
|
140
|
+
return nil
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
--- Render a string as a JSON string literal.
|
|
144
|
+
function M.quote(text)
|
|
145
|
+
local out = { '"' }
|
|
146
|
+
|
|
147
|
+
for index = 1, #text do
|
|
148
|
+
local ch = text:sub(index, index)
|
|
149
|
+
local byte = ch:byte()
|
|
150
|
+
|
|
151
|
+
if '"' == ch then
|
|
152
|
+
out[#out + 1] = '\\"'
|
|
153
|
+
elseif '\\' == ch then
|
|
154
|
+
out[#out + 1] = '\\\\'
|
|
155
|
+
elseif '\n' == ch then
|
|
156
|
+
out[#out + 1] = '\\n'
|
|
157
|
+
elseif '\r' == ch then
|
|
158
|
+
out[#out + 1] = '\\r'
|
|
159
|
+
elseif '\t' == ch then
|
|
160
|
+
out[#out + 1] = '\\t'
|
|
161
|
+
elseif 0x20 > byte then
|
|
162
|
+
out[#out + 1] = string.format('\\u%04x', byte)
|
|
163
|
+
else
|
|
164
|
+
out[#out + 1] = ch
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
out[#out + 1] = '"'
|
|
169
|
+
return table.concat(out)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
--- Compact JSON text: no spaces, no newlines, keys in insertion order.
|
|
173
|
+
function M.stringify(val)
|
|
174
|
+
if nil == val or M.NULL == val then
|
|
175
|
+
return 'null'
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
local kind = type(val)
|
|
179
|
+
|
|
180
|
+
if 'boolean' == kind then
|
|
181
|
+
return val and 'true' or 'false'
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
if 'number' == kind then
|
|
185
|
+
return M.numstr(val)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
if 'string' == kind then
|
|
189
|
+
return M.quote(val)
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
if M.isarr(val) then
|
|
193
|
+
local parts = {}
|
|
194
|
+
for index, item in ipairs(val.items) do
|
|
195
|
+
parts[index] = M.stringify(item)
|
|
196
|
+
end
|
|
197
|
+
return '[' .. table.concat(parts, ',') .. ']'
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
if M.isobj(val) then
|
|
201
|
+
local parts = {}
|
|
202
|
+
for index, key in ipairs(val.keys) do
|
|
203
|
+
parts[index] = M.quote(key) .. ':' .. M.stringify(val.vals[key])
|
|
204
|
+
end
|
|
205
|
+
return '{' .. table.concat(parts, ',') .. '}'
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
return 'null'
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
-- ---- the parser ------------------------------------------------------
|
|
212
|
+
--
|
|
213
|
+
-- Every failure below raises inside a pcall that `parse` owns, so no error
|
|
214
|
+
-- ever escapes it: a malformed body is answered with nil, and the caller
|
|
215
|
+
-- decides whether that is a miss or a failure.
|
|
216
|
+
|
|
217
|
+
local parsevalue
|
|
218
|
+
|
|
219
|
+
local WS = { [' '] = true, ['\t'] = true, ['\n'] = true, ['\r'] = true }
|
|
220
|
+
|
|
221
|
+
local function skipws(text, pos)
|
|
222
|
+
local at = pos
|
|
223
|
+
while at <= #text and WS[text:sub(at, at)] do
|
|
224
|
+
at = at + 1
|
|
225
|
+
end
|
|
226
|
+
return at
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
local function bad(why)
|
|
230
|
+
error({ json = true, why = why }, 0)
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
local function parseword(text, pos, word, value)
|
|
234
|
+
if word ~= text:sub(pos, pos + #word - 1) then
|
|
235
|
+
bad('literal')
|
|
236
|
+
end
|
|
237
|
+
return value, pos + #word
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
local HEX = '0123456789abcdefABCDEF'
|
|
241
|
+
|
|
242
|
+
local function parsestring(text, pos)
|
|
243
|
+
if '"' ~= text:sub(pos, pos) then
|
|
244
|
+
bad('string')
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
local at = pos + 1
|
|
248
|
+
local out = {}
|
|
249
|
+
|
|
250
|
+
while at <= #text do
|
|
251
|
+
local ch = text:sub(at, at)
|
|
252
|
+
|
|
253
|
+
if '"' == ch then
|
|
254
|
+
return table.concat(out), at + 1
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
if '\\' ~= ch then
|
|
258
|
+
out[#out + 1] = ch
|
|
259
|
+
at = at + 1
|
|
260
|
+
else
|
|
261
|
+
local escape = text:sub(at + 1, at + 1)
|
|
262
|
+
at = at + 2
|
|
263
|
+
|
|
264
|
+
if '"' == escape then
|
|
265
|
+
out[#out + 1] = '"'
|
|
266
|
+
elseif '\\' == escape then
|
|
267
|
+
out[#out + 1] = '\\'
|
|
268
|
+
elseif '/' == escape then
|
|
269
|
+
out[#out + 1] = '/'
|
|
270
|
+
elseif 'b' == escape then
|
|
271
|
+
out[#out + 1] = '\b'
|
|
272
|
+
elseif 'f' == escape then
|
|
273
|
+
out[#out + 1] = '\f'
|
|
274
|
+
elseif 'n' == escape then
|
|
275
|
+
out[#out + 1] = '\n'
|
|
276
|
+
elseif 'r' == escape then
|
|
277
|
+
out[#out + 1] = '\r'
|
|
278
|
+
elseif 't' == escape then
|
|
279
|
+
out[#out + 1] = '\t'
|
|
280
|
+
elseif 'u' == escape then
|
|
281
|
+
local digits = text:sub(at, at + 3)
|
|
282
|
+
if 4 ~= #digits then
|
|
283
|
+
bad('escape')
|
|
284
|
+
end
|
|
285
|
+
for index = 1, 4 do
|
|
286
|
+
if nil == HEX:find(digits:sub(index, index), 1, true) then
|
|
287
|
+
bad('escape')
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
-- One UTF-16 code unit, appended as UTF-8. No surrogate-pair
|
|
291
|
+
-- recombination, in this port or any other.
|
|
292
|
+
out[#out + 1] = utf8.char(tonumber(digits, 16))
|
|
293
|
+
at = at + 4
|
|
294
|
+
else
|
|
295
|
+
bad('escape')
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
bad('string')
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
local function parseobj(text, pos, depth)
|
|
304
|
+
local at = skipws(text, pos + 1)
|
|
305
|
+
local object = M.obj({})
|
|
306
|
+
|
|
307
|
+
if '}' == text:sub(at, at) then
|
|
308
|
+
return object, at + 1
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
while true do
|
|
312
|
+
at = skipws(text, at)
|
|
313
|
+
|
|
314
|
+
local key
|
|
315
|
+
key, at = parsestring(text, at)
|
|
316
|
+
|
|
317
|
+
at = skipws(text, at)
|
|
318
|
+
if ':' ~= text:sub(at, at) then
|
|
319
|
+
bad('object')
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
local value
|
|
323
|
+
value, at = parsevalue(text, at + 1, depth + 1)
|
|
324
|
+
|
|
325
|
+
M.set(object, key, value)
|
|
326
|
+
|
|
327
|
+
at = skipws(text, at)
|
|
328
|
+
local ch = text:sub(at, at)
|
|
329
|
+
|
|
330
|
+
if '}' == ch then
|
|
331
|
+
return object, at + 1
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
if ',' ~= ch then
|
|
335
|
+
bad('object')
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
at = at + 1
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
local function parsearr(text, pos, depth)
|
|
343
|
+
local at = skipws(text, pos + 1)
|
|
344
|
+
local items = {}
|
|
345
|
+
|
|
346
|
+
if ']' == text:sub(at, at) then
|
|
347
|
+
return M.arr(items), at + 1
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
while true do
|
|
351
|
+
local value
|
|
352
|
+
value, at = parsevalue(text, at, depth + 1)
|
|
353
|
+
items[#items + 1] = value
|
|
354
|
+
|
|
355
|
+
at = skipws(text, at)
|
|
356
|
+
local ch = text:sub(at, at)
|
|
357
|
+
|
|
358
|
+
if ']' == ch then
|
|
359
|
+
return M.arr(items), at + 1
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
if ',' ~= ch then
|
|
363
|
+
bad('array')
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
at = at + 1
|
|
367
|
+
end
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
local NUMCHARS = '0123456789+-.eE'
|
|
371
|
+
|
|
372
|
+
local function parsenumber(text, pos)
|
|
373
|
+
local at = pos
|
|
374
|
+
|
|
375
|
+
while at <= #text and nil ~= NUMCHARS:find(text:sub(at, at), 1, true) do
|
|
376
|
+
at = at + 1
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
local value = tonumber(text:sub(pos, at - 1))
|
|
380
|
+
|
|
381
|
+
-- 1e999 parses to infinity, which JSON has no literal for and which
|
|
382
|
+
-- would later blow up a token-expiry computation.
|
|
383
|
+
if nil == value or value ~= value or math.huge == value or -math.huge == value then
|
|
384
|
+
bad('number')
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
return value, at
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
parsevalue = function(text, pos, depth)
|
|
391
|
+
if MAXDEPTH < depth then
|
|
392
|
+
bad('depth')
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
local at = skipws(text, pos)
|
|
396
|
+
local ch = text:sub(at, at)
|
|
397
|
+
|
|
398
|
+
if '' == ch then
|
|
399
|
+
bad('eof')
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
if '{' == ch then
|
|
403
|
+
return parseobj(text, at, depth)
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
if '[' == ch then
|
|
407
|
+
return parsearr(text, at, depth)
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
if '"' == ch then
|
|
411
|
+
return parsestring(text, at)
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
if 't' == ch then
|
|
415
|
+
return parseword(text, at, 'true', true)
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
if 'f' == ch then
|
|
419
|
+
return parseword(text, at, 'false', false)
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
if 'n' == ch then
|
|
423
|
+
return parseword(text, at, 'null', M.NULL)
|
|
424
|
+
end
|
|
425
|
+
|
|
426
|
+
return parsenumber(text, at)
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
--- Parse JSON text. Returns the value, or nil when the text is not JSON.
|
|
430
|
+
--- The literal `null` parses to M.NULL, which is NOT nil - that is the
|
|
431
|
+
--- whole reason the sentinel exists.
|
|
432
|
+
function M.parse(text)
|
|
433
|
+
if 'string' ~= type(text) or '' == text then
|
|
434
|
+
return nil
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
local ok, value, at = pcall(parsevalue, text, 1, 1)
|
|
438
|
+
if not ok then
|
|
439
|
+
return nil
|
|
440
|
+
end
|
|
441
|
+
|
|
442
|
+
if #text >= skipws(text, at) then
|
|
443
|
+
return nil
|
|
444
|
+
end
|
|
445
|
+
|
|
446
|
+
return value
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
return M
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
-- VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (lua/src/sekreto/plugins/net.lua)
|
|
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
|
+
-- The bridge to the transport helper - a PLUGIN module, never the core.
|
|
5
|
+
--
|
|
6
|
+
-- Everything that opens a socket or starts a child process goes through
|
|
7
|
+
-- this file, so a chain of built-in kinds never requires it and never
|
|
8
|
+
-- needs native/sekretonet.c to have been built at all.
|
|
9
|
+
--
|
|
10
|
+
-- Lua cannot open a socket, and `io.popen` is unidirectional - so a
|
|
11
|
+
-- request cannot be written to a child and its answer read back through
|
|
12
|
+
-- the same handle. The request is therefore handed over in a file and the
|
|
13
|
+
-- answer comes back on the child's stdout.
|
|
14
|
+
--
|
|
15
|
+
-- The file, not the command line, because a vault token rides in the
|
|
16
|
+
-- request headers and the process table is world readable. It is created
|
|
17
|
+
-- by `os.tmpname`, which uses `mkstemp` and so is already 0600, and
|
|
18
|
+
-- native/sekretonet.c unlinks it before reading a byte of it.
|
|
19
|
+
--
|
|
20
|
+
-- Nothing about HTTP is known here. This module moves bytes, exactly as
|
|
21
|
+
-- the helper does - and it runs children, which is the other half of what
|
|
22
|
+
-- the helper is for.
|
|
23
|
+
|
|
24
|
+
local err = require('feature.secrets.sekreto.err')
|
|
25
|
+
local name = require('feature.secrets.sekreto.name')
|
|
26
|
+
|
|
27
|
+
local M = {}
|
|
28
|
+
|
|
29
|
+
--- Where the helper binary is, worked out from this file's own path
|
|
30
|
+
--- rather than from the working directory: test/checks.sh runs the CLI
|
|
31
|
+
--- from an EMPTY directory with the environment wiped, so nothing in the
|
|
32
|
+
--- process's surroundings can be relied on to find it.
|
|
33
|
+
local function helperpath()
|
|
34
|
+
local source = debug.getinfo(1, 'S').source
|
|
35
|
+
|
|
36
|
+
if '@' == source:sub(1, 1) then
|
|
37
|
+
local dir = source:sub(2):match('^(.*)/feature/secrets/sekreto/plugins/net%.lua$')
|
|
38
|
+
if nil ~= dir then
|
|
39
|
+
return dir .. '/feature/secrets/native/sekreto-net'
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
return 'feature/secrets/native/sekreto-net'
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
M.HELPER = helperpath()
|
|
47
|
+
|
|
48
|
+
--- A shell-safe single-quoted word. `io.popen` goes through `/bin/sh`,
|
|
49
|
+
--- and the only two words this module ever passes it are paths it made
|
|
50
|
+
--- itself - but a path is checked rather than assumed.
|
|
51
|
+
local function quotepath(path)
|
|
52
|
+
if nil ~= path:find("'", 1, true) or nil ~= path:find('\n', 1, true) then
|
|
53
|
+
err.fail('sekreto: transport helper path is not usable: ' .. path)
|
|
54
|
+
end
|
|
55
|
+
return "'" .. path .. "'"
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
--- One length-prefixed field.
|
|
59
|
+
local function field(name, value)
|
|
60
|
+
return name .. ' ' .. #value .. '\n' .. value .. '\n'
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
--- Run the helper over one request. Returns the answer verb and payload.
|
|
64
|
+
local function call(fields)
|
|
65
|
+
local path = os.tmpname()
|
|
66
|
+
|
|
67
|
+
local handle = io.open(path, 'wb')
|
|
68
|
+
if nil == handle then
|
|
69
|
+
os.remove(path)
|
|
70
|
+
err.fail('sekreto: cannot write a transport request')
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
handle:write(table.concat(fields))
|
|
74
|
+
handle:close()
|
|
75
|
+
|
|
76
|
+
local pipe = io.popen(quotepath(M.HELPER) .. ' ' .. quotepath(path) .. ' 2>/dev/null', 'r')
|
|
77
|
+
if nil == pipe then
|
|
78
|
+
os.remove(path)
|
|
79
|
+
return 'ERR', 'cannot start the transport helper'
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
local answer = pipe:read('a') or ''
|
|
83
|
+
pipe:close()
|
|
84
|
+
|
|
85
|
+
-- The helper unlinks it; this is the backstop for the case where the
|
|
86
|
+
-- helper never ran at all.
|
|
87
|
+
os.remove(path)
|
|
88
|
+
|
|
89
|
+
local stop = answer:find('\n', 1, true)
|
|
90
|
+
if nil == stop then
|
|
91
|
+
return 'ERR',
|
|
92
|
+
'the transport helper did not answer (is ' .. M.HELPER .. ' built?)'
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
local head = answer:sub(1, stop - 1)
|
|
96
|
+
local rest = answer:sub(stop + 1)
|
|
97
|
+
|
|
98
|
+
local verb = head:match('^(%u+)')
|
|
99
|
+
|
|
100
|
+
if 'ERR' == verb then
|
|
101
|
+
return 'ERR', rest
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
if 'OK' == verb then
|
|
105
|
+
return 'OK', rest
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
if 'EXEC' == verb then
|
|
109
|
+
local code, outlen, errlen = head:match('^EXEC (%-?%d+) (%d+) (%d+)$')
|
|
110
|
+
if nil == code then
|
|
111
|
+
return 'ERR', 'the transport helper answered incoherently'
|
|
112
|
+
end
|
|
113
|
+
outlen = tonumber(outlen)
|
|
114
|
+
errlen = tonumber(errlen)
|
|
115
|
+
return 'EXEC', {
|
|
116
|
+
status = tonumber(code),
|
|
117
|
+
out = rest:sub(1, outlen),
|
|
118
|
+
why = rest:sub(outlen + 1, outlen + errlen),
|
|
119
|
+
}
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
return 'ERR', 'the transport helper answered incoherently'
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
--- Connect, send `payload`, read the answer to end of stream.
|
|
126
|
+
---
|
|
127
|
+
--- Returns the response bytes, or nil plus a reason. A reason is always a
|
|
128
|
+
--- failure - never a miss.
|
|
129
|
+
function M.fetch(host, port, usetls, payload, timeoutms, maxbody)
|
|
130
|
+
local verb, got = call({
|
|
131
|
+
field('mode', 'fetch'),
|
|
132
|
+
field('host', host),
|
|
133
|
+
field('port', tostring(port)),
|
|
134
|
+
field('tls', usetls and '1' or '0'),
|
|
135
|
+
field('timeout', tostring(timeoutms)),
|
|
136
|
+
field('maxbody', tostring(maxbody)),
|
|
137
|
+
field('data', payload),
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
if 'OK' ~= verb then
|
|
141
|
+
return nil, ('table' == type(got)) and 'transport failure' or got
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
return got
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
--- Run a child to completion and collect both its streams separately.
|
|
148
|
+
---
|
|
149
|
+
--- `argv` is an array and never a shell string. `overrides` is a list of
|
|
150
|
+
--- `NAME=value` entries applied ON TOP of the inherited environment: Lua
|
|
151
|
+
--- cannot enumerate its own environment (`os.getenv` reads one name), so
|
|
152
|
+
--- building a complete one here would silently drop every variable this
|
|
153
|
+
--- port did not think to name, and boru reads several of its own.
|
|
154
|
+
---
|
|
155
|
+
--- Returns {status, out, why}, or nil plus a reason when the child could
|
|
156
|
+
--- not be started at all.
|
|
157
|
+
function M.exec(argv, overrides)
|
|
158
|
+
local fields = { field('mode', 'exec') }
|
|
159
|
+
|
|
160
|
+
for _, arg in ipairs(argv) do
|
|
161
|
+
fields[#fields + 1] = field('arg', arg)
|
|
162
|
+
end
|
|
163
|
+
for _, entry in ipairs(overrides or {}) do
|
|
164
|
+
fields[#fields + 1] = field('setenv', entry)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
local verb, got = call(fields)
|
|
168
|
+
|
|
169
|
+
if 'EXEC' ~= verb then
|
|
170
|
+
-- The helper reports a failed exec through a close-on-exec status
|
|
171
|
+
-- pipe, so "could not be started" is never guessed from an exit code
|
|
172
|
+
-- a real child is equally free to produce. It becomes
|
|
173
|
+
-- `sekreto: cannot run <command>: <err>`, which is a failure and
|
|
174
|
+
-- never a miss.
|
|
175
|
+
local reason = ('table' == type(got)) and 'transport failure' or got
|
|
176
|
+
return nil, (reason:match('^EXECFAIL (.*)$') or reason)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
return got
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
--- What a finished child process left behind, with a failure to start it
|
|
183
|
+
--- raised rather than returned.
|
|
184
|
+
---
|
|
185
|
+
--- Both streams are drained concurrently and stdin is closed; see
|
|
186
|
+
--- native/sekretonet.c, which does the draining. Argv is an array and
|
|
187
|
+
--- never a shell string, and no secret is ever put on a command line.
|
|
188
|
+
function M.runcmd(argv, overrides, command)
|
|
189
|
+
local ran, why = M.exec(argv, overrides)
|
|
190
|
+
|
|
191
|
+
if nil == ran then
|
|
192
|
+
err.fail('sekreto: cannot run ' .. command .. ': ' .. why)
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
return ran.out, name.trim(ran.why), ran.status
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
return M
|