@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,126 @@
|
|
|
1
|
+
-- VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (lua/src/sekreto/plugins/onepassword.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 onepassword plugin: 1Password through a Connect server, over
|
|
5
|
+
-- HTTPS.
|
|
6
|
+
--
|
|
7
|
+
-- A port of typescript/plugins/onepassword.ts, which is canonical.
|
|
8
|
+
|
|
9
|
+
local err = require('feature.secrets.sekreto.err')
|
|
10
|
+
local name = require('feature.secrets.sekreto.name')
|
|
11
|
+
local addr = require('feature.secrets.sekreto.addr')
|
|
12
|
+
local providers = require('feature.secrets.sekreto.providers')
|
|
13
|
+
local json = require('feature.secrets.sekreto.plugins.json')
|
|
14
|
+
local httpjson = require('feature.secrets.sekreto.plugins.httpjson')
|
|
15
|
+
local support = require('feature.secrets.sekreto.plugins.support')
|
|
16
|
+
|
|
17
|
+
local fail = err.fail
|
|
18
|
+
local trimslash = providers.trimslash
|
|
19
|
+
local providerplugin = providers.providerplugin
|
|
20
|
+
local fetchjson = httpjson.fetchjson
|
|
21
|
+
local uriescape = support.uriescape
|
|
22
|
+
|
|
23
|
+
local M = {}
|
|
24
|
+
|
|
25
|
+
--- 1Password, through a Connect server.
|
|
26
|
+
---
|
|
27
|
+
--- The item titled `api.token` (titles keep their dots), in the named
|
|
28
|
+
--- vault. The value is the field with purpose PASSWORD, or the field
|
|
29
|
+
--- labelled `value`. A vault that cannot be found is an error - config
|
|
30
|
+
--- names it, so its absence is a broken store, not a missing secret.
|
|
31
|
+
local function onepassword(useaddr, token, vault)
|
|
32
|
+
local vaultid = nil
|
|
33
|
+
|
|
34
|
+
local function auth()
|
|
35
|
+
return { { 'authorization', 'Bearer ' .. (token or '') } }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
local function resolvevault(address)
|
|
39
|
+
local want = vault or ''
|
|
40
|
+
if '' == want then
|
|
41
|
+
fail('sekreto: onepassword: no vault')
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
local res = fetchjson('GET', address .. '/v1/vaults', auth())
|
|
45
|
+
local list = json.asarr(res.body)
|
|
46
|
+
|
|
47
|
+
if 200 ~= res.status or nil == list then
|
|
48
|
+
fail('sekreto: onepassword error: ' .. res.status .. ': listing vaults')
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
for _, entry in ipairs(list) do
|
|
52
|
+
local id = json.text(json.dig(entry, 'id'))
|
|
53
|
+
if want == id or want == json.text(json.dig(entry, 'name')) then
|
|
54
|
+
return id or ''
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
fail('sekreto: onepassword: no vault named ' .. want)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
lookup = function(secret)
|
|
63
|
+
name.checkname(secret)
|
|
64
|
+
|
|
65
|
+
local address = trimslash(useaddr or '')
|
|
66
|
+
if '' == address then
|
|
67
|
+
fail('sekreto: onepassword: no addr')
|
|
68
|
+
end
|
|
69
|
+
addr.checkaddr(address)
|
|
70
|
+
|
|
71
|
+
if nil == vaultid then
|
|
72
|
+
vaultid = resolvevault(address)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
local filter = uriescape('title eq "' .. secret .. '"')
|
|
76
|
+
local found = fetchjson(
|
|
77
|
+
'GET', address .. '/v1/vaults/' .. vaultid .. '/items?filter=' .. filter, auth()
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
local items = json.asarr(found.body)
|
|
81
|
+
if 200 ~= found.status or nil == items then
|
|
82
|
+
fail('sekreto: onepassword error: ' .. found.status .. ': finding ' .. secret)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
if 0 == #items then
|
|
86
|
+
return nil
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
local item = fetchjson(
|
|
90
|
+
'GET',
|
|
91
|
+
address .. '/v1/vaults/' .. vaultid .. '/items/' ..
|
|
92
|
+
(json.text(json.dig(items[1], 'id')) or ''),
|
|
93
|
+
auth()
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
if 200 ~= item.status then
|
|
97
|
+
fail('sekreto: onepassword error: ' .. item.status .. ': reading ' .. secret)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
local fields = json.asarr(json.dig(item.body, 'fields')) or {}
|
|
101
|
+
|
|
102
|
+
for _, entry in ipairs(fields) do
|
|
103
|
+
if 'PASSWORD' == json.asstr(json.dig(entry, 'purpose')) then
|
|
104
|
+
return json.text(json.dig(entry, 'value'))
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
for _, entry in ipairs(fields) do
|
|
108
|
+
if 'value' == json.asstr(json.dig(entry, 'label')) then
|
|
109
|
+
return json.text(json.dig(entry, 'value'))
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
return nil
|
|
114
|
+
end,
|
|
115
|
+
describe = function()
|
|
116
|
+
return 'onepassword:' .. (vault or '')
|
|
117
|
+
end,
|
|
118
|
+
}
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
--- The kind, as a voxgig/plugin definition.
|
|
122
|
+
M.onepassword = providerplugin('onepassword', function(spec)
|
|
123
|
+
return onepassword(spec.addr, spec.token, spec.vault)
|
|
124
|
+
end)
|
|
125
|
+
|
|
126
|
+
return M
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
-- VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (lua/src/sekreto/plugins/secretspec.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 secretspec plugin: SecretSpec, through its CLI. Needs a child
|
|
5
|
+
-- process, so it is not a built-in kind.
|
|
6
|
+
--
|
|
7
|
+
-- A port of typescript/plugins/secretspec.ts, which is canonical.
|
|
8
|
+
|
|
9
|
+
local err = require('feature.secrets.sekreto.err')
|
|
10
|
+
local name = require('feature.secrets.sekreto.name')
|
|
11
|
+
local providers = require('feature.secrets.sekreto.providers')
|
|
12
|
+
local support = require('feature.secrets.sekreto.plugins.support')
|
|
13
|
+
local net = require('feature.secrets.sekreto.plugins.net')
|
|
14
|
+
|
|
15
|
+
local fail = err.fail
|
|
16
|
+
local nonempty = providers.nonempty
|
|
17
|
+
local providerplugin = providers.providerplugin
|
|
18
|
+
local first = support.first
|
|
19
|
+
local stripnewline = support.stripnewline
|
|
20
|
+
local runcmd = net.runcmd
|
|
21
|
+
|
|
22
|
+
local M = {}
|
|
23
|
+
|
|
24
|
+
--- Does this SecretSpec failure mean "no such secret" rather than "I
|
|
25
|
+
--- could not answer"?
|
|
26
|
+
---
|
|
27
|
+
--- MATCHED ON THE WHOLE PHRASE, NOT ON "not found". SecretSpec also says
|
|
28
|
+
--- `Provider backend 'keyring' not found`, which is a store that could
|
|
29
|
+
--- not answer at all - and reading that as a miss is the worst failure
|
|
30
|
+
--- this library has, because the chain then falls through to a weaker
|
|
31
|
+
--- store without saying so. The key is required to appear, so the two
|
|
32
|
+
--- cannot be confused.
|
|
33
|
+
function M.secretspecmiss(why, key)
|
|
34
|
+
return nil ~= why:find("Secret '" .. key .. "' not found", 1, true)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
--- SecretSpec (https://secretspec.dev), read through its CLI.
|
|
38
|
+
---
|
|
39
|
+
--- `backend` selects one of SecretSpec's own backends (`--provider`) and
|
|
40
|
+
--- is called `backend` here only because `provider` already means a
|
|
41
|
+
--- sekreto provider. A reason is required, not optional: SecretSpec
|
|
42
|
+
--- records every read in an audit log and refuses to read without one.
|
|
43
|
+
local function secretspec(command, file, profile, backend, reason, prefix)
|
|
44
|
+
local usecommand = nonempty(command) and command or 'secretspec'
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
lookup = function(secret)
|
|
48
|
+
local key = name.envkey(secret, prefix)
|
|
49
|
+
|
|
50
|
+
local argv = { usecommand }
|
|
51
|
+
if nonempty(file) then
|
|
52
|
+
argv[#argv + 1] = '--file'
|
|
53
|
+
argv[#argv + 1] = file
|
|
54
|
+
end
|
|
55
|
+
argv[#argv + 1] = 'get'
|
|
56
|
+
argv[#argv + 1] = key
|
|
57
|
+
if nonempty(backend) then
|
|
58
|
+
argv[#argv + 1] = '--provider'
|
|
59
|
+
argv[#argv + 1] = backend
|
|
60
|
+
end
|
|
61
|
+
if nonempty(profile) then
|
|
62
|
+
argv[#argv + 1] = '--profile'
|
|
63
|
+
argv[#argv + 1] = profile
|
|
64
|
+
end
|
|
65
|
+
argv[#argv + 1] = '--reason'
|
|
66
|
+
argv[#argv + 1] = first(reason, 'sekreto')
|
|
67
|
+
|
|
68
|
+
local out, why, status = runcmd(argv, nil, usecommand)
|
|
69
|
+
|
|
70
|
+
if 0 == status then
|
|
71
|
+
return stripnewline(out)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
if M.secretspecmiss(why, key) then
|
|
75
|
+
return nil
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
fail('sekreto: secretspec error: ' ..
|
|
79
|
+
(('' == why) and ('exit ' .. status) or why))
|
|
80
|
+
end,
|
|
81
|
+
describe = function()
|
|
82
|
+
return 'secretspec' .. (nonempty(backend) and (':' .. backend) or '')
|
|
83
|
+
end,
|
|
84
|
+
}
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
--- The kind, as a voxgig/plugin definition.
|
|
88
|
+
M.secretspec = providerplugin('secretspec', function(spec)
|
|
89
|
+
return secretspec(spec.command, spec.file, spec.profile, spec.backend,
|
|
90
|
+
spec.reason, spec.prefix)
|
|
91
|
+
end)
|
|
92
|
+
|
|
93
|
+
return M
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
-- VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (lua/src/sekreto/plugins/sigv4.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
|
+
-- 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 every port honest. SigV4 is a stable, published algorithm
|
|
9
|
+
-- built from HMAC-SHA256, which src/sekreto/plugins/crypto.lua carries.
|
|
10
|
+
-- It moved out of the core with the aws plugin: the core of no port
|
|
11
|
+
-- imports a hash function (docs/design/plugin-providers.md).
|
|
12
|
+
--
|
|
13
|
+
-- `sigv4` is pure: the caller passes the timestamp, so the same input
|
|
14
|
+
-- yields the same signature everywhere. That is what lets the shared spec
|
|
15
|
+
-- carry known-answer cases that all ports must reproduce bit for bit, and
|
|
16
|
+
-- lets the integration mock recompute the signature server-side.
|
|
17
|
+
--
|
|
18
|
+
-- `uriescape` and `uridecode` live in support, because four plugins that
|
|
19
|
+
-- sign nothing need them and reaching them through here would put
|
|
20
|
+
-- SHA-256 and HMAC behind all four.
|
|
21
|
+
--
|
|
22
|
+
-- A port of typescript/plugins/sigv4.ts, which is canonical.
|
|
23
|
+
|
|
24
|
+
local crypto = require('feature.secrets.sekreto.plugins.crypto')
|
|
25
|
+
local support = require('feature.secrets.sekreto.plugins.support')
|
|
26
|
+
|
|
27
|
+
local M = {}
|
|
28
|
+
|
|
29
|
+
local uriescape = support.uriescape
|
|
30
|
+
local uridecode = support.uridecode
|
|
31
|
+
|
|
32
|
+
-- ASCII case folding, spelled out. `string.upper` and `string.lower` go
|
|
33
|
+
-- through the C library's toupper/tolower, which follow the machine's
|
|
34
|
+
-- locale - and in a Turkish locale `i` does not fold to `I`.
|
|
35
|
+
local function lowerascii(text)
|
|
36
|
+
return (text:gsub('[A-Z]', function(ch) return string.char(ch:byte() + 32) end))
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
local function upperascii(text)
|
|
40
|
+
return (text:gsub('[a-z]', function(ch) return string.char(ch:byte() - 32) end))
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
--- The canonical query string: each pair RFC 3986-escaped, sorted by
|
|
44
|
+
--- escaped key then escaped value. `?b=2&a=1` signs as `a=1&b=2`.
|
|
45
|
+
function M.canonicalquery(query)
|
|
46
|
+
if '' == query then
|
|
47
|
+
return ''
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
local pairlist = {}
|
|
51
|
+
local at = 1
|
|
52
|
+
|
|
53
|
+
while true do
|
|
54
|
+
local stop = query:find('&', at, true)
|
|
55
|
+
local piece = stop and query:sub(at, stop - 1) or query:sub(at)
|
|
56
|
+
|
|
57
|
+
local eq = piece:find('=', 1, true)
|
|
58
|
+
local key = eq and piece:sub(1, eq - 1) or piece
|
|
59
|
+
local value = eq and piece:sub(eq + 1) or ''
|
|
60
|
+
|
|
61
|
+
pairlist[#pairlist + 1] = {
|
|
62
|
+
uriescape(uridecode(key)),
|
|
63
|
+
uriescape(uridecode(value)),
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if not stop then
|
|
67
|
+
break
|
|
68
|
+
end
|
|
69
|
+
at = stop + 1
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
table.sort(pairlist, function(left, right)
|
|
73
|
+
if left[1] ~= right[1] then
|
|
74
|
+
return left[1] < right[1]
|
|
75
|
+
end
|
|
76
|
+
return left[2] < right[2]
|
|
77
|
+
end)
|
|
78
|
+
|
|
79
|
+
local parts = {}
|
|
80
|
+
for index, pair in ipairs(pairlist) do
|
|
81
|
+
parts[index] = pair[1] .. '=' .. pair[2]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
return table.concat(parts, '&')
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
--- Split a URL the way the WHATWG `host` property does, by hand.
|
|
88
|
+
---
|
|
89
|
+
--- No platform URL type is trusted here: the signature covers `host`, and
|
|
90
|
+
--- a parser that keeps an explicitly written `:443`, or that leaves
|
|
91
|
+
--- userinfo in, signs something the server will not agree with.
|
|
92
|
+
local function spliturl(url)
|
|
93
|
+
local mark = url:find('://', 1, true)
|
|
94
|
+
local scheme = mark and lowerascii(url:sub(1, mark - 1)) or ''
|
|
95
|
+
local rest = mark and url:sub(mark + 3) or url
|
|
96
|
+
|
|
97
|
+
local stop = rest:find('[/?#]')
|
|
98
|
+
local authority = stop and rest:sub(1, stop - 1) or rest
|
|
99
|
+
local tail = stop and rest:sub(stop) or ''
|
|
100
|
+
|
|
101
|
+
-- Userinfo is stripped: it is never part of the signed host.
|
|
102
|
+
local at = authority:find('@[^@]*$')
|
|
103
|
+
if at then
|
|
104
|
+
authority = authority:sub(at + 1)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
local host = authority
|
|
108
|
+
local port = ''
|
|
109
|
+
|
|
110
|
+
if '[' == host:sub(1, 1) then
|
|
111
|
+
local close = host:find(']', 1, true)
|
|
112
|
+
if close then
|
|
113
|
+
local after = host:sub(close + 1)
|
|
114
|
+
host = host:sub(1, close)
|
|
115
|
+
if ':' == after:sub(1, 1) then
|
|
116
|
+
port = after:sub(2)
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
else
|
|
120
|
+
local colon = host:find(':', 1, true)
|
|
121
|
+
if colon then
|
|
122
|
+
port = host:sub(colon + 1)
|
|
123
|
+
host = host:sub(1, colon - 1)
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
host = lowerascii(host)
|
|
128
|
+
|
|
129
|
+
-- A default port is not written: `Host: x:443` is not what was signed.
|
|
130
|
+
if ('https' == scheme and '443' == port) or ('http' == scheme and '80' == port) then
|
|
131
|
+
port = ''
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
local path = tail
|
|
135
|
+
local query = ''
|
|
136
|
+
|
|
137
|
+
local mark2 = tail:find('?', 1, true)
|
|
138
|
+
if mark2 then
|
|
139
|
+
path = tail:sub(1, mark2 - 1)
|
|
140
|
+
query = tail:sub(mark2 + 1)
|
|
141
|
+
local hash = query:find('#', 1, true)
|
|
142
|
+
if hash then
|
|
143
|
+
query = query:sub(1, hash - 1)
|
|
144
|
+
end
|
|
145
|
+
else
|
|
146
|
+
local hash = tail:find('#', 1, true)
|
|
147
|
+
if hash then
|
|
148
|
+
path = tail:sub(1, hash - 1)
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
if '' == path then
|
|
153
|
+
path = '/'
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
return {
|
|
157
|
+
scheme = scheme,
|
|
158
|
+
host = host,
|
|
159
|
+
port = port,
|
|
160
|
+
hostheader = ('' == port) and host or (host .. ':' .. port),
|
|
161
|
+
path = path,
|
|
162
|
+
query = query,
|
|
163
|
+
}
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
M.spliturl = spliturl
|
|
167
|
+
|
|
168
|
+
--- Trim, then collapse every internal run of spaces and tabs to one
|
|
169
|
+
--- space: AWS folds sequential whitespace before signing, so a header
|
|
170
|
+
--- value `a b\tc` must sign as `a b c`.
|
|
171
|
+
local function foldvalue(text)
|
|
172
|
+
local trimmed = text:gsub('^[ \t\r\n]+', ''):gsub('[ \t\r\n]+$', '')
|
|
173
|
+
return (trimmed:gsub('[ \t\r\n]+', ' '))
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
--- Sign one request.
|
|
177
|
+
---
|
|
178
|
+
--- `input` is a table whose field names are the spec's JSON keys verbatim:
|
|
179
|
+
--- method, url, service, region, keyid, secret, datetime, headers, body,
|
|
180
|
+
--- session.
|
|
181
|
+
---
|
|
182
|
+
--- Returns an ORDERED list of {name, value} pairs: authorization,
|
|
183
|
+
--- x-amz-date, and x-amz-security-token only when a session was given.
|
|
184
|
+
--- The order is contract - callers print it field by field.
|
|
185
|
+
function M.sigv4(input)
|
|
186
|
+
local url = spliturl(input.url or '')
|
|
187
|
+
|
|
188
|
+
local datetime = input.datetime or ''
|
|
189
|
+
local date = datetime:sub(1, 8)
|
|
190
|
+
local session = input.session
|
|
191
|
+
if nil ~= session and '' == session then
|
|
192
|
+
session = nil
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
-- The caller's headers first, then host / x-amz-date / the session
|
|
196
|
+
-- token AFTER them, so those always win.
|
|
197
|
+
local headers = {}
|
|
198
|
+
local names = {}
|
|
199
|
+
|
|
200
|
+
local function put(name, value)
|
|
201
|
+
if nil == headers[name] then
|
|
202
|
+
names[#names + 1] = name
|
|
203
|
+
end
|
|
204
|
+
headers[name] = value
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
for _, pair in ipairs(input.headers or {}) do
|
|
208
|
+
put(lowerascii(pair[1]), foldvalue(pair[2]))
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
put('host', url.hostheader)
|
|
212
|
+
put('x-amz-date', datetime)
|
|
213
|
+
if nil ~= session then
|
|
214
|
+
put('x-amz-security-token', session)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
table.sort(names)
|
|
218
|
+
|
|
219
|
+
local canonparts = {}
|
|
220
|
+
for index, name in ipairs(names) do
|
|
221
|
+
canonparts[index] = name .. ':' .. headers[name] .. '\n'
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
local canonicalheaders = table.concat(canonparts)
|
|
225
|
+
local signedheaders = table.concat(names, ';')
|
|
226
|
+
|
|
227
|
+
local canonicalrequest = table.concat({
|
|
228
|
+
upperascii(input.method or ''),
|
|
229
|
+
url.path,
|
|
230
|
+
M.canonicalquery(url.query),
|
|
231
|
+
canonicalheaders,
|
|
232
|
+
signedheaders,
|
|
233
|
+
crypto.sha256hex(input.body or ''),
|
|
234
|
+
}, '\n')
|
|
235
|
+
|
|
236
|
+
local scope = date .. '/' .. (input.region or '') .. '/' ..
|
|
237
|
+
(input.service or '') .. '/aws4_request'
|
|
238
|
+
|
|
239
|
+
local stringtosign = table.concat({
|
|
240
|
+
'AWS4-HMAC-SHA256',
|
|
241
|
+
datetime,
|
|
242
|
+
scope,
|
|
243
|
+
crypto.sha256hex(canonicalrequest),
|
|
244
|
+
}, '\n')
|
|
245
|
+
|
|
246
|
+
local kdate = crypto.hmac('AWS4' .. (input.secret or ''), date)
|
|
247
|
+
local kregion = crypto.hmac(kdate, input.region or '')
|
|
248
|
+
local kservice = crypto.hmac(kregion, input.service or '')
|
|
249
|
+
local ksigning = crypto.hmac(kservice, 'aws4_request')
|
|
250
|
+
local signature = crypto.hex(crypto.hmac(ksigning, stringtosign))
|
|
251
|
+
|
|
252
|
+
local out = {
|
|
253
|
+
{
|
|
254
|
+
'authorization',
|
|
255
|
+
'AWS4-HMAC-SHA256 Credential=' .. (input.keyid or '') .. '/' .. scope ..
|
|
256
|
+
', SignedHeaders=' .. signedheaders ..
|
|
257
|
+
', Signature=' .. signature,
|
|
258
|
+
},
|
|
259
|
+
{ 'x-amz-date', datetime },
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if nil ~= session then
|
|
263
|
+
out[#out + 1] = { 'x-amz-security-token', session }
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
return out
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
return M
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
-- VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (lua/src/sekreto/plugins/support.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 pure helpers every store client shares, and nothing else.
|
|
5
|
+
--
|
|
6
|
+
-- This module REQUIRES NOTHING - no socket, no digest, no child process,
|
|
7
|
+
-- not even another sekreto module - so a plugin that needs only these
|
|
8
|
+
-- gets only these. secretspec and the boru CLI path both do: they want
|
|
9
|
+
-- `first` and `stripnewline` and no HTTP at all, and reaching those
|
|
10
|
+
-- through httpjson would put the whole HTTP/1.1 framing behind two kinds
|
|
11
|
+
-- that never open a socket.
|
|
12
|
+
--
|
|
13
|
+
-- It lives under plugins/ rather than in the core because only the ten
|
|
14
|
+
-- plugin kinds use any of it. The core's four built-ins read at most a
|
|
15
|
+
-- local file and need none of it.
|
|
16
|
+
--
|
|
17
|
+
-- The equivalents in the canonical port are spread across
|
|
18
|
+
-- typescript/plugins/httpjson.ts and typescript/plugins/support.ts; the
|
|
19
|
+
-- split into a separate module here is lua's, for the reason above.
|
|
20
|
+
|
|
21
|
+
local M = {}
|
|
22
|
+
|
|
23
|
+
--- The first candidate that is set and non-empty, or empty.
|
|
24
|
+
---
|
|
25
|
+
--- Walked with `select`, never with `ipairs` over a packed table: a nil
|
|
26
|
+
--- argument leaves a hole, and `ipairs` stops dead at the first one - so
|
|
27
|
+
--- `first(nil, os.getenv('AWS_ACCESS_KEY_ID'))` would answer empty with
|
|
28
|
+
--- the variable plainly set.
|
|
29
|
+
function M.first(...)
|
|
30
|
+
local count = select('#', ...)
|
|
31
|
+
|
|
32
|
+
for index = 1, count do
|
|
33
|
+
local candidate = select(index, ...)
|
|
34
|
+
if nil ~= candidate and '' ~= candidate then
|
|
35
|
+
return candidate
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
return ''
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
--- One trailing newline removed. A CLI prints the secret and a newline;
|
|
43
|
+
--- the newline is never part of the secret on purpose.
|
|
44
|
+
function M.stripnewline(text)
|
|
45
|
+
if '\n' == text:sub(-1) then
|
|
46
|
+
return text:sub(1, #text - 1)
|
|
47
|
+
end
|
|
48
|
+
return text
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
--- Never renewed: a configured token does not expire.
|
|
52
|
+
M.NEVER = math.maxinteger
|
|
53
|
+
|
|
54
|
+
--- Milliseconds since the epoch, near enough for token renewal.
|
|
55
|
+
function M.nowms()
|
|
56
|
+
return os.time() * 1000
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
--- When a logged-in token must be renewed, from its expiry in seconds (a
|
|
60
|
+
--- JSON number, or a string as Azure IMDS sends it): now + max(seconds -
|
|
61
|
+
--- 60, 1). A missing or zero expiry means never renew.
|
|
62
|
+
function M.renewtime(expires)
|
|
63
|
+
local seconds = 0
|
|
64
|
+
|
|
65
|
+
if 'number' == type(expires) then
|
|
66
|
+
seconds = expires
|
|
67
|
+
elseif 'string' == type(expires) then
|
|
68
|
+
seconds = tonumber(expires) or 0
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
if seconds ~= seconds or 0 >= seconds then
|
|
72
|
+
return M.NEVER
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
return M.nowms() + math.floor(math.max(seconds - 60, 1) * 1000)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
--- The `YYYYMMDDTHHMMSSZ` timestamp SigV4 wants, for now.
|
|
79
|
+
function M.awsnow()
|
|
80
|
+
return os.date('!%Y%m%dT%H%M%SZ')
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
-- --------------------------------------------- percent-encoding
|
|
84
|
+
--
|
|
85
|
+
-- Here rather than with sigv4 because four plugins that sign nothing need
|
|
86
|
+
-- `uriescape` - azure, 1password, doppler and infisical - and reaching it
|
|
87
|
+
-- through sigv4 would put SHA-256 and HMAC behind all four. Moved
|
|
88
|
+
-- verbatim from what was src/sekreto/sigv4.lua: the sigv4 corpus group
|
|
89
|
+
-- is a known-answer test, so the bytes these two produce are pinned.
|
|
90
|
+
|
|
91
|
+
--- RFC 3986 escaping, which is stricter than the usual URL encoder: AWS
|
|
92
|
+
--- wants everything but the unreserved set escaped, with uppercase hex.
|
|
93
|
+
--- `!'()*` are escaped here and are not by JavaScript's own encoder.
|
|
94
|
+
function M.uriescape(text)
|
|
95
|
+
local out = {}
|
|
96
|
+
|
|
97
|
+
for index = 1, #text do
|
|
98
|
+
local byte = text:byte(index)
|
|
99
|
+
local ch = text:sub(index, index)
|
|
100
|
+
|
|
101
|
+
if (65 <= byte and 90 >= byte) or
|
|
102
|
+
(97 <= byte and 122 >= byte) or
|
|
103
|
+
(48 <= byte and 57 >= byte) or
|
|
104
|
+
45 == byte or 95 == byte or 46 == byte or 126 == byte
|
|
105
|
+
then
|
|
106
|
+
out[#out + 1] = ch
|
|
107
|
+
else
|
|
108
|
+
out[#out + 1] = string.format('%%%02X', byte)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
return table.concat(out)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
local HEX = '0123456789abcdefABCDEF'
|
|
116
|
+
|
|
117
|
+
--- Percent-decode, and nothing else: `+` stays `+`, as on the wire, and a
|
|
118
|
+
--- malformed escape is kept literal.
|
|
119
|
+
function M.uridecode(text)
|
|
120
|
+
local out = {}
|
|
121
|
+
local index = 1
|
|
122
|
+
|
|
123
|
+
while index <= #text do
|
|
124
|
+
local ch = text:sub(index, index)
|
|
125
|
+
|
|
126
|
+
if '%' == ch and index + 2 <= #text then
|
|
127
|
+
local digits = text:sub(index + 1, index + 2)
|
|
128
|
+
if nil ~= HEX:find(digits:sub(1, 1), 1, true) and
|
|
129
|
+
nil ~= HEX:find(digits:sub(2, 2), 1, true)
|
|
130
|
+
then
|
|
131
|
+
out[#out + 1] = string.char(tonumber(digits, 16))
|
|
132
|
+
index = index + 3
|
|
133
|
+
goto continue
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
out[#out + 1] = ch
|
|
138
|
+
index = index + 1
|
|
139
|
+
|
|
140
|
+
::continue::
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
return table.concat(out)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
return M
|