From eb72879be0d27402e2b188410a8c99bf71b3a575 Mon Sep 17 00:00:00 2001 From: Muralidhar Basani Date: Sun, 8 Sep 2019 18:56:03 +0200 Subject: [PATCH 1/5] Delete Team feature --- README.md | 2 + .../environments/local/application.properties | 2 +- .../uiapi/controller/UiConfigController.java | 73 ++++++++++-------- .../uiapi/helpers/HandleDbRequests.java | 2 + .../helpers/db/cassandra/DeleteData.java | 9 +++ .../cassandra/HandleDbRequestsCassandra.java | 5 ++ .../helpers/db/rdbms/DeleteDataJdbc.java | 10 +++ .../db/rdbms/HandleDbRequestsJdbc.java | 5 ++ .../uiapi/service/AclControllerService.java | 47 +++-------- .../kafkamgt/uiapi/service/ManageTopics.java | 4 + .../SchemaRegstryControllerService.java | 18 ++--- .../uiapi/service/TopicControllerService.java | 67 +++------------- .../uiapi/service/UtilControllerService.java | 62 +++++++-------- .../kafkamgt/uiapi/service/UtilService.java | 29 +++++++ .../main/resources/static/js/manageUsers.js | 27 +++++++ .../main/resources/templates/showTeams.html | 4 + screenshots/Dashboard.JPG | Bin 0 -> 128816 bytes screenshots/ViewTeams.JPG | Bin 0 -> 98389 bytes 18 files changed, 194 insertions(+), 172 deletions(-) create mode 100644 kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/UtilService.java create mode 100644 screenshots/Dashboard.JPG create mode 100644 screenshots/ViewTeams.JPG diff --git a/README.md b/README.md index f9a80c0..d3f6155 100644 --- a/README.md +++ b/README.md @@ -42,3 +42,5 @@ Download options : https://kafkawize.readthedocs.io/en/latest/getting_started.ht ![ImageFig17](https://github.com/kafkawize/kafkawize/blob/master/screenshots/ActivityLog.JPG) ![ImageFig18](https://github.com/kafkawize/kafkawize/blob/master/screenshots/ViewUsers.JPG) + +![ImageFig20](https://github.com/kafkawize/kafkawize/blob/master/screenshots/ViewTeams.JPG) \ No newline at end of file diff --git a/kafkawize-conf/environments/local/application.properties b/kafkawize-conf/environments/local/application.properties index 8185302..1ad383e 100644 --- a/kafkawize-conf/environments/local/application.properties +++ b/kafkawize-conf/environments/local/application.properties @@ -3,7 +3,7 @@ server.port:9097 server.servlet.context-path=/kafkawize # db.storetype should be "cassandra" or "rdbms" -db.storetype=rdbms +db.storetype=cassandra # cluster api properties clusterapi.url:http://localhost:9343 diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/UiConfigController.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/UiConfigController.java index 7cce3e2..bbdfb4b 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/UiConfigController.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/UiConfigController.java @@ -5,6 +5,7 @@ import com.kafkamgt.uiapi.dao.Env; import com.kafkamgt.uiapi.dao.UserInfo; import com.kafkamgt.uiapi.service.ManageTopics; +import com.kafkamgt.uiapi.service.UtilService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -28,6 +29,9 @@ public class UiConfigController { //private static Logger LOG = LoggerFactory.getLogger(UiConfigController.class); + @Autowired + private UtilService utilService; + @Autowired private ManageTopics manageTopics; @@ -43,7 +47,7 @@ public ResponseEntity> getSchemaRegEnvs() { @RequestMapping(value = "/getAllTeams", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity> getAllTeams() { - return new ResponseEntity<>(manageTopics.selectAllTeamsOfUsers(getUserName()), HttpStatus.OK); + return new ResponseEntity<>(manageTopics.selectAllTeamsOfUsers(utilService.getUserName()), HttpStatus.OK); } @RequestMapping(value = "/getAllTeamsSU", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) @@ -62,16 +66,8 @@ public UiConfigController(InMemoryUserDetailsManager inMemoryUserDetailsManager) @PostMapping(value = "/addNewEnv") public ResponseEntity addNewEnv(@RequestBody Env newEnv){ - UserDetails userDetails = getUserDetails(); - - GrantedAuthority ga = userDetails.getAuthorities().iterator().next(); - String authority = ga.getAuthority(); - String json = ""; - if(authority.equals("ROLE_SUPERUSER")){} - else{ - json = "{ \"result\": \"Not Authorized\" }"; - return new ResponseEntity(json, HttpStatus.OK); - } + if(!utilService.checkAuthorizedSU()) + return new ResponseEntity<>("{ \"result\": \"Not Authorized\" }", HttpStatus.OK); newEnv.setTrustStorePwd(""); newEnv.setKeyPwd(""); @@ -81,24 +77,47 @@ public ResponseEntity addNewEnv(@RequestBody Env newEnv){ String execRes = manageTopics.addNewEnv(newEnv); String envAddResult = "{\"result\":\""+execRes+"\"}"; - return new ResponseEntity(envAddResult, HttpStatus.OK); + return new ResponseEntity<>(envAddResult, HttpStatus.OK); } @PostMapping(value = "/deleteClusterRequest") public ResponseEntity deleteCluster(@RequestParam ("clusterId") String clusterId){ + if(!utilService.checkAuthorizedSU()) + return new ResponseEntity<>("{ \"result\": \"Not Authorized\" }", HttpStatus.OK); + String execRes = manageTopics.deleteClusterRequest(clusterId); String envAddResult = "{\"result\":\""+execRes+"\"}"; return new ResponseEntity<>(envAddResult, HttpStatus.OK); } + @PostMapping(value = "/deleteTeamRequest") + public ResponseEntity deleteTeam(@RequestParam ("teamId") String teamId){ + + if(!utilService.checkAuthorizedSU()) + return new ResponseEntity<>("{ \"result\": \"Not Authorized\" }", HttpStatus.OK); + + String envAddResult = "{\"result\":\"Your team cannot be deleted. Try deleting other team.\"}"; + + if(manageTopics.getUsersInfo(utilService.getUserName()).getTeam().equals(teamId)) + return new ResponseEntity<>(envAddResult, HttpStatus.OK); + + String execRes = manageTopics.deleteTeamRequest(teamId); + envAddResult = "{\"result\":\""+execRes+"\"}"; + + return new ResponseEntity<>(envAddResult, HttpStatus.OK); + } + @PostMapping(value = "/deleteUserRequest") public ResponseEntity deleteUser(@RequestParam ("userId") String userId){ + if(!utilService.checkAuthorizedSU()) + return new ResponseEntity<>("{ \"result\": \"Not Authorized\" }", HttpStatus.OK); + String envAddResult = "{\"result\":\"User cannot be deleted\"}"; - if(userId.equals("superuser") || getUserName().equals(userId)) + if(userId.equals("superuser") || utilService.getUserName().equals(userId)) return new ResponseEntity<>(envAddResult, HttpStatus.OK); String execRes = manageTopics.deleteUserRequest(userId); @@ -110,6 +129,9 @@ public ResponseEntity deleteUser(@RequestParam ("userId") String userId) @PostMapping(value = "/addNewUser") public ResponseEntity addNewUser(@RequestBody UserInfo newUser){ + if(!utilService.checkAuthorizedSU()) + return new ResponseEntity<>("{ \"result\": \"Not Authorized\" }", HttpStatus.OK); + PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder(); inMemoryUserDetailsManager.createUser(User.withUsername(newUser.getUsername()).password(encoder.encode(newUser.getPwd())) @@ -124,16 +146,8 @@ public ResponseEntity addNewUser(@RequestBody UserInfo newUser){ @PostMapping(value = "/addNewTeam") public ResponseEntity addNewTeam(@RequestBody Team newTeam){ - UserDetails userDetails = getUserDetails(); - - GrantedAuthority ga = userDetails.getAuthorities().iterator().next(); - String authority = ga.getAuthority(); - String json = ""; - if(authority.equals("ROLE_SUPERUSER")){} - else{ - json = "{ \"result\": \"Not Authorized\" }"; - return new ResponseEntity<>(json, HttpStatus.OK); - } + if(!utilService.checkAuthorizedSU()) + return new ResponseEntity<>("{ \"result\": \"Not Authorized\" }", HttpStatus.OK); String execRes = manageTopics.addNewTeam(newTeam); @@ -144,7 +158,7 @@ public ResponseEntity addNewTeam(@RequestBody Team newTeam){ @PostMapping(value = "/chPwd") public ResponseEntity changePwd(@RequestParam ("changePwd") String changePwd){ - UserDetails userDetails = getUserDetails(); + UserDetails userDetails = utilService.getUserDetails(); GsonJsonParser jsonParser = new GsonJsonParser(); Map pwdMap = jsonParser.parseMap(changePwd); @@ -209,7 +223,7 @@ public ResponseEntity> showUsers(){ @RequestMapping(value = "/getMyProfileInfo", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity getMyProfileInfo(){ - UserInfo userList = manageTopics.getUsersInfo(getUserName()); + UserInfo userList = manageTopics.getUsersInfo(utilService.getUserName()); return new ResponseEntity<>(userList, HttpStatus.OK); } @@ -217,7 +231,7 @@ public ResponseEntity getMyProfileInfo(){ @RequestMapping(value = "/activityLog", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity> showActivityLog(@RequestParam("env") String env, @RequestParam("pageNo") String pageNo){ - List origActivityList = manageTopics.selectActivityLog(getUserName(), env); + List origActivityList = manageTopics.selectActivityLog(utilService.getUserName(), env); int totalRecs = origActivityList.size(); int recsPerPage = 20; @@ -246,12 +260,5 @@ public ResponseEntity> showActivityLog(@RequestParam("env") St return new ResponseEntity<>(newList, HttpStatus.OK); } - private String getUserName(){ - UserDetails userDetails = (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - return userDetails.getUsername(); - } - private UserDetails getUserDetails(){ - return (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - } } diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/HandleDbRequests.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/HandleDbRequests.java index aa48a86..926d44e 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/HandleDbRequests.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/HandleDbRequests.java @@ -91,6 +91,8 @@ public interface HandleDbRequests { public String deleteUserRequest(String userId); + public String deleteTeamRequest(String teamId); + public String deleteSchemaRequest(String topicName, String schemaVersion, String env); public String deletePrevAclRecs(List aclReqs); diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/cassandra/DeleteData.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/cassandra/DeleteData.java index 5d40c85..f4f9a05 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/cassandra/DeleteData.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/cassandra/DeleteData.java @@ -75,6 +75,15 @@ public String deleteUserRequest(String userId){ return "success"; } + public String deleteTeamRequest(String teamId){ + + Clause eqclause = QueryBuilder.eq("team",teamId); + Delete.Where deleteQuery = QueryBuilder.delete().all().from(keyspace,"teams") + .where(eqclause); + session.execute(deleteQuery); + return "success"; + } + public String deletePrevAclRecs(List aclReqs){ //if( (aclListItem.get("resourceName").equals(aclSotItem.getTopicname()) || diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/cassandra/HandleDbRequestsCassandra.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/cassandra/HandleDbRequestsCassandra.java index 408c6f4..6918435 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/cassandra/HandleDbRequestsCassandra.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/cassandra/HandleDbRequestsCassandra.java @@ -238,6 +238,11 @@ public String deleteUserRequest(String userId) { return cassandraDeleteHelper.deleteUserRequest(userId); } + @Override + public String deleteTeamRequest(String teamId) { + return cassandraDeleteHelper.deleteTeamRequest(teamId); + } + public String deleteSchemaRequest(String topicName, String schemaVersion, String env){ return cassandraDeleteHelper.deleteSchemaRequest(topicName,schemaVersion, env); } diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/rdbms/DeleteDataJdbc.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/rdbms/DeleteDataJdbc.java index f12d824..f881976 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/rdbms/DeleteDataJdbc.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/rdbms/DeleteDataJdbc.java @@ -25,6 +25,9 @@ public class DeleteDataJdbc { @Autowired(required = false) EnvRepo envRepo; + @Autowired(required=false) + TeamRepo teamRepo; + @Autowired(required=false) AclRequestsRepo aclRequestsRepo; @@ -85,6 +88,13 @@ public String deleteUserRequest(String userId){ return "success"; } + public String deleteTeamRequest(String teamId){ + Team team = new Team(); + team.setTeamname(teamId); + teamRepo.delete(team); + return "success"; + } + public String deletePrevAclRecs(List aclsToBeDeleted){ List allAcls = Lists.newArrayList(aclRepo.findAll()); diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/rdbms/HandleDbRequestsJdbc.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/rdbms/HandleDbRequestsJdbc.java index 5402427..d213e45 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/rdbms/HandleDbRequestsJdbc.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/rdbms/HandleDbRequestsJdbc.java @@ -204,6 +204,11 @@ public String deleteUserRequest(String userId) { return jdbcDeleteHelper.deleteUserRequest(userId); } + @Override + public String deleteTeamRequest(String teamId) { + return jdbcDeleteHelper.deleteTeamRequest(teamId); + } + public String deleteSchemaRequest(String topicName, String schemaVersion, String env){ return jdbcDeleteHelper.deleteSchemaRequest(topicName,schemaVersion, env); } diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/AclControllerService.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/AclControllerService.java index c91732c..91bd4a3 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/AclControllerService.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/AclControllerService.java @@ -9,8 +9,6 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Service; @@ -30,20 +28,14 @@ public class AclControllerService { ManageTopics createTopicHelper; @Autowired - ClusterApiService clusterApiService; - - private String getUserName(){ - UserDetails userDetails = (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - return userDetails.getUsername(); - } + private UtilService utilService; - private UserDetails getUserDetails(){ - return (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - } + @Autowired + ClusterApiService clusterApiService; public String createAcl(AclRequests aclReq) { - aclReq.setUsername(getUserName()); + aclReq.setUsername(utilService.getUserName()); String execRes = createTopicHelper.requestForAcl(aclReq); return "{\"result\":\""+execRes+"\"}"; @@ -51,14 +43,8 @@ public String createAcl(AclRequests aclReq) { public String updateSyncAcls(String updateSyncAcls, String envSelected) { - UserDetails userDetails = getUserDetails(); - - GrantedAuthority ga = userDetails.getAuthorities().iterator().next(); - String authority = ga.getAuthority(); - if(authority.equals("ROLE_SUPERUSER")){} - else{ + if(!utilService.checkAuthorizedSU()) return "{ \"result\": \"Not Authorized\" }"; - } StringTokenizer strTkr = new StringTokenizer(updateSyncAcls,"\n"); String topicSel=null,teamSelected=null,consumerGroup=null,aclIp=null,aclSsl=null,aclType=null,tmpToken=null; @@ -100,11 +86,11 @@ public String updateSyncAcls(String updateSyncAcls, String envSelected) { } public List getAclRequests() { - return createTopicHelper.getAllAclRequests(getUserName()); + return createTopicHelper.getAllAclRequests(utilService.getUserName()); } public List getCreatedAclRequests() { - return createTopicHelper.getCreatedAclRequests(getUserName()); + return createTopicHelper.getCreatedAclRequests(utilService.getUserName()); } public String deleteAclRequests(String req_no) { @@ -121,23 +107,14 @@ public String approveAclRequests(String req_no) { String updateAclReqStatus = response.getBody(); if(response.getBody().equals("success")) - updateAclReqStatus = createTopicHelper.updateAclRequest(aclReq,getUserName()); + updateAclReqStatus = createTopicHelper.updateAclRequest(aclReq,utilService.getUserName()); return "{\"result\":\""+updateAclReqStatus+"\"}"; } public List getAcls(String env, String pageNo, String topicNameSearch, boolean isSyncAcls) { - UserDetails userDetails = getUserDetails(); - - GrantedAuthority ga = userDetails.getAuthorities().iterator().next(); - String authority = ga.getAuthority(); - - if(authority.equals("ROLE_USER") || authority.equals("ROLE_ADMIN") || authority.equals("ROLE_SUPERUSER")){} - else{ - List topicsList1 = new ArrayList(); - return topicsList1; - } + UserDetails userDetails = utilService.getUserDetails(); if(topicNameSearch != null) topicNameSearch = topicNameSearch.trim(); @@ -182,7 +159,7 @@ public List applyFiltersAcls(String env, List> a List teamList = new ArrayList<>(); if(isSyncAcls) { - createTopicHelper.selectAllTeamsOfUsers(getUserName()) + createTopicHelper.selectAllTeamsOfUsers(utilService.getUserName()) .forEach(teamS -> teamList.add(teamS.getTeamname())); } @@ -289,8 +266,4 @@ public int counterIncrement() topicCounter++; return topicCounter; } - - - - } diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/ManageTopics.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/ManageTopics.java index 30ee1b4..7f8728b 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/ManageTopics.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/ManageTopics.java @@ -198,6 +198,10 @@ public String deleteUserRequest(String userId){ return handleDbRequests.deleteUserRequest(userId); } + public String deleteTeamRequest(String teamId){ + return handleDbRequests.deleteTeamRequest(teamId); + } + public String deleteSchemaRequest(String topicName, String schemaVersion, String env){ return handleDbRequests.deleteSchemaRequest(topicName,schemaVersion, env); } diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/SchemaRegstryControllerService.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/SchemaRegstryControllerService.java index c91b26e..d387711 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/SchemaRegstryControllerService.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/SchemaRegstryControllerService.java @@ -23,22 +23,16 @@ public class SchemaRegstryControllerService { @Autowired ClusterApiService clusterApiService; - private String getUserName(){ - UserDetails userDetails = (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - return userDetails.getUsername(); - } - - private UserDetails getUserDetails(){ - return (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - } + @Autowired + private UtilService utilService; public List getSchemaRequests() { - return createTopicHelper.getAllSchemaRequests(getUserName()); + return createTopicHelper.getAllSchemaRequests(utilService.getUserName()); } public List getCreatedSchemaRequests() { - return createTopicHelper.getCreatedSchemaRequests(getUserName()); + return createTopicHelper.getCreatedSchemaRequests(utilService.getUserName()); } public String deleteSchemaRequests(String topicName) { @@ -63,7 +57,7 @@ public String execSchemaRequests(String topicName) { ResponseEntity response = clusterApiService.postSchema(schemaRequest, env, topicName); if(response.getBody().contains("id\":")) { - return createTopicHelper.updateSchemaRequest(schemaRequest, getUserName()); + return createTopicHelper.updateSchemaRequest(schemaRequest, utilService.getUserName()); } else { return "Failure in uploading schema" ; @@ -75,7 +69,7 @@ public String uploadSchema(SchemaRequest schemaRequest){ LOG.info(schemaRequest.getTopicname()+ "---" + schemaRequest.getTeamname()+"---"+schemaRequest.getEnvironment() + "---"+schemaRequest.getAppname()+"---"+ schemaRequest.getTeamname()); - schemaRequest.setUsername(getUserName()); + schemaRequest.setUsername(utilService.getUserName()); return createTopicHelper.requestForSchema(schemaRequest); } diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/TopicControllerService.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/TopicControllerService.java index 13b9653..de8ed95 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/TopicControllerService.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/TopicControllerService.java @@ -48,21 +48,15 @@ public class TopicControllerService { private ManageTopics createTopicHelper; @Autowired - private Environment springEnvProps; - - private String getUserName(){ - UserDetails userDetails = (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - return userDetails.getUsername(); - } + private UtilService utilService; - private UserDetails getUserDetails(){ - return (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - } + @Autowired + private Environment springEnvProps; public String createTopics(TopicRequest topicRequestReq) { LOG.info(topicRequestReq.getTopicname()+ "---" + topicRequestReq.getTeamname()+"---"+ topicRequestReq.getEnvironment() + "---"+ topicRequestReq.getAppname()); - topicRequestReq.setUsername(getUserName()); + topicRequestReq.setUsername(utilService.getUserName()); String topicPartitions = topicRequestReq.getTopicpartitions(); int topicPartitionsInt; @@ -105,12 +99,7 @@ public String createTopics(TopicRequest topicRequestReq) { public String updateSyncTopics(String updatedSyncTopics, String envSelected) { - UserDetails userDetails = getUserDetails(); - - GrantedAuthority ga = userDetails.getAuthorities().iterator().next(); - String authority = ga.getAuthority(); - if(authority.equals("ROLE_SUPERUSER")){} - else + if(!utilService.checkAuthorizedSU()) return "{ \"result\": \"Not Authorized\" }"; StringTokenizer strTkr = new StringTokenizer(updatedSyncTopics,"\n"); @@ -192,7 +181,7 @@ public List getPCStreamsPaginated(String pageNo, List aclLis public List getTopicRequests() { - return createTopicHelper.getAllTopicRequests(getUserName()); + return createTopicHelper.getAllTopicRequests(utilService.getUserName()); } public Topic getTopicTeam(String topicName, String env) { @@ -201,7 +190,7 @@ public Topic getTopicTeam(String topicName, String env) { } public List getCreatedTopicRequests() { - return createTopicHelper.getCreatedTopicRequests(getUserName()); + return createTopicHelper.getCreatedTopicRequests(utilService.getUserName()); } public String deleteTopicRequests(String topicName) { @@ -228,23 +217,13 @@ public String approveTopicRequests(String topicName) { String updateTopicReqStatus = response.getBody(); if(response.getBody().equals("success")) - updateTopicReqStatus = createTopicHelper.updateTopicRequest(topicRequest,getUserName()); + updateTopicReqStatus = createTopicHelper.updateTopicRequest(topicRequest,utilService.getUserName()); return "{\"result\":\""+updateTopicReqStatus+"\"}"; } public List getAllTopics(String env) throws Exception { - UserDetails userDetails = getUserDetails(); - GrantedAuthority ga = userDetails.getAuthorities().iterator().next(); - String authority = ga.getAuthority(); - - if (authority.equals("ROLE_USER") || authority.equals("ROLE_ADMIN") || authority.equals("ROLE_SUPERUSER")) { - } else { - List topicsList1 = new ArrayList(); - return topicsList1; - } - Env envSelected = createTopicHelper.selectEnvDetails(env); String bootstrapHost = envSelected.getHost() + ":" + envSelected.getPort(); @@ -263,16 +242,6 @@ public List getAllTopics(String env) throws Exception { public List getTopics(String env, String pageNo, String topicNameSearch) throws Exception { - UserDetails userDetails = getUserDetails(); - GrantedAuthority ga = userDetails.getAuthorities().iterator().next(); - String authority = ga.getAuthority(); - - if(authority.equals("ROLE_USER") || authority.equals("ROLE_ADMIN") || authority.equals("ROLE_SUPERUSER")){} - else { - List topicsList1 = new ArrayList(); - return topicsList1; - } - if(topicNameSearch != null) topicNameSearch = topicNameSearch.trim(); @@ -307,15 +276,7 @@ public List getTopics(String env, String pageNo, String topicNameSear public List getSyncTopics(String env, String pageNo, String topicNameSearch) throws Exception { - UserDetails userDetails = getUserDetails(); - GrantedAuthority ga = userDetails.getAuthorities().iterator().next(); - String authority = ga.getAuthority(); - - if(authority.equals("ROLE_SUPERUSER")){} - else{ - List topicsList1 = new ArrayList(); - return topicsList1; - } + UserDetails userDetails = utilService.getUserDetails(); if(topicNameSearch != null) topicNameSearch = topicNameSearch.trim(); @@ -354,16 +315,6 @@ public int counterIncrement() return topicCounter; } - HttpHeaders createHeaders(String username, String password) { - return new HttpHeaders() {{ - String auth = username + ":" + password; - byte[] encodedAuth = Base64.encodeBase64( - auth.getBytes(Charset.forName("US-ASCII"))); - String authHeader = "Basic " + new String(encodedAuth); - set("Authorization", authHeader); - }}; - } - public List getTopicList(List topicsList, List topicsFromSOT, String pageNo){ int totalRecs = topicsList.size(); int recsPerPage = 20; diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/UtilControllerService.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/UtilControllerService.java index 7987985..45da221 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/UtilControllerService.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/UtilControllerService.java @@ -47,37 +47,37 @@ public String getAuth() { if(userDetails!=null) { //LOG.info("User is " + userDetails.getUsername() + userDetails.getAuthorities()); - String teamName = createTopicHelper.getUsersInfo(userDetails.getUsername()).getTeam(); - GrantedAuthority ga = userDetails.getAuthorities().iterator().next(); - String authority = ga.getAuthority(); - - //LOG.info("auth is " + authority); - String statusAuth = null; - String statusAuthExecTopics = null; - String licenseValidity=null; - - int outstanding = createTopicHelper.getAllRequestsToBeApproved(userDetails.getUsername()); - String outstandingReqs = ""; - if(outstanding>0) - outstandingReqs = outstanding+""; - - if (authority.equals("ROLE_USER") || authority.equals("ROLE_ADMIN") || authority.equals("ROLE_SUPERUSER")) { - statusAuth = "Authorized"; - } else { - statusAuth = "NotAuthorized"; - } - - if (authority.equals("ROLE_ADMIN") || authority.equals("ROLE_SUPERUSER")) - statusAuthExecTopics = "Authorized"; - else - statusAuthExecTopics = "NotAuthorized"; - - return "{ \"status\": \"" + statusAuth + "\" ," + - " \"username\":\"" + userDetails.getUsername() + "\"," + - " \"teamname\": \"" + teamName + "\"," + - " \"companyinfo\": \"" + companyInfo + "\"," + - " \"notifications\": \"" + outstandingReqs + "\"," + - " \"statusauthexectopics\": \"" + statusAuthExecTopics + "\" }"; + String teamName = createTopicHelper.getUsersInfo(userDetails.getUsername()).getTeam(); + GrantedAuthority ga = userDetails.getAuthorities().iterator().next(); + String authority = ga.getAuthority(); + + //LOG.info("auth is " + authority); + String statusAuth = null; + String statusAuthExecTopics = null; + String licenseValidity=null; + + int outstanding = createTopicHelper.getAllRequestsToBeApproved(userDetails.getUsername()); + String outstandingReqs = ""; + if(outstanding>0) + outstandingReqs = outstanding+""; + + if (authority.equals("ROLE_USER") || authority.equals("ROLE_ADMIN") || authority.equals("ROLE_SUPERUSER")) { + statusAuth = "Authorized"; + } else { + statusAuth = "NotAuthorized"; + } + + if (authority.equals("ROLE_ADMIN") || authority.equals("ROLE_SUPERUSER")) + statusAuthExecTopics = "Authorized"; + else + statusAuthExecTopics = "NotAuthorized"; + + return "{ \"status\": \"" + statusAuth + "\" ," + + " \"username\":\"" + userDetails.getUsername() + "\"," + + " \"teamname\": \"" + teamName + "\"," + + " \"companyinfo\": \"" + companyInfo + "\"," + + " \"notifications\": \"" + outstandingReqs + "\"," + + " \"statusauthexectopics\": \"" + statusAuthExecTopics + "\" }"; } else return null; } diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/UtilService.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/UtilService.java new file mode 100644 index 0000000..e11a632 --- /dev/null +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/UtilService.java @@ -0,0 +1,29 @@ +package com.kafkamgt.uiapi.service; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Service; + +@Service +public class UtilService { + public boolean checkAuthorizedSU(){ + UserDetails userDetails = getUserDetails(); + + GrantedAuthority ga = userDetails.getAuthorities().iterator().next(); + String authority = ga.getAuthority(); + if(!authority.equals("ROLE_SUPERUSER")) + return false; + else + return true; + } + + public String getUserName(){ + UserDetails userDetails = (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + return userDetails.getUsername(); + } + + public UserDetails getUserDetails(){ + return (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + } +} diff --git a/kafkawize-web/src/main/resources/static/js/manageUsers.js b/kafkawize-web/src/main/resources/static/js/manageUsers.js index b8538f2..3c89279 100644 --- a/kafkawize-web/src/main/resources/static/js/manageUsers.js +++ b/kafkawize-web/src/main/resources/static/js/manageUsers.js @@ -99,6 +99,33 @@ app.controller("manageUsersCtrl", function($scope, $http, $location, $window) { }; + $scope.deleteTeam = function(){ + + if (!window.confirm("Are you sure, you would like to delete the team : " + + $scope.deleteTeam.idval + )) { + return; + } + + $http({ + method: "POST", + url: "deleteTeamRequest", + headers : { 'Content-Type' : 'application/json' }, + params: {'teamId' : $scope.deleteTeam.idval }, + data: {'teamId' : $scope.deleteTeam.idval} + }).success(function(output) { + + $scope.alert = "Delete Team Request : "+output.result; + $scope.loadTeamsSU(); + + }).error( + function(error) + { + $scope.alert = error; + } + ); + } + $scope.deleteUser = function(){ if (!window.confirm("Are you sure, you would like to delete the user : " diff --git a/kafkawize-web/src/main/resources/templates/showTeams.html b/kafkawize-web/src/main/resources/templates/showTeams.html index 7294a7e..0722a7e 100644 --- a/kafkawize-web/src/main/resources/templates/showTeams.html +++ b/kafkawize-web/src/main/resources/templates/showTeams.html @@ -367,6 +367,7 @@

Teams

+ @@ -376,6 +377,7 @@

Teams

+ @@ -389,6 +391,8 @@

Teams


+ + diff --git a/screenshots/Dashboard.JPG b/screenshots/Dashboard.JPG new file mode 100644 index 0000000000000000000000000000000000000000..9aae93ab08488ff80387d946fa9d743202c918e6 GIT binary patch literal 128816 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 D1n1j0 literal 0 HcmV?d00001 diff --git a/screenshots/ViewTeams.JPG b/screenshots/ViewTeams.JPG new file mode 100644 index 0000000000000000000000000000000000000000..8ea0f1d45f2b42cb39a77b235901aef9aa9d0b50 GIT binary patch literal 98389 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 L@E@ZJ9DMvg>LUJO literal 0 HcmV?d00001 From d839456afd93a8ceaaa3b759b9b7a20f16283b8d Mon Sep 17 00:00:00 2001 From: Muralidhar Basani Date: Tue, 10 Sep 2019 18:20:19 +0200 Subject: [PATCH 2/5] Add exceptions --- .../uiapi/controller/AclController.java | 7 +- .../controller/SchemaRegstryController.java | 3 +- .../uiapi/controller/TopicController.java | 3 +- .../uiapi/controller/UiConfigController.java | 202 ++------------- .../uiapi/controller/UiControllerLogin.java | 9 +- .../uiapi/service/AclControllerService.java | 5 +- .../uiapi/service/ClusterApiService.java | 133 +++++----- .../SchemaRegstryControllerService.java | 5 +- .../uiapi/service/TopicControllerService.java | 8 +- .../service/UiConfigControllerService.java | 234 ++++++++++++++++++ .../UiConfigControllerServiceTest.java | 74 ++++++ 11 files changed, 421 insertions(+), 262 deletions(-) create mode 100644 kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/UiConfigControllerService.java create mode 100644 kafkawize-web/src/test/java/com/kafkamgt/uiapi/service/UiConfigControllerServiceTest.java diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/AclController.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/AclController.java index 4a5576d..c19d2ad 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/AclController.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/AclController.java @@ -2,6 +2,7 @@ import com.kafkamgt.uiapi.dao.AclRequests; +import com.kafkamgt.uiapi.error.KafkawizeException; import com.kafkamgt.uiapi.model.AclInfo; import com.kafkamgt.uiapi.service.AclControllerService; import org.slf4j.Logger; @@ -55,18 +56,18 @@ public ResponseEntity deleteAclRequests(@RequestParam("req_no") String r } @PostMapping(value = "/execAclRequest") - public ResponseEntity approveAclRequests(@RequestParam("req_no") String req_no) { + public ResponseEntity approveAclRequests(@RequestParam("req_no") String req_no) throws KafkawizeException { return new ResponseEntity(aclControllerService.approveAclRequests(req_no), HttpStatus.OK); } @RequestMapping(value = "/getAcls", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity> getAcls(@RequestParam("env") String env, @RequestParam("pageNo") String pageNo, - @RequestParam(value="topicnamesearch",required=false) String topicNameSearch) { + @RequestParam(value="topicnamesearch",required=false) String topicNameSearch) throws KafkawizeException { return new ResponseEntity<>(aclControllerService.getAcls(env, pageNo, topicNameSearch, false), HttpStatus.OK); } @RequestMapping(value = "/getSyncAcls", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) - public ResponseEntity> getSyncAcls(@RequestParam("env") String env, @RequestParam("pageNo") String pageNo) { + public ResponseEntity> getSyncAcls(@RequestParam("env") String env, @RequestParam("pageNo") String pageNo) throws KafkawizeException { return new ResponseEntity<>(aclControllerService.getAcls(env, pageNo, null, true), HttpStatus.OK); } } diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/SchemaRegstryController.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/SchemaRegstryController.java index f54cc10..8818b9d 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/SchemaRegstryController.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/SchemaRegstryController.java @@ -2,6 +2,7 @@ import com.kafkamgt.uiapi.dao.SchemaRequest; +import com.kafkamgt.uiapi.error.KafkawizeException; import com.kafkamgt.uiapi.service.SchemaRegstryControllerService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,7 +49,7 @@ public ResponseEntity deleteSchemaRequests(@RequestParam("topicName") St } @RequestMapping(value = "/execSchemaRequests", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) - public ResponseEntity execSchemaRequests(@RequestParam("topicName") String topicName) { + public ResponseEntity execSchemaRequests(@RequestParam("topicName") String topicName) throws KafkawizeException { String updateTopicReqStatus = "{\"result\":\"" + schemaRegstryControllerService.execSchemaRequests(topicName) + "\"}"; return new ResponseEntity<>(updateTopicReqStatus, HttpStatus.OK); diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/TopicController.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/TopicController.java index e514754..00bf107 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/TopicController.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/TopicController.java @@ -3,6 +3,7 @@ import com.kafkamgt.uiapi.dao.Topic; import com.kafkamgt.uiapi.dao.TopicRequest; +import com.kafkamgt.uiapi.error.KafkawizeException; import com.kafkamgt.uiapi.model.PCStream; import com.kafkamgt.uiapi.model.TopicInfo; import com.kafkamgt.uiapi.service.TopicControllerService; @@ -72,7 +73,7 @@ public ResponseEntity deleteTopicRequests(@RequestParam("topicName") Str } @RequestMapping(value = "/execTopicRequests", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) - public ResponseEntity approveTopicRequests(@RequestParam("topicName") String topicName) { + public ResponseEntity approveTopicRequests(@RequestParam("topicName") String topicName) throws KafkawizeException { return new ResponseEntity<>(topicControllerService.approveTopicRequests(topicName), HttpStatus.OK); } diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/UiConfigController.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/UiConfigController.java index bbdfb4b..edfc96c 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/UiConfigController.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/UiConfigController.java @@ -1,26 +1,18 @@ package com.kafkamgt.uiapi.controller; -import com.kafkamgt.uiapi.dao.Team; import com.kafkamgt.uiapi.dao.ActivityLog; import com.kafkamgt.uiapi.dao.Env; +import com.kafkamgt.uiapi.dao.Team; import com.kafkamgt.uiapi.dao.UserInfo; import com.kafkamgt.uiapi.service.ManageTopics; -import com.kafkamgt.uiapi.service.UtilService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import com.kafkamgt.uiapi.service.UiConfigControllerService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.json.GsonJsonParser; -import org.springframework.http.*; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.User; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.crypto.factory.PasswordEncoderFactories; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.util.*; +import java.util.List; @RestController @@ -30,234 +22,82 @@ public class UiConfigController { //private static Logger LOG = LoggerFactory.getLogger(UiConfigController.class); @Autowired - private UtilService utilService; + private UiConfigControllerService uiConfigControllerService; @Autowired private ManageTopics manageTopics; @RequestMapping(value = "/getEnvs", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity> getEnvs() { - return new ResponseEntity<>(manageTopics.selectAllKafkaEnvs(), HttpStatus.OK); + return new ResponseEntity<>(uiConfigControllerService.getEnvs(), HttpStatus.OK); } @RequestMapping(value = "/getSchemaRegEnvs", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity> getSchemaRegEnvs() { - return new ResponseEntity<>(manageTopics.selectAllSchemaRegEnvs(), HttpStatus.OK); + return new ResponseEntity<>(uiConfigControllerService.getSchemaRegEnvs(), HttpStatus.OK); } @RequestMapping(value = "/getAllTeams", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity> getAllTeams() { - return new ResponseEntity<>(manageTopics.selectAllTeamsOfUsers(utilService.getUserName()), HttpStatus.OK); + return new ResponseEntity<>(uiConfigControllerService.getAllTeams(), HttpStatus.OK); } @RequestMapping(value = "/getAllTeamsSU", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity> getAllTeamsSU() { - - return new ResponseEntity<>(manageTopics.selectAllTeams(), HttpStatus.OK); - } - - private final InMemoryUserDetailsManager inMemoryUserDetailsManager; - - @Autowired - public UiConfigController(InMemoryUserDetailsManager inMemoryUserDetailsManager) { - this.inMemoryUserDetailsManager = inMemoryUserDetailsManager; + return new ResponseEntity<>(uiConfigControllerService.getAllTeamsSU(), HttpStatus.OK); } @PostMapping(value = "/addNewEnv") public ResponseEntity addNewEnv(@RequestBody Env newEnv){ - - if(!utilService.checkAuthorizedSU()) - return new ResponseEntity<>("{ \"result\": \"Not Authorized\" }", HttpStatus.OK); - - newEnv.setTrustStorePwd(""); - newEnv.setKeyPwd(""); - newEnv.setKeyStorePwd(""); - newEnv.setTrustStoreLocation(""); - newEnv.setKeyStoreLocation(""); - String execRes = manageTopics.addNewEnv(newEnv); - - String envAddResult = "{\"result\":\""+execRes+"\"}"; - return new ResponseEntity<>(envAddResult, HttpStatus.OK); + return new ResponseEntity<>(uiConfigControllerService.addNewEnv(newEnv), HttpStatus.OK); } @PostMapping(value = "/deleteClusterRequest") public ResponseEntity deleteCluster(@RequestParam ("clusterId") String clusterId){ - if(!utilService.checkAuthorizedSU()) - return new ResponseEntity<>("{ \"result\": \"Not Authorized\" }", HttpStatus.OK); - - String execRes = manageTopics.deleteClusterRequest(clusterId); - - String envAddResult = "{\"result\":\""+execRes+"\"}"; - return new ResponseEntity<>(envAddResult, HttpStatus.OK); + return new ResponseEntity<>(uiConfigControllerService.deleteCluster(clusterId), HttpStatus.OK); } @PostMapping(value = "/deleteTeamRequest") public ResponseEntity deleteTeam(@RequestParam ("teamId") String teamId){ - if(!utilService.checkAuthorizedSU()) - return new ResponseEntity<>("{ \"result\": \"Not Authorized\" }", HttpStatus.OK); - - String envAddResult = "{\"result\":\"Your team cannot be deleted. Try deleting other team.\"}"; - - if(manageTopics.getUsersInfo(utilService.getUserName()).getTeam().equals(teamId)) - return new ResponseEntity<>(envAddResult, HttpStatus.OK); - - String execRes = manageTopics.deleteTeamRequest(teamId); - envAddResult = "{\"result\":\""+execRes+"\"}"; - - return new ResponseEntity<>(envAddResult, HttpStatus.OK); + return new ResponseEntity<>(uiConfigControllerService.deleteTeam(teamId), HttpStatus.OK); } @PostMapping(value = "/deleteUserRequest") public ResponseEntity deleteUser(@RequestParam ("userId") String userId){ - if(!utilService.checkAuthorizedSU()) - return new ResponseEntity<>("{ \"result\": \"Not Authorized\" }", HttpStatus.OK); - - String envAddResult = "{\"result\":\"User cannot be deleted\"}"; - - if(userId.equals("superuser") || utilService.getUserName().equals(userId)) - return new ResponseEntity<>(envAddResult, HttpStatus.OK); - - String execRes = manageTopics.deleteUserRequest(userId); - envAddResult = "{\"result\":\""+execRes+"\"}"; - - return new ResponseEntity<>(envAddResult, HttpStatus.OK); + return new ResponseEntity<>(uiConfigControllerService.deleteUser(userId), HttpStatus.OK); } @PostMapping(value = "/addNewUser") public ResponseEntity addNewUser(@RequestBody UserInfo newUser){ - - if(!utilService.checkAuthorizedSU()) - return new ResponseEntity<>("{ \"result\": \"Not Authorized\" }", HttpStatus.OK); - - PasswordEncoder encoder = - PasswordEncoderFactories.createDelegatingPasswordEncoder(); - inMemoryUserDetailsManager.createUser(User.withUsername(newUser.getUsername()).password(encoder.encode(newUser.getPwd())) - .roles(newUser.getRole()).build()); - - String execRes = manageTopics.addNewUser(newUser); - - String userAddResult = "{\"result\":\""+execRes+"\"}"; - return new ResponseEntity<>(userAddResult, HttpStatus.OK); + return new ResponseEntity<>(uiConfigControllerService.addNewUser(newUser), HttpStatus.OK); } @PostMapping(value = "/addNewTeam") public ResponseEntity addNewTeam(@RequestBody Team newTeam){ - - if(!utilService.checkAuthorizedSU()) - return new ResponseEntity<>("{ \"result\": \"Not Authorized\" }", HttpStatus.OK); - - String execRes = manageTopics.addNewTeam(newTeam); - - String teamAddResult = "{\"result\":\""+execRes+"\"}"; - return new ResponseEntity<>(teamAddResult, HttpStatus.OK); + return new ResponseEntity<>(uiConfigControllerService.addNewTeam(newTeam), HttpStatus.OK); } @PostMapping(value = "/chPwd") public ResponseEntity changePwd(@RequestParam ("changePwd") String changePwd){ - - UserDetails userDetails = utilService.getUserDetails(); - - GsonJsonParser jsonParser = new GsonJsonParser(); - Map pwdMap = jsonParser.parseMap(changePwd); - - String pwdChange = (String)pwdMap.get("pwd"); - - PasswordEncoder encoder = - PasswordEncoderFactories.createDelegatingPasswordEncoder(); - UserDetails ud = new UserDetails() { - @Override - public Collection getAuthorities() { - return userDetails.getAuthorities(); - } - - @Override - public String getPassword() { - return encoder.encode(pwdChange); - } - - @Override - public String getUsername() { - return userDetails.getUsername(); - } - - @Override - public boolean isAccountNonExpired() { - return userDetails.isAccountNonExpired(); - } - - @Override - public boolean isAccountNonLocked() { - return userDetails.isAccountNonLocked(); - } - - @Override - public boolean isCredentialsNonExpired() { - return userDetails.isCredentialsNonExpired(); - } - - @Override - public boolean isEnabled() { - return userDetails.isEnabled(); - } - }; - - inMemoryUserDetailsManager.updateUser(ud); - - String execRes = manageTopics.updatePassword(userDetails.getUsername(),pwdChange); - - String pwdChResult = "{\"result\":\""+execRes+"\"}"; - return new ResponseEntity<>(pwdChResult, HttpStatus.OK); + return new ResponseEntity<>(uiConfigControllerService.changePwd(changePwd), HttpStatus.OK); } @RequestMapping(value = "/showUserList", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity> showUsers(){ - - List userList = manageTopics.selectAllUsersInfo(); - - return new ResponseEntity<>(userList, HttpStatus.OK); + return new ResponseEntity<>(uiConfigControllerService.showUsers(), HttpStatus.OK); } @RequestMapping(value = "/getMyProfileInfo", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity getMyProfileInfo(){ - - UserInfo userList = manageTopics.getUsersInfo(utilService.getUserName()); - - return new ResponseEntity<>(userList, HttpStatus.OK); + return new ResponseEntity<>(uiConfigControllerService.getMyProfileInfo(), HttpStatus.OK); } @RequestMapping(value = "/activityLog", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity> showActivityLog(@RequestParam("env") String env, @RequestParam("pageNo") String pageNo){ - - List origActivityList = manageTopics.selectActivityLog(utilService.getUserName(), env); - - int totalRecs = origActivityList.size(); - int recsPerPage = 20; - - int requestPageNo = Integer.parseInt(pageNo); - int startVar = (requestPageNo-1) * recsPerPage; - int lastVar = (requestPageNo) * (recsPerPage); - - int totalPages = totalRecs/recsPerPage + (totalRecs%recsPerPage > 0 ? 1 : 0); - - List newList = new ArrayList<>(); - - List numList = new ArrayList<>(); - for (int k = 1; k <= totalPages; k++) { - numList.add("" + k); - } - for(int i=0;i=startVar && i(newList, HttpStatus.OK); + return new ResponseEntity<>(uiConfigControllerService.showActivityLog(env,pageNo), HttpStatus.OK); } diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/UiControllerLogin.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/UiControllerLogin.java index 1425854..805afb5 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/UiControllerLogin.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/controller/UiControllerLogin.java @@ -3,17 +3,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.http.HttpStatus; -import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.ModelAndView; - -import javax.servlet.http.HttpServletRequest; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; @Controller public class UiControllerLogin { diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/AclControllerService.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/AclControllerService.java index 91bd4a3..e4f0685 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/AclControllerService.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/AclControllerService.java @@ -4,6 +4,7 @@ import com.kafkamgt.uiapi.dao.Acl; import com.kafkamgt.uiapi.dao.AclRequests; import com.kafkamgt.uiapi.dao.Env; +import com.kafkamgt.uiapi.error.KafkawizeException; import com.kafkamgt.uiapi.model.AclInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -98,7 +99,7 @@ public String deleteAclRequests(String req_no) { return "{\"result\":\""+deleteTopicReqStatus+"\"}"; } - public String approveAclRequests(String req_no) { + public String approveAclRequests(String req_no) throws KafkawizeException { AclRequests aclReq = createTopicHelper.selectAcl(req_no); @@ -112,7 +113,7 @@ public String approveAclRequests(String req_no) { return "{\"result\":\""+updateAclReqStatus+"\"}"; } - public List getAcls(String env, String pageNo, String topicNameSearch, boolean isSyncAcls) { + public List getAcls(String env, String pageNo, String topicNameSearch, boolean isSyncAcls) throws KafkawizeException { UserDetails userDetails = utilService.getUserDetails(); diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/ClusterApiService.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/ClusterApiService.java index ad10d59..0566968 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/ClusterApiService.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/ClusterApiService.java @@ -45,19 +45,24 @@ public class ClusterApiService { String uriPostSchema = "/topics/postSchema"; - public List> getAcls(String bootstrapHost){ - String uri = clusterConnUrl + uriGetAcls + bootstrapHost; - RestTemplate restTemplate = new RestTemplate(); + public List> getAcls(String bootstrapHost) throws KafkawizeException { + List> aclListOriginal = null; + try { + String uri = clusterConnUrl + uriGetAcls + bootstrapHost; + RestTemplate restTemplate = new RestTemplate(); - HttpHeaders headers = createHeaders(clusterApiUser, clusterApiPwd); - headers.setContentType(MediaType.APPLICATION_JSON); + HttpHeaders headers = createHeaders(clusterApiUser, clusterApiPwd); + headers.setContentType(MediaType.APPLICATION_JSON); - headers.add("Accept", MediaType.APPLICATION_JSON_VALUE); - HttpEntity>> entity = new HttpEntity<>(headers); + headers.add("Accept", MediaType.APPLICATION_JSON_VALUE); + HttpEntity>> entity = new HttpEntity<>(headers); - ResponseEntity resultBody = restTemplate.exchange - (uri, HttpMethod.GET, entity, Set.class); - List> aclListOriginal = new ArrayList(resultBody.getBody()); + ResponseEntity resultBody = restTemplate.exchange + (uri, HttpMethod.GET, entity, Set.class); + aclListOriginal = new ArrayList(resultBody.getBody()); + }catch(Exception e){ + throw new KafkawizeException("Could not load acls. Check Cluster Api connection. "+e.toString()); + } return aclListOriginal; } @@ -84,78 +89,90 @@ public List getAllTopics(String bootstrapHost) throws Exception{ return topicsList; } - public ResponseEntity approveTopicRequests(String topicName, TopicRequest topicRequest){ - - RestTemplate restTemplate = new RestTemplate(); - - MultiValueMap params= new LinkedMultiValueMap<>(); + public ResponseEntity approveTopicRequests(String topicName, TopicRequest topicRequest) throws KafkawizeException { + ResponseEntity response; + try { + RestTemplate restTemplate = new RestTemplate(); - Env envSelected= createTopicHelper.selectEnvDetails(topicRequest.getEnvironment()); - String bootstrapHost=envSelected.getHost()+":"+envSelected.getPort(); - params.add("env",bootstrapHost); + MultiValueMap params = new LinkedMultiValueMap<>(); - params.add("topicName",topicName); - params.add("partitions", topicRequest.getTopicpartitions()); - params.add("rf", topicRequest.getReplicationfactor()); - params.add("acl_ip", topicRequest.getAcl_ip()); - params.add("acl_ssl", topicRequest.getAcl_ssl()); + Env envSelected = createTopicHelper.selectEnvDetails(topicRequest.getEnvironment()); + String bootstrapHost = envSelected.getHost() + ":" + envSelected.getPort(); + params.add("env", bootstrapHost); - HttpHeaders headers = new HttpHeaders();//createHeaders("user1", "pwd"); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + params.add("topicName", topicName); + params.add("partitions", topicRequest.getTopicpartitions()); + params.add("rf", topicRequest.getReplicationfactor()); + params.add("acl_ip", topicRequest.getAcl_ip()); + params.add("acl_ssl", topicRequest.getAcl_ssl()); - HttpEntity> request = new HttpEntity<>(params, headers); + HttpHeaders headers = new HttpHeaders();//createHeaders("user1", "pwd"); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - ResponseEntity response = restTemplate.postForEntity( clusterConnUrl + uriCreateTopics, request , String.class ); + HttpEntity> request = new HttpEntity<>(params, headers); + response = restTemplate.postForEntity(clusterConnUrl + uriCreateTopics, request, String.class); + }catch(Exception e){ + throw new KafkawizeException("Could not approve topic request. Check Cluster Api connection. "+e.toString()); + } return response; } - public ResponseEntity approveAclRequests(AclRequests aclReq){ - String env = aclReq.getEnvironment(); - String uri = clusterConnUrl + uriCreateAcls; - RestTemplate restTemplate = new RestTemplate(); - - MultiValueMap params= new LinkedMultiValueMap(); + public ResponseEntity approveAclRequests(AclRequests aclReq) throws KafkawizeException { + ResponseEntity response; + try { + String env = aclReq.getEnvironment(); + String uri = clusterConnUrl + uriCreateAcls; + RestTemplate restTemplate = new RestTemplate(); - Env envSelected= createTopicHelper.selectEnvDetails(env); - String bootstrapHost=envSelected.getHost()+":"+envSelected.getPort(); - params.add("env",bootstrapHost); - params.add("topicName",aclReq.getTopicname()); - params.add("consumerGroup",aclReq.getConsumergroup()); - params.add("aclType",aclReq.getTopictype()); - params.add("acl_ip",aclReq.getAcl_ip()); - params.add("acl_ssl",aclReq.getAcl_ssl()); + MultiValueMap params = new LinkedMultiValueMap(); - HttpHeaders headers = new HttpHeaders();//createHeaders("user1", "pwd"); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + Env envSelected = createTopicHelper.selectEnvDetails(env); + String bootstrapHost = envSelected.getHost() + ":" + envSelected.getPort(); + params.add("env", bootstrapHost); + params.add("topicName", aclReq.getTopicname()); + params.add("consumerGroup", aclReq.getConsumergroup()); + params.add("aclType", aclReq.getTopictype()); + params.add("acl_ip", aclReq.getAcl_ip()); + params.add("acl_ssl", aclReq.getAcl_ssl()); - HttpEntity> request = new HttpEntity<>(params, headers); + HttpHeaders headers = new HttpHeaders();//createHeaders("user1", "pwd"); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - ResponseEntity response = restTemplate.postForEntity( uri, request , String.class ); + HttpEntity> request = new HttpEntity<>(params, headers); + response = restTemplate.postForEntity(uri, request, String.class); + }catch(Exception e){ + throw new KafkawizeException("Could not approve acl request. Check Cluster Api connection. "+e.toString()); + } return response; } - public ResponseEntity postSchema(SchemaRequest schemaRequest, String env, String topicName){ - String uri = clusterConnUrl + uriPostSchema; + public ResponseEntity postSchema(SchemaRequest schemaRequest, String env, String topicName) throws KafkawizeException { + ResponseEntity response; + try { + String uri = clusterConnUrl + uriPostSchema; - RestTemplate restTemplate = new RestTemplate(); + RestTemplate restTemplate = new RestTemplate(); - MultiValueMap params= new LinkedMultiValueMap(); + MultiValueMap params = new LinkedMultiValueMap(); - Env envSelected= createTopicHelper.selectEnvDetails(env); - String bootstrapHost=envSelected.getHost()+":"+envSelected.getPort(); - params.add("env",bootstrapHost); + Env envSelected = createTopicHelper.selectEnvDetails(env); + String bootstrapHost = envSelected.getHost() + ":" + envSelected.getPort(); + params.add("env", bootstrapHost); - params.add("topicName",topicName); - params.add("fullSchema",schemaRequest.getSchemafull()); + params.add("topicName", topicName); + params.add("fullSchema", schemaRequest.getSchemafull()); - HttpHeaders headers = new HttpHeaders();//createHeaders("user1", "pwd"); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + HttpHeaders headers = new HttpHeaders();//createHeaders("user1", "pwd"); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - HttpEntity> request = new HttpEntity<>(params, headers); + HttpEntity> request = new HttpEntity<>(params, headers); - ResponseEntity response = restTemplate.postForEntity( uri, request , String.class ); + response = restTemplate.postForEntity(uri, request, String.class); + }catch(Exception e){ + throw new KafkawizeException("Could not post schema. Check Cluster Api connection. "+e.toString()); + } return response; } diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/SchemaRegstryControllerService.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/SchemaRegstryControllerService.java index d387711..4c98939 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/SchemaRegstryControllerService.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/SchemaRegstryControllerService.java @@ -1,12 +1,11 @@ package com.kafkamgt.uiapi.service; import com.kafkamgt.uiapi.dao.SchemaRequest; +import com.kafkamgt.uiapi.error.KafkawizeException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Service; import java.util.List; @@ -45,7 +44,7 @@ public String deleteSchemaRequests(String topicName) { return createTopicHelper.deleteSchemaRequest(topicName,schemaVersion, env); } - public String execSchemaRequests(String topicName) { + public String execSchemaRequests(String topicName) throws KafkawizeException { StringTokenizer strTkr = new StringTokenizer(topicName,"-----"); topicName = strTkr.nextToken(); diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/TopicControllerService.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/TopicControllerService.java index de8ed95..7846d81 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/TopicControllerService.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/TopicControllerService.java @@ -4,22 +4,18 @@ import com.kafkamgt.uiapi.dao.Topic; import com.kafkamgt.uiapi.dao.TopicPK; import com.kafkamgt.uiapi.dao.TopicRequest; +import com.kafkamgt.uiapi.error.KafkawizeException; import com.kafkamgt.uiapi.model.PCStream; import com.kafkamgt.uiapi.model.TopicInfo; -import org.apache.tomcat.util.codec.binary.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; -import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Service; -import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -204,7 +200,7 @@ public String deleteTopicRequests(String topicName) { return "{\"result\":\""+deleteTopicReqStatus+"\"}"; } - public String approveTopicRequests(String topicName) { + public String approveTopicRequests(String topicName) throws KafkawizeException { StringTokenizer strTkr = new StringTokenizer(topicName,","); topicName = strTkr.nextToken(); diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/UiConfigControllerService.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/UiConfigControllerService.java new file mode 100644 index 0000000..fa31fc6 --- /dev/null +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/UiConfigControllerService.java @@ -0,0 +1,234 @@ +package com.kafkamgt.uiapi.service; + +import com.kafkamgt.uiapi.dao.ActivityLog; +import com.kafkamgt.uiapi.dao.Env; +import com.kafkamgt.uiapi.dao.Team; +import com.kafkamgt.uiapi.dao.UserInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.json.GsonJsonParser; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.crypto.factory.PasswordEncoderFactories; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +@Service +public class UiConfigControllerService { + + //private static Logger LOG = LoggerFactory.getLogger(UiConfigController.class); + + @Autowired + private UtilService utilService; + + @Autowired + private ManageTopics manageTopics; + + public List getEnvs() { + return manageTopics.selectAllKafkaEnvs(); + } + + public List getSchemaRegEnvs() { + return manageTopics.selectAllSchemaRegEnvs(); + } + + public List getAllTeams() { + return manageTopics.selectAllTeamsOfUsers(utilService.getUserName()); + } + + public List getAllTeamsSU() { + + return manageTopics.selectAllTeams(); + } + + private final InMemoryUserDetailsManager inMemoryUserDetailsManager; + + @Autowired + public UiConfigControllerService(InMemoryUserDetailsManager inMemoryUserDetailsManager) { + this.inMemoryUserDetailsManager = inMemoryUserDetailsManager; + } + + public String addNewEnv(Env newEnv){ + + if(!utilService.checkAuthorizedSU()) + return "{ \"result\": \"Not Authorized\" }"; + + newEnv.setTrustStorePwd(""); + newEnv.setKeyPwd(""); + newEnv.setKeyStorePwd(""); + newEnv.setTrustStoreLocation(""); + newEnv.setKeyStoreLocation(""); + String execRes = manageTopics.addNewEnv(newEnv); + + return "{\"result\":\""+execRes+"\"}"; + } + + public String deleteCluster(String clusterId){ + + if(!utilService.checkAuthorizedSU()) + return "{ \"result\": \"Not Authorized\" }"; + + String execRes = manageTopics.deleteClusterRequest(clusterId); + + return "{\"result\":\""+execRes+"\"}"; + } + + public String deleteTeam(String teamId){ + + if(!utilService.checkAuthorizedSU()) + return "{ \"result\": \"Not Authorized\" }"; + + String envAddResult = "{\"result\":\"Your team cannot be deleted. Try deleting other team.\"}"; + + if(manageTopics.getUsersInfo(utilService.getUserName()).getTeam().equals(teamId)) + return envAddResult; + + String execRes = manageTopics.deleteTeamRequest(teamId); + envAddResult = "{\"result\":\""+execRes+"\"}"; + + return envAddResult; + } + + public String deleteUser(String userId){ + + if(!utilService.checkAuthorizedSU()) + return "{ \"result\": \"Not Authorized\" }"; + + String envAddResult = "{\"result\":\"User cannot be deleted\"}"; + + if(userId.equals("superuser") || utilService.getUserName().equals(userId)) + return envAddResult; + + String execRes = manageTopics.deleteUserRequest(userId); + envAddResult = "{\"result\":\""+execRes+"\"}"; + + return envAddResult; + } + + public String addNewUser(UserInfo newUser){ + + if(!utilService.checkAuthorizedSU()) + return "{ \"result\": \"Not Authorized\" }"; + + PasswordEncoder encoder = + PasswordEncoderFactories.createDelegatingPasswordEncoder(); + inMemoryUserDetailsManager.createUser(User.withUsername(newUser.getUsername()).password(encoder.encode(newUser.getPwd())) + .roles(newUser.getRole()).build()); + + String execRes = manageTopics.addNewUser(newUser); + + return "{\"result\":\""+execRes+"\"}"; + } + + public String addNewTeam(Team newTeam){ + + if(!utilService.checkAuthorizedSU()) + return "{ \"result\": \"Not Authorized\" }"; + + return "{\"result\":\""+manageTopics.addNewTeam(newTeam)+"\"}"; + } + + public String changePwd(String changePwd){ + + UserDetails userDetails = utilService.getUserDetails(); + + GsonJsonParser jsonParser = new GsonJsonParser(); + Map pwdMap = jsonParser.parseMap(changePwd); + + String pwdChange = (String)pwdMap.get("pwd"); + + PasswordEncoder encoder = + PasswordEncoderFactories.createDelegatingPasswordEncoder(); + UserDetails ud = new UserDetails() { + @Override + public Collection getAuthorities() { + return userDetails.getAuthorities(); + } + + @Override + public String getPassword() { + return encoder.encode(pwdChange); + } + + @Override + public String getUsername() { + return userDetails.getUsername(); + } + + @Override + public boolean isAccountNonExpired() { + return userDetails.isAccountNonExpired(); + } + + @Override + public boolean isAccountNonLocked() { + return userDetails.isAccountNonLocked(); + } + + @Override + public boolean isCredentialsNonExpired() { + return userDetails.isCredentialsNonExpired(); + } + + @Override + public boolean isEnabled() { + return userDetails.isEnabled(); + } + }; + + inMemoryUserDetailsManager.updateUser(ud); + + String execRes = manageTopics.updatePassword(userDetails.getUsername(),pwdChange); + + return "{\"result\":\""+execRes+"\"}"; + } + + public List showUsers(){ + + return manageTopics.selectAllUsersInfo(); + } + + public UserInfo getMyProfileInfo(){ + + return manageTopics.getUsersInfo(utilService.getUserName()); + } + + public List showActivityLog(String env, String pageNo){ + + List origActivityList = manageTopics.selectActivityLog(utilService.getUserName(), env); + + int totalRecs = origActivityList.size(); + int recsPerPage = 20; + + int requestPageNo = Integer.parseInt(pageNo); + int startVar = (requestPageNo-1) * recsPerPage; + int lastVar = (requestPageNo) * (recsPerPage); + + int totalPages = totalRecs/recsPerPage + (totalRecs%recsPerPage > 0 ? 1 : 0); + + List newList = new ArrayList<>(); + + List numList = new ArrayList<>(); + for (int k = 1; k <= totalPages; k++) { + numList.add("" + k); + } + for(int i=0;i=startVar && i Date: Wed, 25 Sep 2019 00:34:45 +0200 Subject: [PATCH 3/5] Bug fixes, request topic form, code enhancements --- README.md | 2 +- kafkawize-conf/pom.xml | 2 +- kafkawize-web/pom.xml | 2 +- .../helpers/db/cassandra/InsertData.java | 6 +- .../uiapi/service/ClusterApiService.java | 4 +- .../uiapi/service/TopicControllerService.java | 56 ++++++--- .../main/resources/static/js/createTopic.js | 110 ------------------ .../main/resources/static/js/requestTopics.js | 30 ++--- .../main/resources/templates/execTopics.html | 8 +- .../main/resources/templates/pcTopics.html | 2 +- .../main/resources/templates/requestAcls.html | 2 +- .../resources/templates/requestTopics.html | 34 +++--- pom.xml | 2 +- screenshots/RequestTopic.JPG | Bin 100698 -> 95041 bytes 14 files changed, 88 insertions(+), 172 deletions(-) delete mode 100644 kafkawize-web/src/main/resources/static/js/createTopic.js diff --git a/README.md b/README.md index d3f6155..75dafe1 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Or Pdf : https://buildmedia.readthedocs.org/media/pdf/kafkawize/latest/kafkawize.pdf -Download options : https://kafkawize.readthedocs.io/en/latest/getting_started.html#download-kafkawize-3-1 +Download options : https://kafkawize.readthedocs.io/en/latest/getting_started.html#download-kafkawize Screenshots diff --git a/kafkawize-conf/pom.xml b/kafkawize-conf/pom.xml index f85c13c..12ae721 100644 --- a/kafkawize-conf/pom.xml +++ b/kafkawize-conf/pom.xml @@ -5,7 +5,7 @@ kafkawize com.kafkamgt.uiapi - 3.1 + 3.2 4.0.0 diff --git a/kafkawize-web/pom.xml b/kafkawize-web/pom.xml index c087f23..58f6e50 100644 --- a/kafkawize-web/pom.xml +++ b/kafkawize-web/pom.xml @@ -5,7 +5,7 @@ kafkawize com.kafkamgt.uiapi - 3.1 + 3.2 jar 4.0.0 diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/cassandra/InsertData.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/cassandra/InsertData.java index 241bd69..571ffe2 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/cassandra/InsertData.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/helpers/db/cassandra/InsertData.java @@ -46,12 +46,12 @@ public String insertIntoRequestTopic(TopicRequest topicRequest){ tableName = "topic_requests"; topicReqType = "Producer"; insertstat = "INSERT INTO " + keyspace + "."+tableName+"(topicname,partitions,replicationfactor,env,teamname,appname,topictype,requestor," + - "requesttime, acl_ip, acl_ssl, remarks, topicstatus) " + - "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?);"; + "requesttime, remarks, topicstatus) " + + "VALUES (?,?,?,?,?,?,?,?,?,?,?);"; PreparedStatement statement = session.prepare(insertstat); BoundStatement boundStatement = new BoundStatement(statement); session.execute(boundStatement.bind(topicRequest.getTopicname(), topicRequest.getTopicpartitions(), topicRequest.getReplicationfactor(), topicRequest.getEnvironment(), topicRequest.getTeamname(), topicRequest.getAppname(), - topicReqType, topicRequest.getUsername(), new Date(), topicRequest.getAcl_ip(), topicRequest.getAcl_ssl(), topicRequest.getRemarks(), "created")); + topicReqType, topicRequest.getUsername(), new Date(), topicRequest.getRemarks(), "created")); // Activity log insertIntoActivityLogTopic(topicRequest); diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/ClusterApiService.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/ClusterApiService.java index 0566968..2c12bd3 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/ClusterApiService.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/ClusterApiService.java @@ -103,8 +103,8 @@ public ResponseEntity approveTopicRequests(String topicName, TopicReques params.add("topicName", topicName); params.add("partitions", topicRequest.getTopicpartitions()); params.add("rf", topicRequest.getReplicationfactor()); - params.add("acl_ip", topicRequest.getAcl_ip()); - params.add("acl_ssl", topicRequest.getAcl_ssl()); +// params.add("acl_ip", topicRequest.getAcl_ip()); +// params.add("acl_ssl", topicRequest.getAcl_ssl()); HttpHeaders headers = new HttpHeaders();//createHeaders("user1", "pwd"); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/TopicControllerService.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/TopicControllerService.java index 7846d81..02180d8 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/TopicControllerService.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/TopicControllerService.java @@ -41,7 +41,7 @@ public class TopicControllerService { String uriGetTopics = "/topics/getTopics/"; @Autowired - private ManageTopics createTopicHelper; + private ManageTopics manageTopics; @Autowired private UtilService utilService; @@ -60,6 +60,21 @@ public String createTopics(TopicRequest topicRequestReq) { String defPartns = springEnvProps.getProperty("kafka." + envSelected + ".default.partitions"); String defMaxPartns = springEnvProps.getProperty("kafka." + envSelected + ".default.maxpartitions"); String defaultRf = springEnvProps.getProperty("kafka." + envSelected + ".default.replicationfactor"); +// String ipAddress = topicRequestReq.getAcl_ip(); +// +// if(ipAddress!=null && ipAddress.length()>0) { +// String IPADDRESS_PATTERN = +// "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + +// "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + +// "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + +// "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"; +// +// Pattern pattern = Pattern.compile(IPADDRESS_PATTERN); +// Matcher matcher = pattern.matcher(ipAddress); +// if (!matcher.matches()) { +// return "{\"result\":\"Error : Invalid IP Address in the request.\"}"; +// } +// } if(defPartns==null) defPartns="1"; @@ -87,7 +102,7 @@ public String createTopics(TopicRequest topicRequestReq) { topicRequestReq.setTopicpartitions(defPartns); } - String execRes = createTopicHelper.requestForTopic(topicRequestReq); + String execRes = manageTopics.requestForTopic(topicRequestReq); String topicaddResult = "{\"result\":\""+execRes+"\"}"; return topicaddResult; @@ -124,13 +139,13 @@ public String updateSyncTopics(String updatedSyncTopics, String envSelected) { listTopics.add(t); } } - String execRes = createTopicHelper.addToSynctopics(listTopics); + String execRes = manageTopics.addToSynctopics(listTopics); return "{\"result\":\""+execRes+"\"}"; } public List getTopicStreams(String envSelected, String pageNo, String topicNameSearch) { - List pcList = createTopicHelper.selectTopicStreams(envSelected); + List pcList = manageTopics.selectTopicStreams(envSelected); if(topicNameSearch != null) topicNameSearch = topicNameSearch.trim(); @@ -177,16 +192,16 @@ public List getPCStreamsPaginated(String pageNo, List aclLis public List getTopicRequests() { - return createTopicHelper.getAllTopicRequests(utilService.getUserName()); + return manageTopics.getAllTopicRequests(utilService.getUserName()); } public Topic getTopicTeam(String topicName, String env) { - return createTopicHelper.getTopicTeam(topicName, env); + return manageTopics.getTopicTeam(topicName, env); } public List getCreatedTopicRequests() { - return createTopicHelper.getCreatedTopicRequests(utilService.getUserName()); + return manageTopics.getCreatedTopicRequests(utilService.getUserName()); } public String deleteTopicRequests(String topicName) { @@ -195,7 +210,7 @@ public String deleteTopicRequests(String topicName) { topicName = strTkr.nextToken(); String env = strTkr.nextToken(); - String deleteTopicReqStatus = createTopicHelper.deleteTopicRequest(topicName,env); + String deleteTopicReqStatus = manageTopics.deleteTopicRequest(topicName,env); return "{\"result\":\""+deleteTopicReqStatus+"\"}"; } @@ -206,21 +221,21 @@ public String approveTopicRequests(String topicName) throws KafkawizeException { topicName = strTkr.nextToken(); String env = strTkr.nextToken(); - TopicRequest topicRequest = createTopicHelper.selectTopicRequestsForTopic(topicName, env); + TopicRequest topicRequest = manageTopics.selectTopicRequestsForTopic(topicName, env); ResponseEntity response = clusterApiService.approveTopicRequests(topicName,topicRequest); String updateTopicReqStatus = response.getBody(); if(response.getBody().equals("success")) - updateTopicReqStatus = createTopicHelper.updateTopicRequest(topicRequest,utilService.getUserName()); + updateTopicReqStatus = manageTopics.updateTopicRequest(topicRequest,utilService.getUserName()); return "{\"result\":\""+updateTopicReqStatus+"\"}"; } public List getAllTopics(String env) throws Exception { - Env envSelected = createTopicHelper.selectEnvDetails(env); + Env envSelected = manageTopics.selectEnvDetails(env); String bootstrapHost = envSelected.getHost() + ":" + envSelected.getPort(); List topicsList = clusterApiService.getAllTopics(bootstrapHost); @@ -233,7 +248,14 @@ public List getAllTopics(String env) throws Exception { if(indexOfDots>0) topicsListNew.add(s1.substring(0,indexOfDots)); } - return topicsListNew; + + List topicsMetadata = manageTopics.getSyncTopics(env); + + topicsMetadata.forEach(topic->topicsListNew.add(topic.getTopicname())); + + List uniqueList = topicsListNew.stream().distinct().sorted().collect(Collectors.toList()); + + return uniqueList; } public List getTopics(String env, String pageNo, String topicNameSearch) throws Exception { @@ -241,13 +263,13 @@ public List getTopics(String env, String pageNo, String topicNameSear if(topicNameSearch != null) topicNameSearch = topicNameSearch.trim(); - Env envSelected= createTopicHelper.selectEnvDetails(env); + Env envSelected= manageTopics.selectEnvDetails(env); String bootstrapHost=envSelected.getHost()+":"+envSelected.getPort(); List topicsList = clusterApiService.getAllTopics(bootstrapHost); // Get Sync topics - List topicsFromSOT = createTopicHelper.getSyncTopics(env); + List topicsFromSOT = manageTopics.getSyncTopics(env); topicCounter = 0; @@ -277,7 +299,7 @@ public List getSyncTopics(String env, String pageNo, String topicN if(topicNameSearch != null) topicNameSearch = topicNameSearch.trim(); - Env envSelected= createTopicHelper.selectEnvDetails(env); + Env envSelected= manageTopics.selectEnvDetails(env); String bootstrapHost=envSelected.getHost()+":"+envSelected.getPort(); List topicsList = clusterApiService.getAllTopics(bootstrapHost); @@ -376,7 +398,7 @@ public List getSyncTopicList(List topicsList, UserDetails int requestPageNo = Integer.parseInt(pageNo); // Get Sync topics - List topicsFromSOT = createTopicHelper.getSyncTopics(env); + List topicsFromSOT = manageTopics.getSyncTopics(env); List topicsListMap = new ArrayList<>(); int startVar = (requestPageNo-1) * recsPerPage; @@ -386,7 +408,7 @@ public List getSyncTopicList(List topicsList, UserDetails List teamList = new ArrayList<>(); - createTopicHelper.selectAllTeamsOfUsers(userDetails.getUsername()) + manageTopics.selectAllTeamsOfUsers(userDetails.getUsername()) .forEach(teamS->teamList.add(teamS.getTeamname())); //String tmpTopicName = null; for(int i=0;i0) || - ($scope.addTopic.acl_ssl !=null && $scope.addTopic.acl_ssl.length>0)){} - else - { - alert("Please fill in a valid IP address or SSL-CN Name of the Producer client"); + + if(isNaN($scope.addTopic.topicpartitions)){ + alert("Please fill in a valid number for partitions for topic"); return; - } + } + +// if(($scope.addTopic.acl_ip !=null && $scope.addTopic.acl_ip.length>0) || +// ($scope.addTopic.acl_ssl !=null && $scope.addTopic.acl_ssl.length>0)){} +// else +// { +// alert("Please fill in a valid IP address or SSL-CN Name of the Producer client"); +// return; +// } if(!$scope.addTopic.team) { @@ -44,16 +50,13 @@ app.controller("requestTopicsCtrl", function($scope, $http, $location, $window) serviceInput['teamname'] = $scope.addTopic.team.teamname; serviceInput['appname'] = $scope.addTopic.app; serviceInput['remarks'] = $scope.addTopic.remarks; - serviceInput['acl_ip'] = $scope.addTopic.acl_ip; - serviceInput['acl_ssl'] = $scope.addTopic.acl_ssl; - if (!window.confirm("Are you sure, you would like to request the topic : " - + $scope.addTopic.topicname + + if (!window.confirm("Are you sure, you would like to request a topic ?"+ + "\nTopic : " + $scope.addTopic.topicname + "\nPartitions : " + $scope.addTopic.topicpartitions + "\nEnv : " + $scope.addTopic.envName.name + - "\nTeam :" + $scope.addTopic.team.teamname + - "\nApp :" + $scope.addTopic.app + - "\nAcl :" + $scope.addTopic.acl_ip +" \nAcl SSL:"+ $scope.addTopic.acl_ssl + "\nTeam : " + $scope.addTopic.team.teamname + + "\nApp : " + $scope.addTopic.app )) { return; } @@ -76,6 +79,7 @@ app.controller("requestTopicsCtrl", function($scope, $http, $location, $window) }; + $scope.getEnvs = function() { $http({ diff --git a/kafkawize-web/src/main/resources/templates/execTopics.html b/kafkawize-web/src/main/resources/templates/execTopics.html index 533ea2e..b832119 100644 --- a/kafkawize-web/src/main/resources/templates/execTopics.html +++ b/kafkawize-web/src/main/resources/templates/execTopics.html @@ -376,8 +376,8 @@

Approve Topics

- - + + @@ -394,8 +394,8 @@

Approve Topics

- - + + diff --git a/kafkawize-web/src/main/resources/templates/pcTopics.html b/kafkawize-web/src/main/resources/templates/pcTopics.html index db910e2..357962d 100644 --- a/kafkawize-web/src/main/resources/templates/pcTopics.html +++ b/kafkawize-web/src/main/resources/templates/pcTopics.html @@ -389,7 +389,7 @@

Producers & Consumers

- + diff --git a/kafkawize-web/src/main/resources/templates/requestAcls.html b/kafkawize-web/src/main/resources/templates/requestAcls.html index 45a3bc7..336930f 100644 --- a/kafkawize-web/src/main/resources/templates/requestAcls.html +++ b/kafkawize-web/src/main/resources/templates/requestAcls.html @@ -410,7 +410,7 @@

ACL (Access Control List) Request Form

- +
diff --git a/kafkawize-web/src/main/resources/templates/requestTopics.html b/kafkawize-web/src/main/resources/templates/requestTopics.html index 8d61c92..9ae237d 100644 --- a/kafkawize-web/src/main/resources/templates/requestTopics.html +++ b/kafkawize-web/src/main/resources/templates/requestTopics.html @@ -376,7 +376,7 @@

Topic Request Form

- +
- +
-
- -
- -
-
+ + + + + + -
- -
- -
-
+ + + + + +
- +
+
diff --git a/pom.xml b/pom.xml index 16938f7..f410192 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.kafkamgt.uiapi kafkawize - 3.1 + 3.2 kafkawize-conf kafkawize-web diff --git a/screenshots/RequestTopic.JPG b/screenshots/RequestTopic.JPG index 7b939bd9734ef4e00ebb5a98f5831206878dc7a4..b18aa1271b0a33f3fbd4eae2cd0af76f38b674ea 100644 GIT binary patch literal 95041 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 T*`oskBzL5lhS}f)|Nol+yt*H; literal 100698 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%0AgVi9$D3tUWA}a&zM>+o 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�nkSp3LJ<0*Lqr--2e>6oZ_ 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 OqM+aZXd8@QNB{ From b9556b7d04f8553e80f61140f2fc6db306a0e2c2 Mon Sep 17 00:00:00 2001 From: Chandradhar Basani Date: Wed, 25 Sep 2019 22:47:32 +0200 Subject: [PATCH 4/5] Getting unique topics from cluster with wildcard acl on cluster for kafkawize app --- .../com/kafkamgt/uiapi/service/TopicControllerService.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/TopicControllerService.java b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/TopicControllerService.java index 02180d8..9454423 100644 --- a/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/TopicControllerService.java +++ b/kafkawize-web/src/main/java/com/kafkamgt/uiapi/service/TopicControllerService.java @@ -249,10 +249,6 @@ public List getAllTopics(String env) throws Exception { topicsListNew.add(s1.substring(0,indexOfDots)); } - List topicsMetadata = manageTopics.getSyncTopics(env); - - topicsMetadata.forEach(topic->topicsListNew.add(topic.getTopicname())); - List uniqueList = topicsListNew.stream().distinct().sorted().collect(Collectors.toList()); return uniqueList; From 2296ee9618258873694b64d322b945a4e86d7057 Mon Sep 17 00:00:00 2001 From: Chandradhar Basani Date: Wed, 25 Sep 2019 22:53:52 +0200 Subject: [PATCH 5/5] Update release notes --- ReleaseNotes.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index 6f3b2f1..74c7822 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -1,4 +1,4 @@ -Kafkawize 3.1 +Kafkawize 3.2 Kafkawize is a Kafka Topic management tool (A Web application) which automates the process of creating and browsing Kafka components, by introducing roles/authorizations to users of various teams of an organization

Select TeamName Team Mail Team Phone
{{ teamDetails.teamname }} {{ teamDetails.teammail }} {{ teamDetails.teamphone }} Replication Factor Cluster RequestorAcl IP(Producer)Acl SSLTeam {{ topicRequest.replicationfactor }} {{ topicRequest.environment }} {{ topicRequest.username }}{{ topicRequest.acl_ip }}{{ topicRequest.acl_ssl }}{{ topicRequest.teamname }}
TopicProducer TeamsProducer/Owner Teams Consumer Teams