Skip to content
This repository was archived by the owner on Feb 26, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 12 additions & 8 deletions src/main/java/com/upplication/s3fs/util/S3Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<PosixFilePermission> 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<PosixFilePermission> permissions = toPosixFilePermissions(acl.getGrantsAsList());

return new S3PosixFileAttributes((String)attrs.fileKey(), attrs.lastModifiedTime(),
attrs.size(), attrs.isDirectory(), attrs.isRegularFile(), userPrincipal, null, permissions);
}
Expand Down
24 changes: 21 additions & 3 deletions src/test/java/com/upplication/s3fs/FilesIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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.*;
Expand Down Expand Up @@ -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();
Expand Down