|
|
|
@ -40,7 +40,7 @@ |
|
|
|
|
|
|
|
|
|
namespace grpc { |
|
|
|
|
|
|
|
|
|
std::shared_ptr<grpc::Channel> SecureCredentials::CreateChannel( |
|
|
|
|
std::shared_ptr<grpc::Channel> SecureChannelCredentials::CreateChannel( |
|
|
|
|
const string& target, const grpc::ChannelArguments& args) { |
|
|
|
|
grpc_channel_args channel_args; |
|
|
|
|
args.SetChannelArgs(&channel_args); |
|
|
|
@ -50,96 +50,104 @@ std::shared_ptr<grpc::Channel> SecureCredentials::CreateChannel( |
|
|
|
|
nullptr)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool SecureCredentials::ApplyToCall(grpc_call* call) { |
|
|
|
|
bool SecureCallCredentials::ApplyToCall(grpc_call* call) { |
|
|
|
|
return grpc_call_set_credentials(call, c_creds_) == GRPC_CALL_OK; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
std::shared_ptr<Credentials> WrapCredentials(grpc_credentials* creds) { |
|
|
|
|
return creds == nullptr |
|
|
|
|
? nullptr |
|
|
|
|
: std::shared_ptr<Credentials>(new SecureCredentials(creds)); |
|
|
|
|
std::shared_ptr<ChannelCredentials> WrapChannelCredentials( |
|
|
|
|
grpc_channel_credentials* creds) { |
|
|
|
|
return creds == nullptr ? nullptr : std::shared_ptr<ChannelCredentials>( |
|
|
|
|
new SecureChannelCredentials(creds)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::shared_ptr<CallCredentials> WrapCallCredentials( |
|
|
|
|
grpc_call_credentials* creds) { |
|
|
|
|
return creds == nullptr ? nullptr : std::shared_ptr<CallCredentials>( |
|
|
|
|
new SecureCallCredentials(creds)); |
|
|
|
|
} |
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<Credentials> GoogleDefaultCredentials() { |
|
|
|
|
std::shared_ptr<ChannelCredentials> GoogleDefaultCredentials() { |
|
|
|
|
GrpcLibrary init; // To call grpc_init().
|
|
|
|
|
return WrapCredentials(grpc_google_default_credentials_create()); |
|
|
|
|
return WrapChannelCredentials(grpc_google_default_credentials_create()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Builds SSL Credentials given SSL specific options
|
|
|
|
|
std::shared_ptr<Credentials> SslCredentials( |
|
|
|
|
std::shared_ptr<ChannelCredentials> SslCredentials( |
|
|
|
|
const SslCredentialsOptions& options) { |
|
|
|
|
GrpcLibrary init; // To call grpc_init().
|
|
|
|
|
grpc_ssl_pem_key_cert_pair pem_key_cert_pair = { |
|
|
|
|
options.pem_private_key.c_str(), options.pem_cert_chain.c_str()}; |
|
|
|
|
|
|
|
|
|
grpc_credentials* c_creds = grpc_ssl_credentials_create( |
|
|
|
|
grpc_channel_credentials* c_creds = grpc_ssl_credentials_create( |
|
|
|
|
options.pem_root_certs.empty() ? nullptr : options.pem_root_certs.c_str(), |
|
|
|
|
options.pem_private_key.empty() ? nullptr : &pem_key_cert_pair, nullptr); |
|
|
|
|
return WrapCredentials(c_creds); |
|
|
|
|
return WrapChannelCredentials(c_creds); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Builds credentials for use when running in GCE
|
|
|
|
|
std::shared_ptr<Credentials> GoogleComputeEngineCredentials() { |
|
|
|
|
std::shared_ptr<CallCredentials> GoogleComputeEngineCredentials() { |
|
|
|
|
GrpcLibrary init; // To call grpc_init().
|
|
|
|
|
return WrapCredentials( |
|
|
|
|
return WrapCallCredentials( |
|
|
|
|
grpc_google_compute_engine_credentials_create(nullptr)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Builds JWT credentials.
|
|
|
|
|
std::shared_ptr<Credentials> ServiceAccountJWTAccessCredentials( |
|
|
|
|
std::shared_ptr<CallCredentials> ServiceAccountJWTAccessCredentials( |
|
|
|
|
const grpc::string& json_key, long token_lifetime_seconds) { |
|
|
|
|
GrpcLibrary init; // To call grpc_init().
|
|
|
|
|
if (token_lifetime_seconds <= 0) { |
|
|
|
|
gpr_log(GPR_ERROR, |
|
|
|
|
"Trying to create JWTCredentials with non-positive lifetime"); |
|
|
|
|
return WrapCredentials(nullptr); |
|
|
|
|
return WrapCallCredentials(nullptr); |
|
|
|
|
} |
|
|
|
|
gpr_timespec lifetime = |
|
|
|
|
gpr_time_from_seconds(token_lifetime_seconds, GPR_TIMESPAN); |
|
|
|
|
return WrapCredentials(grpc_service_account_jwt_access_credentials_create( |
|
|
|
|
return WrapCallCredentials(grpc_service_account_jwt_access_credentials_create( |
|
|
|
|
json_key.c_str(), lifetime, nullptr)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Builds refresh token credentials.
|
|
|
|
|
std::shared_ptr<Credentials> GoogleRefreshTokenCredentials( |
|
|
|
|
std::shared_ptr<CallCredentials> GoogleRefreshTokenCredentials( |
|
|
|
|
const grpc::string& json_refresh_token) { |
|
|
|
|
GrpcLibrary init; // To call grpc_init().
|
|
|
|
|
return WrapCredentials(grpc_google_refresh_token_credentials_create( |
|
|
|
|
return WrapCallCredentials(grpc_google_refresh_token_credentials_create( |
|
|
|
|
json_refresh_token.c_str(), nullptr)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Builds access token credentials.
|
|
|
|
|
std::shared_ptr<Credentials> AccessTokenCredentials( |
|
|
|
|
std::shared_ptr<CallCredentials> AccessTokenCredentials( |
|
|
|
|
const grpc::string& access_token) { |
|
|
|
|
GrpcLibrary init; // To call grpc_init().
|
|
|
|
|
return WrapCredentials( |
|
|
|
|
return WrapCallCredentials( |
|
|
|
|
grpc_access_token_credentials_create(access_token.c_str(), nullptr)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Builds IAM credentials.
|
|
|
|
|
std::shared_ptr<Credentials> GoogleIAMCredentials( |
|
|
|
|
std::shared_ptr<CallCredentials> GoogleIAMCredentials( |
|
|
|
|
const grpc::string& authorization_token, |
|
|
|
|
const grpc::string& authority_selector) { |
|
|
|
|
GrpcLibrary init; // To call grpc_init().
|
|
|
|
|
return WrapCredentials(grpc_google_iam_credentials_create( |
|
|
|
|
return WrapCallCredentials(grpc_google_iam_credentials_create( |
|
|
|
|
authorization_token.c_str(), authority_selector.c_str(), nullptr)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Combines two credentials objects into a composite credentials.
|
|
|
|
|
std::shared_ptr<Credentials> CompositeCredentials( |
|
|
|
|
const std::shared_ptr<Credentials>& creds1, |
|
|
|
|
const std::shared_ptr<Credentials>& creds2) { |
|
|
|
|
// Note that we are not saving shared_ptrs to the two credentials
|
|
|
|
|
// passed in here. This is OK because the underlying C objects (i.e.,
|
|
|
|
|
// creds1 and creds2) into grpc_composite_credentials_create will see their
|
|
|
|
|
// refcounts incremented.
|
|
|
|
|
SecureCredentials* s1 = creds1->AsSecureCredentials(); |
|
|
|
|
SecureCredentials* s2 = creds2->AsSecureCredentials(); |
|
|
|
|
if (s1 && s2) { |
|
|
|
|
return WrapCredentials(grpc_composite_credentials_create( |
|
|
|
|
s1->GetRawCreds(), s2->GetRawCreds(), nullptr)); |
|
|
|
|
// Combines one channel credentials and one call credentials into a channel
|
|
|
|
|
// composite credentials.
|
|
|
|
|
std::shared_ptr<ChannelCredentials> CompositeChannelCredentials( |
|
|
|
|
const std::shared_ptr<ChannelCredentials>& channel_creds, |
|
|
|
|
const std::shared_ptr<CallCredentials>& call_creds) { |
|
|
|
|
// Note that we are not saving shared_ptrs to the two credentials passed in
|
|
|
|
|
// here. This is OK because the underlying C objects (i.e., channel_creds and
|
|
|
|
|
// call_creds) into grpc_composite_credentials_create will see their refcounts
|
|
|
|
|
// incremented.
|
|
|
|
|
SecureChannelCredentials* s_channel_creds = |
|
|
|
|
channel_creds->AsSecureCredentials(); |
|
|
|
|
SecureCallCredentials* s_call_creds = call_creds->AsSecureCredentials(); |
|
|
|
|
if (s_channel_creds && s_call_creds) { |
|
|
|
|
return WrapChannelCredentials(grpc_composite_channel_credentials_create( |
|
|
|
|
s_channel_creds->GetRawCreds(), s_call_creds->GetRawCreds(), nullptr)); |
|
|
|
|
} |
|
|
|
|
return nullptr; |
|
|
|
|
} |
|
|
|
@ -193,7 +201,7 @@ MetadataCredentialsPluginWrapper::MetadataCredentialsPluginWrapper( |
|
|
|
|
std::unique_ptr<MetadataCredentialsPlugin> plugin) |
|
|
|
|
: thread_pool_(CreateDefaultThreadPool()), plugin_(std::move(plugin)) {} |
|
|
|
|
|
|
|
|
|
std::shared_ptr<Credentials> MetadataCredentialsFromPlugin( |
|
|
|
|
std::shared_ptr<CallCredentials> MetadataCredentialsFromPlugin( |
|
|
|
|
std::unique_ptr<MetadataCredentialsPlugin> plugin) { |
|
|
|
|
GrpcLibrary init; // To call grpc_init().
|
|
|
|
|
MetadataCredentialsPluginWrapper* wrapper = |
|
|
|
@ -201,7 +209,7 @@ std::shared_ptr<Credentials> MetadataCredentialsFromPlugin( |
|
|
|
|
grpc_metadata_credentials_plugin c_plugin = { |
|
|
|
|
MetadataCredentialsPluginWrapper::GetMetadata, |
|
|
|
|
MetadataCredentialsPluginWrapper::Destroy, wrapper}; |
|
|
|
|
return WrapCredentials( |
|
|
|
|
return WrapCallCredentials( |
|
|
|
|
grpc_metadata_credentials_create_from_plugin(c_plugin, nullptr)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|