From 112a4a2d21794e2f084593247a882ed644ad2739 Mon Sep 17 00:00:00 2001 From: Thomas Collett Date: Thu, 25 Jan 2018 16:39:50 +0000 Subject: [PATCH 1/2] Added support for directory permissions to support cd in SFTP --- .../com/upplication/s3fs/util/S3Utils.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/upplication/s3fs/util/S3Utils.java b/src/main/java/com/upplication/s3fs/util/S3Utils.java index aff084f..d167d70 100644 --- a/src/main/java/com/upplication/s3fs/util/S3Utils.java +++ b/src/main/java/com/upplication/s3fs/util/S3Utils.java @@ -11,6 +11,7 @@ import java.nio.file.NoSuchFileException; import java.nio.file.attribute.FileTime; import java.nio.file.attribute.PosixFilePermission; +import java.nio.file.attribute.PosixFilePermissions; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -94,17 +95,18 @@ 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; + AmazonS3 client = s3Path.getFileSystem().getClient(); if (!attrs.isDirectory()) { - AmazonS3 client = s3Path.getFileSystem().getClient(); - AccessControlList acl = client.getObjectAcl(bucketName, key); - Owner owner = acl.getOwner(); + acl = client.getObjectAcl(bucketName, key); + } else { + acl = client.getBucketAcl(bucketName); - userPrincipal = new S3UserPrincipal(owner.getId() + ":" + owner.getDisplayName()); - permissions = toPosixFilePermissions(acl.getGrantsAsList()); } + 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); @@ -189,4 +191,4 @@ public S3BasicFileAttributes toS3FileAttributes(S3ObjectSummary objectSummary, S } return new S3BasicFileAttributes(resolvedKey, lastModifiedTime, size, directory, regularFile); } -} \ No newline at end of file +} From 9a292e5f9ca3fb89351609ef43326168801c50f7 Mon Sep 17 00:00:00 2001 From: FabioBatSilva Date: Wed, 22 Aug 2018 10:24:17 -0400 Subject: [PATCH 2/2] Testing posix directory permissions --- .../com/upplication/s3fs/util/S3Utils.java | 47 ++++++++++--------- .../java/com/upplication/s3fs/S3UtilsIT.java | 23 +++++++-- .../com/upplication/s3fs/S3UtilsTest.java | 1 - 3 files changed, 43 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/upplication/s3fs/util/S3Utils.java b/src/main/java/com/upplication/s3fs/util/S3Utils.java index d167d70..c2dc34a 100644 --- a/src/main/java/com/upplication/s3fs/util/S3Utils.java +++ b/src/main/java/com/upplication/s3fs/util/S3Utils.java @@ -11,7 +11,6 @@ import java.nio.file.NoSuchFileException; import java.nio.file.attribute.FileTime; import java.nio.file.attribute.PosixFilePermission; -import java.nio.file.attribute.PosixFilePermissions; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -88,28 +87,30 @@ public S3BasicFileAttributes getS3FileAttributes(S3Path s3Path) throws NoSuchFil * @return S3PosixFileAttributes never null * @throws NoSuchFileException if the Path doesnt exists */ - public S3PosixFileAttributes getS3PosixFileAttributes(S3Path s3Path) throws NoSuchFileException { - S3ObjectSummary objectSummary = getS3ObjectSummary(s3Path); - - String key = s3Path.getKey(); - String bucketName = s3Path.getFileStore().name(); - - S3BasicFileAttributes attrs = toS3FileAttributes(objectSummary, key); - - AccessControlList acl; - AmazonS3 client = s3Path.getFileSystem().getClient(); - if (!attrs.isDirectory()) { - acl = client.getObjectAcl(bucketName, key); - } else { - acl = client.getBucketAcl(bucketName); - - } - 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); + public S3PosixFileAttributes getS3PosixFileAttributes(final S3Path s3Path) throws NoSuchFileException { + final String key = s3Path.getKey(); + final String bucketName = s3Path.getFileStore().name(); + final S3ObjectSummary objectSummary = getS3ObjectSummary(s3Path); + final S3BasicFileAttributes attrs = toS3FileAttributes(objectSummary, key); + final AmazonS3 client = s3Path.getFileSystem().getClient(); + final AccessControlList acl = (!attrs.isDirectory()) + ? client.getObjectAcl(bucketName, key) + : client.getBucketAcl(bucketName); + + final Owner owner = acl.getOwner(); + final Set permissions = toPosixFilePermissions(acl.getGrantsAsList()); + final S3UserPrincipal userPrincipal = new S3UserPrincipal(owner.getId() + ":" + owner.getDisplayName()); + + 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/S3UtilsIT.java b/src/test/java/com/upplication/s3fs/S3UtilsIT.java index 5ab3cd4..cbd31fd 100644 --- a/src/test/java/com/upplication/s3fs/S3UtilsIT.java +++ b/src/test/java/com/upplication/s3fs/S3UtilsIT.java @@ -3,9 +3,11 @@ import static com.upplication.s3fs.AmazonS3Factory.ACCESS_KEY; import static com.upplication.s3fs.AmazonS3Factory.SECRET_KEY; import static com.upplication.s3fs.util.S3EndpointConstant.S3_GLOBAL_URI_IT; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -22,6 +24,7 @@ import org.junit.Before; import com.github.marschall.memoryfilesystem.MemoryFileSystemBuilder; +import java.nio.file.attribute.PosixFilePermission; import org.junit.Test; @@ -229,6 +232,10 @@ public void lookup_S3PosixFileAttributes_when_S3Path_is_file() throws IOExceptio assertNotNull(result.owner()); assertNull(result.group()); assertNotNull(result.permissions()); + + assertTrue(result.permissions().contains(PosixFilePermission.OWNER_EXECUTE)); + assertTrue(result.permissions().contains(PosixFilePermission.OWNER_WRITE)); + assertTrue(result.permissions().contains(PosixFilePermission.OWNER_READ)); } @Test @@ -254,9 +261,13 @@ public void lookup_S3PosixFileAttributes_when_S3Path_is_a_directory_and_is_virtu assertNotNull(result.lastModifiedTime()); assertNotNull(result.size()); // posix - assertNull(result.owner()); + assertNotNull(result.owner()); assertNull(result.group()); - assertNull(result.permissions()); + assertNotNull(result.permissions()); + + assertTrue(result.permissions().contains(PosixFilePermission.OWNER_EXECUTE)); + assertTrue(result.permissions().contains(PosixFilePermission.OWNER_WRITE)); + assertTrue(result.permissions().contains(PosixFilePermission.OWNER_READ)); } @Test @@ -285,9 +296,13 @@ public void lookup_S3PosixFileAttributes_when_S3Path_is_a_directory_and_is_not_v assertNotNull(result.lastModifiedTime()); assertNotNull(result.size()); // posix - assertNull(result.owner()); + assertNotNull(result.owner()); assertNull(result.group()); - assertNull(result.permissions()); + assertNotNull(result.permissions()); + + assertTrue(result.permissions().contains(PosixFilePermission.OWNER_EXECUTE)); + assertTrue(result.permissions().contains(PosixFilePermission.OWNER_WRITE)); + assertTrue(result.permissions().contains(PosixFilePermission.OWNER_READ)); } public S3ObjectSummary getS3ObjectSummary(S3Path s3Path) throws NoSuchFileException { diff --git a/src/test/java/com/upplication/s3fs/S3UtilsTest.java b/src/test/java/com/upplication/s3fs/S3UtilsTest.java index 52c1c90..2a9db3e 100644 --- a/src/test/java/com/upplication/s3fs/S3UtilsTest.java +++ b/src/test/java/com/upplication/s3fs/S3UtilsTest.java @@ -52,7 +52,6 @@ public void getS3ObjectSummary() throws IOException { assertEquals(19, file1ObjectSummary.getSize()); } - @Test(expected = NoSuchFileException.class) public void getS3ObjectSummary404() throws IOException { S3Path root = fileSystem.getPath("/bucket");