| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| package org.apache.ranger.biz; |
| |
| import java.io.ByteArrayOutputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| import java.net.UnknownHostException; |
| import java.text.SimpleDateFormat; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.Comparator; |
| import java.util.Date; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.LinkedHashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Map.Entry; |
| import java.util.Set; |
| import java.util.StringTokenizer; |
| |
| import javax.annotation.PostConstruct; |
| import javax.servlet.ServletOutputStream; |
| import javax.servlet.http.HttpServletResponse; |
| |
| import org.apache.commons.collections.CollectionUtils; |
| import org.apache.commons.collections.MapUtils; |
| import org.apache.commons.io.IOUtils; |
| import org.apache.commons.lang.StringUtils; |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| import org.apache.hadoop.security.SecureClientLogin; |
| import org.apache.hadoop.security.authentication.util.KerberosName; |
| import org.apache.poi.hssf.usermodel.HSSFWorkbook; |
| import org.apache.poi.ss.usermodel.Cell; |
| import org.apache.poi.ss.usermodel.CellStyle; |
| import org.apache.poi.ss.usermodel.Font; |
| import org.apache.poi.ss.usermodel.Row; |
| import org.apache.poi.ss.usermodel.Sheet; |
| import org.apache.poi.ss.usermodel.Workbook; |
| import org.apache.ranger.audit.provider.MiscUtil; |
| import org.apache.ranger.authorization.hadoop.config.RangerConfiguration; |
| import org.apache.ranger.common.AppConstants; |
| import org.apache.ranger.common.ContextUtil; |
| import org.apache.ranger.common.MessageEnums; |
| import org.apache.ranger.common.db.RangerTransactionSynchronizationAdapter; |
| import org.apache.ranger.entity.*; |
| import org.apache.ranger.plugin.model.validation.RangerServiceDefValidator; |
| import org.apache.ranger.plugin.model.validation.RangerValidator; |
| import org.apache.ranger.plugin.model.validation.ValidationFailureDetails; |
| import org.apache.ranger.plugin.policyengine.RangerPolicyEngine; |
| import org.apache.ranger.plugin.policyresourcematcher.RangerDefaultPolicyResourceMatcher; |
| import org.apache.ranger.plugin.policyresourcematcher.RangerPolicyResourceMatcher; |
| import org.apache.ranger.plugin.store.ServiceStore; |
| import org.apache.ranger.plugin.util.PasswordUtils; |
| import org.apache.ranger.common.JSONUtil; |
| import org.apache.ranger.common.PropertiesUtil; |
| import org.apache.ranger.common.RESTErrorUtil; |
| import org.apache.ranger.common.RangerConstants; |
| import org.apache.ranger.common.RangerFactory; |
| import org.apache.ranger.common.RangerServicePoliciesCache; |
| import org.apache.ranger.common.RangerVersionInfo; |
| import org.apache.ranger.common.StringUtil; |
| import org.apache.ranger.common.UserSessionBase; |
| import org.apache.ranger.db.RangerDaoManager; |
| import org.apache.ranger.db.XXAccessTypeDefDao; |
| import org.apache.ranger.db.XXAccessTypeDefGrantsDao; |
| import org.apache.ranger.db.XXContextEnricherDefDao; |
| import org.apache.ranger.db.XXDataMaskTypeDefDao; |
| import org.apache.ranger.db.XXEnumDefDao; |
| import org.apache.ranger.db.XXEnumElementDefDao; |
| import org.apache.ranger.db.XXPolicyConditionDefDao; |
| import org.apache.ranger.db.XXResourceDefDao; |
| import org.apache.ranger.db.XXServiceConfigDefDao; |
| import org.apache.ranger.db.XXServiceConfigMapDao; |
| import org.apache.ranger.db.XXServiceDao; |
| import org.apache.ranger.db.XXServiceVersionInfoDao; |
| import org.apache.ranger.entity.XXAccessTypeDef; |
| import org.apache.ranger.entity.XXAccessTypeDefGrants; |
| import org.apache.ranger.entity.XXContextEnricherDef; |
| import org.apache.ranger.entity.XXDBBase; |
| import org.apache.ranger.entity.XXDataHist; |
| import org.apache.ranger.entity.XXDataMaskTypeDef; |
| import org.apache.ranger.entity.XXEnumDef; |
| import org.apache.ranger.entity.XXEnumElementDef; |
| import org.apache.ranger.entity.XXPolicy; |
| import org.apache.ranger.entity.XXPolicyConditionDef; |
| import org.apache.ranger.entity.XXPolicyRefAccessType; |
| import org.apache.ranger.entity.XXPolicyRefCondition; |
| import org.apache.ranger.entity.XXPolicyRefResource; |
| import org.apache.ranger.entity.XXResourceDef; |
| import org.apache.ranger.entity.XXService; |
| import org.apache.ranger.entity.XXServiceConfigDef; |
| import org.apache.ranger.entity.XXServiceConfigMap; |
| import org.apache.ranger.entity.XXServiceDef; |
| import org.apache.ranger.entity.XXServiceVersionInfo; |
| import org.apache.ranger.entity.XXTrxLog; |
| import org.apache.ranger.entity.XXUser; |
| import org.apache.ranger.plugin.model.RangerPolicy; |
| import org.apache.ranger.plugin.model.RangerPolicy.RangerDataMaskPolicyItem; |
| import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItem; |
| import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItemAccess; |
| import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItemCondition; |
| import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource; |
| import org.apache.ranger.plugin.model.RangerPolicy.RangerRowFilterPolicyItem; |
| import org.apache.ranger.plugin.model.RangerPolicyResourceSignature; |
| import org.apache.ranger.plugin.model.RangerService; |
| import org.apache.ranger.plugin.model.RangerServiceDef; |
| import org.apache.ranger.plugin.model.RangerServiceDef.RangerAccessTypeDef; |
| import org.apache.ranger.plugin.model.RangerServiceDef.RangerContextEnricherDef; |
| import org.apache.ranger.plugin.model.RangerServiceDef.RangerDataMaskDef; |
| import org.apache.ranger.plugin.model.RangerServiceDef.RangerDataMaskTypeDef; |
| import org.apache.ranger.plugin.model.RangerServiceDef.RangerEnumDef; |
| import org.apache.ranger.plugin.model.RangerServiceDef.RangerEnumElementDef; |
| import org.apache.ranger.plugin.model.RangerServiceDef.RangerPolicyConditionDef; |
| import org.apache.ranger.plugin.model.RangerServiceDef.RangerResourceDef; |
| import org.apache.ranger.plugin.model.RangerServiceDef.RangerRowFilterDef; |
| import org.apache.ranger.plugin.model.RangerServiceDef.RangerServiceConfigDef; |
| import org.apache.ranger.plugin.model.validation.RangerServiceDefHelper; |
| import org.apache.ranger.plugin.store.AbstractServiceStore; |
| import org.apache.ranger.plugin.store.EmbeddedServiceDefsUtil; |
| import org.apache.ranger.plugin.store.PList; |
| import org.apache.ranger.plugin.store.ServicePredicateUtil; |
| import org.apache.ranger.plugin.util.SearchFilter; |
| import org.apache.ranger.plugin.util.ServicePolicies; |
| import org.apache.ranger.rest.ServiceREST; |
| import org.apache.ranger.rest.TagREST; |
| import org.apache.ranger.service.RangerAuditFields; |
| import org.apache.ranger.service.RangerDataHistService; |
| import org.apache.ranger.service.RangerPolicyService; |
| import org.apache.ranger.service.RangerPolicyWithAssignedIdService; |
| import org.apache.ranger.service.RangerServiceDefService; |
| import org.apache.ranger.service.RangerServiceDefWithAssignedIdService; |
| import org.apache.ranger.service.RangerServiceService; |
| import org.apache.ranger.service.RangerServiceWithAssignedIdService; |
| import org.apache.ranger.service.XUserService; |
| import org.apache.ranger.view.RangerExportPolicyList; |
| import org.apache.ranger.view.RangerPolicyList; |
| import org.apache.ranger.view.RangerServiceDefList; |
| import org.apache.ranger.view.RangerServiceList; |
| import org.apache.ranger.view.VXString; |
| import org.apache.ranger.view.VXUser; |
| import org.codehaus.jettison.json.JSONException; |
| import org.springframework.beans.factory.annotation.Autowired; |
| import org.springframework.beans.factory.annotation.Qualifier; |
| import org.springframework.stereotype.Component; |
| import org.springframework.transaction.PlatformTransactionManager; |
| import org.springframework.transaction.TransactionStatus; |
| import org.springframework.transaction.support.TransactionCallback; |
| import org.springframework.transaction.support.TransactionTemplate; |
| |
| import com.google.gson.Gson; |
| |
| @Component |
| public class ServiceDBStore extends AbstractServiceStore { |
| private static final Log LOG = LogFactory.getLog(ServiceDBStore.class); |
| |
| public static final String RANGER_TAG_EXPIRY_CONDITION_NAME = "accessed-after-expiry"; |
| |
| private static final String ADMIN_USER_PRINCIPAL = "ranger.admin.kerberos.principal"; |
| private static final String ADMIN_USER_KEYTAB = "ranger.admin.kerberos.keytab"; |
| private static final String LOOKUP_PRINCIPAL = "ranger.lookup.kerberos.principal"; |
| private static final String LOOKUP_KEYTAB = "ranger.lookup.kerberos.keytab"; |
| private static final String RANGER_AUTH_TYPE = "hadoop.security.authentication"; |
| private static final String AMBARI_SERVICE_CHECK_USER = "ambari.service.check.user"; |
| |
| private static final String KERBEROS_TYPE = "kerberos"; |
| |
| private static final String POLICY_ALLOW_EXCLUDE = "Policy Allow:Exclude"; |
| private static final String POLICY_ALLOW_INCLUDE = "Policy Allow:Include"; |
| private static final String POLICY_DENY_EXCLUDE = "Policy Deny:Exclude"; |
| private static final String POLICY_DENY_INCLUDE = "Policy Deny:Include"; |
| |
| private static String LOCAL_HOSTNAME = "unknown"; |
| private static final String HOSTNAME = "Host name"; |
| private static final String USER_NAME = "Exported by"; |
| private static final String RANGER_VERSION = "Ranger apache version"; |
| private static final String TIMESTAMP = "Export time"; |
| |
| private static final String AUDITTOHDFS_KMS_PATH = "/ranger/audit/kms"; |
| private static final String AUDITTOHDFS_POLICY_NAME = "kms-audit-path"; |
| private static final String SERVICE_ADMIN_USERS = "service.admin.users"; |
| |
| public static final String CRYPT_ALGO = PropertiesUtil.getProperty("ranger.password.encryption.algorithm", PasswordUtils.DEFAULT_CRYPT_ALGO); |
| public static final String ENCRYPT_KEY = PropertiesUtil.getProperty("ranger.password.encryption.key", PasswordUtils.DEFAULT_ENCRYPT_KEY); |
| public static final String SALT = PropertiesUtil.getProperty("ranger.password.salt", PasswordUtils.DEFAULT_SALT); |
| public static final Integer ITERATION_COUNT = PropertiesUtil.getIntProperty("ranger.password.iteration.count", PasswordUtils.DEFAULT_ITERATION_COUNT); |
| |
| static { |
| try { |
| LOCAL_HOSTNAME = java.net.InetAddress.getLocalHost().getCanonicalHostName(); |
| } catch (UnknownHostException e) { |
| LOCAL_HOSTNAME = "unknown"; |
| } |
| } |
| |
| @Autowired |
| RangerServiceDefService serviceDefService; |
| |
| @Autowired |
| RangerDaoManager daoMgr; |
| |
| @Autowired |
| RESTErrorUtil restErrorUtil; |
| |
| @Autowired |
| RangerServiceService svcService; |
| |
| @Autowired |
| StringUtil stringUtil; |
| |
| @Autowired |
| RangerAuditFields<XXDBBase> rangerAuditFields; |
| |
| @Autowired |
| RangerPolicyService policyService; |
| |
| @Autowired |
| XUserService xUserService; |
| |
| @Autowired |
| XUserMgr xUserMgr; |
| |
| @Autowired |
| PolicyRefUpdater policyRefUpdater; |
| |
| @Autowired |
| RangerDataHistService dataHistService; |
| |
| @Autowired |
| @Qualifier(value = "transactionManager") |
| PlatformTransactionManager txManager; |
| |
| @Autowired |
| RangerBizUtil bizUtil; |
| |
| @Autowired |
| RangerPolicyWithAssignedIdService assignedIdPolicyService; |
| |
| @Autowired |
| RangerServiceWithAssignedIdService svcServiceWithAssignedId; |
| |
| @Autowired |
| RangerServiceDefWithAssignedIdService svcDefServiceWithAssignedId; |
| |
| @Autowired |
| RangerFactory factory; |
| |
| @Autowired |
| JSONUtil jsonUtil; |
| |
| @Autowired |
| ServiceMgr serviceMgr; |
| |
| @Autowired |
| AssetMgr assetMgr; |
| |
| @Autowired |
| RangerTransactionSynchronizationAdapter transactionSynchronizationAdapter; |
| |
| private static volatile boolean legacyServiceDefsInitDone = false; |
| |
| private Boolean populateExistingBaseFields = false; |
| |
| public static final String HIDDEN_PASSWORD_STR = "*****"; |
| public static final String CONFIG_KEY_PASSWORD = "password"; |
| public static final String ACCESS_TYPE_DECRYPT_EEK = "decrypteek"; |
| public static final String ACCESS_TYPE_GENERATE_EEK = "generateeek"; |
| public static final String ACCESS_TYPE_GET_METADATA = "getmetadata"; |
| |
| private ServicePredicateUtil predicateUtil = null; |
| |
| @Override |
| public void init() throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDefDBStore.init()"); |
| } |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDefDBStore.init()"); |
| } |
| } |
| |
| @PostConstruct |
| public void initStore() { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDefDBStore.initStore()"); |
| } |
| |
| if(! legacyServiceDefsInitDone) { |
| synchronized(ServiceDBStore.class) { |
| if(!legacyServiceDefsInitDone) { |
| |
| if (! RangerConfiguration.getInstance().addAdminResources()) { |
| LOG.error("Could not add ranger-admin resources to RangerConfiguration."); |
| } |
| |
| TransactionTemplate txTemplate = new TransactionTemplate(txManager); |
| |
| final ServiceDBStore dbStore = this; |
| predicateUtil = new ServicePredicateUtil(dbStore); |
| |
| try { |
| txTemplate.execute(new TransactionCallback<Object>() { |
| @Override |
| public Object doInTransaction(TransactionStatus status) { |
| EmbeddedServiceDefsUtil.instance().init(dbStore); |
| getServiceUpgraded(); |
| createGenericUsers(); |
| return null; |
| } |
| }); |
| } catch (Throwable ex) { |
| LOG.fatal("ServiceDefDBStore.initStore(): Failed to update DB: " + ex); |
| } |
| |
| legacyServiceDefsInitDone = true; |
| } |
| } |
| } |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDefDBStore.initStore()"); |
| } |
| } |
| |
| @Override |
| public RangerServiceDef createServiceDef(RangerServiceDef serviceDef) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDefDBStore.createServiceDef(" + serviceDef + ")"); |
| } |
| |
| XXServiceDef xServiceDef = daoMgr.getXXServiceDef().findByName( |
| serviceDef.getName()); |
| if (xServiceDef != null) { |
| throw restErrorUtil.createRESTException("service-def with name: " |
| + serviceDef.getName() + " already exists", |
| MessageEnums.ERROR_DUPLICATE_OBJECT); |
| } |
| |
| List<RangerServiceConfigDef> configs = serviceDef.getConfigs(); |
| List<RangerResourceDef> resources = serviceDef.getResources(); |
| |
| if (CollectionUtils.isNotEmpty(resources)) { |
| RangerServiceDefValidator validator = new RangerServiceDefValidator(this); |
| List<ValidationFailureDetails> failures = new ArrayList<>(); |
| boolean isValidResources = validator.isValidResources(serviceDef, failures, RangerValidator.Action.CREATE); |
| if (!isValidResources) { |
| throw restErrorUtil.createRESTException("service-def with name: " |
| + serviceDef.getName() + " has invalid resources:[" + failures.toString() + "]", |
| MessageEnums.INVALID_INPUT_DATA); |
| } |
| } |
| |
| List<RangerAccessTypeDef> accessTypes = serviceDef.getAccessTypes(); |
| List<RangerPolicyConditionDef> policyConditions = serviceDef.getPolicyConditions(); |
| List<RangerContextEnricherDef> contextEnrichers = serviceDef.getContextEnrichers(); |
| List<RangerEnumDef> enums = serviceDef.getEnums(); |
| RangerDataMaskDef dataMaskDef = serviceDef.getDataMaskDef(); |
| RangerRowFilterDef rowFilterDef = serviceDef.getRowFilterDef(); |
| List<RangerDataMaskTypeDef> dataMaskTypes = dataMaskDef == null || dataMaskDef.getMaskTypes() == null ? new ArrayList<RangerDataMaskTypeDef>() : dataMaskDef.getMaskTypes(); |
| List<RangerAccessTypeDef> dataMaskAccessTypes = dataMaskDef == null || dataMaskDef.getAccessTypes() == null ? new ArrayList<RangerAccessTypeDef>() : dataMaskDef.getAccessTypes(); |
| List<RangerResourceDef> dataMaskResources = dataMaskDef == null || dataMaskDef.getResources() == null ? new ArrayList<RangerResourceDef>() : dataMaskDef.getResources(); |
| List<RangerAccessTypeDef> rowFilterAccessTypes = rowFilterDef == null || rowFilterDef.getAccessTypes() == null ? new ArrayList<RangerAccessTypeDef>() : rowFilterDef.getAccessTypes(); |
| List<RangerResourceDef> rowFilterResources = rowFilterDef == null || rowFilterDef.getResources() == null ? new ArrayList<RangerResourceDef>() : rowFilterDef.getResources(); |
| |
| // While creating, value of version should be 1. |
| serviceDef.setVersion(Long.valueOf(1)); |
| |
| if (populateExistingBaseFields) { |
| svcDefServiceWithAssignedId.setPopulateExistingBaseFields(true); |
| daoMgr.getXXServiceDef().setIdentityInsert(true); |
| |
| svcDefServiceWithAssignedId.create(serviceDef); |
| |
| svcDefServiceWithAssignedId.setPopulateExistingBaseFields(false); |
| daoMgr.getXXServiceDef().updateSequence(); |
| daoMgr.getXXServiceDef().setIdentityInsert(false); |
| } else { |
| // following fields will be auto populated |
| serviceDef.setId(null); |
| serviceDef.setCreateTime(null); |
| serviceDef.setUpdateTime(null); |
| serviceDef = serviceDefService.create(serviceDef); |
| } |
| Long serviceDefId = serviceDef.getId(); |
| XXServiceDef createdSvcDef = daoMgr.getXXServiceDef().getById(serviceDefId); |
| |
| XXServiceConfigDefDao xxServiceConfigDao = daoMgr.getXXServiceConfigDef(); |
| for(int i = 0; i < configs.size(); i++) { |
| RangerServiceConfigDef config = configs.get(i); |
| |
| XXServiceConfigDef xConfig = new XXServiceConfigDef(); |
| xConfig = serviceDefService.populateRangerServiceConfigDefToXX(config, xConfig, createdSvcDef, |
| RangerServiceDefService.OPERATION_CREATE_CONTEXT); |
| xConfig.setOrder(i); |
| xConfig = xxServiceConfigDao.create(xConfig); |
| } |
| |
| XXResourceDefDao xxResDefDao = daoMgr.getXXResourceDef(); |
| for(int i = 0; i < resources.size(); i++) { |
| RangerResourceDef resource = resources.get(i); |
| |
| XXResourceDef parent = xxResDefDao.findByNameAndServiceDefId(resource.getParent(), serviceDefId); |
| Long parentId = (parent != null) ? parent.getId() : null; |
| |
| XXResourceDef xResource = new XXResourceDef(); |
| xResource = serviceDefService.populateRangerResourceDefToXX(resource, xResource, createdSvcDef, |
| RangerServiceDefService.OPERATION_CREATE_CONTEXT); |
| xResource.setOrder(i); |
| xResource.setParent(parentId); |
| xResource = xxResDefDao.create(xResource); |
| } |
| |
| XXAccessTypeDefDao xxATDDao = daoMgr.getXXAccessTypeDef(); |
| for(int i = 0; i < accessTypes.size(); i++) { |
| RangerAccessTypeDef accessType = accessTypes.get(i); |
| |
| XXAccessTypeDef xAccessType = new XXAccessTypeDef(); |
| xAccessType = serviceDefService.populateRangerAccessTypeDefToXX(accessType, xAccessType, createdSvcDef, |
| RangerServiceDefService.OPERATION_CREATE_CONTEXT); |
| xAccessType.setOrder(i); |
| xAccessType = xxATDDao.create(xAccessType); |
| |
| Collection<String> impliedGrants = accessType.getImpliedGrants(); |
| XXAccessTypeDefGrantsDao xxATDGrantDao = daoMgr.getXXAccessTypeDefGrants(); |
| for(String impliedGrant : impliedGrants) { |
| XXAccessTypeDefGrants xImpliedGrant = new XXAccessTypeDefGrants(); |
| xImpliedGrant.setAtdId(xAccessType.getId()); |
| xImpliedGrant.setImpliedGrant(impliedGrant); |
| xImpliedGrant = xxATDGrantDao.create(xImpliedGrant); |
| } |
| } |
| |
| XXPolicyConditionDefDao xxPolCondDao = daoMgr.getXXPolicyConditionDef(); |
| for (int i = 0; i < policyConditions.size(); i++) { |
| RangerPolicyConditionDef policyCondition = policyConditions.get(i); |
| |
| XXPolicyConditionDef xPolicyCondition = new XXPolicyConditionDef(); |
| xPolicyCondition = serviceDefService |
| .populateRangerPolicyConditionDefToXX(policyCondition, |
| xPolicyCondition, createdSvcDef, RangerServiceDefService.OPERATION_CREATE_CONTEXT); |
| xPolicyCondition.setOrder(i); |
| xPolicyCondition = xxPolCondDao.create(xPolicyCondition); |
| } |
| |
| XXContextEnricherDefDao xxContextEnricherDao = daoMgr.getXXContextEnricherDef(); |
| for (int i = 0; i < contextEnrichers.size(); i++) { |
| RangerContextEnricherDef contextEnricher = contextEnrichers.get(i); |
| |
| XXContextEnricherDef xContextEnricher = new XXContextEnricherDef(); |
| xContextEnricher = serviceDefService |
| .populateRangerContextEnricherDefToXX(contextEnricher, |
| xContextEnricher, createdSvcDef, RangerServiceDefService.OPERATION_CREATE_CONTEXT); |
| xContextEnricher.setOrder(i); |
| xContextEnricher = xxContextEnricherDao.create(xContextEnricher); |
| } |
| |
| XXEnumDefDao xxEnumDefDao = daoMgr.getXXEnumDef(); |
| for(RangerEnumDef vEnum : enums) { |
| XXEnumDef xEnum = new XXEnumDef(); |
| xEnum = serviceDefService.populateRangerEnumDefToXX(vEnum, xEnum, createdSvcDef, RangerServiceDefService.OPERATION_CREATE_CONTEXT); |
| xEnum = xxEnumDefDao.create(xEnum); |
| |
| List<RangerEnumElementDef> elements = vEnum.getElements(); |
| XXEnumElementDefDao xxEnumEleDefDao = daoMgr.getXXEnumElementDef(); |
| for(int i = 0; i < elements.size(); i++) { |
| RangerEnumElementDef element = elements.get(i); |
| |
| XXEnumElementDef xElement = new XXEnumElementDef(); |
| xElement = serviceDefService.populateRangerEnumElementDefToXX(element, xElement, xEnum, RangerServiceDefService.OPERATION_CREATE_CONTEXT); |
| xElement.setOrder(i); |
| xElement = xxEnumEleDefDao.create(xElement); |
| } |
| } |
| |
| XXDataMaskTypeDefDao xxDataMaskDefDao = daoMgr.getXXDataMaskTypeDef(); |
| for (int i = 0; i < dataMaskTypes.size(); i++) { |
| RangerDataMaskTypeDef dataMask = dataMaskTypes.get(i); |
| |
| XXDataMaskTypeDef xDataMaskDef = new XXDataMaskTypeDef(); |
| xDataMaskDef = serviceDefService.populateRangerDataMaskDefToXX(dataMask, xDataMaskDef, createdSvcDef, |
| RangerServiceDefService.OPERATION_CREATE_CONTEXT); |
| xDataMaskDef.setOrder(i); |
| xDataMaskDef = xxDataMaskDefDao.create(xDataMaskDef); |
| } |
| |
| List<XXAccessTypeDef> xxAccessTypeDefs = xxATDDao.findByServiceDefId(createdSvcDef.getId()); |
| |
| for(RangerAccessTypeDef accessType : dataMaskAccessTypes) { |
| if(! isAccessTypeInList(accessType.getName(), xxAccessTypeDefs)) { |
| throw restErrorUtil.createRESTException("accessType with name: " |
| + accessType.getName() + " does not exists", MessageEnums.DATA_NOT_FOUND); |
| } |
| } |
| |
| for(RangerAccessTypeDef accessType : rowFilterAccessTypes) { |
| if(! isAccessTypeInList(accessType.getName(), xxAccessTypeDefs)) { |
| throw restErrorUtil.createRESTException("accessType with name: " |
| + accessType.getName() + " does not exists", MessageEnums.DATA_NOT_FOUND); |
| } |
| } |
| |
| for(XXAccessTypeDef xxAccessTypeDef : xxAccessTypeDefs) { |
| String dataMaskOptions = null; |
| String rowFilterOptions = null; |
| |
| for(RangerAccessTypeDef accessTypeDef : dataMaskAccessTypes) { |
| if(StringUtils.equals(accessTypeDef.getName(), xxAccessTypeDef.getName())) { |
| dataMaskOptions = svcDefServiceWithAssignedId.objectToJson(accessTypeDef); |
| break; |
| } |
| } |
| |
| for(RangerAccessTypeDef accessTypeDef : rowFilterAccessTypes) { |
| if(StringUtils.equals(accessTypeDef.getName(), xxAccessTypeDef.getName())) { |
| rowFilterOptions = svcDefServiceWithAssignedId.objectToJson(accessTypeDef); |
| break; |
| } |
| } |
| |
| if(!StringUtils.equals(dataMaskOptions, xxAccessTypeDef.getDataMaskOptions()) || |
| !StringUtils.equals(rowFilterOptions, xxAccessTypeDef.getRowFilterOptions())) { |
| xxAccessTypeDef.setDataMaskOptions(dataMaskOptions); |
| xxAccessTypeDef.setRowFilterOptions(rowFilterOptions); |
| |
| xxATDDao.update(xxAccessTypeDef); |
| } |
| } |
| |
| List<XXResourceDef> xxResourceDefs = xxResDefDao.findByServiceDefId(createdSvcDef.getId()); |
| |
| for(RangerResourceDef resource : dataMaskResources) { |
| if(! isResourceInList(resource.getName(), xxResourceDefs)) { |
| throw restErrorUtil.createRESTException("resource with name: " |
| + resource.getName() + " does not exists", MessageEnums.DATA_NOT_FOUND); |
| } |
| } |
| |
| for(RangerResourceDef resource : rowFilterResources) { |
| if(! isResourceInList(resource.getName(), xxResourceDefs)) { |
| throw restErrorUtil.createRESTException("resource with name: " |
| + resource.getName() + " does not exists", MessageEnums.DATA_NOT_FOUND); |
| } |
| } |
| |
| for(XXResourceDef xxResourceDef : xxResourceDefs) { |
| String dataMaskOptions = null; |
| String rowFilterOptions = null; |
| |
| for(RangerResourceDef resource : dataMaskResources) { |
| if(StringUtils.equals(resource.getName(), xxResourceDef.getName())) { |
| dataMaskOptions = svcDefServiceWithAssignedId.objectToJson(resource); |
| break; |
| } |
| } |
| |
| for(RangerResourceDef resource : rowFilterResources) { |
| if(StringUtils.equals(resource.getName(), xxResourceDef.getName())) { |
| rowFilterOptions = svcDefServiceWithAssignedId.objectToJson(resource); |
| break; |
| } |
| } |
| |
| if(!StringUtils.equals(dataMaskOptions, xxResourceDef.getDataMaskOptions()) || |
| !StringUtils.equals(rowFilterOptions, xxResourceDef.getRowFilterOptions())) { |
| xxResourceDef.setDataMaskOptions(dataMaskOptions); |
| xxResourceDef.setRowFilterOptions(rowFilterOptions); |
| |
| xxResDefDao.update(xxResourceDef); |
| } |
| } |
| |
| RangerServiceDef createdServiceDef = serviceDefService.getPopulatedViewObject(createdSvcDef); |
| dataHistService.createObjectDataHistory(createdServiceDef, RangerDataHistService.ACTION_CREATE); |
| |
| postCreate(createdServiceDef); |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDefDBStore.createServiceDef(" + serviceDef + "): " + createdServiceDef); |
| } |
| |
| return createdServiceDef; |
| } |
| |
| @Override |
| public RangerServiceDef updateServiceDef(RangerServiceDef serviceDef) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDefDBStore.updateServiceDef(" + serviceDef + ")"); |
| } |
| |
| Long serviceDefId = serviceDef.getId(); |
| |
| XXServiceDef existing = daoMgr.getXXServiceDef().getById(serviceDefId); |
| if (existing == null) { |
| throw restErrorUtil.createRESTException("no service-def exists with ID=" + serviceDef.getId(), |
| MessageEnums.DATA_NOT_FOUND); |
| } |
| |
| String existingName = existing.getName(); |
| |
| boolean renamed = !StringUtils.equalsIgnoreCase(serviceDef.getName(), existingName); |
| |
| if (renamed) { |
| XXServiceDef renamedSVCDef = daoMgr.getXXServiceDef().findByName(serviceDef.getName()); |
| |
| if (renamedSVCDef != null) { |
| throw restErrorUtil.createRESTException( |
| "another service-def already exists with name '" + serviceDef.getName() + "'. ID=" |
| + renamedSVCDef.getId(), MessageEnums.DATA_NOT_UPDATABLE); |
| } |
| } |
| |
| List<RangerServiceConfigDef> configs = serviceDef.getConfigs() != null ? serviceDef.getConfigs() : new ArrayList<RangerServiceConfigDef>(); |
| List<RangerResourceDef> resources = serviceDef.getResources() != null ? serviceDef.getResources() : new ArrayList<RangerResourceDef>(); |
| List<RangerAccessTypeDef> accessTypes = serviceDef.getAccessTypes() != null ? serviceDef.getAccessTypes() : new ArrayList<RangerAccessTypeDef>(); |
| List<RangerPolicyConditionDef> policyConditions = serviceDef.getPolicyConditions() != null ? serviceDef.getPolicyConditions() : new ArrayList<RangerPolicyConditionDef>(); |
| List<RangerContextEnricherDef> contextEnrichers = serviceDef.getContextEnrichers() != null ? serviceDef.getContextEnrichers() : new ArrayList<RangerContextEnricherDef>(); |
| List<RangerEnumDef> enums = serviceDef.getEnums() != null ? serviceDef.getEnums() : new ArrayList<RangerEnumDef>(); |
| RangerDataMaskDef dataMaskDef = serviceDef.getDataMaskDef(); |
| RangerRowFilterDef rowFilterDef = serviceDef.getRowFilterDef(); |
| |
| serviceDef.setCreateTime(existing.getCreateTime()); |
| serviceDef.setGuid(existing.getGuid()); |
| serviceDef.setVersion(existing.getVersion()); |
| |
| serviceDef = serviceDefService.update(serviceDef); |
| XXServiceDef createdSvcDef = daoMgr.getXXServiceDef().getById(serviceDefId); |
| |
| updateChildObjectsOfServiceDef(createdSvcDef, configs, resources, accessTypes, policyConditions, contextEnrichers, enums, dataMaskDef, rowFilterDef); |
| |
| RangerServiceDef updatedSvcDef = getServiceDef(serviceDefId); |
| dataHistService.createObjectDataHistory(updatedSvcDef, RangerDataHistService.ACTION_UPDATE); |
| |
| postUpdate(updatedSvcDef); |
| |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDefDBStore.updateServiceDef(" + serviceDef + "): " + serviceDef); |
| } |
| |
| return updatedSvcDef; |
| } |
| |
| private void updateChildObjectsOfServiceDef(XXServiceDef createdSvcDef, List<RangerServiceConfigDef> configs, |
| List<RangerResourceDef> resources, List<RangerAccessTypeDef> accessTypes, |
| List<RangerPolicyConditionDef> policyConditions, List<RangerContextEnricherDef> contextEnrichers, |
| List<RangerEnumDef> enums, RangerDataMaskDef dataMaskDef, RangerRowFilterDef rowFilterDef) { |
| |
| Long serviceDefId = createdSvcDef.getId(); |
| |
| List<XXServiceConfigDef> xxConfigs = daoMgr.getXXServiceConfigDef().findByServiceDefId(serviceDefId); |
| List<XXResourceDef> xxResources = daoMgr.getXXResourceDef().findByServiceDefId(serviceDefId); |
| List<XXAccessTypeDef> xxAccessTypes = daoMgr.getXXAccessTypeDef().findByServiceDefId(serviceDefId); |
| List<XXPolicyConditionDef> xxPolicyConditions = daoMgr.getXXPolicyConditionDef().findByServiceDefId( |
| serviceDefId); |
| List<XXContextEnricherDef> xxContextEnrichers = daoMgr.getXXContextEnricherDef().findByServiceDefId( |
| serviceDefId); |
| List<XXEnumDef> xxEnums = daoMgr.getXXEnumDef().findByServiceDefId(serviceDefId); |
| |
| XXServiceConfigDefDao xxServiceConfigDao = daoMgr.getXXServiceConfigDef(); |
| for (int i = 0; i < configs.size(); i++) { |
| RangerServiceConfigDef config = configs.get(i); |
| boolean found = false; |
| for (XXServiceConfigDef xConfig : xxConfigs) { |
| if (config.getItemId() != null && config.getItemId().equals(xConfig.getItemId())) { |
| found = true; |
| xConfig = serviceDefService.populateRangerServiceConfigDefToXX(config, xConfig, createdSvcDef, |
| RangerServiceDefService.OPERATION_UPDATE_CONTEXT); |
| xConfig.setOrder(i); |
| xConfig = xxServiceConfigDao.update(xConfig); |
| config = serviceDefService.populateXXToRangerServiceConfigDef(xConfig); |
| break; |
| } |
| } |
| if (!found) { |
| XXServiceConfigDef xConfig = new XXServiceConfigDef(); |
| xConfig = serviceDefService.populateRangerServiceConfigDefToXX(config, xConfig, createdSvcDef, |
| RangerServiceDefService.OPERATION_CREATE_CONTEXT); |
| xConfig.setOrder(i); |
| xConfig = xxServiceConfigDao.create(xConfig); |
| config = serviceDefService.populateXXToRangerServiceConfigDef(xConfig); |
| } |
| } |
| for (XXServiceConfigDef xConfig : xxConfigs) { |
| boolean found = false; |
| for (RangerServiceConfigDef config : configs) { |
| if (xConfig.getItemId() != null && xConfig.getItemId().equals(config.getItemId())) { |
| found = true; |
| break; |
| } |
| } |
| if (!found) { |
| xxServiceConfigDao.remove(xConfig); |
| } |
| } |
| |
| XXResourceDefDao xxResDefDao = daoMgr.getXXResourceDef(); |
| for (RangerResourceDef resource : resources) { |
| boolean found = false; |
| for (XXResourceDef xRes : xxResources) { |
| if (resource.getItemId() != null && resource.getItemId().equals(xRes.getItemId())) { |
| found = true; |
| xRes = serviceDefService.populateRangerResourceDefToXX(resource, xRes, createdSvcDef, |
| RangerServiceDefService.OPERATION_UPDATE_CONTEXT); |
| xxResDefDao.update(xRes); |
| resource = serviceDefService.populateXXToRangerResourceDef(xRes); |
| break; |
| } |
| } |
| if (!found) { |
| XXResourceDef parent = xxResDefDao.findByNameAndServiceDefId(resource.getParent(), serviceDefId); |
| Long parentId = (parent != null) ? parent.getId() : null; |
| |
| XXResourceDef xResource = new XXResourceDef(); |
| xResource = serviceDefService.populateRangerResourceDefToXX(resource, xResource, createdSvcDef, |
| RangerServiceDefService.OPERATION_CREATE_CONTEXT); |
| xResource.setParent(parentId); |
| xResource = xxResDefDao.create(xResource); |
| } |
| } |
| for (XXResourceDef xRes : xxResources) { |
| boolean found = false; |
| for (RangerResourceDef resource : resources) { |
| if (xRes.getItemId() != null && xRes.getItemId().equals(resource.getItemId())) { |
| found = true; |
| break; |
| } |
| } |
| if (!found) { |
| List<XXPolicyRefResource> xxPolicyRefResource = daoMgr.getXXPolicyRefResource().findByResourceDefID(xRes.getId()); |
| if (!stringUtil.isEmpty(xxPolicyRefResource)) { |
| throw restErrorUtil.createRESTException("Policy/Policies are referring to this resource: " |
| + xRes.getName() + ". Please remove such references from policy before updating service-def.", |
| MessageEnums.DATA_NOT_UPDATABLE); |
| } |
| deleteXXResourceDef(xRes); |
| } |
| } |
| |
| XXAccessTypeDefDao xxATDDao = daoMgr.getXXAccessTypeDef(); |
| for(int i = 0; i < accessTypes.size(); i++) { |
| RangerAccessTypeDef access = accessTypes.get(i); |
| boolean found = false; |
| for (XXAccessTypeDef xAccess : xxAccessTypes) { |
| if (access.getItemId() != null && access.getItemId().equals(xAccess.getItemId())) { |
| found = true; |
| xAccess = serviceDefService.populateRangerAccessTypeDefToXX(access, xAccess, createdSvcDef, |
| RangerServiceDefService.OPERATION_UPDATE_CONTEXT); |
| xAccess.setOrder(i); |
| xAccess = xxATDDao.update(xAccess); |
| |
| Collection<String> impliedGrants = access.getImpliedGrants(); |
| XXAccessTypeDefGrantsDao xxATDGrantDao = daoMgr.getXXAccessTypeDefGrants(); |
| List<String> xxImpliedGrants = xxATDGrantDao.findImpliedGrantsByATDId(xAccess.getId()); |
| for (String impliedGrant : impliedGrants) { |
| boolean foundGrant = false; |
| for (String xImpliedGrant : xxImpliedGrants) { |
| if (StringUtils.equalsIgnoreCase(impliedGrant, xImpliedGrant)) { |
| foundGrant = true; |
| break; |
| } |
| } |
| if (!foundGrant) { |
| XXAccessTypeDefGrants xImpliedGrant = new XXAccessTypeDefGrants(); |
| xImpliedGrant.setAtdId(xAccess.getId()); |
| xImpliedGrant.setImpliedGrant(impliedGrant); |
| xImpliedGrant = xxATDGrantDao.create(xImpliedGrant); |
| } |
| } |
| for (String xImpliedGrant : xxImpliedGrants) { |
| boolean foundGrant = false; |
| for (String impliedGrant : impliedGrants) { |
| if (StringUtils.equalsIgnoreCase(xImpliedGrant, impliedGrant)) { |
| foundGrant = true; |
| break; |
| } |
| } |
| if (!foundGrant) { |
| XXAccessTypeDefGrants xATDGrant = xxATDGrantDao.findByNameAndATDId(xAccess.getId(), |
| xImpliedGrant); |
| xxATDGrantDao.remove(xATDGrant); |
| |
| } |
| } |
| access = serviceDefService.populateXXToRangerAccessTypeDef(xAccess); |
| break; |
| } |
| } |
| if (!found) { |
| XXAccessTypeDef xAccessType = new XXAccessTypeDef(); |
| xAccessType = serviceDefService.populateRangerAccessTypeDefToXX(access, xAccessType, createdSvcDef, |
| RangerServiceDefService.OPERATION_CREATE_CONTEXT); |
| xAccessType.setOrder(i); |
| xAccessType = xxATDDao.create(xAccessType); |
| |
| Collection<String> impliedGrants = access.getImpliedGrants(); |
| XXAccessTypeDefGrantsDao xxATDGrantDao = daoMgr.getXXAccessTypeDefGrants(); |
| for (String impliedGrant : impliedGrants) { |
| XXAccessTypeDefGrants xImpliedGrant = new XXAccessTypeDefGrants(); |
| xImpliedGrant.setAtdId(xAccessType.getId()); |
| xImpliedGrant.setImpliedGrant(impliedGrant); |
| xImpliedGrant = xxATDGrantDao.create(xImpliedGrant); |
| } |
| access = serviceDefService.populateXXToRangerAccessTypeDef(xAccessType); |
| } |
| } |
| |
| for (XXAccessTypeDef xAccess : xxAccessTypes) { |
| boolean found = false; |
| for (RangerAccessTypeDef access : accessTypes) { |
| if (xAccess.getItemId() != null && xAccess.getItemId().equals(access.getItemId())) { |
| found = true; |
| break; |
| } |
| } |
| if (!found) { |
| List<XXPolicyRefAccessType> policyRefAccessTypeList = daoMgr.getXXPolicyRefAccessType().findByAccessTypeDefId(xAccess.getId()); |
| if(!stringUtil.isEmpty(policyRefAccessTypeList)) { |
| throw restErrorUtil.createRESTException("Policy/Policies are referring to this access-type: " |
| + xAccess.getName() + ". Please remove such references from policy before updating service-def.", |
| MessageEnums.DATA_NOT_UPDATABLE); |
| } |
| deleteXXAccessTypeDef(xAccess); |
| } |
| } |
| |
| XXPolicyConditionDefDao xxPolCondDao = daoMgr.getXXPolicyConditionDef(); |
| for (int i = 0; i < policyConditions.size(); i++) { |
| RangerPolicyConditionDef condition = policyConditions.get(i); |
| boolean found = false; |
| for (XXPolicyConditionDef xCondition : xxPolicyConditions) { |
| if (condition.getItemId() != null && condition.getItemId().equals(xCondition.getItemId())) { |
| found = true; |
| xCondition = serviceDefService.populateRangerPolicyConditionDefToXX(condition, xCondition, |
| createdSvcDef, RangerServiceDefService.OPERATION_UPDATE_CONTEXT); |
| xCondition.setOrder(i); |
| xCondition = xxPolCondDao.update(xCondition); |
| condition = serviceDefService.populateXXToRangerPolicyConditionDef(xCondition); |
| break; |
| } |
| } |
| if (!found) { |
| XXPolicyConditionDef xCondition = new XXPolicyConditionDef(); |
| xCondition = serviceDefService.populateRangerPolicyConditionDefToXX(condition, xCondition, |
| createdSvcDef, RangerServiceDefService.OPERATION_CREATE_CONTEXT); |
| xCondition.setOrder(i); |
| xCondition = xxPolCondDao.create(xCondition); |
| condition = serviceDefService.populateXXToRangerPolicyConditionDef(xCondition); |
| } |
| } |
| for(XXPolicyConditionDef xCondition : xxPolicyConditions) { |
| boolean found = false; |
| for(RangerPolicyConditionDef condition : policyConditions) { |
| if(xCondition.getItemId() != null && xCondition.getItemId().equals(condition.getItemId())) { |
| found = true; |
| break; |
| } |
| } |
| if(!found) { |
| List<XXPolicyRefCondition> xxPolicyRefConditions = daoMgr.getXXPolicyRefCondition().findByConditionDefId(xCondition.getId()); |
| if(!stringUtil.isEmpty(xxPolicyRefConditions)) { |
| throw restErrorUtil.createRESTException("Policy/Policies are referring to this policy-condition: " |
| + xCondition.getName() + ". Please remove such references from policy before updating service-def.", |
| MessageEnums.DATA_NOT_UPDATABLE); |
| } |
| for(XXPolicyRefCondition xxPolicyRefCondition : xxPolicyRefConditions) { |
| daoMgr.getXXPolicyRefCondition().remove(xxPolicyRefCondition); |
| } |
| xxPolCondDao.remove(xCondition); |
| } |
| } |
| |
| XXContextEnricherDefDao xxContextEnricherDao = daoMgr.getXXContextEnricherDef(); |
| for (int i = 0; i < contextEnrichers.size(); i++) { |
| RangerContextEnricherDef context = contextEnrichers.get(i); |
| boolean found = false; |
| for (XXContextEnricherDef xContext : xxContextEnrichers) { |
| if (context.getItemId() != null && context.getItemId().equals(xContext.getItemId())) { |
| found = true; |
| xContext = serviceDefService.populateRangerContextEnricherDefToXX(context, xContext, createdSvcDef, |
| RangerServiceDefService.OPERATION_UPDATE_CONTEXT); |
| xContext.setOrder(i); |
| xContext = xxContextEnricherDao.update(xContext); |
| context = serviceDefService.populateXXToRangerContextEnricherDef(xContext); |
| break; |
| } |
| } |
| if (!found) { |
| XXContextEnricherDef xContext = new XXContextEnricherDef(); |
| xContext = serviceDefService.populateRangerContextEnricherDefToXX(context, xContext, createdSvcDef, |
| RangerServiceDefService.OPERATION_UPDATE_CONTEXT); |
| xContext.setOrder(i); |
| xContext = xxContextEnricherDao.create(xContext); |
| context = serviceDefService.populateXXToRangerContextEnricherDef(xContext); |
| } |
| } |
| for (XXContextEnricherDef xContext : xxContextEnrichers) { |
| boolean found = false; |
| for (RangerContextEnricherDef context : contextEnrichers) { |
| if (xContext.getItemId() != null && xContext.getItemId().equals(context.getItemId())) { |
| found = true; |
| break; |
| } |
| } |
| if (!found) { |
| daoMgr.getXXContextEnricherDef().remove(xContext); |
| } |
| } |
| |
| XXEnumDefDao xxEnumDefDao = daoMgr.getXXEnumDef(); |
| for (RangerEnumDef enumDef : enums) { |
| boolean found = false; |
| for (XXEnumDef xEnumDef : xxEnums) { |
| if (enumDef.getItemId() != null && enumDef.getItemId().equals(xEnumDef.getItemId())) { |
| found = true; |
| xEnumDef = serviceDefService.populateRangerEnumDefToXX(enumDef, xEnumDef, createdSvcDef, |
| RangerServiceDefService.OPERATION_UPDATE_CONTEXT); |
| xEnumDef = xxEnumDefDao.update(xEnumDef); |
| |
| XXEnumElementDefDao xEnumEleDao = daoMgr.getXXEnumElementDef(); |
| List<XXEnumElementDef> xxEnumEleDefs = xEnumEleDao.findByEnumDefId(xEnumDef.getId()); |
| List<RangerEnumElementDef> enumEleDefs = enumDef.getElements(); |
| |
| for (int i = 0; i < enumEleDefs.size(); i++) { |
| RangerEnumElementDef eleDef = enumEleDefs.get(i); |
| boolean foundEle = false; |
| for (XXEnumElementDef xEleDef : xxEnumEleDefs) { |
| if (eleDef.getItemId() != null && eleDef.getItemId().equals(xEleDef.getItemId())) { |
| foundEle = true; |
| xEleDef = serviceDefService.populateRangerEnumElementDefToXX(eleDef, xEleDef, xEnumDef, |
| RangerServiceDefService.OPERATION_UPDATE_CONTEXT); |
| xEleDef.setOrder(i); |
| xEleDef = xEnumEleDao.update(xEleDef); |
| break; |
| } |
| } |
| if (!foundEle) { |
| XXEnumElementDef xElement = new XXEnumElementDef(); |
| xElement = serviceDefService.populateRangerEnumElementDefToXX(eleDef, xElement, xEnumDef, |
| RangerServiceDefService.OPERATION_CREATE_CONTEXT); |
| xElement.setOrder(i); |
| xElement = xEnumEleDao.create(xElement); |
| } |
| } |
| for (XXEnumElementDef xxEleDef : xxEnumEleDefs) { |
| boolean foundEle = false; |
| for (RangerEnumElementDef enumEle : enumEleDefs) { |
| if (xxEleDef.getItemId() != null && xxEleDef.getItemId().equals(enumEle.getItemId())) { |
| foundEle = true; |
| break; |
| } |
| } |
| if (!foundEle) { |
| xEnumEleDao.remove(xxEleDef); |
| } |
| } |
| enumDef = serviceDefService.populateXXToRangerEnumDef(xEnumDef); |
| break; |
| } |
| } |
| if (!found) { |
| XXEnumDef xEnum = new XXEnumDef(); |
| xEnum = serviceDefService.populateRangerEnumDefToXX(enumDef, xEnum, createdSvcDef, |
| RangerServiceDefService.OPERATION_CREATE_CONTEXT); |
| xEnum = xxEnumDefDao.create(xEnum); |
| |
| List<RangerEnumElementDef> elements = enumDef.getElements(); |
| XXEnumElementDefDao xxEnumEleDefDao = daoMgr.getXXEnumElementDef(); |
| for (RangerEnumElementDef element : elements) { |
| XXEnumElementDef xElement = new XXEnumElementDef(); |
| xElement = serviceDefService.populateRangerEnumElementDefToXX(element, xElement, xEnum, |
| RangerServiceDefService.OPERATION_CREATE_CONTEXT); |
| xElement = xxEnumEleDefDao.create(xElement); |
| } |
| enumDef = serviceDefService.populateXXToRangerEnumDef(xEnum); |
| } |
| } |
| for (XXEnumDef xEnumDef : xxEnums) { |
| boolean found = false; |
| for (RangerEnumDef enumDef : enums) { |
| if (xEnumDef.getItemId() != null && xEnumDef.getItemId().equals(enumDef.getItemId())) { |
| found = true; |
| break; |
| } |
| } |
| if (!found) { |
| List<XXEnumElementDef> enumEleDefList = daoMgr.getXXEnumElementDef().findByEnumDefId(xEnumDef.getId()); |
| for (XXEnumElementDef eleDef : enumEleDefList) { |
| daoMgr.getXXEnumElementDef().remove(eleDef); |
| } |
| xxEnumDefDao.remove(xEnumDef); |
| } |
| } |
| |
| List<RangerDataMaskTypeDef> dataMasks = dataMaskDef == null || dataMaskDef.getMaskTypes() == null ? new ArrayList<RangerDataMaskTypeDef>() : dataMaskDef.getMaskTypes(); |
| List<RangerAccessTypeDef> dataMaskAccessTypes = dataMaskDef == null || dataMaskDef.getAccessTypes() == null ? new ArrayList<RangerAccessTypeDef>() : dataMaskDef.getAccessTypes(); |
| List<RangerResourceDef> dataMaskResources = dataMaskDef == null || dataMaskDef.getResources() == null ? new ArrayList<RangerResourceDef>() : dataMaskDef.getResources(); |
| List<RangerAccessTypeDef> rowFilterAccessTypes = rowFilterDef == null || rowFilterDef.getAccessTypes() == null ? new ArrayList<RangerAccessTypeDef>() : rowFilterDef.getAccessTypes(); |
| List<RangerResourceDef> rowFilterResources = rowFilterDef == null || rowFilterDef.getResources() == null ? new ArrayList<RangerResourceDef>() : rowFilterDef.getResources(); |
| XXDataMaskTypeDefDao dataMaskTypeDao = daoMgr.getXXDataMaskTypeDef(); |
| List<XXDataMaskTypeDef> xxDataMaskTypes = dataMaskTypeDao.findByServiceDefId(serviceDefId); |
| List<XXAccessTypeDef> xxAccessTypeDefs = xxATDDao.findByServiceDefId(serviceDefId); |
| List<XXResourceDef> xxResourceDefs = xxResDefDao.findByServiceDefId(serviceDefId); |
| |
| // create or update dataMasks |
| for(int i = 0; i < dataMasks.size(); i++) { |
| RangerDataMaskTypeDef dataMask = dataMasks.get(i); |
| boolean found = false; |
| for (XXDataMaskTypeDef xxDataMask : xxDataMaskTypes) { |
| if (xxDataMask.getItemId() != null && xxDataMask.getItemId().equals(dataMask.getItemId())) { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("Updating existing dataMask with itemId=" + dataMask.getItemId()); |
| } |
| |
| found = true; |
| xxDataMask = serviceDefService.populateRangerDataMaskDefToXX(dataMask, xxDataMask, createdSvcDef, |
| RangerServiceDefService.OPERATION_UPDATE_CONTEXT); |
| xxDataMask.setOrder(i); |
| xxDataMask = dataMaskTypeDao.update(xxDataMask); |
| dataMask = serviceDefService.populateXXToRangerDataMaskTypeDef(xxDataMask); |
| break; |
| } |
| } |
| |
| if (!found) { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("Creating dataMask with itemId=" + dataMask.getItemId() + ""); |
| } |
| |
| XXDataMaskTypeDef xxDataMask = new XXDataMaskTypeDef(); |
| xxDataMask = serviceDefService.populateRangerDataMaskDefToXX(dataMask, xxDataMask, createdSvcDef, RangerServiceDefService.OPERATION_CREATE_CONTEXT); |
| xxDataMask.setOrder(i); |
| xxDataMask = dataMaskTypeDao.create(xxDataMask); |
| } |
| } |
| |
| // remove dataMasks |
| for (XXDataMaskTypeDef xxDataMask : xxDataMaskTypes) { |
| boolean found = false; |
| for (RangerDataMaskTypeDef dataMask : dataMasks) { |
| if (xxDataMask.getItemId() != null && xxDataMask.getItemId().equals(dataMask.getItemId())) { |
| found = true; |
| break; |
| } |
| } |
| if (!found) { |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("Deleting dataMask with itemId=" + xxDataMask.getItemId()); |
| } |
| |
| dataMaskTypeDao.remove(xxDataMask); |
| } |
| } |
| |
| for(RangerAccessTypeDef accessType : dataMaskAccessTypes) { |
| if(! isAccessTypeInList(accessType.getName(), xxAccessTypeDefs)) { |
| throw restErrorUtil.createRESTException("accessType with name: " |
| + accessType.getName() + " does not exist", MessageEnums.DATA_NOT_FOUND); |
| } |
| } |
| |
| for(RangerAccessTypeDef accessType : rowFilterAccessTypes) { |
| if(! isAccessTypeInList(accessType.getName(), xxAccessTypeDefs)) { |
| throw restErrorUtil.createRESTException("accessType with name: " |
| + accessType.getName() + " does not exists", MessageEnums.DATA_NOT_FOUND); |
| } |
| } |
| |
| for(XXAccessTypeDef xxAccessTypeDef : xxAccessTypeDefs) { |
| String dataMaskOptions = null; |
| String rowFilterOptions = null; |
| |
| for(RangerAccessTypeDef accessTypeDef : dataMaskAccessTypes) { |
| if(StringUtils.equals(accessTypeDef.getName(), xxAccessTypeDef.getName())) { |
| dataMaskOptions = svcDefServiceWithAssignedId.objectToJson(accessTypeDef); |
| break; |
| } |
| } |
| |
| for(RangerAccessTypeDef accessTypeDef : rowFilterAccessTypes) { |
| if(StringUtils.equals(accessTypeDef.getName(), xxAccessTypeDef.getName())) { |
| rowFilterOptions = svcDefServiceWithAssignedId.objectToJson(accessTypeDef); |
| break; |
| } |
| } |
| |
| if(!StringUtils.equals(dataMaskOptions, xxAccessTypeDef.getDataMaskOptions()) || |
| !StringUtils.equals(rowFilterOptions, xxAccessTypeDef.getRowFilterOptions())) { |
| xxAccessTypeDef.setDataMaskOptions(dataMaskOptions); |
| xxAccessTypeDef.setRowFilterOptions(rowFilterOptions); |
| xxATDDao.update(xxAccessTypeDef); |
| } |
| } |
| |
| for(RangerResourceDef resource : dataMaskResources) { |
| if(! isResourceInList(resource.getName(), xxResourceDefs)) { |
| throw restErrorUtil.createRESTException("resource with name: " |
| + resource.getName() + " does not exists", MessageEnums.DATA_NOT_FOUND); |
| } |
| } |
| |
| for(RangerResourceDef resource : rowFilterResources) { |
| if(! isResourceInList(resource.getName(), xxResourceDefs)) { |
| throw restErrorUtil.createRESTException("resource with name: " |
| + resource.getName() + " does not exists", MessageEnums.DATA_NOT_FOUND); |
| } |
| } |
| |
| for(XXResourceDef xxResourceDef : xxResourceDefs) { |
| String dataMaskOptions = null; |
| String rowFilterOptions = null; |
| |
| for(RangerResourceDef resource : dataMaskResources) { |
| if(StringUtils.equals(resource.getName(), xxResourceDef.getName())) { |
| dataMaskOptions = svcDefServiceWithAssignedId.objectToJson(resource); |
| break; |
| } |
| } |
| |
| for(RangerResourceDef resource : rowFilterResources) { |
| if(StringUtils.equals(resource.getName(), xxResourceDef.getName())) { |
| rowFilterOptions = svcDefServiceWithAssignedId.objectToJson(resource); |
| break; |
| } |
| } |
| |
| if(!StringUtils.equals(dataMaskOptions, xxResourceDef.getDataMaskOptions()) || |
| !StringUtils.equals(rowFilterOptions, xxResourceDef.getRowFilterOptions())) { |
| xxResourceDef.setDataMaskOptions(dataMaskOptions); |
| xxResourceDef.setRowFilterOptions(rowFilterOptions); |
| xxResDefDao.update(xxResourceDef); |
| } |
| } |
| } |
| |
| public void deleteServiceDef(Long serviceDefId, Boolean forceDelete) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDefDBStore.deleteServiceDef(" + serviceDefId + ", " + forceDelete + ")"); |
| } |
| |
| UserSessionBase session = ContextUtil.getCurrentUserSession(); |
| if (session == null) { |
| throw restErrorUtil.createRESTException( |
| "UserSession cannot be null, only Admin can update service-def", |
| MessageEnums.OPER_NO_PERMISSION); |
| } |
| |
| if (!session.isKeyAdmin() && !session.isUserAdmin()) { |
| throw restErrorUtil.createRESTException( |
| "User is not allowed to update service-def, only Admin can update service-def", |
| MessageEnums.OPER_NO_PERMISSION); |
| } |
| |
| RangerServiceDef serviceDef = getServiceDef(serviceDefId); |
| if(serviceDef == null) { |
| throw restErrorUtil.createRESTException("No Service Definiton found for Id: " + serviceDefId, |
| MessageEnums.DATA_NOT_FOUND); |
| } |
| |
| List<XXService> serviceList = daoMgr.getXXService().findByServiceDefId(serviceDefId); |
| if (!forceDelete) { |
| if(CollectionUtils.isNotEmpty(serviceList)) { |
| throw restErrorUtil.createRESTException( |
| "Services exists under given service definition, can't delete Service-Def: " |
| + serviceDef.getName(), MessageEnums.OPER_NOT_ALLOWED_FOR_ENTITY); |
| } |
| } |
| |
| XXDataMaskTypeDefDao dataMaskDao = daoMgr.getXXDataMaskTypeDef(); |
| List<XXDataMaskTypeDef> dataMaskDefs = dataMaskDao.findByServiceDefId(serviceDefId); |
| for(XXDataMaskTypeDef dataMaskDef : dataMaskDefs) { |
| dataMaskDao.remove(dataMaskDef); |
| } |
| |
| List<XXAccessTypeDef> accTypeDefs = daoMgr.getXXAccessTypeDef().findByServiceDefId(serviceDefId); |
| for(XXAccessTypeDef accessType : accTypeDefs) { |
| deleteXXAccessTypeDef(accessType); |
| } |
| |
| XXContextEnricherDefDao xContextEnricherDao = daoMgr.getXXContextEnricherDef(); |
| List<XXContextEnricherDef> contextEnrichers = xContextEnricherDao.findByServiceDefId(serviceDefId); |
| for(XXContextEnricherDef context : contextEnrichers) { |
| xContextEnricherDao.remove(context); |
| } |
| |
| XXEnumDefDao enumDefDao = daoMgr.getXXEnumDef(); |
| List<XXEnumDef> enumDefList = enumDefDao.findByServiceDefId(serviceDefId); |
| for (XXEnumDef enumDef : enumDefList) { |
| List<XXEnumElementDef> enumEleDefList = daoMgr.getXXEnumElementDef().findByEnumDefId(enumDef.getId()); |
| for (XXEnumElementDef eleDef : enumEleDefList) { |
| daoMgr.getXXEnumElementDef().remove(eleDef); |
| } |
| enumDefDao.remove(enumDef); |
| } |
| |
| XXPolicyConditionDefDao policyCondDao = daoMgr.getXXPolicyConditionDef(); |
| List<XXPolicyConditionDef> policyCondList = policyCondDao.findByServiceDefId(serviceDefId); |
| |
| for (XXPolicyConditionDef policyCond : policyCondList) { |
| List<XXPolicyRefCondition> xxPolicyRefConditions = daoMgr.getXXPolicyRefCondition().findByConditionDefId(policyCond.getId()); |
| for (XXPolicyRefCondition XXPolicyRefCondition : xxPolicyRefConditions) { |
| daoMgr.getXXPolicyRefCondition().remove(XXPolicyRefCondition); |
| } |
| policyCondDao.remove(policyCond); |
| } |
| |
| List<XXResourceDef> resDefList = daoMgr.getXXResourceDef().findByServiceDefId(serviceDefId); |
| for(XXResourceDef resDef : resDefList) { |
| deleteXXResourceDef(resDef); |
| } |
| |
| XXServiceConfigDefDao configDefDao = daoMgr.getXXServiceConfigDef(); |
| List<XXServiceConfigDef> configDefList = configDefDao.findByServiceDefId(serviceDefId); |
| for(XXServiceConfigDef configDef : configDefList) { |
| configDefDao.remove(configDef); |
| } |
| |
| if(CollectionUtils.isNotEmpty(serviceList)) { |
| for(XXService service : serviceList) { |
| deleteService(service.getId()); |
| } |
| } |
| |
| Long version = serviceDef.getVersion(); |
| if(version == null) { |
| version = Long.valueOf(1); |
| LOG.info("Found Version Value: `null`, so setting value of version to 1, While updating object, version should not be null."); |
| } else { |
| version = Long.valueOf(version.longValue() + 1); |
| } |
| serviceDef.setVersion(version); |
| |
| serviceDefService.delete(serviceDef); |
| LOG.info("ServiceDefinition has been deleted successfully. Service-Def Name: " + serviceDef.getName()); |
| |
| dataHistService.createObjectDataHistory(serviceDef, RangerDataHistService.ACTION_DELETE); |
| |
| postDelete(serviceDef); |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDefDBStore.deleteServiceDef(" + serviceDefId + ", " + forceDelete + ")"); |
| } |
| } |
| |
| public void deleteXXAccessTypeDef(XXAccessTypeDef xAccess) { |
| List<XXAccessTypeDefGrants> atdGrantsList = daoMgr.getXXAccessTypeDefGrants().findByATDId(xAccess.getId()); |
| |
| for (XXAccessTypeDefGrants atdGrant : atdGrantsList) { |
| daoMgr.getXXAccessTypeDefGrants().remove(atdGrant); |
| } |
| |
| List<XXPolicyRefAccessType> policyRefAccessTypeList = daoMgr.getXXPolicyRefAccessType().findByAccessTypeDefId(xAccess.getId()); |
| for (XXPolicyRefAccessType xxPolicyRefAccessType : policyRefAccessTypeList) { |
| daoMgr.getXXPolicyRefAccessType().remove(xxPolicyRefAccessType); |
| } |
| daoMgr.getXXAccessTypeDef().remove(xAccess); |
| } |
| |
| public void deleteXXResourceDef(XXResourceDef xRes) { |
| List<XXResourceDef> xChildObjs = daoMgr.getXXResourceDef().findByParentResId(xRes.getId()); |
| for(XXResourceDef childRes : xChildObjs) { |
| deleteXXResourceDef(childRes); |
| } |
| List<XXPolicyRefResource> xxPolicyRefResources = daoMgr.getXXPolicyRefResource().findByResourceDefID(xRes.getId()); |
| for (XXPolicyRefResource xPolRefRes : xxPolicyRefResources) { |
| daoMgr.getXXPolicyRefResource().remove(xPolRefRes); |
| } |
| daoMgr.getXXResourceDef().remove(xRes); |
| } |
| |
| @Override |
| public RangerServiceDef getServiceDef(Long id) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDefDBStore.getServiceDef(" + id + ")"); |
| } |
| |
| RangerServiceDef ret = serviceDefService.read(id); |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDefDBStore.getServiceDef(" + id + "): " + ret); |
| } |
| |
| return ret; |
| } |
| |
| @Override |
| public RangerServiceDef getServiceDefByName(String name) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDefDBStore.getServiceDefByName(" + name + ")"); |
| } |
| |
| RangerServiceDef ret = null; |
| |
| XXServiceDef xServiceDef = daoMgr.getXXServiceDef().findByName(name); |
| |
| if(xServiceDef != null) { |
| ret = serviceDefService.getPopulatedViewObject(xServiceDef); |
| } |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("== ServiceDefDBStore.getServiceDefByName(" + name + "): " + ret); |
| } |
| |
| return ret; |
| } |
| |
| @Override |
| public List<RangerServiceDef> getServiceDefs(SearchFilter filter) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getServiceDefs(" + filter + ")"); |
| } |
| |
| RangerServiceDefList svcDefList = serviceDefService.searchRangerServiceDefs(filter); |
| |
| predicateUtil.applyFilter(svcDefList.getServiceDefs(), filter); |
| |
| List<RangerServiceDef> ret = svcDefList.getServiceDefs(); |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getServiceDefs(" + filter + "): " + ret); |
| } |
| |
| return ret; |
| } |
| |
| @Override |
| |
| public PList<RangerServiceDef> getPaginatedServiceDefs(SearchFilter filter) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getPaginatedServiceDefs(" + filter + ")"); |
| } |
| |
| RangerServiceDefList svcDefList = serviceDefService.searchRangerServiceDefs(filter); |
| |
| predicateUtil.applyFilter(svcDefList.getServiceDefs(), filter); |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getPaginatedServiceDefs(" + filter + ")"); |
| } |
| |
| return new PList<RangerServiceDef>(svcDefList.getServiceDefs(), svcDefList.getStartIndex(), svcDefList.getPageSize(), svcDefList.getTotalCount(), |
| svcDefList.getResultSize(), svcDefList.getSortType(), svcDefList.getSortBy()); |
| |
| } |
| |
| @Override |
| public RangerService createService(RangerService service) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDefDBStore.createService(" + service + ")"); |
| } |
| |
| if (service == null) { |
| throw restErrorUtil.createRESTException("Service object cannot be null.", |
| MessageEnums.ERROR_CREATING_OBJECT); |
| } |
| |
| boolean createDefaultPolicy = true; |
| Map<String, String> configs = service.getConfigs(); |
| Map<String, String> validConfigs = validateRequiredConfigParams(service, configs); |
| if (validConfigs == null) { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ConfigParams cannot be null, ServiceDefDBStore.createService(" + service + ")"); |
| } |
| throw restErrorUtil.createRESTException("ConfigParams cannot be null.", MessageEnums.ERROR_CREATING_OBJECT); |
| } |
| |
| // While creating, value of version should be 1. |
| service.setVersion(Long.valueOf(1)); |
| service.setTagVersion(Long.valueOf(1)); |
| |
| if (populateExistingBaseFields) { |
| svcServiceWithAssignedId.setPopulateExistingBaseFields(true); |
| daoMgr.getXXService().setIdentityInsert(true); |
| |
| service = svcServiceWithAssignedId.create(service); |
| |
| daoMgr.getXXService().setIdentityInsert(false); |
| daoMgr.getXXService().updateSequence(); |
| svcServiceWithAssignedId.setPopulateExistingBaseFields(false); |
| createDefaultPolicy = false; |
| } else { |
| service = svcService.create(service); |
| } |
| XXService xCreatedService = daoMgr.getXXService().getById(service.getId()); |
| VXUser vXUser = null; |
| |
| XXServiceConfigMapDao xConfMapDao = daoMgr.getXXServiceConfigMap(); |
| for (Entry<String, String> configMap : validConfigs.entrySet()) { |
| String configKey = configMap.getKey(); |
| String configValue = configMap.getValue(); |
| |
| if (StringUtils.equalsIgnoreCase(configKey, "username")) { |
| String userName = stringUtil.getValidUserName(configValue); |
| XXUser xxUser = daoMgr.getXXUser().findByUserName(userName); |
| if (xxUser != null) { |
| vXUser = xUserService.populateViewBean(xxUser); |
| } else { |
| UserSessionBase usb = ContextUtil.getCurrentUserSession(); |
| if (usb != null && !usb.isUserAdmin() && !usb.isSpnegoEnabled()) { |
| throw restErrorUtil.createRESTException("User does not exist with given username: [" |
| + userName + "] please use existing user", MessageEnums.OPER_NO_PERMISSION); |
| } |
| vXUser = xUserMgr.createServiceConfigUser(userName); |
| } |
| } |
| |
| if (StringUtils.equalsIgnoreCase(configKey, CONFIG_KEY_PASSWORD)) { |
| String cryptConfigString = CRYPT_ALGO + "," + ENCRYPT_KEY + "," + SALT + "," + ITERATION_COUNT + "," + configValue; |
| String encryptedPwd = PasswordUtils.encryptPassword(cryptConfigString); |
| encryptedPwd = CRYPT_ALGO + "," + ENCRYPT_KEY + "," + SALT + "," + ITERATION_COUNT + "," + encryptedPwd; |
| String decryptedPwd = PasswordUtils.decryptPassword(encryptedPwd); |
| if (StringUtils.equals(decryptedPwd, configValue)) { |
| configValue = encryptedPwd; |
| } |
| } |
| |
| XXServiceConfigMap xConfMap = new XXServiceConfigMap(); |
| xConfMap = (XXServiceConfigMap) rangerAuditFields.populateAuditFields(xConfMap, xCreatedService); |
| xConfMap.setServiceId(xCreatedService.getId()); |
| xConfMap.setConfigkey(configKey); |
| xConfMap.setConfigvalue(configValue); |
| xConfMap = xConfMapDao.create(xConfMap); |
| } |
| RangerService createdService = svcService.getPopulatedViewObject(xCreatedService); |
| |
| if (createdService == null) { |
| throw restErrorUtil.createRESTException("Could not create service - Internal error ", MessageEnums.ERROR_CREATING_OBJECT); |
| } |
| |
| dataHistService.createObjectDataHistory(createdService, RangerDataHistService.ACTION_CREATE); |
| |
| List<XXTrxLog> trxLogList = svcService.getTransactionLog(createdService, |
| RangerServiceService.OPERATION_CREATE_CONTEXT); |
| bizUtil.createTrxLog(trxLogList); |
| |
| if (createDefaultPolicy) { |
| createDefaultPolicies(xCreatedService, vXUser); |
| } |
| |
| return createdService; |
| |
| } |
| |
| @Override |
| public RangerService updateService(RangerService service, Map<String, Object> options) throws Exception { |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.updateService()"); |
| } |
| |
| XXService existing = daoMgr.getXXService().getById(service.getId()); |
| |
| if(existing == null) { |
| throw restErrorUtil.createRESTException( |
| "no service exists with ID=" + service.getId(), |
| MessageEnums.DATA_NOT_FOUND); |
| } |
| |
| String existingName = existing.getName(); |
| |
| boolean renamed = !StringUtils.equalsIgnoreCase(service.getName(), existingName); |
| |
| if(renamed) { |
| XXService newNameService = daoMgr.getXXService().findByName(service.getName()); |
| |
| if (newNameService != null) { |
| throw restErrorUtil.createRESTException("another service already exists with name '" |
| + service.getName() + "'. ID=" + newNameService.getId(), MessageEnums.DATA_NOT_UPDATABLE); |
| } |
| |
| long countOfTaggedResources = daoMgr.getXXServiceResource().countTaggedResourcesInServiceId(existing.getId()); |
| |
| Boolean isForceRename = options != null && options.get(ServiceStore.OPTION_FORCE_RENAME) != null ? (Boolean) options.get(ServiceStore.OPTION_FORCE_RENAME) : Boolean.FALSE; |
| |
| if (countOfTaggedResources != 0L) { |
| if (isForceRename) { |
| LOG.warn("Forcing the renaming of service from " + existingName + " to " + service.getName() + " although it is associated with " + countOfTaggedResources |
| + " service-resources!"); |
| } else { |
| throw restErrorUtil.createRESTException("Service " + existingName + " cannot be renamed, as it has associated service-resources", MessageEnums.DATA_NOT_UPDATABLE); |
| } |
| } |
| } |
| |
| Map<String, String> configs = service.getConfigs(); |
| Map<String, String> validConfigs = validateRequiredConfigParams(service, configs); |
| if (validConfigs == null) { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ConfigParams cannot be null, ServiceDefDBStore.createService(" + service + ")"); |
| } |
| throw restErrorUtil.createRESTException("ConfigParams cannot be null.", MessageEnums.ERROR_CREATING_OBJECT); |
| } |
| |
| boolean hasTagServiceValueChanged = false; |
| 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); |
| |
| if (tmp == null || !tmp.getType().equals(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME)) { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("ServiceDBStore.updateService() - " + newTagServiceName + " does not refer to a valid tag service.(" + service + ")"); |
| } |
| throw restErrorUtil.createRESTException("Invalid tag service name " + newTagServiceName, MessageEnums.ERROR_CREATING_OBJECT); |
| |
| } else { |
| newTagServiceId = tmp.getId(); |
| } |
| } |
| |
| if (existingTagServiceId == null) { |
| if (newTagServiceId != null) { |
| hasTagServiceValueChanged = true; |
| } |
| } else if (!existingTagServiceId.equals(newTagServiceId)) { |
| hasTagServiceValueChanged = true; |
| } |
| |
| boolean hasIsEnabledChanged = !existing.getIsenabled().equals(service.getIsEnabled()); |
| |
| List<XXTrxLog> trxLogList = svcService.getTransactionLog(service, existing, RangerServiceService.OPERATION_UPDATE_CONTEXT); |
| |
| 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 = svcService.update(service); |
| |
| if (hasTagServiceValueChanged || hasIsEnabledChanged) { |
| updatePolicyVersion(service, false); |
| } |
| } |
| |
| XXService xUpdService = daoMgr.getXXService().getById(service.getId()); |
| |
| String oldPassword = null; |
| |
| List<XXServiceConfigMap> dbConfigMaps = daoMgr.getXXServiceConfigMap().findByServiceId(service.getId()); |
| for(XXServiceConfigMap dbConfigMap : dbConfigMaps) { |
| if(StringUtils.equalsIgnoreCase(dbConfigMap.getConfigkey(), CONFIG_KEY_PASSWORD)) { |
| oldPassword = dbConfigMap.getConfigvalue(); |
| } |
| daoMgr.getXXServiceConfigMap().remove(dbConfigMap); |
| } |
| |
| VXUser vXUser = null; |
| XXServiceConfigMapDao xConfMapDao = daoMgr.getXXServiceConfigMap(); |
| for (Entry<String, String> configMap : validConfigs.entrySet()) { |
| String configKey = configMap.getKey(); |
| String configValue = configMap.getValue(); |
| |
| if(StringUtils.equalsIgnoreCase(configKey, "username")) { |
| String userName = stringUtil.getValidUserName(configValue); |
| XXUser xxUser = daoMgr.getXXUser().findByUserName(userName); |
| if (xxUser != null) { |
| vXUser = xUserService.populateViewBean(xxUser); |
| } else { |
| UserSessionBase usb = ContextUtil.getCurrentUserSession(); |
| if (usb != null && !usb.isUserAdmin()) { |
| throw restErrorUtil.createRESTException("User does not exist with given username: [" |
| + userName + "] please use existing user", MessageEnums.OPER_NO_PERMISSION); |
| } |
| vXUser = xUserMgr.createServiceConfigUser(userName); |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("Service config user created:[" + vXUser + "]"); |
| } |
| } |
| } |
| |
| if (StringUtils.equalsIgnoreCase(configKey, CONFIG_KEY_PASSWORD)) { |
| if (StringUtils.equalsIgnoreCase(configValue, HIDDEN_PASSWORD_STR)) { |
| if (oldPassword != null && oldPassword.contains(",")) { |
| String[] crypt_algo_array = oldPassword.split(","); |
| String OLD_CRYPT_ALGO = crypt_algo_array[0]; |
| String encryptKey = crypt_algo_array[1]; |
| String salt = crypt_algo_array[2]; |
| int iterationCount = Integer.parseInt(crypt_algo_array[3]); |
| |
| if (!OLD_CRYPT_ALGO.equalsIgnoreCase(CRYPT_ALGO)) { |
| String decryptedPwd = PasswordUtils.decryptPassword(oldPassword); |
| String paddingString = CRYPT_ALGO + "," + encryptKey + "," + salt + "," + iterationCount; |
| String encryptedPwd = PasswordUtils.encryptPassword(paddingString + "," + decryptedPwd); |
| String newDecryptedPwd = PasswordUtils.decryptPassword(paddingString + "," + encryptedPwd); |
| if (StringUtils.equals(newDecryptedPwd, decryptedPwd)) { |
| configValue = paddingString + "," + encryptedPwd; |
| } |
| } else { |
| configValue = oldPassword; |
| } |
| } else { |
| configValue = oldPassword; |
| } |
| } else { |
| String paddingString = CRYPT_ALGO + "," + ENCRYPT_KEY + "," + SALT + "," + ITERATION_COUNT; |
| String encryptedPwd = PasswordUtils.encryptPassword(paddingString + "," +configValue); |
| String decryptedPwd = PasswordUtils.decryptPassword(paddingString + "," +encryptedPwd); |
| |
| if (StringUtils.equals(decryptedPwd, configValue)) { |
| configValue = paddingString + "," + encryptedPwd; |
| } |
| } |
| } |
| |
| XXServiceConfigMap xConfMap = new XXServiceConfigMap(); |
| xConfMap = (XXServiceConfigMap) rangerAuditFields.populateAuditFields(xConfMap, xUpdService); |
| xConfMap.setServiceId(service.getId()); |
| xConfMap.setConfigkey(configKey); |
| xConfMap.setConfigvalue(configValue); |
| xConfMap = xConfMapDao.create(xConfMap); |
| } |
| RangerService updService = svcService.getPopulatedViewObject(xUpdService); |
| dataHistService.createObjectDataHistory(updService, RangerDataHistService.ACTION_UPDATE); |
| bizUtil.createTrxLog(trxLogList); |
| |
| return updService; |
| } |
| |
| @Override |
| public void deleteService(Long id) throws Exception { |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.deleteService(" + id + ")"); |
| } |
| |
| RangerService service = getService(id); |
| |
| if(service == null) { |
| throw new Exception("no service exists with ID=" + id); |
| } |
| |
| List<XXPolicy> policies = daoMgr.getXXPolicy().findByServiceId(service.getId()); |
| //RangerPolicy rangerPolicy =null; |
| for(XXPolicy policy : policies) { |
| LOG.info("Deleting Policy, policyName: " + policy.getName()); |
| //rangerPolicy = getPolicy(policy.getId()); |
| deletePolicy(policy.getId()); |
| } |
| |
| XXServiceConfigMapDao configDao = daoMgr.getXXServiceConfigMap(); |
| List<XXServiceConfigMap> configs = configDao.findByServiceId(service.getId()); |
| for (XXServiceConfigMap configMap : configs) { |
| configDao.remove(configMap); |
| } |
| |
| Long version = service.getVersion(); |
| if(version == null) { |
| version = Long.valueOf(1); |
| LOG.info("Found Version Value: `null`, so setting value of version to 1, While updating object, version should not be null."); |
| } else { |
| version = Long.valueOf(version.longValue() + 1); |
| } |
| service.setVersion(version); |
| |
| svcService.delete(service); |
| |
| dataHistService.createObjectDataHistory(service, RangerDataHistService.ACTION_DELETE); |
| |
| List<XXTrxLog> trxLogList = svcService.getTransactionLog(service, RangerServiceService.OPERATION_DELETE_CONTEXT); |
| bizUtil.createTrxLog(trxLogList); |
| } |
| |
| @Override |
| public List<RangerPolicy> getPoliciesByResourceSignature(String serviceName, String policySignature, Boolean isPolicyEnabled) throws Exception { |
| |
| List<XXPolicy> xxPolicies = daoMgr.getXXPolicy().findByResourceSignatureByPolicyStatus(serviceName, policySignature, isPolicyEnabled); |
| List<RangerPolicy> policies = new ArrayList<RangerPolicy>(xxPolicies.size()); |
| for (XXPolicy xxPolicy : xxPolicies) { |
| RangerPolicy policy = policyService.getPopulatedViewObject(xxPolicy); |
| policies.add(policy); |
| } |
| |
| return policies; |
| } |
| |
| @Override |
| public RangerService getService(Long id) throws Exception { |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getService()"); |
| } |
| |
| UserSessionBase session = ContextUtil.getCurrentUserSession(); |
| if (session == null) { |
| throw restErrorUtil.createRESTException("UserSession cannot be null.", |
| MessageEnums.OPER_NOT_ALLOWED_FOR_STATE); |
| } |
| |
| XXService xService = daoMgr.getXXService().getById(id); |
| |
| // TODO: As of now we are allowing SYS_ADMIN to read all the |
| // services including KMS |
| |
| if (!bizUtil.hasAccess(xService, null)) { |
| throw restErrorUtil.createRESTException("Logged in user is not allowed to read service, id: " + id, |
| MessageEnums.OPER_NO_PERMISSION); |
| } |
| |
| return svcService.getPopulatedViewObject(xService); |
| } |
| |
| @Override |
| public RangerService getServiceByName(String name) throws Exception { |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getServiceByName()"); |
| } |
| XXService xService = daoMgr.getXXService().findByName(name); |
| |
| // TODO: As of now we are allowing SYS_ADMIN to read all the |
| // services including KMS |
| |
| if (ContextUtil.getCurrentUserSession() != null) { |
| if (xService == null) { |
| return null; |
| } |
| if (!bizUtil.hasAccess(xService, null)) { |
| throw restErrorUtil.createRESTException("Logged in user is not allowed to read service, name: " + name, |
| MessageEnums.OPER_NO_PERMISSION); |
| } |
| } |
| |
| return xService == null ? null : svcService.getPopulatedViewObject(xService); |
| } |
| |
| public RangerService getServiceByNameForDP(String name) throws Exception { |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getServiceByName()"); |
| } |
| XXService xService = daoMgr.getXXService().findByName(name); |
| if (ContextUtil.getCurrentUserSession() != null) { |
| if (xService == null) { |
| return null; |
| } |
| } |
| return xService == null ? null : svcService.getPopulatedViewObject(xService); |
| } |
| |
| @Override |
| public List<RangerService> getServices(SearchFilter filter) throws Exception { |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getServices()"); |
| } |
| |
| RangerServiceList serviceList = svcService.searchRangerServices(filter); |
| predicateUtil.applyFilter(serviceList.getServices(), filter); |
| List<RangerService> ret = serviceList.getServices(); |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.getServices()"); |
| } |
| |
| return ret; |
| } |
| |
| public PList<RangerService> getPaginatedServices(SearchFilter filter) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getPaginatedServices()"); |
| } |
| |
| RangerServiceList serviceList = svcService.searchRangerServices(filter); |
| if (StringUtils.isEmpty(filter.getParam("serviceNamePartial"))){ |
| |
| predicateUtil.applyFilter(serviceList.getServices(), filter); |
| |
| } |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.getPaginatedServices()"); |
| } |
| |
| return new PList<RangerService>(serviceList.getServices(), serviceList.getStartIndex(), serviceList.getPageSize(), serviceList.getTotalCount(), |
| serviceList.getResultSize(), serviceList.getSortType(), serviceList.getSortBy()); |
| |
| } |
| |
| @Override |
| public RangerPolicy createPolicy(RangerPolicy policy) throws Exception { |
| |
| RangerService service = getServiceByName(policy.getService()); |
| |
| if(service == null) { |
| throw new Exception("service does not exist - name=" + policy.getService()); |
| } |
| |
| XXServiceDef xServiceDef = daoMgr.getXXServiceDef().findByName(service.getType()); |
| |
| if(xServiceDef == null) { |
| throw new Exception("service-def does not exist - name=" + service.getType()); |
| } |
| |
| XXPolicy existing = daoMgr.getXXPolicy().findByNameAndServiceId(policy.getName(), service.getId()); |
| |
| if(existing != null) { |
| throw new Exception("policy already exists: ServiceName=" + policy.getService() + "; PolicyName=" + policy.getName() + ". ID=" + existing.getId()); |
| } |
| |
| policy.setVersion(Long.valueOf(1)); |
| updatePolicySignature(policy); |
| |
| if(populateExistingBaseFields) { |
| assignedIdPolicyService.setPopulateExistingBaseFields(true); |
| daoMgr.getXXPolicy().setIdentityInsert(true); |
| |
| policy = assignedIdPolicyService.create(policy); |
| |
| daoMgr.getXXPolicy().setIdentityInsert(false); |
| daoMgr.getXXPolicy().updateSequence(); |
| assignedIdPolicyService.setPopulateExistingBaseFields(false); |
| } else { |
| policy = policyService.create(policy); |
| } |
| |
| XXPolicy xCreatedPolicy = daoMgr.getXXPolicy().getById(policy.getId()); |
| policyRefUpdater.createNewPolMappingForRefTable(policy, xCreatedPolicy, xServiceDef); |
| |
| handlePolicyUpdate(service, true); |
| RangerPolicy createdPolicy = policyService.getPopulatedViewObject(xCreatedPolicy); |
| dataHistService.createObjectDataHistory(createdPolicy, RangerDataHistService.ACTION_CREATE); |
| |
| List<XXTrxLog> trxLogList = policyService.getTransactionLog(createdPolicy, RangerPolicyService.OPERATION_CREATE_CONTEXT); |
| bizUtil.createTrxLog(trxLogList); |
| |
| return createdPolicy; |
| } |
| |
| @Override |
| public RangerPolicy updatePolicy(RangerPolicy policy) throws Exception { |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.updatePolicy(" + policy + ")"); |
| } |
| |
| XXPolicy xxExisting = daoMgr.getXXPolicy().getById(policy.getId()); |
| RangerPolicy existing = policyService.getPopulatedViewObject(xxExisting); |
| |
| if(existing == null) { |
| throw new Exception("no policy exists with ID=" + policy.getId()); |
| } |
| |
| RangerService service = getServiceByName(policy.getService()); |
| |
| if(service == null) { |
| throw new Exception("service does not exist - name=" + policy.getService()); |
| } |
| |
| XXServiceDef xServiceDef = daoMgr.getXXServiceDef().findByName(service.getType()); |
| |
| if(xServiceDef == null) { |
| throw new Exception("service-def does not exist - name=" + service.getType()); |
| } |
| |
| if(! StringUtils.equalsIgnoreCase(existing.getService(), policy.getService())) { |
| throw new Exception("policy id=" + policy.getId() + " already exists in service " + existing.getService() + ". It can not be moved to service " + policy.getService()); |
| } |
| boolean renamed = !StringUtils.equalsIgnoreCase(policy.getName(), existing.getName()); |
| |
| if(renamed) { |
| XXPolicy newNamePolicy = daoMgr.getXXPolicy().findByNameAndServiceId(policy.getName(), service.getId()); |
| |
| if(newNamePolicy != null) { |
| throw new Exception("another policy already exists with name '" + policy.getName() + "'. ID=" + newNamePolicy.getId()); |
| } |
| } |
| |
| policy.setCreateTime(xxExisting.getCreateTime()); |
| policy.setGuid(xxExisting.getGuid()); |
| policy.setVersion(xxExisting.getVersion()); |
| |
| List<XXTrxLog> trxLogList = policyService.getTransactionLog(policy, xxExisting, existing, RangerPolicyService.OPERATION_UPDATE_CONTEXT); |
| |
| updatePolicySignature(policy); |
| |
| boolean isTagVersionUpdateNeeded = false; |
| if (service.getType().equals(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME)) { |
| isTagVersionUpdateNeeded = existing.getIsEnabled() ? !policy.getIsEnabled() : policy.getIsEnabled(); |
| isTagVersionUpdateNeeded = isTagVersionUpdateNeeded || !StringUtils.equals(existing.getResourceSignature(), policy.getResourceSignature()); |
| } |
| |
| policy = policyService.update(policy); |
| XXPolicy newUpdPolicy = daoMgr.getXXPolicy().getById(policy.getId()); |
| |
| policyRefUpdater.cleanupRefTables(policy); |
| policyRefUpdater.createNewPolMappingForRefTable(policy, newUpdPolicy, xServiceDef); |
| |
| handlePolicyUpdate(service, isTagVersionUpdateNeeded); |
| RangerPolicy updPolicy = policyService.getPopulatedViewObject(newUpdPolicy); |
| dataHistService.createObjectDataHistory(updPolicy, RangerDataHistService.ACTION_UPDATE); |
| |
| bizUtil.createTrxLog(trxLogList); |
| |
| return updPolicy; |
| } |
| |
| @Override |
| public void deletePolicy(Long policyId) throws Exception { |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.deletePolicy(" + policyId + ")"); |
| } |
| |
| RangerPolicy policy = getPolicy(policyId); |
| |
| if(policy == null) { |
| throw new Exception("no policy exists with ID=" + policyId); |
| } |
| |
| String policyName = policy.getName(); |
| RangerService service = getServiceByName(policy.getService()); |
| |
| if(service == null) { |
| throw new Exception("service does not exist - name='" + policy.getService()); |
| } |
| |
| Long version = policy.getVersion(); |
| if(version == null) { |
| version = Long.valueOf(1); |
| LOG.info("Found Version Value: `null`, so setting value of version to 1, While updating object, version should not be null."); |
| } else { |
| version = Long.valueOf(version.longValue() + 1); |
| } |
| |
| policy.setVersion(version); |
| |
| List<XXTrxLog> trxLogList = policyService.getTransactionLog(policy, RangerPolicyService.OPERATION_DELETE_CONTEXT); |
| policyRefUpdater.cleanupRefTables(policy); |
| policyService.delete(policy); |
| handlePolicyUpdate(service, true); |
| |
| dataHistService.createObjectDataHistory(policy, RangerDataHistService.ACTION_DELETE); |
| |
| bizUtil.createTrxLog(trxLogList); |
| |
| LOG.info("Policy Deleted Successfully. PolicyName : " + policyName); |
| } |
| /* |
| public void deletePolicy(RangerPolicy policy) throws Exception { |
| if(policy == null) { |
| return; |
| } |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.deletePolicy(" + policy.getId() + ")"); |
| } |
| RangerService service = getServiceByName(policy.getService()); |
| if(service == null) { |
| throw new Exception("service does not exist - name='" + policy.getService()); |
| } |
| Long version = policy.getVersion(); |
| if(version == null) { |
| version = Long.valueOf(1); |
| LOG.info("Found Version Value: `null`, so setting value of version to 1, While updating object, version should not be null."); |
| } else { |
| version = Long.valueOf(version.longValue() + 1); |
| } |
| policy.setVersion(version); |
| List<XXTrxLog> trxLogList = policyService.getTransactionLog(policy, RangerPolicyService.OPERATION_DELETE_CONTEXT); |
| daoMgr.getXXPolicy().deletePolicyIDReference("id",policy.getId()); |
| handlePolicyUpdate(service, true); |
| dataHistService.createObjectDataHistory(policy, RangerDataHistService.ACTION_DELETE); |
| bizUtil.createTrxLog(trxLogList); |
| }*/ |
| |
| @Override |
| public RangerPolicy getPolicy(Long id) throws Exception { |
| return policyService.read(id); |
| } |
| |
| @Override |
| public List<RangerPolicy> getPolicies(SearchFilter filter) throws Exception { |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getPolicies()"); |
| } |
| RangerPolicyList policyList = searchRangerPolicies(filter); |
| List<RangerPolicy> ret = policyList.getPolicies(); |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.getPolicies()"); |
| } |
| return ret; |
| } |
| |
| @Override |
| public Long getPolicyId(final Long serviceId, final String policyName) { |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getPolicyId()"); |
| } |
| Long ret = null; |
| XXPolicy xxPolicy = daoMgr.getXXPolicy().findByNameAndServiceId(policyName, serviceId); |
| if (xxPolicy != null) { |
| ret = xxPolicy.getId(); |
| } |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.getPolicyId()"); |
| } |
| return ret; |
| } |
| |
| public void getPoliciesInExcel(List<RangerPolicy> policies, HttpServletResponse response) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getPoliciesInExcel()"); |
| } |
| String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); |
| String excelFileName = "Ranger_Policies_"+timeStamp+".xls"; |
| writeExcel(policies, excelFileName, response); |
| } |
| |
| public void getPoliciesInCSV(List<RangerPolicy> policies, |
| HttpServletResponse response) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getPoliciesInCSV()"); |
| } |
| ServletOutputStream out = null; |
| String CSVFileName = null; |
| try { |
| String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); |
| CSVFileName = "Ranger_Policies_" + timeStamp + ".csv"; |
| out = response.getOutputStream(); |
| StringBuilder sb = writeCSV(policies, CSVFileName, response); |
| IOUtils.write(sb.toString(), out, "UTF-8"); |
| } catch (Exception e) { |
| LOG.error("Error while generating report file " + CSVFileName, e); |
| e.printStackTrace(); |
| } finally { |
| try { |
| if (out != null) { |
| out.flush(); |
| out.close(); |
| } |
| } catch (Exception ex) { |
| } |
| } |
| } |
| |
| public void getPoliciesInJson(List<RangerPolicy> policies, |
| HttpServletResponse response) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getPoliciesInJson()"); |
| } |
| String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); |
| String jsonFileName = "Ranger_Policies_" + timeStamp + ".json"; |
| writeJson(policies, jsonFileName, response); |
| } |
| |
| public PList<RangerPolicy> getPaginatedPolicies(SearchFilter filter) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getPaginatedPolicies(+ " + filter + ")"); |
| } |
| |
| RangerPolicyList policyList = searchRangerPolicies(filter); |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("before filter: count=" + policyList.getListSize()); |
| } |
| predicateUtil.applyFilter(policyList.getPolicies(), filter); |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("after filter: count=" + policyList.getListSize()); |
| } |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.getPaginatedPolicies(" + filter + "): count=" + policyList.getListSize()); |
| } |
| |
| |
| return new PList<RangerPolicy>(policyList.getPolicies(), policyList.getStartIndex(), policyList.getPageSize(), policyList.getTotalCount(), |
| policyList.getResultSize(), policyList.getSortType(), policyList.getSortBy()); |
| |
| } |
| |
| @Override |
| public List<RangerPolicy> getServicePolicies(Long serviceId, SearchFilter filter) throws Exception { |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getServicePolicies(" + serviceId + ")"); |
| } |
| |
| XXService service = daoMgr.getXXService().getById(serviceId); |
| |
| if (service == null) { |
| throw new Exception("service does not exist - id='" + serviceId); |
| } |
| |
| List<RangerPolicy> ret = getServicePolicies(service, filter); |
| |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.getServicePolicies(" + serviceId + ") : policy-count=" + (ret == null ? 0 : ret.size())); |
| } |
| return ret; |
| |
| } |
| |
| public PList<RangerPolicy> getPaginatedServicePolicies(Long serviceId, SearchFilter filter) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getPaginatedServicePolicies(" + serviceId + ")"); |
| } |
| |
| XXService service = daoMgr.getXXService().getById(serviceId); |
| |
| if (service == null) { |
| throw new Exception("service does not exist - id='" + serviceId); |
| } |
| |
| PList<RangerPolicy> ret = getPaginatedServicePolicies(service.getName(), filter); |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.getPaginatedServicePolicies(" + serviceId + ")"); |
| } |
| return ret; |
| } |
| |
| @Override |
| public List<RangerPolicy> getServicePolicies(String serviceName, SearchFilter filter) throws Exception { |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getServicePolicies(" + serviceName + ")"); |
| } |
| |
| List<RangerPolicy> ret = null; |
| |
| XXService service = daoMgr.getXXService().findByName(serviceName); |
| |
| if (service == null) { |
| throw new Exception("service does not exist - name='" + serviceName); |
| } |
| |
| ret = getServicePolicies(service, filter); |
| |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.getServicePolicies(" + serviceName + "): count=" + ((ret == null) ? 0 : ret.size())); |
| } |
| |
| return ret; |
| } |
| |
| private List<RangerPolicy> getServicePolicies(XXService service, SearchFilter filter) throws Exception { |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getServicePolicies()"); |
| } |
| |
| if (service == null) { |
| throw new Exception("service does not exist"); |
| } |
| |
| List<RangerPolicy> ret = null; |
| |
| ServicePolicies servicePolicies = RangerServicePoliciesCache.getInstance().getServicePolicies(service.getName(), service.getId(), this); |
| List<RangerPolicy> policies = servicePolicies != null ? servicePolicies.getPolicies() : null; |
| |
| if(policies != null && filter != null) { |
| Map<String, String> filterResources = filter.getParamsWithPrefix(SearchFilter.RESOURCE_PREFIX, true); |
| String resourceMatchScope = filter.getParam(SearchFilter.RESOURCE_MATCH_SCOPE); |
| |
| boolean useLegacyResourceSearch = true; |
| |
| if (MapUtils.isNotEmpty(filterResources) && resourceMatchScope != null) { |
| useLegacyResourceSearch = false; |
| for (Map.Entry<String, String> entry : filterResources.entrySet()) { |
| filter.removeParam(SearchFilter.RESOURCE_PREFIX + entry.getKey()); |
| } |
| } |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("Using" + (useLegacyResourceSearch ? " old " : " new ") + "way of filtering service-policies"); |
| } |
| |
| ret = new ArrayList<RangerPolicy>(policies); |
| predicateUtil.applyFilter(ret, filter); |
| |
| if (!useLegacyResourceSearch && CollectionUtils.isNotEmpty(ret)) { |
| RangerPolicyResourceMatcher.MatchScope scope; |
| |
| if (StringUtils.equalsIgnoreCase(resourceMatchScope, "self")) { |
| scope = RangerPolicyResourceMatcher.MatchScope.SELF; |
| } else if (StringUtils.equalsIgnoreCase(resourceMatchScope, "ancestor")) { |
| scope = RangerPolicyResourceMatcher.MatchScope.ANCESTOR; |
| } else if (StringUtils.equalsIgnoreCase(resourceMatchScope, "self_or_ancestor")) { |
| scope = RangerPolicyResourceMatcher.MatchScope.SELF_OR_ANCESTOR; |
| } else { |
| // DESCENDANT match will never happen |
| scope = RangerPolicyResourceMatcher.MatchScope.SELF_OR_ANCESTOR; |
| } |
| |
| RangerServiceDef serviceDef = servicePolicies.getServiceDef(); |
| |
| switch (scope) { |
| case SELF : { |
| serviceDef = RangerServiceDefHelper.getServiceDefForPolicyFiltering(serviceDef); |
| break; |
| } |
| case ANCESTOR : { |
| Map<String, String> updatedFilterResources = RangerServiceDefHelper.getFilterResourcesForAncestorPolicyFiltering(serviceDef, filterResources); |
| if (MapUtils.isNotEmpty(updatedFilterResources)) { |
| for (Map.Entry<String, String> entry : updatedFilterResources.entrySet()) { |
| filterResources.put(entry.getKey(), entry.getValue()); |
| } |
| scope = RangerPolicyResourceMatcher.MatchScope.SELF_OR_ANCESTOR; |
| } |
| break; |
| } |
| default: |
| break; |
| } |
| |
| ret = applyResourceFilter(serviceDef, ret, filterResources, filter, scope); |
| } |
| } else { |
| ret = policies; |
| } |
| |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.getServicePolicies(): count=" + ((ret == null) ? 0 : ret.size())); |
| } |
| |
| return ret; |
| } |
| |
| List<RangerPolicy> applyResourceFilter(RangerServiceDef serviceDef, List<RangerPolicy> policies, Map<String, String> filterResources, SearchFilter filter, RangerPolicyResourceMatcher.MatchScope scope) { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.applyResourceFilter(policies-size=" + policies.size() + ", filterResources=" + filterResources + ", " + scope + ")"); |
| } |
| |
| List<RangerPolicy> ret = new ArrayList<RangerPolicy>(); |
| |
| List<RangerPolicyResourceMatcher> matchers = getMatchers(serviceDef, filterResources, filter); |
| |
| if (CollectionUtils.isNotEmpty(matchers)) { |
| |
| for (RangerPolicy policy : policies) { |
| |
| for (RangerPolicyResourceMatcher matcher : matchers) { |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("Trying to match for policy:[" + policy + "] using RangerDefaultPolicyResourceMatcher:[" + matcher + "]"); |
| } |
| |
| if (matcher.isMatch(policy, scope, null)) { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("matched policy:[" + policy + "]"); |
| } |
| ret.add(policy); |
| break; |
| } |
| } |
| } |
| } |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.applyResourceFilter(policies-size=" + ret.size() + ", filterResources=" + filterResources + ", " + scope + ")"); |
| } |
| |
| return ret; |
| } |
| |
| List<RangerPolicyResourceMatcher> getMatchers(RangerServiceDef serviceDef, Map<String, String> filterResources, SearchFilter filter) { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getMatchers(filterResources=" + filterResources + ")"); |
| } |
| |
| List<RangerPolicyResourceMatcher> ret = new ArrayList<RangerPolicyResourceMatcher>(); |
| |
| RangerServiceDefHelper serviceDefHelper = new RangerServiceDefHelper(serviceDef); |
| |
| String policyTypeStr = filter.getParam(SearchFilter.POLICY_TYPE); |
| |
| List<Integer> policyTypes = new ArrayList<>(); |
| |
| if (StringUtils.isNotBlank(policyTypeStr)) { |
| policyTypes.add(Integer.parseInt(policyTypeStr)); |
| } else { |
| policyTypes.add(RangerPolicy.POLICY_TYPE_ACCESS); |
| policyTypes.add(RangerPolicy.POLICY_TYPE_DATAMASK); |
| policyTypes.add(RangerPolicy.POLICY_TYPE_ROWFILTER); |
| } |
| |
| for (Integer policyType : policyTypes) { |
| Set<List<RangerResourceDef>> validResourceHierarchies = serviceDefHelper.getResourceHierarchies(policyType, filterResources.keySet()); |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("Found " + validResourceHierarchies.size() + " valid resource hierarchies for key-set " + filterResources.keySet()); |
| } |
| |
| List<List<RangerResourceDef>> resourceHierarchies = new ArrayList<List<RangerResourceDef>>(validResourceHierarchies); |
| |
| for (List<RangerResourceDef> validResourceHierarchy : resourceHierarchies) { |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("validResourceHierarchy:[" + validResourceHierarchy + "]"); |
| } |
| |
| Map<String, RangerPolicyResource> policyResources = new HashMap<String, RangerPolicyResource>(); |
| |
| for (RangerResourceDef resourceDef : validResourceHierarchy) { |
| policyResources.put(resourceDef.getName(), new RangerPolicyResource(filterResources.get(resourceDef.getName()), false, resourceDef.getRecursiveSupported())); |
| } |
| |
| RangerDefaultPolicyResourceMatcher matcher = new RangerDefaultPolicyResourceMatcher(); |
| matcher.setServiceDef(serviceDef); |
| matcher.setPolicyResources(policyResources, policyType); |
| matcher.init(); |
| |
| ret.add(matcher); |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("Added matcher:[" + matcher + "]"); |
| } |
| } |
| } |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.getMatchers(filterResources=" + filterResources + ", " + ", count=" + ret.size() + ")"); |
| } |
| |
| return ret; |
| } |
| |
| private List<RangerPolicy> getServicePoliciesFromDb(XXService service) throws Exception { |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getServicePoliciesFromDb(" + service.getName() + ")"); |
| } |
| |
| RangerPolicyRetriever policyRetriever = new RangerPolicyRetriever(daoMgr, txManager); |
| |
| List<RangerPolicy> ret = policyRetriever.getServicePolicies(service); |
| |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.getServicePoliciesFromDb(" + service.getName() + "): count=" + ((ret == null) ? 0 : ret.size())); |
| } |
| |
| return ret; |
| } |
| |
| public PList<RangerPolicy> getPaginatedServicePolicies(String serviceName, SearchFilter filter) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getPaginatedServicePolicies(" + serviceName + ")"); |
| } |
| |
| if (filter == null) { |
| filter = new SearchFilter(); |
| } |
| |
| filter.setParam(SearchFilter.SERVICE_NAME, serviceName); |
| |
| PList<RangerPolicy> ret = getPaginatedPolicies(filter); |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.getPaginatedServicePolicies(" + serviceName + "): count=" |
| + ((ret == null) ? 0 : ret.getListSize())); |
| } |
| |
| return ret; |
| } |
| |
| @Override |
| public ServicePolicies getServicePoliciesIfUpdated(String serviceName, Long lastKnownVersion) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getServicePoliciesIfUpdated(" + serviceName + ", " + lastKnownVersion + ")"); |
| } |
| |
| ServicePolicies ret = null; |
| |
| XXService serviceDbObj = daoMgr.getXXService().findByName(serviceName); |
| |
| if (serviceDbObj == null) { |
| throw new Exception("service does not exist. name=" + serviceName); |
| } |
| |
| XXServiceVersionInfo serviceVersionInfoDbObj = daoMgr.getXXServiceVersionInfo().findByServiceName(serviceName); |
| |
| if (serviceVersionInfoDbObj == null) { |
| LOG.warn("serviceVersionInfo does not exist. name=" + serviceName); |
| } |
| |
| if (lastKnownVersion == null || serviceVersionInfoDbObj == null || serviceVersionInfoDbObj.getPolicyVersion() == null || !lastKnownVersion.equals(serviceVersionInfoDbObj.getPolicyVersion())) { |
| ret = RangerServicePoliciesCache.getInstance().getServicePolicies(serviceName, serviceDbObj.getId(), this); |
| } |
| |
| if (ret != null && lastKnownVersion != null && lastKnownVersion.equals(ret.getPolicyVersion())) { |
| // ServicePolicies are not changed |
| ret = null; |
| } |
| |
| if (LOG.isDebugEnabled()) { |
| RangerServicePoliciesCache.getInstance().dump(); |
| } |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.getServicePoliciesIfUpdated(" + serviceName + ", " + lastKnownVersion + "): count=" + ((ret == null || ret.getPolicies() == null) ? 0 : ret.getPolicies().size())); |
| } |
| |
| return ret; |
| } |
| |
| @Override |
| public Long getServicePolicyVersion(String serviceName) { |
| |
| XXServiceVersionInfo serviceVersionInfoDbObj = daoMgr.getXXServiceVersionInfo().findByServiceName(serviceName); |
| |
| return serviceVersionInfoDbObj != null ? serviceVersionInfoDbObj.getPolicyVersion() : null; |
| } |
| |
| @Override |
| public ServicePolicies getServicePolicies(String serviceName) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getServicePolicies(" + serviceName + ")"); |
| } |
| |
| ServicePolicies ret = null; |
| |
| XXService serviceDbObj = daoMgr.getXXService().findByName(serviceName); |
| |
| if (serviceDbObj == null) { |
| throw new Exception("service does not exist. name=" + serviceName); |
| } |
| |
| XXServiceVersionInfo serviceVersionInfoDbObj = daoMgr.getXXServiceVersionInfo().findByServiceName(serviceName); |
| |
| if (serviceVersionInfoDbObj == null) { |
| LOG.warn("serviceVersionInfo does not exist. name=" + serviceName); |
| } |
| |
| RangerServiceDef serviceDef = getServiceDef(serviceDbObj.getType()); |
| |
| if (serviceDef == null) { |
| throw new Exception("service-def does not exist. id=" + serviceDbObj.getType()); |
| } |
| List<RangerPolicy> policies = null; |
| ServicePolicies.TagPolicies tagPolicies = null; |
| |
| String auditMode = getAuditMode(serviceDef.getName(), serviceName); |
| |
| if (serviceDbObj.getIsenabled()) { |
| if (serviceDbObj.getTagService() != null) { |
| XXService tagServiceDbObj = daoMgr.getXXService().getById(serviceDbObj.getTagService()); |
| |
| if (tagServiceDbObj != null && tagServiceDbObj.getIsenabled()) { |
| RangerServiceDef tagServiceDef = getServiceDef(tagServiceDbObj.getType()); |
| |
| if (tagServiceDef == null) { |
| throw new Exception("service-def does not exist. id=" + tagServiceDbObj.getType()); |
| } |
| |
| XXServiceVersionInfo tagServiceVersionInfoDbObj = daoMgr.getXXServiceVersionInfo().findByServiceId(serviceDbObj.getTagService()); |
| |
| if (tagServiceVersionInfoDbObj == null) { |
| LOG.warn("serviceVersionInfo does not exist. name=" + tagServiceDbObj.getName()); |
| } |
| tagPolicies = new ServicePolicies.TagPolicies(); |
| |
| tagPolicies.setServiceId(tagServiceDbObj.getId()); |
| tagPolicies.setServiceName(tagServiceDbObj.getName()); |
| tagPolicies.setPolicyVersion(tagServiceVersionInfoDbObj == null ? null : tagServiceVersionInfoDbObj.getPolicyVersion()); |
| tagPolicies.setPolicyUpdateTime(tagServiceVersionInfoDbObj == null ? null : tagServiceVersionInfoDbObj.getPolicyUpdateTime()); |
| tagPolicies.setPolicies(getServicePoliciesFromDb(tagServiceDbObj)); |
| tagPolicies.setServiceDef(tagServiceDef); |
| tagPolicies.setAuditMode(auditMode); |
| } |
| } |
| |
| policies = getServicePoliciesFromDb(serviceDbObj); |
| |
| } else { |
| policies = new ArrayList<RangerPolicy>(); |
| } |
| |
| ret = new ServicePolicies(); |
| |
| ret.setServiceId(serviceDbObj.getId()); |
| ret.setServiceName(serviceDbObj.getName()); |
| ret.setPolicyVersion(serviceVersionInfoDbObj == null ? null : serviceVersionInfoDbObj.getPolicyVersion()); |
| ret.setPolicyUpdateTime(serviceVersionInfoDbObj == null ? null : serviceVersionInfoDbObj.getPolicyUpdateTime()); |
| ret.setPolicies(policies); |
| ret.setServiceDef(serviceDef); |
| ret.setAuditMode(auditMode); |
| ret.setTagPolicies(tagPolicies); |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.getServicePolicies(" + serviceName + "): count=" + ((ret == null || ret.getPolicies() == null) ? 0 : ret.getPolicies().size())); |
| } |
| |
| return ret; |
| } |
| |
| void createDefaultPolicies(XXService createdService, VXUser vXUser) throws Exception { |
| RangerServiceDef serviceDef = getServiceDef(createdService.getType()); |
| |
| if (serviceDef.getName().equals(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME)) { |
| createDefaultTagPolicy(createdService); |
| } else { |
| // we need to create one policy for each resource hierarchy |
| RangerServiceDefHelper serviceDefHelper = new RangerServiceDefHelper(serviceDef); |
| for (List<RangerResourceDef> aHierarchy : serviceDefHelper.getResourceHierarchies(RangerPolicy.POLICY_TYPE_ACCESS)) { |
| RangerPolicy policy = new RangerPolicy(); |
| createDefaultPolicy(policy, createdService, vXUser, aHierarchy); |
| policy = createPolicy(policy); |
| RangerPolicy policyAudit = new RangerPolicy(); |
| createPolicyForKeyAdmin(policyAudit, serviceDef, aHierarchy, createdService); |
| } |
| } |
| } |
| |
| private void createPolicyForKeyAdmin(RangerPolicy policyAudit, RangerServiceDef serviceDef, List<RangerResourceDef> aHierarchy, XXService createdService) { |
| if (serviceDef.getName().equals(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_HDFS_NAME)) { |
| try { |
| // we need to create one policy for keyadmin user for audit to HDFS |
| RangerPolicy policy = getPolicyForKMSAudit(aHierarchy , createdService.getName(), serviceDef); |
| if (policy != null) { |
| createPolicy(policy); |
| } |
| } catch (Exception e) { |
| LOG.error("Error creating policy for keyadmin for audit to HDFS : " + serviceDef.getName(), e); |
| } |
| } |
| } |
| |
| private RangerPolicy getPolicyForKMSAudit(List<RangerResourceDef> resourceHierarchy, String serviceName, RangerServiceDef serviceDef) { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getPolicyForKMSAudit()"); |
| } |
| |
| RangerPolicy policy = new RangerPolicy(); |
| |
| policy.setIsEnabled(true); |
| policy.setVersion(1L); |
| policy.setName(AUDITTOHDFS_POLICY_NAME); |
| policy.setService(serviceName); |
| policy.setDescription("Policy for " + AUDITTOHDFS_POLICY_NAME); |
| policy.setIsAuditEnabled(true); |
| policy.setResources(createKMSAuditResource(resourceHierarchy)); |
| |
| List<RangerPolicy.RangerPolicyItem> policyItems = new ArrayList<RangerPolicy.RangerPolicyItem>(); |
| //Create policy item for keyadmin |
| RangerPolicy.RangerPolicyItem policyItem = new RangerPolicy.RangerPolicyItem(); |
| List<String> userKeyAdmin = new ArrayList<String>(); |
| userKeyAdmin.add("keyadmin"); |
| policyItem.setUsers(userKeyAdmin); |
| policyItem.setAccesses(getAndAllowAllAccesses(serviceDef)); |
| policyItem.setDelegateAdmin(false); |
| |
| policyItems.add(policyItem); |
| policy.setPolicyItems(policyItems); |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.getPolicyForKMSAudit()" + policy); |
| } |
| |
| return policy; |
| } |
| |
| public List<RangerPolicy.RangerPolicyItemAccess> getAndAllowAllAccesses(RangerServiceDef serviceDef) { |
| List<RangerPolicy.RangerPolicyItemAccess> ret = new ArrayList<RangerPolicy.RangerPolicyItemAccess>(); |
| |
| for (RangerServiceDef.RangerAccessTypeDef accessTypeDef : serviceDef.getAccessTypes()) { |
| RangerPolicy.RangerPolicyItemAccess access = new RangerPolicy.RangerPolicyItemAccess(); |
| access.setType(accessTypeDef.getName()); |
| access.setIsAllowed(true); |
| ret.add(access); |
| } |
| return ret; |
| } |
| |
| private Map<String, RangerPolicyResource> createKMSAuditResource( |
| List<RangerServiceDef.RangerResourceDef> resourceHierarchy) { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.createKMSAuditResource()"); |
| } |
| Map<String, RangerPolicy.RangerPolicyResource> resourceMap = new HashMap<>(); |
| |
| for (RangerServiceDef.RangerResourceDef resourceDef : resourceHierarchy) { |
| RangerPolicy.RangerPolicyResource polRes = new RangerPolicy.RangerPolicyResource(); |
| |
| polRes.setIsExcludes(false); |
| polRes.setIsRecursive(resourceDef.getRecursiveSupported()); |
| polRes.setValue(AUDITTOHDFS_KMS_PATH); |
| |
| resourceMap.put(resourceDef.getName(), polRes); |
| } |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.createKMSAuditResource():" |
| + resourceMap); |
| } |
| return resourceMap; |
| } |
| |
| private void createDefaultTagPolicy(XXService createdService) throws Exception { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.createDefaultTagPolicy() "); |
| } |
| |
| String tagResourceDefName = null; |
| boolean isConditionDefFound = false; |
| |
| RangerServiceDef tagServiceDef = getServiceDef(createdService.getType()); |
| List<RangerResourceDef> tagResourceDef = tagServiceDef.getResources(); |
| if (tagResourceDef != null && tagResourceDef.size() > 0) { |
| // Assumption : First (and perhaps the only) resourceDef is the name of the tag resource |
| RangerResourceDef theTagResourceDef = tagResourceDef.get(0); |
| tagResourceDefName = theTagResourceDef.getName(); |
| } else { |
| LOG.error("ServiceDBStore.createService() - Cannot create default TAG policy: Cannot get tagResourceDef Name."); |
| } |
| |
| List<RangerPolicyConditionDef> policyConditionDefs = tagServiceDef.getPolicyConditions(); |
| |
| if (CollectionUtils.isNotEmpty(policyConditionDefs)) { |
| for (RangerPolicyConditionDef conditionDef : policyConditionDefs) { |
| if (conditionDef.getName().equals(RANGER_TAG_EXPIRY_CONDITION_NAME)) { |
| isConditionDefFound = true; |
| break; |
| } |
| } |
| } |
| if (!isConditionDefFound) { |
| LOG.error("ServiceDBStore.createService() - Cannot create default TAG policy: Cannot get tagPolicyConditionDef with name=" + RANGER_TAG_EXPIRY_CONDITION_NAME); |
| } |
| |
| if (tagResourceDefName != null && isConditionDefFound) { |
| |
| String tagType = "EXPIRES_ON"; |
| |
| String policyName = tagType; |
| |
| RangerPolicy policy = new RangerPolicy(); |
| |
| policy.setIsEnabled(true); |
| policy.setVersion(1L); |
| policy.setName(StringUtils.trim(policyName)); |
| policy.setService(createdService.getName()); |
| policy.setDescription("Policy for data with " + tagType + " tag"); |
| policy.setIsAuditEnabled(true); |
| |
| Map<String, RangerPolicyResource> resourceMap = new HashMap<String, RangerPolicyResource>(); |
| |
| RangerPolicyResource polRes = new RangerPolicyResource(); |
| polRes.setIsExcludes(false); |
| polRes.setIsRecursive(false); |
| polRes.setValue(tagType); |
| resourceMap.put(tagResourceDefName, polRes); |
| |
| policy.setResources(resourceMap); |
| |
| List<RangerPolicyItem> policyItems = new ArrayList<RangerPolicyItem>(); |
| |
| RangerPolicyItem policyItem = new RangerPolicyItem(); |
| |
| List<String> groups = new ArrayList<String>(); |
| groups.add(RangerConstants.GROUP_PUBLIC); |
| policyItem.setGroups(groups); |
| |
| List<XXAccessTypeDef> accessTypeDefs = daoMgr.getXXAccessTypeDef().findByServiceDefId(createdService.getType()); |
| List<RangerPolicyItemAccess> accesses = new ArrayList<RangerPolicyItemAccess>(); |
| for (XXAccessTypeDef accessTypeDef : accessTypeDefs) { |
| RangerPolicyItemAccess access = new RangerPolicyItemAccess(); |
| access.setType(accessTypeDef.getName()); |
| access.setIsAllowed(true); |
| accesses.add(access); |
| } |
| policyItem.setAccesses(accesses); |
| |
| List<RangerPolicyItemCondition> policyItemConditions = new ArrayList<RangerPolicyItemCondition>(); |
| List<String> values = new ArrayList<String>(); |
| values.add("yes"); |
| RangerPolicyItemCondition policyItemCondition = new RangerPolicyItemCondition(RANGER_TAG_EXPIRY_CONDITION_NAME, values); |
| policyItemConditions.add(policyItemCondition); |
| |
| policyItem.setConditions(policyItemConditions); |
| policyItem.setDelegateAdmin(Boolean.FALSE); |
| |
| policyItems.add(policyItem); |
| |
| policy.setDenyPolicyItems(policyItems); |
| |
| policy = createPolicy(policy); |
| } else { |
| LOG.error("ServiceDBStore.createService() - Cannot create default TAG policy, tagResourceDefName=" + tagResourceDefName + |
| ", tagPolicyConditionName=" + RANGER_TAG_EXPIRY_CONDITION_NAME); |
| } |
| |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.createDefaultTagPolicy()"); |
| } |
| } |
| |
| private String buildPolicyName(List<RangerResourceDef> resourceHierarchy) { |
| String ret = "all"; |
| if (CollectionUtils.isNotEmpty(resourceHierarchy)) { |
| int resourceDefCount = 0; |
| for (RangerResourceDef resourceDef : resourceHierarchy) { |
| if (resourceDefCount > 0) { |
| ret += ", "; |
| } else { |
| ret += " - "; |
| } |
| ret += resourceDef.getName(); |
| resourceDefCount++; |
| } |
| } |
| return ret; |
| } |
| |
| void createDefaultPolicy(RangerPolicy policy, XXService createdService, VXUser vXUser, List<RangerResourceDef> resourceHierarchy) throws Exception { |
| |
| String policyName=buildPolicyName(resourceHierarchy); |
| |
| policy.setIsEnabled(true); |
| policy.setVersion(1L); |
| policy.setName(StringUtils.trim(policyName)); |
| policy.setService(createdService.getName()); |
| policy.setDescription("Policy for " + policyName); |
| policy.setIsAuditEnabled(true); |
| policy.setPolicyType(policy.getPolicyType() == null ? RangerPolicy.POLICY_TYPE_ACCESS : policy.getPolicyType()); |
| |
| policy.setResources(createDefaultPolicyResource(resourceHierarchy)); |
| |
| if (vXUser != null) { |
| List<RangerPolicyItem> policyItems = new ArrayList<RangerPolicyItem>(); |
| List<XXAccessTypeDef> accessTypeDefs = daoMgr.getXXAccessTypeDef().findByServiceDefId(createdService.getType()); |
| //Create Default policy item for the service user |
| RangerPolicyItem policyItem = createDefaultPolicyItem(createdService, vXUser, accessTypeDefs); |
| policyItems.add(policyItem); |
| // For KMS add default policies for HDFS & HIVE users. |
| XXServiceDef xServiceDef = daoMgr.getXXServiceDef().getById(createdService.getType()); |
| if (EmbeddedServiceDefsUtil.KMS_IMPL_CLASS_NAME.equals(xServiceDef.getImplclassname())) { |
| List<XXAccessTypeDef> hdfsAccessTypeDefs = new ArrayList<XXAccessTypeDef>(); |
| List<XXAccessTypeDef> hiveAccessTypeDefs = new ArrayList<XXAccessTypeDef>(); |
| for(XXAccessTypeDef accessTypeDef : accessTypeDefs) { |
| if (accessTypeDef.getName().equalsIgnoreCase(ACCESS_TYPE_GET_METADATA)) { |
| hdfsAccessTypeDefs.add(accessTypeDef); |
| hiveAccessTypeDefs.add(accessTypeDef); |
| } else if (accessTypeDef.getName().equalsIgnoreCase(ACCESS_TYPE_GENERATE_EEK)) { |
| hdfsAccessTypeDefs.add(accessTypeDef); |
| } else if (accessTypeDef.getName().equalsIgnoreCase(ACCESS_TYPE_DECRYPT_EEK)) { |
| hiveAccessTypeDefs.add(accessTypeDef); |
| } |
| } |
| |
| String hdfsUser = PropertiesUtil.getProperty("ranger.kms.service.user.hdfs", "hdfs"); |
| if (hdfsUser != null && !hdfsUser.isEmpty()) { |
| XXUser xxUser = daoMgr.getXXUser().findByUserName(hdfsUser); |
| if (xxUser != null) { |
| vXUser = xUserService.populateViewBean(xxUser); |
| } else { |
| vXUser = xUserMgr.createServiceConfigUser(hdfsUser); |
| } |
| if (vXUser != null) { |
| LOG.info("Creating default KMS policy item for " + hdfsUser); |
| policyItem = createDefaultPolicyItem(createdService, vXUser, hdfsAccessTypeDefs); |
| policyItems.add(policyItem); |
| } |
| } |
| |
| String hiveUser = PropertiesUtil.getProperty("ranger.kms.service.user.hive", "hive"); |
| if (hiveUser != null && !hiveUser.isEmpty()) { |
| XXUser xxUser = daoMgr.getXXUser().findByUserName(hiveUser); |
| if (xxUser != null) { |
| vXUser = xUserService.populateViewBean(xxUser); |
| } else { |
| vXUser = xUserMgr.createServiceConfigUser(hiveUser); |
| } |
| if (vXUser != null) { |
| LOG.info("Creating default KMS policy item for " + hiveUser); |
| policyItem = createDefaultPolicyItem(createdService, vXUser, hiveAccessTypeDefs); |
| policyItems.add(policyItem); |
| } |
| } |
| } |
| policy.setPolicyItems(policyItems); |
| } |
| } |
| |
| private RangerPolicyItem createDefaultPolicyItem(XXService createdService, VXUser vXUser, List<XXAccessTypeDef> accessTypeDefs) throws Exception { |
| String adminPrincipal = PropertiesUtil.getProperty(ADMIN_USER_PRINCIPAL); |
| String adminKeytab = PropertiesUtil.getProperty(ADMIN_USER_KEYTAB); |
| String authType = PropertiesUtil.getProperty(RANGER_AUTH_TYPE,"simple"); |
| String lookupPrincipal = PropertiesUtil.getProperty(LOOKUP_PRINCIPAL); |
| String lookupKeytab = PropertiesUtil.getProperty(LOOKUP_KEYTAB); |
| |
| RangerPolicyItem policyItem = new RangerPolicyItem(); |
| |
| List<String> users = new ArrayList<String>(); |
| users.add(vXUser.getName()); |
| VXUser vXLookupUser = getLookupUser(authType, lookupPrincipal, lookupKeytab); |
| |
| XXService xService = daoMgr.getXXService().findByName(createdService.getName()); |
| XXServiceDef xServiceDef = daoMgr.getXXServiceDef().getById(xService.getType()); |
| if (StringUtils.equals(xServiceDef.getImplclassname(), EmbeddedServiceDefsUtil.KMS_IMPL_CLASS_NAME)){ |
| VXUser vXAdminUser = getLookupUser(authType, adminPrincipal, adminKeytab); |
| if(vXAdminUser != null){ |
| users.add(vXAdminUser.getName()); |
| } |
| }else if(vXLookupUser != null){ |
| users.add(vXLookupUser.getName()); |
| }else{ |
| // do nothing |
| } |
| |
| if (StringUtils.equals(xServiceDef.getImplclassname(), EmbeddedServiceDefsUtil.ATLAS_IMPL_CLASS_NAME)){ |
| VXUser vXUserAdmin = chkAdminUserExists("admin"); |
| if(vXUserAdmin != null){ |
| users.add(vXUserAdmin.getName()); |
| } |
| } |
| |
| RangerService rangerService = getServiceByName(createdService.getName()); |
| if (rangerService != null){ |
| Map<String, String> map = rangerService.getConfigs(); |
| if (map != null && map.containsKey(AMBARI_SERVICE_CHECK_USER)){ |
| String userNames = map.get(AMBARI_SERVICE_CHECK_USER); |
| String[] userList = userNames.split(","); |
| if(userList != null){ |
| for (String userName : userList) { |
| if(!StringUtils.isEmpty(userName)){ |
| XXUser xxUser = daoMgr.getXXUser().findByUserName(userName); |
| if (xxUser != null) { |
| vXUser = xUserService.populateViewBean(xxUser); |
| } else { |
| vXUser = xUserMgr.createServiceConfigUser(userName); |
| LOG.info("Creating Ambari Service Check User : "+vXUser.getName()); |
| } |
| if(vXUser != null){ |
| users.add(vXUser.getName()); |
| } |
| } |
| } |
| } |
| } |
| } |
| policyItem.setUsers(users); |
| |
| List<RangerPolicyItemAccess> accesses = new ArrayList<RangerPolicyItemAccess>(); |
| for(XXAccessTypeDef accessTypeDef : accessTypeDefs) { |
| RangerPolicyItemAccess access = new RangerPolicyItemAccess(); |
| access.setType(accessTypeDef.getName()); |
| access.setIsAllowed(true); |
| accesses.add(access); |
| } |
| policyItem.setAccesses(accesses); |
| |
| policyItem.setDelegateAdmin(true); |
| return policyItem; |
| } |
| |
| private VXUser chkAdminUserExists(String adminUser) { |
| VXUser vXUser = null; |
| if(!StringUtils.isEmpty(adminUser)){ |
| XXUser xxUser = daoMgr.getXXUser().findByUserName(adminUser); |
| if (xxUser != null) { |
| vXUser = xUserService.populateViewBean(xxUser); |
| } |
| } |
| return vXUser; |
| } |
| |
| private VXUser getLookupUser(String authType, String lookupPrincipal, String lookupKeytab) { |
| VXUser vXUser = null; |
| if(!StringUtils.isEmpty(authType) && authType.equalsIgnoreCase(KERBEROS_TYPE)){ |
| if(SecureClientLogin.isKerberosCredentialExists(lookupPrincipal, lookupKeytab)){ |
| KerberosName krbName = new KerberosName(lookupPrincipal); |
| String lookupUser=null; |
| try { |
| lookupUser = krbName.getShortName(); |
| } catch (IOException e) { |
| throw restErrorUtil.createRESTException("Please provide proper value of lookup user principal : "+ lookupPrincipal, MessageEnums.INVALID_INPUT_DATA); |
| } |
| |
| if(LOG.isDebugEnabled()){ |
| LOG.debug("Checking for Lookup User : "+lookupUser); |
| } |
| if(!StringUtils.isEmpty(lookupUser)){ |
| XXUser xxUser = daoMgr.getXXUser().findByUserName(lookupUser); |
| if (xxUser != null) { |
| vXUser = xUserService.populateViewBean(xxUser); |
| } else { |
| vXUser = xUserMgr.createServiceConfigUser(lookupUser); |
| LOG.info("Creating Lookup User : "+vXUser.getName()); |
| } |
| } |
| } |
| } |
| return vXUser; |
| } |
| |
| |
| Map<String, RangerPolicyResource> createDefaultPolicyResource(List<RangerResourceDef> resourceHierarchy) throws Exception { |
| Map<String, RangerPolicyResource> resourceMap = new HashMap<>(); |
| |
| for (RangerResourceDef resourceDef : resourceHierarchy) { |
| RangerPolicyResource polRes = new RangerPolicyResource(); |
| polRes.setIsExcludes(false); |
| polRes.setIsRecursive(false); |
| |
| String value = "*"; |
| if("path".equalsIgnoreCase(resourceDef.getName())) { |
| value = "/*"; |
| } |
| |
| if(resourceDef.getRecursiveSupported()) { |
| polRes.setIsRecursive(Boolean.TRUE); |
| } |
| |
| polRes.setValue(value); |
| resourceMap.put(resourceDef.getName(), polRes); |
| } |
| return resourceMap; |
| } |
| |
| private Map<String, String> validateRequiredConfigParams(RangerService service, Map<String, String> configs) { |
| if(LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.validateRequiredConfigParams()"); |
| } |
| if(configs == null) { |
| return null; |
| } |
| |
| List<XXServiceConfigDef> svcConfDefList = daoMgr.getXXServiceConfigDef() |
| .findByServiceDefName(service.getType()); |
| for(XXServiceConfigDef svcConfDef : svcConfDefList ) { |
| String confField = configs.get(svcConfDef.getName()); |
| |
| if(svcConfDef.getIsMandatory() && stringUtil.isEmpty(confField)) { |
| throw restErrorUtil.createRESTException( |
| "Please provide value of mandatory: "+ svcConfDef.getName(), |
| MessageEnums.INVALID_INPUT_DATA); |
| } |
| } |
| Map<String, String> validConfigs = new HashMap<String, String>(); |
| for(Entry<String, String> config : configs.entrySet()) { |
| if(!stringUtil.isEmpty(config.getValue())) { |
| validConfigs.put(config.getKey(), config.getValue()); |
| } |
| } |
| return validConfigs; |
| } |
| |
| private void handlePolicyUpdate(RangerService service, boolean isTagVersionUpdateNeeded) throws Exception { |
| updatePolicyVersion(service, isTagVersionUpdateNeeded); |
| } |
| |
| public enum VERSION_TYPE { POLICY_VERSION, TAG_VERSION, POLICY_AND_TAG_VERSION } |
| |
| private void updatePolicyVersion(RangerService service, boolean isTagVersionUpdateNeeded) throws Exception { |
| if(service == null || service.getId() == null) { |
| return; |
| } |
| |
| XXServiceDao serviceDao = daoMgr.getXXService(); |
| |
| final XXService serviceDbObj = serviceDao.getById(service.getId()); |
| if(serviceDbObj == null) { |
| LOG.warn("updatePolicyVersion(serviceId=" + service.getId() + "): service not found"); |
| |
| return; |
| } |
| |
| final RangerDaoManager daoManager = daoMgr; |
| final Long serviceId = serviceDbObj.getId(); |
| final VERSION_TYPE versionType = VERSION_TYPE.POLICY_VERSION; |
| |
| Runnable serviceVersionUpdater = new ServiceVersionUpdater(daoManager, serviceId, versionType); |
| transactionSynchronizationAdapter.executeOnTransactionCommit(serviceVersionUpdater); |
| |
| // if this is a tag service, update all services that refer to this tag service |
| // so that next policy-download from plugins will get updated tag policies |
| boolean isTagService = serviceDbObj.getType() == EmbeddedServiceDefsUtil.instance().getTagServiceDefId(); |
| if(isTagService) { |
| List<XXService> referringServices = serviceDao.findByTagServiceId(serviceId); |
| |
| if(CollectionUtils.isNotEmpty(referringServices)) { |
| for(XXService referringService : referringServices) { |
| final Long referringServiceId = referringService.getId(); |
| final VERSION_TYPE tagServiceversionType = VERSION_TYPE.POLICY_VERSION; |
| |
| Runnable tagServiceVersionUpdater = new ServiceVersionUpdater(daoManager, referringServiceId, tagServiceversionType); |
| transactionSynchronizationAdapter.executeOnTransactionCommit(tagServiceVersionUpdater); |
| } |
| } |
| } |
| } |
| |
| public static void persistVersionChange(RangerDaoManager daoMgr, Long id, VERSION_TYPE versionType) { |
| XXServiceVersionInfoDao serviceVersionInfoDao = daoMgr.getXXServiceVersionInfo(); |
| |
| XXServiceVersionInfo serviceVersionInfoDbObj = serviceVersionInfoDao.findByServiceId(id); |
| |
| if(serviceVersionInfoDbObj != null) { |
| if (versionType == VERSION_TYPE.POLICY_VERSION || versionType == VERSION_TYPE.POLICY_AND_TAG_VERSION) { |
| serviceVersionInfoDbObj.setPolicyVersion(getNextVersion(serviceVersionInfoDbObj.getPolicyVersion())); |
| serviceVersionInfoDbObj.setPolicyUpdateTime(new Date()); |
| } |
| if (versionType == VERSION_TYPE.TAG_VERSION || versionType == VERSION_TYPE.POLICY_AND_TAG_VERSION) { |
| serviceVersionInfoDbObj.setTagVersion(getNextVersion(serviceVersionInfoDbObj.getTagVersion())); |
| serviceVersionInfoDbObj.setTagUpdateTime(new Date()); |
| } |
| |
| serviceVersionInfoDao.update(serviceVersionInfoDbObj); |
| |
| } else { |
| XXService service = daoMgr.getXXService().getById(id); |
| if (service != null) { |
| serviceVersionInfoDbObj = new XXServiceVersionInfo(); |
| serviceVersionInfoDbObj.setServiceId(service.getId()); |
| serviceVersionInfoDbObj.setPolicyVersion(1L); |
| serviceVersionInfoDbObj.setPolicyUpdateTime(new Date()); |
| serviceVersionInfoDbObj.setTagVersion(1L); |
| serviceVersionInfoDbObj.setTagUpdateTime(new Date()); |
| |
| serviceVersionInfoDao.create(serviceVersionInfoDbObj); |
| } |
| } |
| } |
| |
| @Override |
| public Boolean getPopulateExistingBaseFields() { |
| return populateExistingBaseFields; |
| } |
| |
| @Override |
| public void setPopulateExistingBaseFields(Boolean populateExistingBaseFields) { |
| this.populateExistingBaseFields = populateExistingBaseFields; |
| } |
| |
| public RangerPolicy getPolicyFromEventTime(String eventTime, Long policyId) { |
| |
| XXDataHist xDataHist = daoMgr.getXXDataHist().findObjByEventTimeClassTypeAndId(eventTime, |
| AppConstants.CLASS_TYPE_RANGER_POLICY, policyId); |
| |
| if (xDataHist == null) { |
| String errMsg = "No policy history found for given time: " + eventTime; |
| LOG.error(errMsg); |
| throw restErrorUtil.createRESTException(errMsg, MessageEnums.DATA_NOT_FOUND); |
| } |
| |
| String content = xDataHist.getContent(); |
| RangerPolicy policy = (RangerPolicy) dataHistService.writeJsonToJavaObject(content, RangerPolicy.class); |
| |
| return policy; |
| } |
| |
| public VXString getPolicyVersionList(Long policyId) { |
| List<Integer> versionList = daoMgr.getXXDataHist().getVersionListOfObject(policyId, |
| AppConstants.CLASS_TYPE_RANGER_POLICY); |
| |
| VXString vXString = new VXString(); |
| vXString.setValue(StringUtils.join(versionList, ",")); |
| |
| return vXString; |
| } |
| |
| public RangerPolicy getPolicyForVersionNumber(Long policyId, int versionNo) { |
| XXDataHist xDataHist = daoMgr.getXXDataHist().findObjectByVersionNumber(policyId, |
| AppConstants.CLASS_TYPE_RANGER_POLICY, versionNo); |
| |
| if (xDataHist == null) { |
| throw restErrorUtil.createRESTException("No Policy found for given version.", MessageEnums.DATA_NOT_FOUND); |
| } |
| |
| String content = xDataHist.getContent(); |
| RangerPolicy policy = (RangerPolicy) dataHistService.writeJsonToJavaObject(content, RangerPolicy.class); |
| |
| return policy; |
| } |
| |
| void updatePolicySignature(RangerPolicy policy) { |
| RangerPolicyResourceSignature policySignature = factory.createPolicyResourceSignature(policy); |
| String signature = policySignature.getSignature(); |
| policy.setResourceSignature(signature); |
| if (LOG.isDebugEnabled()) { |
| String message = String.format("Setting signature on policy id=%d, name=%s to [%s]", policy.getId(), policy.getName(), signature); |
| LOG.debug(message); |
| } |
| } |
| |
| // when a service-def is updated, the updated service-def should be made available to plugins |
| // this is achieved by incrementing policyVersion of all services of this service-def |
| protected void updateServicesForServiceDefUpdate(RangerServiceDef serviceDef) throws Exception { |
| if(serviceDef == null) { |
| return; |
| } |
| |
| final RangerDaoManager daoManager = daoMgr; |
| |
| boolean isTagServiceDef = StringUtils.equals(serviceDef.getName(), EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TAG_NAME); |
| |
| XXServiceDao serviceDao = daoMgr.getXXService(); |
| |
| List<XXService> services = serviceDao.findByServiceDefId(serviceDef.getId()); |
| |
| if(CollectionUtils.isNotEmpty(services)) { |
| for(XXService service : services) { |
| |
| final Long serviceId = service.getId(); |
| final VERSION_TYPE versionType = VERSION_TYPE.POLICY_VERSION; |
| |
| Runnable serviceVersionUpdater = new ServiceVersionUpdater(daoManager, serviceId, versionType); |
| transactionSynchronizationAdapter.executeOnTransactionCommit(serviceVersionUpdater); |
| |
| if(isTagServiceDef) { |
| List<XXService> referringServices = serviceDao.findByTagServiceId(service.getId()); |
| |
| if(CollectionUtils.isNotEmpty(referringServices)) { |
| for(XXService referringService : referringServices) { |
| |
| final Long referringServiceId = referringService.getId(); |
| final VERSION_TYPE tagServiceVersionType = VERSION_TYPE.POLICY_VERSION; |
| |
| Runnable tagServiceVersionUpdater = new ServiceVersionUpdater(daoManager, referringServiceId, tagServiceVersionType); |
| transactionSynchronizationAdapter.executeOnTransactionCommit(tagServiceVersionUpdater); |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| |
| 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; |
| } |
| |
| private boolean isAccessTypeInList(String accessType, List<XXAccessTypeDef> xAccessTypeDefs) { |
| for(XXAccessTypeDef xxAccessTypeDef : xAccessTypeDefs) { |
| if(StringUtils.equals(xxAccessTypeDef.getName(), accessType)) { |
| return true; |
| } |
| } |
| |
| return false; |
| } |
| |
| private boolean isResourceInList(String resource, List<XXResourceDef> xResourceDefs) { |
| for(XXResourceDef xResourceDef : xResourceDefs) { |
| if(StringUtils.equals(xResourceDef.getName(), resource)) { |
| return true; |
| } |
| } |
| |
| return false; |
| } |
| |
| private void writeExcel(List<RangerPolicy> policies, String excelFileName, HttpServletResponse response) |
| throws IOException { |
| Workbook workbook = null; |
| OutputStream outStream = null; |
| try { |
| workbook = new HSSFWorkbook(); |
| Sheet sheet = workbook.createSheet(); |
| createHeaderRow(sheet); |
| int rowCount = 0; |
| if (!CollectionUtils.isEmpty(policies)) { |
| for (RangerPolicy policy : policies) { |
| long serviceType = daoMgr.getXXService().findByName(policy.getService()).getType(); |
| List<RangerPolicyItem> policyItems = policy.getPolicyItems(); |
| List<RangerRowFilterPolicyItem> rowFilterPolicyItems = policy.getRowFilterPolicyItems(); |
| List<RangerDataMaskPolicyItem> dataMaskPolicyItems = policy.getDataMaskPolicyItems(); |
| List<RangerPolicyItem> allowExceptions = policy.getAllowExceptions(); |
| List<RangerPolicyItem> denyExceptions = policy.getDenyExceptions(); |
| List<RangerPolicyItem> denyPolicyItems = policy.getDenyPolicyItems(); |
| |
| if (CollectionUtils.isNotEmpty(policyItems)) { |
| for (RangerPolicyItem policyItem : policyItems) { |
| Row row = sheet.createRow(++rowCount); |
| writeBookForPolicyItems(policy, policyItem, null, null, row, null); |
| } |
| } else if (CollectionUtils.isNotEmpty(dataMaskPolicyItems)) { |
| for (RangerDataMaskPolicyItem dataMaskPolicyItem : dataMaskPolicyItems) { |
| Row row = sheet.createRow(++rowCount); |
| writeBookForPolicyItems(policy, null, dataMaskPolicyItem, null, row, null); |
| } |
| } else if (CollectionUtils.isNotEmpty(rowFilterPolicyItems)) { |
| for (RangerRowFilterPolicyItem rowFilterPolicyItem : rowFilterPolicyItems) { |
| Row row = sheet.createRow(++rowCount); |
| writeBookForPolicyItems(policy, null, null, rowFilterPolicyItem, row, null); |
| } |
| } else if (serviceType == 100) { |
| if (CollectionUtils.isEmpty(policyItems)) { |
| Row row = sheet.createRow(++rowCount); |
| RangerPolicyItem policyItem = new RangerPolicyItem(); |
| writeBookForPolicyItems(policy, policyItem, null, null, row, null); |
| } |
| } else if (CollectionUtils.isEmpty(policyItems)) { |
| Row row = sheet.createRow(++rowCount); |
| RangerPolicyItem policyItem = new RangerPolicyItem(); |
| writeBookForPolicyItems(policy, policyItem, null, null, row, null); |
| } |
| if (CollectionUtils.isNotEmpty(allowExceptions)) { |
| for (RangerPolicyItem policyItem : allowExceptions) { |
| Row row = sheet.createRow(++rowCount); |
| writeBookForPolicyItems(policy, policyItem, null, null, row, POLICY_ALLOW_EXCLUDE); |
| } |
| } |
| if (CollectionUtils.isNotEmpty(denyExceptions)) { |
| for (RangerPolicyItem policyItem : denyExceptions) { |
| Row row = sheet.createRow(++rowCount); |
| writeBookForPolicyItems(policy, policyItem, null, null, row, POLICY_DENY_EXCLUDE); |
| } |
| } |
| if (CollectionUtils.isNotEmpty(denyPolicyItems)) { |
| for (RangerPolicyItem policyItem : denyPolicyItems) { |
| Row row = sheet.createRow(++rowCount); |
| writeBookForPolicyItems(policy, policyItem, null, null, row, POLICY_DENY_INCLUDE); |
| } |
| } |
| } |
| } |
| ByteArrayOutputStream outByteStream = new ByteArrayOutputStream(); |
| workbook.write(outByteStream); |
| byte[] outArray = outByteStream.toByteArray(); |
| response.setContentType("application/ms-excel"); |
| response.setContentLength(outArray.length); |
| response.setHeader("Expires:", "0"); |
| response.setHeader("Content-Disposition", "attachment; filename=" + excelFileName); |
| response.setStatus(HttpServletResponse.SC_OK); |
| outStream = response.getOutputStream(); |
| outStream.write(outArray); |
| outStream.flush(); |
| } catch (IOException ex) { |
| LOG.error("Failed to create report file " + excelFileName, ex); |
| } catch (Exception ex) { |
| LOG.error("Error while generating report file " + excelFileName, ex); |
| } finally { |
| if (outStream != null) { |
| outStream.close(); |
| } |
| if (workbook != null) { |
| workbook.close(); |
| } |
| } |
| } |
| |
| private StringBuilder writeCSV(List<RangerPolicy> policies, String cSVFileName, HttpServletResponse response) { |
| response.setContentType("text/csv"); |
| final String COMMA_DELIMITER = "|"; |
| final String LINE_SEPARATOR = "\n"; |
| final String FILE_HEADER = "ID|Name|Resources|Groups|Users|Accesses|Service Type|Status"; |
| StringBuilder csvBuffer = new StringBuilder(); |
| csvBuffer.append(FILE_HEADER); |
| csvBuffer.append(LINE_SEPARATOR); |
| for (RangerPolicy policy : policies) { |
| String policyStatus = ""; |
| String policyName = ""; |
| String ServiceType = ""; |
| Long serviceTypeId = null; |
| List<String> groups = new ArrayList<String>(); |
| List<String> users = new ArrayList<String>(); |
| List<RangerPolicyItemAccess> accesses = new ArrayList<RangerPolicyItemAccess>(); |
| String groupNames = ""; |
| String userNames = ""; |
| String accessType = ""; |
| String resValue = ""; |
| String resourceKeyVal = ""; |
| StringBuffer resKeyVal = new StringBuffer(); |
| String resKey = ""; |
| policyName = policy.getName(); |
| policyName=policyName.replace("|", ""); |
| Long policyId = policy.getId(); |
| |
| if (policy.getIsEnabled()) { |
| policyStatus = "Enabled"; |
| } else { |
| policyStatus = "Disabled"; |
| } |
| XXService xxservice = daoMgr.getXXService().findByName(policy.getService()); |
| |
| if (xxservice != null) { |
| serviceTypeId = xxservice.getType(); |
| XXServiceDef xxservDef = daoMgr.getXXServiceDef().getById(serviceTypeId); |
| if (xxservDef != null) { |
| ServiceType = xxservDef.getName(); |
| } |
| } |
| int policyType = policy.getPolicyType(); |
| List<RangerPolicyItem> policyItems = new ArrayList<RangerPolicyItem>(); |
| List<RangerPolicyItem> policyItems0 = new ArrayList<RangerPolicyItem>(); |
| List<RangerDataMaskPolicyItem> policyItems1 = new ArrayList<RangerDataMaskPolicyItem>(); |
| List<RangerRowFilterPolicyItem> policyItems2 = new ArrayList<RangerRowFilterPolicyItem>(); |
| switch (policyType) { |
| case 0: |
| policyItems0 = policy.getPolicyItems(); |
| policyItems.addAll(policyItems0); |
| if (CollectionUtils.isNotEmpty(policy.getAllowExceptions())){ |
| policyItems.addAll(policy.getAllowExceptions()); |
| } |
| if (CollectionUtils.isNotEmpty(policy.getDenyExceptions())){ |
| policyItems.addAll(policy.getDenyExceptions()); |
| } |
| if (CollectionUtils.isNotEmpty(policy.getDenyPolicyItems())){ |
| policyItems.addAll(policy.getDenyPolicyItems()); |
| } |
| break; |
| case 1: |
| policyItems1 = policy.getDataMaskPolicyItems(); |
| policyItems.addAll(policyItems1); |
| break; |
| case 2: |
| policyItems2 = policy.getRowFilterPolicyItems(); |
| policyItems.addAll(policyItems2); |
| break; |
| } |
| |
| if (serviceTypeId!=null && serviceTypeId.equals(Long.valueOf(100L))) { |
| Map<String, RangerPolicyResource> resources = policy.getResources(); |
| |
| if (resources != null) { |
| for (Entry<String, RangerPolicyResource> resource : resources.entrySet()) { |
| resKey = resource.getKey(); |
| RangerPolicyResource policyResource = resource.getValue(); |
| List<String> resvalueList = policyResource.getValues(); |
| resValue = resvalueList.toString(); |
| resKeyVal = resKeyVal.append(resourceKeyVal).append(" ").append(resKey).append("=").append(resValue); |
| } |
| } |
| resourceKeyVal = resKeyVal.toString(); |
| resourceKeyVal = resourceKeyVal.substring(1); |
| |
| if (!CollectionUtils.isEmpty(policyItems)) { |
| for (RangerPolicyItem policyItem : policyItems) { |
| groupNames = ""; |
| userNames = ""; |
| accessType = ""; |
| groups = null; |
| users = null; |
| accesses = null; |
| groups = policyItem.getGroups(); |
| accesses = policyItem.getAccesses(); |
| users = policyItem.getUsers(); |
| |
| for (RangerPolicyItemAccess access : accesses) { |
| accessType = accessType + access.getType().replace("#", "").replace("|","") + "#"; |
| } |
| accessType = accessType.substring(0, accessType.lastIndexOf("#")); |
| if (CollectionUtils.isNotEmpty(groups)) { |
| for (String group : groups){ |
| group=group.replace("|", ""); |
| group=group.replace("#", ""); |
| groupNames=groupNames+group+ "#"; |
| } |
| groupNames = groupNames.substring(0, groupNames.lastIndexOf("#")); |
| } |
| |
| if (CollectionUtils.isNotEmpty(users)) { |
| for (String user : users){ |
| user=user.replace("|", ""); |
| user=user.replace("#", ""); |
| userNames=userNames +user + "#"; |
| } |
| userNames=userNames.substring(0,userNames.lastIndexOf("#")); |
| } |
| |
| csvBuffer.append(policyId); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(policyName); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(resourceKeyVal); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(groupNames); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(userNames); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(accessType); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(ServiceType); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(policyStatus); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(LINE_SEPARATOR); |
| |
| } |
| } else { |
| csvBuffer.append(policyId); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(policyName); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(resourceKeyVal); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(groupNames); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(userNames); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(accessType); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(ServiceType); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(policyStatus); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(LINE_SEPARATOR); |
| } |
| } else { |
| Map<String, RangerPolicyResource> resources = policy.getResources(); |
| if (resources != null) { |
| for (Entry<String, RangerPolicyResource> resource : resources.entrySet()) { |
| resKey = resource.getKey(); |
| RangerPolicyResource policyResource = resource.getValue(); |
| List<String> resvalueList = policyResource.getValues(); |
| resValue = resvalueList.toString(); |
| resKeyVal = resKeyVal.append(resourceKeyVal).append(" ").append(resKey).append("=").append(resValue); |
| } |
| } |
| resourceKeyVal = resKeyVal.toString(); |
| resourceKeyVal = resourceKeyVal.substring(1); |
| |
| if (CollectionUtils.isNotEmpty(policyItems)) { |
| for (RangerPolicyItem policyItem : policyItems) { |
| groups = null; |
| users = null; |
| accesses = null; |
| groupNames = ""; |
| userNames = ""; |
| accessType = ""; |
| groups = policyItem.getGroups(); |
| users = policyItem.getUsers(); |
| accesses = policyItem.getAccesses(); |
| |
| if (CollectionUtils.isNotEmpty(accesses)) { |
| for (RangerPolicyItemAccess access : accesses) { |
| accessType = accessType + access.getType().replace("#", "").replace("|", "") + "#"; |
| } |
| accessType = accessType.substring(0, accessType.lastIndexOf("#")); |
| } |
| if (CollectionUtils.isNotEmpty(groups)) { |
| for (String group : groups) { |
| group = group.replace("|", ""); |
| group = group.replace("#", ""); |
| groupNames = groupNames + group + "#"; |
| } |
| groupNames = groupNames.substring(0, groupNames.lastIndexOf("#")); |
| } |
| if (CollectionUtils.isNotEmpty(users)) { |
| for (String user : users) { |
| user = user.replace("|", ""); |
| user = user.replace("#", ""); |
| userNames = userNames + user + "#"; |
| } |
| userNames = userNames.substring(0, userNames.lastIndexOf("#")); |
| } |
| csvBuffer.append(policyId); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(policyName); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(resourceKeyVal); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(groupNames); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(userNames); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(accessType); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(ServiceType); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(policyStatus); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(LINE_SEPARATOR); |
| } |
| } else { |
| csvBuffer.append(policyId); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(policyName); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(resourceKeyVal); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(groupNames); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(userNames); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(accessType); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(ServiceType); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(policyStatus); |
| csvBuffer.append(COMMA_DELIMITER); |
| csvBuffer.append(LINE_SEPARATOR); |
| } |
| } |
| } |
| response.setHeader("Content-Disposition", "attachment; filename=" + cSVFileName); |
| response.setStatus(HttpServletResponse.SC_OK); |
| return csvBuffer; |
| } |
| |
| public void putMetaDataInfo(RangerExportPolicyList rangerExportPolicyList){ |
| Map<String, Object> metaDataInfo = new LinkedHashMap<String, Object>(); |
| UserSessionBase usb = ContextUtil.getCurrentUserSession(); |
| String userId = usb.getLoginId(); |
| |
| metaDataInfo.put(HOSTNAME, LOCAL_HOSTNAME); |
| metaDataInfo.put(USER_NAME, userId); |
| metaDataInfo.put(TIMESTAMP, MiscUtil.getUTCDateForLocalDate(new Date())); |
| metaDataInfo.put(RANGER_VERSION, RangerVersionInfo.getVersion()); |
| |
| rangerExportPolicyList.setMetaDataInfo(metaDataInfo); |
| } |
| |
| private void writeJson(List<RangerPolicy> policies, String jsonFileName, |
| HttpServletResponse response) throws JSONException, IOException { |
| response.setContentType("text/json"); |
| response.setHeader("Content-Disposition", "attachment; filename="+ jsonFileName); |
| ServletOutputStream out = null; |
| RangerExportPolicyList rangerExportPolicyList = new RangerExportPolicyList(); |
| putMetaDataInfo(rangerExportPolicyList); |
| rangerExportPolicyList.setPolicies(policies); |
| |
| Gson gson = new Gson(); |
| String json = gson.toJson(rangerExportPolicyList, RangerExportPolicyList.class); |
| |
| try { |
| out = response.getOutputStream(); |
| response.setStatus(HttpServletResponse.SC_OK); |
| IOUtils.write(json, out, "UTF-8"); |
| } catch (Exception e) { |
| LOG.error("Error while exporting json file " + jsonFileName, e); |
| } finally { |
| try { |
| if (out != null) { |
| out.flush(); |
| out.close(); |
| } |
| } catch (Exception ex) { |
| } |
| } |
| } |
| |
| public Map<String, String> getServiceMap(InputStream serviceMapStream) |
| throws IOException { |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("==> ServiceDBStore.getServiceMap()"); |
| } |
| Map<String, String> serviceMap = new LinkedHashMap<String, String>(); |
| String serviceMapString = IOUtils.toString(serviceMapStream); |
| if (StringUtils.isNotEmpty(serviceMapString)) { |
| serviceMap = jsonUtil.jsonToMap(serviceMapString); |
| } |
| if(!CollectionUtils.sizeIsEmpty(serviceMap)){ |
| if (LOG.isDebugEnabled()) { |
| LOG.debug("<== ServiceDBStore.getServiceMap()"); |
| } |
| return serviceMap; |
| }else{ |
| LOG.error("Provided service map is empty!!"); |
| throw restErrorUtil.createRESTException("Provided service map is empty!!"); |
| } |
| } |
| |
| public Map<String, RangerPolicy> setPolicyMapKeyValue(Map<String, RangerPolicy> policiesMap, RangerPolicy policy){ |
| if (StringUtils.isNotEmpty(policy.getName().trim()) |
| && StringUtils.isNotEmpty(policy.getService().trim()) |
| && StringUtils.isNotEmpty(policy.getResources().toString().trim())) { |
| policiesMap.put(policy.getName().trim() + " " + policy.getService().trim() + " " + policy.getResources().toString().trim(), policy); |
| }else if (StringUtils.isEmpty(policy.getName().trim()) && StringUtils.isNotEmpty(policy.getService().trim())){ |
| LOG.error("Policy Name is not provided for service : " + policy.getService().trim()); |
| throw restErrorUtil.createRESTException("Policy Name is not provided for service : " + policy.getService().trim()); |
| }else if (StringUtils.isNotEmpty(policy.getName().trim()) && StringUtils.isEmpty(policy.getService().trim())){ |
| LOG.error("Service Name is not provided for policy : " + policy.getName().trim()); |
| throw restErrorUtil.createRESTException("Service Name is not provided for policy : " + policy.getName().trim()); |
| }else{ |
| LOG.error("Service Name or Policy Name is not provided!!"); |
| throw restErrorUtil.createRESTException("Service Name or Policy Name is not provided!!"); |
| } |
| return policiesMap; |
| } |
| |
| public Map<String, RangerPolicy> createPolicyMap( |
| Map<String, String> servicesMappingMap, |
| List<String> sourceServices, List<String> destinationServices, |
| RangerPolicy policy, Map<String, RangerPolicy> policiesMap) { |
| if (!CollectionUtils.sizeIsEmpty(servicesMappingMap)) { |
| if (!StringUtils.isEmpty(policy.getService().trim())){ |
| if (sourceServices.contains(policy.getService().trim())) { |
| int index = sourceServices.indexOf(policy.getService().trim()); |
| policy.setService(destinationServices.get(index)); |
| policiesMap = setPolicyMapKeyValue(policiesMap, policy); |
| } |
| }else{ |
| LOG.error("Service Name or Policy Name is not provided!!"); |
| throw restErrorUtil.createRESTException("Service Name or Policy Name is not provided!!"); |
| } |
| } else if (CollectionUtils.sizeIsEmpty(servicesMappingMap)) { |
| policiesMap = setPolicyMapKeyValue(policiesMap, policy); |
| } |
| return policiesMap; |
| } |
| |
| private void writeBookForPolicyItems(RangerPolicy policy, RangerPolicyItem policyItem, |
| RangerDataMaskPolicyItem dataMaskPolicyItem, RangerRowFilterPolicyItem rowFilterPolicyItem, Row row, String policyConditonType) { |
| List<String> groups = new ArrayList<String>(); |
| List<String> users = new ArrayList<String>(); |
| String groupNames = ""; |
| String userNames = ""; |
| String accessType = ""; |
| String policyStatus = ""; |
| Cell cell = row.createCell(0); |
| cell.setCellValue(policy.getId()); |
| List<RangerPolicyItemAccess> accesses = new ArrayList<RangerPolicyItemAccess>(); |
| cell = row.createCell(1); |
| cell.setCellValue(policy.getName()); |
| cell = row.createCell(2); |
| String resValue = ""; |
| String resourceKeyVal = ""; |
| String resKey = ""; |
| StringBuffer sb = new StringBuffer(); |
| Map<String, RangerPolicyResource> resources = policy.getResources(); |
| if (resources != null) { |
| for (Entry<String, RangerPolicyResource> resource : resources.entrySet()) { |
| resKey = resource.getKey(); |
| RangerPolicyResource policyResource = resource.getValue(); |
| List<String> resvalueList = policyResource.getValues(); |
| resValue = resvalueList.toString(); |
| sb = sb.append(resourceKeyVal).append(" ").append(resKey).append("=").append(resValue); |
| } |
| resourceKeyVal = sb.toString(); |
| resourceKeyVal = resourceKeyVal.substring(1); |
| cell.setCellValue(resourceKeyVal); |
| if (policyItem != null && dataMaskPolicyItem == null && rowFilterPolicyItem == null) { |
| groups = policyItem.getGroups(); |
| users = policyItem.getUsers(); |
| accesses = policyItem.getAccesses(); |
| } else if (dataMaskPolicyItem != null && policyItem == null && rowFilterPolicyItem == null) { |
| groups = dataMaskPolicyItem.getGroups(); |
| users = dataMaskPolicyItem.getUsers(); |
| accesses = dataMaskPolicyItem.getAccesses(); |
| } else if (rowFilterPolicyItem != null && policyItem == null && dataMaskPolicyItem == null) { |
| groups = rowFilterPolicyItem.getGroups(); |
| users = rowFilterPolicyItem.getUsers(); |
| accesses = rowFilterPolicyItem.getAccesses(); |
| } |
| if (CollectionUtils.isNotEmpty(accesses)) { |
| for (RangerPolicyItemAccess access : accesses) { |
| accessType = accessType + access.getType(); |
| accessType = accessType + " ,"; |
| } |
| accessType = accessType.substring(0, accessType.lastIndexOf(",")); |
| } |
| if (CollectionUtils.isNotEmpty(groups)) { |
| groupNames = groupNames + groups.toString(); |
| StringTokenizer groupToken = new StringTokenizer(groupNames, "[]"); |
| while(groupToken.hasMoreTokens()) { |
| groupNames = groupToken.nextToken().toString(); |
| } |
| } |
| if (CollectionUtils.isNotEmpty(users)) { |
| userNames = userNames + users.toString(); |
| StringTokenizer userToken = new StringTokenizer(userNames, "[]"); |
| while(userToken.hasMoreTokens()) { |
| userNames = userToken.nextToken().toString(); |
| } |
| } |
| cell = row.createCell(3); |
| cell.setCellValue(groupNames); |
| cell = row.createCell(4); |
| cell.setCellValue(userNames); |
| cell = row.createCell(5); |
| cell.setCellValue(accessType.trim()); |
| cell = row.createCell(6); |
| XXService xxservice = daoMgr.getXXService().findByName(policy.getService()); |
| String ServiceType = ""; |
| if (xxservice != null) { |
| Long ServiceId = xxservice.getType(); |
| XXServiceDef xxservDef = daoMgr.getXXServiceDef().getById(ServiceId); |
| if (xxservDef != null) { |
| ServiceType = xxservDef.getName(); |
| } |
| } |
| cell.setCellValue(ServiceType); |
| cell = row.createCell(7); |
| |
| } |
| if (policy.getIsEnabled()) { |
| policyStatus = "Enabled"; |
| } else { |
| policyStatus = "Disabled"; |
| } |
| cell.setCellValue(policyStatus); |
| } |
| |
| private void createHeaderRow(Sheet sheet) { |
| CellStyle cellStyle = sheet.getWorkbook().createCellStyle(); |
| Font font = sheet.getWorkbook().createFont(); |
| font.setBold(true); |
| font.setFontHeightInPoints((short) 12); |
| cellStyle.setFont(font); |
| |
| Row row = sheet.createRow(0); |
| |
| Cell cellID = row.createCell(0); |
| cellID.setCellStyle(cellStyle); |
| cellID.setCellValue("ID"); |
| |
| Cell cellNAME = row.createCell(1); |
| cellNAME.setCellStyle(cellStyle); |
| cellNAME.setCellValue("Name"); |
| |
| Cell cellResources = row.createCell(2); |
| cellResources.setCellStyle(cellStyle); |
| cellResources.setCellValue("Resources"); |
| |
| Cell cellGroups = row.createCell(3); |
| cellGroups.setCellStyle(cellStyle); |
| cellGroups.setCellValue("Groups"); |
| |
| Cell cellUsers = row.createCell(4); |
| cellUsers.setCellStyle(cellStyle); |
| cellUsers.setCellValue("Users"); |
| |
| Cell cellAccesses = row.createCell(5); |
| cellAccesses.setCellStyle(cellStyle); |
| cellAccesses.setCellValue("Accesses"); |
| |
| Cell cellServiceType = row.createCell(6); |
| cellServiceType.setCellStyle(cellStyle); |
| cellServiceType.setCellValue("Service Type"); |
| |
| Cell cellStatus = row.createCell(7); |
| cellStatus.setCellStyle(cellStyle); |
| cellStatus.setCellValue("Status"); |
| } |
| |
| |
| private RangerPolicyList searchRangerPolicies(SearchFilter searchFilter) { |
| List<RangerPolicy> policyList = new ArrayList<RangerPolicy>(); |
| RangerPolicyList retList = new RangerPolicyList(); |
| Map<Long,RangerPolicy> policyMap=new HashMap<Long,RangerPolicy>(); |
| Set<Long> processedServices=new HashSet<Long>(); |
| Set<Long> processedPolicies=new HashSet<Long>(); |
| Comparator<RangerPolicy> comparator = new Comparator<RangerPolicy>() { |
| public int compare(RangerPolicy c1, RangerPolicy c2) { |
| return (int) ((c1.getId()).compareTo(c2.getId())); |
| } |
| }; |
| |
| List<XXPolicy> xPolList = (List<XXPolicy>) policyService.searchResources(searchFilter, policyService.searchFields, policyService.sortFields, retList); |
| if (!CollectionUtils.isEmpty(xPolList)) { |
| for (XXPolicy xXPolicy : xPolList) { |
| if(!processedServices.contains(xXPolicy.getService())){ |
| loadRangerPolicies(xXPolicy.getService(),processedServices,policyMap,searchFilter); |
| } |
| } |
| } |
| String userName = searchFilter.getParam("user"); |
| if (!StringUtils.isEmpty(userName)) { |
| searchFilter.removeParam("user"); |
| Set<String> groupNames = daoMgr.getXXGroupUser().findGroupNamesByUserName(userName); |
| if (!CollectionUtils.isEmpty(groupNames)) { |
| List<XXPolicy> xPolList2 = null; |
| for (String groupName : groupNames) { |
| xPolList2 = new ArrayList<XXPolicy>(); |
| searchFilter.setParam("group", groupName); |
| xPolList2 = (List<XXPolicy>) policyService.searchResources(searchFilter, policyService.searchFields, policyService.sortFields, retList); |
| if (!CollectionUtils.isEmpty(xPolList2)) { |
| for (XXPolicy xPol2 : xPolList2) { |
| if(xPol2!=null){ |
| if(!processedPolicies.contains(xPol2.getId())){ |
| if(!processedServices.contains(xPol2.getService())){ |
| loadRangerPolicies(xPol2.getService(),processedServices,policyMap,searchFilter); |
| } |
| if(policyMap.containsKey(xPol2.getId())){ |
| policyList.add(policyMap.get(xPol2.getId())); |
| processedPolicies.add(xPol2.getId()); |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| if (!CollectionUtils.isEmpty(xPolList)) { |
| for (XXPolicy xPol : xPolList) { |
| if(xPol!=null){ |
| if(!processedPolicies.contains(xPol.getId())){ |
| if(!processedServices.contains(xPol.getService())){ |
| loadRangerPolicies(xPol.getService(),processedServices,policyMap,searchFilter); |
| } |
| if(policyMap.containsKey(xPol.getId())){ |
| policyList.add(policyMap.get(xPol.getId())); |
| processedPolicies.add(xPol.getId()); |
| } |
| } |
| } |
| } |
| Collections.sort(policyList, comparator); |
| } |
| retList.setPolicies(policyList); |
| return retList; |
| } |
| |
| private void loadRangerPolicies(Long serviceId,Set<Long> processedServices,Map<Long,RangerPolicy> policyMap,SearchFilter searchFilter){ |
| try { |
| List<RangerPolicy> tempPolicyList = getServicePolicies(serviceId,searchFilter); |
| if(!CollectionUtils.isEmpty(tempPolicyList)){ |
| for (RangerPolicy rangerPolicy : tempPolicyList) { |
| if(!policyMap.containsKey(rangerPolicy.getId())){ |
| policyMap.put(rangerPolicy.getId(), rangerPolicy); |
| } |
| } |
| processedServices.add(serviceId); |
| } |
| } catch (Exception e) { |
| } |
| } |
| public void getServiceUpgraded(){ |
| LOG.info("==> ServiceDBStore.getServiceUpgraded()"); |
| updateServiceWithCustomProperty(); |
| LOG.info("<== ServiceDBStore.getServiceUpgraded()"); |
| } |
| private void updateServiceWithCustomProperty() { |
| LOG.info("Adding custom properties to services"); |
| SearchFilter filter = new SearchFilter(); |
| try { |
| List<RangerService> lstRangerService = getServices(filter); |
| for(RangerService rangerService : lstRangerService){ |
| String serviceUser = PropertiesUtil.getProperty("ranger.plugins."+rangerService.getType()+".serviceuser"); |
| if(!StringUtils.isEmpty(serviceUser)){ |
| boolean chkServiceUpdate = false; |
| LOG.debug("customproperty = " + rangerService.getConfigs().get(ServiceREST.Allowed_User_List_For_Download) + " for service = " + rangerService.getName()); |
| if(!rangerService.getConfigs().containsKey(ServiceREST.Allowed_User_List_For_Download)){ |
| rangerService.getConfigs().put(ServiceREST.Allowed_User_List_For_Download, serviceUser); |
| chkServiceUpdate = true; |
| } |
| if((!rangerService.getConfigs().containsKey(ServiceREST.Allowed_User_List_For_Grant_Revoke)) && (rangerService.getType().equalsIgnoreCase("hbase") || rangerService.getType().equalsIgnoreCase("hive"))){ |
| rangerService.getConfigs().put(ServiceREST.Allowed_User_List_For_Grant_Revoke, serviceUser); |
| chkServiceUpdate = true; |
| } |
| if(!rangerService.getConfigs().containsKey(TagREST.Allowed_User_List_For_Tag_Download)){ |
| rangerService.getConfigs().put(TagREST.Allowed_User_List_For_Tag_Download, serviceUser); |
| chkServiceUpdate = true; |
| } |
| if(chkServiceUpdate){ |
| updateService(rangerService, null); |
| if(LOG.isDebugEnabled()){ |
| LOG.debug("Updated service "+rangerService.getName()+" with custom properties in secure environment"); |
| } |
| } |
| } |
| } |
| } catch (Throwable e) { |
| LOG.fatal("updateServiceWithCustomProperty failed with exception : "+e.getMessage()); |
| } |
| } |
| |
| private String getAuditMode(String serviceTypeName, String serviceName) { |
| RangerConfiguration config = RangerConfiguration.getInstance(); |
| String ret = config.get("ranger.audit.global.mode"); |
| if (StringUtils.isNotBlank(ret)) { |
| return ret; |
| } |
| ret = config.get("ranger.audit.servicedef." + serviceTypeName + ".mode"); |
| if (StringUtils.isNotBlank(ret)) { |
| return ret; |
| } |
| ret = config.get("ranger.audit.service." + serviceName + ".mode"); |
| if (StringUtils.isNotBlank(ret)) { |
| return ret; |
| } |
| return RangerPolicyEngine.AUDIT_DEFAULT; |
| } |
| |
| private void createGenericUsers() { |
| VXUser genericUser = new VXUser(); |
| |
| genericUser.setName(RangerPolicyEngine.USER_CURRENT); |
| genericUser.setDescription(RangerPolicyEngine.USER_CURRENT); |
| xUserService.createXUserWithOutLogin(genericUser); |
| |
| genericUser.setName(RangerPolicyEngine.RESOURCE_OWNER); |
| genericUser.setDescription(RangerPolicyEngine.RESOURCE_OWNER); |
| xUserService.createXUserWithOutLogin(genericUser); |
| } |
| |
| public boolean isServiceAdminUser(String serviceName, String userName) { |
| boolean ret=false; |
| XXServiceConfigMap cfgSvcAdminUsers = daoMgr.getXXServiceConfigMap().findByServiceNameAndConfigKey(serviceName, SERVICE_ADMIN_USERS); |
| String svcAdminUsers = cfgSvcAdminUsers != null ? cfgSvcAdminUsers.getConfigvalue() : null; |
| if (svcAdminUsers != null) { |
| for (String svcAdminUser : svcAdminUsers.split(",")) { |
| if (userName.equals(svcAdminUser)) { |
| ret=true; |
| break; |
| } |
| } |
| } |
| return ret; |
| } |
| |
| public static class ServiceVersionUpdater implements Runnable { |
| final Long serviceId; |
| final RangerDaoManager daoManager; |
| final VERSION_TYPE versionType; |
| |
| public ServiceVersionUpdater(RangerDaoManager daoManager, Long serviceId, VERSION_TYPE versionType ) { |
| this.serviceId = serviceId; |
| this.daoManager = daoManager; |
| this.versionType = versionType; |
| } |
| @Override |
| public void run() { |
| ServiceDBStore.persistVersionChange(this.daoManager, this.serviceId, this.versionType); |
| } |
| } |
| } |