|
|
|
@ -69,19 +69,27 @@ class CredentialsProvider { |
|
|
|
|
|
|
|
|
|
class DefaultCredentialsProvider : public CredentialsProvider { |
|
|
|
|
public: |
|
|
|
|
~DefaultCredentialsProvider() override {} |
|
|
|
|
~DefaultCredentialsProvider() GRPC_OVERRIDE {} |
|
|
|
|
|
|
|
|
|
void AddSecureType( |
|
|
|
|
const grpc::string& type, |
|
|
|
|
std::unique_ptr<CredentialTypeProvider> type_provider) override { |
|
|
|
|
void AddSecureType(const grpc::string& type, |
|
|
|
|
std::unique_ptr<CredentialTypeProvider> type_provider) |
|
|
|
|
GRPC_OVERRIDE { |
|
|
|
|
// This clobbers any existing entry for type, except the defaults, which
|
|
|
|
|
// can't be clobbered.
|
|
|
|
|
grpc::unique_lock<grpc::mutex> lock(mu_); |
|
|
|
|
added_secure_types_[type] = std::move(type_provider); |
|
|
|
|
auto it = std::find(added_secure_type_names_.begin(), |
|
|
|
|
added_secure_type_names_.end(), type); |
|
|
|
|
if (it == added_secure_type_names_.end()) { |
|
|
|
|
added_secure_type_names_.push_back(type); |
|
|
|
|
added_secure_type_providers_.push_back(std::move(type_provider)); |
|
|
|
|
} else { |
|
|
|
|
added_secure_type_providers_[it - added_secure_type_names_.begin()] = |
|
|
|
|
std::move(type_provider); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::shared_ptr<ChannelCredentials> GetChannelCredentials( |
|
|
|
|
const grpc::string& type, ChannelArguments* args) override { |
|
|
|
|
const grpc::string& type, ChannelArguments* args) GRPC_OVERRIDE { |
|
|
|
|
if (type == grpc::testing::kInsecureCredentialsType) { |
|
|
|
|
return InsecureChannelCredentials(); |
|
|
|
|
} else if (type == grpc::testing::kTlsCredentialsType) { |
|
|
|
@ -90,17 +98,19 @@ class DefaultCredentialsProvider : public CredentialsProvider { |
|
|
|
|
return SslCredentials(ssl_opts); |
|
|
|
|
} else { |
|
|
|
|
grpc::unique_lock<grpc::mutex> lock(mu_); |
|
|
|
|
auto it(added_secure_types_.find(type)); |
|
|
|
|
if (it == added_secure_types_.end()) { |
|
|
|
|
auto it(std::find(added_secure_type_names_.begin(), |
|
|
|
|
added_secure_type_names_.end(), type)); |
|
|
|
|
if (it == added_secure_type_names_.end()) { |
|
|
|
|
gpr_log(GPR_ERROR, "Unsupported credentials type %s.", type.c_str()); |
|
|
|
|
return nullptr; |
|
|
|
|
return grpc::nullptr; |
|
|
|
|
} |
|
|
|
|
return it->second->GetChannelCredentials(args); |
|
|
|
|
return added_secure_type_providers_[it - added_secure_type_names_.begin()] |
|
|
|
|
->GetChannelCredentials(args); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::shared_ptr<ServerCredentials> GetServerCredentials( |
|
|
|
|
const grpc::string& type) override { |
|
|
|
|
const grpc::string& type) GRPC_OVERRIDE { |
|
|
|
|
if (type == grpc::testing::kInsecureCredentialsType) { |
|
|
|
|
return InsecureServerCredentials(); |
|
|
|
|
} else if (type == grpc::testing::kTlsCredentialsType) { |
|
|
|
@ -112,32 +122,36 @@ class DefaultCredentialsProvider : public CredentialsProvider { |
|
|
|
|
return SslServerCredentials(ssl_opts); |
|
|
|
|
} else { |
|
|
|
|
grpc::unique_lock<grpc::mutex> lock(mu_); |
|
|
|
|
auto it(added_secure_types_.find(type)); |
|
|
|
|
if (it == added_secure_types_.end()) { |
|
|
|
|
auto it(std::find(added_secure_type_names_.begin(), |
|
|
|
|
added_secure_type_names_.end(), type)); |
|
|
|
|
if (it == added_secure_type_names_.end()) { |
|
|
|
|
gpr_log(GPR_ERROR, "Unsupported credentials type %s.", type.c_str()); |
|
|
|
|
return nullptr; |
|
|
|
|
return grpc::nullptr; |
|
|
|
|
} |
|
|
|
|
return it->second->GetServerCredentials(); |
|
|
|
|
return added_secure_type_providers_[it - added_secure_type_names_.begin()] |
|
|
|
|
->GetServerCredentials(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
std::vector<grpc::string> GetSecureCredentialsTypeList() override { |
|
|
|
|
std::vector<grpc::string> GetSecureCredentialsTypeList() GRPC_OVERRIDE { |
|
|
|
|
std::vector<grpc::string> types; |
|
|
|
|
types.push_back(grpc::testing::kTlsCredentialsType); |
|
|
|
|
grpc::unique_lock<grpc::mutex> lock(mu_); |
|
|
|
|
for (const auto& type_pair : added_secure_types_) { |
|
|
|
|
types.push_back(type_pair.first); |
|
|
|
|
for (auto it = added_secure_type_names_.begin(); |
|
|
|
|
it != added_secure_type_names_.end(); it++) { |
|
|
|
|
types.push_back(*it); |
|
|
|
|
} |
|
|
|
|
return types; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
grpc::mutex mu_; |
|
|
|
|
std::unordered_map<grpc::string, std::unique_ptr<CredentialTypeProvider> > |
|
|
|
|
added_secure_types_; |
|
|
|
|
std::vector<grpc::string> added_secure_type_names_; |
|
|
|
|
std::vector<std::unique_ptr<CredentialTypeProvider>> |
|
|
|
|
added_secure_type_providers_; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
gpr_once g_once_init_provider = GPR_ONCE_INIT; |
|
|
|
|
CredentialsProvider* g_provider = nullptr; |
|
|
|
|
CredentialsProvider* g_provider = grpc::nullptr; |
|
|
|
|
|
|
|
|
|
void CreateDefaultProvider() { g_provider = new DefaultCredentialsProvider; } |
|
|
|
|
|
|
|
|
|