credential_client.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. #include "credential_client.hpp"
  2. #include "logging/logger.hpp"
  3. namespace smartbotic::credentials {
  4. using namespace common;
  5. CredentialClient::CredentialClient(const CredentialClientConfig& config)
  6. : config_(config) {
  7. channel_ = grpc::CreateChannel(config_.address, grpc::InsecureChannelCredentials());
  8. stub_ = proto::CredentialService::NewStub(channel_);
  9. LOG_INFO("CredentialClient initialized with address: {}", config_.address);
  10. }
  11. Result<HttpAuth> CredentialClient::getHttpAuth(const std::string& credential_id,
  12. const std::string& workflow_id) {
  13. proto::GetCredentialAuthRequest request;
  14. request.set_credential_id(credential_id);
  15. request.set_workflow_id(workflow_id);
  16. proto::GetCredentialAuthResponse response;
  17. grpc::ClientContext context;
  18. // Set timeout
  19. auto deadline = std::chrono::system_clock::now() +
  20. std::chrono::milliseconds(config_.timeout_ms);
  21. context.set_deadline(deadline);
  22. grpc::Status status = stub_->GetCredentialAuth(&context, request, &response);
  23. if (!status.ok()) {
  24. return Error(ErrorCode::Unavailable,
  25. "Credential service error: " + status.error_message());
  26. }
  27. if (!response.success()) {
  28. return Error(ErrorCode::NotFound, response.error());
  29. }
  30. HttpAuth auth;
  31. auth.header_name = response.header_name();
  32. auth.header_value = response.header_value();
  33. return auth;
  34. }
  35. Result<ImapData> CredentialClient::getImapCredentials(const std::string& credential_id,
  36. const std::string& workflow_id) {
  37. proto::GetImapCredentialsRequest request;
  38. request.set_credential_id(credential_id);
  39. request.set_workflow_id(workflow_id);
  40. proto::GetImapCredentialsResponse response;
  41. grpc::ClientContext context;
  42. // Set timeout
  43. auto deadline = std::chrono::system_clock::now() +
  44. std::chrono::milliseconds(config_.timeout_ms);
  45. context.set_deadline(deadline);
  46. grpc::Status status = stub_->GetImapCredentials(&context, request, &response);
  47. if (!status.ok()) {
  48. return Error(ErrorCode::Unavailable,
  49. "Credential service error: " + status.error_message());
  50. }
  51. if (!response.success()) {
  52. return Error(ErrorCode::NotFound, response.error());
  53. }
  54. ImapData data;
  55. data.host = response.host();
  56. data.port = response.port();
  57. data.username = response.username();
  58. data.password = response.password();
  59. data.use_ssl = response.use_ssl();
  60. return data;
  61. }
  62. Result<ClientCertificateData> CredentialClient::getClientCertificate(
  63. const std::string& credential_id, const std::string& workflow_id) {
  64. proto::GetClientCertificateRequest request;
  65. request.set_credential_id(credential_id);
  66. request.set_workflow_id(workflow_id);
  67. proto::GetClientCertificateResponse response;
  68. grpc::ClientContext context;
  69. auto deadline = std::chrono::system_clock::now() +
  70. std::chrono::milliseconds(config_.timeout_ms);
  71. context.set_deadline(deadline);
  72. grpc::Status status = stub_->GetClientCertificate(&context, request, &response);
  73. if (!status.ok()) {
  74. return Error(ErrorCode::Unavailable,
  75. "Credential service error: " + status.error_message());
  76. }
  77. if (!response.success()) {
  78. return Error(ErrorCode::NotFound, response.error());
  79. }
  80. ClientCertificateData data;
  81. data.certificate_pem = response.certificate_pem();
  82. data.private_key_pem = response.private_key_pem();
  83. data.passphrase = response.passphrase();
  84. return data;
  85. }
  86. Result<SmtpData> CredentialClient::getSmtpCredentials(const std::string& credential_id,
  87. const std::string& workflow_id) {
  88. proto::GetSmtpCredentialsRequest request;
  89. request.set_credential_id(credential_id);
  90. request.set_workflow_id(workflow_id);
  91. proto::GetSmtpCredentialsResponse response;
  92. grpc::ClientContext context;
  93. auto deadline = std::chrono::system_clock::now() +
  94. std::chrono::milliseconds(config_.timeout_ms);
  95. context.set_deadline(deadline);
  96. grpc::Status status = stub_->GetSmtpCredentials(&context, request, &response);
  97. if (!status.ok()) {
  98. return Error(ErrorCode::Unavailable,
  99. "Credential service error: " + status.error_message());
  100. }
  101. if (!response.success()) {
  102. return Error(ErrorCode::NotFound, response.error());
  103. }
  104. SmtpData data;
  105. data.host = response.host();
  106. data.port = response.port();
  107. data.username = response.username();
  108. data.password = response.password();
  109. data.security = response.security();
  110. data.from_address = response.from_address();
  111. data.from_name = response.from_name();
  112. return data;
  113. }
  114. Result<MysqlData> CredentialClient::getMysqlCredentials(const std::string& credential_id,
  115. const std::string& workflow_id) {
  116. proto::GetMysqlCredentialsRequest request;
  117. request.set_credential_id(credential_id);
  118. request.set_workflow_id(workflow_id);
  119. proto::GetMysqlCredentialsResponse response;
  120. grpc::ClientContext context;
  121. // Set timeout
  122. auto deadline = std::chrono::system_clock::now() +
  123. std::chrono::milliseconds(config_.timeout_ms);
  124. context.set_deadline(deadline);
  125. grpc::Status status = stub_->GetMysqlCredentials(&context, request, &response);
  126. if (!status.ok()) {
  127. return Error(ErrorCode::Unavailable,
  128. "Credential service error: " + status.error_message());
  129. }
  130. if (!response.success()) {
  131. return Error(ErrorCode::NotFound, response.error());
  132. }
  133. MysqlData data;
  134. data.host = response.host();
  135. data.port = response.port();
  136. data.username = response.username();
  137. data.password = response.password();
  138. data.database = response.database();
  139. data.use_ssl = response.use_ssl();
  140. return data;
  141. }
  142. Result<PostgresqlData> CredentialClient::getPostgresqlCredentials(const std::string& credential_id,
  143. const std::string& workflow_id) {
  144. proto::GetPostgresqlCredentialsRequest request;
  145. request.set_credential_id(credential_id);
  146. request.set_workflow_id(workflow_id);
  147. proto::GetPostgresqlCredentialsResponse response;
  148. grpc::ClientContext context;
  149. // Set timeout
  150. auto deadline = std::chrono::system_clock::now() +
  151. std::chrono::milliseconds(config_.timeout_ms);
  152. context.set_deadline(deadline);
  153. grpc::Status status = stub_->GetPostgresqlCredentials(&context, request, &response);
  154. if (!status.ok()) {
  155. return Error(ErrorCode::Unavailable,
  156. "Credential service error: " + status.error_message());
  157. }
  158. if (!response.success()) {
  159. return Error(ErrorCode::NotFound, response.error());
  160. }
  161. PostgresqlData data;
  162. data.host = response.host();
  163. data.port = response.port();
  164. data.username = response.username();
  165. data.password = response.password();
  166. data.database = response.database();
  167. data.use_ssl = response.use_ssl();
  168. return data;
  169. }
  170. Result<std::vector<CredentialInfo>> CredentialClient::listCredentials(const std::string& workflow_id) {
  171. proto::ListCredentialsRequest request;
  172. request.set_workflow_id(workflow_id);
  173. proto::ListCredentialsResponse response;
  174. grpc::ClientContext context;
  175. auto deadline = std::chrono::system_clock::now() +
  176. std::chrono::milliseconds(config_.timeout_ms);
  177. context.set_deadline(deadline);
  178. grpc::Status status = stub_->ListCredentials(&context, request, &response);
  179. if (!status.ok()) {
  180. return Error(ErrorCode::Unavailable,
  181. "Credential service error: " + status.error_message());
  182. }
  183. std::vector<CredentialInfo> credentials;
  184. for (const auto& cred : response.credentials()) {
  185. CredentialInfo info;
  186. info.id = cred.id();
  187. info.name = cred.name();
  188. info.type = credentialTypeFromString(cred.type());
  189. info.description = cred.description();
  190. credentials.push_back(info);
  191. }
  192. return credentials;
  193. }
  194. bool CredentialClient::isConnected() const {
  195. if (!channel_) return false;
  196. auto state = channel_->GetState(false);
  197. return state == GRPC_CHANNEL_READY || state == GRPC_CHANNEL_IDLE;
  198. }
  199. } // namespace smartbotic::credentials