diff --git a/src/main/java/com/upplication/s3fs/util/S3Utils.java b/src/main/java/com/upplication/s3fs/util/S3Utils.java index aff084f..d3d10a7 100644 --- a/src/main/java/com/upplication/s3fs/util/S3Utils.java +++ b/src/main/java/com/upplication/s3fs/util/S3Utils.java @@ -94,18 +94,22 @@ public S3PosixFileAttributes getS3PosixFileAttributes(S3Path s3Path) throws NoSu String bucketName = s3Path.getFileStore().name(); S3BasicFileAttributes attrs = toS3FileAttributes(objectSummary, key); - S3UserPrincipal userPrincipal = null; - Set permissions = null; + AccessControlList acl; - if (!attrs.isDirectory()) { - AmazonS3 client = s3Path.getFileSystem().getClient(); - AccessControlList acl = client.getObjectAcl(bucketName, key); - Owner owner = acl.getOwner(); + AmazonS3 client = s3Path.getFileSystem().getClient(); - userPrincipal = new S3UserPrincipal(owner.getId() + ":" + owner.getDisplayName()); - permissions = toPosixFilePermissions(acl.getGrantsAsList()); + if (!attrs.isDirectory()) { + acl = client.getObjectAcl(bucketName, key); + } else if (key.equals("")){ + acl = client.getBucketAcl(bucketName); + } else { + acl = client.getObjectAcl(bucketName, key + "/"); } + Owner owner = acl.getOwner(); + S3UserPrincipal userPrincipal = new S3UserPrincipal(owner.getId() + ":" + owner.getDisplayName()); + Set permissions = toPosixFilePermissions(acl.getGrantsAsList()); + return new S3PosixFileAttributes((String)attrs.fileKey(), attrs.lastModifiedTime(), attrs.size(), attrs.isDirectory(), attrs.isRegularFile(), userPrincipal, null, permissions); } diff --git a/src/test/java/com/upplication/s3fs/FilesIT.java b/src/test/java/com/upplication/s3fs/FilesIT.java index 4460a79..bce75e5 100644 --- a/src/test/java/com/upplication/s3fs/FilesIT.java +++ b/src/test/java/com/upplication/s3fs/FilesIT.java @@ -2,6 +2,7 @@ import com.amazonaws.services.s3.model.ObjectMetadata; import com.github.marschall.memoryfilesystem.MemoryFileSystemBuilder; +import com.google.common.collect.ImmutableSet; import com.upplication.s3fs.util.CopyDirVisitor; import com.upplication.s3fs.util.EnvironmentBuilder; import org.junit.Before; @@ -14,9 +15,10 @@ import java.nio.channels.SeekableByteChannel; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; -import java.util.EnumSet; -import java.util.Map; -import java.util.UUID; +import java.nio.file.attribute.PosixFileAttributeView; +import java.nio.file.attribute.PosixFileAttributes; +import java.nio.file.attribute.PosixFilePermission; +import java.util.*; import static com.upplication.s3fs.util.S3EndpointConstant.S3_GLOBAL_URI_IT; import static org.junit.Assert.*; @@ -481,6 +483,22 @@ public void readAttributesDirectory() throws IOException { assertEquals(startPath + "lib/angular/", fileAttributes.fileKey()); } + @Test + public void readPosixPermissions() throws IOException { + + Path dir = uploadDir(); + + Path bucketRoot = fileSystemAmazon.getPath(bucket, ""); + Path directory = dir.resolve("assets1"); + Path file = dir.resolve("assets1").resolve("index.html"); + + Set expectedPermissions = ImmutableSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE, PosixFilePermission.OWNER_EXECUTE); + + assertEquals(expectedPermissions, Files.readAttributes(bucketRoot, PosixFileAttributes.class).permissions()); + assertEquals(expectedPermissions, Files.readAttributes(directory, PosixFileAttributes.class).permissions()); + assertEquals(expectedPermissions, Files.readAttributes(file, PosixFileAttributes.class).permissions()); + } + @Test public void seekableCloseTwice() throws IOException { Path file = createEmptyFile();