diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/client/binding/RegistryUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/client/binding/RegistryUtils.java index 3b28a02..3bc203e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/client/binding/RegistryUtils.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/client/binding/RegistryUtils.java @@ -58,24 +58,47 @@ /** * Buld the user path -switches to the system path if the user is "". * It also cross-converts the username to ascii via punycode - * @param shortname username or "" + * @param username username or "" * @return the path to the user */ - public static String homePathForUser(String shortname) { - Preconditions.checkArgument(shortname != null, "null user"); + public static String homePathForUser(String username) { + Preconditions.checkArgument(username != null, "null user"); // catch recursion - if (shortname.startsWith(RegistryConstants.PATH_USERS)) { - return shortname; + if (username.startsWith(RegistryConstants.PATH_USERS)) { + return username; } - if (shortname.isEmpty()) { + if (username.isEmpty()) { return RegistryConstants.PATH_SYSTEM_SERVICES; } + + // shorten the user name by stripping kerberos overhead + // if it is still present + String shortname = shortenUsername(username); + return RegistryPathUtils.join(RegistryConstants.PATH_USERS, encodeForRegistry(shortname)); } /** + * Strip the realm off a username if needed, and any "/" trail + * @param username user + * @return the shortened username + */ + public static String shortenUsername(String username) { + String shortname = username; + int atSymbol = shortname.indexOf('@'); + if (atSymbol > 0) { + shortname = shortname.substring(0, atSymbol); + } + int slashSymbol = shortname.indexOf('/'); + if (slashSymbol > 0) { + shortname = shortname.substring(0, slashSymbol); + } + return shortname; + } + + /** * Create a service classpath * @param user username or "" * @param serviceClass service name diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/client/impl/zk/RegistryOperationsService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/client/impl/zk/RegistryOperationsService.java index c54c205..7c01bdf 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/client/impl/zk/RegistryOperationsService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/main/java/org/apache/hadoop/registry/client/impl/zk/RegistryOperationsService.java @@ -83,12 +83,12 @@ public RegistryOperationsService(String name, } /** - * Validate a path ... this includes checking that they are DNS-valid + * Validate a path * @param path path to validate * @throws InvalidPathnameException if a path is considered invalid */ protected void validatePath(String path) throws InvalidPathnameException { - RegistryPathUtils.validateElementsAsDNS(path); + // currently no checks are performed } @Override diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/test/java/org/apache/hadoop/registry/client/binding/TestRegistryOperationUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/test/java/org/apache/hadoop/registry/client/binding/TestRegistryOperationUtils.java index b86e3fe..7677acf 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/test/java/org/apache/hadoop/registry/client/binding/TestRegistryOperationUtils.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/test/java/org/apache/hadoop/registry/client/binding/TestRegistryOperationUtils.java @@ -38,10 +38,19 @@ public void testUsernameExtractionEnvVarOverrride() throws Throwable { public void testUsernameExtractionCurrentuser() throws Throwable { String whoami = RegistryUtils.getCurrentUsernameUnencoded(""); String ugiUser = UserGroupInformation.getCurrentUser().getShortUserName(); - assertEquals(ugiUser, whoami); - } + @Test + public void testShortenUsername() throws Throwable { + assertEquals("hbase", + RegistryUtils.shortenUsername("hbase@HADOOP.APACHE.ORG")); + assertEquals("hbase", + RegistryUtils.shortenUsername("hbase/localhost@HADOOP.APACHE.ORG")); + assertEquals("hbase", + RegistryUtils.shortenUsername("hbase")); + assertEquals("hbase user", + RegistryUtils.shortenUsername("hbase user")); + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/test/java/org/apache/hadoop/registry/operations/TestRegistryOperations.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/test/java/org/apache/hadoop/registry/operations/TestRegistryOperations.java index 1cfb025..2434bc9 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/test/java/org/apache/hadoop/registry/operations/TestRegistryOperations.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-registry/src/test/java/org/apache/hadoop/registry/operations/TestRegistryOperations.java @@ -301,4 +301,26 @@ public void testListListFully() throws Throwable { assertEquals(r1stat, stats.get("r1")); assertEquals(r2stat, stats.get("r2")); } + + + @Test + public void testComplexUsernames() throws Throwable { + operations.mknode("/users/user with spaces", true); + operations.mknode("/users/user-with_underscores", true); + operations.mknode("/users/000000", true); + operations.mknode("/users/-storm", true); + operations.mknode("/users/windows\\ user", true); + String home = RegistryUtils.homePathForUser("\u0413PA\u0414_3"); + operations.mknode(home, true); + operations.mknode( + RegistryUtils.servicePath(home, "service.class", "service 4_5"), + true); + + operations.mknode( + RegistryUtils.homePathForUser("hbase@HADOOP.APACHE.ORG"), + true); + operations.mknode( + RegistryUtils.homePathForUser("hbase/localhost@HADOOP.APACHE.ORG"), + true); + } }