• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
19 #ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_PLUGIN_PLUGIN_CREDENTIALS_H
20 #define GRPC_CORE_LIB_SECURITY_CREDENTIALS_PLUGIN_PLUGIN_CREDENTIALS_H
21 
22 #include <grpc/support/port_platform.h>
23 
24 #include "src/core/lib/security/credentials/credentials.h"
25 
26 extern grpc_core::TraceFlag grpc_plugin_credentials_trace;
27 
28 // This type is forward declared as a C struct and we cannot define it as a
29 // class. Otherwise, compiler will complain about type mismatch due to
30 // -Wmismatched-tags.
31 struct grpc_plugin_credentials final : public grpc_call_credentials {
32  public:
33   struct pending_request {
34     bool cancelled;
35     struct grpc_plugin_credentials* creds;
36     grpc_credentials_mdelem_array* md_array;
37     grpc_closure* on_request_metadata;
38     struct pending_request* prev;
39     struct pending_request* next;
40   };
41 
42   explicit grpc_plugin_credentials(grpc_metadata_credentials_plugin plugin,
43                                    grpc_security_level min_security_level);
44   ~grpc_plugin_credentials() override;
45 
46   bool get_request_metadata(grpc_polling_entity* pollent,
47                             grpc_auth_metadata_context context,
48                             grpc_credentials_mdelem_array* md_array,
49                             grpc_closure* on_request_metadata,
50                             grpc_error** error) override;
51 
52   void cancel_get_request_metadata(grpc_credentials_mdelem_array* md_array,
53                                    grpc_error* error) override;
54 
55   // Checks if the request has been cancelled.
56   // If not, removes it from the pending list, so that it cannot be
57   // cancelled out from under us.
58   // When this returns, r->cancelled indicates whether the request was
59   // cancelled before completion.
60   void pending_request_complete(pending_request* r);
61 
62   std::string debug_string() override;
63 
64  private:
65   void pending_request_remove_locked(pending_request* pending_request);
66 
67   grpc_metadata_credentials_plugin plugin_;
68   gpr_mu mu_;
69   pending_request* pending_requests_ = nullptr;
70 };
71 
72 #endif /* GRPC_CORE_LIB_SECURITY_CREDENTIALS_PLUGIN_PLUGIN_CREDENTIALS_H */
73