RANGER-687: Service update should ignore user provided values for internal fields - like policyVersion
Project: http://git-wip-us.apache.org/repos/asf/incubator-ranger/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ranger/commit/be03c44b Tree: http://git-wip-us.apache.org/repos/asf/incubator-ranger/tree/be03c44b Diff: http://git-wip-us.apache.org/repos/asf/incubator-ranger/diff/be03c44b Branch: refs/heads/master Commit: be03c44b6e978dea70cac629566c3826a835db6a Parents: d734a21 Author: Madhan Neethiraj <[email protected]> Authored: Wed Oct 14 23:39:45 2015 -0700 Committer: Madhan Neethiraj <[email protected]> Committed: Fri Oct 16 08:50:34 2015 -0700 ---------------------------------------------------------------------- .../org/apache/ranger/biz/ServiceDBStore.java | 56 ++++++++++++++++---- 1 file changed, 45 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/be03c44b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java ---------------------------------------------------------------------- diff --git a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java index 99e58fe..30c0897 100644 --- a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java +++ b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java @@ -1141,9 +1141,19 @@ public class ServiceDBStore extends AbstractServiceStore { List<XXTrxLog> trxLogList = svcService.getTransactionLog(service, existing, RangerServiceService.OPERATION_UPDATE_CONTEXT); boolean hasTagServiceValueChanged = false; - Long existingTagServiceValue = existing.getTagService(); - String newTagServiceName = service.getTagService(); - Long newTagServiceValue = null; + Long existingTagServiceId = existing.getTagService(); + String newTagServiceName = service.getTagService(); // null for old clients; empty string to remove existing association + Long newTagServiceId = null; + + if(newTagServiceName == null) { // old client; don't update existing tagService + if(existingTagServiceId != null) { + newTagServiceName = getServiceName(existingTagServiceId); + + service.setTagService(newTagServiceName); + + LOG.info("ServiceDBStore.updateService(id=" + service.getId() + "; name=" + service.getName() + "): tagService is null; using existing tagService '" + newTagServiceName + "'"); + } + } if (StringUtils.isNotBlank(newTagServiceName)) { RangerService tmp = getServiceByName(newTagServiceName); @@ -1155,27 +1165,36 @@ public class ServiceDBStore extends AbstractServiceStore { throw restErrorUtil.createRESTException("Invalid tag service name " + newTagServiceName, MessageEnums.ERROR_CREATING_OBJECT); } else { - newTagServiceValue = tmp.getId(); + newTagServiceId = tmp.getId(); } } - if (existingTagServiceValue == null) { - if (newTagServiceValue != null) { + if (existingTagServiceId == null) { + if (newTagServiceId != null) { hasTagServiceValueChanged = true; } - } else if (!existingTagServiceValue.equals(newTagServiceValue)) { + } else if (!existingTagServiceId.equals(newTagServiceId)) { hasTagServiceValueChanged = true; } - if (hasTagServiceValueChanged) { - service.setPolicyVersion(getNextVersion(service.getPolicyVersion())); - } - if(populateExistingBaseFields) { svcServiceWithAssignedId.setPopulateExistingBaseFields(true); service = svcServiceWithAssignedId.update(service); svcServiceWithAssignedId.setPopulateExistingBaseFields(false); } else { + service.setCreateTime(existing.getCreateTime()); + service.setGuid(existing.getGuid()); + service.setVersion(existing.getVersion()); + service.setPolicyUpdateTime(existing.getPolicyUpdateTime()); + service.setPolicyVersion(existing.getPolicyVersion()); + service.setTagVersion(existing.getTagVersion()); + service.setTagUpdateTime(existing.getTagUpdateTime()); + + if (hasTagServiceValueChanged) { + service.setPolicyVersion(getNextVersion(service.getPolicyVersion())); + } + + service = svcService.update(service); } @@ -2286,4 +2305,19 @@ public class ServiceDBStore extends AbstractServiceStore { } } } + + + private String getServiceName(Long serviceId) { + String ret = null; + + if(serviceId != null) { + XXService service = daoMgr.getXXService().getById(serviceId); + + if(service != null) { + ret = service.getName(); + } + } + + return ret; + } }
