HADOOP-9929. Insufficient permission for a path reported as file not found. (Contributed by Colin Patrick McCabe)
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1524610 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
27cc6911ea
commit
7ce1a859a8
|
@ -73,12 +73,14 @@ Release 2.3.0 - UNRELEASED
|
|||
HADOOP-9865. FileContext#globStatus has a regression with respect to
|
||||
relative path. (Chuan Lin via Colin Patrick McCabe)
|
||||
|
||||
|
||||
HADOOP-9909. org.apache.hadoop.fs.Stat should permit other LANG.
|
||||
(Shinichi Yamashita via Andrew Wang)
|
||||
|
||||
HADOOP-9908. Fix NPE when versioninfo properties file is missing (todd)
|
||||
|
||||
HADOOP-9929. Insufficient permissions for a path reported as File Not
|
||||
Found. (Contributed by Colin Patrick McCabe)
|
||||
|
||||
Release 2.2.0 - UNRELEASED
|
||||
|
||||
INCOMPATIBLE CHANGES
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
package org.apache.hadoop.fs;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
@ -50,26 +51,26 @@ class Globber {
|
|||
this.filter = filter;
|
||||
}
|
||||
|
||||
private FileStatus getFileStatus(Path path) {
|
||||
private FileStatus getFileStatus(Path path) throws IOException {
|
||||
try {
|
||||
if (fs != null) {
|
||||
return fs.getFileStatus(path);
|
||||
} else {
|
||||
return fc.getFileStatus(path);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
} catch (FileNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private FileStatus[] listStatus(Path path) {
|
||||
private FileStatus[] listStatus(Path path) throws IOException {
|
||||
try {
|
||||
if (fs != null) {
|
||||
return fs.listStatus(path);
|
||||
} else {
|
||||
return fc.util().listStatus(path);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
} catch (FileNotFoundException e) {
|
||||
return new FileStatus[0];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@ package org.apache.hadoop.fs;
|
|||
import static org.junit.Assert.*;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.security.PrivilegedExceptionAction;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
@ -27,10 +28,15 @@ import org.apache.hadoop.conf.Configuration;
|
|||
import org.apache.hadoop.fs.permission.FsPermission;
|
||||
import org.apache.hadoop.hdfs.HdfsConfiguration;
|
||||
import org.apache.hadoop.hdfs.MiniDFSCluster;
|
||||
import org.apache.hadoop.security.AccessControlException;
|
||||
import org.apache.hadoop.security.UserGroupInformation;
|
||||
import org.junit.*;
|
||||
|
||||
public class TestGlobPaths {
|
||||
|
||||
private static final UserGroupInformation unprivilegedUser =
|
||||
UserGroupInformation.createRemoteUser("myuser");
|
||||
|
||||
static class RegexPathFilter implements PathFilter {
|
||||
|
||||
private final String regex;
|
||||
|
@ -47,17 +53,34 @@ public class TestGlobPaths {
|
|||
|
||||
static private MiniDFSCluster dfsCluster;
|
||||
static private FileSystem fs;
|
||||
static private FileSystem unprivilegedFs;
|
||||
static private FileContext fc;
|
||||
static private FileContext unprivilegedFc;
|
||||
static final private int NUM_OF_PATHS = 4;
|
||||
static private String USER_DIR;
|
||||
private Path[] path = new Path[NUM_OF_PATHS];
|
||||
|
||||
@BeforeClass
|
||||
public static void setUp() throws Exception {
|
||||
Configuration conf = new HdfsConfiguration();
|
||||
final Configuration conf = new HdfsConfiguration();
|
||||
dfsCluster = new MiniDFSCluster.Builder(conf).build();
|
||||
fs = FileSystem.get(conf);
|
||||
fc = FileContext.getFileContext(conf);
|
||||
unprivilegedFs =
|
||||
unprivilegedUser.doAs(new PrivilegedExceptionAction<FileSystem>() {
|
||||
@Override
|
||||
public FileSystem run() throws IOException {
|
||||
return FileSystem.get(conf);
|
||||
}
|
||||
});
|
||||
fc = FileContext.getFileContext(conf);
|
||||
unprivilegedFc =
|
||||
unprivilegedUser.doAs(new PrivilegedExceptionAction<FileContext>() {
|
||||
@Override
|
||||
public FileContext run() throws IOException {
|
||||
return FileContext.getFileContext(conf);
|
||||
}
|
||||
});
|
||||
USER_DIR = fs.getHomeDirectory().toUri().getPath().toString();
|
||||
}
|
||||
|
||||
|
@ -781,8 +804,8 @@ public class TestGlobPaths {
|
|||
* A glob test that can be run on either FileContext or FileSystem.
|
||||
*/
|
||||
private static interface FSTestWrapperGlobTest {
|
||||
void run(FSTestWrapper wrap, FileSystem fs, FileContext fc)
|
||||
throws Exception;
|
||||
void run(FSTestWrapper wrap, FSTestWrapper unprivilegedWrapper,
|
||||
FileSystem fs, FileContext fc) throws Exception;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -791,7 +814,8 @@ public class TestGlobPaths {
|
|||
private void testOnFileSystem(FSTestWrapperGlobTest test) throws Exception {
|
||||
try {
|
||||
fc.mkdir(new Path(USER_DIR), FsPermission.getDefault(), true);
|
||||
test.run(new FileSystemTestWrapper(fs), fs, null);
|
||||
test.run(new FileSystemTestWrapper(fs),
|
||||
new FileSystemTestWrapper(unprivilegedFs), fs, null);
|
||||
} finally {
|
||||
fc.delete(new Path(USER_DIR), true);
|
||||
}
|
||||
|
@ -803,7 +827,8 @@ public class TestGlobPaths {
|
|||
private void testOnFileContext(FSTestWrapperGlobTest test) throws Exception {
|
||||
try {
|
||||
fs.mkdirs(new Path(USER_DIR));
|
||||
test.run(new FileContextTestWrapper(fc), null, fc);
|
||||
test.run(new FileContextTestWrapper(fc),
|
||||
new FileContextTestWrapper(unprivilegedFc), null, fc);
|
||||
} finally {
|
||||
cleanupDFS();
|
||||
}
|
||||
|
@ -834,8 +859,8 @@ public class TestGlobPaths {
|
|||
* Test globbing through symlinks.
|
||||
*/
|
||||
private static class TestGlobWithSymlinks implements FSTestWrapperGlobTest {
|
||||
public void run(FSTestWrapper wrap, FileSystem fs, FileContext fc)
|
||||
throws Exception {
|
||||
public void run(FSTestWrapper wrap, FSTestWrapper unprivilegedWrap,
|
||||
FileSystem fs, FileContext fc) throws Exception {
|
||||
// Test that globbing through a symlink to a directory yields a path
|
||||
// containing that symlink.
|
||||
wrap.mkdir(new Path(USER_DIR + "/alpha"), FsPermission.getDirDefault(),
|
||||
|
@ -886,8 +911,8 @@ public class TestGlobPaths {
|
|||
*/
|
||||
private static class TestGlobWithSymlinksToSymlinks implements
|
||||
FSTestWrapperGlobTest {
|
||||
public void run(FSTestWrapper wrap, FileSystem fs, FileContext fc)
|
||||
throws Exception {
|
||||
public void run(FSTestWrapper wrap, FSTestWrapper unprivilegedWrap,
|
||||
FileSystem fs, FileContext fc) throws Exception {
|
||||
// Test that globbing through a symlink to a symlink to a directory
|
||||
// fully resolves
|
||||
wrap.mkdir(new Path(USER_DIR + "/alpha"), FsPermission.getDirDefault(),
|
||||
|
@ -961,8 +986,8 @@ public class TestGlobPaths {
|
|||
*/
|
||||
private static class TestGlobSymlinksWithCustomPathFilter implements
|
||||
FSTestWrapperGlobTest {
|
||||
public void run(FSTestWrapper wrap, FileSystem fs, FileContext fc)
|
||||
throws Exception {
|
||||
public void run(FSTestWrapper wrap, FSTestWrapper unprivilegedWrap,
|
||||
FileSystem fs, FileContext fc) throws Exception {
|
||||
// Test that globbing through a symlink to a symlink to a directory
|
||||
// fully resolves
|
||||
wrap.mkdir(new Path(USER_DIR + "/alpha"), FsPermission.getDirDefault(),
|
||||
|
@ -1009,8 +1034,8 @@ public class TestGlobPaths {
|
|||
* Test that globStatus fills in the scheme even when it is not provided.
|
||||
*/
|
||||
private static class TestGlobFillsInScheme implements FSTestWrapperGlobTest {
|
||||
public void run(FSTestWrapper wrap, FileSystem fs, FileContext fc)
|
||||
throws Exception {
|
||||
public void run(FSTestWrapper wrap, FSTestWrapper unprivilegedWrap,
|
||||
FileSystem fs, FileContext fc) throws Exception {
|
||||
// Verify that the default scheme is hdfs, when we don't supply one.
|
||||
wrap.mkdir(new Path(USER_DIR + "/alpha"), FsPermission.getDirDefault(),
|
||||
false);
|
||||
|
@ -1052,8 +1077,8 @@ public class TestGlobPaths {
|
|||
* Test that globStatus works with relative paths.
|
||||
**/
|
||||
private static class TestRelativePath implements FSTestWrapperGlobTest {
|
||||
public void run(FSTestWrapper wrap, FileSystem fs, FileContext fc)
|
||||
throws Exception {
|
||||
public void run(FSTestWrapper wrap, FSTestWrapper unprivilegedWrap,
|
||||
FileSystem fs, FileContext fc) throws Exception {
|
||||
String[] files = new String[] { "a", "abc", "abc.p", "bacd" };
|
||||
|
||||
Path[] path = new Path[files.length];
|
||||
|
@ -1086,4 +1111,44 @@ public class TestGlobPaths {
|
|||
public void testRelativePathOnFC() throws Exception {
|
||||
testOnFileContext(new TestRelativePath());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that trying to glob through a directory we don't have permission
|
||||
* to list fails with AccessControlException rather than succeeding or
|
||||
* throwing any other exception.
|
||||
**/
|
||||
private static class TestGlobAccessDenied implements FSTestWrapperGlobTest {
|
||||
public void run(FSTestWrapper wrap, FSTestWrapper unprivilegedWrap,
|
||||
FileSystem fs, FileContext fc) throws Exception {
|
||||
wrap.mkdir(new Path("/nopermission/val"),
|
||||
new FsPermission((short)0777), true);
|
||||
wrap.mkdir(new Path("/norestrictions/val"),
|
||||
new FsPermission((short)0777), true);
|
||||
wrap.setPermission(new Path("/nopermission"),
|
||||
new FsPermission((short)0));
|
||||
try {
|
||||
unprivilegedWrap.globStatus(new Path("/no*/*"),
|
||||
new AcceptAllPathFilter());
|
||||
Assert.fail("expected to get an AccessControlException when " +
|
||||
"globbing through a directory we don't have permissions " +
|
||||
"to list.");
|
||||
} catch (AccessControlException ioe) {
|
||||
}
|
||||
|
||||
Assert.assertEquals("/norestrictions/val",
|
||||
TestPath.mergeStatuses(unprivilegedWrap.globStatus(
|
||||
new Path("/norestrictions/*"),
|
||||
new AcceptAllPathFilter())));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGlobAccessDeniedOnFS() throws Exception {
|
||||
testOnFileSystem(new TestGlobAccessDenied());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGlobAccessDeniedOnFC() throws Exception {
|
||||
testOnFileContext(new TestGlobAccessDenied());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue