blob: 41ee8bc7f6f1060b0366af496ade197b29c7a087 [file]
#include "peer_identity_grpc.h"
#include <string_view>
#include "absl/strings/match.h"
#include "peer_identity.h"
#include "g3/grpc_headers.h"
namespace milotic::authz {
grpc::Status ExtractPeerIdentityFromAuthContext(
const grpc::AuthContext& context, PeerSpiffeIdentity& peer_identity) {
if (!context.IsPeerAuthenticated()) {
return grpc::Status(grpc::StatusCode::UNAUTHENTICATED,
"Peer is unauthenticated");
}
if (context.GetPeerIdentityPropertyName() != GRPC_X509_SAN_PROPERTY_NAME) {
return grpc::Status(grpc::StatusCode::PERMISSION_DENIED,
"Peer identity isn't X.509 SAN");
}
for (const grpc::string_ref& val : context.GetPeerIdentity()) {
std::string_view str(val.data(), val.size());
// As per SPIFFE specification, SPIFFE schema and trust domain are case
// insensitive.
// https://github.com/spiffe/spiffe/blob/main/standards/SPIFFE-ID.md#24-spiffe-id-parsing
if (absl::StartsWithIgnoreCase(str, "spiffe://")) {
peer_identity.spiffe_id = str;
} else if (absl::EndsWith(str, ".prod.google.com")) {
// BMC peers are expected to have only one FQDN.
peer_identity.fqdn = str;
}
}
return grpc::Status::OK;
}
} // namespace milotic::authz