plugin_credentials.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2016 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
20 
22 
23 #include <atomic>
24 #include <type_traits>
25 
26 #include "absl/status/status.h"
27 #include "absl/strings/str_cat.h"
28 #include "absl/strings/string_view.h"
29 
30 #include <grpc/slice.h>
31 #include <grpc/support/alloc.h>
32 #include <grpc/support/log.h>
33 
42 
43 grpc_core::TraceFlag grpc_plugin_credentials_trace(false, "plugin_credentials");
44 
46  if (plugin_.state != nullptr && plugin_.destroy != nullptr) {
48  }
49 }
50 
52  char* debug_c_str = nullptr;
53  if (plugin_.debug_string != nullptr) {
54  debug_c_str = plugin_.debug_string(plugin_.state);
55  }
56  std::string debug_str(
57  debug_c_str != nullptr
58  ? debug_c_str
59  : "grpc_plugin_credentials did not provide a debug string");
60  gpr_free(debug_c_str);
61  return debug_str;
62 }
63 
65  static grpc_core::UniqueTypeName::Factory kFactory("Plugin");
66  return kFactory.Create();
67 }
68 
71  const grpc_metadata* md, size_t num_md, grpc_status_code status,
72  const char* error_details) {
73  if (status != GRPC_STATUS_OK) {
75  "Getting metadata from plugin failed with error: ", error_details));
76  } else {
77  bool seen_illegal_header = false;
78  for (size_t i = 0; i < num_md; ++i) {
79  if (!GRPC_LOG_IF_ERROR("validate_metadata_from_plugin",
81  seen_illegal_header = true;
82  break;
83  } else if (!grpc_is_binary_header_internal(md[i].key) &&
85  "validate_metadata_from_plugin",
87  gpr_log(GPR_ERROR, "Plugin added invalid metadata value.");
88  seen_illegal_header = true;
89  break;
90  }
91  }
92  if (seen_illegal_header) {
93  return absl::UnavailableError("Illegal metadata");
94  } else {
96  for (size_t i = 0; i < num_md; ++i) {
97  md_->Append(
102  });
103  }
104  if (!error.ok()) return std::move(error);
106  }
107  }
108 }
109 
112  if (!ready_.load(std::memory_order_acquire)) {
113  return grpc_core::Pending{};
114  }
115  return ProcessPluginResult(metadata_.data(), metadata_.size(), status_,
116  error_details_.c_str());
117 }
118 
120  void* request, const grpc_metadata* md, size_t num_md,
121  grpc_status_code status, const char* error_details) {
122  /* called from application code */
123  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
130  "plugin_credentials[%p]: request %p: plugin returned "
131  "asynchronously",
132  r->creds(), r.get());
133  }
134  for (size_t i = 0; i < num_md; ++i) {
136  p.key = grpc_slice_ref_internal(md[i].key);
137  p.value = grpc_slice_ref_internal(md[i].value);
138  r->metadata_.push_back(p);
139  }
140  r->error_details_ = error_details == nullptr ? "" : error_details;
141  r->status_ = status;
142  r->ready_.store(true, std::memory_order_release);
143  r->waker_.Wakeup();
144 }
145 
148  grpc_core::ClientMetadataHandle initial_metadata,
150  if (plugin_.get_metadata == nullptr) {
151  return grpc_core::Immediate(std::move(initial_metadata));
152  }
153 
154  // Create pending_request object.
155  auto request = grpc_core::MakeRefCounted<PendingRequest>(
156  Ref(), std::move(initial_metadata), args);
157  // Invoke the plugin. The callback holds a ref to us.
159  gpr_log(GPR_INFO, "plugin_credentials[%p]: request %p: invoking plugin",
160  this, request.get());
161  }
163  size_t num_creds_md = 0;
165  const char* error_details = nullptr;
166  // Add an extra ref to the request object for the async callback.
167  // If the request completes synchronously, we'll drop this later.
168  // If the request completes asynchronously, it will own a ref to the request
169  // object (which we release from our ownership below).
170  auto child_request = request->Ref();
171  if (!plugin_.get_metadata(plugin_.state, request->context(),
173  child_request.get(), creds_md, &num_creds_md,
174  &status, &error_details)) {
175  child_request.release();
178  "plugin_credentials[%p]: request %p: plugin will return "
179  "asynchronously",
180  this, request.get());
181  }
182  return [request] { return request->PollAsyncResult(); };
183  }
184  // Synchronous return.
187  "plugin_credentials[%p]: request %p: plugin returned "
188  "synchronously",
189  this, request.get());
190  }
191  auto result = request->ProcessPluginResult(creds_md, num_creds_md, status,
192  error_details);
193  // Clean up.
194  for (size_t i = 0; i < num_creds_md; ++i) {
195  grpc_slice_unref_internal(creds_md[i].key);
196  grpc_slice_unref_internal(creds_md[i].value);
197  }
198  gpr_free(const_cast<char*>(error_details));
199 
201 }
202 
207 
210  grpc_security_level min_security_level, void* reserved) {
211  GRPC_API_TRACE("grpc_metadata_credentials_create_from_plugin(reserved=%p)", 1,
212  (reserved));
213  GPR_ASSERT(reserved == nullptr);
214  return new grpc_plugin_credentials(plugin, min_security_level);
215 }
grpc_validate_header_nonbin_value_is_legal
grpc_error_handle grpc_validate_header_nonbin_value_is_legal(const grpc_slice &slice)
Definition: validate_metadata.cc:116
slice.h
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
GPR_INFO
#define GPR_INFO
Definition: include/grpc/impl/codegen/log.h:56
GRPC_EXEC_CTX_FLAG_IS_FINISHED
#define GRPC_EXEC_CTX_FLAG_IS_FINISHED
Definition: exec_ctx.h:45
GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX
#define GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX
Definition: grpc_security.h:417
grpc_core::UniqueTypeName::Factory::Create
UniqueTypeName Create()
Definition: unique_type_name.h:67
grpc_call_credentials::GetRequestMetadataArgs
Definition: src/core/lib/security/credentials/credentials.h:196
log.h
metadata_batch.h
grpc_core::MetadataMap::Append
void Append(absl::string_view key, Slice value, MetadataParseErrorFn on_error)
Definition: metadata_batch.h:1156
grpc_slice_ref_internal
const grpc_slice & grpc_slice_ref_internal(const grpc_slice &slice)
Definition: slice_refcount.h:32
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
slice.h
grpc_plugin_credentials::GetRequestMetadata
grpc_core::ArenaPromise< absl::StatusOr< grpc_core::ClientMetadataHandle > > GetRequestMetadata(grpc_core::ClientMetadataHandle initial_metadata, const GetRequestMetadataArgs *args) override
Definition: plugin_credentials.cc:147
grpc_core::Slice
Definition: src/core/lib/slice/slice.h:282
grpc_metadata_credentials_plugin::state
void * state
Definition: grpc_security.h:458
grpc_call_credentials::min_security_level
virtual grpc_security_level min_security_level() const
Definition: src/core/lib/security/credentials/credentials.h:217
benchmark.request
request
Definition: benchmark.py:77
grpc_plugin_credentials_trace
grpc_core::TraceFlag grpc_plugin_credentials_trace(false, "plugin_credentials")
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
grpc_core::StringViewFromSlice
absl::string_view StringViewFromSlice(const grpc_slice &slice)
Definition: slice_internal.h:93
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
error
grpc_error_handle error
Definition: retry_filter.cc:499
grpc_status_code
grpc_status_code
Definition: include/grpc/impl/codegen/status.h:28
grpc_call_credentials
Definition: src/core/lib/security/credentials/credentials.h:189
status
absl::Status status
Definition: rls.cc:251
grpc_plugin_credentials::grpc_plugin_credentials
grpc_plugin_credentials(grpc_metadata_credentials_plugin plugin, grpc_security_level min_security_level)
Definition: plugin_credentials.cc:203
grpc_core::ApplicationCallbackExecCtx
Definition: exec_ctx.h:283
GRPC_LOG_IF_ERROR
#define GRPC_LOG_IF_ERROR(what, error)
Definition: error.h:398
xds_manager.p
p
Definition: xds_manager.py:60
grpc_is_binary_header_internal
int grpc_is_binary_header_internal(const grpc_slice &slice)
Definition: validate_metadata.cc:126
grpc_plugin_credentials::debug_string
std::string debug_string() override
Definition: plugin_credentials.cc:51
grpc_plugin_credentials::PendingRequest::PollAsyncResult
grpc_core::Poll< absl::StatusOr< grpc_core::ClientMetadataHandle > > PollAsyncResult()
Definition: plugin_credentials.cc:111
GRPC_TRACE_FLAG_ENABLED
#define GRPC_TRACE_FLAG_ENABLED(f)
Definition: debug/trace.h:114
message
char * message
Definition: libuv/docs/code/tty-gravity/main.c:12
grpc_metadata
Definition: grpc_types.h:537
grpc_core::Pending
Definition: poll.h:29
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
GRPC_STATUS_OK
@ GRPC_STATUS_OK
Definition: include/grpc/impl/codegen/status.h:30
grpc_core::RefCountedPtr
Definition: ref_counted_ptr.h:35
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc_plugin_credentials::PendingRequest::RequestMetadataReady
static void RequestMetadataReady(void *request, const grpc_metadata *md, size_t num_md, grpc_status_code status, const char *error_details)
Definition: plugin_credentials.cc:119
grpc_plugin_credentials::PendingRequest::ProcessPluginResult
absl::StatusOr< grpc_core::ClientMetadataHandle > ProcessPluginResult(const grpc_metadata *md, size_t num_md, grpc_status_code status, const char *error_details)
Definition: plugin_credentials.cc:70
grpc_metadata_credentials_plugin::debug_string
char *(* debug_string)(void *state)
Definition: grpc_security.h:452
grpc_metadata_credentials_plugin
Definition: grpc_security.h:424
status_
absl::Status status_
Definition: outlier_detection.cc:404
error.h
slice_internal.h
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
grpc_core::ExecCtx
Definition: exec_ctx.h:97
promise.h
grpc_plugin_credentials
Definition: plugin_credentials.h:56
grpc_core::MetadataHandle< ClientMetadata >
grpc_core::TraceFlag
Definition: debug/trace.h:63
value
const char * value
Definition: hpack_parser_table.cc:165
grpc_plugin_credentials::PendingRequest
Definition: plugin_credentials.h:71
benchmark.md
md
Definition: benchmark.py:86
grpc_security_level
grpc_security_level
Definition: grpc_security_constants.h:131
key
const char * key
Definition: hpack_parser_table.cc:164
grpc_core::UniqueTypeName
Definition: unique_type_name.h:56
grpc_metadata_credentials_plugin::get_metadata
int(* get_metadata)(void *state, grpc_auth_metadata_context context, grpc_credentials_plugin_metadata_cb cb, void *user_data, grpc_metadata creds_md[GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX], size_t *num_creds_md, grpc_status_code *status, const char **error_details)
Definition: grpc_security.h:443
grpc_core::ArenaPromise
Definition: arena_promise.h:152
exec_ctx
grpc_core::ExecCtx exec_ctx
Definition: end2end_binder_transport_test.cc:75
grpc_plugin_credentials::plugin_
grpc_metadata_credentials_plugin plugin_
Definition: plugin_credentials.h:122
plugin_credentials.h
absl::Status
Definition: third_party/abseil-cpp/absl/status/status.h:424
validate_metadata.h
grpc_metadata_credentials_create_from_plugin
grpc_call_credentials * grpc_metadata_credentials_create_from_plugin(grpc_metadata_credentials_plugin plugin, grpc_security_level min_security_level, void *reserved)
Definition: plugin_credentials.cc:208
alloc.h
fix_build_deps.r
r
Definition: fix_build_deps.py:491
grpc_plugin_credentials::PendingRequest::md_
grpc_core::ClientMetadataHandle md_
Definition: plugin_credentials.h:109
grpc_validate_header_key_is_legal
grpc_error_handle grpc_validate_header_key_is_legal(const grpc_slice &slice)
Definition: validate_metadata.cc:83
exec_ctx.h
absl::UnavailableError
Status UnavailableError(absl::string_view message)
Definition: third_party/abseil-cpp/absl/status/status.cc:375
grpc_plugin_credentials::~grpc_plugin_credentials
~grpc_plugin_credentials() override
Definition: plugin_credentials.cc:45
api_trace.h
grpc_core::Immediate
promise_detail::Immediate< T > Immediate(T value)
Definition: promise/promise.h:73
grpc_core::ClientMetadataHandle
MetadataHandle< ClientMetadata > ClientMetadataHandle
Definition: transport.h:153
absl::StatusOr
Definition: abseil-cpp/absl/status/statusor.h:187
grpc_plugin_credentials::type
grpc_core::UniqueTypeName type() const override
Definition: plugin_credentials.cc:64
absl::variant
Definition: abseil-cpp/absl/types/internal/variant.h:46
grpc_core::UniqueTypeName::Factory
Definition: unique_type_name.h:60
metadata_
Metadata metadata_
Definition: binder_transport_test.cc:202
GRPC_EXEC_CTX_FLAG_THREAD_RESOURCE_LOOP
#define GRPC_EXEC_CTX_FLAG_THREAD_RESOURCE_LOOP
Definition: exec_ctx.h:48
grpc_metadata_credentials_plugin::destroy
void(* destroy)(void *state)
Definition: grpc_security.h:455
grpc_core::RefCounted< grpc_call_credentials >::Ref
RefCountedPtr< grpc_call_credentials > Ref() GRPC_MUST_USE_RESULT
Definition: ref_counted.h:287
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
GRPC_API_TRACE
#define GRPC_API_TRACE(fmt, nargs, args)
Definition: api_trace.h:48
grpc_slice_unref_internal
void grpc_slice_unref_internal(const grpc_slice &slice)
Definition: slice_refcount.h:39
port_platform.h


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:00:53