@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,97 @@
|
|
|
1
|
+
(* VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (ocaml/plugins/runcmd.ml) *)
|
|
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 store's own CLI, and collecting both its streams.
|
|
5
|
+
|
|
6
|
+
Two of the ten plugin kinds read their store through a child process -
|
|
7
|
+
`boru` and `secretspec` - and a child process is one of the three things
|
|
8
|
+
that keeps a kind out of the core, beside a socket and a signature. *)
|
|
9
|
+
|
|
10
|
+
open Secret
|
|
11
|
+
|
|
12
|
+
type ran = { out : string; why : string; status : int }
|
|
13
|
+
|
|
14
|
+
(* Where a command lives, or nowhere.
|
|
15
|
+
|
|
16
|
+
Resolved before forking: OCaml's `create_process` execs in the child, so
|
|
17
|
+
a command that is not there makes the child exit 127 with no error in the
|
|
18
|
+
parent - which is indistinguishable from a command that ran and failed.
|
|
19
|
+
"cannot run" and "the store said no" are different answers. *)
|
|
20
|
+
let findexe (command : string) : string option =
|
|
21
|
+
let executable path = match Unix.access path [ Unix.X_OK ] with () -> true | exception _ -> false in
|
|
22
|
+
|
|
23
|
+
if String.contains command '/' then if executable command then Some command else None
|
|
24
|
+
else
|
|
25
|
+
let path = match Sys.getenv_opt "PATH" with Some value -> value | None -> "/usr/bin:/bin" in
|
|
26
|
+
let rec walk = function
|
|
27
|
+
| [] -> None
|
|
28
|
+
| dir :: rest ->
|
|
29
|
+
let cand = (if "" = dir then "." else dir) ^ "/" ^ command in
|
|
30
|
+
if executable cand then Some cand else walk rest
|
|
31
|
+
in
|
|
32
|
+
walk (String.split_on_char ':' path)
|
|
33
|
+
|
|
34
|
+
(* Run a child to completion and collect both its streams.
|
|
35
|
+
|
|
36
|
+
The two streams are drained CONCURRENTLY, through one select loop.
|
|
37
|
+
Reading stdout to EOF and only then reading stderr deadlocks the moment
|
|
38
|
+
the child writes more than one pipe buffer (64 KiB on Linux) to stderr:
|
|
39
|
+
the parent is blocked waiting for stdout, the child is blocked waiting
|
|
40
|
+
for room on stderr, and neither can move. Nothing here sets a timeout, so
|
|
41
|
+
that hang is permanent - `get` simply never returns. secretspec's
|
|
42
|
+
diagnostics are box-drawn and reach that size easily.
|
|
43
|
+
|
|
44
|
+
The child's stdin is closed rather than left open on a pipe nobody writes
|
|
45
|
+
to, so a CLI that reads it - one prompting for a passphrase when its
|
|
46
|
+
environment variable is absent - sees EOF and gives up instead of waiting
|
|
47
|
+
forever.
|
|
48
|
+
|
|
49
|
+
Arguments go as an array, never through a shell, and no secret is ever
|
|
50
|
+
put on a command line where the process table would publish it. *)
|
|
51
|
+
let runcmd (argv : string list) (env : string array) (command : string) : ran =
|
|
52
|
+
let exe =
|
|
53
|
+
match findexe command with
|
|
54
|
+
| Some path -> path
|
|
55
|
+
| None -> fail ("sekreto: cannot run " ^ command ^ ": No such file or directory")
|
|
56
|
+
in
|
|
57
|
+
|
|
58
|
+
let outr, outw = Unix.pipe () in
|
|
59
|
+
let errr, errw = Unix.pipe () in
|
|
60
|
+
let inr, inw = Unix.pipe () in
|
|
61
|
+
Unix.close inw;
|
|
62
|
+
|
|
63
|
+
let pid =
|
|
64
|
+
match Unix.create_process_env exe (Array.of_list argv) env inr outw errw with
|
|
65
|
+
| pid -> pid
|
|
66
|
+
| exception Unix.Unix_error (err, _, _) ->
|
|
67
|
+
List.iter (fun fd -> try Unix.close fd with _ -> ()) [ inr; outr; outw; errr; errw ];
|
|
68
|
+
fail ("sekreto: cannot run " ^ command ^ ": " ^ Unix.error_message err)
|
|
69
|
+
in
|
|
70
|
+
|
|
71
|
+
Unix.close inr;
|
|
72
|
+
Unix.close outw;
|
|
73
|
+
Unix.close errw;
|
|
74
|
+
|
|
75
|
+
let obuf = Buffer.create 4096 and ebuf = Buffer.create 4096 in
|
|
76
|
+
let live = ref [ outr; errr ] in
|
|
77
|
+
let chunk = Bytes.create 65536 in
|
|
78
|
+
|
|
79
|
+
while [] <> !live do
|
|
80
|
+
let ready, _, _ = Unix.select !live [] [] (-1.0) in
|
|
81
|
+
List.iter
|
|
82
|
+
(fun fd ->
|
|
83
|
+
let got = try Unix.read fd chunk 0 65536 with Unix.Unix_error _ -> 0 in
|
|
84
|
+
if 0 = got then begin
|
|
85
|
+
(try Unix.close fd with _ -> ());
|
|
86
|
+
live := List.filter (fun other -> other <> fd) !live
|
|
87
|
+
end
|
|
88
|
+
else Buffer.add_subbytes (if fd = outr then obuf else ebuf) chunk 0 got)
|
|
89
|
+
ready
|
|
90
|
+
done;
|
|
91
|
+
|
|
92
|
+
let status = match snd (Unix.waitpid [] pid) with
|
|
93
|
+
| Unix.WEXITED code -> code
|
|
94
|
+
| Unix.WSIGNALED code | Unix.WSTOPPED code -> 128 + code
|
|
95
|
+
in
|
|
96
|
+
|
|
97
|
+
{ out = Buffer.contents obuf; why = trim (Buffer.contents ebuf); status }
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
(* VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (ocaml/plugins/secretspec.ml) *)
|
|
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 `secretspec` provider kind, as a voxgig/plugin definition.
|
|
5
|
+
|
|
6
|
+
SecretSpec read through its own CLI - a child process, which is one of
|
|
7
|
+
the three things that keeps a kind out of the core.
|
|
8
|
+
|
|
9
|
+
A port of typescript/plugins/secretspec.ts, which is canonical. *)
|
|
10
|
+
|
|
11
|
+
open Secret
|
|
12
|
+
open Provider
|
|
13
|
+
open Runcmd
|
|
14
|
+
|
|
15
|
+
(* Does this SecretSpec failure mean "no such secret" rather than "I could
|
|
16
|
+
not answer"?
|
|
17
|
+
|
|
18
|
+
MATCHED ON THE WHOLE PHRASE, NOT ON "not found". SecretSpec says
|
|
19
|
+
`Secret 'API_TOKEN' not found` for both a name it does not declare and
|
|
20
|
+
one declared with no value, and both are misses. It also says
|
|
21
|
+
`Provider backend 'keyring' not found`, which is a store that could not
|
|
22
|
+
answer at all - and reading that as a miss is the worst failure this
|
|
23
|
+
library has. The key is required to appear, so the two cannot be
|
|
24
|
+
confused. *)
|
|
25
|
+
let secretspecmiss (why : string) (key : string) : bool =
|
|
26
|
+
None <> findsub why ("Secret '" ^ key ^ "' not found")
|
|
27
|
+
|
|
28
|
+
(* SecretSpec (https://secretspec.dev), read through its CLI.
|
|
29
|
+
|
|
30
|
+
`backend` selects one of SecretSpec's own backends (`--provider`) and is
|
|
31
|
+
called `backend` here only because `provider` already means something
|
|
32
|
+
else in this library.
|
|
33
|
+
|
|
34
|
+
A reason is required, not optional: SecretSpec records every read in an
|
|
35
|
+
audit log and refuses to read at all without one. *)
|
|
36
|
+
let secretspec_provider (commandgiven : string) (file : string) (profile : string)
|
|
37
|
+
(backend : string) (reason : string) (prefix : string) : provider =
|
|
38
|
+
let command = if "" = commandgiven then "secretspec" else commandgiven in
|
|
39
|
+
|
|
40
|
+
{
|
|
41
|
+
lookup =
|
|
42
|
+
(fun name ->
|
|
43
|
+
let key = envkey ~prefix name in
|
|
44
|
+
|
|
45
|
+
(* `--file` before the subcommand, `--reason` always sent. *)
|
|
46
|
+
let argv =
|
|
47
|
+
[ command ]
|
|
48
|
+
@ (if "" = file then [] else [ "--file"; file ])
|
|
49
|
+
@ [ "get"; key ]
|
|
50
|
+
@ (if "" = backend then [] else [ "--provider"; backend ])
|
|
51
|
+
@ (if "" = profile then [] else [ "--profile"; profile ])
|
|
52
|
+
@ [ "--reason"; firstof [ reason; "sekreto" ] ]
|
|
53
|
+
in
|
|
54
|
+
|
|
55
|
+
let ran = runcmd argv (Unix.environment ()) command in
|
|
56
|
+
|
|
57
|
+
if 0 = ran.status then Some (dropsuffix ran.out "\n")
|
|
58
|
+
else if secretspecmiss ran.why key then None
|
|
59
|
+
else
|
|
60
|
+
fail
|
|
61
|
+
("sekreto: secretspec error: "
|
|
62
|
+
^ if "" = ran.why then "exit " ^ string_of_int ran.status else ran.why));
|
|
63
|
+
describe = (fun () -> if "" = backend then "secretspec" else "secretspec:" ^ backend);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
let plugin () : Defs.definition =
|
|
67
|
+
providerplugin "secretspec" (fun spec ->
|
|
68
|
+
secretspec_provider spec.command spec.file spec.profile spec.backend spec.reason spec.prefix)
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
(* VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (ocaml/plugins/sigv4.ml) *)
|
|
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
|
+
(* AWS Signature Version 4, hand-rolled.
|
|
5
|
+
|
|
6
|
+
The AWS providers need exactly one thing from the AWS SDK - request
|
|
7
|
+
signing - and taking the SDK for it would break the no-dependency rule
|
|
8
|
+
that keeps the ports honest. SigV4 is a stable, published algorithm built
|
|
9
|
+
from HMAC-SHA256, which plugins/crypto.ml carries.
|
|
10
|
+
|
|
11
|
+
`sigv4` is pure: the caller passes the timestamp, so the same input
|
|
12
|
+
yields the same signature everywhere. That is what lets the shared spec
|
|
13
|
+
carry known-answer cases that all ports must reproduce bit for bit, and
|
|
14
|
+
lets the integration mock recompute the signature server-side. Nothing
|
|
15
|
+
here samples the clock.
|
|
16
|
+
|
|
17
|
+
A port of typescript/src/Sigv4.ts, which is canonical. *)
|
|
18
|
+
|
|
19
|
+
open Secret
|
|
20
|
+
|
|
21
|
+
(* One request to sign - the same declarative shape the shared spec uses.
|
|
22
|
+
`datetime` is `YYYYMMDDTHHMMSSZ`, and it is the caller's. *)
|
|
23
|
+
type signing = {
|
|
24
|
+
smethod : string;
|
|
25
|
+
url : string;
|
|
26
|
+
service : string;
|
|
27
|
+
region : string;
|
|
28
|
+
keyid : string;
|
|
29
|
+
secret : string;
|
|
30
|
+
datetime : string;
|
|
31
|
+
headers : (string * string) list;
|
|
32
|
+
body : string;
|
|
33
|
+
session : string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let nosigning =
|
|
37
|
+
{
|
|
38
|
+
smethod = "";
|
|
39
|
+
url = "";
|
|
40
|
+
service = "";
|
|
41
|
+
region = "";
|
|
42
|
+
keyid = "";
|
|
43
|
+
secret = "";
|
|
44
|
+
datetime = "";
|
|
45
|
+
headers = [];
|
|
46
|
+
body = "";
|
|
47
|
+
session = "";
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
(* RFC 3986 escaping, which is stricter than the usual URL encoder: AWS
|
|
51
|
+
wants everything but the unreserved set escaped, byte by byte over UTF-8,
|
|
52
|
+
with UPPERCASE hex. `!'()*` are escaped here and are not by the encoders
|
|
53
|
+
most standard libraries offer. *)
|
|
54
|
+
let uriescape (text : string) : string =
|
|
55
|
+
let out = Buffer.create (String.length text) in
|
|
56
|
+
String.iter
|
|
57
|
+
(fun ch ->
|
|
58
|
+
let code = Char.code ch in
|
|
59
|
+
if
|
|
60
|
+
('A' <= ch && ch <= 'Z')
|
|
61
|
+
|| ('a' <= ch && ch <= 'z')
|
|
62
|
+
|| ('0' <= ch && ch <= '9')
|
|
63
|
+
|| '-' = ch || '_' = ch || '.' = ch || '~' = ch
|
|
64
|
+
then Buffer.add_char out ch
|
|
65
|
+
else Buffer.add_string out (Printf.sprintf "%%%02X" code))
|
|
66
|
+
text;
|
|
67
|
+
Buffer.contents out
|
|
68
|
+
|
|
69
|
+
let hexvalue (ch : char) : int option =
|
|
70
|
+
match ch with
|
|
71
|
+
| '0' .. '9' -> Some (Char.code ch - Char.code '0')
|
|
72
|
+
| 'a' .. 'f' -> Some (Char.code ch - Char.code 'a' + 10)
|
|
73
|
+
| 'A' .. 'F' -> Some (Char.code ch - Char.code 'A' + 10)
|
|
74
|
+
| _ -> None
|
|
75
|
+
|
|
76
|
+
(* Percent-decode, and nothing else: `+` stays `+`, as on the wire, and a
|
|
77
|
+
malformed escape is kept literally. *)
|
|
78
|
+
let uridecode (text : string) : string =
|
|
79
|
+
let out = Buffer.create (String.length text) in
|
|
80
|
+
let len = String.length text in
|
|
81
|
+
let index = ref 0 in
|
|
82
|
+
|
|
83
|
+
while !index < len do
|
|
84
|
+
let taken = ref false in
|
|
85
|
+
|
|
86
|
+
if '%' = text.[!index] && !index + 2 < len then begin
|
|
87
|
+
match (hexvalue text.[!index + 1], hexvalue text.[!index + 2]) with
|
|
88
|
+
| Some high, Some low ->
|
|
89
|
+
Buffer.add_char out (Char.chr ((high * 16) + low));
|
|
90
|
+
index := !index + 3;
|
|
91
|
+
taken := true
|
|
92
|
+
| _ -> ()
|
|
93
|
+
end;
|
|
94
|
+
|
|
95
|
+
if not !taken then begin
|
|
96
|
+
Buffer.add_char out text.[!index];
|
|
97
|
+
incr index
|
|
98
|
+
end
|
|
99
|
+
done;
|
|
100
|
+
|
|
101
|
+
Buffer.contents out
|
|
102
|
+
|
|
103
|
+
(* Split a query into pairs on `&`, then each on its FIRST `=`. A pair with
|
|
104
|
+
no `=` keeps an empty value and is still emitted with one. *)
|
|
105
|
+
let canonicalquery (query : string) : string =
|
|
106
|
+
if "" = query then ""
|
|
107
|
+
else
|
|
108
|
+
let pairs =
|
|
109
|
+
List.map
|
|
110
|
+
(fun pair ->
|
|
111
|
+
match String.index_opt pair '=' with
|
|
112
|
+
| None -> (uriescape (uridecode pair), "")
|
|
113
|
+
| Some eq ->
|
|
114
|
+
( uriescape (uridecode (String.sub pair 0 eq)),
|
|
115
|
+
uriescape (uridecode (String.sub pair (eq + 1) (String.length pair - eq - 1))) ))
|
|
116
|
+
(String.split_on_char '&' query)
|
|
117
|
+
in
|
|
118
|
+
let sorted =
|
|
119
|
+
List.stable_sort
|
|
120
|
+
(fun (lk, lv) (rk, rv) -> if lk = rk then compare lv rv else compare lk rk)
|
|
121
|
+
pairs
|
|
122
|
+
in
|
|
123
|
+
String.concat "&" (List.map (fun (key, value) -> key ^ "=" ^ value) sorted)
|
|
124
|
+
|
|
125
|
+
(* The url, hand-split into the four parts signing needs.
|
|
126
|
+
|
|
127
|
+
Hand-split, not handed to a URL type: twelve URL parsers disagree about
|
|
128
|
+
malformed input, and the signature covers `host` and the raw path, so a
|
|
129
|
+
parser that normalises either of them signs something the server will not
|
|
130
|
+
recompute. *)
|
|
131
|
+
type parts = { scheme : string; authority : string; path : string; query : string }
|
|
132
|
+
|
|
133
|
+
let urlparts (url : string) : parts =
|
|
134
|
+
match findsub url "://" with
|
|
135
|
+
| None -> { scheme = ""; authority = ""; path = url; query = "" }
|
|
136
|
+
| Some mark ->
|
|
137
|
+
let scheme = String.sub url 0 mark in
|
|
138
|
+
let rest = String.sub url (mark + 3) (String.length url - mark - 3) in
|
|
139
|
+
let stop = match splitfirst rest "/?#" with Some at -> at | None -> String.length rest in
|
|
140
|
+
let authority = String.sub rest 0 stop in
|
|
141
|
+
let tail = String.sub rest stop (String.length rest - stop) in
|
|
142
|
+
let path, query =
|
|
143
|
+
match String.index_opt tail '?' with
|
|
144
|
+
| None -> (tail, "")
|
|
145
|
+
| Some at -> (String.sub tail 0 at, String.sub tail (at + 1) (String.length tail - at - 1))
|
|
146
|
+
in
|
|
147
|
+
let path = match String.index_opt path '#' with None -> path | Some at -> String.sub path 0 at in
|
|
148
|
+
{ scheme; authority; path = (if "" = path then "/" else path); query }
|
|
149
|
+
|
|
150
|
+
(* The `host` header as the canonical form wants it: the hostname
|
|
151
|
+
lowercased, any userinfo stripped, and the port appended ONLY when it is
|
|
152
|
+
not the scheme's default - `:443` on https is not what a URL normalises
|
|
153
|
+
to and not what the service recomputes. *)
|
|
154
|
+
let hostheader (scheme : string) (authority : string) : string =
|
|
155
|
+
let bare =
|
|
156
|
+
match String.rindex_opt authority '@' with
|
|
157
|
+
| None -> authority
|
|
158
|
+
| Some at -> String.sub authority (at + 1) (String.length authority - at - 1)
|
|
159
|
+
in
|
|
160
|
+
|
|
161
|
+
let host, port =
|
|
162
|
+
if String.length bare > 0 && '[' = bare.[0] then
|
|
163
|
+
match String.index_opt bare ']' with
|
|
164
|
+
| None -> (bare, "")
|
|
165
|
+
| Some close ->
|
|
166
|
+
let head = String.sub bare 0 (close + 1) in
|
|
167
|
+
let tail = String.sub bare (close + 1) (String.length bare - close - 1) in
|
|
168
|
+
(head, if String.length tail > 1 && ':' = tail.[0] then String.sub tail 1 (String.length tail - 1) else "")
|
|
169
|
+
else
|
|
170
|
+
match String.rindex_opt bare ':' with
|
|
171
|
+
| None -> (bare, "")
|
|
172
|
+
| Some at ->
|
|
173
|
+
( String.sub bare 0 at,
|
|
174
|
+
String.sub bare (at + 1) (String.length bare - at - 1) )
|
|
175
|
+
in
|
|
176
|
+
|
|
177
|
+
let host = String.lowercase_ascii host in
|
|
178
|
+
let default = if "https" = scheme then "443" else "80" in
|
|
179
|
+
|
|
180
|
+
if "" = port || port = default then host else host ^ ":" ^ port
|
|
181
|
+
|
|
182
|
+
(* Collapse every internal whitespace run - spaces AND tabs - to one space,
|
|
183
|
+
after trimming. AWS folds header values before signing, so `a b\tc`
|
|
184
|
+
must sign as `a b c` or the service refuses the request. *)
|
|
185
|
+
let foldvalue (value : string) : string =
|
|
186
|
+
let trimmed = trim value in
|
|
187
|
+
let out = Buffer.create (String.length trimmed) in
|
|
188
|
+
let inrun = ref false in
|
|
189
|
+
String.iter
|
|
190
|
+
(fun ch ->
|
|
191
|
+
if ' ' = ch || '\t' = ch || '\n' = ch || '\r' = ch then inrun := true
|
|
192
|
+
else begin
|
|
193
|
+
if !inrun then Buffer.add_char out ' ';
|
|
194
|
+
inrun := false;
|
|
195
|
+
Buffer.add_char out ch
|
|
196
|
+
end)
|
|
197
|
+
trimmed;
|
|
198
|
+
Buffer.contents out
|
|
199
|
+
|
|
200
|
+
(* Sign one request. Answers the headers to attach: authorization,
|
|
201
|
+
x-amz-date, and x-amz-security-token when a session token was given, in
|
|
202
|
+
that order - the spec compares the result as a whole JSON object, so the
|
|
203
|
+
order is contract. *)
|
|
204
|
+
let sigv4 (input : signing) : (string * string) list =
|
|
205
|
+
let parts = urlparts input.url in
|
|
206
|
+
let date = String.sub input.datetime 0 (min 8 (String.length input.datetime)) in
|
|
207
|
+
|
|
208
|
+
(* The caller's headers first, then host, x-amz-date and the session
|
|
209
|
+
token, so that those three win over anything the caller passed. *)
|
|
210
|
+
let headers = ref [] in
|
|
211
|
+
List.iter
|
|
212
|
+
(fun (key, value) -> headers := assocset !headers (String.lowercase_ascii key) (foldvalue value))
|
|
213
|
+
input.headers;
|
|
214
|
+
headers := assocset !headers "host" (hostheader parts.scheme parts.authority);
|
|
215
|
+
headers := assocset !headers "x-amz-date" input.datetime;
|
|
216
|
+
if "" <> input.session then headers := assocset !headers "x-amz-security-token" input.session;
|
|
217
|
+
|
|
218
|
+
let sorted = List.stable_sort (fun (l, _) (r, _) -> compare l r) !headers in
|
|
219
|
+
|
|
220
|
+
let canonicalheaders =
|
|
221
|
+
String.concat "" (List.map (fun (key, value) -> key ^ ":" ^ value ^ "\n") sorted)
|
|
222
|
+
in
|
|
223
|
+
let signedheaders = String.concat ";" (List.map fst sorted) in
|
|
224
|
+
|
|
225
|
+
let canonicalrequest =
|
|
226
|
+
String.concat "\n"
|
|
227
|
+
[
|
|
228
|
+
String.uppercase_ascii input.smethod;
|
|
229
|
+
parts.path;
|
|
230
|
+
canonicalquery parts.query;
|
|
231
|
+
canonicalheaders;
|
|
232
|
+
signedheaders;
|
|
233
|
+
Crypto.sha256hex input.body;
|
|
234
|
+
]
|
|
235
|
+
in
|
|
236
|
+
|
|
237
|
+
let scope = date ^ "/" ^ input.region ^ "/" ^ input.service ^ "/aws4_request" in
|
|
238
|
+
|
|
239
|
+
let stringtosign =
|
|
240
|
+
String.concat "\n"
|
|
241
|
+
[ "AWS4-HMAC-SHA256"; input.datetime; scope; Crypto.sha256hex canonicalrequest ]
|
|
242
|
+
in
|
|
243
|
+
|
|
244
|
+
let kdate = Crypto.hmac ("AWS4" ^ input.secret) date in
|
|
245
|
+
let kregion = Crypto.hmac kdate input.region in
|
|
246
|
+
let kservice = Crypto.hmac kregion input.service in
|
|
247
|
+
let ksigning = Crypto.hmac kservice "aws4_request" in
|
|
248
|
+
let signature = Crypto.hex (Crypto.hmac ksigning stringtosign) in
|
|
249
|
+
|
|
250
|
+
let out =
|
|
251
|
+
[
|
|
252
|
+
( "authorization",
|
|
253
|
+
"AWS4-HMAC-SHA256 Credential=" ^ input.keyid ^ "/" ^ scope ^ ", SignedHeaders="
|
|
254
|
+
^ signedheaders ^ ", Signature=" ^ signature );
|
|
255
|
+
("x-amz-date", input.datetime);
|
|
256
|
+
]
|
|
257
|
+
in
|
|
258
|
+
|
|
259
|
+
if "" = input.session then out else out @ [ ("x-amz-security-token", input.session) ]
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
(* VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (ocaml/plugins/tls.ml) *)
|
|
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 OCaml side of the TLS binding.
|
|
5
|
+
|
|
6
|
+
Thin on purpose: everything that has to be got right is in
|
|
7
|
+
plugins/tls_stubs.c, next to the OpenSSL calls it is about, and this module
|
|
8
|
+
only decides whether a host is a name or an address, reads
|
|
9
|
+
SEKRETO_CA_BUNDLE, and turns a C-side failure into the library's own
|
|
10
|
+
error type.
|
|
11
|
+
|
|
12
|
+
The socket is OCaml's throughout - connected, bounded and closed by
|
|
13
|
+
plugins/http.ml - so the C side never owns a file descriptor. *)
|
|
14
|
+
|
|
15
|
+
type conn
|
|
16
|
+
|
|
17
|
+
external tls_connect : Unix.file_descr -> string -> bool -> string -> conn = "sekreto_tls_connect"
|
|
18
|
+
external tls_write : conn -> string -> int -> int -> int = "sekreto_tls_write"
|
|
19
|
+
external tls_read : conn -> Bytes.t -> int -> int -> int = "sekreto_tls_read"
|
|
20
|
+
external tls_close : conn -> unit = "sekreto_tls_close"
|
|
21
|
+
|
|
22
|
+
(* The cross-port way to add a private CA. Additive, never a replacement,
|
|
23
|
+
and it fails open in silence - see the note in tls_stubs.c. *)
|
|
24
|
+
let cabundle = "SEKRETO_CA_BUNDLE"
|
|
25
|
+
|
|
26
|
+
(* Is this host an IP literal rather than a DNS name?
|
|
27
|
+
|
|
28
|
+
It decides two things in the binding: an address is verified against the
|
|
29
|
+
certificate's iPAddress SAN rather than by DNS-name matching, and SNI is
|
|
30
|
+
not sent for it. Asked of the platform's own parser, which is the same
|
|
31
|
+
one the socket layer will use. *)
|
|
32
|
+
let isip (host : string) : bool =
|
|
33
|
+
match Unix.inet_addr_of_string host with _ -> true | exception _ -> false
|
|
34
|
+
|
|
35
|
+
(* Handshake over an already-connected socket, verifying the chain and the
|
|
36
|
+
host name. Any failure raises `Failure`, which plugins/http.ml turns into
|
|
37
|
+
`sekreto: cannot reach ...`. *)
|
|
38
|
+
let connect (fd : Unix.file_descr) (host : string) : conn =
|
|
39
|
+
let extra = match Sys.getenv_opt cabundle with Some path -> path | None -> "" in
|
|
40
|
+
tls_connect fd host (isip host) extra
|
|
41
|
+
|
|
42
|
+
let write (conn : conn) (text : string) (ofs : int) (len : int) : int = tls_write conn text ofs len
|
|
43
|
+
let read (conn : conn) (buf : Bytes.t) (ofs : int) (len : int) : int = tls_read conn buf ofs len
|
|
44
|
+
let close (conn : conn) : unit = tls_close conn
|