From bf2341af210089e4f4d4345f97ee6d14432481d7 Mon Sep 17 00:00:00 2001
From: Julian Raufelder <Julian@Raufelder.com>
Date: Tue, 11 May 2021 17:04:07 +0200
Subject: [PATCH] Use path and path prefix correctly in S3

---
 .../cryptomator/data/cloud/s3/S3CloudNodeFactory.java  |  2 +-
 .../java/org/cryptomator/data/cloud/s3/S3File.java     |  5 +++++
 .../java/org/cryptomator/data/cloud/s3/S3Folder.java   |  3 +++
 .../java/org/cryptomator/data/cloud/s3/S3Impl.java     | 10 +++++-----
 4 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/data/src/main/java/org/cryptomator/data/cloud/s3/S3CloudNodeFactory.java b/data/src/main/java/org/cryptomator/data/cloud/s3/S3CloudNodeFactory.java
index c14fabaf..12d8f712 100644
--- a/data/src/main/java/org/cryptomator/data/cloud/s3/S3CloudNodeFactory.java
+++ b/data/src/main/java/org/cryptomator/data/cloud/s3/S3CloudNodeFactory.java
@@ -33,7 +33,7 @@ class S3CloudNodeFactory {
 	}
 
 	private static String getNodePath(S3Folder parent, String name) {
-		return parent.getKey() + name;
+		return parent.getPath() + "/" + name;
 	}
 
 	public static String getNameFromKey(String key) {
diff --git a/data/src/main/java/org/cryptomator/data/cloud/s3/S3File.java b/data/src/main/java/org/cryptomator/data/cloud/s3/S3File.java
index ce3520f8..99b45ea9 100644
--- a/data/src/main/java/org/cryptomator/data/cloud/s3/S3File.java
+++ b/data/src/main/java/org/cryptomator/data/cloud/s3/S3File.java
@@ -8,6 +8,8 @@ import java.util.Date;
 
 class S3File implements CloudFile, S3Node {
 
+	private static final String DELIMITER = "/";
+
 	private final S3Folder parent;
 	private final String name;
 	private final String path;
@@ -39,6 +41,9 @@ class S3File implements CloudFile, S3Node {
 
 	@Override
 	public String getKey() {
+		if (path.startsWith(DELIMITER)) {
+			return path.substring(DELIMITER.length());
+		}
 		return path;
 	}
 
diff --git a/data/src/main/java/org/cryptomator/data/cloud/s3/S3Folder.java b/data/src/main/java/org/cryptomator/data/cloud/s3/S3Folder.java
index 591c6dea..bdfd8fc8 100644
--- a/data/src/main/java/org/cryptomator/data/cloud/s3/S3Folder.java
+++ b/data/src/main/java/org/cryptomator/data/cloud/s3/S3Folder.java
@@ -34,6 +34,9 @@ class S3Folder implements CloudFolder, S3Node {
 
 	@Override
 	public String getKey() {
+		if (path.startsWith(DELIMITER)) {
+			return path.substring(DELIMITER.length()) + DELIMITER;
+		}
 		return path + DELIMITER;
 	}
 
diff --git a/data/src/main/java/org/cryptomator/data/cloud/s3/S3Impl.java b/data/src/main/java/org/cryptomator/data/cloud/s3/S3Impl.java
index 1a294758..ff402ac7 100644
--- a/data/src/main/java/org/cryptomator/data/cloud/s3/S3Impl.java
+++ b/data/src/main/java/org/cryptomator/data/cloud/s3/S3Impl.java
@@ -184,7 +184,7 @@ class S3Impl {
 					targetKey = S3CloudNodeFactory.file((S3Folder) target, node.getName()).getKey();
 				}
 
-				CopySource copySource = CopySource.builder().bucket(cloud.s3Bucket()).object(node.getPath()).build();
+				CopySource copySource = CopySource.builder().bucket(cloud.s3Bucket()).object(node.getKey()).build();
 
 				CopyObjectArgs copyObjectArgs = CopyObjectArgs.builder().bucket(cloud.s3Bucket()).object(targetKey).source(copySource).build();
 				try {
@@ -206,8 +206,8 @@ class S3Impl {
 
 			return S3CloudNodeFactory.folder(target.getParent(), target.getName());
 		} else {
-			CopySource copySource = CopySource.builder().bucket(cloud.s3Bucket()).object(source.getPath()).build();
-			CopyObjectArgs copyObjectArgs = CopyObjectArgs.builder().bucket(cloud.s3Bucket()).object(target.getPath()).source(copySource).build();
+			CopySource copySource = CopySource.builder().bucket(cloud.s3Bucket()).object(source.getKey()).build();
+			CopyObjectArgs copyObjectArgs = CopyObjectArgs.builder().bucket(cloud.s3Bucket()).object(target.getKey()).source(copySource).build();
 			try {
 				ObjectWriteResponse result = client().copyObject(copyObjectArgs);
 
@@ -247,7 +247,7 @@ class S3Impl {
 				StatObjectResponse statObjectResponse = client().statObject(StatObjectArgs //
 						.builder() //
 						.bucket(cloud.s3Bucket()) //
-						.object(file.getPath()) //
+						.object(file.getKey()) //
 						.build());
 				progressAware.onProgress(Progress.completed(UploadState.upload(file)));
 				return S3CloudNodeFactory.file(file.getParent(), file.getName(), Optional.of(statObjectResponse.size()), Optional.of(Date.from(statObjectResponse.lastModified().toInstant())));
@@ -262,7 +262,7 @@ class S3Impl {
 	public void read(S3File file, OutputStream data, final ProgressAware<DownloadState> progressAware) throws IOException, BackendException {
 		progressAware.onProgress(Progress.started(DownloadState.download(file)));
 
-		GetObjectArgs getObjectArgs = GetObjectArgs.builder().bucket(cloud.s3Bucket()).object(file.getPath()).build();
+		GetObjectArgs getObjectArgs = GetObjectArgs.builder().bucket(cloud.s3Bucket()).object(file.getKey()).build();
 
 		try (GetObjectResponse response = client().getObject(getObjectArgs); //
 			 TransferredBytesAwareOutputStream out = new TransferredBytesAwareOutputStream(data) {