@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,124 @@
|
|
|
1
|
+
-- VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (lua/src/sekreto/plugins/boru.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 boru plugin: a boru vault, through its own CLI or its own wire
|
|
5
|
+
-- protocol. Needs a child process, and HTTPS for the wire path.
|
|
6
|
+
--
|
|
7
|
+
-- A port of typescript/plugins/boru.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
|
+
local net = require('feature.secrets.sekreto.plugins.net')
|
|
17
|
+
|
|
18
|
+
local fail = err.fail
|
|
19
|
+
local nonempty = providers.nonempty
|
|
20
|
+
local trimslash = providers.trimslash
|
|
21
|
+
local providerplugin = providers.providerplugin
|
|
22
|
+
local stripnewline = support.stripnewline
|
|
23
|
+
local fetchjson = httpjson.fetchjson
|
|
24
|
+
local runcmd = net.runcmd
|
|
25
|
+
|
|
26
|
+
local M = {}
|
|
27
|
+
|
|
28
|
+
--- Does this boru failure mean "no such secret" rather than "I could not
|
|
29
|
+
--- answer"? Matched on boru's own wording for a missing alias.
|
|
30
|
+
function M.borumiss(why)
|
|
31
|
+
return nil ~= why:find('no alias named', 1, true)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
--- A boru vault (https://github.com/boru-lang/boru).
|
|
35
|
+
---
|
|
36
|
+
--- Two ways in, both boru's own. With no `addr`, the CLI:
|
|
37
|
+
--- `boru vault get --reveal <alias>` prints the secret on stdout and
|
|
38
|
+
--- nothing else. The passphrase is read by boru itself from
|
|
39
|
+
--- BORU_VAULT_PASSPHRASE; sekreto never accepts it as config and never
|
|
40
|
+
--- puts it on a command line, where the process table would publish it.
|
|
41
|
+
---
|
|
42
|
+
--- With an `addr`, boru's wire protocol: a read-only, HashiCorp-shaped
|
|
43
|
+
--- provision API. A sekreto name is already a valid boru alias, and boru
|
|
44
|
+
--- aliases keep their dots, so `api.token` is the single path segment
|
|
45
|
+
--- `api.token` - not the `api`/`token` split a HashiCorp KV gets.
|
|
46
|
+
local function boru(command, namespace, home, useaddr, token, mount)
|
|
47
|
+
local usecommand = nonempty(command) and command or 'boru'
|
|
48
|
+
local address = (nil == useaddr) and '' or trimslash(useaddr)
|
|
49
|
+
local usetoken = token or ''
|
|
50
|
+
local usemount = nonempty(mount) and mount or 'secret'
|
|
51
|
+
|
|
52
|
+
local function wirelookup(secret)
|
|
53
|
+
addr.checkaddr(address)
|
|
54
|
+
|
|
55
|
+
local alias = nonempty(namespace) and (namespace .. '/' .. secret) or secret
|
|
56
|
+
local url = address .. '/v1/' .. usemount .. '/data/' .. alias
|
|
57
|
+
|
|
58
|
+
local res = fetchjson('GET', url, { { 'X-Vault-Token', usetoken } })
|
|
59
|
+
|
|
60
|
+
if 404 == res.status then
|
|
61
|
+
return nil
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
if 200 ~= res.status then
|
|
65
|
+
fail('sekreto: boru serve error: ' .. res.status .. ': ' .. url)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
return json.text(json.dig(res.body, 'data', 'data', 'value'))
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
lookup = function(secret)
|
|
73
|
+
name.checkname(secret)
|
|
74
|
+
|
|
75
|
+
if '' ~= address then
|
|
76
|
+
return wirelookup(secret)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
local alias = nonempty(namespace) and (namespace .. ':' .. secret) or secret
|
|
80
|
+
|
|
81
|
+
-- BORU_HOME is the only variable sekreto sets for the child; the
|
|
82
|
+
-- passphrase is boru's own to read from BORU_VAULT_PASSPHRASE, and
|
|
83
|
+
-- is never config here and never on a command line.
|
|
84
|
+
local overrides = nil
|
|
85
|
+
if nonempty(home) then
|
|
86
|
+
overrides = { 'BORU_HOME=' .. home }
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
local out, why, status = runcmd(
|
|
90
|
+
{ usecommand, 'vault', 'get', '--reveal', alias }, overrides, usecommand
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
if 0 == status then
|
|
94
|
+
-- boru prints the value and one newline, and nothing else.
|
|
95
|
+
return stripnewline(out)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
-- "no alias named" is boru saying it does not hold this secret,
|
|
99
|
+
-- which is a miss. A locked vault or a wrong passphrase is not -
|
|
100
|
+
-- treating it as one would fall through to a weaker store without
|
|
101
|
+
-- saying so.
|
|
102
|
+
if M.borumiss(why) then
|
|
103
|
+
return nil
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
fail('sekreto: boru vault error: ' ..
|
|
107
|
+
(('' == why) and ('exit ' .. status) or why))
|
|
108
|
+
end,
|
|
109
|
+
describe = function()
|
|
110
|
+
if '' ~= address then
|
|
111
|
+
return 'boru:' .. address
|
|
112
|
+
end
|
|
113
|
+
return 'boru' .. (nonempty(namespace) and (':' .. namespace) or '')
|
|
114
|
+
end,
|
|
115
|
+
}
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
--- The kind, as a voxgig/plugin definition.
|
|
119
|
+
M.boru = providerplugin('boru', function(spec)
|
|
120
|
+
return boru(spec.command, spec.namespace, spec.home, spec.addr,
|
|
121
|
+
spec.token, spec.mount)
|
|
122
|
+
end)
|
|
123
|
+
|
|
124
|
+
return M
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
-- VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (lua/src/sekreto/plugins/crypto.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
|
+
-- SHA-256, HMAC-SHA256, hex and strict base64 - all hand-rolled.
|
|
5
|
+
--
|
|
6
|
+
-- Lua has no crypto at all. The port links OpenSSL for TLS (see
|
|
7
|
+
-- native/sekretonet.c), and it would be one line to call that library's
|
|
8
|
+
-- EVP_Digest here instead - but the dependency rule covers cryptographic
|
|
9
|
+
-- TRANSPORT and nothing else, so the digests sekreto signs with are its
|
|
10
|
+
-- own. Rust took the same decision with `ring` already in rustls's
|
|
11
|
+
-- closure.
|
|
12
|
+
--
|
|
13
|
+
-- Correctness is not argued from the code: SigV4 is a chain of these
|
|
14
|
+
-- primitives, so the five known-answer vectors in spec/sekreto.json fail
|
|
15
|
+
-- on one wrong bit anywhere below.
|
|
16
|
+
--
|
|
17
|
+
-- Lua 5.4 has 64-bit integers and native bitwise operators, so the
|
|
18
|
+
-- rotations are direct - every addition is masked back to 32 bits.
|
|
19
|
+
|
|
20
|
+
local M = {}
|
|
21
|
+
|
|
22
|
+
local MASK = 0xffffffff
|
|
23
|
+
|
|
24
|
+
local K = {
|
|
25
|
+
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
|
|
26
|
+
0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
27
|
+
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
|
|
28
|
+
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
|
29
|
+
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
|
|
30
|
+
0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
31
|
+
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
|
|
32
|
+
0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
|
33
|
+
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
|
|
34
|
+
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
35
|
+
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
|
|
36
|
+
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
|
37
|
+
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
|
|
38
|
+
0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
39
|
+
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
|
|
40
|
+
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
local function ror(value, count)
|
|
44
|
+
return ((value >> count) | (value << (32 - count))) & MASK
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
--- SHA-256 of a byte string, as 32 raw bytes.
|
|
48
|
+
function M.sha256(message)
|
|
49
|
+
local h0, h1, h2, h3 = 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a
|
|
50
|
+
local h4, h5, h6, h7 = 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
|
|
51
|
+
|
|
52
|
+
-- 0x80, then zeros until the length lands 8 bytes short of a block,
|
|
53
|
+
-- then the BIT length, big-endian.
|
|
54
|
+
local bitlen = #message * 8
|
|
55
|
+
local padded = message .. '\128'
|
|
56
|
+
local rem = (#padded % 64)
|
|
57
|
+
local fill = (56 - rem) % 64
|
|
58
|
+
padded = padded .. string.rep('\0', fill) .. string.pack('>I8', bitlen)
|
|
59
|
+
|
|
60
|
+
local w = {}
|
|
61
|
+
|
|
62
|
+
for block = 1, #padded, 64 do
|
|
63
|
+
for index = 0, 15 do
|
|
64
|
+
w[index + 1] = string.unpack('>I4', padded, block + index * 4)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
for index = 17, 64 do
|
|
68
|
+
local a = w[index - 15]
|
|
69
|
+
local b = w[index - 2]
|
|
70
|
+
local s0 = ror(a, 7) ~ ror(a, 18) ~ (a >> 3)
|
|
71
|
+
local s1 = ror(b, 17) ~ ror(b, 19) ~ (b >> 10)
|
|
72
|
+
w[index] = (w[index - 16] + s0 + w[index - 7] + s1) & MASK
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
local a, b, c, d = h0, h1, h2, h3
|
|
76
|
+
local e, f, g, h = h4, h5, h6, h7
|
|
77
|
+
|
|
78
|
+
for index = 1, 64 do
|
|
79
|
+
local S1 = ror(e, 6) ~ ror(e, 11) ~ ror(e, 25)
|
|
80
|
+
local ch = (e & f) ~ ((~e & MASK) & g)
|
|
81
|
+
local temp1 = (h + S1 + ch + K[index] + w[index]) & MASK
|
|
82
|
+
local S0 = ror(a, 2) ~ ror(a, 13) ~ ror(a, 22)
|
|
83
|
+
local maj = (a & b) ~ (a & c) ~ (b & c)
|
|
84
|
+
local temp2 = (S0 + maj) & MASK
|
|
85
|
+
|
|
86
|
+
h = g
|
|
87
|
+
g = f
|
|
88
|
+
f = e
|
|
89
|
+
e = (d + temp1) & MASK
|
|
90
|
+
d = c
|
|
91
|
+
c = b
|
|
92
|
+
b = a
|
|
93
|
+
a = (temp1 + temp2) & MASK
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
h0 = (h0 + a) & MASK
|
|
97
|
+
h1 = (h1 + b) & MASK
|
|
98
|
+
h2 = (h2 + c) & MASK
|
|
99
|
+
h3 = (h3 + d) & MASK
|
|
100
|
+
h4 = (h4 + e) & MASK
|
|
101
|
+
h5 = (h5 + f) & MASK
|
|
102
|
+
h6 = (h6 + g) & MASK
|
|
103
|
+
h7 = (h7 + h) & MASK
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
return string.pack('>I4I4I4I4I4I4I4I4', h0, h1, h2, h3, h4, h5, h6, h7)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
--- Lowercase hex, two digits per byte.
|
|
110
|
+
function M.hex(bytes)
|
|
111
|
+
local out = {}
|
|
112
|
+
for index = 1, #bytes do
|
|
113
|
+
out[index] = string.format('%02x', bytes:byte(index))
|
|
114
|
+
end
|
|
115
|
+
return table.concat(out)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
function M.sha256hex(message)
|
|
119
|
+
return M.hex(M.sha256(message))
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
local BLOCK = 64
|
|
123
|
+
|
|
124
|
+
--- HMAC-SHA256, RFC 2104. The argument order is (key, data) in every
|
|
125
|
+
--- port; several standard libraries take (data, key), and that is fixed
|
|
126
|
+
--- at the wrapper rather than at the call sites.
|
|
127
|
+
function M.hmac(key, data)
|
|
128
|
+
local usekey = key
|
|
129
|
+
|
|
130
|
+
if #usekey > BLOCK then
|
|
131
|
+
usekey = M.sha256(usekey)
|
|
132
|
+
end
|
|
133
|
+
if #usekey < BLOCK then
|
|
134
|
+
usekey = usekey .. string.rep('\0', BLOCK - #usekey)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
local ipad = {}
|
|
138
|
+
local opad = {}
|
|
139
|
+
|
|
140
|
+
for index = 1, BLOCK do
|
|
141
|
+
local byte = usekey:byte(index)
|
|
142
|
+
ipad[index] = string.char(byte ~ 0x36)
|
|
143
|
+
opad[index] = string.char(byte ~ 0x5c)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
local inner = M.sha256(table.concat(ipad) .. data)
|
|
147
|
+
return M.sha256(table.concat(opad) .. inner)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
-- ---- base64 ----------------------------------------------------------
|
|
151
|
+
|
|
152
|
+
local ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
|
153
|
+
|
|
154
|
+
local VALUES = {}
|
|
155
|
+
for index = 1, #ALPHABET do
|
|
156
|
+
VALUES[ALPHABET:sub(index, index)] = index - 1
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
--- Decode standard base64, STRICTLY: returns nil for anything that is not
|
|
160
|
+
--- a well-formed payload.
|
|
161
|
+
---
|
|
162
|
+
--- Strictness is the point. A lenient decoder skips bytes outside the
|
|
163
|
+
--- alphabet and hands back plausible-looking bytes for a corrupted
|
|
164
|
+
--- payload - which are then returned to the caller AS THE SECRET. A
|
|
165
|
+
--- rejection here becomes an error, never a miss.
|
|
166
|
+
function M.unbase64(text)
|
|
167
|
+
if 'string' ~= type(text) then
|
|
168
|
+
return nil
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
local clean = text:gsub('[ \t\r\n]', '')
|
|
172
|
+
|
|
173
|
+
if 0 ~= #clean % 4 then
|
|
174
|
+
return nil
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
local body = clean
|
|
178
|
+
local pad = 0
|
|
179
|
+
|
|
180
|
+
while 0 < #body and '=' == body:sub(-1) do
|
|
181
|
+
pad = pad + 1
|
|
182
|
+
body = body:sub(1, #body - 1)
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
if 2 < pad then
|
|
186
|
+
return nil
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
for index = 1, #body do
|
|
190
|
+
if nil == VALUES[body:sub(index, index)] then
|
|
191
|
+
return nil
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
local out = {}
|
|
196
|
+
local acc = 0
|
|
197
|
+
local bits = 0
|
|
198
|
+
|
|
199
|
+
for index = 1, #body do
|
|
200
|
+
acc = (acc << 6) | VALUES[body:sub(index, index)]
|
|
201
|
+
bits = bits + 6
|
|
202
|
+
|
|
203
|
+
if 8 <= bits then
|
|
204
|
+
bits = bits - 8
|
|
205
|
+
out[#out + 1] = string.char((acc >> bits) & 0xff)
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
return table.concat(out)
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
return M
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
-- VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (lua/src/sekreto/plugins/doppler.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 doppler plugin: a whole Doppler config downloaded once, over
|
|
5
|
+
-- HTTPS, and answered from memory like a remote .env.
|
|
6
|
+
--
|
|
7
|
+
-- A port of typescript/plugins/doppler.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 nonempty = providers.nonempty
|
|
19
|
+
local trimslash = providers.trimslash
|
|
20
|
+
local providerplugin = providers.providerplugin
|
|
21
|
+
local first = support.first
|
|
22
|
+
local fetchjson = httpjson.fetchjson
|
|
23
|
+
local uriescape = support.uriescape
|
|
24
|
+
|
|
25
|
+
local M = {}
|
|
26
|
+
|
|
27
|
+
--- Doppler.
|
|
28
|
+
---
|
|
29
|
+
--- The whole config is downloaded once - Doppler's own bulk endpoint -
|
|
30
|
+
--- and answered from memory, like a remote .env: `api.token` is the
|
|
31
|
+
--- `API_TOKEN` entry. A failed load caches nothing, so it retries.
|
|
32
|
+
local function doppler(token, project, config, useaddr)
|
|
33
|
+
local values = nil
|
|
34
|
+
|
|
35
|
+
local function load()
|
|
36
|
+
if nil ~= values then
|
|
37
|
+
return values
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
local address = trimslash(first(useaddr, 'https://api.doppler.com'))
|
|
41
|
+
addr.checkaddr(address)
|
|
42
|
+
|
|
43
|
+
local url = address .. '/v3/configs/config/secrets/download?format=json'
|
|
44
|
+
if nonempty(project) then
|
|
45
|
+
url = url .. '&project=' .. uriescape(project)
|
|
46
|
+
end
|
|
47
|
+
if nonempty(config) then
|
|
48
|
+
url = url .. '&config=' .. uriescape(config)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
local res = fetchjson(
|
|
52
|
+
'GET', url, { { 'authorization', 'Bearer ' .. (token or '') } }
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
local body = json.asobj(res.body)
|
|
56
|
+
if 200 ~= res.status or nil == body then
|
|
57
|
+
fail('sekreto: doppler error: ' .. res.status)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
local loaded = {}
|
|
61
|
+
for _, key in ipairs(body.keys) do
|
|
62
|
+
local text = json.text(body.vals[key])
|
|
63
|
+
if nil ~= text then
|
|
64
|
+
loaded[key] = text
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
values = loaded
|
|
69
|
+
return loaded
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
-- The `prefix` option is deliberately not consulted by this kind.
|
|
74
|
+
lookup = function(secret)
|
|
75
|
+
return load()[name.envkey(secret)]
|
|
76
|
+
end,
|
|
77
|
+
describe = function()
|
|
78
|
+
return 'doppler' ..
|
|
79
|
+
(nonempty(project) and (':' .. project .. '/' .. (config or '')) or '')
|
|
80
|
+
end,
|
|
81
|
+
}
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
--- The kind, as a voxgig/plugin definition.
|
|
85
|
+
M.doppler = providerplugin('doppler', function(spec)
|
|
86
|
+
return doppler(spec.token, spec.project, spec.config, spec.addr)
|
|
87
|
+
end)
|
|
88
|
+
|
|
89
|
+
return M
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
-- VENDORED: @voxgig/sekreto sdk-20260908-1556-0 (lua/src/sekreto/plugins/gcpsecrets.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 gcpsecrets plugin: GCP Secret Manager, over HTTPS, with the GCE
|
|
5
|
+
-- metadata server as a credential source.
|
|
6
|
+
--
|
|
7
|
+
-- A port of typescript/plugins/gcpsecrets.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
|
+
local crypto = require('feature.secrets.sekreto.plugins.crypto')
|
|
17
|
+
|
|
18
|
+
local fail = err.fail
|
|
19
|
+
local nonempty = providers.nonempty
|
|
20
|
+
local trimslash = providers.trimslash
|
|
21
|
+
local providerplugin = providers.providerplugin
|
|
22
|
+
local first = support.first
|
|
23
|
+
local nowms = support.nowms
|
|
24
|
+
local renewtime = support.renewtime
|
|
25
|
+
local NEVER = support.NEVER
|
|
26
|
+
local fetchjson = httpjson.fetchjson
|
|
27
|
+
|
|
28
|
+
local M = {}
|
|
29
|
+
|
|
30
|
+
--- GCP Secret Manager.
|
|
31
|
+
---
|
|
32
|
+
--- `api.token` reads secret `api_token` (dots flattened to `_`; Secret
|
|
33
|
+
--- Manager ids have no hierarchy and reject dots), latest version. The
|
|
34
|
+
--- token comes from config, then GOOGLE_OAUTH_ACCESS_TOKEN, then the
|
|
35
|
+
--- GCE/GKE metadata server - so on Google's own platform no credential
|
|
36
|
+
--- configuration is needed at all.
|
|
37
|
+
---
|
|
38
|
+
--- The metadata call itself is plain http to a link-local host by
|
|
39
|
+
--- platform design and carries no credential, so `checkaddr` guards the
|
|
40
|
+
--- Secret Manager address instead.
|
|
41
|
+
local function gcpsecrets(project, token, useaddr, metadataaddr)
|
|
42
|
+
local livetoken = nil
|
|
43
|
+
local renewat = NEVER
|
|
44
|
+
|
|
45
|
+
local function usemetadataaddr()
|
|
46
|
+
if nonempty(metadataaddr) then
|
|
47
|
+
return metadataaddr
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
local host = os.getenv('GCE_METADATA_HOST')
|
|
51
|
+
if nonempty(host) then
|
|
52
|
+
return 'http://' .. host
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
return 'http://metadata.google.internal'
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
local function login()
|
|
59
|
+
local configured = first(token, os.getenv('GOOGLE_OAUTH_ACCESS_TOKEN'))
|
|
60
|
+
if '' ~= configured then
|
|
61
|
+
return configured
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
local url = trimslash(usemetadataaddr()) ..
|
|
65
|
+
'/computeMetadata/v1/instance/service-accounts/default/token'
|
|
66
|
+
|
|
67
|
+
local res = fetchjson('GET', url, { { 'Metadata-Flavor', 'Google' } })
|
|
68
|
+
local got = json.text(json.dig(res.body, 'access_token'))
|
|
69
|
+
|
|
70
|
+
if 200 ~= res.status or nil == got or '' == got then
|
|
71
|
+
fail('sekreto: gcp: no token and metadata server did not answer')
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
renewat = renewtime(json.dig(res.body, 'expires_in'))
|
|
75
|
+
|
|
76
|
+
return got
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
lookup = function(secret)
|
|
81
|
+
local useproject = project or ''
|
|
82
|
+
if '' == useproject then
|
|
83
|
+
fail('sekreto: gcp: no project')
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
local address = first(useaddr, 'https://secretmanager.googleapis.com')
|
|
87
|
+
addr.checkaddr(address)
|
|
88
|
+
|
|
89
|
+
if nil == livetoken or nowms() >= renewat then
|
|
90
|
+
livetoken = login()
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
local url = trimslash(address) .. '/v1/projects/' .. useproject ..
|
|
94
|
+
'/secrets/' .. name.flatname(secret, '_') .. '/versions/latest:access'
|
|
95
|
+
|
|
96
|
+
local res = fetchjson('GET', url, { { 'authorization', 'Bearer ' .. livetoken } })
|
|
97
|
+
|
|
98
|
+
if 404 == res.status then
|
|
99
|
+
return nil
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
if 200 ~= res.status then
|
|
103
|
+
fail('sekreto: gcp error: ' .. res.status .. ': ' .. url)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
local data = json.asstr(json.dig(res.body, 'payload', 'data'))
|
|
107
|
+
if nil == data then
|
|
108
|
+
return nil
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
local decoded = crypto.unbase64(data)
|
|
112
|
+
if nil == decoded then
|
|
113
|
+
fail('sekreto: gcp: undecodable secret')
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
return decoded
|
|
117
|
+
end,
|
|
118
|
+
describe = function()
|
|
119
|
+
return 'gcpsecrets:' .. (project or '')
|
|
120
|
+
end,
|
|
121
|
+
}
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
--- The kind, as a voxgig/plugin definition.
|
|
125
|
+
M.gcpsecrets = providerplugin('gcpsecrets', function(spec)
|
|
126
|
+
return gcpsecrets(spec.project, spec.token, spec.addr, spec.metadataaddr)
|
|
127
|
+
end)
|
|
128
|
+
|
|
129
|
+
return M
|