Repository: incubator-ranger
Updated Branches:
  refs/heads/master 6222b9d09 -> a7ca7c674


RANGER-178 - Solr Plugin - Initial code working

Project: http://git-wip-us.apache.org/repos/asf/incubator-ranger/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ranger/commit/a7ca7c67
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ranger/tree/a7ca7c67
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ranger/diff/a7ca7c67

Branch: refs/heads/master
Commit: a7ca7c67488cddcd85364bbfcb91fc9f36d1b504
Parents: 6222b9d
Author: Don Bosco Durai <[email protected]>
Authored: Fri May 15 14:06:42 2015 -0700
Committer: Don Bosco Durai <[email protected]>
Committed: Fri May 15 14:06:42 2015 -0700

----------------------------------------------------------------------
 .../plugin/audit/RangerDefaultAuditHandler.java |  37 ++-
 .../audit/RangerMultiResourceAuditHandler.java  |  73 +++++
 .../service-defs/ranger-servicedef-solr.json    |  68 ++---
 plugin-solr/pom.xml                             | 107 ++++---
 .../solr/authorizer/RangerSolrAuthorizer.java   | 303 ++++++++++++++++++-
 .../ranger/services/solr/RangerServiceSolr.java |   2 +-
 .../services/solr/client/ServiceSolrClient.java |   2 +-
 .../solr/client/ServiceSolrConnectionMgr.java   |   4 +-
 plugin-yarn/.gitignore                          |   1 +
 pom.xml                                         |  11 +-
 src/main/assembly/plugin-solr.xml               |   9 -
 11 files changed, 486 insertions(+), 131 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a7ca7c67/agents-common/src/main/java/org/apache/ranger/plugin/audit/RangerDefaultAuditHandler.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/audit/RangerDefaultAuditHandler.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/audit/RangerDefaultAuditHandler.java
index fd22852..0d38224 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/audit/RangerDefaultAuditHandler.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/audit/RangerDefaultAuditHandler.java
@@ -100,13 +100,12 @@ public class RangerDefaultAuditHandler implements 
RangerAccessResultProcessor {
                        ret.setAccessType(request.getAction());
                        ret.setAccessResult((short)(result.getIsAllowed() ? 1 : 
0));
                        ret.setPolicyId(result.getPolicyId());
-                       ret.setAclEnforcer("ranger-acl"); // TODO: review
                        ret.setAction(request.getAccessType());
                        ret.setClientIP(request.getClientIPAddress());
                        ret.setClientType(request.getClientType());
-                       ret.setAgentHostname(null);
-                       ret.setAgentId(null);
-                       ret.setEventId(null);
+
+                       populateDefaults(ret);
+
                }
 
                if(LOG.isDebugEnabled()) {
@@ -153,17 +152,7 @@ public class RangerDefaultAuditHandler implements 
RangerAccessResultProcessor {
                }
 
                if(auditEvent != null) {
-                       if (auditEvent.getAgentHostname() == null || 
auditEvent.getAgentHostname().isEmpty()) {
-                               
auditEvent.setAgentHostname(MiscUtil.getHostname());
-                       }
-
-                       if (auditEvent.getLogType() == null || 
auditEvent.getLogType().isEmpty()) {
-                               auditEvent.setLogType("RangerAudit");
-                       }
-
-                       if (auditEvent.getEventId() == null || 
auditEvent.getEventId().isEmpty()) {
-                               
auditEvent.setEventId(MiscUtil.generateUniqueId());
-                       }
+                       populateDefaults(auditEvent);
                        AuditProviderFactory.getAuditProvider().log(auditEvent);
                }
 
@@ -172,6 +161,24 @@ public class RangerDefaultAuditHandler implements 
RangerAccessResultProcessor {
                }
        }
 
+       private void populateDefaults(AuthzAuditEvent auditEvent) {
+               if( auditEvent.getAclEnforcer() == null || 
auditEvent.getAclEnforcer().isEmpty()) {
+                       auditEvent.setAclEnforcer("ranger-acl"); // TODO: review
+               }
+
+               if (auditEvent.getAgentHostname() == null || 
auditEvent.getAgentHostname().isEmpty()) {
+                       auditEvent.setAgentHostname(MiscUtil.getHostname());
+               }
+
+               if (auditEvent.getLogType() == null || 
auditEvent.getLogType().isEmpty()) {
+                       auditEvent.setLogType("RangerAudit");
+               }
+
+               if (auditEvent.getEventId() == null || 
auditEvent.getEventId().isEmpty()) {
+                       auditEvent.setEventId(MiscUtil.generateUniqueId());
+               }               
+       }
+
        public void logAuthzAudits(Collection<AuthzAuditEvent> auditEvents) {
                if(LOG.isDebugEnabled()) {
                        LOG.debug("==> 
RangerDefaultAuditHandler.logAuthzAudits(" + auditEvents + ")");

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a7ca7c67/agents-common/src/main/java/org/apache/ranger/plugin/audit/RangerMultiResourceAuditHandler.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/audit/RangerMultiResourceAuditHandler.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/audit/RangerMultiResourceAuditHandler.java
new file mode 100644
index 0000000..f40d39f
--- /dev/null
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/audit/RangerMultiResourceAuditHandler.java
@@ -0,0 +1,73 @@
+/*
+ * 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.plugin.audit;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.ranger.audit.model.AuthzAuditEvent;
+import org.apache.ranger.plugin.policyengine.RangerAccessResult;
+
+/**
+ * This class should be generated per request and flushed at the end of the
+ * request
+ */
+public class RangerMultiResourceAuditHandler extends RangerDefaultAuditHandler 
{
+
+       Collection<AuthzAuditEvent> auditEvents = new 
ArrayList<AuthzAuditEvent>();
+       boolean deniedExists = false;
+
+       public RangerMultiResourceAuditHandler() {
+       }
+
+
+       @Override
+       public void logAuthzAudit(AuthzAuditEvent auditEvent) {
+               auditEvents.add(auditEvent);
+       }
+
+       @Override
+       public void logAuthzAudits(Collection<AuthzAuditEvent> auditEvents) {
+               auditEvents.addAll(auditEvents);
+       }
+
+       public void flushAudit() {
+               try {
+                       boolean deniedExists = false;
+                       // First iterate to see if there are any denied
+                       for (AuthzAuditEvent auditEvent : auditEvents) {
+                               if (auditEvent.getAccessResult() == 0) {
+                                       deniedExists = true;
+                                       break;
+                               }
+                       }
+
+                       for (AuthzAuditEvent auditEvent : auditEvents) {
+                               if (deniedExists && 
auditEvent.getAccessResult() != 0) {
+                                       continue;
+                               }
+
+                               super.logAuthzAudit(auditEvent);
+                       }
+               } catch (Throwable t) {
+
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a7ca7c67/agents-common/src/main/resources/service-defs/ranger-servicedef-solr.json
----------------------------------------------------------------------
diff --git 
a/agents-common/src/main/resources/service-defs/ranger-servicedef-solr.json 
b/agents-common/src/main/resources/service-defs/ranger-servicedef-solr.json
index c2710e7..2b492ae 100644
--- a/agents-common/src/main/resources/service-defs/ranger-servicedef-solr.json
+++ b/agents-common/src/main/resources/service-defs/ranger-servicedef-solr.json
@@ -5,7 +5,7 @@
        "description":"Solr",
        "resources":[
                {
-                       "itemId": 1,
+                       "itemId":100,
                        "name":"collection",
                        "type":"string",
                        "level":10,
@@ -15,51 +15,36 @@
                        "recursiveSupported":false,
                        "excludesSupported":true,
                        
"matcher":"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
-                       "matcherOptions":{ "wildCard":true, "ignoreCase":true },
+                       "matcherOptions":{
+                               "wildCard":true,
+                               "ignoreCase":true
+                       },
                        "validationRegEx":"",
                        "validationMessage":"",
                        "uiHint":"",
                        "label":"Solr Collection",
                        "description":"Solr Collection"
-               },
-               {
-                       "itemId": 2,
-                       "name":"field",
-                       "type":"string",
-                       "level":20,
-                       "parent":"collection",
-                       "mandatory":true,
-                       "lookupSupported":true,
-                       "recursiveSupported":false,
-                       "excludesSupported":true,
-                       
"matcher":"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
-                       "matcherOptions":{ "wildCard":true, "ignoreCase":true },
-                       "validationRegEx":"",
-                       "validationMessage":"",
-                       "uiHint":"",
-                       "label":"Field",
-                       "description":"Field"
                }
                
        ],
        "accessTypes":[
                {
-                       "itemId": 1,
-                       "name":"create",
-                       "label":"Create"
+                       "itemId":100,
+                       "name":"query",
+                       "label":"Query"
                },
                {
-                       "itemId": 2,
+                       "itemId":200,
                        "name":"update",
                        "label":"Update"
                },
                {
-                       "itemId": 3,
-                       "name":"query",
-                       "label":"Query"
+                       "itemId":300,
+                       "name":"others",
+                       "label":"Others"
                },
                {
-                       "itemId": 4,
+                       "itemId":900,
                        "name":"solr_admin",
                        "label":"Solr Admin"
                }
@@ -67,7 +52,7 @@
        ],
        "configs":[
                {
-                       "itemId": 1,
+                       "itemId":100,
                        "name":"username",
                        "type":"string",
                        "mandatory":true,
@@ -77,7 +62,7 @@
                        "label":"Username"
                },
                {
-                       "itemId": 2,
+                       "itemId":200,
                        "name":"password",
                        "type":"password",
                        "mandatory":true,
@@ -87,7 +72,7 @@
                        "label":"Password"
                },
                {
-                       "itemId": 3,
+                       "itemId":400,
                        "name":"solr.url",
                        "type":"string",
                        "mandatory":true,
@@ -98,14 +83,14 @@
                        "label":"Solr URL"
                },
                {
-                       "itemId": 4,
+                       "itemId":500,
                        "name":"commonNameForCertificate",
                        "type":"string",
                        "mandatory":false,
                        "validationRegEx":"",
                        "validationMessage":"",
                        "uiHint":"",
-                       "label":"Common Name for Certificate"
+                       "label":"Ranger Plugin SSL CName"
                }
                
        ],
@@ -117,15 +102,18 @@
        ],
        "policyConditions":[
                {
-                       "itemId": 1,
-                       "name": "ip-range",
-                       "evaluator": 
"org.apache.ranger.plugin.conditionevaluator.RangerIpMatcher",
-                       "evaluatorOptions": { },
+                       "itemId":100,
+                       "name":"ip-range",
+                       
"evaluator":"org.apache.ranger.plugin.conditionevaluator.RangerIpMatcher",
+                       "evaluatorOptions":{
+                               
+                       },
                        "validationRegEx":"",
-                       "validationMessage": "",
+                       "validationMessage":"",
                        "uiHint":"",
-                       "label": "IP Address Range",
-                       "description": "IP Address Range"
+                       "label":"IP Address Range",
+                       "description":"IP Address Range"
                }
+               
        ]
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a7ca7c67/plugin-solr/pom.xml
----------------------------------------------------------------------
diff --git a/plugin-solr/pom.xml b/plugin-solr/pom.xml
index 54bcafa..e49865e 100644
--- a/plugin-solr/pom.xml
+++ b/plugin-solr/pom.xml
@@ -1,56 +1,55 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>security_plugins.ranger-solr-plugin</groupId>
-  <artifactId>ranger-solr-plugin</artifactId>
-  <name>SOLR Security Plugin</name>
-  <description>SOLR Security Plugin</description>
-  <packaging>jar</packaging>
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-  </properties>
-  <parent>
-     <groupId>org.apache.ranger</groupId>
-     <artifactId>ranger</artifactId>
-     <version>0.5.0</version>
-     <relativePath>..</relativePath>
-  </parent>
-  <dependencies>
-    <dependency>
-      <groupId>security_plugins.ranger-plugins-common</groupId>
-      <artifactId>ranger-plugins-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>security_plugins.ranger-plugins-audit</groupId>
-      <artifactId>ranger-plugins-audit</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.ranger</groupId>
-      <artifactId>credentialbuilder</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.ranger</groupId>
-      <artifactId>ranger_solrj</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-  </dependencies>
+<!-- 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. -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+       <modelVersion>4.0.0</modelVersion>
+       <groupId>security_plugins.ranger-solr-plugin</groupId>
+       <artifactId>ranger-solr-plugin</artifactId>
+       <name>SOLR Security Plugin</name>
+       <description>SOLR Security Plugin</description>
+       <packaging>jar</packaging>
+       <properties>
+               
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+       </properties>
+       <parent>
+               <groupId>org.apache.ranger</groupId>
+               <artifactId>ranger</artifactId>
+               <version>0.5.0</version>
+               <relativePath>..</relativePath>
+       </parent>
+       <dependencies>
+               <dependency>
+                       
<groupId>security_plugins.ranger-plugins-common</groupId>
+                       <artifactId>ranger-plugins-common</artifactId>
+                       <version>${project.version}</version>
+               </dependency>
+               <dependency>
+                       <groupId>security_plugins.ranger-plugins-audit</groupId>
+                       <artifactId>ranger-plugins-audit</artifactId>
+                       <version>${project.version}</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.ranger</groupId>
+                       <artifactId>credentialbuilder</artifactId>
+                       <version>${project.version}</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.solr</groupId>
+                       <artifactId>solr-core</artifactId>
+                       <version>6.0</version>
+                       <scope>system</scope>
+                       
<systemPath>/Users/bdurai/svn/solr/trunk/solr/build/solr-core/solr-core-6.0.0-SNAPSHOT.jar</systemPath>
+               </dependency>
+               <!-- <dependency> <groupId>org.apache.solr</groupId> 
<artifactId>solr-core</artifactId> 
+                       <version>${solr.version}</version> </dependency> -->
+       </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a7ca7c67/plugin-solr/src/main/java/org/apache/ranger/authorization/solr/authorizer/RangerSolrAuthorizer.java
----------------------------------------------------------------------
diff --git 
a/plugin-solr/src/main/java/org/apache/ranger/authorization/solr/authorizer/RangerSolrAuthorizer.java
 
b/plugin-solr/src/main/java/org/apache/ranger/authorization/solr/authorizer/RangerSolrAuthorizer.java
index 8ccc703..de786d7 100644
--- 
a/plugin-solr/src/main/java/org/apache/ranger/authorization/solr/authorizer/RangerSolrAuthorizer.java
+++ 
b/plugin-solr/src/main/java/org/apache/ranger/authorization/solr/authorizer/RangerSolrAuthorizer.java
@@ -1,4 +1,3 @@
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -20,18 +19,306 @@
 
 package org.apache.ranger.authorization.solr.authorizer;
 
+import java.io.IOException;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.ranger.authorization.hadoop.config.RangerConfiguration;
+import org.apache.ranger.authorization.utils.StringUtil;
+import org.apache.ranger.plugin.audit.RangerMultiResourceAuditHandler;
+import org.apache.ranger.plugin.policyengine.RangerAccessRequestImpl;
+import org.apache.ranger.plugin.policyengine.RangerAccessResourceImpl;
+import org.apache.ranger.plugin.policyengine.RangerAccessResult;
+import org.apache.ranger.plugin.service.RangerBasePlugin;
+import org.apache.solr.security.AuthorizationContext.RequestType;
+import org.apache.solr.security.AuthorizationPlugin;
+import org.apache.solr.security.AuthorizationResponse;
+import org.apache.solr.security.AuthorizationContext;
+import org.apache.solr.security.AuthorizationContext.CollectionRequest;
+
+public class RangerSolrAuthorizer implements AuthorizationPlugin {
+       private static final Log logger = LogFactory
+                       .getLog(RangerSolrAuthorizer.class);
+
+       public static final String PROP_USE_PROXY_IP = 
"xasecure.solr.use_proxy_ip";
+       public static final String PROP_PROXY_IP_HEADER = 
"xasecure.solr.proxy_ip_header";
+
+       public static final String KEY_COLLECTION = "collection";
+
+       public static final String ACCESS_TYPE_CREATE = "create";
+       public static final String ACCESS_TYPE_UPDATE = "update";
+       public static final String ACCESS_TYPE_QUERY = "query";
+       public static final String ACCESS_TYPE_OTHER = "other";
+       public static final String ACCESS_TYPE_ADMIN = "admin";
+
+       private static volatile RangerBasePlugin solrPlugin = null;
+
+       boolean useProxyIP = false;
+       String proxyIPHeader = "HTTP_X_FORWARDED_FOR";
+
+       public RangerSolrAuthorizer() {
+               logger.info("RangerSolrAuthorizer()");
+               if (solrPlugin == null) {
+                       logger.info("RangerSolrAuthorizer(): init called");
+                       solrPlugin = new RangerBasePlugin("solr", "solr");
+               }
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see 
org.apache.solr.security.SolrAuthorizationPlugin#init(java.util.Map)
+        */
+       @Override
+       public void init(Map<String, Object> initInfo) {
+               logger.info("init()");
+
+               try {
+                       solrPlugin.init();
+
+                       useProxyIP = 
RangerConfiguration.getInstance().getBoolean(
+                                       PROP_USE_PROXY_IP, useProxyIP);
+                       proxyIPHeader = RangerConfiguration.getInstance().get(
+                                       PROP_PROXY_IP_HEADER, proxyIPHeader);
+
+               } catch (Throwable t) {
+                       logger.fatal("Error init", t);
+               }
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see java.io.Closeable#close()
+        */
+       @Override
+       public void close() throws IOException {
+               logger.info("close() called");
+               try {
+                       solrPlugin.cleanup();
+               } catch (Throwable t) {
+                       logger.error("Error cleaning up Ranger plugin. Ignoring 
error", t);
+               }
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see
+        * org.apache.solr.security.SolrAuthorizationPlugin#authorize(org.apache
+        * .solr.security.SolrRequestContext)
+        */
+       @Override
+       public AuthorizationResponse authorize(AuthorizationContext context) {
+               // TODO: Change this to Debug only
+               if (logger.isInfoEnabled()) {
+                       logAuthorizationConext(context);
+               }
+
+               RangerMultiResourceAuditHandler auditHandler = new 
RangerMultiResourceAuditHandler();
+
+               String userName = null;
+               Set<String> userGroups = null;
+               String ip = null;
+               Date eventTime = StringUtil.getUTCDate();
+
+               // Set the User and Groups
+               Principal principal = context.getUserPrincipal();
+               if (principal != null) {
+                       userName = 
StringUtils.substringBefore(principal.getName(), "@");
+                       userGroups = getGroupsForUser(userName);
+               }
+
+               // // Set the IP
+               if (useProxyIP) {
+                       ip = context.getHttpHeader(proxyIPHeader);
+               }
+               if (ip == null) {
+                       ip = context.getHttpHeader("REMOTE_ADDR");
+               }
+
+               String requestData = context.getResource() + ":" + 
context.getParams();
+
+               // Create the list of requests for access check. Each field is 
broken
+               // into a request
+               List<RangerAccessRequestImpl> rangerRequests = new 
ArrayList<RangerAccessRequestImpl>();
+               for (CollectionRequest collectionRequest : context
+                               .getCollectionRequests()) {
+
+                       List<RangerAccessRequestImpl> requestsForCollection = 
createRequests(
+                                       userName, userGroups, ip, eventTime, 
context,
+                                       collectionRequest, requestData);
+                       rangerRequests.addAll(requestsForCollection);
+               }
+
+               boolean isDenied = false;
+               try {
+                       // Let's check the access for each request/resource
+                       for (RangerAccessRequestImpl rangerRequest : 
rangerRequests) {
+                               RangerAccessResult result = 
solrPlugin.isAccessAllowed(
+                                               rangerRequest, auditHandler);
+                               if (result == null || !result.getIsAllowed()) {
+                                       isDenied = true;
+                                       // rejecting on first failure
+                                       break;
+                               }
+                       }
+               } finally {
+                       auditHandler.flushAudit();
+               }
+
+               AuthorizationResponse response = null;
+               if (isDenied) {
+                       response = new AuthorizationResponse(403);
+               } else {
+                       response = new AuthorizationResponse(200);
+               }
+               return response;
+       }
+
+       /**
+        * @param context
+        */
+       private void logAuthorizationConext(AuthorizationContext context) {
+               String collections = "";
+               int i = -1;
+               for (CollectionRequest collectionRequest : context
+                               .getCollectionRequests()) {
+                       i++;
+                       if (i > 0) {
+                               collections += ",";
+                       }
+                       collections += collectionRequest.collectionName;
+               }
+
+               String headers = "";
+               i = -1;
+               @SuppressWarnings("unchecked")
+               Enumeration<String> eList = context.getHeaderNames();
+               while (eList.hasMoreElements()) {
+                       i++;
+                       if (i > 0) {
+                               headers += ",";
+                       }
+                       String header = eList.nextElement();
+                       String value = context.getHttpHeader(header);
+                       headers += header + "=" + value;
+               }
+
+               String ipAddress = 
context.getHttpHeader("HTTP_X_FORWARDED_FOR");
+
+               if (ipAddress == null) {
+                       ipAddress = context.getHttpHeader("REMOTE_ADDR");
+               }
+
+               Principal principal = context.getUserPrincipal();
+               String userName = null;
+               if (principal != null) {
+                       userName = principal.getName();
+                       userName = StringUtils.substringBefore(userName, "@");
+               }
+
+               logger.info("AuthorizationContext: context.getResource()="
+                               + context.getResource() + ", solarParams="
+                               + context.getParams() + ", requestType="
+                               + context.getRequestType() + ", userPrincipal="
+                               + context.getUserPrincipal() + ", userName=" + 
userName
+                               + ", ipAddress=" + ipAddress + ", collections=" 
+ collections
+                               + ", headers=" + headers);
+
+       }
+
+       /**
+        * @param userName
+        * @param userGroups
+        * @param ip
+        * @param eventTime
+        * @param context
+        * @param collectionRequest
+        * @param requestData
+        * @return
+        */
+       private List<RangerAccessRequestImpl> createRequests(String userName,
+                       Set<String> userGroups, String ip, Date eventTime,
+                       AuthorizationContext context, CollectionRequest 
collectionRequest,
+                       String requestData) {
+
+               List<RangerAccessRequestImpl> requests = new 
ArrayList<RangerAccessRequestImpl>();
+               String accessType = mapToRangerAccessType(context);
+               String action = accessType;
+
+               if (collectionRequest.collectionName != null) {
+                       RangerAccessRequestImpl rangerRequest = 
createBaseRequest(userName,
+                                       userGroups, ip, eventTime);
+                       RangerAccessResourceImpl rangerResource = new 
RangerAccessResourceImpl();
+                       rangerResource.setValue(KEY_COLLECTION,
+                                       collectionRequest.collectionName);
+                       rangerRequest.setResource(rangerResource);
+                       rangerRequest.setAccessType(accessType);
+                       rangerRequest.setAction(action);
+
+                       requests.add(rangerRequest);
+               } else {
+                       logger.fatal("Can't create RangerRequest oject. 
userName="
+                                       + userName + ", accessType=" + 
accessType + ", ip=" + ip
+                                       + ", collectionRequest=" + 
collectionRequest);
+               }
+
+               return requests;
+       }
+
+       private RangerAccessRequestImpl createBaseRequest(String userName,
+                       Set<String> userGroups, String ip, Date eventTime) {
+               RangerAccessRequestImpl rangerRequest = new 
RangerAccessRequestImpl();
+               if (userName != null && !userName.isEmpty()) {
+                       rangerRequest.setUser(userName);
+               }
+               if (userGroups != null && userGroups.size() > 0) {
+                       rangerRequest.setUserGroups(userGroups);
+               }
+               if (ip != null && !ip.isEmpty()) {
+                       rangerRequest.setClientIPAddress(ip);
+               }
+               rangerRequest.setAccessTime(eventTime);
+               return rangerRequest;
+       }
 
-public class RangerSolrAuthorizer /*SolrAuthorizationPlugin*/ {
-    public static final String ACCESS_TYPE_CREATE = "create";
-    public static final String ACCESS_TYPE_UPDATE  = "update";
-    public static final String ACCESS_TYPE_QUERY  = "query";
-    public static final String ACCESS_TYPE_ADMIN       = "admin";
+       /**
+        * @param name
+        * @return
+        */
+       private Set<String> getGroupsForUser(String name) {
+               // TODO: Need to implement this method
 
-       private static final Log LOG = 
LogFactory.getLog(RangerSolrAuthorizer.class);
+               return null;
+       }
 
-    //private static volatile RangerSolrPlugin solrPlugin = null;
+       String mapToRangerAccessType(AuthorizationContext context) {
+               String accessType = ACCESS_TYPE_OTHER;
 
+               RequestType requestType = context.getRequestType();
+               if (requestType.equals(RequestType.ADMIN)) {
+                       accessType = ACCESS_TYPE_ADMIN;
+               } else if (requestType.equals(RequestType.READ)) {
+                       accessType = ACCESS_TYPE_QUERY;
+               } else if (requestType.equals(RequestType.WRITE)) {
+                       accessType = ACCESS_TYPE_UPDATE;
+               } else if (requestType.equals(RequestType.UNKNOWN)) {
+                       logger.info("UNKNOWN request type. Mapping it to " + 
accessType);
+                       accessType = ACCESS_TYPE_OTHER;
+               } else {
+                       logger.info("Request type is not supported. 
requestType="
+                                       + requestType + ". Mapping it to " + 
accessType);
+               }
+               return accessType;
+       }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a7ca7c67/plugin-solr/src/main/java/org/apache/ranger/services/solr/RangerServiceSolr.java
----------------------------------------------------------------------
diff --git 
a/plugin-solr/src/main/java/org/apache/ranger/services/solr/RangerServiceSolr.java
 
b/plugin-solr/src/main/java/org/apache/ranger/services/solr/RangerServiceSolr.java
index 3a43a9e..1474b29 100644
--- 
a/plugin-solr/src/main/java/org/apache/ranger/services/solr/RangerServiceSolr.java
+++ 
b/plugin-solr/src/main/java/org/apache/ranger/services/solr/RangerServiceSolr.java
@@ -56,7 +56,7 @@ public class RangerServiceSolr extends RangerBaseService {
                                ret = 
ServiceSolrConnectionMgr.testConnection(serviceName,
                                                configs);
                        } catch (Exception e) {
-                               LOG.error("<== RangerServiceSolr.validateConfig 
Error:" + e);
+                               LOG.error("<== RangerServiceSolr.validateConfig 
Error:", e);
                                throw e;
                        }
                }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a7ca7c67/plugin-solr/src/main/java/org/apache/ranger/services/solr/client/ServiceSolrClient.java
----------------------------------------------------------------------
diff --git 
a/plugin-solr/src/main/java/org/apache/ranger/services/solr/client/ServiceSolrClient.java
 
b/plugin-solr/src/main/java/org/apache/ranger/services/solr/client/ServiceSolrClient.java
index 2e6d0ac..6a192f4 100644
--- 
a/plugin-solr/src/main/java/org/apache/ranger/services/solr/client/ServiceSolrClient.java
+++ 
b/plugin-solr/src/main/java/org/apache/ranger/services/solr/client/ServiceSolrClient.java
@@ -51,7 +51,7 @@ public class ServiceSolrClient {
        }
 
        SolrClient solrClient = null;
-       boolean isSolrCloud = false;
+       boolean isSolrCloud = true;
 
        String serviceName = null;
        private static final String errMessage = " You can still save the 
repository and start creating "

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a7ca7c67/plugin-solr/src/main/java/org/apache/ranger/services/solr/client/ServiceSolrConnectionMgr.java
----------------------------------------------------------------------
diff --git 
a/plugin-solr/src/main/java/org/apache/ranger/services/solr/client/ServiceSolrConnectionMgr.java
 
b/plugin-solr/src/main/java/org/apache/ranger/services/solr/client/ServiceSolrConnectionMgr.java
index 874fca5..7eeb5cd 100644
--- 
a/plugin-solr/src/main/java/org/apache/ranger/services/solr/client/ServiceSolrConnectionMgr.java
+++ 
b/plugin-solr/src/main/java/org/apache/ranger/services/solr/client/ServiceSolrConnectionMgr.java
@@ -34,9 +34,11 @@ public class ServiceSolrConnectionMgr {
                        Map<String, String> configs) throws Exception {
                String url = configs.get("solr.url");
                if (url != null) {
+                       //TODO: Determine whether the instance is SolrCloud
+                       boolean isSolrCloud = true;
                        SolrClient solrClient = new HttpSolrClient(url);
                        ServiceSolrClient serviceSolrClient = new 
ServiceSolrClient(
-                                       serviceName, solrClient, false);
+                                       serviceName, solrClient, isSolrCloud);
                        return serviceSolrClient;
                }
                // TODO: Need to add method to create SolrClient using 
ZooKeeper for

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a7ca7c67/plugin-yarn/.gitignore
----------------------------------------------------------------------
diff --git a/plugin-yarn/.gitignore b/plugin-yarn/.gitignore
index ea8c4bf..d9d66d8 100644
--- a/plugin-yarn/.gitignore
+++ b/plugin-yarn/.gitignore
@@ -1 +1,2 @@
 /target
+/bin/

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a7ca7c67/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 27dda4d..0b5608a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -88,7 +88,7 @@
   <module>knox-agent</module>
   <module>storm-agent</module>
   <module>plugin-kafka</module>
-  <module>plugin-solr</module>
+  <!-- <module>plugin-solr</module> -->
   <module>plugin-yarn</module>
   <module>ranger_solrj</module>
   <module>security-admin</module>
@@ -160,7 +160,7 @@
                
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
                
<security-agent-install-dir>hadoop-security/plugins</security-agent-install-dir>
                <slf4j-api.version>1.7.5</slf4j-api.version>
-               <!--<solr.version>5.0.0</solr.version>-->
+               <solr.version>5.1.0</solr.version>
                <ranger.solrj.version>${project.version}</ranger.solrj.version>
                
<springframework.spring.version>2.5.6</springframework.spring.version>
                <!--
@@ -218,6 +218,12 @@
             <module>unixauthnative</module>
           </modules>
       </profile>
+      <profile>
+          <id>solr-security</id>
+         <modules>
+                <module>plugin-solr</module>         
+         </modules>
+      </profile>
   </profiles>
   <distributionManagement>
         <repository>
@@ -482,6 +488,7 @@
           <exclude>**/.externalToolBuilders/*</exclude>
           <exclude>*.patch</exclude>
           <exclude>atlassian-ide-plugin.xml</exclude>
+         <exclude>**/.pydevproject</exclude>
         </excludes>
 
       </configuration>

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/a7ca7c67/src/main/assembly/plugin-solr.xml
----------------------------------------------------------------------
diff --git a/src/main/assembly/plugin-solr.xml 
b/src/main/assembly/plugin-solr.xml
index 954ea52..06844ae 100644
--- a/src/main/assembly/plugin-solr.xml
+++ b/src/main/assembly/plugin-solr.xml
@@ -35,20 +35,11 @@
                 <outputDirectory>/lib</outputDirectory>
                 <unpack>false</unpack>
                 <includes>
-                    
<include>commons-configuration:commons-configuration:jar:${commons.configuration.version}</include>
-                    
<include>org.apache.hadoop:hadoop-common:jar:${hadoop-common.version}</include>
-                    
<include>org.apache.hadoop:hadoop-common-plus:jar:${hadoop-common.version}</include>
                     <include>com.google.code.gson:gson</include>
                     <include>org.eclipse.persistence:eclipselink</include>
                     
<include>org.eclipse.persistence:javax.persistence</include>
-                    <include>commons-collections:commons-collections</include>
                                        
<include>com.sun.jersey:jersey-bundle</include>
-                    
<include>commons-logging:commons-logging:jar:${commons.logging.version}</include>
                     
<include>com.google.guava:guava:jar:${guava.version}</include>
-                   
<include>org.apache.httpcomponents:httpclient:jar:${httpcomponent.httpclient.version}</include>
-                   
<include>org.apache.httpcomponents:httpcore:jar:${httpcomponent.httpcore.version}</include>
-                   
<include>org.apache.httpcomponents:httpmime:jar:${httpcomponent.httpmime.version}</include>
-                   <include>org.noggit:noggit:jar:${noggit.version}</include>
                 </includes>
             </dependencySet>
             <dependencySet>

Reply via email to