This is an automated email from the ASF dual-hosted git repository.

szita pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new 8c13be61c6 HIVE-26230: Option to URL encode special chars in 
hbase.column.mapping that are valid HBase column family chars (#3314) (Adam 
Szita, reviewed by Peter Vary)
8c13be61c6 is described below

commit 8c13be61c65211b15bf87bb26db1f03feef2c714
Author: Adam Szita <[email protected]>
AuthorDate: Wed Jun 1 22:41:53 2022 +0200

    HIVE-26230: Option to URL encode special chars in hbase.column.mapping that 
are valid HBase column family chars (#3314) (Adam Szita, reviewed by Peter Vary)
---
 common/src/java/org/apache/hadoop/hive/conf/HiveConf.java |  4 ++++
 .../org/apache/hadoop/hive/hbase/HBaseStorageHandler.java | 14 +++++++++++---
 .../apache/hadoop/hive/hbase/TestHBaseStorageHandler.java | 15 ++++++++++++++-
 3 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java 
b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
index a0cd44583c..68564afa63 100644
--- a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
+++ b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
@@ -3471,6 +3471,10 @@ public class HiveConf extends Configuration {
     HIVE_HBASE_SNAPSHOT_NAME("hive.hbase.snapshot.name", null, "The HBase 
table snapshot name to use."),
     HIVE_HBASE_SNAPSHOT_RESTORE_DIR("hive.hbase.snapshot.restoredir", "/tmp", 
"The directory in which to " +
         "restore the HBase table snapshot."),
+    
HIVE_SECURITY_HBASE_URLENCODE_AUTHORIZATION_URI("hive.security.hbase.urlencode.authorization.uri",
 false,
+        "When true it URL encodes the URI generated by HBaseStorageHandler for 
authorization. The URI consists of the" +
+        "HBase table name, column family, etc. and may contain characters that 
need encoding, such as #. If set to " +
+        "true, the corresponding Ranger policies need to be in URL encoded 
format too."),
 
     // For Kudu storage handler
     HIVE_KUDU_MASTER_ADDRESSES_DEFAULT("hive.kudu.master.addresses.default", 
"localhost:7050",
diff --git 
a/hbase-handler/src/java/org/apache/hadoop/hive/hbase/HBaseStorageHandler.java 
b/hbase-handler/src/java/org/apache/hadoop/hive/hbase/HBaseStorageHandler.java
index b5cecccd49..24b2ec9393 100644
--- 
a/hbase-handler/src/java/org/apache/hadoop/hive/hbase/HBaseStorageHandler.java
+++ 
b/hbase-handler/src/java/org/apache/hadoop/hive/hbase/HBaseStorageHandler.java
@@ -78,6 +78,8 @@ import org.slf4j.LoggerFactory;
 
 import com.codahale.metrics.MetricRegistry;
 
+import static 
org.apache.hadoop.hive.conf.HiveConf.ConfVars.HIVE_SECURITY_HBASE_URLENCODE_AUTHORIZATION_URI;
+
 /**
  * HBaseStorageHandler provides a HiveStorageHandler implementation for
  * HBase.
@@ -308,9 +310,15 @@ public class HBaseStorageHandler extends 
DefaultStorageHandler
     return new URI(URIString);
   }
 
-  private static String encodeString(String rawString) {
-    // Only url encode hash code value for now
-    return rawString != null ? rawString.replace("#", "%23") : null;
+  private String encodeString(String rawString) {
+    if (rawString == null) {
+      return null;
+    }
+    if (HiveConf.getBoolVar(jobConf, 
HIVE_SECURITY_HBASE_URLENCODE_AUTHORIZATION_URI)) {
+      return 
HiveConf.EncoderDecoderFactory.URL_ENCODER_DECODER.encode(rawString);
+    } else {
+      return rawString.replace("#", "%23");
+    }
   }
 
   /**
diff --git 
a/hbase-handler/src/test/org/apache/hadoop/hive/hbase/TestHBaseStorageHandler.java
 
b/hbase-handler/src/test/org/apache/hadoop/hive/hbase/TestHBaseStorageHandler.java
index b12df94f7f..25ddd3219f 100644
--- 
a/hbase-handler/src/test/org/apache/hadoop/hive/hbase/TestHBaseStorageHandler.java
+++ 
b/hbase-handler/src/test/org/apache/hadoop/hive/hbase/TestHBaseStorageHandler.java
@@ -101,8 +101,17 @@ public class TestHBaseStorageHandler {
     serdeParams.put("hbase.zookeeper.property.clientPort", "8765");
     serdeParams.put("hbase.table.name", "my#tbl");
     serdeParams.put("hbase.columns.mapping", "myco#lumns");
+
+    // default configuration
     URI uri = checkURIForAuth(createMockTable(serdeParams));
     Assert.assertEquals("hbase://testhost:8765/my%23tbl/myco%23lumns", 
uri.toString());
+
+    // full URL encoding turned on
+    serdeParams.put("hbase.columns.mapping", "myco#lumn\ns");
+    HiveConf hiveConf = new HiveConf();
+    
hiveConf.setBoolVar(HiveConf.ConfVars.HIVE_SECURITY_HBASE_URLENCODE_AUTHORIZATION_URI,
 true);
+    uri = checkURIForAuth(createMockTable(serdeParams), new JobConf(hiveConf));
+    Assert.assertEquals("hbase://testhost:8765/my%23tbl/myco%23lumn%0As", 
uri.toString());
   }
 
   private TableDesc getHBaseTableDesc() {
@@ -117,8 +126,12 @@ public class TestHBaseStorageHandler {
   }
 
   private static URI checkURIForAuth(Table table) throws URISyntaxException {
+    return checkURIForAuth(table, new JobConf(new HiveConf()));
+  }
+
+  private static URI checkURIForAuth(Table table, JobConf jobConf) throws 
URISyntaxException {
     HBaseStorageHandler hbaseStorageHandler = new HBaseStorageHandler();
-    hbaseStorageHandler.setConf(new JobConf(new HiveConf()));
+    hbaseStorageHandler.setConf(jobConf);
     return hbaseStorageHandler.getURIForAuth(table);
   }
 

Reply via email to