This is an automated email from the ASF dual-hosted git repository. volodymyr pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/drill.git
commit b2e3ba8b97848fadf9f215d3d2abcb2ea6d68165 Author: Stefan Hammer <[email protected]> AuthorDate: Fri Dec 13 13:38:35 2019 +0100 DRILL-6332: Allow to provide two-component Kerberos principals closes #1931 --- .../java/org/apache/drill/common/KerberosUtil.java | 27 ++++++++++++++-------- .../apache/drill/exec/server/BootStrapContext.java | 7 +++--- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/common/src/main/java/org/apache/drill/common/KerberosUtil.java b/common/src/main/java/org/apache/drill/common/KerberosUtil.java index 387f43d..368e493 100644 --- a/common/src/main/java/org/apache/drill/common/KerberosUtil.java +++ b/common/src/main/java/org/apache/drill/common/KerberosUtil.java @@ -38,29 +38,38 @@ public final class KerberosUtil { * Returns principal of format primary/instance@REALM. * * @param primary non-null primary component - * @param instance non-null instance component + * @param instance non-null instance component, can be empty string * @param realm non-null realm component - * @return principal of format primary/instance@REALM + * @return principal of format primary/instance@REALM or primary@REALM */ public static String getPrincipalFromParts(final String primary, final String instance, final String realm) { - return checkNotNull(primary) + "/" + - checkNotNull(instance) + "@" + - checkNotNull(realm); + checkNotNull(primary); + checkNotNull(realm); + + return primary + + ((instance != "") ? "/" + instance : "") + + "@" + realm; } /** - * Expects principal of the format primary/instance@REALM. + * Expects principal of the format primary/instance@REALM or primary@REALM. * * @param principal principal * @return components */ public static String[] splitPrincipalIntoParts(final String principal) { final String[] components = principal.split("[/@]"); - checkState(components.length == 3); + checkState(components.length < 4); + checkState(components.length > 1); checkNotNull(components[0]); checkNotNull(components[1]); - checkNotNull(components[2]); - return components; + + if (components.length == 2) { + return new String[] { components[0], "", components[1] }; + } else { + checkNotNull(components[2]); + return components; + } } public static String canonicalizeInstanceName(String instanceName, final String canonicalName) { diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java index 466dc14..74a5d96 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java @@ -135,10 +135,11 @@ public class BootStrapContext implements AutoCloseable { final String parts[] = KerberosUtil.splitPrincipalIntoParts(principal); if (parts.length != 3) { throw new DrillbitStartupException( - String.format("Invalid %s, Drill service principal must be of format: primary/instance@REALM", - ExecConstants.SERVICE_PRINCIPAL)); + String.format("Invalid %s, Drill service principal must be of format 'primary/instance@REALM' or 'primary@REALM'", + ExecConstants.SERVICE_PRINCIPAL)); } - parts[1] = KerberosUtil.canonicalizeInstanceName(parts[1], hostName); + + parts[1] = (parts[1] == "") ? "" : KerberosUtil.canonicalizeInstanceName(parts[1], hostName); final String canonicalizedPrincipal = KerberosUtil.getPrincipalFromParts(parts[0], parts[1], parts[2]); final String keytab = config.getString(ExecConstants.SERVICE_KEYTAB_LOCATION);
