|
@@ -34,6 +34,7 @@ import static org.junit.Assert.fail;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
import java.security.PrivilegedExceptionAction;
|
|
|
+import java.util.Arrays;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
@@ -45,16 +46,19 @@ import org.apache.commons.logging.Log;
|
|
|
import org.apache.commons.logging.LogFactory;
|
|
|
import org.apache.hadoop.conf.Configuration;
|
|
|
import org.apache.hadoop.fs.CommonConfigurationKeys;
|
|
|
+import org.apache.hadoop.fs.FileStatus;
|
|
|
import org.apache.hadoop.fs.FileSystem;
|
|
|
import org.apache.hadoop.fs.Path;
|
|
|
import org.apache.hadoop.fs.Options.Rename;
|
|
|
import org.apache.hadoop.fs.permission.AclEntry;
|
|
|
import org.apache.hadoop.fs.permission.AclStatus;
|
|
|
+import org.apache.hadoop.fs.permission.FsAction;
|
|
|
import org.apache.hadoop.fs.permission.FsPermission;
|
|
|
import org.apache.hadoop.hdfs.TestDFSPermission.PermissionGenerator;
|
|
|
import org.apache.hadoop.hdfs.server.namenode.AclTestHelpers;
|
|
|
import org.apache.hadoop.hdfs.server.namenode.FSAclBaseTest;
|
|
|
import org.apache.hadoop.ipc.AsyncCallLimitExceededException;
|
|
|
+import org.apache.hadoop.security.AccessControlException;
|
|
|
import org.apache.hadoop.security.UserGroupInformation;
|
|
|
import org.apache.hadoop.util.Time;
|
|
|
import org.junit.After;
|
|
@@ -441,7 +445,7 @@ public class TestAsyncDFS {
|
|
|
for (int i = 0; i < NUM_TESTS; i++) {
|
|
|
assertTrue(fs.exists(dsts[i]));
|
|
|
FsPermission fsPerm = new FsPermission(permissions[i]);
|
|
|
- fs.access(dsts[i], fsPerm.getUserAction());
|
|
|
+ checkAccessPermissions(fs.getFileStatus(dsts[i]), fsPerm.getUserAction());
|
|
|
}
|
|
|
|
|
|
// test setOwner
|
|
@@ -470,4 +474,34 @@ public class TestAsyncDFS {
|
|
|
assertTrue("group2".equals(fs.getFileStatus(dsts[i]).getGroup()));
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ static void checkAccessPermissions(FileStatus stat, FsAction mode)
|
|
|
+ throws IOException {
|
|
|
+ checkAccessPermissions(UserGroupInformation.getCurrentUser(), stat, mode);
|
|
|
+ }
|
|
|
+
|
|
|
+ static void checkAccessPermissions(final UserGroupInformation ugi,
|
|
|
+ FileStatus stat, FsAction mode) throws IOException {
|
|
|
+ FsPermission perm = stat.getPermission();
|
|
|
+ String user = ugi.getShortUserName();
|
|
|
+ List<String> groups = Arrays.asList(ugi.getGroupNames());
|
|
|
+
|
|
|
+ if (user.equals(stat.getOwner())) {
|
|
|
+ if (perm.getUserAction().implies(mode)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ } else if (groups.contains(stat.getGroup())) {
|
|
|
+ if (perm.getGroupAction().implies(mode)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (perm.getOtherAction().implies(mode)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ throw new AccessControlException(String.format(
|
|
|
+ "Permission denied: user=%s, path=\"%s\":%s:%s:%s%s", user, stat
|
|
|
+ .getPath(), stat.getOwner(), stat.getGroup(),
|
|
|
+ stat.isDirectory() ? "d" : "-", perm));
|
|
|
+ }
|
|
|
}
|