HADOOP-10352. Recursive setfacl erroneously attempts to apply default ACL to files. Contributed by Chris Nauroth.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1570466 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
c316cd6271
commit
327d2ceca2
@ -326,6 +326,9 @@ Trunk (Unreleased)
|
|||||||
HADOOP-10344. Fix TestAclCommands after merging HADOOP-10338 patch.
|
HADOOP-10344. Fix TestAclCommands after merging HADOOP-10338 patch.
|
||||||
(cnauroth)
|
(cnauroth)
|
||||||
|
|
||||||
|
HADOOP-10352. Recursive setfacl erroneously attempts to apply default ACL to
|
||||||
|
files. (cnauroth)
|
||||||
|
|
||||||
OPTIMIZATIONS
|
OPTIMIZATIONS
|
||||||
|
|
||||||
HADOOP-7761. Improve the performance of raw comparisons. (todd)
|
HADOOP-7761. Improve the performance of raw comparisons. (todd)
|
||||||
|
@ -22,6 +22,8 @@ import java.util.Iterator;
|
|||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
import org.apache.hadoop.HadoopIllegalArgumentException;
|
import org.apache.hadoop.HadoopIllegalArgumentException;
|
||||||
import org.apache.hadoop.classification.InterfaceAudience;
|
import org.apache.hadoop.classification.InterfaceAudience;
|
||||||
import org.apache.hadoop.classification.InterfaceStability;
|
import org.apache.hadoop.classification.InterfaceStability;
|
||||||
@ -231,6 +233,7 @@ class AclCommands extends FsCommand {
|
|||||||
CommandFormat cf = new CommandFormat(0, Integer.MAX_VALUE, "b", "k", "R",
|
CommandFormat cf = new CommandFormat(0, Integer.MAX_VALUE, "b", "k", "R",
|
||||||
"m", "x", "-set");
|
"m", "x", "-set");
|
||||||
List<AclEntry> aclEntries = null;
|
List<AclEntry> aclEntries = null;
|
||||||
|
List<AclEntry> accessAclEntries = null;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void processOptions(LinkedList<String> args) throws IOException {
|
protected void processOptions(LinkedList<String> args) throws IOException {
|
||||||
@ -263,6 +266,19 @@ class AclCommands extends FsCommand {
|
|||||||
if (args.size() > 1) {
|
if (args.size() > 1) {
|
||||||
throw new HadoopIllegalArgumentException("Too many arguments");
|
throw new HadoopIllegalArgumentException("Too many arguments");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// In recursive mode, save a separate list of just the access ACL entries.
|
||||||
|
// Only directories may have a default ACL. When a recursive operation
|
||||||
|
// encounters a file under the specified path, it must pass only the
|
||||||
|
// access ACL entries.
|
||||||
|
if (isRecursive() && (oneModifyOption || setOption)) {
|
||||||
|
accessAclEntries = Lists.newArrayList();
|
||||||
|
for (AclEntry entry: aclEntries) {
|
||||||
|
if (entry.getScope() == AclEntryScope.ACCESS) {
|
||||||
|
accessAclEntries.add(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -272,11 +288,37 @@ class AclCommands extends FsCommand {
|
|||||||
} else if (cf.getOpt("k")) {
|
} else if (cf.getOpt("k")) {
|
||||||
item.fs.removeDefaultAcl(item.path);
|
item.fs.removeDefaultAcl(item.path);
|
||||||
} else if (cf.getOpt("m")) {
|
} else if (cf.getOpt("m")) {
|
||||||
item.fs.modifyAclEntries(item.path, aclEntries);
|
List<AclEntry> entries = getAclEntries(item);
|
||||||
|
if (!entries.isEmpty()) {
|
||||||
|
item.fs.modifyAclEntries(item.path, entries);
|
||||||
|
}
|
||||||
} else if (cf.getOpt("x")) {
|
} else if (cf.getOpt("x")) {
|
||||||
item.fs.removeAclEntries(item.path, aclEntries);
|
List<AclEntry> entries = getAclEntries(item);
|
||||||
|
if (!entries.isEmpty()) {
|
||||||
|
item.fs.removeAclEntries(item.path, entries);
|
||||||
|
}
|
||||||
} else if (cf.getOpt("-set")) {
|
} else if (cf.getOpt("-set")) {
|
||||||
item.fs.setAcl(item.path, aclEntries);
|
List<AclEntry> entries = getAclEntries(item);
|
||||||
|
if (!entries.isEmpty()) {
|
||||||
|
item.fs.setAcl(item.path, entries);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the ACL entries to use in the API call for the given path. For a
|
||||||
|
* recursive operation, returns all specified ACL entries if the item is a
|
||||||
|
* directory or just the access ACL entries if the item is a file. For a
|
||||||
|
* non-recursive operation, returns all specified ACL entries.
|
||||||
|
*
|
||||||
|
* @param item PathData path to check
|
||||||
|
* @return List<AclEntry> ACL entries to use in the API call
|
||||||
|
*/
|
||||||
|
private List<AclEntry> getAclEntries(PathData item) {
|
||||||
|
if (isRecursive()) {
|
||||||
|
return item.stat.isDirectory() ? aclEntries : accessAclEntries;
|
||||||
|
} else {
|
||||||
|
return aclEntries;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -911,5 +911,66 @@
|
|||||||
</comparator>
|
</comparator>
|
||||||
</comparators>
|
</comparators>
|
||||||
</test>
|
</test>
|
||||||
|
<test>
|
||||||
|
<description>setfacl: recursive modify entries with mix of files and directories</description>
|
||||||
|
<test-commands>
|
||||||
|
<command>-fs NAMENODE -mkdir -p /dir1</command>
|
||||||
|
<command>-fs NAMENODE -touchz /dir1/file1</command>
|
||||||
|
<command>-fs NAMENODE -mkdir -p /dir1/dir2</command>
|
||||||
|
<command>-fs NAMENODE -touchz /dir1/dir2/file2</command>
|
||||||
|
<command>-fs NAMENODE -setfacl -R -m user:charlie:rwx,default:user:charlie:r-x /dir1</command>
|
||||||
|
<command>-fs NAMENODE -getfacl -R /dir1</command>
|
||||||
|
</test-commands>
|
||||||
|
<cleanup-commands>
|
||||||
|
<command>-fs NAMENODE -rm -R /dir1</command>
|
||||||
|
</cleanup-commands>
|
||||||
|
<comparators>
|
||||||
|
<comparator>
|
||||||
|
<type>ExactComparator</type>
|
||||||
|
<expected-output># file: /dir1#LF## owner: USERNAME#LF## group: supergroup#LF#user::rwx#LF#user:charlie:rwx#LF#group::r-x#LF#mask::rwx#LF#other::r-x#LF#default:user::rwx#LF#default:user:charlie:r-x#LF#default:group::r-x#LF#default:mask::r-x#LF#default:other::r-x#LF##LF## file: /dir1/dir2#LF## owner: USERNAME#LF## group: supergroup#LF#user::rwx#LF#user:charlie:rwx#LF#group::r-x#LF#mask::rwx#LF#other::r-x#LF#default:user::rwx#LF#default:user:charlie:r-x#LF#default:group::r-x#LF#default:mask::r-x#LF#default:other::r-x#LF##LF## file: /dir1/dir2/file2#LF## owner: USERNAME#LF## group: supergroup#LF#user::rw-#LF#user:charlie:rwx#LF#group::r--#LF#mask::rwx#LF#other::r--#LF##LF## file: /dir1/file1#LF## owner: USERNAME#LF## group: supergroup#LF#user::rw-#LF#user:charlie:rwx#LF#group::r--#LF#mask::rwx#LF#other::r--#LF##LF#</expected-output>
|
||||||
|
</comparator>
|
||||||
|
</comparators>
|
||||||
|
</test>
|
||||||
|
<test>
|
||||||
|
<description>setfacl: recursive remove entries with mix of files and directories</description>
|
||||||
|
<test-commands>
|
||||||
|
<command>-fs NAMENODE -mkdir -p /dir1</command>
|
||||||
|
<command>-fs NAMENODE -touchz /dir1/file1</command>
|
||||||
|
<command>-fs NAMENODE -mkdir -p /dir1/dir2</command>
|
||||||
|
<command>-fs NAMENODE -touchz /dir1/dir2/file2</command>
|
||||||
|
<command>-fs NAMENODE -setfacl -R -m user:bob:rwx,user:charlie:rwx,default:user:bob:rwx,default:user:charlie:r-x /dir1</command>
|
||||||
|
<command>-fs NAMENODE -setfacl -R -x user:bob,default:user:bob /dir1</command>
|
||||||
|
<command>-fs NAMENODE -getfacl -R /dir1</command>
|
||||||
|
</test-commands>
|
||||||
|
<cleanup-commands>
|
||||||
|
<command>-fs NAMENODE -rm -R /dir1</command>
|
||||||
|
</cleanup-commands>
|
||||||
|
<comparators>
|
||||||
|
<comparator>
|
||||||
|
<type>ExactComparator</type>
|
||||||
|
<expected-output># file: /dir1#LF## owner: USERNAME#LF## group: supergroup#LF#user::rwx#LF#user:charlie:rwx#LF#group::r-x#LF#mask::rwx#LF#other::r-x#LF#default:user::rwx#LF#default:user:charlie:r-x#LF#default:group::r-x#LF#default:mask::r-x#LF#default:other::r-x#LF##LF## file: /dir1/dir2#LF## owner: USERNAME#LF## group: supergroup#LF#user::rwx#LF#user:charlie:rwx#LF#group::r-x#LF#mask::rwx#LF#other::r-x#LF#default:user::rwx#LF#default:user:charlie:r-x#LF#default:group::r-x#LF#default:mask::r-x#LF#default:other::r-x#LF##LF## file: /dir1/dir2/file2#LF## owner: USERNAME#LF## group: supergroup#LF#user::rw-#LF#user:charlie:rwx#LF#group::r--#LF#mask::rwx#LF#other::r--#LF##LF## file: /dir1/file1#LF## owner: USERNAME#LF## group: supergroup#LF#user::rw-#LF#user:charlie:rwx#LF#group::r--#LF#mask::rwx#LF#other::r--#LF##LF#</expected-output>
|
||||||
|
</comparator>
|
||||||
|
</comparators>
|
||||||
|
</test>
|
||||||
|
<test>
|
||||||
|
<description>setfacl: recursive set with mix of files and directories</description>
|
||||||
|
<test-commands>
|
||||||
|
<command>-fs NAMENODE -mkdir -p /dir1</command>
|
||||||
|
<command>-fs NAMENODE -touchz /dir1/file1</command>
|
||||||
|
<command>-fs NAMENODE -mkdir -p /dir1/dir2</command>
|
||||||
|
<command>-fs NAMENODE -touchz /dir1/dir2/file2</command>
|
||||||
|
<command>-fs NAMENODE -setfacl -R --set user::rwx,user:charlie:rwx,group::r-x,other::r-x,default:user:charlie:r-x /dir1</command>
|
||||||
|
<command>-fs NAMENODE -getfacl -R /dir1</command>
|
||||||
|
</test-commands>
|
||||||
|
<cleanup-commands>
|
||||||
|
<command>-fs NAMENODE -rm -R /dir1</command>
|
||||||
|
</cleanup-commands>
|
||||||
|
<comparators>
|
||||||
|
<comparator>
|
||||||
|
<type>ExactComparator</type>
|
||||||
|
<expected-output># file: /dir1#LF## owner: USERNAME#LF## group: supergroup#LF#user::rwx#LF#user:charlie:rwx#LF#group::r-x#LF#mask::rwx#LF#other::r-x#LF#default:user::rwx#LF#default:user:charlie:r-x#LF#default:group::r-x#LF#default:mask::r-x#LF#default:other::r-x#LF##LF## file: /dir1/dir2#LF## owner: USERNAME#LF## group: supergroup#LF#user::rwx#LF#user:charlie:rwx#LF#group::r-x#LF#mask::rwx#LF#other::r-x#LF#default:user::rwx#LF#default:user:charlie:r-x#LF#default:group::r-x#LF#default:mask::r-x#LF#default:other::r-x#LF##LF## file: /dir1/dir2/file2#LF## owner: USERNAME#LF## group: supergroup#LF#user::rwx#LF#user:charlie:rwx#LF#group::r-x#LF#mask::rwx#LF#other::r-x#LF##LF## file: /dir1/file1#LF## owner: USERNAME#LF## group: supergroup#LF#user::rwx#LF#user:charlie:rwx#LF#group::r-x#LF#mask::rwx#LF#other::r-x#LF##LF#</expected-output>
|
||||||
|
</comparator>
|
||||||
|
</comparators>
|
||||||
|
</test>
|
||||||
</tests>
|
</tests>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user