chore: show a validation action
diff --git a/bazel/private/BUILD b/bazel/private/BUILD
index 8c1c94a..7a85233 100644
--- a/bazel/private/BUILD
+++ b/bazel/private/BUILD
@@ -1,5 +1,11 @@
load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
load(":native_bool_flag.bzl", "native_bool_flag")
+load(":protoc_authenticity.bzl", "protoc_authenticity")
+
+protoc_authenticity(
+ name = "authenticity_check",
+ visibility = ["//visibility:public"],
+)
package(default_applicable_licenses = ["//:license"])
diff --git a/bazel/private/proto_library_rule.bzl b/bazel/private/proto_library_rule.bzl
index 8077fa3..7ad6311 100644
--- a/bazel/private/proto_library_rule.bzl
+++ b/bazel/private/proto_library_rule.bzl
@@ -375,6 +375,9 @@
for use with MessageSet.
""",
),
+ "_authenticity_check": attr.label(
+ default = "//bazel/private:authenticity_check",
+ ),
# buildifier: disable=attr-license (calling attr.license())
"licenses": attr.license() if hasattr(attr, "license") else attr.string_list(),
"_experimental_proto_descriptor_sets_include_source_info": attr.label(
diff --git a/bazel/private/protoc_authenticity.bzl b/bazel/private/protoc_authenticity.bzl
new file mode 100644
index 0000000..4993ccf
--- /dev/null
+++ b/bazel/private/protoc_authenticity.bzl
@@ -0,0 +1,42 @@
+"Checks that the protoc binary is authentic and not spoofed by a malicious actor"
+load("//bazel/common:proto_common.bzl", "proto_common")
+load("toolchain_helpers.bzl", "toolchains")
+
+def _protoc_authenticity_impl(ctx):
+ if proto_common.INCOMPATIBLE_ENABLE_PROTO_TOOLCHAIN_RESOLUTION:
+ toolchain = ctx.toolchains[toolchains.PROTO_TOOLCHAIN]
+ if not toolchain:
+ fail("Protocol compiler toolchain could not be resolved.")
+ proto_lang_toolchain_info = toolchain.proto
+ else:
+ proto_lang_toolchain_info = proto_common.ProtoLangToolchainInfo(
+ out_replacement_format_flag = "--descriptor_set_out=%s",
+ output_files = "single",
+ mnemonic = "GenProtoDescriptorSet",
+ progress_message = "Generating Descriptor Set proto_library %{label}",
+ proto_compiler = ctx.executable._proto_compiler,
+ protoc_opts = ctx.fragments.proto.experimental_protoc_opts,
+ plugin = None,
+ )
+ validation_output = ctx.actions.declare_file("validation_output.txt")
+
+ ctx.actions.run_shell(
+ outputs = [validation_output],
+ tools = [proto_lang_toolchain_info.proto_compiler],
+ command = proto_lang_toolchain_info.proto_compiler.path + " --version ; echo 'protoc came from an untrusted source, we do not support this. To suppress this warning run with --norun_validations'; false".format(),
+ )
+ return [OutputGroupInfo(_validation = depset([validation_output]))]
+
+protoc_authenticity = rule(
+ implementation = _protoc_authenticity_impl,
+ fragments = ["proto"],
+ attrs = toolchains.if_legacy_toolchain({
+ "_proto_compiler": attr.label(
+ cfg = "exec",
+ executable = True,
+ allow_files = True,
+ default = "//src/google/protobuf/compiler:protoc_minimal",
+ ),
+ }),
+ toolchains = toolchains.use_toolchain(toolchains.PROTO_TOOLCHAIN),
+)
\ No newline at end of file