|
@@ -1,4 +1,4 @@
|
|
-/**
|
|
|
|
|
|
+ /**
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* distributed with this work for additional information
|
|
* distributed with this work for additional information
|
|
@@ -28,6 +28,7 @@ import java.util.concurrent.ExecutionException;
|
|
import java.util.concurrent.Future;
|
|
import java.util.concurrent.Future;
|
|
import java.util.regex.Pattern;
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
|
|
+import org.apache.commons.io.FileUtils;
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.LogFactory;
|
|
import org.apache.commons.logging.LogFactory;
|
|
import org.apache.hadoop.classification.InterfaceAudience.LimitedPrivate;
|
|
import org.apache.hadoop.classification.InterfaceAudience.LimitedPrivate;
|
|
@@ -392,17 +393,22 @@ public class FSDownload implements Callable<Path> {
|
|
*/
|
|
*/
|
|
private void changePermissions(FileSystem fs, final Path path)
|
|
private void changePermissions(FileSystem fs, final Path path)
|
|
throws IOException, InterruptedException {
|
|
throws IOException, InterruptedException {
|
|
- FileStatus fStatus = fs.getFileStatus(path);
|
|
|
|
|
|
+ File f = new File(path.toUri());
|
|
|
|
+ if (FileUtils.isSymlink(f)) {
|
|
|
|
+ // avoid following symlinks when changing permissions
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ boolean isDir = f.isDirectory();
|
|
FsPermission perm = cachePerms;
|
|
FsPermission perm = cachePerms;
|
|
// set public perms as 755 or 555 based on dir or file
|
|
// set public perms as 755 or 555 based on dir or file
|
|
if (resource.getVisibility() == LocalResourceVisibility.PUBLIC) {
|
|
if (resource.getVisibility() == LocalResourceVisibility.PUBLIC) {
|
|
- perm = fStatus.isDirectory() ? PUBLIC_DIR_PERMS : PUBLIC_FILE_PERMS;
|
|
|
|
|
|
+ perm = isDir ? PUBLIC_DIR_PERMS : PUBLIC_FILE_PERMS;
|
|
}
|
|
}
|
|
// set private perms as 700 or 500
|
|
// set private perms as 700 or 500
|
|
else {
|
|
else {
|
|
// PRIVATE:
|
|
// PRIVATE:
|
|
// APPLICATION:
|
|
// APPLICATION:
|
|
- perm = fStatus.isDirectory() ? PRIVATE_DIR_PERMS : PRIVATE_FILE_PERMS;
|
|
|
|
|
|
+ perm = isDir ? PRIVATE_DIR_PERMS : PRIVATE_FILE_PERMS;
|
|
}
|
|
}
|
|
LOG.debug("Changing permissions for path " + path
|
|
LOG.debug("Changing permissions for path " + path
|
|
+ " to perm " + perm);
|
|
+ " to perm " + perm);
|
|
@@ -418,8 +424,7 @@ public class FSDownload implements Callable<Path> {
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}
|
|
}
|
|
- if (fStatus.isDirectory()
|
|
|
|
- && !fStatus.isSymlink()) {
|
|
|
|
|
|
+ if (isDir) {
|
|
FileStatus[] statuses = fs.listStatus(path);
|
|
FileStatus[] statuses = fs.listStatus(path);
|
|
for (FileStatus status : statuses) {
|
|
for (FileStatus status : statuses) {
|
|
changePermissions(fs, status.getPath());
|
|
changePermissions(fs, status.getPath());
|