ProvisioningRunner.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. package org.maxkey.provision.thread;
  2. import java.sql.ResultSet;
  3. import java.sql.SQLException;
  4. import java.util.List;
  5. import org.apache.mybatis.jpa.query.Query;
  6. import org.maxkey.crypto.password.PasswordReciprocal;
  7. import org.maxkey.entity.ChangePassword;
  8. import org.maxkey.entity.Connectors;
  9. import org.maxkey.entity.Message;
  10. import org.maxkey.entity.Organizations;
  11. import org.maxkey.entity.UserInfo;
  12. import org.maxkey.persistence.service.ConnectorsService;
  13. import org.maxkey.provision.ProvisionAction;
  14. import org.maxkey.provision.ProvisionMessage;
  15. import org.maxkey.provision.ProvisionTopic;
  16. import org.maxkey.util.DateUtils;
  17. import org.maxkey.util.JsonUtils;
  18. import org.maxkey.util.ObjectTransformer;
  19. import org.maxkey.web.HttpRequestAdapter;
  20. import org.maxkey.web.WebContext;
  21. import org.slf4j.Logger;
  22. import org.slf4j.LoggerFactory;
  23. import org.springframework.jdbc.core.JdbcTemplate;
  24. import org.springframework.jdbc.core.RowMapper;
  25. public class ProvisioningRunner {
  26. private static final Logger _logger = LoggerFactory.getLogger(ProvisioningRunner.class);
  27. static final String PROVISION_SELECT_STATEMENT = "select * from mxk_history_provisions where connected = 0 order by sendtime asc limit 500";
  28. static final String PROVISION_UPDATE_STATEMENT = "update mxk_history_provisions set connected = connected + 1 where id = ?";
  29. static final String PROVISION_LOG_INSERT_STATEMENT = "insert into mxk_history_connector(id,conname,topic,actiontype,sourceid,sourcename,synctime,result,instid) values (? , ? , ? , ? , ? , ? , ? , ? , ? )";
  30. JdbcTemplate jdbcTemplate;
  31. ConnectorsService connectorsService;
  32. public ProvisioningRunner(ConnectorsService connectorsService,JdbcTemplate jdbcTemplate) {
  33. this.connectorsService = connectorsService;
  34. this.jdbcTemplate = jdbcTemplate;
  35. }
  36. public void provisions() {
  37. List<Connectors> listConnectors = connectorsService.query(new Query().eq("status", 1).eq("justintime", 1));
  38. List<ProvisionMessage> listProvisionMessage = jdbcTemplate.query(PROVISION_SELECT_STATEMENT, new ProvisionMessageRowMapper());
  39. for(ProvisionMessage msg : listProvisionMessage) {
  40. for(Connectors connector: listConnectors) {
  41. provision(msg,connector);
  42. }
  43. }
  44. }
  45. public void provision(ProvisionMessage provisionMessage,Connectors connector) {
  46. if(Integer.parseInt(connector.getInstId()) == provisionMessage.getInstId()) {
  47. String url = connector.getProviderUrl();
  48. if(!url.endsWith("/")) {
  49. url = url + "/";
  50. }
  51. String resultMessage = "";
  52. String objectId = "";
  53. String objectName = "";
  54. if(provisionMessage.getTopic().equalsIgnoreCase(ProvisionTopic.USERINFO_TOPIC)) {
  55. UserInfo user = (UserInfo)ObjectTransformer.deserialize(provisionMessage.getContent());
  56. user.setPassword(null);
  57. user.setDecipherable(null);
  58. objectId = user.getId();
  59. objectName = user.getDisplayName()+"("+user.getUsername()+")";
  60. resultMessage = provisionUser(user,url,provisionMessage.getActionType(),connector);
  61. provisionLog( connector.getConnName(),
  62. "Users",
  63. provisionMessage.getActionType(),
  64. objectId,
  65. objectName,
  66. resultMessage,
  67. provisionMessage.getInstId()
  68. );
  69. }else if(provisionMessage.getTopic().equalsIgnoreCase(ProvisionTopic.PASSWORD_TOPIC)) {
  70. ChangePassword changePassword = (ChangePassword)ObjectTransformer.deserialize(provisionMessage.getContent());
  71. objectId = changePassword.getUserId();
  72. objectName = changePassword.getDisplayName()+"("+changePassword.getUsername()+")";
  73. resultMessage = provisionChangePassword(changePassword,url,provisionMessage.getActionType(),connector);
  74. provisionLog( connector.getConnName(),
  75. "Password",
  76. provisionMessage.getActionType(),
  77. objectId,
  78. objectName,
  79. resultMessage,
  80. provisionMessage.getInstId()
  81. );
  82. }else if(provisionMessage.getTopic().equalsIgnoreCase(ProvisionTopic.ORG_TOPIC)) {
  83. Organizations organization = (Organizations)ObjectTransformer.deserialize(provisionMessage.getContent());
  84. objectId = organization.getId();
  85. objectName = organization.getOrgName();
  86. resultMessage = provisionOrganization(organization,url,provisionMessage.getActionType(),connector);
  87. provisionLog( connector.getConnName(),
  88. "Organizations",
  89. provisionMessage.getActionType(),
  90. objectId,
  91. objectName,
  92. resultMessage,
  93. provisionMessage.getInstId()
  94. );
  95. }
  96. jdbcTemplate.update(PROVISION_UPDATE_STATEMENT,provisionMessage.getId());
  97. }
  98. }
  99. public void provisionLog(String conName,String topic,String actionType,String sourceId,String sourceName,String resultMessage,int instid) {
  100. Message<?> resultMsg = JsonUtils.stringToObject(resultMessage, Message.class);
  101. String result = "success";
  102. if(resultMsg == null || resultMsg.getCode() != 0) {
  103. result = "fail";
  104. }
  105. jdbcTemplate.update(PROVISION_LOG_INSERT_STATEMENT,
  106. WebContext.genId(),
  107. conName,
  108. topic,
  109. actionType.replace("_ACTION", "").toLowerCase(),
  110. sourceId,
  111. sourceName,
  112. DateUtils.getCurrentDateTimeAsString(),
  113. result,
  114. instid
  115. );
  116. }
  117. public String getActionType(String actionType) {
  118. if(actionType.equalsIgnoreCase(ProvisionAction.CREATE_ACTION)) {
  119. return "create";
  120. }else if(actionType.equalsIgnoreCase(ProvisionAction.UPDATE_ACTION)) {
  121. return "update";
  122. }else if(actionType.equalsIgnoreCase(ProvisionAction.DELETE_ACTION)) {
  123. return "delete";
  124. }
  125. return "";
  126. }
  127. String provisionUser(UserInfo user,String baseUrl,String actionType,Connectors connector){
  128. baseUrl = baseUrl + "Users/" + getActionType(actionType);
  129. _logger.debug("URL {} ", baseUrl);
  130. return new HttpRequestAdapter()
  131. .addHeaderAuthorizationBasic(
  132. connector.getPrincipal(),
  133. PasswordReciprocal.getInstance().decoder(connector.getCredentials()))
  134. .post(baseUrl, user);
  135. }
  136. String provisionOrganization(Organizations organization,String baseUrl,String actionType,Connectors connector){
  137. baseUrl = baseUrl + "Organizations/"+ getActionType(actionType);
  138. _logger.debug("URL {} ", baseUrl);
  139. return new HttpRequestAdapter()
  140. .addHeaderAuthorizationBasic(
  141. connector.getPrincipal(),
  142. PasswordReciprocal.getInstance().decoder(connector.getCredentials()))
  143. .post(baseUrl, organization);
  144. }
  145. String provisionChangePassword(ChangePassword changePassword,String baseUrl,String actionType,Connectors connector){
  146. baseUrl = baseUrl + "Users/changePassword";
  147. _logger.debug("URL {} ", baseUrl);
  148. return new HttpRequestAdapter()
  149. .addHeaderAuthorizationBasic(
  150. connector.getPrincipal(),
  151. PasswordReciprocal.getInstance().decoder(connector.getCredentials()))
  152. .post(baseUrl, changePassword);
  153. }
  154. public class ProvisionMessageRowMapper implements RowMapper<ProvisionMessage> {
  155. @Override
  156. public ProvisionMessage mapRow(ResultSet rs, int rowNum) throws SQLException {
  157. ProvisionMessage msg = new ProvisionMessage();
  158. msg.setId(rs.getString("id"));
  159. msg.setActionType(rs.getString("actiontype"));
  160. msg.setTopic(rs.getString("topic"));
  161. msg.setContent(rs.getString("content"));
  162. msg.setConnected(rs.getInt("connected"));
  163. msg.setInstId(rs.getInt("instid"));
  164. return msg;
  165. }
  166. }
  167. }