From 55f24f5d3d93a0b72c65b4550a8794a5f74a2da5 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Thu, 5 Oct 2023 11:47:48 +0200
Subject: [PATCH 001/230] Fix #15174.
---
box/src/main/java/ch/cyberduck/core/box/BoxProtocol.java | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/box/src/main/java/ch/cyberduck/core/box/BoxProtocol.java b/box/src/main/java/ch/cyberduck/core/box/BoxProtocol.java
index 21243e8fbf9..3434bd8c55c 100644
--- a/box/src/main/java/ch/cyberduck/core/box/BoxProtocol.java
+++ b/box/src/main/java/ch/cyberduck/core/box/BoxProtocol.java
@@ -63,6 +63,11 @@ public DirectoryTimestamp getDirectoryTimestamp() {
return DirectoryTimestamp.explicit;
}
+ @Override
+ public Case getCaseSensitivity() {
+ return Case.insensitive;
+ }
+
@Override
public VersioningMode getVersioningMode() {
return VersioningMode.storage;
From ea8f74055ba03959a1a94ada9f1a5a74eb469b1e Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Thu, 5 Oct 2023 17:46:28 +0200
Subject: [PATCH 002/230] Fix implementation to work with bucket name in
hostname.
---
.../main/java/ch/cyberduck/core/s3/S3VersioningFeature.java | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/s3/src/main/java/ch/cyberduck/core/s3/S3VersioningFeature.java b/s3/src/main/java/ch/cyberduck/core/s3/S3VersioningFeature.java
index e5fc35e95d1..ea99e11f075 100644
--- a/s3/src/main/java/ch/cyberduck/core/s3/S3VersioningFeature.java
+++ b/s3/src/main/java/ch/cyberduck/core/s3/S3VersioningFeature.java
@@ -182,13 +182,15 @@ public void revert(final Path file) throws BackgroundException {
catch(AccessDeniedException | InteroperabilityException e) {
log.warn(String.format("Ignore failure %s", e));
}
+ final Path bucket = containerService.getContainer(file);
+ final String bucketname = bucket.isRoot() ? RequestEntityRestStorageService.findBucketInHostname(session.getHost()) : bucket.getName();
session.getClient().copyVersionedObject(file.attributes().getVersionId(),
- containerService.getContainer(file).getName(), containerService.getKey(file), containerService.getContainer(file).getName(), destination, false);
+ bucketname, containerService.getKey(file), bucketname, destination, false);
if(file.getParent().attributes().getCustom().containsKey(S3VersionedObjectListService.KEY_DELETE_MARKER)) {
// revert placeholder
session.getClient().deleteVersionedObject(
file.getParent().attributes().getVersionId(),
- containerService.getContainer(file).getName(), containerService.getKey(file.getParent()));
+ bucketname, containerService.getKey(file.getParent()));
}
}
catch(ServiceException e) {
From 9ac9187122a6285bc76f5dd1e898b98e8f07c2ec Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Thu, 5 Oct 2023 17:53:43 +0200
Subject: [PATCH 003/230] Fix implementation to work with bucket name in
hostname as in 7600ac32.
---
.../core/s3/S3MultipartCopyFeature.java | 2 +-
.../core/s3/S3MultipartCopyFeatureTest.java | 23 +++++++++++++++++++
2 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/s3/src/main/java/ch/cyberduck/core/s3/S3MultipartCopyFeature.java b/s3/src/main/java/ch/cyberduck/core/s3/S3MultipartCopyFeature.java
index 574f820f892..aaf0658b0cf 100644
--- a/s3/src/main/java/ch/cyberduck/core/s3/S3MultipartCopyFeature.java
+++ b/s3/src/main/java/ch/cyberduck/core/s3/S3MultipartCopyFeature.java
@@ -124,7 +124,7 @@ public MultipartPart call() throws BackgroundException {
final HttpRange range = HttpRange.byLength(offset, length);
final Path bucket = containerService.getContainer(source);
final MultipartPart part = session.getClient().multipartUploadPartCopy(multipart, partNumber,
- bucket.isRoot() ? StringUtils.EMPTY : bucket.getName(), containerService.getKey(source),
+ bucket.isRoot() ? RequestEntityRestStorageService.findBucketInHostname(session.getHost()) : bucket.getName(), containerService.getKey(source),
null, null, null, null, range.getStart(), range.getEnd(), source.attributes().getVersionId());
if(log.isInfoEnabled()) {
log.info(String.format("Received response %s for part number %d", part, partNumber));
diff --git a/s3/src/test/java/ch/cyberduck/core/s3/S3MultipartCopyFeatureTest.java b/s3/src/test/java/ch/cyberduck/core/s3/S3MultipartCopyFeatureTest.java
index 70db9217fe1..0cbf8a9be9a 100644
--- a/s3/src/test/java/ch/cyberduck/core/s3/S3MultipartCopyFeatureTest.java
+++ b/s3/src/test/java/ch/cyberduck/core/s3/S3MultipartCopyFeatureTest.java
@@ -17,6 +17,7 @@
* Bug fixes, suggestions and comments should be sent to feedback@cyberduck.ch
*/
+import ch.cyberduck.core.AlphanumericRandomStringService;
import ch.cyberduck.core.DisabledConnectionCallback;
import ch.cyberduck.core.DisabledLoginCallback;
import ch.cyberduck.core.Path;
@@ -66,6 +67,28 @@ public void testCopy() throws Exception {
new S3DefaultDeleteFeature(session).delete(Collections.singletonList(copy), new DisabledLoginCallback(), new Delete.DisabledCallback());
}
+ @Test
+ public void testCopyBucketNameInHostname() throws Exception {
+ final Path test = new Path(new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.file));
+ final byte[] content = RandomUtils.nextBytes(1023);
+ final TransferStatus status = new TransferStatus().withLength(content.length);
+ status.setChecksum(new SHA256ChecksumCompute().compute(new ByteArrayInputStream(content), status));
+ final OutputStream out = new S3WriteFeature(virtualhost, new S3AccessControlListFeature(virtualhost)).write(test, status, new DisabledConnectionCallback());
+ assertNotNull(out);
+ new StreamCopier(new TransferStatus(), new TransferStatus()).transfer(new ByteArrayInputStream(content), out);
+ out.close();
+ test.attributes().setSize(content.length);
+ final Path copy = new Path(new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.file));
+ final S3MultipartCopyFeature feature = new S3MultipartCopyFeature(virtualhost, new S3AccessControlListFeature(virtualhost));
+ feature.copy(test, copy, status, new DisabledConnectionCallback(), new DisabledStreamListener());
+ assertTrue(new S3FindFeature(virtualhost, new S3AccessControlListFeature(virtualhost)).find(test));
+ assertEquals(content.length, new S3AttributesFinderFeature(virtualhost, new S3AccessControlListFeature(virtualhost)).find(test).getSize());
+ new S3DefaultDeleteFeature(virtualhost).delete(Collections.singletonList(test), new DisabledLoginCallback(), new Delete.DisabledCallback());
+ assertTrue(new S3FindFeature(virtualhost, new S3AccessControlListFeature(virtualhost)).find(copy));
+ assertEquals(content.length, new S3AttributesFinderFeature(virtualhost, new S3AccessControlListFeature(virtualhost)).find(copy).getSize());
+ new S3DefaultDeleteFeature(virtualhost).delete(Collections.singletonList(copy), new DisabledLoginCallback(), new Delete.DisabledCallback());
+ }
+
@Test
public void testCopyAWS4Signature() throws Exception {
final Path container = new Path("test-eu-central-1-cyberduck", EnumSet.of(Path.Type.directory, Path.Type.volume));
From 12c1862341cad2107b410fdb4fc205224f13317a Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Thu, 5 Oct 2023 17:53:47 +0200
Subject: [PATCH 004/230] Fix test.
---
s3/src/test/java/ch/cyberduck/core/s3/S3ListServiceTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/s3/src/test/java/ch/cyberduck/core/s3/S3ListServiceTest.java b/s3/src/test/java/ch/cyberduck/core/s3/S3ListServiceTest.java
index 20ccddc6a8d..cfd169799eb 100644
--- a/s3/src/test/java/ch/cyberduck/core/s3/S3ListServiceTest.java
+++ b/s3/src/test/java/ch/cyberduck/core/s3/S3ListServiceTest.java
@@ -37,7 +37,7 @@ public class S3ListServiceTest extends AbstractS3Test {
@Test
public void testListBucketNameInHostname() throws Exception {
- new S3ListService(virtualhost, new S3AccessControlListFeature(session)).list(
+ new S3ListService(virtualhost, new S3AccessControlListFeature(virtualhost)).list(
new Path("/", EnumSet.of(Path.Type.directory, Path.Type.volume)), new DisabledListProgressListener());
}
From d89f2217b6f0749362d04cd83c5ff6a433004eec Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Thu, 5 Oct 2023 18:10:22 +0200
Subject: [PATCH 005/230] Handle special case to determine logging target with
bucket name in hostname.
---
.../cyberduck/core/s3/S3LoggingFeature.java | 20 ++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/s3/src/main/java/ch/cyberduck/core/s3/S3LoggingFeature.java b/s3/src/main/java/ch/cyberduck/core/s3/S3LoggingFeature.java
index 8bebe9563b9..b5f3018b49f 100644
--- a/s3/src/main/java/ch/cyberduck/core/s3/S3LoggingFeature.java
+++ b/s3/src/main/java/ch/cyberduck/core/s3/S3LoggingFeature.java
@@ -23,6 +23,7 @@
import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.exception.InteroperabilityException;
+import ch.cyberduck.core.features.Home;
import ch.cyberduck.core.features.Logging;
import ch.cyberduck.core.logging.LoggingConfiguration;
import ch.cyberduck.core.preferences.HostPreferences;
@@ -63,14 +64,19 @@ public LoggingConfiguration getConfiguration(final Path file) throws BackgroundE
}
final LoggingConfiguration configuration = new LoggingConfiguration(status.isLoggingEnabled(),
status.getTargetBucketName());
- try {
- configuration.setContainers(new S3BucketListService(session).list(
- new Path(String.valueOf(Path.DELIMITER), EnumSet.of(Path.Type.volume, Path.Type.directory)),
- new DisabledListProgressListener()).toList());
+ if(bucket.isRoot()) {
+ configuration.setContainers(Collections.singletonList(
+ new Path(RequestEntityRestStorageService.findBucketInHostname(session.getHost()), EnumSet.of(Path.Type.volume, Path.Type.directory)))
+ );
}
- catch(AccessDeniedException | InteroperabilityException e) {
- log.warn(String.format("Failure listing buckets. %s", e.getMessage()));
- configuration.setContainers(Collections.singletonList(bucket));
+ else {
+ try {
+ configuration.setContainers(new S3BucketListService(session).list(Home.ROOT, new DisabledListProgressListener()).toList());
+ }
+ catch(AccessDeniedException | InteroperabilityException e) {
+ log.warn(String.format("Failure listing buckets. %s", e.getMessage()));
+ configuration.setContainers(Collections.singletonList(bucket));
+ }
}
return configuration;
}
From 6f9299197ee566f321db747f7356fda02a30917f Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 5 Oct 2023 16:14:26 +0000
Subject: [PATCH 006/230] Bump commons-net:commons-net from 3.9.0 to 3.10.0
Bumps commons-net:commons-net from 3.9.0 to 3.10.0.
---
updated-dependencies:
- dependency-name: commons-net:commons-net
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 3757e5986c7..8978d8a46ed 100644
--- a/pom.xml
+++ b/pom.xml
@@ -174,7 +174,7 @@
commons-net
commons-net
- 3.9.0
+ 3.10.0
org.apache.commons
From 5d11f4cb177418fd82392938d6b93aea09919730 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Thu, 5 Oct 2023 18:19:24 +0200
Subject: [PATCH 007/230] Fix implementation to work with bucket name in
hostname.
---
s3/src/main/java/ch/cyberduck/core/s3/S3LoggingFeature.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/s3/src/main/java/ch/cyberduck/core/s3/S3LoggingFeature.java b/s3/src/main/java/ch/cyberduck/core/s3/S3LoggingFeature.java
index b5f3018b49f..f7d8160989b 100644
--- a/s3/src/main/java/ch/cyberduck/core/s3/S3LoggingFeature.java
+++ b/s3/src/main/java/ch/cyberduck/core/s3/S3LoggingFeature.java
@@ -99,11 +99,11 @@ public void setConfiguration(final Path file, final LoggingConfiguration configu
try {
final S3BucketLoggingStatus status = new S3BucketLoggingStatus(
StringUtils.isNotBlank(configuration.getLoggingTarget()) ? configuration.getLoggingTarget() :
- bucket.isRoot() ? StringUtils.EMPTY : bucket.getName(), null);
+ bucket.isRoot() ? RequestEntityRestStorageService.findBucketInHostname(session.getHost()) : bucket.getName(), null);
if(configuration.isEnabled()) {
status.setLogfilePrefix(new HostPreferences(session.getHost()).getProperty("s3.logging.prefix"));
}
- session.getClient().setBucketLoggingStatus(bucket.getName(), status, true);
+ session.getClient().setBucketLoggingStatus(bucket.isRoot() ? StringUtils.EMPTY : bucket.getName(), status, true);
}
catch(ServiceException e) {
throw new S3ExceptionMappingService().map("Failure to write attributes of {0}", e, file);
From f2802af6a8bb3dc1842682b39f648f5ed2d3ae14 Mon Sep 17 00:00:00 2001
From: Jenkins CI
Date: Tue, 10 Oct 2023 12:49:01 +0200
Subject: [PATCH 008/230] Pull localization changes from Transifex
---
i18n/src/main/resources/ar.lproj/Browser.xib | 2 +-
.../src/main/resources/sv.lproj/Error.strings | Bin 4174 -> 4172 bytes
2 files changed, 1 insertion(+), 1 deletion(-)
diff --git a/i18n/src/main/resources/ar.lproj/Browser.xib b/i18n/src/main/resources/ar.lproj/Browser.xib
index 27a21bed607..50c3feaadc7 100644
--- a/i18n/src/main/resources/ar.lproj/Browser.xib
+++ b/i18n/src/main/resources/ar.lproj/Browser.xib
@@ -256,7 +256,7 @@
-
+
diff --git a/i18n/src/main/resources/sv.lproj/Error.strings b/i18n/src/main/resources/sv.lproj/Error.strings
index a71f5b363cada579f78c11779e27aec3b950d1a7..57e659c6566bc585d6277ec34eb20263dcb20547 100644
GIT binary patch
delta 32
mcmX@7a7JN+iGV~fLkYt-h7^Wk1_g#phCCoIl|hNYngIZtAP1-b
delta 14
VcmX@3a86-^iNItL0SP8+1^_0z1KR)q
From d823292c4f13b2972875cdb37f86b2b1fbf5a4fb Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Tue, 10 Oct 2023 14:55:00 +0200
Subject: [PATCH 009/230] Fix #15183.
---
.../cyberduck/core/sftp/auth/SFTPPublicKeyAuthentication.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/ssh/src/main/java/ch/cyberduck/core/sftp/auth/SFTPPublicKeyAuthentication.java b/ssh/src/main/java/ch/cyberduck/core/sftp/auth/SFTPPublicKeyAuthentication.java
index e8307a75f7f..5eb45d8a745 100644
--- a/ssh/src/main/java/ch/cyberduck/core/sftp/auth/SFTPPublicKeyAuthentication.java
+++ b/ssh/src/main/java/ch/cyberduck/core/sftp/auth/SFTPPublicKeyAuthentication.java
@@ -32,6 +32,7 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
@@ -90,7 +91,7 @@ public Boolean authenticate(final Host bookmark, final LoginCallback prompt, fin
default:
throw new InteroperabilityException(String.format("Unknown key format for file %s", identity.getName()));
}
- provider.init(new InputStreamReader(identity.getInputStream(), StandardCharsets.UTF_8), new PasswordFinder() {
+ provider.init(new File(identity.getAbsolute()), new PasswordFinder() {
@Override
public char[] reqPassword(Resource> resource) {
if(StringUtils.isEmpty(credentials.getIdentityPassphrase())) {
From 44405325cf7e824b360719b098f754d674306de0 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Tue, 10 Oct 2023 15:30:04 +0200
Subject: [PATCH 010/230] Make verdict part of hash code.
---
core/src/main/java/ch/cyberduck/core/PathAttributes.java | 5 +++++
core/src/test/java/ch/cyberduck/core/PathAttributesTest.java | 3 +++
2 files changed, 8 insertions(+)
diff --git a/core/src/main/java/ch/cyberduck/core/PathAttributes.java b/core/src/main/java/ch/cyberduck/core/PathAttributes.java
index eaede24331f..b95da23b494 100644
--- a/core/src/main/java/ch/cyberduck/core/PathAttributes.java
+++ b/core/src/main/java/ch/cyberduck/core/PathAttributes.java
@@ -674,6 +674,9 @@ public boolean equals(final Object o) {
if(!Objects.equals(revision, that.revision)) {
return false;
}
+ if(!Objects.equals(verdict, that.verdict)) {
+ return false;
+ }
return true;
}
@@ -687,6 +690,7 @@ public int hashCode() {
result = 31 * result + (versionId != null ? versionId.hashCode() : 0);
result = 31 * result + (fileId != null ? fileId.hashCode() : 0);
result = 31 * result + (revision != null ? revision.hashCode() : 0);
+ result = 31 * result + (verdict != null ? verdict.hashCode() : 0);
return result;
}
@@ -714,6 +718,7 @@ public String toString() {
sb.append(", region='").append(region).append('\'');
sb.append(", metadata=").append(metadata).append('\'');
sb.append(", custom=").append(custom).append('\'');
+ sb.append(", verdict=").append(verdict).append('\'');
sb.append('}');
return sb.toString();
}
diff --git a/core/src/test/java/ch/cyberduck/core/PathAttributesTest.java b/core/src/test/java/ch/cyberduck/core/PathAttributesTest.java
index 8177275ff89..77513a7b72b 100644
--- a/core/src/test/java/ch/cyberduck/core/PathAttributesTest.java
+++ b/core/src/test/java/ch/cyberduck/core/PathAttributesTest.java
@@ -28,6 +28,7 @@ public void testCopy() {
attributes.setDuplicate(true);
attributes.setLockId(new AlphanumericRandomStringService().random());
attributes.setPermission(new Permission(644));
+ attributes.setVerdict(PathAttributes.Verdict.pending);
final PathAttributes clone = new PathAttributes(attributes);
assertEquals(clone.getPermission(), attributes.getPermission());
assertEquals(clone.getModificationDate(), attributes.getModificationDate());
@@ -79,6 +80,7 @@ public void testSerialize() {
attributes.setDuplicate(true);
attributes.setRegion("region");
attributes.setStorageClass("storageClass");
+ attributes.setVerdict(PathAttributes.Verdict.pending);
final Map custom = new HashMap<>(attributes.getCustom());
custom.put("key", "value");
attributes.setCustom(custom);
@@ -93,6 +95,7 @@ public void testSerialize() {
assertEquals(attributes.isDuplicate(), deserialized.isDuplicate());
assertEquals(attributes.getRegion(), deserialized.getRegion());
assertEquals(attributes.getStorageClass(), deserialized.getStorageClass());
+ assertEquals(attributes.getVerdict(), deserialized.getVerdict());
assertEquals(attributes.getCustom(), deserialized.getCustom());
assertEquals(attributes, deserialized);
}
From 64c062bda4c270c2bde3bb1ebe58d99ca939cd53 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Wed, 11 Oct 2023 10:10:24 +0200
Subject: [PATCH 011/230] Add test.
---
.../core/worker/B2SingleTransferWorkerTest.java | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/backblaze/src/test/java/ch/cyberduck/core/worker/B2SingleTransferWorkerTest.java b/backblaze/src/test/java/ch/cyberduck/core/worker/B2SingleTransferWorkerTest.java
index 0129d970728..3a3ade717b8 100644
--- a/backblaze/src/test/java/ch/cyberduck/core/worker/B2SingleTransferWorkerTest.java
+++ b/backblaze/src/test/java/ch/cyberduck/core/worker/B2SingleTransferWorkerTest.java
@@ -26,6 +26,7 @@
import ch.cyberduck.core.Local;
import ch.cyberduck.core.LoginConnectionService;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.PathAttributes;
import ch.cyberduck.core.b2.B2AttributesFinderFeature;
import ch.cyberduck.core.b2.B2DeleteFeature;
import ch.cyberduck.core.b2.B2LargeUploadService;
@@ -35,6 +36,7 @@
import ch.cyberduck.core.b2.B2WriteFeature;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.features.Upload;
+import ch.cyberduck.core.io.Checksum;
import ch.cyberduck.core.notification.DisabledNotificationService;
import ch.cyberduck.core.ssl.DefaultX509KeyManager;
import ch.cyberduck.core.ssl.DefaultX509TrustManager;
@@ -65,8 +67,7 @@
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
@Category(IntegrationTest.class)
public class B2SingleTransferWorkerTest extends VaultTest {
@@ -95,6 +96,9 @@ public String getProperty(final String key) {
if("b2.upload.largeobject.concurrency".equals(key)) {
return String.valueOf(5);
}
+ if("queue.upload.checksum.calculate".equals(key)) {
+ return String.valueOf(true);
+ }
return super.getProperty(key);
}
};
@@ -151,7 +155,9 @@ public TransferAction prompt(final TransferItem file) {
local.delete();
assertTrue(t.isComplete());
final B2VersionIdProvider fileid = new B2VersionIdProvider(session);
- assertEquals(content.length, new B2AttributesFinderFeature(session, fileid).find(test).getSize());
+ final PathAttributes attr = new B2AttributesFinderFeature(session, fileid).find(test);
+ assertNotEquals(Checksum.NONE, attr.getChecksum());
+ assertEquals(content.length, attr.getSize());
assertEquals(content.length, counter.getRecv(), 0L);
assertEquals(content.length, counter.getSent(), 0L);
assertTrue(failed.get());
From d841a9b9369168b3b458a035e6801bbbb5383e5e Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Wed, 11 Oct 2023 10:23:53 +0200
Subject: [PATCH 012/230] Add test.
---
.../java/ch/cyberduck/core/b2/B2LargeUploadServiceTest.java | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/backblaze/src/test/java/ch/cyberduck/core/b2/B2LargeUploadServiceTest.java b/backblaze/src/test/java/ch/cyberduck/core/b2/B2LargeUploadServiceTest.java
index 3f859f79ef6..d4e97dfbf17 100644
--- a/backblaze/src/test/java/ch/cyberduck/core/b2/B2LargeUploadServiceTest.java
+++ b/backblaze/src/test/java/ch/cyberduck/core/b2/B2LargeUploadServiceTest.java
@@ -21,6 +21,7 @@
import ch.cyberduck.core.DisabledLoginCallback;
import ch.cyberduck.core.Local;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.PathAttributes;
import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.features.Delete;
@@ -79,7 +80,9 @@ public void testUpload() throws Exception {
upload.upload(test, local, new BandwidthThrottle(BandwidthThrottle.UNLIMITED), new DisabledStreamListener(),
status, new DisabledConnectionCallback());
- assertEquals(checksum, new B2AttributesFinderFeature(session, fileid).find(test).getChecksum());
+ final PathAttributes attr = new B2AttributesFinderFeature(session, fileid).find(test);
+ assertNotEquals(Checksum.NONE, attr.getChecksum());
+ assertEquals(checksum, attr.getChecksum());
status.validate();
assertTrue(status.isComplete());
assertEquals(content.length, status.getResponse().getSize());
From c7aab0406d861caf1a4da1bea53e71e7c1955e49 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Wed, 11 Oct 2023 10:23:23 +0200
Subject: [PATCH 013/230] Use file id for comparison because checksum may not
be present for large file uploads.
---
backblaze/src/main/java/ch/cyberduck/core/b2/B2Protocol.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/backblaze/src/main/java/ch/cyberduck/core/b2/B2Protocol.java b/backblaze/src/main/java/ch/cyberduck/core/b2/B2Protocol.java
index 127511ec36c..53047c46bcf 100644
--- a/backblaze/src/main/java/ch/cyberduck/core/b2/B2Protocol.java
+++ b/backblaze/src/main/java/ch/cyberduck/core/b2/B2Protocol.java
@@ -18,9 +18,9 @@
import ch.cyberduck.core.AbstractProtocol;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.Scheme;
-import ch.cyberduck.core.synchronization.ChecksumComparisonService;
import ch.cyberduck.core.synchronization.ComparisonService;
import ch.cyberduck.core.synchronization.DefaultComparisonService;
+import ch.cyberduck.core.synchronization.VersionIdComparisonService;
import ch.cyberduck.core.text.DefaultLexicographicOrderComparator;
import java.util.Comparator;
@@ -94,7 +94,7 @@ public T getFeature(final Class type) {
return (T) new B2PathContainerService();
}
if(type == ComparisonService.class) {
- return (T) new DefaultComparisonService(new ChecksumComparisonService(), ComparisonService.disabled);
+ return (T) new DefaultComparisonService(new VersionIdComparisonService(), ComparisonService.disabled);
}
return super.getFeature(type);
}
From 02d2749083807f9703a9cd3cd583a00add87ecb3 Mon Sep 17 00:00:00 2001
From: Yves Langisch
Date: Wed, 11 Oct 2023 12:46:03 +0200
Subject: [PATCH 014/230] Typo.
---
Changelog.txt | 2 +-
www/update/changelog.html | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Changelog.txt b/Changelog.txt
index 5c3f39cdcd9..82c5f88dd93 100644
--- a/Changelog.txt
+++ b/Changelog.txt
@@ -2,7 +2,7 @@ Cyberduck
https://cyberduck.io/
8.7.0
-- [Feature] Suport to login using temporary credentials from Security Token Service (STS API) using OpenID Connect (OIDC) web identity (S3) (#13804)
+- [Feature] Support to login using temporary credentials from Security Token Service (STS API) using OpenID Connect (OIDC) web identity (S3) (#13804)
- [Feature] Login using connection profile for AWS S3/STS + Google (OIDC) (S3)
- [Feature] Login using connection profile for AWS S3/STS + Azure AD (OIDC) (S3)
- [Feature] Support login using OAuth 2.0 in (ownCloud) (#14876)
diff --git a/www/update/changelog.html b/www/update/changelog.html
index 1eda224ffbd..5902c2dd733 100755
--- a/www/update/changelog.html
+++ b/www/update/changelog.html
@@ -81,7 +81,7 @@
Version 8.7.0
- Feature Suport to login using temporary credentials from Security Token
+ Feature Support to login using temporary credentials from Security Token
Service (STS API) using OpenID Connect (OIDC) web identity (S3) (#13804 )
From 6e740c25966d158e0bafe693c74495f19f2fabe9 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Wed, 11 Oct 2023 12:55:38 +0200
Subject: [PATCH 015/230] Fix tests.
---
.../DefaultTemporaryFileServiceTest.java | 20 +++++++++----------
.../local/FlatTemporaryFileServiceTest.java | 10 +++++-----
2 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/core/src/test/java/ch/cyberduck/core/local/DefaultTemporaryFileServiceTest.java b/core/src/test/java/ch/cyberduck/core/local/DefaultTemporaryFileServiceTest.java
index 5e96a1ed62f..46d4a38b900 100755
--- a/core/src/test/java/ch/cyberduck/core/local/DefaultTemporaryFileServiceTest.java
+++ b/core/src/test/java/ch/cyberduck/core/local/DefaultTemporaryFileServiceTest.java
@@ -37,11 +37,11 @@ public void testExists() {
public void testCreateFile() {
final String temp = StringUtils.removeEnd(System.getProperty("java.io.tmpdir"), File.separator);
final String s = System.getProperty("file.separator");
- assertEquals(String.format("%s%su%sp%s887503681%sf", temp, s, s, s, s),
+ assertEquals(String.format("%s%su%sp%s1742810335%sf", temp, s, s, s, s),
new DefaultTemporaryFileService().create("u", new Path("/p/f", EnumSet.of(Path.Type.file))).getAbsolute());
final Path file = new Path("/p/f", EnumSet.of(Path.Type.file));
file.attributes().setRegion("region");
- assertEquals(String.format("%s%su%sp%s887503681%sf", temp, s, s, s, s),
+ assertEquals(String.format("%s%su%sp%s1742810335%sf", temp, s, s, s, s),
new DefaultTemporaryFileService().create("u", file).getAbsolute());
}
@@ -53,14 +53,14 @@ public void testVersion() {
final Path file = new Path("/p/f", EnumSet.of(Path.Type.file));
file.attributes().setRegion("region");
file.attributes().setVersionId("2");
- assertEquals(String.format("%s%su%sp%s887551731%sf", temp, s, s, s, s),
+ assertEquals(String.format("%s%su%sp%s1744299885%sf", temp, s, s, s, s),
new DefaultTemporaryFileService().create("u", file).getAbsolute());
}
{
final Path file = new Path("/p", EnumSet.of(Path.Type.directory));
file.attributes().setRegion("region");
file.attributes().setVersionId("2");
- assertEquals(String.format("%s%su%s887551731%sp", temp, s, s, s),
+ assertEquals(String.format("%s%su%s1744299885%sp", temp, s, s, s),
new DefaultTemporaryFileService().create("u", file).getAbsolute());
}
}
@@ -71,7 +71,7 @@ public void testCreateContainer() {
final String s = System.getProperty("file.separator");
final Path file = new Path("/container", EnumSet.of(Path.Type.directory));
file.attributes().setRegion("region");
- assertEquals(String.format("%s%su%s887503681%scontainer", temp, s, s, s),
+ assertEquals(String.format("%s%su%s1742810335%scontainer", temp, s, s, s),
new DefaultTemporaryFileService().create("u", file).getAbsolute());
}
@@ -87,8 +87,8 @@ public void testPathTooLong() {
file.attributes().setVersionId("2");
final Local local = new DefaultTemporaryFileService().create("UID", file);
final String localFile = local.getAbsolute();
- assertNotEquals(String.format("%s/%s%s/887551731/%s", temp, "UID", testPathDirectory, testPathFile).replace('/', File.separatorChar), localFile);
- assertEquals(String.format("%s/%s/%s/887551731/%s", temp, "UID", testPathMD5, testPathFile).replace('/', File.separatorChar), localFile);
+ assertNotEquals(String.format("%s/%s%s/1744299885/%s", temp, "UID", testPathDirectory, testPathFile).replace('/', File.separatorChar), localFile);
+ assertEquals(String.format("%s/%s/%s/1744299885/%s", temp, "UID", testPathMD5, testPathFile).replace('/', File.separatorChar), localFile);
}
@Test
@@ -103,8 +103,8 @@ public void testPathNotTooLong() {
file.attributes().setVersionId("2");
final Local local = new DefaultTemporaryFileService().create("UID", file);
final String localFile = local.getAbsolute();
- assertEquals(String.format("%s/%s%s/887551731/%s", temp, "UID", testPathDirectory, testPathFile).replace('/', File.separatorChar), localFile);
- assertNotEquals(String.format("%s/%s%s/887551731/%s", temp, "UID", testPathMD5, testPathFile).replace('/', File.separatorChar), localFile);
+ assertEquals(String.format("%s/%s%s/1744299885/%s", temp, "UID", testPathDirectory, testPathFile).replace('/', File.separatorChar), localFile);
+ assertNotEquals(String.format("%s/%s%s/1744299885/%s", temp, "UID", testPathMD5, testPathFile).replace('/', File.separatorChar), localFile);
}
@Test
@@ -115,7 +115,7 @@ public void testTemporaryPath() {
final Local local = new DefaultTemporaryFileService().create(file);
assertEquals("t.txt", file.getName());
assertEquals("t.txt", local.getName());
- assertEquals("887550770", local.getParent().getName());
+ assertEquals("1744270094", local.getParent().getName());
assertEquals("f2", local.getParent().getParent().getName());
assertEquals("f1", local.getParent().getParent().getParent().getName());
}
diff --git a/core/src/test/java/ch/cyberduck/core/local/FlatTemporaryFileServiceTest.java b/core/src/test/java/ch/cyberduck/core/local/FlatTemporaryFileServiceTest.java
index 1425d834e96..c8634e15e4d 100644
--- a/core/src/test/java/ch/cyberduck/core/local/FlatTemporaryFileServiceTest.java
+++ b/core/src/test/java/ch/cyberduck/core/local/FlatTemporaryFileServiceTest.java
@@ -53,11 +53,11 @@ public void testExists() {
public void testCreateFile() {
final String temp = StringUtils.removeEnd(System.getProperty("java.io.tmpdir"), File.separator);
final String s = System.getProperty("file.separator");
- assertEquals(String.format("%s%su%s887503681-f", temp, s, s),
+ assertEquals(String.format("%s%su%s1742810335-f", temp, s, s),
new FlatTemporaryFileService().create("u", new Path("/p/f", EnumSet.of(Path.Type.file))).getAbsolute());
final Path file = new Path("/p/f", EnumSet.of(Path.Type.file));
file.attributes().setRegion("region");
- assertEquals(String.format("%s%su%s887503681-f", temp, s, s),
+ assertEquals(String.format("%s%su%s1742810335-f", temp, s, s),
new FlatTemporaryFileService().create("u", file).getAbsolute());
}
@@ -67,7 +67,7 @@ public void testCreateContainer() {
final String s = System.getProperty("file.separator");
final Path file = new Path("/container", EnumSet.of(Path.Type.directory));
file.attributes().setRegion("region");
- assertEquals(String.format("%s%su%s887503681-container", temp, s, s),
+ assertEquals(String.format("%s%su%s1742810335-container", temp, s, s),
new FlatTemporaryFileService().create("u", file).getAbsolute());
}
@@ -99,8 +99,8 @@ public void testPathNotTooLong() {
final Local local = new FlatTemporaryFileService().create("UID", file);
assertTrue(local.getParent().exists());
final String localFile = local.getAbsolute();
- assertEquals(String.format("%s/%s/887551731-%s", temp, "UID", testPathFile).replace('/', File.separatorChar), localFile);
- assertNotEquals(String.format("%s/%s%s/2/887551731-%s", temp, "UID", testPathMD5, testPathFile).replace('/', File.separatorChar), localFile);
+ assertEquals(String.format("%s/%s/1744299885-%s", temp, "UID", testPathFile).replace('/', File.separatorChar), localFile);
+ assertNotEquals(String.format("%s/%s%s/2/1744299885-%s", temp, "UID", testPathMD5, testPathFile).replace('/', File.separatorChar), localFile);
}
@Test
From 763e8613559c85efbe533e5e1108a5ba4b4fa97a Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Wed, 11 Oct 2023 12:05:07 +0200
Subject: [PATCH 016/230] Update dependency.
---
osx/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/osx/pom.xml b/osx/pom.xml
index 1226f79e7a1..2cbcdbf8e1d 100644
--- a/osx/pom.xml
+++ b/osx/pom.xml
@@ -115,7 +115,7 @@
org.sparkle-project
sparkle
zip
- 2.4.1
+ 2.5.0
${project.build.directory}
From 79314904d1126df93468aa4be5f1a3e7bb5b5eaf Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Wed, 11 Oct 2023 12:05:31 +0200
Subject: [PATCH 017/230] Adapting release notes based on currently installed
version.
---
www/update/changelog.html | 76 +++++++++++++++++++++------------------
1 file changed, 41 insertions(+), 35 deletions(-)
diff --git a/www/update/changelog.html b/www/update/changelog.html
index 5902c2dd733..b86b2d7dcd0 100755
--- a/www/update/changelog.html
+++ b/www/update/changelog.html
@@ -55,13 +55,19 @@
vertical-align: baseline;
border-radius: .25em;
}
+
ul li {
list-style-type: none;
line-height: 1.5em;
}
+
ul li ul li {
list-style-type: disc;
}
+
+ ul.sparkle-installed-version {
+ opacity: 0.5;
+ }
@@ -80,7 +86,7 @@
Version 8.7.0
-
+
Feature Support to login using temporary credentials from Security Token
Service (STS API) using OpenID Connect (OIDC) web identity (S3) (#13804 )
@@ -114,7 +120,7 @@
Version 8.6.3
-
+
Bugfix Failure configuring credentials from AWS CLI setup (S3) (#14970 )
@@ -126,7 +132,7 @@
Version 8.6.2
-
+
Feature Allow to open connections without copying authentication code
after login (Microsoft OneDrive, Sharepoint)
@@ -168,14 +174,14 @@
Version 8.6.1
-
+
Bugfix Parse seconds or milliseconds from Mtime in metadata (S3)
Version 8.6.0
-
+
Feature Add preference "Use Keychain" when unlocking vaults
(Cryptomator) (#14662 )
@@ -223,7 +229,7 @@
Version 8.5.9
-
+
Bugfix Requires force quit after opening file multiple times in
external editor (macOS) (#14412 )
@@ -233,7 +239,7 @@
Version 8.5.8
-
+
Bugfix Presigned URL does not consider the server port number (S3) (#13981 )
@@ -257,7 +263,7 @@
Version 8.5.7
-
+
Bugfix Cannot create or duplicate files with any suffix (#14263 )
@@ -303,7 +309,7 @@
Version 8.5.6
-
+
Bugfix Support for vaults using GCM encryption (Cryptomator) (#14207 )
@@ -322,7 +328,7 @@
Version 8.5.5
-
+
Bugfix Save OAuth tokens with username to allow connecting to different
accounts (Google Drive,
Google Storage, OneDrive, Dropbox, Box)
@@ -332,7 +338,7 @@
Version 8.5.4
-
+
Bugfix Failure authorizing using OAuth with no desktop browser
installed (Linux) (#14028 )
@@ -350,7 +356,7 @@
Version 8.5.3
-
+
Bugfix Failure uploading file with diacritic in filename (Windows) (#13723 )
@@ -372,7 +378,7 @@
Version 8.5.2
-
+
Bugfix Invalid syntax in Open in Terminal command (SFTP, macOS)
Bugfix Passwords for ProxyJump hosts in .ssh/config are not saved
(SFTP) (
Version 8.5.1
-
+
Feature Skip button to allow creating share with no passphrase
(Dropbox, Box, ownCloud, Nextcloud) (#13846 )
@@ -408,7 +414,7 @@
Version 8.5.0
-
+
Feature Allow to view and revert previous versions of files (ownCloud,
Nextcloud) (#10560 )
@@ -429,7 +435,7 @@
Version 8.4.5
-
+
Bugfix Failure enabling connection profile from Preferences (#13739 )
@@ -445,7 +451,7 @@
Version 8.4.4
-
+
Bugfix Prioritise password authentication if password is available
(SFTP) (#13442 )
@@ -466,7 +472,7 @@
Version 8.4.3
-
+
Bugfix Repeated prompt to verify server fingerprint (SFTP, Windows) (#13638 )
@@ -485,7 +491,7 @@
Version 8.4.2
-
+
Bugfix Setting to always open default editor application set in
Preferences (Windows) (#13546 )
@@ -498,7 +504,7 @@
Version 8.4.1
-
+
Bugfix Crash running on versions prior macOS 11 (#13521 )
@@ -507,7 +513,7 @@
Version 8.4.0
-
+
Feature Revert previous file versions in Info panel (S3, Backblaze B2,
Dropbox, Google Storage, OneDrive, Microsoft Sharepoint)
@@ -581,7 +587,7 @@
Version 8.3.3
-
+
Bugfix Failing transfers with multipe files (FTP) (#13322 )
@@ -590,7 +596,7 @@
Version 8.3.2
-
+
Bugfix Connection not released causing freeze in browser or transfer
(FTP) (#13273 )
@@ -600,7 +606,7 @@
Version 8.3.1
-
+
Bugfix Failure reconnecting when control connection is closed on server
(FTP) (#13037 )
@@ -616,7 +622,7 @@
Version 8.3.0
-
+
Feature Enable authentication using OpenSSH agent on Windows (SFTP,
Windows) (#12880 )
@@ -660,7 +666,7 @@
Version 8.2.3
-
+
Bugfix When creating new vault save vault.cryptomator to make vaults
readable by Cryptomator apps (Cryptomator)
@@ -675,7 +681,7 @@
Version 8.2.2
-
+
Bugfix Add support reading IdentityAgent from OpenSSH configuration
(SFTP)
@@ -685,7 +691,7 @@
Version 8.2.1
-
+
Bugfix Try all public key algorithms available for a specific key type
(SFTP) (#12733 )
@@ -705,7 +711,7 @@
Version 8.2.0
-
+
Feature Support for Box API (Box) (#10235 )
@@ -724,7 +730,7 @@
Version 8.1.2
-
+
Bugfix Crash with unsatisifed link error using random functions
(Windows) (#12628 )
@@ -734,7 +740,7 @@
Version 8.1.1
-
+
Feature Interoperability with vault format 8 (Cryptomator) (#11888 )
@@ -752,7 +758,7 @@
Version 8.1.0
-
+
Feature Native support for Apple silicon (#11101 )
@@ -761,7 +767,7 @@
Version 8.0.2
-
+
Bugfix Replacing file may cause empty permission set in ACL (S3)
Bugfix Failure authentication with PuTTY private key (SFTP) (#11887 )
@@ -779,7 +785,7 @@
Version 8.0.1
-
+
Bugfix Interoperability with servers not supporting Range header in
requests (WebDAV)
@@ -788,7 +794,7 @@
Version 8.0.0
-
+
Feature Allow to manage additional connection profiles in Preferences
(#10823 )
From 4573c581db854fe6e874544a380f0a6af03d5040 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Wed, 11 Oct 2023 12:32:54 +0200
Subject: [PATCH 018/230] Disable autofill for password field.
---
Cyberduck.xcodeproj/project.pbxproj | 8 ++++++++
.../objc/AutofillDisabledSecureTextField.h | 17 ++++++++++++++++
.../objc/AutofillDisabledSecureTextField.m | 20 +++++++++++++++++++
i18n/src/main/resources/ar.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/ar.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/bg.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/bg.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/ca.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/ca.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/cs.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/cs.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/cy.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/cy.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/da.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/da.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/de.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/de.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/el.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/el.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/en.lproj/Bookmark.xib | 2 +-
.../main/resources/en.lproj/Connection.xib | 2 +-
i18n/src/main/resources/es.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/es.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/et.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/et.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/fi.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/fi.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/fr.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/fr.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/he.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/he.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/hr.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/hr.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/hu.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/hu.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/it.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/it.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/ja.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/ja.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/ka.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/ka.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/ko.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/ko.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/lv.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/lv.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/nl.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/nl.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/no.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/no.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/pl.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/pl.lproj/Connection.xib | 8 ++++----
.../main/resources/pt_BR.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/pt_BR.lproj/Connection.xib | 8 ++++----
.../main/resources/pt_PT.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/pt_PT.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/ro.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/ro.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/ru.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/ru.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/sk.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/sk.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/sl.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/sl.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/sr.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/sr.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/sv.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/sv.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/th.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/th.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/tr.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/tr.lproj/Connection.xib | 8 ++++----
i18n/src/main/resources/uk.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/uk.lproj/Connection.xib | 8 ++++----
.../main/resources/zh_CN.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/zh_CN.lproj/Connection.xib | 8 ++++----
.../main/resources/zh_TW.lproj/Bookmark.xib | 10 +++++-----
.../main/resources/zh_TW.lproj/Connection.xib | 8 ++++----
77 files changed, 371 insertions(+), 326 deletions(-)
create mode 100644 core/src/main/objc/AutofillDisabledSecureTextField.h
create mode 100644 core/src/main/objc/AutofillDisabledSecureTextField.m
diff --git a/Cyberduck.xcodeproj/project.pbxproj b/Cyberduck.xcodeproj/project.pbxproj
index 4f8fefc569f..cd7948b5a4a 100644
--- a/Cyberduck.xcodeproj/project.pbxproj
+++ b/Cyberduck.xcodeproj/project.pbxproj
@@ -166,6 +166,8 @@
47827C9724BFA67C006942C3 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47C9427C2175D451008871C8 /* AppKit.framework */; };
47827C9924BFA800006942C3 /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47827C9824BFA800006942C3 /* Quartz.framework */; };
478426F40F9F75900068BA2E /* License.strings in Resources */ = {isa = PBXBuildFile; fileRef = 478426F20F9F75900068BA2E /* License.strings */; };
+ 4785285E2AD6B10A0008184B /* AutofillDisabledSecureTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 4785285C2AD6B10A0008184B /* AutofillDisabledSecureTextField.h */; };
+ 4785285F2AD6B10A0008184B /* AutofillDisabledSecureTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 4785285D2AD6B10A0008184B /* AutofillDisabledSecureTextField.m */; };
478DB2681DF3418D00BEAA45 /* unlockedbadge.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 478DB2671DF3418D00BEAA45 /* unlockedbadge.tiff */; };
478F0DF412FB03DC000FE33C /* update.pem in Resources */ = {isa = PBXBuildFile; fileRef = 478F0DF312FB03DC000FE33C /* update.pem */; };
47911A180B84C4E8001A29AE /* Acknowledgments.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 47911A170B84C4E8001A29AE /* Acknowledgments.rtf */; };
@@ -1134,6 +1136,8 @@
4784271F0F9F76230068BA2E /* sk */ = {isa = PBXFileReference; fileEncoding = 2483028224; lastKnownFileType = text.plist.strings; lineEnding = 0; name = sk; path = i18n/src/main/resources/sk.lproj/License.strings; sourceTree = ""; };
478427210F9F76280068BA2E /* tr */ = {isa = PBXFileReference; fileEncoding = 2483028224; lastKnownFileType = text.plist.strings; lineEnding = 0; name = tr; path = i18n/src/main/resources/tr.lproj/License.strings; sourceTree = ""; };
478427220F9F762A0068BA2E /* de */ = {isa = PBXFileReference; fileEncoding = 2483028224; lastKnownFileType = text.plist.strings; lineEnding = 0; name = de; path = i18n/src/main/resources/de.lproj/License.strings; sourceTree = ""; };
+ 4785285C2AD6B10A0008184B /* AutofillDisabledSecureTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AutofillDisabledSecureTextField.h; path = core/src/main/objc/AutofillDisabledSecureTextField.h; sourceTree = SOURCE_ROOT; };
+ 4785285D2AD6B10A0008184B /* AutofillDisabledSecureTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AutofillDisabledSecureTextField.m; path = core/src/main/objc/AutofillDisabledSecureTextField.m; sourceTree = SOURCE_ROOT; };
478DB2671DF3418D00BEAA45 /* unlockedbadge.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = unlockedbadge.tiff; sourceTree = ""; };
478F0DF312FB03DC000FE33C /* update.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = update.pem; path = www/update/update.pem; sourceTree = ""; };
4790762A0764903900676C18 /* cs */ = {isa = PBXFileReference; fileEncoding = 2483028224; lastKnownFileType = text.plist.strings; lineEnding = 0; name = cs; path = i18n/src/main/resources/cs.lproj/Localizable.strings; sourceTree = ""; };
@@ -1873,6 +1877,8 @@
474152D706C4F08A00AC0BD2 /* Core */ = {
isa = PBXGroup;
children = (
+ 4785285C2AD6B10A0008184B /* AutofillDisabledSecureTextField.h */,
+ 4785285D2AD6B10A0008184B /* AutofillDisabledSecureTextField.m */,
47EEFDC52386ECD100A3CAB0 /* UnifiedSystemLogAppender.h */,
47EEFDC62386ECD100A3CAB0 /* UnifiedSystemLogAppender.m */,
474B843F1C15DB51004D562C /* Sandbox.h */,
@@ -2150,6 +2156,7 @@
4705E00D1C037AB5002466FA /* SystemConfigurationProxy.h in Headers */,
474B84411C15DB51004D562C /* Sandbox.h in Headers */,
47F85C191C0F101F00FDA856 /* UKCrashReporter.h in Headers */,
+ 4785285E2AD6B10A0008184B /* AutofillDisabledSecureTextField.h in Headers */,
47F85C1B1C0F101F00FDA856 /* UKSystemInfo.h in Headers */,
4705E0091C037AB5002466FA /* LaunchServicesQuarantineService.h in Headers */,
47820E3A20B58426006D0501 /* SystemConfigurationReachability.h in Headers */,
@@ -2579,6 +2586,7 @@
4705DFF91C037AB5002466FA /* LaunchServicesApplicationFinder.m in Sources */,
4705E00E1C037AB5002466FA /* SystemConfigurationProxy.m in Sources */,
47820E3920B58426006D0501 /* SystemConfigurationReachability.m in Sources */,
+ 4785285F2AD6B10A0008184B /* AutofillDisabledSecureTextField.m in Sources */,
4705DFFF1C037AB5002466FA /* FinderLocal.m in Sources */,
4705E0031C037AB5002466FA /* IOKitSleepPreventer.m in Sources */,
473A8DD7287424CA00CD2E12 /* WorkspaceSchemeHandlerProxy.m in Sources */,
diff --git a/core/src/main/objc/AutofillDisabledSecureTextField.h b/core/src/main/objc/AutofillDisabledSecureTextField.h
new file mode 100644
index 00000000000..71538951f6c
--- /dev/null
+++ b/core/src/main/objc/AutofillDisabledSecureTextField.h
@@ -0,0 +1,17 @@
+// Copyright (c) 2002-2023 iterate GmbH. All rights reserved.
+// https://cyberduck.io
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+#import
+
+@interface AutofillDisabledSecureTextField : NSSecureTextField
+@end
diff --git a/core/src/main/objc/AutofillDisabledSecureTextField.m b/core/src/main/objc/AutofillDisabledSecureTextField.m
new file mode 100644
index 00000000000..fbae4c2f9cd
--- /dev/null
+++ b/core/src/main/objc/AutofillDisabledSecureTextField.m
@@ -0,0 +1,20 @@
+// Copyright (c) 2002-2023 iterate GmbH. All rights reserved.
+// https://cyberduck.io
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+#import "AutofillDisabledSecureTextField.h"
+
+@implementation AutofillDisabledSecureTextField
+- (BOOL)_isPasswordAutofillEnabled {
+ return NO;
+}
+@end
\ No newline at end of file
diff --git a/i18n/src/main/resources/ar.lproj/Bookmark.xib b/i18n/src/main/resources/ar.lproj/Bookmark.xib
index 7550075e835..60aec33536f 100644
--- a/i18n/src/main/resources/ar.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/ar.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/ar.lproj/Connection.xib b/i18n/src/main/resources/ar.lproj/Connection.xib
index b9d42802414..f4fbd0b843b 100644
--- a/i18n/src/main/resources/ar.lproj/Connection.xib
+++ b/i18n/src/main/resources/ar.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/bg.lproj/Bookmark.xib b/i18n/src/main/resources/bg.lproj/Bookmark.xib
index 9f36dc99c66..0d2a4b28e38 100644
--- a/i18n/src/main/resources/bg.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/bg.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/bg.lproj/Connection.xib b/i18n/src/main/resources/bg.lproj/Connection.xib
index e6e9652dc4b..55e191b968d 100644
--- a/i18n/src/main/resources/bg.lproj/Connection.xib
+++ b/i18n/src/main/resources/bg.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/ca.lproj/Bookmark.xib b/i18n/src/main/resources/ca.lproj/Bookmark.xib
index fffa113f33a..747f028de81 100644
--- a/i18n/src/main/resources/ca.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/ca.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/ca.lproj/Connection.xib b/i18n/src/main/resources/ca.lproj/Connection.xib
index 4f997803ceb..6058856e0ca 100644
--- a/i18n/src/main/resources/ca.lproj/Connection.xib
+++ b/i18n/src/main/resources/ca.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/cs.lproj/Bookmark.xib b/i18n/src/main/resources/cs.lproj/Bookmark.xib
index e3db083e881..7b01151ba80 100644
--- a/i18n/src/main/resources/cs.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/cs.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/cs.lproj/Connection.xib b/i18n/src/main/resources/cs.lproj/Connection.xib
index 488a18de92d..693b7e04461 100644
--- a/i18n/src/main/resources/cs.lproj/Connection.xib
+++ b/i18n/src/main/resources/cs.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/cy.lproj/Bookmark.xib b/i18n/src/main/resources/cy.lproj/Bookmark.xib
index ab7ba79b4d9..7b6a44e2f18 100644
--- a/i18n/src/main/resources/cy.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/cy.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/cy.lproj/Connection.xib b/i18n/src/main/resources/cy.lproj/Connection.xib
index abb22b990f1..4bb6a72e443 100644
--- a/i18n/src/main/resources/cy.lproj/Connection.xib
+++ b/i18n/src/main/resources/cy.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/da.lproj/Bookmark.xib b/i18n/src/main/resources/da.lproj/Bookmark.xib
index 6c01688a855..d886483df29 100644
--- a/i18n/src/main/resources/da.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/da.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/da.lproj/Connection.xib b/i18n/src/main/resources/da.lproj/Connection.xib
index 0497573bdf9..68eaf63dcaa 100644
--- a/i18n/src/main/resources/da.lproj/Connection.xib
+++ b/i18n/src/main/resources/da.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/de.lproj/Bookmark.xib b/i18n/src/main/resources/de.lproj/Bookmark.xib
index 5f00e8041f8..4e840db2a76 100644
--- a/i18n/src/main/resources/de.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/de.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/de.lproj/Connection.xib b/i18n/src/main/resources/de.lproj/Connection.xib
index 0fe4e1de0e7..c41d361540b 100644
--- a/i18n/src/main/resources/de.lproj/Connection.xib
+++ b/i18n/src/main/resources/de.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/el.lproj/Bookmark.xib b/i18n/src/main/resources/el.lproj/Bookmark.xib
index 56266df7adb..8b460ef46cf 100644
--- a/i18n/src/main/resources/el.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/el.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/el.lproj/Connection.xib b/i18n/src/main/resources/el.lproj/Connection.xib
index 06fdfaab011..04d79e2fc91 100644
--- a/i18n/src/main/resources/el.lproj/Connection.xib
+++ b/i18n/src/main/resources/el.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/en.lproj/Bookmark.xib b/i18n/src/main/resources/en.lproj/Bookmark.xib
index 31e5e1590aa..d9fc8aa0225 100644
--- a/i18n/src/main/resources/en.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/en.lproj/Bookmark.xib
@@ -137,7 +137,7 @@
-
+
diff --git a/i18n/src/main/resources/en.lproj/Connection.xib b/i18n/src/main/resources/en.lproj/Connection.xib
index a22721379b9..29569135546 100644
--- a/i18n/src/main/resources/en.lproj/Connection.xib
+++ b/i18n/src/main/resources/en.lproj/Connection.xib
@@ -131,7 +131,7 @@
-
+
diff --git a/i18n/src/main/resources/es.lproj/Bookmark.xib b/i18n/src/main/resources/es.lproj/Bookmark.xib
index 1824029d561..ea9c30b7a26 100644
--- a/i18n/src/main/resources/es.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/es.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/es.lproj/Connection.xib b/i18n/src/main/resources/es.lproj/Connection.xib
index d1f2acd7dd1..d7c15aa1dce 100644
--- a/i18n/src/main/resources/es.lproj/Connection.xib
+++ b/i18n/src/main/resources/es.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/et.lproj/Bookmark.xib b/i18n/src/main/resources/et.lproj/Bookmark.xib
index e1cd64b654d..727f6811e90 100644
--- a/i18n/src/main/resources/et.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/et.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/et.lproj/Connection.xib b/i18n/src/main/resources/et.lproj/Connection.xib
index 35e965549f6..1b0a631ea55 100644
--- a/i18n/src/main/resources/et.lproj/Connection.xib
+++ b/i18n/src/main/resources/et.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/fi.lproj/Bookmark.xib b/i18n/src/main/resources/fi.lproj/Bookmark.xib
index da7617cef86..5e433741496 100644
--- a/i18n/src/main/resources/fi.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/fi.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/fi.lproj/Connection.xib b/i18n/src/main/resources/fi.lproj/Connection.xib
index ca31e975bb1..36b2b1e45a7 100644
--- a/i18n/src/main/resources/fi.lproj/Connection.xib
+++ b/i18n/src/main/resources/fi.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/fr.lproj/Bookmark.xib b/i18n/src/main/resources/fr.lproj/Bookmark.xib
index f5a17083118..8876d394e43 100644
--- a/i18n/src/main/resources/fr.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/fr.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/fr.lproj/Connection.xib b/i18n/src/main/resources/fr.lproj/Connection.xib
index 56ace34c68b..af619384ce7 100644
--- a/i18n/src/main/resources/fr.lproj/Connection.xib
+++ b/i18n/src/main/resources/fr.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/he.lproj/Bookmark.xib b/i18n/src/main/resources/he.lproj/Bookmark.xib
index 98e891b41df..bfcab66a4d1 100644
--- a/i18n/src/main/resources/he.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/he.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/he.lproj/Connection.xib b/i18n/src/main/resources/he.lproj/Connection.xib
index efdd97635fe..2f0fd6685f3 100644
--- a/i18n/src/main/resources/he.lproj/Connection.xib
+++ b/i18n/src/main/resources/he.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/hr.lproj/Bookmark.xib b/i18n/src/main/resources/hr.lproj/Bookmark.xib
index 7c1aeec57a0..b683d4ff26f 100644
--- a/i18n/src/main/resources/hr.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/hr.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/hr.lproj/Connection.xib b/i18n/src/main/resources/hr.lproj/Connection.xib
index bbfed6274e6..3d4f36878fb 100644
--- a/i18n/src/main/resources/hr.lproj/Connection.xib
+++ b/i18n/src/main/resources/hr.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/hu.lproj/Bookmark.xib b/i18n/src/main/resources/hu.lproj/Bookmark.xib
index 8137db70311..00a7833224b 100644
--- a/i18n/src/main/resources/hu.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/hu.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/hu.lproj/Connection.xib b/i18n/src/main/resources/hu.lproj/Connection.xib
index ed4a1914e2f..f4c0df54f1a 100644
--- a/i18n/src/main/resources/hu.lproj/Connection.xib
+++ b/i18n/src/main/resources/hu.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/it.lproj/Bookmark.xib b/i18n/src/main/resources/it.lproj/Bookmark.xib
index cd68993c5b3..20aa6dc0408 100644
--- a/i18n/src/main/resources/it.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/it.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/it.lproj/Connection.xib b/i18n/src/main/resources/it.lproj/Connection.xib
index e50786a9984..b6cc6af3e4e 100644
--- a/i18n/src/main/resources/it.lproj/Connection.xib
+++ b/i18n/src/main/resources/it.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/ja.lproj/Bookmark.xib b/i18n/src/main/resources/ja.lproj/Bookmark.xib
index 07ae78ee14d..bd8480ade83 100644
--- a/i18n/src/main/resources/ja.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/ja.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/ja.lproj/Connection.xib b/i18n/src/main/resources/ja.lproj/Connection.xib
index 07fad2391d5..4482b3ac5c3 100644
--- a/i18n/src/main/resources/ja.lproj/Connection.xib
+++ b/i18n/src/main/resources/ja.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/ka.lproj/Bookmark.xib b/i18n/src/main/resources/ka.lproj/Bookmark.xib
index 530f2ce0008..4823dcf85f8 100644
--- a/i18n/src/main/resources/ka.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/ka.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/ka.lproj/Connection.xib b/i18n/src/main/resources/ka.lproj/Connection.xib
index dba22210d07..2293aaf2c95 100644
--- a/i18n/src/main/resources/ka.lproj/Connection.xib
+++ b/i18n/src/main/resources/ka.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/ko.lproj/Bookmark.xib b/i18n/src/main/resources/ko.lproj/Bookmark.xib
index 30a9da9dc59..ae63c4cdbd0 100644
--- a/i18n/src/main/resources/ko.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/ko.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/ko.lproj/Connection.xib b/i18n/src/main/resources/ko.lproj/Connection.xib
index 1fee93ca00c..dc46494d0eb 100644
--- a/i18n/src/main/resources/ko.lproj/Connection.xib
+++ b/i18n/src/main/resources/ko.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/lv.lproj/Bookmark.xib b/i18n/src/main/resources/lv.lproj/Bookmark.xib
index 6ea31c88160..29e35c8ac82 100644
--- a/i18n/src/main/resources/lv.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/lv.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/lv.lproj/Connection.xib b/i18n/src/main/resources/lv.lproj/Connection.xib
index d24e47f250b..bc254684b99 100644
--- a/i18n/src/main/resources/lv.lproj/Connection.xib
+++ b/i18n/src/main/resources/lv.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/nl.lproj/Bookmark.xib b/i18n/src/main/resources/nl.lproj/Bookmark.xib
index ad7ab289845..d48d59f5a39 100644
--- a/i18n/src/main/resources/nl.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/nl.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/nl.lproj/Connection.xib b/i18n/src/main/resources/nl.lproj/Connection.xib
index 997a0eeef15..e99982240c9 100644
--- a/i18n/src/main/resources/nl.lproj/Connection.xib
+++ b/i18n/src/main/resources/nl.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/no.lproj/Bookmark.xib b/i18n/src/main/resources/no.lproj/Bookmark.xib
index 728aa8db7c7..b493829376c 100644
--- a/i18n/src/main/resources/no.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/no.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/no.lproj/Connection.xib b/i18n/src/main/resources/no.lproj/Connection.xib
index 3c0f4134f8e..26be58c189e 100644
--- a/i18n/src/main/resources/no.lproj/Connection.xib
+++ b/i18n/src/main/resources/no.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/pl.lproj/Bookmark.xib b/i18n/src/main/resources/pl.lproj/Bookmark.xib
index d468a050f29..44f1c583256 100644
--- a/i18n/src/main/resources/pl.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/pl.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/pl.lproj/Connection.xib b/i18n/src/main/resources/pl.lproj/Connection.xib
index 9fcae65a8b3..9c26d80f939 100644
--- a/i18n/src/main/resources/pl.lproj/Connection.xib
+++ b/i18n/src/main/resources/pl.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/pt_BR.lproj/Bookmark.xib b/i18n/src/main/resources/pt_BR.lproj/Bookmark.xib
index 3272a4912a3..fbf4edf4840 100644
--- a/i18n/src/main/resources/pt_BR.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/pt_BR.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/pt_BR.lproj/Connection.xib b/i18n/src/main/resources/pt_BR.lproj/Connection.xib
index 748f5c2fc6b..6961fe756bd 100644
--- a/i18n/src/main/resources/pt_BR.lproj/Connection.xib
+++ b/i18n/src/main/resources/pt_BR.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/pt_PT.lproj/Bookmark.xib b/i18n/src/main/resources/pt_PT.lproj/Bookmark.xib
index 86b1735e840..d0ae08a55ca 100644
--- a/i18n/src/main/resources/pt_PT.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/pt_PT.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/pt_PT.lproj/Connection.xib b/i18n/src/main/resources/pt_PT.lproj/Connection.xib
index fe013d2c37d..abfb4e5b483 100644
--- a/i18n/src/main/resources/pt_PT.lproj/Connection.xib
+++ b/i18n/src/main/resources/pt_PT.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/ro.lproj/Bookmark.xib b/i18n/src/main/resources/ro.lproj/Bookmark.xib
index d5bd5ba3be3..683290c2090 100644
--- a/i18n/src/main/resources/ro.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/ro.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/ro.lproj/Connection.xib b/i18n/src/main/resources/ro.lproj/Connection.xib
index 2f21ccdd912..04398829b6e 100644
--- a/i18n/src/main/resources/ro.lproj/Connection.xib
+++ b/i18n/src/main/resources/ro.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/ru.lproj/Bookmark.xib b/i18n/src/main/resources/ru.lproj/Bookmark.xib
index ed5767fc6ed..0d974d7dccb 100644
--- a/i18n/src/main/resources/ru.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/ru.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/ru.lproj/Connection.xib b/i18n/src/main/resources/ru.lproj/Connection.xib
index 40b92321859..48d58322d7d 100644
--- a/i18n/src/main/resources/ru.lproj/Connection.xib
+++ b/i18n/src/main/resources/ru.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/sk.lproj/Bookmark.xib b/i18n/src/main/resources/sk.lproj/Bookmark.xib
index 5fa52624216..00a7d2a8e20 100644
--- a/i18n/src/main/resources/sk.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/sk.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/sk.lproj/Connection.xib b/i18n/src/main/resources/sk.lproj/Connection.xib
index 18d2b8ca163..0bca4509928 100644
--- a/i18n/src/main/resources/sk.lproj/Connection.xib
+++ b/i18n/src/main/resources/sk.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/sl.lproj/Bookmark.xib b/i18n/src/main/resources/sl.lproj/Bookmark.xib
index 9f0198ca4e5..d0777de9ed2 100644
--- a/i18n/src/main/resources/sl.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/sl.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/sl.lproj/Connection.xib b/i18n/src/main/resources/sl.lproj/Connection.xib
index 16e3cf60d52..4c5c722faca 100644
--- a/i18n/src/main/resources/sl.lproj/Connection.xib
+++ b/i18n/src/main/resources/sl.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/sr.lproj/Bookmark.xib b/i18n/src/main/resources/sr.lproj/Bookmark.xib
index f21a47891ba..f14d70ba5f6 100644
--- a/i18n/src/main/resources/sr.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/sr.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/sr.lproj/Connection.xib b/i18n/src/main/resources/sr.lproj/Connection.xib
index 6722b4c9692..f60e6e3c160 100644
--- a/i18n/src/main/resources/sr.lproj/Connection.xib
+++ b/i18n/src/main/resources/sr.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/sv.lproj/Bookmark.xib b/i18n/src/main/resources/sv.lproj/Bookmark.xib
index 17899bf3e95..c0b31376401 100644
--- a/i18n/src/main/resources/sv.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/sv.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/sv.lproj/Connection.xib b/i18n/src/main/resources/sv.lproj/Connection.xib
index 2d0dd40e568..4fb4d8ff89c 100644
--- a/i18n/src/main/resources/sv.lproj/Connection.xib
+++ b/i18n/src/main/resources/sv.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/th.lproj/Bookmark.xib b/i18n/src/main/resources/th.lproj/Bookmark.xib
index a41ba74849a..72cd8111f3d 100644
--- a/i18n/src/main/resources/th.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/th.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/th.lproj/Connection.xib b/i18n/src/main/resources/th.lproj/Connection.xib
index b2ec1f03a0c..364e023cf3e 100644
--- a/i18n/src/main/resources/th.lproj/Connection.xib
+++ b/i18n/src/main/resources/th.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/tr.lproj/Bookmark.xib b/i18n/src/main/resources/tr.lproj/Bookmark.xib
index 7ffe447eae5..8bece2fb91b 100644
--- a/i18n/src/main/resources/tr.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/tr.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/tr.lproj/Connection.xib b/i18n/src/main/resources/tr.lproj/Connection.xib
index f30dd0268af..f7f8153f997 100644
--- a/i18n/src/main/resources/tr.lproj/Connection.xib
+++ b/i18n/src/main/resources/tr.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/uk.lproj/Bookmark.xib b/i18n/src/main/resources/uk.lproj/Bookmark.xib
index a4b373348cc..893c4d52841 100644
--- a/i18n/src/main/resources/uk.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/uk.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/uk.lproj/Connection.xib b/i18n/src/main/resources/uk.lproj/Connection.xib
index eaed34a3f1f..01c81bba83d 100644
--- a/i18n/src/main/resources/uk.lproj/Connection.xib
+++ b/i18n/src/main/resources/uk.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/zh_CN.lproj/Bookmark.xib b/i18n/src/main/resources/zh_CN.lproj/Bookmark.xib
index 6eaa7be0935..465c38fc03e 100644
--- a/i18n/src/main/resources/zh_CN.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/zh_CN.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/zh_CN.lproj/Connection.xib b/i18n/src/main/resources/zh_CN.lproj/Connection.xib
index a2403feef8f..6919b9cc174 100644
--- a/i18n/src/main/resources/zh_CN.lproj/Connection.xib
+++ b/i18n/src/main/resources/zh_CN.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/zh_TW.lproj/Bookmark.xib b/i18n/src/main/resources/zh_TW.lproj/Bookmark.xib
index 656fc424d98..190ffc26a6a 100644
--- a/i18n/src/main/resources/zh_TW.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/zh_TW.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -137,7 +137,7 @@
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/zh_TW.lproj/Connection.xib b/i18n/src/main/resources/zh_TW.lproj/Connection.xib
index 31ae980b516..bdb79d0e9ce 100644
--- a/i18n/src/main/resources/zh_TW.lproj/Connection.xib
+++ b/i18n/src/main/resources/zh_TW.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -131,7 +131,7 @@
-
+
@@ -204,7 +204,7 @@ Gw
-
+
From 9300a7a47aae5cf818bd09f1b55b83269fa81162 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 11 Oct 2023 11:01:08 +0000
Subject: [PATCH 019/230] Bump org.codehaus.woodstox:stax2-api from 4.2.1 to
4.2.2
Bumps [org.codehaus.woodstox:stax2-api](https://github.com/FasterXML/stax2-api) from 4.2.1 to 4.2.2.
- [Commits](https://github.com/FasterXML/stax2-api/compare/stax2-api-4.2.1...stax2-api-4.2.2)
---
updated-dependencies:
- dependency-name: org.codehaus.woodstox:stax2-api
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 8240cbb0a60..3606b43237c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -249,7 +249,7 @@
org.codehaus.woodstox
stax2-api
- 4.2.1
+ 4.2.2
com.fasterxml.jackson.dataformat
From 7b0265964e9e0f5b0a7fded55071a78b70019e6b Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Wed, 11 Oct 2023 13:53:21 +0200
Subject: [PATCH 020/230] Add test.
---
.../core/threading/DefaultFailureDiagnosticsTest.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/core/src/test/java/ch/cyberduck/core/threading/DefaultFailureDiagnosticsTest.java b/core/src/test/java/ch/cyberduck/core/threading/DefaultFailureDiagnosticsTest.java
index 7206eb75e75..976b608429c 100644
--- a/core/src/test/java/ch/cyberduck/core/threading/DefaultFailureDiagnosticsTest.java
+++ b/core/src/test/java/ch/cyberduck/core/threading/DefaultFailureDiagnosticsTest.java
@@ -20,6 +20,8 @@
import ch.cyberduck.core.exception.LoginFailureException;
import ch.cyberduck.core.exception.ResolveCanceledException;
import ch.cyberduck.core.exception.ResolveFailedException;
+import ch.cyberduck.core.exception.TransferCanceledException;
+import ch.cyberduck.core.exception.TransferStatusCanceledException;
import org.junit.Test;
@@ -34,6 +36,10 @@ public void testDetermine() {
assertEquals(FailureDiagnostics.Type.cancel, new DefaultFailureDiagnostics().determine(new ResolveCanceledException()));
assertEquals(FailureDiagnostics.Type.login, new DefaultFailureDiagnostics().determine(new LoginFailureException("d")));
assertEquals(FailureDiagnostics.Type.cancel, new DefaultFailureDiagnostics().determine(new ConnectionCanceledException()));
+ // By user
+ assertEquals(FailureDiagnostics.Type.skip, new DefaultFailureDiagnostics().determine(new TransferCanceledException()));
assertEquals(FailureDiagnostics.Type.application, new DefaultFailureDiagnostics().determine(new BackgroundException(new ConnectionCanceledException())));
+ // By transfer status
+ assertEquals(FailureDiagnostics.Type.cancel, new DefaultFailureDiagnostics().determine(new TransferStatusCanceledException()));
}
}
From 6dd10f325995cb93a2eee13393d0aad0b4ae86e0 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Wed, 11 Oct 2023 16:34:34 +0200
Subject: [PATCH 021/230] Set saved flag depending on default with no user
interface shown.
---
.../CustomSchemeHandlerOAuth2AuthorizationCodeProvider.java | 2 ++
1 file changed, 2 insertions(+)
diff --git a/oauth/src/main/java/ch/cyberduck/core/oauth/CustomSchemeHandlerOAuth2AuthorizationCodeProvider.java b/oauth/src/main/java/ch/cyberduck/core/oauth/CustomSchemeHandlerOAuth2AuthorizationCodeProvider.java
index 7e6c5e0f269..4faaddf8503 100644
--- a/oauth/src/main/java/ch/cyberduck/core/oauth/CustomSchemeHandlerOAuth2AuthorizationCodeProvider.java
+++ b/oauth/src/main/java/ch/cyberduck/core/oauth/CustomSchemeHandlerOAuth2AuthorizationCodeProvider.java
@@ -19,6 +19,7 @@
import ch.cyberduck.core.Host;
import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.LoginCallback;
+import ch.cyberduck.core.LoginOptions;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.local.Application;
import ch.cyberduck.core.preferences.PreferencesFactory;
@@ -68,6 +69,7 @@ public void callback(final String code) {
}
prompt.await(signal, bookmark, String.format("%s %s", LocaleFactory.localizedString("Login", "Login"), BookmarkNameProvider.toString(bookmark, true)),
LocaleFactory.localizedString("Open web browser to authenticate and obtain an authorization code", "Credentials"));
+ bookmark.getCredentials().setSaved(new LoginOptions().save);
return authenticationCode.get();
}
}
From 70e4bda18b928c3693fb7dfd66ff9a538f5518e6 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Wed, 11 Oct 2023 16:36:15 +0200
Subject: [PATCH 022/230] Changes.
---
Changelog.txt | 1 +
www/update/changelog.html | 3 +++
2 files changed, 4 insertions(+)
diff --git a/Changelog.txt b/Changelog.txt
index 82c5f88dd93..9865de1a65a 100644
--- a/Changelog.txt
+++ b/Changelog.txt
@@ -2,6 +2,7 @@ Cyberduck
https://cyberduck.io/
8.7.0
+- [Feature] SMB (Server Message Block) protocol support (#5368)
- [Feature] Support to login using temporary credentials from Security Token Service (STS API) using OpenID Connect (OIDC) web identity (S3) (#13804)
- [Feature] Login using connection profile for AWS S3/STS + Google (OIDC) (S3)
- [Feature] Login using connection profile for AWS S3/STS + Azure AD (OIDC) (S3)
diff --git a/www/update/changelog.html b/www/update/changelog.html
index b86b2d7dcd0..07db08af59e 100755
--- a/www/update/changelog.html
+++ b/www/update/changelog.html
@@ -87,6 +87,9 @@
Version 8.7.0
+ Feature SMB (Server Message Block) protocol support (#5368 )
+
Feature Support to login using temporary credentials from Security Token
Service (STS API) using OpenID Connect (OIDC) web identity (S3) (#13804 )
From 6beb1f5a2c46cbb4c49b5cf35cf2b7f206cdcd61 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Wed, 11 Oct 2023 22:57:58 +0200
Subject: [PATCH 023/230] Fix exception type on worker cancellation indicating
no user input.
---
.../ch/cyberduck/core/worker/AbstractTransferWorker.java | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/core/src/main/java/ch/cyberduck/core/worker/AbstractTransferWorker.java b/core/src/main/java/ch/cyberduck/core/worker/AbstractTransferWorker.java
index fdef72e079d..2e925b860f5 100644
--- a/core/src/main/java/ch/cyberduck/core/worker/AbstractTransferWorker.java
+++ b/core/src/main/java/ch/cyberduck/core/worker/AbstractTransferWorker.java
@@ -22,6 +22,7 @@
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.exception.ConnectionCanceledException;
import ch.cyberduck.core.exception.TransferCanceledException;
+import ch.cyberduck.core.exception.TransferStatusCanceledException;
import ch.cyberduck.core.io.StreamListener;
import ch.cyberduck.core.notification.NotificationService;
import ch.cyberduck.core.preferences.PreferencesFactory;
@@ -236,7 +237,7 @@ public Future prepare(final Path file, final Local local, final
log.debug(String.format("Find transfer status of %s for transfer %s", file, this));
}
if(this.isCanceled()) {
- throw new TransferCanceledException();
+ throw new TransferStatusCanceledException();
}
if(prompt.isSelected(new TransferItem(file, local))) {
return this.submit(new RetryTransferCallable(transfer.getSource()) {
@@ -338,7 +339,7 @@ public String toString() {
*/
public Future transfer(final TransferItem item, final TransferAction action) throws BackgroundException {
if(this.isCanceled()) {
- throw new TransferCanceledException();
+ throw new TransferStatusCanceledException();
}
// Only transfer if accepted by filter and stored in table with transfer status
if(table.containsKey(item)) {
From c49ab6b414d243272da21f868cb3626b5def5a98 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Thu, 12 Oct 2023 14:39:24 +0200
Subject: [PATCH 024/230] Review.
---
.../java/ch/cyberduck/core/sftp/SSHFingerprintGenerator.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ssh/src/main/java/ch/cyberduck/core/sftp/SSHFingerprintGenerator.java b/ssh/src/main/java/ch/cyberduck/core/sftp/SSHFingerprintGenerator.java
index 8b55baa34cd..d720b2f3b5f 100644
--- a/ssh/src/main/java/ch/cyberduck/core/sftp/SSHFingerprintGenerator.java
+++ b/ssh/src/main/java/ch/cyberduck/core/sftp/SSHFingerprintGenerator.java
@@ -55,7 +55,7 @@ public String fingerprint(final InputStream in) throws BackgroundException {
final String undelimited = ChecksumComputeFactory.get(HashAlgorithm.md5).compute(in, new TransferStatus()).hash;
final StringBuilder fp = new StringBuilder(undelimited.substring(0, 2));
for(int i = 2; i <= undelimited.length() - 2; i += 2) {
- fp.append(":").append(undelimited.substring(i, i + 2));
+ fp.append(":").append(undelimited, i, i + 2);
}
return fp.toString();
}
From 9d399bb85b6884c60418e8face8b6093e623f80b Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Thu, 12 Oct 2023 20:34:29 +0200
Subject: [PATCH 025/230] Update runtime dependency.
---
osx/pom.xml | 2 +-
runtime.xml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/osx/pom.xml b/osx/pom.xml
index 2cbcdbf8e1d..b03b252dfa9 100644
--- a/osx/pom.xml
+++ b/osx/pom.xml
@@ -133,7 +133,7 @@
net.temurin
jdk
zip
- 17.0.6
+ 17.0.8
${project.build.directory}
diff --git a/runtime.xml b/runtime.xml
index 5ea6d414c91..be3a9d40c4f 100644
--- a/runtime.xml
+++ b/runtime.xml
@@ -2,7 +2,7 @@
-
+
Date: Fri, 13 Oct 2023 08:57:13 +0200
Subject: [PATCH 026/230] Update runtime dependency.
---
cli/osx/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cli/osx/pom.xml b/cli/osx/pom.xml
index 387cf191c5c..6cac0a207ff 100644
--- a/cli/osx/pom.xml
+++ b/cli/osx/pom.xml
@@ -117,7 +117,7 @@
net.temurin
jdk
zip
- 17.0.6
+ 17.0.8
${project.build.directory}
From 3f22509a8071d5daaa454bb4e551f32ef8658ce0 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 13 Oct 2023 07:25:33 +0000
Subject: [PATCH 027/230] Bump io.swagger.core.v3:swagger-annotations from
2.2.16 to 2.2.17
Bumps io.swagger.core.v3:swagger-annotations from 2.2.16 to 2.2.17.
---
updated-dependencies:
- dependency-name: io.swagger.core.v3:swagger-annotations
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 98466f22e10..c557c7e9d75 100644
--- a/pom.xml
+++ b/pom.xml
@@ -314,7 +314,7 @@
io.swagger.core.v3
swagger-annotations
- 2.2.16
+ 2.2.17
org.glassfish.jersey.core
From 107985a18ca7b13a9de175f7284f837ed65f471b Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Mon, 16 Oct 2023 15:04:03 +0200
Subject: [PATCH 028/230] Obtain stream prior creating upload.
---
.../core/sds/SDSDirectS3UploadFeature.java | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDirectS3UploadFeature.java b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDirectS3UploadFeature.java
index 47e4f2ec055..0e415a48ca3 100644
--- a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDirectS3UploadFeature.java
+++ b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDirectS3UploadFeature.java
@@ -113,6 +113,13 @@ public Node upload(final Path file, final Local local, final BandwidthThrottle t
final TransferStatus status, final ConnectionCallback callback) throws BackgroundException {
final ThreadPool pool = ThreadPoolFactory.get("multipart", concurrency);
try {
+ final InputStream in;
+ if(new SDSTripleCryptEncryptorFeature(session, nodeid).isEncrypted(containerService.getContainer(file))) {
+ in = new SDSTripleCryptEncryptorFeature(session, nodeid).encrypt(file, local.getInputStream(), status);
+ }
+ else {
+ in = local.getInputStream();
+ }
final CreateFileUploadRequest createFileUploadRequest = new CreateFileUploadRequest()
.directS3Upload(true)
.timestampModification(status.getModified() != null ? new DateTime(status.getModified()) : null)
@@ -128,15 +135,8 @@ public Node upload(final Path file, final Local local, final BandwidthThrottle t
final Map etags = new HashMap<>();
final List presignedUrls = this.retrievePresignedUrls(createFileUploadResponse, status);
final List> parts = new ArrayList<>();
- final InputStream in;
- final String random = new UUIDRandomStringService().random();
- if(new SDSTripleCryptEncryptorFeature(session, nodeid).isEncrypted(containerService.getContainer(file))) {
- in = new SDSTripleCryptEncryptorFeature(session, nodeid).encrypt(file, local.getInputStream(), status);
- }
- else {
- in = local.getInputStream();
- }
try {
+ final String random = new UUIDRandomStringService().random();
// Full size of file
final long size = status.getLength() + status.getOffset();
long offset = 0;
From 8a05f1128ded55e6e925c1d3ca3b2b24ea3ef486 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Sun, 17 Jul 2022 23:47:44 +0200
Subject: [PATCH 029/230] Add condition to only retry requests previously sent
with `Expect: 100-continue`. Revert "Handle 412 Precondition Failed with
expired token and retry with no `If` header set."
This reverts commit eb173f33
---
.../cyberduck/core/dav/DAVWriteFeature.java | 42 +++++++++----------
1 file changed, 19 insertions(+), 23 deletions(-)
diff --git a/webdav/src/main/java/ch/cyberduck/core/dav/DAVWriteFeature.java b/webdav/src/main/java/ch/cyberduck/core/dav/DAVWriteFeature.java
index 217b1638f32..a2aed7c9811 100644
--- a/webdav/src/main/java/ch/cyberduck/core/dav/DAVWriteFeature.java
+++ b/webdav/src/main/java/ch/cyberduck/core/dav/DAVWriteFeature.java
@@ -21,6 +21,7 @@
import ch.cyberduck.core.Path;
import ch.cyberduck.core.VoidAttributesAdapter;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.ConflictException;
import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Lock;
import ch.cyberduck.core.features.Write;
@@ -34,7 +35,6 @@
import org.apache.http.Header;
import org.apache.http.HttpHeaders;
-import org.apache.http.HttpStatus;
import org.apache.http.entity.AbstractHttpEntity;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
@@ -70,8 +70,19 @@ public DAVWriteFeature(final DAVSession session, final boolean expect) {
@Override
public HttpResponseOutputStream write(final Path file, final TransferStatus status, final ConnectionCallback callback) throws BackgroundException {
- final List headers = this.getHeaders(file, status);
- return this.write(file, headers, status);
+ try {
+ return this.write(file, this.getHeaders(file, status), status);
+ }
+ catch(ConflictException e) {
+ if(expect) {
+ if(null != status.getLockId()) {
+ // Handle 412 Precondition Failed with expired token
+ log.warn(String.format("Retry failure %s with lock id %s removed", e, status.getLockId()));
+ return this.write(file, this.getHeaders(file, status.withLockId(null)), status);
+ }
+ }
+ throw e;
+ }
}
protected List getHeaders(final Path file, final TransferStatus status) throws UnsupportedException {
@@ -102,7 +113,8 @@ protected List getHeaders(final Path file, final TransferStatus status)
return headers;
}
- private HttpResponseOutputStream write(final Path file, final List headers, final TransferStatus status) throws BackgroundException {
+ private HttpResponseOutputStream write(final Path file, final List headers, final TransferStatus status)
+ throws BackgroundException {
// Submit store call to background thread
final DelayedHttpEntityCallable command = new DelayedHttpEntityCallable(file) {
/**
@@ -111,25 +123,9 @@ private HttpResponseOutputStream write(final Path file, final List
@Override
public Void call(final AbstractHttpEntity entity) throws BackgroundException {
try {
- try {
- session.getClient().put(new DAVPathEncoder().encode(file), entity, headers, new ETagResponseHandler());
- return null;
- }
- catch(SardineException e) {
- if(null != status.getLockId()) {
- switch(e.getStatusCode()) {
- case HttpStatus.SC_PRECONDITION_FAILED:
- // Handle 412 Precondition Failed with expired token
- log.warn(String.format("Retry failure %s with lock id %s removed", e, status.getLockId()));
- headers.removeIf(header -> HttpHeaders.IF.equals(header.getName()));
- session.getClient().put(new DAVPathEncoder().encode(file), entity, headers, new ETagResponseHandler());
- // No remote attributes from server returned after upload
- return null;
-
- }
- }
- throw e;
- }
+ session.getClient().put(new DAVPathEncoder().encode(file), entity,
+ headers, new ETagResponseHandler());
+ return null;
}
catch(SardineException e) {
throw new DAVExceptionMappingService().map("Upload {0} failed", e, file);
From 870496c69b468bf23801b469dd1ebd512eb1e031 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 16 Oct 2023 16:54:59 +0000
Subject: [PATCH 030/230] Bump org.json:json from 20230618 to 20231013
Bumps [org.json:json](https://github.com/douglascrockford/JSON-java) from 20230618 to 20231013.
- [Release notes](https://github.com/douglascrockford/JSON-java/releases)
- [Changelog](https://github.com/stleary/JSON-java/blob/master/docs/RELEASES.md)
- [Commits](https://github.com/douglascrockford/JSON-java/commits)
---
updated-dependencies:
- dependency-name: org.json:json
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
backblaze/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/backblaze/pom.xml b/backblaze/pom.xml
index fda955f2c02..85ccb808b0a 100644
--- a/backblaze/pom.xml
+++ b/backblaze/pom.xml
@@ -33,7 +33,7 @@
org.json
json
- 20230618
+ 20231013
From 45e75a5e60c82ba00f01055101a29637df54ad06 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 16 Oct 2023 16:56:14 +0000
Subject: [PATCH 031/230] Bump io.swagger:swagger-annotations from 1.6.11 to
1.6.12
Bumps io.swagger:swagger-annotations from 1.6.11 to 1.6.12.
---
updated-dependencies:
- dependency-name: io.swagger:swagger-annotations
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index c557c7e9d75..bdcbd39ae7f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -309,7 +309,7 @@
io.swagger
swagger-annotations
- 1.6.11
+ 1.6.12
io.swagger.core.v3
From 432322b35c1034004f6e33181b599ded02772c02 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 16 Oct 2023 16:57:58 +0000
Subject: [PATCH 032/230] Bump com.google.apis:google-api-services-storage
Bumps com.google.apis:google-api-services-storage from v1-rev20230926-2.0.0 to v1-rev20231012-2.0.0.
---
updated-dependencies:
- dependency-name: com.google.apis:google-api-services-storage
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
googlestorage/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/googlestorage/pom.xml b/googlestorage/pom.xml
index e1d82ddb938..f7518c92d52 100644
--- a/googlestorage/pom.xml
+++ b/googlestorage/pom.xml
@@ -23,7 +23,7 @@
googlestorage
- v1-rev20230926-2.0.0
+ v1-rev20231012-2.0.0
From 871406fb2a4972d8f7d1a7d783f7a3d8c588ebf0 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Tue, 17 Oct 2023 16:45:02 +0200
Subject: [PATCH 033/230] Add null checks for modification date in transfer
status. Addendum to 32985bed.
---
.../core/brick/BrickTimestampFeature.java | 10 +++---
.../googledrive/DriveTimestampFeature.java | 15 +++++----
.../core/nio/LocalTimestampFeature.java | 32 ++++++++++---------
.../core/sftp/SFTPTimestampFeature.java | 14 ++++----
4 files changed, 39 insertions(+), 32 deletions(-)
diff --git a/brick/src/main/java/ch/cyberduck/core/brick/BrickTimestampFeature.java b/brick/src/main/java/ch/cyberduck/core/brick/BrickTimestampFeature.java
index dfec9bac256..2294be9cb6c 100644
--- a/brick/src/main/java/ch/cyberduck/core/brick/BrickTimestampFeature.java
+++ b/brick/src/main/java/ch/cyberduck/core/brick/BrickTimestampFeature.java
@@ -38,10 +38,12 @@ public BrickTimestampFeature(final BrickSession session) {
@Override
public void setTimestamp(final Path file, final TransferStatus status) throws BackgroundException {
try {
- final FileEntity response = new FilesApi(new BrickApiClient(session))
- .patchFilesPath(StringUtils.removeStart(file.getAbsolute(), String.valueOf(Path.DELIMITER)),
- new FilesPathBody().providedMtime(status.getModified() != null ? new DateTime(status.getModified()) : null));
- status.setResponse(new BrickAttributesFinderFeature(session).toAttributes(response));
+ if(null != status.getModified()) {
+ final FileEntity response = new FilesApi(new BrickApiClient(session))
+ .patchFilesPath(StringUtils.removeStart(file.getAbsolute(), String.valueOf(Path.DELIMITER)),
+ new FilesPathBody().providedMtime(status.getModified() != null ? new DateTime(status.getModified()) : null));
+ status.setResponse(new BrickAttributesFinderFeature(session).toAttributes(response));
+ }
}
catch(ApiException e) {
throw new BrickExceptionMappingService().map("Failure to write attributes of {0}", e, file);
diff --git a/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveTimestampFeature.java b/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveTimestampFeature.java
index 698c59b707f..92986e83595 100644
--- a/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveTimestampFeature.java
+++ b/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveTimestampFeature.java
@@ -22,7 +22,6 @@
import ch.cyberduck.core.transfer.TransferStatus;
import java.io.IOException;
-import java.util.Date;
import com.google.api.client.util.DateTime;
import com.google.api.services.drive.model.File;
@@ -40,12 +39,14 @@ public DriveTimestampFeature(final DriveSession session, final DriveFileIdProvid
@Override
public void setTimestamp(final Path file, final TransferStatus status) throws BackgroundException {
try {
- final String fileid = this.fileid.getFileId(file);
- final File properties = new File();
- properties.setModifiedTime(status.getModified() != null ? new DateTime(status.getModified()) : null);
- final File latest = session.getClient().files().update(fileid, properties).setFields(DriveAttributesFinderFeature.DEFAULT_FIELDS).
- setSupportsAllDrives(new HostPreferences(session.getHost()).getBoolean("googledrive.teamdrive.enable")).execute();
- status.setResponse(new DriveAttributesFinderFeature(session, this.fileid).toAttributes(latest));
+ if(null != status.getModified()) {
+ final String fileid = this.fileid.getFileId(file);
+ final File properties = new File();
+ properties.setModifiedTime(status.getModified() != null ? new DateTime(status.getModified()) : null);
+ final File latest = session.getClient().files().update(fileid, properties).setFields(DriveAttributesFinderFeature.DEFAULT_FIELDS).
+ setSupportsAllDrives(new HostPreferences(session.getHost()).getBoolean("googledrive.teamdrive.enable")).execute();
+ status.setResponse(new DriveAttributesFinderFeature(session, this.fileid).toAttributes(latest));
+ }
}
catch(IOException e) {
throw new DriveExceptionMappingService(fileid).map("Failure to write attributes of {0}", e, file);
diff --git a/nio/src/main/java/ch/cyberduck/core/nio/LocalTimestampFeature.java b/nio/src/main/java/ch/cyberduck/core/nio/LocalTimestampFeature.java
index 2c6ea2b4775..198097eda93 100644
--- a/nio/src/main/java/ch/cyberduck/core/nio/LocalTimestampFeature.java
+++ b/nio/src/main/java/ch/cyberduck/core/nio/LocalTimestampFeature.java
@@ -1,19 +1,19 @@
package ch.cyberduck.core.nio;
- /*
- * Copyright (c) 2002-2017 iterate GmbH. All rights reserved.
- * https://cyberduck.io/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
+/*
+ * Copyright (c) 2002-2017 iterate GmbH. All rights reserved.
+ * https://cyberduck.io/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
import ch.cyberduck.core.Path;
import ch.cyberduck.core.exception.BackgroundException;
@@ -36,7 +36,9 @@ public LocalTimestampFeature(final LocalSession session) {
@Override
public void setTimestamp(final Path file, final TransferStatus status) throws BackgroundException {
try {
- Files.setLastModifiedTime(session.toPath(file), FileTime.from(status.getModified(), TimeUnit.MILLISECONDS));
+ if(null != status.getModified()) {
+ Files.setLastModifiedTime(session.toPath(file), FileTime.from(status.getModified(), TimeUnit.MILLISECONDS));
+ }
}
catch(IOException e) {
throw new LocalExceptionMappingService().map("Failure to write attributes of {0}", e, file);
diff --git a/ssh/src/main/java/ch/cyberduck/core/sftp/SFTPTimestampFeature.java b/ssh/src/main/java/ch/cyberduck/core/sftp/SFTPTimestampFeature.java
index ae87939473e..4dbbdb4d095 100644
--- a/ssh/src/main/java/ch/cyberduck/core/sftp/SFTPTimestampFeature.java
+++ b/ssh/src/main/java/ch/cyberduck/core/sftp/SFTPTimestampFeature.java
@@ -38,12 +38,14 @@ public SFTPTimestampFeature(final SFTPSession session) {
@Override
public void setTimestamp(final Path file, final TransferStatus status) throws BackgroundException {
try {
- // We must both set the accessed and modified time. See AttribFlags.SSH_FILEXFER_ATTR_V3_ACMODTIME
- // All times are represented as seconds from Jan 1, 1970 in UTC.
- final FileAttributes attrs = new FileAttributes.Builder().withAtimeMtime(
- System.currentTimeMillis() / 1000, status.getModified() != null ? status.getModified() / 1000 : System.currentTimeMillis() / 1000
- ).build();
- session.sftp().setAttributes(file.getAbsolute(), attrs);
+ if(null != status.getModified()) {
+ // We must both set the accessed and modified time. See AttribFlags.SSH_FILEXFER_ATTR_V3_ACMODTIME
+ // All times are represented as seconds from Jan 1, 1970 in UTC.
+ final FileAttributes attrs = new FileAttributes.Builder().withAtimeMtime(
+ System.currentTimeMillis() / 1000, status.getModified() != null ? status.getModified() / 1000 : System.currentTimeMillis() / 1000
+ ).build();
+ session.sftp().setAttributes(file.getAbsolute(), attrs);
+ }
}
catch(IOException e) {
throw new SFTPExceptionMappingService().map("Cannot change timestamp of {0}", e, file);
From 3c637dbec0cf7abf9bcf829dcb00ba1d8ffccebf Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Tue, 17 Oct 2023 18:00:05 +0200
Subject: [PATCH 034/230] Fix null pointer.
---
.../java/ch/cyberduck/core/worker/WriteTimestampWorker.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/core/src/main/java/ch/cyberduck/core/worker/WriteTimestampWorker.java b/core/src/main/java/ch/cyberduck/core/worker/WriteTimestampWorker.java
index c9b1f531f4d..eee713559dd 100644
--- a/core/src/main/java/ch/cyberduck/core/worker/WriteTimestampWorker.java
+++ b/core/src/main/java/ch/cyberduck/core/worker/WriteTimestampWorker.java
@@ -65,7 +65,8 @@ protected String getLockId(final Path file) {
@Override
public String getActivity() {
return MessageFormat.format(LocaleFactory.localizedString("Changing timestamp of {0} to {1}", "Status"),
- file.getName(), UserDateFormatterFactory.get().getShortFormat(modified));
+ file.getName(), modified != null ? UserDateFormatterFactory.get().getShortFormat(modified) :
+ created != null ? UserDateFormatterFactory.get().getShortFormat(created) : LocaleFactory.localizedString("Unknown"));
}
@Override
From 09ac8a48af4c62f579ea56eca3aef7e54bd9d173 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 17 Oct 2023 16:24:59 +0000
Subject: [PATCH 035/230] Bump log4j-version from 2.20.0 to 2.21.0
Bumps `log4j-version` from 2.20.0 to 2.21.0.
Updates `org.apache.logging.log4j:log4j-api` from 2.20.0 to 2.21.0
Updates `org.apache.logging.log4j:log4j-core` from 2.20.0 to 2.21.0
Updates `org.apache.logging.log4j:log4j-slf4j-impl` from 2.20.0 to 2.21.0
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-api
dependency-type: direct:production
update-type: version-update:semver-minor
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-type: direct:production
update-type: version-update:semver-minor
- dependency-name: org.apache.logging.log4j:log4j-slf4j-impl
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index bdcbd39ae7f..f3a55e32f30 100644
--- a/pom.xml
+++ b/pom.xml
@@ -83,7 +83,7 @@
2.38
2.14.2
1.7.36
- 2.20.0
+ 2.21.0
1.76
4.5.14
1.42.3
From ff30c15e4dc1a3309955f1726a78acd7e9385bbb Mon Sep 17 00:00:00 2001
From: Jenkins Automation Server
Date: Wed, 18 Oct 2023 14:34:35 +0000
Subject: [PATCH 036/230] [maven-release-plugin] prepare release release-8-7-0
---
azure/pom.xml | 2 +-
backblaze/pom.xml | 2 +-
binding/pom.xml | 2 +-
bonjour/dll/pom.xml | 2 +-
bonjour/native/pom.xml | 2 +-
bonjour/pom.xml | 2 +-
box/pom.xml | 2 +-
brick/pom.xml | 2 +-
cli/dll/pom.xml | 2 +-
cli/linux/pom.xml | 2 +-
cli/osx/pom.xml | 2 +-
cli/pom.xml | 2 +-
cli/windows/pom.xml | 2 +-
core/dll/pom.xml | 2 +-
core/dylib/pom.xml | 2 +-
core/native/pom.xml | 2 +-
core/native/refresh/pom.xml | 2 +-
core/pom.xml | 2 +-
cryptomator/dll/pom.xml | 2 +-
cryptomator/pom.xml | 2 +-
ctera/pom.xml | 2 +-
defaults/pom.xml | 2 +-
dracoon/pom.xml | 2 +-
dropbox/pom.xml | 2 +-
eue/pom.xml | 2 +-
freenet/pom.xml | 2 +-
ftp/pom.xml | 2 +-
googledrive/pom.xml | 2 +-
googlestorage/pom.xml | 2 +-
hubic/pom.xml | 2 +-
i18n/pom.xml | 2 +-
importer/dll/pom.xml | 2 +-
importer/pom.xml | 2 +-
irods/pom.xml | 2 +-
jersey/pom.xml | 2 +-
manta/pom.xml | 2 +-
nextcloud/pom.xml | 2 +-
nio/pom.xml | 2 +-
oauth/pom.xml | 2 +-
onedrive/pom.xml | 2 +-
openstack/pom.xml | 2 +-
osx/pom.xml | 2 +-
owncloud/pom.xml | 2 +-
pom.xml | 4 ++--
profiles/pom.xml | 2 +-
protocols/dll/pom.xml | 2 +-
protocols/pom.xml | 2 +-
s3/pom.xml | 5 ++---
smb/pom.xml | 2 +-
spectra/pom.xml | 2 +-
ssh/pom.xml | 2 +-
storegate/pom.xml | 2 +-
test/pom.xml | 2 +-
webdav/pom.xml | 2 +-
windows/pom.xml | 2 +-
55 files changed, 57 insertions(+), 58 deletions(-)
diff --git a/azure/pom.xml b/azure/pom.xml
index 7c91ef25a67..75b6a11e4ba 100644
--- a/azure/pom.xml
+++ b/azure/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
azure
diff --git a/backblaze/pom.xml b/backblaze/pom.xml
index 85ccb808b0a..c6496676c7c 100644
--- a/backblaze/pom.xml
+++ b/backblaze/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
backblaze
jar
diff --git a/binding/pom.xml b/binding/pom.xml
index 5a5c07934b5..e777b95404b 100644
--- a/binding/pom.xml
+++ b/binding/pom.xml
@@ -19,7 +19,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
binding
jar
diff --git a/bonjour/dll/pom.xml b/bonjour/dll/pom.xml
index 917f32fd254..57850cdb066 100644
--- a/bonjour/dll/pom.xml
+++ b/bonjour/dll/pom.xml
@@ -5,7 +5,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0-SNAPSHOT
+ 8.7.0
Cyberduck.Bonjour
pom
diff --git a/bonjour/native/pom.xml b/bonjour/native/pom.xml
index e83b14049ab..09c5ff20f59 100644
--- a/bonjour/native/pom.xml
+++ b/bonjour/native/pom.xml
@@ -5,7 +5,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0-SNAPSHOT
+ 8.7.0
Cyberduck.Bonjour.Native
pom
diff --git a/bonjour/pom.xml b/bonjour/pom.xml
index 09cc43a3c56..e3eb31c28b7 100644
--- a/bonjour/pom.xml
+++ b/bonjour/pom.xml
@@ -18,7 +18,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
4.0.0
diff --git a/box/pom.xml b/box/pom.xml
index d14c446fc1b..53e596320a4 100644
--- a/box/pom.xml
+++ b/box/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
box
diff --git a/brick/pom.xml b/brick/pom.xml
index dfc0e562cbf..6ef555336a0 100644
--- a/brick/pom.xml
+++ b/brick/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
brick
jar
diff --git a/cli/dll/pom.xml b/cli/dll/pom.xml
index 732ca178b33..dd8a211ca0a 100644
--- a/cli/dll/pom.xml
+++ b/cli/dll/pom.xml
@@ -20,7 +20,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0-SNAPSHOT
+ 8.7.0
Cyberduck.Cli
pom
diff --git a/cli/linux/pom.xml b/cli/linux/pom.xml
index dea40ebcf7d..ef4885ab9cf 100644
--- a/cli/linux/pom.xml
+++ b/cli/linux/pom.xml
@@ -20,7 +20,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0-SNAPSHOT
+ 8.7.0
cli-linux
Cyberduck CLI Linux
diff --git a/cli/osx/pom.xml b/cli/osx/pom.xml
index 6cac0a207ff..e499133740e 100644
--- a/cli/osx/pom.xml
+++ b/cli/osx/pom.xml
@@ -20,7 +20,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0-SNAPSHOT
+ 8.7.0
cli-osx
Cyberduck CLI Mac
diff --git a/cli/pom.xml b/cli/pom.xml
index b2e68b0a588..9e56cbba466 100644
--- a/cli/pom.xml
+++ b/cli/pom.xml
@@ -19,7 +19,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
cli
diff --git a/cli/windows/pom.xml b/cli/windows/pom.xml
index 9b418af10bc..d5627fbcc3a 100644
--- a/cli/windows/pom.xml
+++ b/cli/windows/pom.xml
@@ -20,7 +20,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0-SNAPSHOT
+ 8.7.0
cli-windows
Cyberduck CLI Windows
diff --git a/core/dll/pom.xml b/core/dll/pom.xml
index 87cbcab0db7..8164cba10bb 100644
--- a/core/dll/pom.xml
+++ b/core/dll/pom.xml
@@ -5,7 +5,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0-SNAPSHOT
+ 8.7.0
Cyberduck.Core
pom
diff --git a/core/dylib/pom.xml b/core/dylib/pom.xml
index e1bc399c672..c675f38cf7c 100644
--- a/core/dylib/pom.xml
+++ b/core/dylib/pom.xml
@@ -5,7 +5,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0-SNAPSHOT
+ 8.7.0
libcore
diff --git a/core/native/pom.xml b/core/native/pom.xml
index 0d8bef8c968..c051b52c419 100644
--- a/core/native/pom.xml
+++ b/core/native/pom.xml
@@ -5,7 +5,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0-SNAPSHOT
+ 8.7.0
Cyberduck.Core.Native
pom
diff --git a/core/native/refresh/pom.xml b/core/native/refresh/pom.xml
index 6cb83060cb2..1f95a4b463b 100644
--- a/core/native/refresh/pom.xml
+++ b/core/native/refresh/pom.xml
@@ -5,7 +5,7 @@
ch.cyberduck
Cyberduck.Core.Native
../pom.xml
- 8.7.0-SNAPSHOT
+ 8.7.0
Cyberduck.Core.Refresh
pom
diff --git a/core/pom.xml b/core/pom.xml
index 334ce36d841..d860f79bad5 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
core
jar
diff --git a/cryptomator/dll/pom.xml b/cryptomator/dll/pom.xml
index 938c46122e2..a6bf3ad1c11 100644
--- a/cryptomator/dll/pom.xml
+++ b/cryptomator/dll/pom.xml
@@ -20,7 +20,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0-SNAPSHOT
+ 8.7.0
Cyberduck.Cryptomator
pom
diff --git a/cryptomator/pom.xml b/cryptomator/pom.xml
index ef7b2a6a01f..abfc6b0819d 100644
--- a/cryptomator/pom.xml
+++ b/cryptomator/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
cryptomator
jar
diff --git a/ctera/pom.xml b/ctera/pom.xml
index 0013ed31381..1e62bebf206 100644
--- a/ctera/pom.xml
+++ b/ctera/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
ctera
jar
diff --git a/defaults/pom.xml b/defaults/pom.xml
index 5e53b15ea2d..b7c82581a2b 100644
--- a/defaults/pom.xml
+++ b/defaults/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
defaults
diff --git a/dracoon/pom.xml b/dracoon/pom.xml
index 8220f048731..f9e3134ece6 100644
--- a/dracoon/pom.xml
+++ b/dracoon/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
dracoon
diff --git a/dropbox/pom.xml b/dropbox/pom.xml
index 83337c1d0be..744ff3c1adc 100644
--- a/dropbox/pom.xml
+++ b/dropbox/pom.xml
@@ -18,7 +18,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
4.0.0
dropbox
diff --git a/eue/pom.xml b/eue/pom.xml
index d4c81276829..d4a409bbc6f 100644
--- a/eue/pom.xml
+++ b/eue/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
eue
jar
diff --git a/freenet/pom.xml b/freenet/pom.xml
index 85104a5b2b9..ab3292cc728 100644
--- a/freenet/pom.xml
+++ b/freenet/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
freenet
jar
diff --git a/ftp/pom.xml b/ftp/pom.xml
index 5dbfc71729a..4411df6cbcb 100644
--- a/ftp/pom.xml
+++ b/ftp/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
ftp
jar
diff --git a/googledrive/pom.xml b/googledrive/pom.xml
index 217749cb9ba..a49e4a11bab 100644
--- a/googledrive/pom.xml
+++ b/googledrive/pom.xml
@@ -18,7 +18,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
4.0.0
googledrive
diff --git a/googlestorage/pom.xml b/googlestorage/pom.xml
index f7518c92d52..6079744c87f 100644
--- a/googlestorage/pom.xml
+++ b/googlestorage/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
googlestorage
diff --git a/hubic/pom.xml b/hubic/pom.xml
index 7d03b167d3a..76b91174b00 100644
--- a/hubic/pom.xml
+++ b/hubic/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
hubic
jar
diff --git a/i18n/pom.xml b/i18n/pom.xml
index a703499b738..9656e06c1cf 100644
--- a/i18n/pom.xml
+++ b/i18n/pom.xml
@@ -18,7 +18,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
4.0.0
jar
diff --git a/importer/dll/pom.xml b/importer/dll/pom.xml
index 28e97427e3f..e8c2c2998cd 100644
--- a/importer/dll/pom.xml
+++ b/importer/dll/pom.xml
@@ -5,7 +5,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0-SNAPSHOT
+ 8.7.0
Cyberduck.Importer
pom
diff --git a/importer/pom.xml b/importer/pom.xml
index 6541de0012e..4ca94b60c58 100644
--- a/importer/pom.xml
+++ b/importer/pom.xml
@@ -18,7 +18,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
4.0.0
diff --git a/irods/pom.xml b/irods/pom.xml
index ad29709981d..2add35a0001 100644
--- a/irods/pom.xml
+++ b/irods/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
irods
jar
diff --git a/jersey/pom.xml b/jersey/pom.xml
index f14ade79426..a18804f465a 100644
--- a/jersey/pom.xml
+++ b/jersey/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
jersey
diff --git a/manta/pom.xml b/manta/pom.xml
index d26ab418d5e..e342775ab2c 100644
--- a/manta/pom.xml
+++ b/manta/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
manta
diff --git a/nextcloud/pom.xml b/nextcloud/pom.xml
index 15b32f9b94f..98a395ea111 100644
--- a/nextcloud/pom.xml
+++ b/nextcloud/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
nextcloud
jar
diff --git a/nio/pom.xml b/nio/pom.xml
index ff6663225b7..787acaf24bb 100644
--- a/nio/pom.xml
+++ b/nio/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
nio
jar
diff --git a/oauth/pom.xml b/oauth/pom.xml
index bf14caae33d..3fca538cf1d 100644
--- a/oauth/pom.xml
+++ b/oauth/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
oauth
diff --git a/onedrive/pom.xml b/onedrive/pom.xml
index 82f923d7394..c6ea3872010 100644
--- a/onedrive/pom.xml
+++ b/onedrive/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
onedrive
diff --git a/openstack/pom.xml b/openstack/pom.xml
index eda34effa92..cd4fac7ccfa 100644
--- a/openstack/pom.xml
+++ b/openstack/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
openstack
jar
diff --git a/osx/pom.xml b/osx/pom.xml
index b03b252dfa9..ca851ffa060 100644
--- a/osx/pom.xml
+++ b/osx/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
osx
jar
diff --git a/owncloud/pom.xml b/owncloud/pom.xml
index 4972ddc86e8..5068261600d 100644
--- a/owncloud/pom.xml
+++ b/owncloud/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
owncloud
jar
diff --git a/pom.xml b/pom.xml
index bdcbd39ae7f..6e7ce53cb1a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
parent
Cyberduck
pom
- 8.7.0-SNAPSHOT
+ 8.7.0
defaults
@@ -72,7 +72,7 @@
scm:git:git@github.com:iterate-ch/cyberduck.git
- HEAD
+ release-8-7-0
diff --git a/profiles/pom.xml b/profiles/pom.xml
index 5de6c3cede8..e515bd1b1e4 100644
--- a/profiles/pom.xml
+++ b/profiles/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
profiles
jar
diff --git a/protocols/dll/pom.xml b/protocols/dll/pom.xml
index 44b7d42ffdb..65d7e729007 100644
--- a/protocols/dll/pom.xml
+++ b/protocols/dll/pom.xml
@@ -5,7 +5,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0-SNAPSHOT
+ 8.7.0
Cyberduck.Protocols
pom
diff --git a/protocols/pom.xml b/protocols/pom.xml
index 15a40cdd291..014dd76a4e3 100644
--- a/protocols/pom.xml
+++ b/protocols/pom.xml
@@ -18,7 +18,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
4.0.0
pom
diff --git a/s3/pom.xml b/s3/pom.xml
index c9b83e0aacd..aa40584b113 100644
--- a/s3/pom.xml
+++ b/s3/pom.xml
@@ -13,13 +13,12 @@
~ GNU General Public License for more details.
-->
-
+
4.0.0
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
s3
jar
diff --git a/smb/pom.xml b/smb/pom.xml
index 5161429dec0..97c96fb46a4 100644
--- a/smb/pom.xml
+++ b/smb/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
smb
jar
diff --git a/spectra/pom.xml b/spectra/pom.xml
index e6f0cbf75e4..40dd1c7d9f2 100644
--- a/spectra/pom.xml
+++ b/spectra/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
spectra
jar
diff --git a/ssh/pom.xml b/ssh/pom.xml
index a78328073f3..46c3d6513e3 100644
--- a/ssh/pom.xml
+++ b/ssh/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
ssh
jar
diff --git a/storegate/pom.xml b/storegate/pom.xml
index 0d85add46ec..76a116c9517 100644
--- a/storegate/pom.xml
+++ b/storegate/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
storegate
diff --git a/test/pom.xml b/test/pom.xml
index affbfd1bc8e..809b16110d6 100644
--- a/test/pom.xml
+++ b/test/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
4.0.0
pom
diff --git a/webdav/pom.xml b/webdav/pom.xml
index e3b23935f43..e5144d30483 100644
--- a/webdav/pom.xml
+++ b/webdav/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0-SNAPSHOT
+ 8.7.0
webdav
jar
diff --git a/windows/pom.xml b/windows/pom.xml
index c69ed9fb9ad..76309f2a6e6 100644
--- a/windows/pom.xml
+++ b/windows/pom.xml
@@ -18,7 +18,7 @@
parent
ch.cyberduck
- 8.7.0-SNAPSHOT
+ 8.7.0
4.0.0
Cyberduck.Native
From a342c897b85bae92020cd264b81259b4f5925f86 Mon Sep 17 00:00:00 2001
From: Jenkins Automation Server
Date: Wed, 18 Oct 2023 14:34:40 +0000
Subject: [PATCH 037/230] [maven-release-plugin] prepare for next development
iteration
---
azure/pom.xml | 2 +-
backblaze/pom.xml | 2 +-
binding/pom.xml | 2 +-
bonjour/dll/pom.xml | 2 +-
bonjour/native/pom.xml | 2 +-
bonjour/pom.xml | 2 +-
box/pom.xml | 2 +-
brick/pom.xml | 2 +-
cli/dll/pom.xml | 2 +-
cli/linux/pom.xml | 2 +-
cli/osx/pom.xml | 2 +-
cli/pom.xml | 2 +-
cli/windows/pom.xml | 2 +-
core/dll/pom.xml | 2 +-
core/dylib/pom.xml | 2 +-
core/native/pom.xml | 2 +-
core/native/refresh/pom.xml | 2 +-
core/pom.xml | 2 +-
cryptomator/dll/pom.xml | 2 +-
cryptomator/pom.xml | 2 +-
ctera/pom.xml | 2 +-
defaults/pom.xml | 2 +-
dracoon/pom.xml | 2 +-
dropbox/pom.xml | 2 +-
eue/pom.xml | 2 +-
freenet/pom.xml | 2 +-
ftp/pom.xml | 2 +-
googledrive/pom.xml | 2 +-
googlestorage/pom.xml | 2 +-
hubic/pom.xml | 2 +-
i18n/pom.xml | 2 +-
importer/dll/pom.xml | 2 +-
importer/pom.xml | 2 +-
irods/pom.xml | 2 +-
jersey/pom.xml | 2 +-
manta/pom.xml | 2 +-
nextcloud/pom.xml | 2 +-
nio/pom.xml | 2 +-
oauth/pom.xml | 2 +-
onedrive/pom.xml | 2 +-
openstack/pom.xml | 2 +-
osx/pom.xml | 2 +-
owncloud/pom.xml | 2 +-
pom.xml | 4 ++--
profiles/pom.xml | 2 +-
protocols/dll/pom.xml | 2 +-
protocols/pom.xml | 2 +-
s3/pom.xml | 2 +-
smb/pom.xml | 2 +-
spectra/pom.xml | 2 +-
ssh/pom.xml | 2 +-
storegate/pom.xml | 2 +-
test/pom.xml | 2 +-
webdav/pom.xml | 2 +-
windows/pom.xml | 2 +-
55 files changed, 56 insertions(+), 56 deletions(-)
diff --git a/azure/pom.xml b/azure/pom.xml
index 75b6a11e4ba..6639f34d8a9 100644
--- a/azure/pom.xml
+++ b/azure/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
azure
diff --git a/backblaze/pom.xml b/backblaze/pom.xml
index c6496676c7c..d6bd4f9c0d6 100644
--- a/backblaze/pom.xml
+++ b/backblaze/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
backblaze
jar
diff --git a/binding/pom.xml b/binding/pom.xml
index e777b95404b..45eb0bac5e8 100644
--- a/binding/pom.xml
+++ b/binding/pom.xml
@@ -19,7 +19,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
binding
jar
diff --git a/bonjour/dll/pom.xml b/bonjour/dll/pom.xml
index 57850cdb066..ee43247f578 100644
--- a/bonjour/dll/pom.xml
+++ b/bonjour/dll/pom.xml
@@ -5,7 +5,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0
+ 8.7.1-SNAPSHOT
Cyberduck.Bonjour
pom
diff --git a/bonjour/native/pom.xml b/bonjour/native/pom.xml
index 09c5ff20f59..6d47d4f855e 100644
--- a/bonjour/native/pom.xml
+++ b/bonjour/native/pom.xml
@@ -5,7 +5,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0
+ 8.7.1-SNAPSHOT
Cyberduck.Bonjour.Native
pom
diff --git a/bonjour/pom.xml b/bonjour/pom.xml
index e3eb31c28b7..67e87c0f614 100644
--- a/bonjour/pom.xml
+++ b/bonjour/pom.xml
@@ -18,7 +18,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
4.0.0
diff --git a/box/pom.xml b/box/pom.xml
index 53e596320a4..3a029e648a5 100644
--- a/box/pom.xml
+++ b/box/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
box
diff --git a/brick/pom.xml b/brick/pom.xml
index 6ef555336a0..2cb5455fe69 100644
--- a/brick/pom.xml
+++ b/brick/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
brick
jar
diff --git a/cli/dll/pom.xml b/cli/dll/pom.xml
index dd8a211ca0a..dfcdc881b85 100644
--- a/cli/dll/pom.xml
+++ b/cli/dll/pom.xml
@@ -20,7 +20,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0
+ 8.7.1-SNAPSHOT
Cyberduck.Cli
pom
diff --git a/cli/linux/pom.xml b/cli/linux/pom.xml
index ef4885ab9cf..f075e7a3f26 100644
--- a/cli/linux/pom.xml
+++ b/cli/linux/pom.xml
@@ -20,7 +20,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0
+ 8.7.1-SNAPSHOT
cli-linux
Cyberduck CLI Linux
diff --git a/cli/osx/pom.xml b/cli/osx/pom.xml
index e499133740e..635cfbf4a90 100644
--- a/cli/osx/pom.xml
+++ b/cli/osx/pom.xml
@@ -20,7 +20,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0
+ 8.7.1-SNAPSHOT
cli-osx
Cyberduck CLI Mac
diff --git a/cli/pom.xml b/cli/pom.xml
index 9e56cbba466..633b2b2e2a9 100644
--- a/cli/pom.xml
+++ b/cli/pom.xml
@@ -19,7 +19,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
cli
diff --git a/cli/windows/pom.xml b/cli/windows/pom.xml
index d5627fbcc3a..a46e64c95fd 100644
--- a/cli/windows/pom.xml
+++ b/cli/windows/pom.xml
@@ -20,7 +20,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0
+ 8.7.1-SNAPSHOT
cli-windows
Cyberduck CLI Windows
diff --git a/core/dll/pom.xml b/core/dll/pom.xml
index 8164cba10bb..5bdda723d32 100644
--- a/core/dll/pom.xml
+++ b/core/dll/pom.xml
@@ -5,7 +5,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0
+ 8.7.1-SNAPSHOT
Cyberduck.Core
pom
diff --git a/core/dylib/pom.xml b/core/dylib/pom.xml
index c675f38cf7c..833785e567f 100644
--- a/core/dylib/pom.xml
+++ b/core/dylib/pom.xml
@@ -5,7 +5,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0
+ 8.7.1-SNAPSHOT
libcore
diff --git a/core/native/pom.xml b/core/native/pom.xml
index c051b52c419..5b53fdd8107 100644
--- a/core/native/pom.xml
+++ b/core/native/pom.xml
@@ -5,7 +5,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0
+ 8.7.1-SNAPSHOT
Cyberduck.Core.Native
pom
diff --git a/core/native/refresh/pom.xml b/core/native/refresh/pom.xml
index 1f95a4b463b..67e8c457b71 100644
--- a/core/native/refresh/pom.xml
+++ b/core/native/refresh/pom.xml
@@ -5,7 +5,7 @@
ch.cyberduck
Cyberduck.Core.Native
../pom.xml
- 8.7.0
+ 8.7.1-SNAPSHOT
Cyberduck.Core.Refresh
pom
diff --git a/core/pom.xml b/core/pom.xml
index d860f79bad5..72c940ea854 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
core
jar
diff --git a/cryptomator/dll/pom.xml b/cryptomator/dll/pom.xml
index a6bf3ad1c11..f03a3484778 100644
--- a/cryptomator/dll/pom.xml
+++ b/cryptomator/dll/pom.xml
@@ -20,7 +20,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0
+ 8.7.1-SNAPSHOT
Cyberduck.Cryptomator
pom
diff --git a/cryptomator/pom.xml b/cryptomator/pom.xml
index abfc6b0819d..e12836edc01 100644
--- a/cryptomator/pom.xml
+++ b/cryptomator/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
cryptomator
jar
diff --git a/ctera/pom.xml b/ctera/pom.xml
index 1e62bebf206..5c70cac191e 100644
--- a/ctera/pom.xml
+++ b/ctera/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
ctera
jar
diff --git a/defaults/pom.xml b/defaults/pom.xml
index b7c82581a2b..a30f4318a2b 100644
--- a/defaults/pom.xml
+++ b/defaults/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
defaults
diff --git a/dracoon/pom.xml b/dracoon/pom.xml
index f9e3134ece6..081b6ed1a52 100644
--- a/dracoon/pom.xml
+++ b/dracoon/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
dracoon
diff --git a/dropbox/pom.xml b/dropbox/pom.xml
index 744ff3c1adc..d796fef6050 100644
--- a/dropbox/pom.xml
+++ b/dropbox/pom.xml
@@ -18,7 +18,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
4.0.0
dropbox
diff --git a/eue/pom.xml b/eue/pom.xml
index d4a409bbc6f..53e48e8a431 100644
--- a/eue/pom.xml
+++ b/eue/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
eue
jar
diff --git a/freenet/pom.xml b/freenet/pom.xml
index ab3292cc728..57cd256f8a8 100644
--- a/freenet/pom.xml
+++ b/freenet/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
freenet
jar
diff --git a/ftp/pom.xml b/ftp/pom.xml
index 4411df6cbcb..a75907e9be5 100644
--- a/ftp/pom.xml
+++ b/ftp/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
ftp
jar
diff --git a/googledrive/pom.xml b/googledrive/pom.xml
index a49e4a11bab..d88d42ca7c9 100644
--- a/googledrive/pom.xml
+++ b/googledrive/pom.xml
@@ -18,7 +18,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
4.0.0
googledrive
diff --git a/googlestorage/pom.xml b/googlestorage/pom.xml
index 6079744c87f..4446bbe2198 100644
--- a/googlestorage/pom.xml
+++ b/googlestorage/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
googlestorage
diff --git a/hubic/pom.xml b/hubic/pom.xml
index 76b91174b00..60cc7d98134 100644
--- a/hubic/pom.xml
+++ b/hubic/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
hubic
jar
diff --git a/i18n/pom.xml b/i18n/pom.xml
index 9656e06c1cf..f3591e8c3ae 100644
--- a/i18n/pom.xml
+++ b/i18n/pom.xml
@@ -18,7 +18,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
4.0.0
jar
diff --git a/importer/dll/pom.xml b/importer/dll/pom.xml
index e8c2c2998cd..f892f62e2bd 100644
--- a/importer/dll/pom.xml
+++ b/importer/dll/pom.xml
@@ -5,7 +5,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0
+ 8.7.1-SNAPSHOT
Cyberduck.Importer
pom
diff --git a/importer/pom.xml b/importer/pom.xml
index 4ca94b60c58..2db0a440e70 100644
--- a/importer/pom.xml
+++ b/importer/pom.xml
@@ -18,7 +18,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
4.0.0
diff --git a/irods/pom.xml b/irods/pom.xml
index 2add35a0001..c2f87c8a923 100644
--- a/irods/pom.xml
+++ b/irods/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
irods
jar
diff --git a/jersey/pom.xml b/jersey/pom.xml
index a18804f465a..1aa7e930966 100644
--- a/jersey/pom.xml
+++ b/jersey/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
jersey
diff --git a/manta/pom.xml b/manta/pom.xml
index e342775ab2c..4c02e71a81e 100644
--- a/manta/pom.xml
+++ b/manta/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
manta
diff --git a/nextcloud/pom.xml b/nextcloud/pom.xml
index 98a395ea111..13d8f1a1275 100644
--- a/nextcloud/pom.xml
+++ b/nextcloud/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
nextcloud
jar
diff --git a/nio/pom.xml b/nio/pom.xml
index 787acaf24bb..734d9caaf58 100644
--- a/nio/pom.xml
+++ b/nio/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
nio
jar
diff --git a/oauth/pom.xml b/oauth/pom.xml
index 3fca538cf1d..02358f25bc8 100644
--- a/oauth/pom.xml
+++ b/oauth/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
oauth
diff --git a/onedrive/pom.xml b/onedrive/pom.xml
index c6ea3872010..c090a267245 100644
--- a/onedrive/pom.xml
+++ b/onedrive/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
onedrive
diff --git a/openstack/pom.xml b/openstack/pom.xml
index cd4fac7ccfa..2099d1a3940 100644
--- a/openstack/pom.xml
+++ b/openstack/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
openstack
jar
diff --git a/osx/pom.xml b/osx/pom.xml
index ca851ffa060..e8aea083a11 100644
--- a/osx/pom.xml
+++ b/osx/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
osx
jar
diff --git a/owncloud/pom.xml b/owncloud/pom.xml
index 5068261600d..cc2da219f3b 100644
--- a/owncloud/pom.xml
+++ b/owncloud/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
owncloud
jar
diff --git a/pom.xml b/pom.xml
index 6e7ce53cb1a..8794d0b7d9f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
parent
Cyberduck
pom
- 8.7.0
+ 8.7.1-SNAPSHOT
defaults
@@ -72,7 +72,7 @@
scm:git:git@github.com:iterate-ch/cyberduck.git
- release-8-7-0
+ HEAD
diff --git a/profiles/pom.xml b/profiles/pom.xml
index e515bd1b1e4..400bae9df6d 100644
--- a/profiles/pom.xml
+++ b/profiles/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
profiles
jar
diff --git a/protocols/dll/pom.xml b/protocols/dll/pom.xml
index 65d7e729007..0dbef8a884a 100644
--- a/protocols/dll/pom.xml
+++ b/protocols/dll/pom.xml
@@ -5,7 +5,7 @@
ch.cyberduck
parent
../../pom.xml
- 8.7.0
+ 8.7.1-SNAPSHOT
Cyberduck.Protocols
pom
diff --git a/protocols/pom.xml b/protocols/pom.xml
index 014dd76a4e3..fad614ecf28 100644
--- a/protocols/pom.xml
+++ b/protocols/pom.xml
@@ -18,7 +18,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
4.0.0
pom
diff --git a/s3/pom.xml b/s3/pom.xml
index aa40584b113..f34b5181705 100644
--- a/s3/pom.xml
+++ b/s3/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
s3
jar
diff --git a/smb/pom.xml b/smb/pom.xml
index 97c96fb46a4..53d2d3b53de 100644
--- a/smb/pom.xml
+++ b/smb/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
smb
jar
diff --git a/spectra/pom.xml b/spectra/pom.xml
index 40dd1c7d9f2..b3be247d8de 100644
--- a/spectra/pom.xml
+++ b/spectra/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
spectra
jar
diff --git a/ssh/pom.xml b/ssh/pom.xml
index 46c3d6513e3..fa94203cc12 100644
--- a/ssh/pom.xml
+++ b/ssh/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
ssh
jar
diff --git a/storegate/pom.xml b/storegate/pom.xml
index 76a116c9517..6a3a8c0909c 100644
--- a/storegate/pom.xml
+++ b/storegate/pom.xml
@@ -19,7 +19,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
storegate
diff --git a/test/pom.xml b/test/pom.xml
index 809b16110d6..2149373cb5b 100644
--- a/test/pom.xml
+++ b/test/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
4.0.0
pom
diff --git a/webdav/pom.xml b/webdav/pom.xml
index e5144d30483..ddd81de1fa4 100644
--- a/webdav/pom.xml
+++ b/webdav/pom.xml
@@ -18,7 +18,7 @@
ch.cyberduck
parent
- 8.7.0
+ 8.7.1-SNAPSHOT
webdav
jar
diff --git a/windows/pom.xml b/windows/pom.xml
index 76309f2a6e6..a065560a881 100644
--- a/windows/pom.xml
+++ b/windows/pom.xml
@@ -18,7 +18,7 @@
parent
ch.cyberduck
- 8.7.0
+ 8.7.1-SNAPSHOT
4.0.0
Cyberduck.Native
From 88b19637928cd17b75fc4e985b8f95f53fb74d02 Mon Sep 17 00:00:00 2001
From: Jenkins CI
Date: Wed, 18 Oct 2023 17:20:25 +0200
Subject: [PATCH 038/230] Pull localization changes from Transifex
---
i18n/src/main/resources/ar.lproj/Bookmark.xib | 8 ++++----
.../main/resources/ar.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/bg.lproj/Bookmark.xib | 8 ++++----
.../main/resources/bg.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/ca.lproj/Bookmark.xib | 8 ++++----
.../main/resources/ca.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/cs.lproj/Bookmark.xib | 8 ++++----
.../main/resources/cs.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/cy.lproj/Bookmark.xib | 8 ++++----
.../main/resources/cy.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/da.lproj/Bookmark.xib | 8 ++++----
.../main/resources/da.lproj/Connection.xib | 6 +++---
.../src/main/resources/da.lproj/Error.strings | Bin 4176 -> 4186 bytes
i18n/src/main/resources/da.lproj/SDS.strings | Bin 7436 -> 7428 bytes
i18n/src/main/resources/de.lproj/Bookmark.xib | 8 ++++----
.../main/resources/de.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/el.lproj/Bookmark.xib | 8 ++++----
.../main/resources/el.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/es.lproj/Bookmark.xib | 8 ++++----
.../main/resources/es.lproj/Connection.xib | 6 +++---
.../src/main/resources/es.lproj/Error.strings | Bin 4486 -> 4488 bytes
i18n/src/main/resources/es.lproj/SDS.strings | Bin 8186 -> 8392 bytes
i18n/src/main/resources/et.lproj/Bookmark.xib | 8 ++++----
.../main/resources/et.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/fi.lproj/Bookmark.xib | 8 ++++----
.../main/resources/fi.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/fr.lproj/Bookmark.xib | 8 ++++----
.../main/resources/fr.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/he.lproj/Bookmark.xib | 8 ++++----
.../main/resources/he.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/hr.lproj/Bookmark.xib | 8 ++++----
.../main/resources/hr.lproj/Connection.xib | 6 +++---
.../src/main/resources/hr.lproj/Error.strings | Bin 4374 -> 4376 bytes
i18n/src/main/resources/hr.lproj/SDS.strings | Bin 7752 -> 7700 bytes
i18n/src/main/resources/hu.lproj/Bookmark.xib | 8 ++++----
.../main/resources/hu.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/it.lproj/Bookmark.xib | 8 ++++----
.../main/resources/it.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/ja.lproj/Bookmark.xib | 8 ++++----
.../main/resources/ja.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/ka.lproj/Bookmark.xib | 8 ++++----
.../main/resources/ka.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/ko.lproj/Bookmark.xib | 8 ++++----
.../main/resources/ko.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/lv.lproj/Bookmark.xib | 8 ++++----
.../main/resources/lv.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/nl.lproj/Bookmark.xib | 8 ++++----
.../main/resources/nl.lproj/Connection.xib | 6 +++---
.../src/main/resources/nl.lproj/Error.strings | Bin 4348 -> 4358 bytes
.../main/resources/nl.lproj/InfoPlist.strings | Bin 288 -> 300 bytes
i18n/src/main/resources/nl.lproj/SDS.strings | Bin 8052 -> 8148 bytes
i18n/src/main/resources/no.lproj/Bookmark.xib | 8 ++++----
.../main/resources/no.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/pl.lproj/Bookmark.xib | 8 ++++----
.../main/resources/pl.lproj/Connection.xib | 6 +++---
.../main/resources/pt_BR.lproj/Bookmark.xib | 8 ++++----
.../main/resources/pt_BR.lproj/Connection.xib | 6 +++---
.../main/resources/pt_PT.lproj/Bookmark.xib | 8 ++++----
.../main/resources/pt_PT.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/ro.lproj/Bookmark.xib | 8 ++++----
.../main/resources/ro.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/ru.lproj/Bookmark.xib | 8 ++++----
.../main/resources/ru.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/sk.lproj/Bookmark.xib | 8 ++++----
.../main/resources/sk.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/sl.lproj/Bookmark.xib | 8 ++++----
.../main/resources/sl.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/sr.lproj/Bookmark.xib | 8 ++++----
.../main/resources/sr.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/sv.lproj/Bookmark.xib | 8 ++++----
.../main/resources/sv.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/th.lproj/Bookmark.xib | 8 ++++----
.../main/resources/th.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/tr.lproj/Bookmark.xib | 8 ++++----
.../main/resources/tr.lproj/Connection.xib | 6 +++---
i18n/src/main/resources/uk.lproj/Bookmark.xib | 8 ++++----
.../main/resources/uk.lproj/Connection.xib | 6 +++---
.../main/resources/zh_CN.lproj/Bookmark.xib | 8 ++++----
.../main/resources/zh_CN.lproj/Connection.xib | 6 +++---
.../main/resources/zh_CN.lproj/Error.strings | Bin 3212 -> 3198 bytes
.../resources/zh_CN.lproj/InfoPlist.strings | Bin 288 -> 290 bytes
.../main/resources/zh_CN.lproj/SDS.strings | Bin 5192 -> 4506 bytes
.../main/resources/zh_TW.lproj/Bookmark.xib | 8 ++++----
.../main/resources/zh_TW.lproj/Connection.xib | 6 +++---
.../main/resources/zh_TW.lproj/Error.strings | Bin 3358 -> 3344 bytes
.../resources/zh_TW.lproj/InfoPlist.strings | Bin 288 -> 290 bytes
.../main/resources/zh_TW.lproj/SDS.strings | Bin 6724 -> 6038 bytes
87 files changed, 252 insertions(+), 252 deletions(-)
diff --git a/i18n/src/main/resources/ar.lproj/Bookmark.xib b/i18n/src/main/resources/ar.lproj/Bookmark.xib
index 60aec33536f..385304290a0 100644
--- a/i18n/src/main/resources/ar.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/ar.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/ar.lproj/Connection.xib b/i18n/src/main/resources/ar.lproj/Connection.xib
index f4fbd0b843b..85471efba39 100644
--- a/i18n/src/main/resources/ar.lproj/Connection.xib
+++ b/i18n/src/main/resources/ar.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/bg.lproj/Bookmark.xib b/i18n/src/main/resources/bg.lproj/Bookmark.xib
index 0d2a4b28e38..e6c5a75a763 100644
--- a/i18n/src/main/resources/bg.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/bg.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/bg.lproj/Connection.xib b/i18n/src/main/resources/bg.lproj/Connection.xib
index 55e191b968d..f5b01ace0c9 100644
--- a/i18n/src/main/resources/bg.lproj/Connection.xib
+++ b/i18n/src/main/resources/bg.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/ca.lproj/Bookmark.xib b/i18n/src/main/resources/ca.lproj/Bookmark.xib
index 747f028de81..e891695888b 100644
--- a/i18n/src/main/resources/ca.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/ca.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/ca.lproj/Connection.xib b/i18n/src/main/resources/ca.lproj/Connection.xib
index 6058856e0ca..bff8f77bc43 100644
--- a/i18n/src/main/resources/ca.lproj/Connection.xib
+++ b/i18n/src/main/resources/ca.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/cs.lproj/Bookmark.xib b/i18n/src/main/resources/cs.lproj/Bookmark.xib
index 7b01151ba80..ff50db353bc 100644
--- a/i18n/src/main/resources/cs.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/cs.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/cs.lproj/Connection.xib b/i18n/src/main/resources/cs.lproj/Connection.xib
index 693b7e04461..aad4eb76fe3 100644
--- a/i18n/src/main/resources/cs.lproj/Connection.xib
+++ b/i18n/src/main/resources/cs.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/cy.lproj/Bookmark.xib b/i18n/src/main/resources/cy.lproj/Bookmark.xib
index 7b6a44e2f18..f46859d94b3 100644
--- a/i18n/src/main/resources/cy.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/cy.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/cy.lproj/Connection.xib b/i18n/src/main/resources/cy.lproj/Connection.xib
index 4bb6a72e443..281927fb52e 100644
--- a/i18n/src/main/resources/cy.lproj/Connection.xib
+++ b/i18n/src/main/resources/cy.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/da.lproj/Bookmark.xib b/i18n/src/main/resources/da.lproj/Bookmark.xib
index d886483df29..cfa3fdddd6a 100644
--- a/i18n/src/main/resources/da.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/da.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/da.lproj/Connection.xib b/i18n/src/main/resources/da.lproj/Connection.xib
index 68eaf63dcaa..67e298c73e9 100644
--- a/i18n/src/main/resources/da.lproj/Connection.xib
+++ b/i18n/src/main/resources/da.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/da.lproj/Error.strings b/i18n/src/main/resources/da.lproj/Error.strings
index 25f11f8ee1945f67b9e6b77ca715c0e44abd9eaa..a26d5fb3b95631ab71c4b296792cbd951c3c340f 100644
GIT binary patch
delta 44
tcmcbha7$r>nShEXLpBhmGAJ+S82|wn3DW=o
delta 34
ocmcbma6w^%nSfL%LmophLn%W65au%!F_bW*GNdplF<3JI0I8Y?0RR91
diff --git a/i18n/src/main/resources/da.lproj/SDS.strings b/i18n/src/main/resources/da.lproj/SDS.strings
index 85f22e8672c57e9fe7c59ed60e47d3c20377c78c..cb2be6bc78524a73002f6addc37f0759966118f5 100644
GIT binary patch
delta 797
zcmb7CF-yZx5I(iqL1+glQHl_qwN4$ZyU@jM#YuTJiH&KVrA-SC;^L;;`y)cZRs03w
z?BwF^*3s{KuccPHNFd4GefQmcclTJkuRRS5J6dAVaw)#_B@-n9Y+8IPM$Gy8ws|h>
zRcFY^Mgrh{34!tD8t(uMn_%0C*
zE!hAZ2_msA7D^A^7@ow&QyBosrioUzffoL?+(@=8nMu6Eau1+Bo)FMK16!5x
vmgJohHMWasSw#tKr=g3CF?ih}PmeT(?YO(B#0jQUg85~5*k46<ap5T#;2^nP|Q%mkjan(gbF}94@ed;6fxv8qyx!RpltEvcy8IrTljR06&O;0
zA|*gv#E=VCn+g
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/de.lproj/Connection.xib b/i18n/src/main/resources/de.lproj/Connection.xib
index c41d361540b..ed8c5be5841 100644
--- a/i18n/src/main/resources/de.lproj/Connection.xib
+++ b/i18n/src/main/resources/de.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/el.lproj/Bookmark.xib b/i18n/src/main/resources/el.lproj/Bookmark.xib
index 8b460ef46cf..5d20b890519 100644
--- a/i18n/src/main/resources/el.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/el.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/el.lproj/Connection.xib b/i18n/src/main/resources/el.lproj/Connection.xib
index 04d79e2fc91..d3d8204ed83 100644
--- a/i18n/src/main/resources/el.lproj/Connection.xib
+++ b/i18n/src/main/resources/el.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/es.lproj/Bookmark.xib b/i18n/src/main/resources/es.lproj/Bookmark.xib
index ea9c30b7a26..a77d3ffd0d0 100644
--- a/i18n/src/main/resources/es.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/es.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/es.lproj/Connection.xib b/i18n/src/main/resources/es.lproj/Connection.xib
index d7c15aa1dce..2b27063a9c8 100644
--- a/i18n/src/main/resources/es.lproj/Connection.xib
+++ b/i18n/src/main/resources/es.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/es.lproj/Error.strings b/i18n/src/main/resources/es.lproj/Error.strings
index 1d470936caf93cc2f2b7342a9ea08f9d92f67174..9e0dace1a2179ca6b3714a1c11116ad9004b4df0 100644
GIT binary patch
delta 32
mcmZou?oi&4BRE-xl|v+-p@1Qup@^Y`A(0^k$WmgkW&i++&IcC&
delta 14
VcmeBBZd2ZnBRJVdP=d*t0RSUF1IGXW
diff --git a/i18n/src/main/resources/es.lproj/SDS.strings b/i18n/src/main/resources/es.lproj/SDS.strings
index c94a81c438f247b70d0382135b64b5387a737d76..2be1a753ac2a7389fe9b729f2c76d6ec7c6aa0bc 100644
GIT binary patch
delta 1083
zcma)5u}T9$5FJH>*k}+EHK_XmVr6Pc5iBHWB3KB*8ZYrA=Hi(IwDAKhx9}?jA%$RP
zXKQC`nZh5i^1a!dL5;>@?{;=)-@JJ<^S<>|xOs4i)yn=`_5Q0$+IJ4gD1}~v8F#c4{J!Teq
z54nShopCvi0YVs55^=%A^`}Dx>}ZL7iFn_|
z3tAQ^UrVTroSn{YQ`rlw1Th3=4N+o^%GW$$ZCGQg9qKE^b|N-sq~l79Syx_4WxaZw
zE-KF!3GmvwaP`@GorbmHE}6f<1mRtvvpGt$Un(`6S9d?NR%ro&J(J83HA@(Km3>Za
Y=_4~vTmv4SH|_Y-@(8Godz{UF04KoP5&!@I
delta 221
zcmX@%_{)C74FN|-hCGH6hD-)shB6>o#8Apm%%A|o$qb1=84wF3n*)RjKpG@c092LF
zkPakMfwIMu1^J~XdkG2{6EZ0UsJ;Y
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/et.lproj/Connection.xib b/i18n/src/main/resources/et.lproj/Connection.xib
index 1b0a631ea55..ea7ca51e86f 100644
--- a/i18n/src/main/resources/et.lproj/Connection.xib
+++ b/i18n/src/main/resources/et.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/fi.lproj/Bookmark.xib b/i18n/src/main/resources/fi.lproj/Bookmark.xib
index 5e433741496..d8fc1d6dd64 100644
--- a/i18n/src/main/resources/fi.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/fi.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/fi.lproj/Connection.xib b/i18n/src/main/resources/fi.lproj/Connection.xib
index 36b2b1e45a7..2af60f68357 100644
--- a/i18n/src/main/resources/fi.lproj/Connection.xib
+++ b/i18n/src/main/resources/fi.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/fr.lproj/Bookmark.xib b/i18n/src/main/resources/fr.lproj/Bookmark.xib
index 8876d394e43..105b0f91f9a 100644
--- a/i18n/src/main/resources/fr.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/fr.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/fr.lproj/Connection.xib b/i18n/src/main/resources/fr.lproj/Connection.xib
index af619384ce7..9d469b3de02 100644
--- a/i18n/src/main/resources/fr.lproj/Connection.xib
+++ b/i18n/src/main/resources/fr.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/he.lproj/Bookmark.xib b/i18n/src/main/resources/he.lproj/Bookmark.xib
index bfcab66a4d1..225c3554aee 100644
--- a/i18n/src/main/resources/he.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/he.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/he.lproj/Connection.xib b/i18n/src/main/resources/he.lproj/Connection.xib
index 2f0fd6685f3..297a09777ab 100644
--- a/i18n/src/main/resources/he.lproj/Connection.xib
+++ b/i18n/src/main/resources/he.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/hr.lproj/Bookmark.xib b/i18n/src/main/resources/hr.lproj/Bookmark.xib
index b683d4ff26f..d3b28e58014 100644
--- a/i18n/src/main/resources/hr.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/hr.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/hr.lproj/Connection.xib b/i18n/src/main/resources/hr.lproj/Connection.xib
index 3d4f36878fb..0126d02cabe 100644
--- a/i18n/src/main/resources/hr.lproj/Connection.xib
+++ b/i18n/src/main/resources/hr.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/hr.lproj/Error.strings b/i18n/src/main/resources/hr.lproj/Error.strings
index 1105b482a63f2159b18191060771f46779321a52..cc157633eb73a9aa9aa850165dac1611e4591f10 100644
GIT binary patch
delta 41
vcmbQHG(%~_Ja7uqA3>`9@X16A9FCR6G7sM3P8S?T2EPr4=->r*fos
zNkW!_9v*4&S}pdI>*3G(MtYuAFsu*)1yPt?6j^%a>8IO(J#DbP?
UACqcMN2cdoG5p+6$g#v4AFxd_7XSbN
delta 31
ncmbPYbHZlBB+1DlvLcgJBvU3Y5!cylBo)Lwd7sQaCTj)&wXX_t
diff --git a/i18n/src/main/resources/hu.lproj/Bookmark.xib b/i18n/src/main/resources/hu.lproj/Bookmark.xib
index 00a7833224b..a50346e3571 100644
--- a/i18n/src/main/resources/hu.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/hu.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/hu.lproj/Connection.xib b/i18n/src/main/resources/hu.lproj/Connection.xib
index f4c0df54f1a..764d1165dc4 100644
--- a/i18n/src/main/resources/hu.lproj/Connection.xib
+++ b/i18n/src/main/resources/hu.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/it.lproj/Bookmark.xib b/i18n/src/main/resources/it.lproj/Bookmark.xib
index 20aa6dc0408..4d9060fb797 100644
--- a/i18n/src/main/resources/it.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/it.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/it.lproj/Connection.xib b/i18n/src/main/resources/it.lproj/Connection.xib
index b6cc6af3e4e..4fd9ab7b58d 100644
--- a/i18n/src/main/resources/it.lproj/Connection.xib
+++ b/i18n/src/main/resources/it.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/ja.lproj/Bookmark.xib b/i18n/src/main/resources/ja.lproj/Bookmark.xib
index bd8480ade83..008080c3d05 100644
--- a/i18n/src/main/resources/ja.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/ja.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/ja.lproj/Connection.xib b/i18n/src/main/resources/ja.lproj/Connection.xib
index 4482b3ac5c3..4a7b7e6d5bd 100644
--- a/i18n/src/main/resources/ja.lproj/Connection.xib
+++ b/i18n/src/main/resources/ja.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/ka.lproj/Bookmark.xib b/i18n/src/main/resources/ka.lproj/Bookmark.xib
index 4823dcf85f8..4a03a644ff3 100644
--- a/i18n/src/main/resources/ka.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/ka.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/ka.lproj/Connection.xib b/i18n/src/main/resources/ka.lproj/Connection.xib
index 2293aaf2c95..9edd1830310 100644
--- a/i18n/src/main/resources/ka.lproj/Connection.xib
+++ b/i18n/src/main/resources/ka.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/ko.lproj/Bookmark.xib b/i18n/src/main/resources/ko.lproj/Bookmark.xib
index ae63c4cdbd0..5eb7c83a2c8 100644
--- a/i18n/src/main/resources/ko.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/ko.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/ko.lproj/Connection.xib b/i18n/src/main/resources/ko.lproj/Connection.xib
index dc46494d0eb..563415fa925 100644
--- a/i18n/src/main/resources/ko.lproj/Connection.xib
+++ b/i18n/src/main/resources/ko.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/lv.lproj/Bookmark.xib b/i18n/src/main/resources/lv.lproj/Bookmark.xib
index 29e35c8ac82..30f2ca091b4 100644
--- a/i18n/src/main/resources/lv.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/lv.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/lv.lproj/Connection.xib b/i18n/src/main/resources/lv.lproj/Connection.xib
index bc254684b99..c444652f9ae 100644
--- a/i18n/src/main/resources/lv.lproj/Connection.xib
+++ b/i18n/src/main/resources/lv.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/nl.lproj/Bookmark.xib b/i18n/src/main/resources/nl.lproj/Bookmark.xib
index d48d59f5a39..a38cf63a2cb 100644
--- a/i18n/src/main/resources/nl.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/nl.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/nl.lproj/Connection.xib b/i18n/src/main/resources/nl.lproj/Connection.xib
index e99982240c9..92f6d2db0b0 100644
--- a/i18n/src/main/resources/nl.lproj/Connection.xib
+++ b/i18n/src/main/resources/nl.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/nl.lproj/Error.strings b/i18n/src/main/resources/nl.lproj/Error.strings
index 7541bdcbf04bf70d26e55e5d3473c550bd589de0..72261f0a4d8a5a9511bed740af5404ad1f9f99c1 100644
GIT binary patch
delta 44
tcmeyP*rv4Mk${RHLncEiLkWWdLq0C6kcbBe1-ysN`@kaOosG{%gxaQK3W3+=0gj0
diff --git a/i18n/src/main/resources/nl.lproj/SDS.strings b/i18n/src/main/resources/nl.lproj/SDS.strings
index 3a52e433af1384f3e64c36a143c1e1b31b450fb8..0ab8600a46dca9f6dc76bc620cfd0363b5852a08 100644
GIT binary patch
delta 963
zcma)4u}T9$5FIg!SV$}cHJ}?iQDPz2C>jt0HX>r7ZIX-0skwwpE;;$r-3%P{10E>AU?RQsay{XR02q2#b0I48t
ztZB;#WGYfB_J~FBWPm&Ys)`kW79-CQ6DlfzP4YKNfV4uKn59ppID!;!A{`DM^HS{6%3!wq@ErF5Y@Zc7R)v93uG`b>yj_3b1~cBZlp$A4th&C+3dZ
zz_J_?Bc=#Dgcad`1-qoT%vc9vl(s{X*|+(P?pbPU>?ns&s!1LG5!fRzN^9+j{Ys<`
zjhup#L1x!r78~R14+%?f60~~MSpXyQ1AVE&*R<(GsuP1Di)Vk0aGYEOGrLT&v~h08
zH9j|(RUM}a?wvf`DN(4i;6qN1-tX`^@#r-=S!|DcueqpBmzW`ZGJ{UCv(HN}_F-wN
zv#*%Ju^jFj1=iVCBJ5QQg+&mjf#tGNJjzhff=fWS0^ME*x~7G>a#$XPsm&{p7525Q
NtKN~ln@&$UvOnWDz7YTb
delta 153
zcmca&|HW=YkAPw^LkUABLkp+S-?=lkk60~BvToR8Hy)AWR{QG=v1F~}%Qa76mnsQ8Tkye?^BN;LIpQOQL
qHYtV4aZ(+VQ>3aUKakMbyh7TFadV4w7~^Cwxigak
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/no.lproj/Connection.xib b/i18n/src/main/resources/no.lproj/Connection.xib
index 26be58c189e..89d34d8e7d6 100644
--- a/i18n/src/main/resources/no.lproj/Connection.xib
+++ b/i18n/src/main/resources/no.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/pl.lproj/Bookmark.xib b/i18n/src/main/resources/pl.lproj/Bookmark.xib
index 44f1c583256..a794cb8c2ce 100644
--- a/i18n/src/main/resources/pl.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/pl.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/pl.lproj/Connection.xib b/i18n/src/main/resources/pl.lproj/Connection.xib
index 9c26d80f939..7fc2fe4ecea 100644
--- a/i18n/src/main/resources/pl.lproj/Connection.xib
+++ b/i18n/src/main/resources/pl.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/pt_BR.lproj/Bookmark.xib b/i18n/src/main/resources/pt_BR.lproj/Bookmark.xib
index fbf4edf4840..03bf5e31f58 100644
--- a/i18n/src/main/resources/pt_BR.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/pt_BR.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/pt_BR.lproj/Connection.xib b/i18n/src/main/resources/pt_BR.lproj/Connection.xib
index 6961fe756bd..abdcaaeb79c 100644
--- a/i18n/src/main/resources/pt_BR.lproj/Connection.xib
+++ b/i18n/src/main/resources/pt_BR.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/pt_PT.lproj/Bookmark.xib b/i18n/src/main/resources/pt_PT.lproj/Bookmark.xib
index d0ae08a55ca..0f7e87edfbd 100644
--- a/i18n/src/main/resources/pt_PT.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/pt_PT.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/pt_PT.lproj/Connection.xib b/i18n/src/main/resources/pt_PT.lproj/Connection.xib
index abfb4e5b483..1a2ea03f995 100644
--- a/i18n/src/main/resources/pt_PT.lproj/Connection.xib
+++ b/i18n/src/main/resources/pt_PT.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/ro.lproj/Bookmark.xib b/i18n/src/main/resources/ro.lproj/Bookmark.xib
index 683290c2090..e71d9f22ea6 100644
--- a/i18n/src/main/resources/ro.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/ro.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/ro.lproj/Connection.xib b/i18n/src/main/resources/ro.lproj/Connection.xib
index 04398829b6e..dd5f4acfdae 100644
--- a/i18n/src/main/resources/ro.lproj/Connection.xib
+++ b/i18n/src/main/resources/ro.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/ru.lproj/Bookmark.xib b/i18n/src/main/resources/ru.lproj/Bookmark.xib
index 0d974d7dccb..53185decbd3 100644
--- a/i18n/src/main/resources/ru.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/ru.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/ru.lproj/Connection.xib b/i18n/src/main/resources/ru.lproj/Connection.xib
index 48d58322d7d..90f86254ef4 100644
--- a/i18n/src/main/resources/ru.lproj/Connection.xib
+++ b/i18n/src/main/resources/ru.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/sk.lproj/Bookmark.xib b/i18n/src/main/resources/sk.lproj/Bookmark.xib
index 00a7d2a8e20..b3685ced41d 100644
--- a/i18n/src/main/resources/sk.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/sk.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/sk.lproj/Connection.xib b/i18n/src/main/resources/sk.lproj/Connection.xib
index 0bca4509928..8e10f3e375e 100644
--- a/i18n/src/main/resources/sk.lproj/Connection.xib
+++ b/i18n/src/main/resources/sk.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/sl.lproj/Bookmark.xib b/i18n/src/main/resources/sl.lproj/Bookmark.xib
index d0777de9ed2..9a29ae65d98 100644
--- a/i18n/src/main/resources/sl.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/sl.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/sl.lproj/Connection.xib b/i18n/src/main/resources/sl.lproj/Connection.xib
index 4c5c722faca..d9176883a5e 100644
--- a/i18n/src/main/resources/sl.lproj/Connection.xib
+++ b/i18n/src/main/resources/sl.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/sr.lproj/Bookmark.xib b/i18n/src/main/resources/sr.lproj/Bookmark.xib
index f14d70ba5f6..31ca3deea48 100644
--- a/i18n/src/main/resources/sr.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/sr.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/sr.lproj/Connection.xib b/i18n/src/main/resources/sr.lproj/Connection.xib
index f60e6e3c160..e98d3b5a296 100644
--- a/i18n/src/main/resources/sr.lproj/Connection.xib
+++ b/i18n/src/main/resources/sr.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/sv.lproj/Bookmark.xib b/i18n/src/main/resources/sv.lproj/Bookmark.xib
index c0b31376401..d7af791b14a 100644
--- a/i18n/src/main/resources/sv.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/sv.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/sv.lproj/Connection.xib b/i18n/src/main/resources/sv.lproj/Connection.xib
index 4fb4d8ff89c..f4c21ea6ec3 100644
--- a/i18n/src/main/resources/sv.lproj/Connection.xib
+++ b/i18n/src/main/resources/sv.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/th.lproj/Bookmark.xib b/i18n/src/main/resources/th.lproj/Bookmark.xib
index 72cd8111f3d..dc93e4bcc8f 100644
--- a/i18n/src/main/resources/th.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/th.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/th.lproj/Connection.xib b/i18n/src/main/resources/th.lproj/Connection.xib
index 364e023cf3e..1426a9bfc0e 100644
--- a/i18n/src/main/resources/th.lproj/Connection.xib
+++ b/i18n/src/main/resources/th.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/tr.lproj/Bookmark.xib b/i18n/src/main/resources/tr.lproj/Bookmark.xib
index 8bece2fb91b..3e3b5a71ba5 100644
--- a/i18n/src/main/resources/tr.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/tr.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/tr.lproj/Connection.xib b/i18n/src/main/resources/tr.lproj/Connection.xib
index f7f8153f997..e23e14daae2 100644
--- a/i18n/src/main/resources/tr.lproj/Connection.xib
+++ b/i18n/src/main/resources/tr.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/uk.lproj/Bookmark.xib b/i18n/src/main/resources/uk.lproj/Bookmark.xib
index 893c4d52841..06a8b211dcd 100644
--- a/i18n/src/main/resources/uk.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/uk.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/uk.lproj/Connection.xib b/i18n/src/main/resources/uk.lproj/Connection.xib
index 01c81bba83d..ceccc8b2743 100644
--- a/i18n/src/main/resources/uk.lproj/Connection.xib
+++ b/i18n/src/main/resources/uk.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/zh_CN.lproj/Bookmark.xib b/i18n/src/main/resources/zh_CN.lproj/Bookmark.xib
index 465c38fc03e..8a2cb6b5624 100644
--- a/i18n/src/main/resources/zh_CN.lproj/Bookmark.xib
+++ b/i18n/src/main/resources/zh_CN.lproj/Bookmark.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/zh_CN.lproj/Connection.xib b/i18n/src/main/resources/zh_CN.lproj/Connection.xib
index 6919b9cc174..16767e0b9e6 100644
--- a/i18n/src/main/resources/zh_CN.lproj/Connection.xib
+++ b/i18n/src/main/resources/zh_CN.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/zh_CN.lproj/Error.strings b/i18n/src/main/resources/zh_CN.lproj/Error.strings
index 0bdd5e6fee48f06d448664d0214aa71fc2f2d67a..6649c2bf610fa386ce247a2da82d0f03d2f33d0d 100644
GIT binary patch
delta 20
bcmeB?{3o%Yh=+&QZ*_-$Dr2$|gEa#HN#6z8
delta 14
Vcmew-(IdH`h-Y#Tj|7u70{|%)1TX*q
diff --git a/i18n/src/main/resources/zh_CN.lproj/InfoPlist.strings b/i18n/src/main/resources/zh_CN.lproj/InfoPlist.strings
index 1367f18bea11a34de3150335fa15182c4f561d3f..dacfedefc9531e89d79536a8cbafcb154b8552ce 100644
GIT binary patch
delta 13
UcmZ3$w1{cKHRc$GyouL60V1viD*ylh
delta 11
ScmZ3)w18>CHAaPrH$4Fv>;!=T
diff --git a/i18n/src/main/resources/zh_CN.lproj/SDS.strings b/i18n/src/main/resources/zh_CN.lproj/SDS.strings
index 14a4179eaadea7bf744e0a27ac6ca565cfeacaa6..69cb68d1903830faf77d9b67eb06fa39305ddbdd 100644
GIT binary patch
delta 316
zcmX@1F-v*F8+MVi!ADCkWoIXyPd@9X5q`Vhr$g6o@&z`D$p@HNCVO%4Ng)&*$nefJ
z2r5h9Pi#;9=Er2Pc@0M!s{%r_HE?G%&;JYQv;F1={cYg&dmpS(%49Hk4WAJgL=j`u
z!G_6y__|cSck@W-EyZ0lI6K&^a@Z1Aaz>tONNR77|PbAP0I@yBApp@%(=f$QCqz3SUTX
N;MHy>10@D)1^~67hi?D?
delta 212
zcmbQGd_rTx8+Ip0hCGH6hD-)shB6>o#8Apm%%A|o$qb1=84wF3n*)RjKpG@c092LF
zkPakMfwIL6lQ^`D37L`tR9gbXMGU!MQ&JgHCO7hlbESdJPG!(z*zCg5#ya^PpUUJc
z-iXO>cnv0h;Z
-
+
-
+
@@ -389,11 +389,11 @@
-
+
-
+
diff --git a/i18n/src/main/resources/zh_TW.lproj/Connection.xib b/i18n/src/main/resources/zh_TW.lproj/Connection.xib
index bdb79d0e9ce..93c2bc238b8 100644
--- a/i18n/src/main/resources/zh_TW.lproj/Connection.xib
+++ b/i18n/src/main/resources/zh_TW.lproj/Connection.xib
@@ -1,7 +1,7 @@
-
+
-
+
@@ -204,7 +204,7 @@ Gw
-
+
diff --git a/i18n/src/main/resources/zh_TW.lproj/Error.strings b/i18n/src/main/resources/zh_TW.lproj/Error.strings
index ad40280be0f2c8508e8bc4f5f1f36ba78ab24a0e..b80c9097b8d5731aaf917355e8237ce946e80f6a 100644
GIT binary patch
delta 20
bcmbOyH9=|v3oj3^-|7ziRK{c_25SZYJzND7
delta 14
VcmbOrHBV{-3-9D7JQ7US3;-ji1N;C0
diff --git a/i18n/src/main/resources/zh_TW.lproj/InfoPlist.strings b/i18n/src/main/resources/zh_TW.lproj/InfoPlist.strings
index 1367f18bea11a34de3150335fa15182c4f561d3f..dacfedefc9531e89d79536a8cbafcb154b8552ce 100644
GIT binary patch
delta 13
UcmZ3$w1{cKHRc$GyouL60V1viD*ylh
delta 11
ScmZ3)w18>CHAaPrH$4Fv>;!=T
diff --git a/i18n/src/main/resources/zh_TW.lproj/SDS.strings b/i18n/src/main/resources/zh_TW.lproj/SDS.strings
index e87d7514ad14029779f5665e6c18b6b512fa933c..1e3ad49fadc4942cc5fa359040313fe9e8b9118d 100644
GIT binary patch
delta 338
zcmX?NGEIMj53h*Pw4uZ#PGeFw@NaA=YMjxM)-k@r|BTW_0!Zsv_m-4L6(7xoxDI;
zZ?lG&6=S?c_|tBX3SB=`isK|KE-1hNIqpTZZ?8+f%Fq8|V|Qig>9
delta 211
zcmbQHf5c>i53i#mLmop3LnebRLm7}PVkl)OW>5g)WQIhb42T7i%>hCMAPo{J0IJGo
zNC%RsK-uESioEiZ>v(yL37M1vR9^zbMGU!MlTsN{CfACHPj+DuVC0(ome+Rk3*LLI
zlbwWXCch9inEXLlfz_IUi$Q7fTQTv;4k9^|--(F<>6FcvMA8_6%2YQ06ER|(JVorx
L
Date: Thu, 19 Oct 2023 16:23:11 +0000
Subject: [PATCH 039/230] Bump
io.swagger.codegen.v3:swagger-codegen-maven-plugin
Bumps io.swagger.codegen.v3:swagger-codegen-maven-plugin from 3.0.47 to 3.0.48.
---
updated-dependencies:
- dependency-name: io.swagger.codegen.v3:swagger-codegen-maven-plugin
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index f132e351fcc..107bbcab92e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -679,7 +679,7 @@
io.swagger.codegen.v3
swagger-codegen-maven-plugin
- 3.0.47
+ 3.0.48
src/main/java
From 01db83061150eb78c2167010d1702f825cb9325d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 19 Oct 2023 16:23:48 +0000
Subject: [PATCH 040/230] Bump io.swagger:swagger-codegen-maven-plugin from
2.4.33 to 2.4.34
Bumps io.swagger:swagger-codegen-maven-plugin from 2.4.33 to 2.4.34.
---
updated-dependencies:
- dependency-name: io.swagger:swagger-codegen-maven-plugin
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index f132e351fcc..501f287e63c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -674,7 +674,7 @@
io.swagger
swagger-codegen-maven-plugin
- 2.4.33
+ 2.4.34
io.swagger.codegen.v3
From a130f50c4277639d22050c405f3d4d0c0b1567d1 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Fri, 20 Oct 2023 08:53:52 +0200
Subject: [PATCH 041/230] Attempt interoperability with SMBv1.
---
defaults/src/main/resources/default.properties | 1 +
smb/src/main/java/ch/cyberduck/core/smb/SMBSession.java | 1 +
2 files changed, 2 insertions(+)
diff --git a/defaults/src/main/resources/default.properties b/defaults/src/main/resources/default.properties
index 1b5b62567a8..38772875f4d 100644
--- a/defaults/src/main/resources/default.properties
+++ b/defaults/src/main/resources/default.properties
@@ -535,6 +535,7 @@ smb.dfs.enable=true
# Requires that messages from the server are signed
smb.signing.required=false
smb.socket.timeout=0
+smb.protocol.negotiate.enable=true
# Session pool
connection.pool.minidle=1
diff --git a/smb/src/main/java/ch/cyberduck/core/smb/SMBSession.java b/smb/src/main/java/ch/cyberduck/core/smb/SMBSession.java
index 8c62530e73e..08d7b6f0b7e 100644
--- a/smb/src/main/java/ch/cyberduck/core/smb/SMBSession.java
+++ b/smb/src/main/java/ch/cyberduck/core/smb/SMBSession.java
@@ -88,6 +88,7 @@ protected Connection connect(final Proxy proxy, final HostKeyCallback key, final
.withDfsEnabled(new HostPreferences(host).getBoolean("smb.dfs.enable"))
.withSigningRequired(new HostPreferences(host).getBoolean("smb.signing.required"))
.withRandomProvider(SecureRandomProviderFactory.get().provide())
+ .withMultiProtocolNegotiate(new HostPreferences(host).getBoolean("smb.protocol.negotiate.enable"))
.build());
final Connection connection = client.connect(getHost().getHostname(), getHost().getPort());
if(log.isDebugEnabled()) {
From d665ed95040efa751ac10a10c2c1451bf37d5665 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 20 Oct 2023 16:42:33 +0000
Subject: [PATCH 042/230] Bump org.apache.sshd:sshd-sftp from 2.10.0 to 2.11.0
Bumps [org.apache.sshd:sshd-sftp](https://github.com/apache/mina-sshd) from 2.10.0 to 2.11.0.
- [Release notes](https://github.com/apache/mina-sshd/releases)
- [Changelog](https://github.com/apache/mina-sshd/blob/master/CHANGES.md)
- [Commits](https://github.com/apache/mina-sshd/compare/sshd-2.10.0...sshd-2.11.0)
---
updated-dependencies:
- dependency-name: org.apache.sshd:sshd-sftp
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
ssh/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ssh/pom.xml b/ssh/pom.xml
index fa94203cc12..60399833004 100644
--- a/ssh/pom.xml
+++ b/ssh/pom.xml
@@ -105,7 +105,7 @@
org.apache.sshd
sshd-sftp
- 2.10.0
+ 2.11.0
test
From 21c14e89588bb0b82cdcc3409f77d2d3bceb2fa6 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Fri, 20 Oct 2023 21:17:03 +0200
Subject: [PATCH 043/230] Fix #15222.
---
s3/src/main/java/ch/cyberduck/core/s3/S3Session.java | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/s3/src/main/java/ch/cyberduck/core/s3/S3Session.java b/s3/src/main/java/ch/cyberduck/core/s3/S3Session.java
index 0b47f9fdb01..147bafd9451 100644
--- a/s3/src/main/java/ch/cyberduck/core/s3/S3Session.java
+++ b/s3/src/main/java/ch/cyberduck/core/s3/S3Session.java
@@ -40,6 +40,7 @@
import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.exception.InteroperabilityException;
+import ch.cyberduck.core.exception.LoginCanceledException;
import ch.cyberduck.core.features.*;
import ch.cyberduck.core.http.HttpSession;
import ch.cyberduck.core.kms.KMSEncryptionFeature;
@@ -213,9 +214,9 @@ protected RequestEntityRestStorageService connect(final Proxy proxy, final HostK
// Fetch temporary session token from AWS CLI configuration
interceptor = new S3AuthenticationResponseInterceptor(this, new S3CredentialsStrategy() {
@Override
- public Credentials get() {
+ public Credentials get() throws LoginCanceledException {
return new S3CredentialsConfigurator(
- new ThreadLocalHostnameDelegatingTrustManager(trust, host.getHostname()), key, prompt).configure(host);
+ new ThreadLocalHostnameDelegatingTrustManager(trust, host.getHostname()), key, prompt).reload().configure(host);
}
});
}
From 74858eb86a83d52563ead1cfe2f5d96b6b498816 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Fri, 20 Oct 2023 21:21:27 +0200
Subject: [PATCH 044/230] Logging.
---
.../cyberduck/core/CredentialsConfiguratorFactory.java | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/core/src/main/java/ch/cyberduck/core/CredentialsConfiguratorFactory.java b/core/src/main/java/ch/cyberduck/core/CredentialsConfiguratorFactory.java
index 0a9c7439264..5dfd7f0873b 100644
--- a/core/src/main/java/ch/cyberduck/core/CredentialsConfiguratorFactory.java
+++ b/core/src/main/java/ch/cyberduck/core/CredentialsConfiguratorFactory.java
@@ -20,7 +20,11 @@
import ch.cyberduck.core.exception.LoginCanceledException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
public final class CredentialsConfiguratorFactory {
+ private static final Logger log = LogManager.getLogger(CredentialsConfiguratorFactory.class);
private CredentialsConfiguratorFactory() {
//
@@ -31,10 +35,14 @@ private CredentialsConfiguratorFactory() {
* @return Configurator for default settings
*/
public static CredentialsConfigurator get(final Protocol protocol) {
+ final CredentialsConfigurator finder = protocol.getCredentialsFinder();
try {
- return protocol.getCredentialsFinder().reload();
+ return finder.reload();
}
catch(LoginCanceledException e) {
+ if(log.isWarnEnabled()) {
+ log.warn(String.format("Failure %s reloading credentials from %s", e, finder));
+ }
return CredentialsConfigurator.DISABLED;
}
}
From bcd65b9621f0e4ccd1b4cb0f7a3c5c8b081480d1 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Fri, 20 Oct 2023 21:22:55 +0200
Subject: [PATCH 045/230] Logging.
---
.../java/ch/cyberduck/core/s3/S3CredentialsConfigurator.java | 3 +++
1 file changed, 3 insertions(+)
diff --git a/s3/src/main/java/ch/cyberduck/core/s3/S3CredentialsConfigurator.java b/s3/src/main/java/ch/cyberduck/core/s3/S3CredentialsConfigurator.java
index 406842511b0..2a7f35b8af8 100644
--- a/s3/src/main/java/ch/cyberduck/core/s3/S3CredentialsConfigurator.java
+++ b/s3/src/main/java/ch/cyberduck/core/s3/S3CredentialsConfigurator.java
@@ -286,6 +286,9 @@ else if(!profiles.containsKey(basicProfile.getRoleSourceProfile())) {
-1L));
}
}
+ else {
+ log.warn(String.format("No matching configuration for profile %s in %s", profile, profiles));
+ }
return credentials;
}
From 98fe2437e6aaf00017b0e2950e14e8a97cba12f9 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Fri, 20 Oct 2023 15:41:59 +0200
Subject: [PATCH 046/230] Add properties for versioning support in workers.
---
.../core/shared/DefaultVersioningFeature.java | 4 ++--
.../core/transfer/upload/UploadFilterOptions.java | 2 +-
.../ch/cyberduck/core/worker/DeleteWorker.java | 4 ++--
.../java/ch/cyberduck/core/worker/MoveWorker.java | 4 +++-
defaults/src/main/resources/default.properties | 14 ++++++++++----
5 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/core/src/main/java/ch/cyberduck/core/shared/DefaultVersioningFeature.java b/core/src/main/java/ch/cyberduck/core/shared/DefaultVersioningFeature.java
index 541da9de46d..27c2090a1f2 100644
--- a/core/src/main/java/ch/cyberduck/core/shared/DefaultVersioningFeature.java
+++ b/core/src/main/java/ch/cyberduck/core/shared/DefaultVersioningFeature.java
@@ -68,7 +68,7 @@ public DefaultVersioningFeature(final Session> session, final VersioningDirect
this.session = session;
this.provider = provider;
this.formatter = formatter;
- this.include = Pattern.compile(new HostPreferences(session.getHost()).getProperty("queue.upload.file.versioning.include.regex"));
+ this.include = Pattern.compile(new HostPreferences(session.getHost()).getProperty("versioning.include.regex"));
}
@Override
@@ -162,7 +162,7 @@ public void cleanup(final Path file, final ConnectionCallback callback) throws B
}
final List versions = this.list(file, new DisabledListProgressListener()).toStream()
.sorted(new FilenameComparator(false)).skip(
- new HostPreferences(session.getHost()).getInteger("queue.upload.file.versioning.limit")).collect(Collectors.toList());
+ new HostPreferences(session.getHost()).getInteger("versioning.limit")).collect(Collectors.toList());
if(log.isWarnEnabled()) {
log.warn(String.format("Delete %d previous versions of %s", versions.size(), file));
}
diff --git a/core/src/main/java/ch/cyberduck/core/transfer/upload/UploadFilterOptions.java b/core/src/main/java/ch/cyberduck/core/transfer/upload/UploadFilterOptions.java
index f65a9ca273a..ab63dcac78c 100644
--- a/core/src/main/java/ch/cyberduck/core/transfer/upload/UploadFilterOptions.java
+++ b/core/src/main/java/ch/cyberduck/core/transfer/upload/UploadFilterOptions.java
@@ -56,7 +56,7 @@ public UploadFilterOptions(final Host bookmark) {
acl = preferences.getBoolean("queue.upload.acl.change");
timestamp = preferences.getBoolean("queue.upload.timestamp.change");
temporary = preferences.getBoolean("queue.upload.file.temporary");
- versioning = preferences.getBoolean("queue.upload.file.versioning");
+ versioning = preferences.getBoolean("versioning.enable");
metadata = preferences.getBoolean("queue.upload.file.metadata.change");
encryption = preferences.getBoolean("queue.upload.file.encryption.change");
redundancy = preferences.getBoolean("queue.upload.file.redundancy.change");
diff --git a/core/src/main/java/ch/cyberduck/core/worker/DeleteWorker.java b/core/src/main/java/ch/cyberduck/core/worker/DeleteWorker.java
index fb756fbbc23..fe4f44d93ea 100644
--- a/core/src/main/java/ch/cyberduck/core/worker/DeleteWorker.java
+++ b/core/src/main/java/ch/cyberduck/core/worker/DeleteWorker.java
@@ -48,7 +48,6 @@
import java.util.Map;
public class DeleteWorker extends Worker> {
-
private static final Logger log = LogManager.getLogger(DeleteWorker.class);
/**
@@ -120,7 +119,8 @@ public List run(final Session> session) throws BackgroundException {
if(delete.isRecursive()) {
recursive.keySet().removeIf(f -> recursive.keySet().stream().anyMatch(f::isChild));
}
- if(new HostPreferences(session.getHost()).getBoolean("queue.upload.file.versioning")) {
+ final HostPreferences preferences = new HostPreferences(session.getHost());
+ if(preferences.getBoolean("versioning.enable") && preferences.getBoolean("versioning.delete.enable")) {
switch(session.getHost().getProtocol().getVersioningMode()) {
case custom:
final Versioning versioning = session.getFeature(Versioning.class);
diff --git a/core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java b/core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java
index 5e7f7a35523..3406d51aa3f 100644
--- a/core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java
+++ b/core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java
@@ -137,7 +137,9 @@ public void delete(final Path file) {
moved.withAttributes(session.getFeature(AttributesFinder.class).find(moved));
}
result.put(r.getKey(), moved);
- if(new HostPreferences(session.getHost()).getBoolean("queue.upload.file.versioning")) {
+ final HostPreferences preferences = new HostPreferences(session.getHost());
+ if(preferences.getBoolean("versioning.enable")
+ && preferences.getBoolean("versioning.move.enable")) {
switch(session.getHost().getProtocol().getVersioningMode()) {
case custom:
// Move previous versions of file
diff --git a/defaults/src/main/resources/default.properties b/defaults/src/main/resources/default.properties
index 38772875f4d..091d4eeb100 100644
--- a/defaults/src/main/resources/default.properties
+++ b/defaults/src/main/resources/default.properties
@@ -180,10 +180,8 @@ queue.upload.file.temporary=false
# Format string for temporary filename. Default to filename-uuid
queue.upload.file.temporary.format={0}-{1}
queue.upload.file.rename.format={0} ({1}){2}
-queue.upload.file.versioning=false
-queue.upload.file.versioning.include.regex=.*
-# Only keep most recent versions
-queue.upload.file.versioning.limit=5
+versioning.enable=false
+
queue.download.file.rename.format={0} ({1}){2}
queue.download.permissions.change=true
queue.download.permissions.default=false
@@ -725,3 +723,11 @@ info.distribution.enable=true
info.s3.enable=true
info.metadata.enable=true
info.versions.enable=true
+
+versioning.include.regex=.*
+# Only keep most recent versions
+versioning.limit=5
+# Stash file instead of delete
+versioning.delete.enable=true
+# Move previous version together with file to be renamed
+versioning.move.enable=false
\ No newline at end of file
From 5fa7ab8ffd10eefea72b13ef4e1cc2638274f78b Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Sat, 21 Oct 2023 14:35:17 +0200
Subject: [PATCH 047/230] Formatting.
---
core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java b/core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java
index 3406d51aa3f..a925a5dbae3 100644
--- a/core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java
+++ b/core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java
@@ -138,8 +138,7 @@ public void delete(final Path file) {
}
result.put(r.getKey(), moved);
final HostPreferences preferences = new HostPreferences(session.getHost());
- if(preferences.getBoolean("versioning.enable")
- && preferences.getBoolean("versioning.move.enable")) {
+ if(preferences.getBoolean("versioning.enable") && preferences.getBoolean("versioning.move.enable")) {
switch(session.getHost().getProtocol().getVersioningMode()) {
case custom:
// Move previous versions of file
From 02a17018b8864f2dd9666f23965d21dec0004454 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Sat, 21 Oct 2023 14:47:20 +0200
Subject: [PATCH 048/230] Logging.
---
core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java | 3 +++
1 file changed, 3 insertions(+)
diff --git a/core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java b/core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java
index a925a5dbae3..110338bdb98 100644
--- a/core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java
+++ b/core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java
@@ -163,6 +163,9 @@ public void delete(final Path file) {
}
if(version.isDirectory()) {
if(!session.getFeature(Move.class).isRecursive(version, target)) {
+ if(log.isWarnEnabled()) {
+ log.warn(String.format("Skip directory %s", version));
+ }
continue;
}
}
From d24896cf8cd6e202f8f25983641d94c4c55083c3 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Sat, 21 Oct 2023 14:48:22 +0200
Subject: [PATCH 049/230] Return false instead of failure when saving directory
version is not supported.
---
.../java/ch/cyberduck/core/shared/DefaultVersioningFeature.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/core/src/main/java/ch/cyberduck/core/shared/DefaultVersioningFeature.java b/core/src/main/java/ch/cyberduck/core/shared/DefaultVersioningFeature.java
index 27c2090a1f2..a9e41ee3581 100644
--- a/core/src/main/java/ch/cyberduck/core/shared/DefaultVersioningFeature.java
+++ b/core/src/main/java/ch/cyberduck/core/shared/DefaultVersioningFeature.java
@@ -113,7 +113,7 @@ public boolean save(final Path file) throws BackgroundException {
}
if(file.isDirectory()) {
if(!feature.isRecursive(file, version)) {
- throw new UnsupportedException();
+ return false;
}
}
feature.move(file, version,
From 0c0f398a3c0f922b00046a9c610a2d16a1c797d7 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Sat, 21 Oct 2023 18:31:35 +0200
Subject: [PATCH 050/230] Fix exception mapping for transport failures.
---
.../core/smb/SMBAttributesFinderFeature.java | 3 +-
.../ch/cyberduck/core/smb/SMBCopyFeature.java | 3 +-
.../cyberduck/core/smb/SMBDeleteFeature.java | 3 +-
.../core/smb/SMBDirectoryFeature.java | 3 +-
.../core/smb/SMBExceptionMappingService.java | 11 +++--
.../ch/cyberduck/core/smb/SMBFindFeature.java | 3 +-
.../ch/cyberduck/core/smb/SMBListService.java | 3 +-
.../ch/cyberduck/core/smb/SMBMoveFeature.java | 3 +-
.../ch/cyberduck/core/smb/SMBReadFeature.java | 3 +-
.../core/smb/SMBRootListService.java | 3 +-
.../ch/cyberduck/core/smb/SMBSession.java | 3 +-
.../core/smb/SMBTimestampFeature.java | 3 +-
.../SMBTransportExceptionMappingService.java | 43 +++++++++++++++++++
.../smb/SMBExceptionMappingServiceTest.java | 36 ++++++++++++++++
...BTransportExceptionMappingServiceTest.java | 35 +++++++++++++++
15 files changed, 133 insertions(+), 25 deletions(-)
create mode 100644 smb/src/main/java/ch/cyberduck/core/smb/SMBTransportExceptionMappingService.java
create mode 100644 smb/src/test/java/ch/cyberduck/core/smb/SMBExceptionMappingServiceTest.java
create mode 100644 smb/src/test/java/ch/cyberduck/core/smb/SMBTransportExceptionMappingServiceTest.java
diff --git a/smb/src/main/java/ch/cyberduck/core/smb/SMBAttributesFinderFeature.java b/smb/src/main/java/ch/cyberduck/core/smb/SMBAttributesFinderFeature.java
index a02da9b1680..584129e55b5 100644
--- a/smb/src/main/java/ch/cyberduck/core/smb/SMBAttributesFinderFeature.java
+++ b/smb/src/main/java/ch/cyberduck/core/smb/SMBAttributesFinderFeature.java
@@ -15,7 +15,6 @@
* GNU General Public License for more details.
*/
-import ch.cyberduck.core.DefaultIOExceptionMappingService;
import ch.cyberduck.core.ListProgressListener;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathAttributes;
@@ -67,7 +66,7 @@ else if(file.isFile() && fileInformation.getStandardInformation().isDirectory())
throw new SMBExceptionMappingService().map("Failure to read attributes of {0}", e, file);
}
catch(IOException e) {
- throw new DefaultIOExceptionMappingService().map("Cannot read container configuration", e);
+ throw new SMBTransportExceptionMappingService().map("Cannot read container configuration", e);
}
finally {
session.releaseShare(file);
diff --git a/smb/src/main/java/ch/cyberduck/core/smb/SMBCopyFeature.java b/smb/src/main/java/ch/cyberduck/core/smb/SMBCopyFeature.java
index cc3d4d1f8f8..83a6dcc171e 100644
--- a/smb/src/main/java/ch/cyberduck/core/smb/SMBCopyFeature.java
+++ b/smb/src/main/java/ch/cyberduck/core/smb/SMBCopyFeature.java
@@ -16,7 +16,6 @@
*/
import ch.cyberduck.core.ConnectionCallback;
-import ch.cyberduck.core.DefaultIOExceptionMappingService;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.features.Copy;
@@ -66,7 +65,7 @@ public Path copy(final Path source, final Path target, final TransferStatus stat
}
}
catch(IOException e) {
- throw new DefaultIOExceptionMappingService().map("Cannot copy {0}", e, source);
+ throw new SMBTransportExceptionMappingService().map("Cannot copy {0}", e, source);
}
catch(SMBRuntimeException e) {
throw new SMBExceptionMappingService().map("Cannot copy {0}", e, source);
diff --git a/smb/src/main/java/ch/cyberduck/core/smb/SMBDeleteFeature.java b/smb/src/main/java/ch/cyberduck/core/smb/SMBDeleteFeature.java
index 4abfea87cdf..ad8c4e5bb41 100644
--- a/smb/src/main/java/ch/cyberduck/core/smb/SMBDeleteFeature.java
+++ b/smb/src/main/java/ch/cyberduck/core/smb/SMBDeleteFeature.java
@@ -15,7 +15,6 @@
* GNU General Public License for more details.
*/
-import ch.cyberduck.core.DefaultIOExceptionMappingService;
import ch.cyberduck.core.PasswordCallback;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.exception.BackgroundException;
@@ -52,7 +51,7 @@ else if(file.isDirectory()) {
throw new SMBExceptionMappingService().map("Cannot delete {0}", e, file);
}
catch(IOException e) {
- throw new DefaultIOExceptionMappingService().map("Cannot read container configuration", e);
+ throw new SMBTransportExceptionMappingService().map("Cannot read container configuration", e);
}
finally {
session.releaseShare(file);
diff --git a/smb/src/main/java/ch/cyberduck/core/smb/SMBDirectoryFeature.java b/smb/src/main/java/ch/cyberduck/core/smb/SMBDirectoryFeature.java
index 674888883df..e42df1f882b 100644
--- a/smb/src/main/java/ch/cyberduck/core/smb/SMBDirectoryFeature.java
+++ b/smb/src/main/java/ch/cyberduck/core/smb/SMBDirectoryFeature.java
@@ -15,7 +15,6 @@
* GNU General Public License for more details.
*/
-import ch.cyberduck.core.DefaultIOExceptionMappingService;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.features.Directory;
@@ -41,7 +40,7 @@ public Path mkdir(final Path folder, final TransferStatus status) throws Backgro
share.mkdir(new SMBPathContainerService(session).getKey(folder));
}
catch(IOException e) {
- throw new DefaultIOExceptionMappingService().map("Cannot read container configuration", e);
+ throw new SMBTransportExceptionMappingService().map("Cannot read container configuration", e);
}
catch(SMBRuntimeException e) {
throw new SMBExceptionMappingService().map("Cannot create folder {0}", e, folder);
diff --git a/smb/src/main/java/ch/cyberduck/core/smb/SMBExceptionMappingService.java b/smb/src/main/java/ch/cyberduck/core/smb/SMBExceptionMappingService.java
index 7b219fdfe45..e736104afb5 100644
--- a/smb/src/main/java/ch/cyberduck/core/smb/SMBExceptionMappingService.java
+++ b/smb/src/main/java/ch/cyberduck/core/smb/SMBExceptionMappingService.java
@@ -30,12 +30,15 @@
import org.apache.commons.lang3.exception.ExceptionUtils;
+import java.util.concurrent.TimeoutException;
+
import com.hierynomus.mserref.NtStatus;
import com.hierynomus.mssmb2.SMBApiException;
import com.hierynomus.protocol.transport.TransportException;
import com.hierynomus.smbj.common.SMBRuntimeException;
public class SMBExceptionMappingService extends AbstractExceptionMappingService {
+
@Override
public BackgroundException map(final SMBRuntimeException failure) {
if(failure instanceof SMBApiException) {
@@ -81,11 +84,13 @@ public BackgroundException map(final SMBRuntimeException failure) {
}
for(Throwable cause : ExceptionUtils.getThrowableList(failure)) {
if(cause instanceof TransportException) {
- final Throwable root = ExceptionUtils.getRootCause(failure);
- return new ConnectionRefusedException(root.getMessage(), cause);
+ return new SMBTransportExceptionMappingService().map((TransportException) cause);
+ }
+ if(cause instanceof TimeoutException) {
+ return new ConnectionTimeoutException(cause.getMessage(), cause);
}
}
final Throwable root = ExceptionUtils.getRootCause(failure);
- return new InteroperabilityException(root.getMessage(), root);
+ return new InteroperabilityException(root.getMessage(), failure);
}
}
diff --git a/smb/src/main/java/ch/cyberduck/core/smb/SMBFindFeature.java b/smb/src/main/java/ch/cyberduck/core/smb/SMBFindFeature.java
index f869a9b0f67..718180a740e 100644
--- a/smb/src/main/java/ch/cyberduck/core/smb/SMBFindFeature.java
+++ b/smb/src/main/java/ch/cyberduck/core/smb/SMBFindFeature.java
@@ -15,7 +15,6 @@
* GNU General Public License for more details.
*/
-import ch.cyberduck.core.DefaultIOExceptionMappingService;
import ch.cyberduck.core.ListProgressListener;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.exception.BackgroundException;
@@ -51,7 +50,7 @@ public boolean find(final Path file, final ListProgressListener listener) throws
return share.fileExists(new SMBPathContainerService(session).getKey(file));
}
catch(IOException e) {
- throw new DefaultIOExceptionMappingService().map("Cannot read container configuration", e);
+ throw new SMBTransportExceptionMappingService().map("Cannot read container configuration", e);
}
catch(SMBRuntimeException e) {
throw new SMBExceptionMappingService().map("Failure to read attributes of {0}", e, file);
diff --git a/smb/src/main/java/ch/cyberduck/core/smb/SMBListService.java b/smb/src/main/java/ch/cyberduck/core/smb/SMBListService.java
index 3cb829c157f..80ef27f5a17 100644
--- a/smb/src/main/java/ch/cyberduck/core/smb/SMBListService.java
+++ b/smb/src/main/java/ch/cyberduck/core/smb/SMBListService.java
@@ -17,7 +17,6 @@
import ch.cyberduck.core.AbstractPath.Type;
import ch.cyberduck.core.AttributedList;
-import ch.cyberduck.core.DefaultIOExceptionMappingService;
import ch.cyberduck.core.ListProgressListener;
import ch.cyberduck.core.ListService;
import ch.cyberduck.core.Path;
@@ -88,7 +87,7 @@ public AttributedList list(final Path directory, final ListProgressListene
throw new SMBExceptionMappingService().map("Listing directory {0} failed", e, directory);
}
catch(IOException e) {
- throw new DefaultIOExceptionMappingService().map("Cannot read container configuration", e);
+ throw new SMBTransportExceptionMappingService().map("Cannot read container configuration", e);
}
finally {
session.releaseShare(directory);
diff --git a/smb/src/main/java/ch/cyberduck/core/smb/SMBMoveFeature.java b/smb/src/main/java/ch/cyberduck/core/smb/SMBMoveFeature.java
index 32b5a49f1fd..fcea06e5ca6 100644
--- a/smb/src/main/java/ch/cyberduck/core/smb/SMBMoveFeature.java
+++ b/smb/src/main/java/ch/cyberduck/core/smb/SMBMoveFeature.java
@@ -16,7 +16,6 @@
*/
import ch.cyberduck.core.ConnectionCallback;
-import ch.cyberduck.core.DefaultIOExceptionMappingService;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.features.Delete.Callback;
@@ -62,7 +61,7 @@ public Path move(final Path source, final Path target, final TransferStatus stat
}
}
catch(IOException e) {
- throw new DefaultIOExceptionMappingService().map("Cannot read container configuration", e);
+ throw new SMBTransportExceptionMappingService().map("Cannot read container configuration", e);
}
catch(SMBRuntimeException e) {
throw new SMBExceptionMappingService().map("Cannot rename {0}", e, source);
diff --git a/smb/src/main/java/ch/cyberduck/core/smb/SMBReadFeature.java b/smb/src/main/java/ch/cyberduck/core/smb/SMBReadFeature.java
index 343e01507ca..050720f21cb 100644
--- a/smb/src/main/java/ch/cyberduck/core/smb/SMBReadFeature.java
+++ b/smb/src/main/java/ch/cyberduck/core/smb/SMBReadFeature.java
@@ -16,7 +16,6 @@
*/
import ch.cyberduck.core.ConnectionCallback;
-import ch.cyberduck.core.DefaultIOExceptionMappingService;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.features.Read;
@@ -68,7 +67,7 @@ public InputStream read(final Path file, final TransferStatus status, final Conn
throw new SMBExceptionMappingService().map("Download {0} failed", e, file);
}
catch(IOException e) {
- throw new DefaultIOExceptionMappingService().map("Download {0} failed", e, file);
+ throw new SMBTransportExceptionMappingService().map("Download {0} failed", e, file);
}
}
diff --git a/smb/src/main/java/ch/cyberduck/core/smb/SMBRootListService.java b/smb/src/main/java/ch/cyberduck/core/smb/SMBRootListService.java
index 6569e76e640..36d2ceaf619 100644
--- a/smb/src/main/java/ch/cyberduck/core/smb/SMBRootListService.java
+++ b/smb/src/main/java/ch/cyberduck/core/smb/SMBRootListService.java
@@ -18,7 +18,6 @@
import ch.cyberduck.core.AbstractPath;
import ch.cyberduck.core.AttributedList;
import ch.cyberduck.core.Credentials;
-import ch.cyberduck.core.DefaultIOExceptionMappingService;
import ch.cyberduck.core.ListProgressListener;
import ch.cyberduck.core.ListService;
import ch.cyberduck.core.LocaleFactory;
@@ -111,7 +110,7 @@ public AttributedList list(final Path directory, final ListProgressListene
return result;
}
catch(IOException e) {
- throw new DefaultIOExceptionMappingService().map("Cannot read container configuration", e);
+ throw new SMBTransportExceptionMappingService().map("Cannot read container configuration", e);
}
}
return new SMBListService(session).list(directory, listener);
diff --git a/smb/src/main/java/ch/cyberduck/core/smb/SMBSession.java b/smb/src/main/java/ch/cyberduck/core/smb/SMBSession.java
index 08d7b6f0b7e..9a2e48b23e5 100644
--- a/smb/src/main/java/ch/cyberduck/core/smb/SMBSession.java
+++ b/smb/src/main/java/ch/cyberduck/core/smb/SMBSession.java
@@ -17,7 +17,6 @@
import ch.cyberduck.core.ConnectionTimeoutFactory;
import ch.cyberduck.core.Credentials;
-import ch.cyberduck.core.DefaultIOExceptionMappingService;
import ch.cyberduck.core.Host;
import ch.cyberduck.core.HostKeyCallback;
import ch.cyberduck.core.ListService;
@@ -97,7 +96,7 @@ protected Connection connect(final Proxy proxy, final HostKeyCallback key, final
return connection;
}
catch(IOException e) {
- throw new DefaultIOExceptionMappingService().map(e);
+ throw new SMBTransportExceptionMappingService().map(e);
}
}
diff --git a/smb/src/main/java/ch/cyberduck/core/smb/SMBTimestampFeature.java b/smb/src/main/java/ch/cyberduck/core/smb/SMBTimestampFeature.java
index f56f2a0e54d..146d108bebf 100644
--- a/smb/src/main/java/ch/cyberduck/core/smb/SMBTimestampFeature.java
+++ b/smb/src/main/java/ch/cyberduck/core/smb/SMBTimestampFeature.java
@@ -15,7 +15,6 @@
* GNU General Public License for more details.
*/
-import ch.cyberduck.core.DefaultIOExceptionMappingService;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.shared.DefaultTimestampFeature;
@@ -81,7 +80,7 @@ public void setTimestamp(final Path file, final TransferStatus status) throws Ba
}
}
catch(IOException e) {
- throw new DefaultIOExceptionMappingService().map("Cannot read container configuration", e);
+ throw new SMBTransportExceptionMappingService().map("Cannot read container configuration", e);
}
catch(SMBRuntimeException e) {
throw new SMBExceptionMappingService().map("Cannot change timestamp of {0}", e, file);
diff --git a/smb/src/main/java/ch/cyberduck/core/smb/SMBTransportExceptionMappingService.java b/smb/src/main/java/ch/cyberduck/core/smb/SMBTransportExceptionMappingService.java
new file mode 100644
index 00000000000..0be0681e686
--- /dev/null
+++ b/smb/src/main/java/ch/cyberduck/core/smb/SMBTransportExceptionMappingService.java
@@ -0,0 +1,43 @@
+package ch.cyberduck.core.smb;
+/*
+ * Copyright (c) 2002-2023 iterate GmbH. All rights reserved.
+ * https://cyberduck.io/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+import ch.cyberduck.core.AbstractExceptionMappingService;
+import ch.cyberduck.core.DefaultIOExceptionMappingService;
+import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
+
+import org.apache.commons.lang3.exception.ExceptionUtils;
+
+import java.io.IOException;
+
+import com.hierynomus.mssmb.SMB1NotSupportedException;
+import com.hierynomus.smbj.common.SMBRuntimeException;
+
+public class SMBTransportExceptionMappingService extends AbstractExceptionMappingService {
+
+ @Override
+ public BackgroundException map(final IOException failure) {
+ if(failure instanceof SMB1NotSupportedException) {
+ return new UnsupportedException(failure.getMessage(), failure);
+ }
+ for(Throwable cause : ExceptionUtils.getThrowableList(failure)) {
+ if(cause instanceof SMBRuntimeException) {
+ return new SMBExceptionMappingService().map((SMBRuntimeException) cause);
+ }
+ }
+ return new DefaultIOExceptionMappingService().map(failure);
+ }
+}
diff --git a/smb/src/test/java/ch/cyberduck/core/smb/SMBExceptionMappingServiceTest.java b/smb/src/test/java/ch/cyberduck/core/smb/SMBExceptionMappingServiceTest.java
new file mode 100644
index 00000000000..4d49d82b4da
--- /dev/null
+++ b/smb/src/test/java/ch/cyberduck/core/smb/SMBExceptionMappingServiceTest.java
@@ -0,0 +1,36 @@
+package ch.cyberduck.core.smb;
+
+/*
+ * Copyright (c) 2002-2023 iterate GmbH. All rights reserved.
+ * https://cyberduck.io/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+import org.junit.Test;
+
+import com.hierynomus.mssmb2.SMB2MessageCommandCode;
+import com.hierynomus.mssmb2.SMBApiException;
+import com.hierynomus.smbj.common.SMBRuntimeException;
+
+import static org.junit.Assert.assertEquals;
+
+public class SMBExceptionMappingServiceTest {
+
+ @Test
+ public void map() {
+ assertEquals("Interoperability failure", new SMBExceptionMappingService().map(new SMBRuntimeException("")).getMessage());
+ assertEquals("Please contact your web hosting service provider for assistance.", new SMBExceptionMappingService().map(new SMBRuntimeException("")).getDetail());
+ assertEquals("STATUS_OBJECT_NAME_NOT_FOUND (0xc0000034). Please contact your web hosting service provider for assistance.",
+ new SMBExceptionMappingService().map(new SMBApiException(3221225524L, SMB2MessageCommandCode.SMB2_CREATE,
+ "Create failed for \\\\localhost\\user\\Dk9I5nTZ", null)).getDetail());
+ }
+}
\ No newline at end of file
diff --git a/smb/src/test/java/ch/cyberduck/core/smb/SMBTransportExceptionMappingServiceTest.java b/smb/src/test/java/ch/cyberduck/core/smb/SMBTransportExceptionMappingServiceTest.java
new file mode 100644
index 00000000000..caee2457192
--- /dev/null
+++ b/smb/src/test/java/ch/cyberduck/core/smb/SMBTransportExceptionMappingServiceTest.java
@@ -0,0 +1,35 @@
+package ch.cyberduck.core.smb;
+
+/*
+ * Copyright (c) 2002-2023 iterate GmbH. All rights reserved.
+ * https://cyberduck.io/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+import org.junit.Test;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeoutException;
+
+import com.hierynomus.protocol.transport.TransportException;
+import com.hierynomus.smbj.common.SMBRuntimeException;
+
+import static org.junit.Assert.assertEquals;
+
+public class SMBTransportExceptionMappingServiceTest {
+
+ @Test
+ public void map() {
+ assertEquals("Connection failed", new SMBTransportExceptionMappingService().map(new TransportException(new ExecutionException(new SMBRuntimeException(new TimeoutException("Timeout expired"))))).getMessage());
+ assertEquals("Timeout expired. The connection attempt timed out. The server may be down, or your network may not be properly configured.", new SMBTransportExceptionMappingService().map(new TransportException(new ExecutionException(new SMBRuntimeException(new TimeoutException("Timeout expired"))))).getDetail());
+ }
+}
\ No newline at end of file
From 0739d5b54e15fef5e9536624ba59b656a92dd465 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Mon, 23 Oct 2023 09:12:42 +0200
Subject: [PATCH 051/230] Set minimum system requirement to 10.13+.
---
cli/osx/build.xml | 2 +-
core/dylib/build.xml | 2 +-
osx/build.xml | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/cli/osx/build.xml b/cli/osx/build.xml
index 432b52681e2..32aaf47613d 100644
--- a/cli/osx/build.xml
+++ b/cli/osx/build.xml
@@ -21,7 +21,7 @@
-
+
diff --git a/core/dylib/build.xml b/core/dylib/build.xml
index 6e56577aac0..485464a1fe9 100644
--- a/core/dylib/build.xml
+++ b/core/dylib/build.xml
@@ -24,7 +24,7 @@
-
+
diff --git a/osx/build.xml b/osx/build.xml
index e38a3f88fef..789ece6cdf1 100644
--- a/osx/build.xml
+++ b/osx/build.xml
@@ -29,7 +29,7 @@
-
+
From b421ee51631b0d8ec89b19c3423049d25092aa4c Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Thu, 19 Oct 2023 19:15:55 +0200
Subject: [PATCH 052/230] Allow to override authentication strategy in
subclasses.
---
.../java/ch/cyberduck/core/s3/S3Session.java | 92 +++++++++----------
1 file changed, 46 insertions(+), 46 deletions(-)
diff --git a/s3/src/main/java/ch/cyberduck/core/s3/S3Session.java b/s3/src/main/java/ch/cyberduck/core/s3/S3Session.java
index 147bafd9451..d0392861e8d 100644
--- a/s3/src/main/java/ch/cyberduck/core/s3/S3Session.java
+++ b/s3/src/main/java/ch/cyberduck/core/s3/S3Session.java
@@ -186,47 +186,7 @@ protected String getRestMetadataPrefix() {
@Override
protected RequestEntityRestStorageService connect(final Proxy proxy, final HostKeyCallback hostkey, final LoginCallback prompt, final CancelCallback cancel) throws BackgroundException {
final HttpClientBuilder configuration = builder.build(proxy, this, prompt);
- if(host.getProtocol().isOAuthConfigurable()) {
- final OAuth2RequestInterceptor oauth = new OAuth2RequestInterceptor(builder.build(ProxyFactory.get()
- .find(host.getProtocol().getOAuthAuthorizationUrl()), this, prompt).build(), host, prompt)
- .withRedirectUri(host.getProtocol().getOAuthRedirectUrl());
- if(host.getProtocol().getAuthorization() != null) {
- oauth.withFlowType(OAuth2AuthorizationService.FlowType.valueOf(host.getProtocol().getAuthorization()));
- }
- configuration.addInterceptorLast(oauth);
- final STSAssumeRoleCredentialsRequestInterceptor interceptor
- = new STSAssumeRoleCredentialsRequestInterceptor(oauth, this, trust, key, prompt);
- configuration.addInterceptorLast(interceptor);
- configuration.setServiceUnavailableRetryStrategy(new S3AuthenticationResponseInterceptor(this, interceptor));
- authentication = interceptor;
- }
- else {
- if(S3Session.isAwsHostname(host.getHostname())) {
- final S3AuthenticationResponseInterceptor interceptor;
- // Try auto-configure
- if(Scheme.isURL(host.getProtocol().getContext())) {
- // Fetch temporary session token from instance metadata
- interceptor = new S3AuthenticationResponseInterceptor(this,
- new AWSSessionCredentialsRetriever(trust, key, this, host.getProtocol().getContext())
- );
- }
- else {
- // Fetch temporary session token from AWS CLI configuration
- interceptor = new S3AuthenticationResponseInterceptor(this, new S3CredentialsStrategy() {
- @Override
- public Credentials get() throws LoginCanceledException {
- return new S3CredentialsConfigurator(
- new ThreadLocalHostnameDelegatingTrustManager(trust, host.getHostname()), key, prompt).reload().configure(host);
- }
- });
- }
- configuration.setServiceUnavailableRetryStrategy(interceptor);
- authentication = interceptor;
- }
- else {
- authentication = host::getCredentials;
- }
- }
+ authentication = this.configureCredentialsStrategy(configuration, prompt);
if(preferences.getBoolean("s3.upload.expect-continue")) {
final String header = HTTP.EXPECT_DIRECTIVE;
if(log.isDebugEnabled()) {
@@ -306,6 +266,51 @@ public void process(final HttpRequest request, final HttpContext context) {
return client;
}
+ protected S3CredentialsStrategy configureCredentialsStrategy(final HttpClientBuilder configuration,
+ final LoginCallback prompt) throws LoginCanceledException {
+ if(host.getProtocol().isOAuthConfigurable()) {
+ final OAuth2RequestInterceptor oauth = new OAuth2RequestInterceptor(builder.build(ProxyFactory.get()
+ .find(host.getProtocol().getOAuthAuthorizationUrl()), this, prompt).build(), host, prompt)
+ .withRedirectUri(host.getProtocol().getOAuthRedirectUrl());
+ if(host.getProtocol().getAuthorization() != null) {
+ oauth.withFlowType(OAuth2AuthorizationService.FlowType.valueOf(host.getProtocol().getAuthorization()));
+ }
+ configuration.addInterceptorLast(oauth);
+ final STSAssumeRoleCredentialsRequestInterceptor interceptor
+ = new STSAssumeRoleCredentialsRequestInterceptor(oauth, this, trust, key, prompt);
+ configuration.addInterceptorLast(interceptor);
+ configuration.setServiceUnavailableRetryStrategy(new S3AuthenticationResponseInterceptor(this, interceptor));
+ return interceptor;
+ }
+ else {
+ if(S3Session.isAwsHostname(host.getHostname())) {
+ final S3AuthenticationResponseInterceptor interceptor;
+ // Try auto-configure
+ if(Scheme.isURL(host.getProtocol().getContext())) {
+ // Fetch temporary session token from instance metadata
+ interceptor = new S3AuthenticationResponseInterceptor(this,
+ new AWSSessionCredentialsRetriever(trust, key, this, host.getProtocol().getContext())
+ );
+ }
+ else {
+ // Fetch temporary session token from AWS CLI configuration
+ interceptor = new S3AuthenticationResponseInterceptor(this, new S3CredentialsStrategy() {
+ @Override
+ public Credentials get() throws LoginCanceledException {
+ return new S3CredentialsConfigurator(
+ new ThreadLocalHostnameDelegatingTrustManager(trust, host.getHostname()), key, prompt).reload().configure(host);
+ }
+ });
+ }
+ configuration.setServiceUnavailableRetryStrategy(interceptor);
+ return interceptor;
+ }
+ else {
+ return host::getCredentials;
+ }
+ }
+ }
+
@Override
public void login(final Proxy proxy, final LoginCallback prompt, final CancelCallback cancel) throws BackgroundException {
final Credentials credentials = authentication.get();
@@ -423,11 +428,6 @@ public Path call() throws BackgroundException {
}).call();
}
- @Override
- public boolean isSupported(final Path workdir, final String name) {
- return proxy.isSupported(workdir, name);
- }
-
@Override
public Directory withWriter(final Write writer) {
return proxy.withWriter(writer);
From 9524c919e9b5205c0026ad37b079c63b106b74fc Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Fri, 20 Oct 2023 20:59:13 +0200
Subject: [PATCH 053/230] Add constructor with AWSSecurityTokenService.
---
.../sts/STSAssumeRoleCredentialsRequestInterceptor.java | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/s3/src/main/java/ch/cyberduck/core/sts/STSAssumeRoleCredentialsRequestInterceptor.java b/s3/src/main/java/ch/cyberduck/core/sts/STSAssumeRoleCredentialsRequestInterceptor.java
index 4883e3a124d..c1bbcdcb0b1 100644
--- a/s3/src/main/java/ch/cyberduck/core/sts/STSAssumeRoleCredentialsRequestInterceptor.java
+++ b/s3/src/main/java/ch/cyberduck/core/sts/STSAssumeRoleCredentialsRequestInterceptor.java
@@ -39,6 +39,7 @@
import java.io.IOException;
+import com.amazonaws.services.securitytoken.AWSSecurityTokenService;
import com.auth0.jwt.JWT;
import com.auth0.jwt.exceptions.JWTDecodeException;
@@ -68,6 +69,13 @@ public STSAssumeRoleCredentialsRequestInterceptor(final OAuth2RequestInterceptor
this.session = session;
}
+ public STSAssumeRoleCredentialsRequestInterceptor(final OAuth2RequestInterceptor oauth, final S3Session session,
+ final AWSSecurityTokenService service, final LoginCallback prompt) {
+ super(session.getHost(), service, prompt);
+ this.oauth = oauth;
+ this.session = session;
+ }
+
public TemporaryAccessTokens refresh(final OAuthTokens oidc) throws BackgroundException {
try {
return this.tokens = this.authorize(oidc);
From d98ac4a5795cc6df48494038a441d398e0b2743b Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Mon, 23 Oct 2023 10:35:05 +0200
Subject: [PATCH 054/230] Fix localization.
---
.../ch/cyberduck/ui/cocoa/controller/BookmarkController.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/osx/src/main/java/ch/cyberduck/ui/cocoa/controller/BookmarkController.java b/osx/src/main/java/ch/cyberduck/ui/cocoa/controller/BookmarkController.java
index ab1cece2560..696c82441f6 100644
--- a/osx/src/main/java/ch/cyberduck/ui/cocoa/controller/BookmarkController.java
+++ b/osx/src/main/java/ch/cyberduck/ui/cocoa/controller/BookmarkController.java
@@ -578,7 +578,7 @@ public void privateKeyPopupClicked(final NSPopUpButton sender) {
privateKeyOpenPanel.setCanChooseDirectories(false);
privateKeyOpenPanel.setCanChooseFiles(true);
privateKeyOpenPanel.setAllowsMultipleSelection(false);
- privateKeyOpenPanel.setMessage(LocaleFactory.localizedString("Select the private key in PEM or PuTTY format", "bookmark.getCredentials()"));
+ privateKeyOpenPanel.setMessage(LocaleFactory.localizedString("Select the private key in PEM or PuTTY format", "Credentials"));
privateKeyOpenPanel.setPrompt(LocaleFactory.localizedString("Choose"));
privateKeyOpenPanel.beginSheetForDirectory(LocalFactory.get(LocalFactory.get(), ".ssh").getAbsolute(), null, this.window(), this.id(),
Foundation.selector("privateKeyPanelDidEnd:returnCode:contextInfo:"), null);
From 82dac6bfa3917aa25a767da9beffeda826adc6fe Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Mon, 23 Oct 2023 10:35:21 +0200
Subject: [PATCH 055/230] Review.
---
.../ch/cyberduck/ui/cocoa/controller/BookmarkController.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/osx/src/main/java/ch/cyberduck/ui/cocoa/controller/BookmarkController.java b/osx/src/main/java/ch/cyberduck/ui/cocoa/controller/BookmarkController.java
index 696c82441f6..9d567f9b84f 100644
--- a/osx/src/main/java/ch/cyberduck/ui/cocoa/controller/BookmarkController.java
+++ b/osx/src/main/java/ch/cyberduck/ui/cocoa/controller/BookmarkController.java
@@ -580,7 +580,7 @@ public void privateKeyPopupClicked(final NSPopUpButton sender) {
privateKeyOpenPanel.setAllowsMultipleSelection(false);
privateKeyOpenPanel.setMessage(LocaleFactory.localizedString("Select the private key in PEM or PuTTY format", "Credentials"));
privateKeyOpenPanel.setPrompt(LocaleFactory.localizedString("Choose"));
- privateKeyOpenPanel.beginSheetForDirectory(LocalFactory.get(LocalFactory.get(), ".ssh").getAbsolute(), null, this.window(), this.id(),
+ privateKeyOpenPanel.beginSheetForDirectory(LocalFactory.get("~/.ssh").getAbsolute(), null, this.window(), this.id(),
Foundation.selector("privateKeyPanelDidEnd:returnCode:contextInfo:"), null);
}
else {
From 2d46b6c3fdc5b00b514b54a8a938d42a1cc9c663 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Mon, 23 Oct 2023 11:23:08 +0200
Subject: [PATCH 056/230] Fix #13682.
---
.../ui/cocoa/callback/PromptLoginCallback.java | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/osx/src/main/java/ch/cyberduck/ui/cocoa/callback/PromptLoginCallback.java b/osx/src/main/java/ch/cyberduck/ui/cocoa/callback/PromptLoginCallback.java
index 7b096dc0677..0fee2fdfeb5 100644
--- a/osx/src/main/java/ch/cyberduck/ui/cocoa/callback/PromptLoginCallback.java
+++ b/osx/src/main/java/ch/cyberduck/ui/cocoa/callback/PromptLoginCallback.java
@@ -110,7 +110,17 @@ public Credentials prompt(final Host bookmark, final String username,
}
public Local select(final Local identity) throws LoginCanceledException {
- final SheetInvoker sheet = new SheetInvoker(new DisabledSheetCallback(), parent, select) {
+ final SheetInvoker sheet = new SheetInvoker(new DisabledSheetCallback(), parent, new WindowController() {
+ @Override
+ protected String getBundleName() {
+ return null;
+ }
+
+ @Override
+ public NSWindow window() {
+ return select;
+ }
+ }) {
@Override
public void beginSheet(final NSWindow window) {
select = NSOpenPanel.openPanel();
From 79bb79d9ac7f35ef809b97964f0c7c06dcead610 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Mon, 23 Oct 2023 12:05:30 +0200
Subject: [PATCH 057/230] Fix possible null pointer.
---
.../cyberduck/core/preferences/UserDefaultsPreferences.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java b/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java
index de273489be8..879ffab8bed 100644
--- a/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java
+++ b/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java
@@ -262,9 +262,9 @@ public String locale() {
return super.locale();
}
if(value.isKindOfClass(NSArray.CLASS)) {
- final List languages = this.toList(Rococoa.cast(value, NSArray.class));
- if(null != languages) {
- return languages.iterator().next();
+ final Iterator languages = this.toList(Rococoa.cast(value, NSArray.class)).iterator();
+ if(languages.hasNext()) {
+ return languages.next();
}
}
return super.locale();
From aba72915ebf92873573914baf37b224aaa745107 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Mon, 23 Oct 2023 17:47:02 +0200
Subject: [PATCH 058/230] Add missing import.
---
.../ch/cyberduck/core/preferences/UserDefaultsPreferences.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java b/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java
index 879ffab8bed..9abab7cb3b9 100644
--- a/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java
+++ b/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java
@@ -39,6 +39,7 @@
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Iterator;
import java.util.List;
import com.sun.jna.platform.linux.LibC;
From bfd99eb549e575d18305d4caea1745269d5a1994 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 23 Oct 2023 16:19:14 +0000
Subject: [PATCH 059/230] Bump
io.swagger.codegen.v3:swagger-codegen-maven-plugin
Bumps io.swagger.codegen.v3:swagger-codegen-maven-plugin from 3.0.48 to 3.0.49.
---
updated-dependencies:
- dependency-name: io.swagger.codegen.v3:swagger-codegen-maven-plugin
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index aab285820e7..363c97c00b0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -679,7 +679,7 @@
io.swagger.codegen.v3
swagger-codegen-maven-plugin
- 3.0.48
+ 3.0.49
src/main/java
From ca30c5ae4dfcff3c82488ca11f3da01d03a4be03 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Mon, 23 Oct 2023 18:58:21 +0200
Subject: [PATCH 060/230] Do not access factory while instantiating
implementation.
---
.../ch/cyberduck/core/preferences/UserDefaultsPreferences.java | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java b/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java
index 9abab7cb3b9..6e0ab8dab83 100644
--- a/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java
+++ b/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java
@@ -55,8 +55,7 @@ public class UserDefaultsPreferences extends DefaultPreferences {
private final NSBundle bundle = new BundleApplicationResourcesFinder().bundle();
- private final LRUCache cache = LRUCache.usingLoader(this::loadProperty,
- PreferencesFactory.get().getLong("preferences.cache.size"));
+ private final LRUCache cache = LRUCache.usingLoader(this::loadProperty, 1000);
private static final String MISSING_PROPERTY = String.valueOf(StringUtils.INDEX_NOT_FOUND);
From b8283badcd08b89815de5f9f611a2b3295980e51 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Mon, 23 Oct 2023 18:59:17 +0200
Subject: [PATCH 061/230] Remove instance variable requiring access to `Local`
implementation while loading preferences.
---
.../cyberduck/core/preferences/UserDefaultsPreferences.java | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java b/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java
index 6e0ab8dab83..5dd5030f0b4 100644
--- a/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java
+++ b/core/dylib/src/main/java/ch/cyberduck/core/preferences/UserDefaultsPreferences.java
@@ -53,8 +53,6 @@
public class UserDefaultsPreferences extends DefaultPreferences {
private static final Logger log = LogManager.getLogger(UserDefaultsPreferences.class);
- private final NSBundle bundle = new BundleApplicationResourcesFinder().bundle();
-
private final LRUCache cache = LRUCache.usingLoader(this::loadProperty, 1000);
private static final String MISSING_PROPERTY = String.valueOf(StringUtils.INDEX_NOT_FOUND);
@@ -72,6 +70,7 @@ public String getDefault(final String property) {
// Lookup in the default map
final String value = super.getDefault(property);
if(null == value) {
+ final NSBundle bundle = new BundleApplicationResourcesFinder().bundle();
// Missing in default. Lookup in Info.plist
NSObject plist = bundle.infoDictionary().objectForKey(property);
if(null == plist) {
@@ -170,6 +169,7 @@ protected void setDefaults() {
this.setDefault("local.user.home", SystemB.INSTANCE.getpwuid(LibC.INSTANCE.getuid()).pw_dir);
}
+ final NSBundle bundle = new BundleApplicationResourcesFinder().bundle();
if(null != bundle) {
if(bundle.objectForInfoDictionaryKey("CFBundleName") != null) {
this.setDefault("application.name", bundle.objectForInfoDictionaryKey("CFBundleName").toString());
@@ -272,6 +272,7 @@ public String locale() {
@Override
public List applicationLocales() {
+ final NSBundle bundle = new BundleApplicationResourcesFinder().bundle();
return this.toList(bundle.localizations());
}
From 8c0ce95ac231ce49ac34017336deae5eac597d66 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Mon, 23 Oct 2023 19:01:18 +0200
Subject: [PATCH 062/230] Access defaults only after calling super.
---
.../core/preferences/ApplicationPreferences.java | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/core/dylib/src/main/java/ch/cyberduck/core/preferences/ApplicationPreferences.java b/core/dylib/src/main/java/ch/cyberduck/core/preferences/ApplicationPreferences.java
index 46d8d4898cc..db577ad9ad6 100644
--- a/core/dylib/src/main/java/ch/cyberduck/core/preferences/ApplicationPreferences.java
+++ b/core/dylib/src/main/java/ch/cyberduck/core/preferences/ApplicationPreferences.java
@@ -97,9 +97,6 @@ protected void setFactories() {
this.setDefault("factory.badgelabeler.class", WorkspaceApplicationBadgeLabeler.class.getName());
this.setDefault("factory.watchservice.class", FSEventWatchService.class.getName());
this.setDefault("factory.editorfactory.class", FSEventWatchEditorFactory.class.getName());
- if(null == this.getDefault("SUExpectsDSASignature")) {
- this.setDefault("factory.licensefactory.class", ReceiptFactory.class.getName());
- }
this.setDefault("factory.notification.class", NotificationCenter.class.getName());
this.setDefault("factory.iconservice.class", WorkspaceIconService.class.getName());
this.setDefault("factory.filedescriptor.class", LaunchServicesFileDescriptor.class.getName());
@@ -122,4 +119,12 @@ protected void setFactories() {
this.setDefault("factory.urlfilewriter.class", WeblocFileWriter.class.getName());
this.setDefault("factory.quicklook.class", QuartzQuickLook.class.getName());
}
+
+ @Override
+ protected void setDefaults() {
+ super.setDefaults();
+ if(null == this.getDefault("SUExpectsDSASignature")) {
+ this.setDefault("factory.licensefactory.class", ReceiptFactory.class.getName());
+ }
+ }
}
From b01ccf4c02ffba7c3457ef0efce7a0137b2f8c74 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Tue, 24 Oct 2023 07:35:44 +0200
Subject: [PATCH 063/230] Only trash bookmarks. Delete files from history and
sessions. Fix #15255.
This reverts commit f3480a82007ffe76d825f2c67bdb86b0c5ba4963.
---
.../core/AbstractFolderHostCollection.java | 16 +++++++++-------
.../ch/cyberduck/core/BookmarkCollection.java | 14 ++++++++++++++
2 files changed, 23 insertions(+), 7 deletions(-)
diff --git a/core/src/main/java/ch/cyberduck/core/AbstractFolderHostCollection.java b/core/src/main/java/ch/cyberduck/core/AbstractFolderHostCollection.java
index 2eb3308928d..057fc1aca5d 100644
--- a/core/src/main/java/ch/cyberduck/core/AbstractFolderHostCollection.java
+++ b/core/src/main/java/ch/cyberduck/core/AbstractFolderHostCollection.java
@@ -20,9 +20,9 @@
*/
import ch.cyberduck.core.exception.AccessDeniedException;
+import ch.cyberduck.core.exception.NotfoundException;
import ch.cyberduck.core.local.DefaultLocalDirectoryFeature;
import ch.cyberduck.core.local.FileWatcherListener;
-import ch.cyberduck.core.local.LocalTrashFactory;
import ch.cyberduck.core.serializer.Reader;
import ch.cyberduck.core.serializer.Writer;
@@ -148,13 +148,15 @@ public void collectionItemAdded(final Host bookmark) {
public void collectionItemRemoved(final Host bookmark) {
if(!this.isLocked()) {
final Local file = this.getFile(bookmark);
- try {
- LocalTrashFactory.get().trash(file);
- }
- catch(AccessDeniedException e) {
- log.warn(String.format("Failure removing bookmark %s", e.getMessage()));
+ if(file.exists()) {
+ try {
+ file.delete();
+ }
+ catch(AccessDeniedException | NotfoundException e) {
+ log.warn(String.format("Failure removing bookmark %s", e.getMessage()));
+ }
+ this.sort();
}
- this.sort();
}
// Notify listeners
super.collectionItemRemoved(bookmark);
diff --git a/core/src/main/java/ch/cyberduck/core/BookmarkCollection.java b/core/src/main/java/ch/cyberduck/core/BookmarkCollection.java
index 6fb22b22179..81c315be2c6 100644
--- a/core/src/main/java/ch/cyberduck/core/BookmarkCollection.java
+++ b/core/src/main/java/ch/cyberduck/core/BookmarkCollection.java
@@ -15,6 +15,8 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.exception.AccessDeniedException;
+import ch.cyberduck.core.local.LocalTrashFactory;
import ch.cyberduck.core.preferences.Preferences;
import ch.cyberduck.core.preferences.PreferencesFactory;
import ch.cyberduck.core.preferences.SupportDirectoryFinderFactory;
@@ -33,6 +35,18 @@ public class BookmarkCollection extends MonitorFolderHostCollection {
private static final BookmarkCollection FAVORITES_COLLECTION = new BookmarkCollection(
LocalFactory.get(SupportDirectoryFinderFactory.get().find(), "Bookmarks")
) {
+ @Override
+ public void collectionItemRemoved(final Host bookmark) {
+ final Local file = this.getFile(bookmark);
+ try {
+ LocalTrashFactory.get().trash(file);
+ }
+ catch(AccessDeniedException e) {
+ log.warn(String.format("Failure removing bookmark %s", e.getMessage()));
+ }
+ super.collectionItemRemoved(bookmark);
+ }
+
@Override
public void collectionItemAdded(final Host bookmark) {
bookmark.setWorkdir(null);
From d3dc81aa3a1c5f36ebe4007fabbf8c4ca43a29dd Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Tue, 24 Oct 2023 11:10:12 +0200
Subject: [PATCH 064/230] Delete unused property.
---
defaults/src/main/resources/default.properties | 1 -
1 file changed, 1 deletion(-)
diff --git a/defaults/src/main/resources/default.properties b/defaults/src/main/resources/default.properties
index 38772875f4d..9692efc5e28 100644
--- a/defaults/src/main/resources/default.properties
+++ b/defaults/src/main/resources/default.properties
@@ -73,7 +73,6 @@ profiles.discovery.updater.url=s3://profiles.cyberduck.io
browser.cache.size=1000
transfer.cache.size=100
icon.cache.size=200
-preferences.cache.size=1000
fileid.cache.size=10000
# Caching NS* proxy instances.
From bcd8e856f42f997200c880458af843c90cfe8bda Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Tue, 24 Oct 2023 12:26:00 +0200
Subject: [PATCH 065/230] Logging for no-op usage.
---
core/src/main/java/ch/cyberduck/core/Local.java | 3 +++
1 file changed, 3 insertions(+)
diff --git a/core/src/main/java/ch/cyberduck/core/Local.java b/core/src/main/java/ch/cyberduck/core/Local.java
index 5b78d78e749..510de4a378d 100644
--- a/core/src/main/java/ch/cyberduck/core/Local.java
+++ b/core/src/main/java/ch/cyberduck/core/Local.java
@@ -478,6 +478,9 @@ private static FileChannel getWriteChannel(final String path, final boolean appe
}
public Object lock(final boolean interactive) throws AccessDeniedException {
+ if(log.isWarnEnabled()) {
+ log.warn(String.format("No lock support in %s", this));
+ }
return null;
}
From 003259103158749c7d60f054ac1b0fdc81809864 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Tue, 24 Oct 2023 15:25:01 +0200
Subject: [PATCH 066/230] Fix #15257.
---
.../java/ch/cyberduck/core/s3/S3CredentialsConfigurator.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/s3/src/main/java/ch/cyberduck/core/s3/S3CredentialsConfigurator.java b/s3/src/main/java/ch/cyberduck/core/s3/S3CredentialsConfigurator.java
index 2a7f35b8af8..45a088f2b34 100644
--- a/s3/src/main/java/ch/cyberduck/core/s3/S3CredentialsConfigurator.java
+++ b/s3/src/main/java/ch/cyberduck/core/s3/S3CredentialsConfigurator.java
@@ -238,7 +238,8 @@ else if(!profiles.containsKey(basicProfile.getRoleSourceProfile())) {
return credentials;
}
return credentials.withTokens(new TemporaryAccessTokens(
- cached.accessKey, cached.secretKey, cached.sessionToken, Long.valueOf(cached.expiration)));
+ cached.accessKey, cached.secretKey, cached.sessionToken,
+ Instant.parse(cached.expiration).toEpochMilli()));
}
if(tokenCode != null) {
// Obtain session token
From b745f347e4782a178513c7e32b52e68b288a90f3 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Tue, 24 Oct 2023 15:50:29 +0200
Subject: [PATCH 067/230] Logging.
---
core/src/main/java/ch/cyberduck/core/LocalFactory.java | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/core/src/main/java/ch/cyberduck/core/LocalFactory.java b/core/src/main/java/ch/cyberduck/core/LocalFactory.java
index dc1e7b69640..e4e7abd1c2b 100644
--- a/core/src/main/java/ch/cyberduck/core/LocalFactory.java
+++ b/core/src/main/java/ch/cyberduck/core/LocalFactory.java
@@ -21,11 +21,14 @@
import ch.cyberduck.core.preferences.PreferencesFactory;
import org.apache.commons.lang3.reflect.ConstructorUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public final class LocalFactory extends Factory {
+ private static final Logger log = LogManager.getLogger(LocalFactory.class);
private Constructor extends Local> constructorCreateFromString;
private Constructor extends Local> constructorCreateFromParentString;
@@ -43,6 +46,9 @@ private Local create(final String path) {
try {
if(null == constructorCreateFromString) {
constructorCreateFromString = ConstructorUtils.getMatchingAccessibleConstructor(clazz, String.class);
+ if(log.isWarnEnabled()) {
+ log.warn(String.format("Caching constructor %s for class %s", constructorCreateFromString, clazz));
+ }
}
return constructorCreateFromString.newInstance(path);
}
@@ -55,6 +61,9 @@ private Local create(final Local parent, final String path) {
try {
if(null == constructorCreateFromParentString) {
constructorCreateFromParentString = ConstructorUtils.getMatchingAccessibleConstructor(clazz, parent.getClass(), path.getClass());
+ if(log.isWarnEnabled()) {
+ log.warn(String.format("Caching constructor %s for class %s", constructorCreateFromParentString, clazz));
+ }
}
return constructorCreateFromParentString.newInstance(parent, path);
}
From f13b113ba33de89389d7778c3a76da19403e5f8f Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Tue, 24 Oct 2023 15:52:49 +0200
Subject: [PATCH 068/230] Logging.
---
.../main/java/ch/cyberduck/core/LocalFactory.java | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/core/src/main/java/ch/cyberduck/core/LocalFactory.java b/core/src/main/java/ch/cyberduck/core/LocalFactory.java
index e4e7abd1c2b..0ce25cb1f3e 100644
--- a/core/src/main/java/ch/cyberduck/core/LocalFactory.java
+++ b/core/src/main/java/ch/cyberduck/core/LocalFactory.java
@@ -77,6 +77,10 @@ private Local create(final Local parent, final String path) {
public static synchronized Local get(final Local parent, final String name) {
if(null == singleton) {
singleton = new LocalFactory();
+ if(log.isDebugEnabled()) {
+ log.debug(String.format("Using implementation %s", singleton.getClass()));
+ }
+
}
return singleton.create(parent, name);
}
@@ -84,6 +88,9 @@ public static synchronized Local get(final Local parent, final String name) {
public static synchronized Local get(final String parent, final String name) {
if(null == singleton) {
singleton = new LocalFactory();
+ if(log.isDebugEnabled()) {
+ log.debug(String.format("Using implementation %s", singleton.getClass()));
+ }
}
return singleton.create(singleton.create(parent), name);
}
@@ -91,6 +98,9 @@ public static synchronized Local get(final String parent, final String name) {
public static synchronized Local get(final String path) {
if(null == singleton) {
singleton = new LocalFactory();
+ if(log.isDebugEnabled()) {
+ log.debug(String.format("Using implementation %s", singleton.getClass()));
+ }
}
return singleton.create(path);
}
@@ -98,6 +108,9 @@ public static synchronized Local get(final String path) {
public static synchronized Local get() {
if(null == singleton) {
singleton = new LocalFactory();
+ if(log.isDebugEnabled()) {
+ log.debug(String.format("Using implementation %s", singleton.getClass()));
+ }
}
return singleton.create();
}
From db85bd72755600e55bee4a8a9886d51d0a7d7f6d Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Tue, 24 Oct 2023 16:06:58 +0200
Subject: [PATCH 069/230] Make sure no default implementation is registered.
---
.../main/java/ch/cyberduck/cli/TerminalPreferences.java | 2 ++
.../ch/cyberduck/core/preferences/MemoryPreferences.java | 9 +++++++++
.../java/ch/cyberduck/core/preferences/Preferences.java | 1 -
.../cyberduck/core/preferences/PreferencesFactory.java | 3 +++
4 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/cli/src/main/java/ch/cyberduck/cli/TerminalPreferences.java b/cli/src/main/java/ch/cyberduck/cli/TerminalPreferences.java
index c47dcc463eb..8f5db6e96a2 100644
--- a/cli/src/main/java/ch/cyberduck/cli/TerminalPreferences.java
+++ b/cli/src/main/java/ch/cyberduck/cli/TerminalPreferences.java
@@ -15,6 +15,7 @@
package ch.cyberduck.cli;
import ch.cyberduck.core.DisabledConnectionTimeout;
+import ch.cyberduck.core.Local;
import ch.cyberduck.core.Permission;
import ch.cyberduck.core.cryptomator.CryptoVault;
import ch.cyberduck.core.cryptomator.random.FastSecureRandomProvider;
@@ -46,6 +47,7 @@ public TerminalPreferences(final Preferences persistence) {
protected void setFactories() {
super.setFactories();
+ this.setDefault("factory.local.class", Local.class.getName());
this.setDefault("factory.certificatestore.class", TerminalCertificateStore.class.getName());
this.setDefault("factory.logincallback.class", TerminalLoginCallback.class.getName());
this.setDefault("factory.passwordcallback.class", TerminalPasswordCallback.class.getName());
diff --git a/core/src/main/java/ch/cyberduck/core/preferences/MemoryPreferences.java b/core/src/main/java/ch/cyberduck/core/preferences/MemoryPreferences.java
index f292d4373c2..9e37d957b79 100644
--- a/core/src/main/java/ch/cyberduck/core/preferences/MemoryPreferences.java
+++ b/core/src/main/java/ch/cyberduck/core/preferences/MemoryPreferences.java
@@ -14,6 +14,8 @@
package ch.cyberduck.core.preferences;
+import ch.cyberduck.core.Local;
+
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -60,4 +62,11 @@ public List applicationLocales() {
public List systemLocales() {
return Collections.singletonList("en");
}
+
+ @Override
+ protected void setFactories() {
+ super.setFactories();
+
+ this.setDefault("factory.local.class", Local.class.getName());
+ }
}
diff --git a/core/src/main/java/ch/cyberduck/core/preferences/Preferences.java b/core/src/main/java/ch/cyberduck/core/preferences/Preferences.java
index 79cc46d1c42..25ae285ccf8 100755
--- a/core/src/main/java/ch/cyberduck/core/preferences/Preferences.java
+++ b/core/src/main/java/ch/cyberduck/core/preferences/Preferences.java
@@ -499,7 +499,6 @@ protected void setFactories() {
this.setDefault("factory.writer.host.class", PlistWriter.class.getName());
this.setDefault("factory.locale.class", DisabledLocale.class.getName());
- this.setDefault("factory.local.class", Local.class.getName());
this.setDefault("factory.certificatestore.class", DisabledCertificateStore.class.getName());
this.setDefault("factory.logincallback.class", DisabledLoginCallback.class.getName());
this.setDefault("factory.passwordcallback.class", DisabledPasswordCallback.class.getName());
diff --git a/core/src/main/java/ch/cyberduck/core/preferences/PreferencesFactory.java b/core/src/main/java/ch/cyberduck/core/preferences/PreferencesFactory.java
index 86dc0f50487..b47cfda041a 100644
--- a/core/src/main/java/ch/cyberduck/core/preferences/PreferencesFactory.java
+++ b/core/src/main/java/ch/cyberduck/core/preferences/PreferencesFactory.java
@@ -24,6 +24,8 @@
import org.apache.logging.log4j.Logger;
public final class PreferencesFactory {
+ private static final Logger log = LogManager.getLogger(PreferencesFactory.class);
+
private PreferencesFactory() {
//
}
@@ -46,6 +48,7 @@ public static synchronized void set(final Preferences p) {
public static synchronized Preferences get() {
if(null == preferences) {
+ log.error("No application preferences registered");
set(new MemoryPreferences());
}
return preferences;
From 9584886a09c0fcebc893885f6539b20d450a4c89 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Tue, 24 Oct 2023 17:07:50 +0200
Subject: [PATCH 070/230] Add test for SSO configuration.
---
.../core/s3/S3CredentialsConfiguratorTest.java | 11 +++++++++++
.../f9eb64cf0dc746e9fe1398f73dcae2d212b24f5a.json | 9 +++++++++
s3/src/test/resources/valid/.aws/config | 6 ++++++
3 files changed, 26 insertions(+)
create mode 100644 s3/src/test/resources/valid/.aws/cli/cache/f9eb64cf0dc746e9fe1398f73dcae2d212b24f5a.json
create mode 100644 s3/src/test/resources/valid/.aws/config
diff --git a/s3/src/test/java/ch/cyberduck/core/s3/S3CredentialsConfiguratorTest.java b/s3/src/test/java/ch/cyberduck/core/s3/S3CredentialsConfiguratorTest.java
index 75e1b5ba60a..7c0039f7e87 100644
--- a/s3/src/test/java/ch/cyberduck/core/s3/S3CredentialsConfiguratorTest.java
+++ b/s3/src/test/java/ch/cyberduck/core/s3/S3CredentialsConfiguratorTest.java
@@ -56,4 +56,15 @@ public void readSuccessForValidAWSCredentialsProfileEntry() throws Exception {
assertEquals("EXAMPLESECRETKEY", verify.getTokens().getSecretAccessKey());
assertEquals("EXAMPLETOKEN", verify.getTokens().getSessionToken());
}
+
+ @Test
+ public void readSSOCachedTemporaryTokens() throws Exception {
+ final Credentials verify = new S3CredentialsConfigurator(LocalFactory.get(new File("src/test/resources/valid/.aws").getAbsolutePath())
+ , new DisabledX509TrustManager(), new DefaultX509KeyManager(), new DisabledPasswordCallback())
+ .reload().configure(new Host(new TestProtocol(), StringUtils.EMPTY, new Credentials("ReadOnlyAccess-189584543480")));
+ assertEquals("TESTACCESSKEY", verify.getTokens().getAccessKeyId());
+ assertEquals("TESTSECRETKEY", verify.getTokens().getSecretAccessKey());
+ assertEquals("TESTSESSIONTOKEN", verify.getTokens().getSessionToken());
+ assertEquals(3497005724000L, verify.getTokens().getExpiryInMilliseconds(), 0L);
+ }
}
diff --git a/s3/src/test/resources/valid/.aws/cli/cache/f9eb64cf0dc746e9fe1398f73dcae2d212b24f5a.json b/s3/src/test/resources/valid/.aws/cli/cache/f9eb64cf0dc746e9fe1398f73dcae2d212b24f5a.json
new file mode 100644
index 00000000000..a0b20bc7355
--- /dev/null
+++ b/s3/src/test/resources/valid/.aws/cli/cache/f9eb64cf0dc746e9fe1398f73dcae2d212b24f5a.json
@@ -0,0 +1,9 @@
+{
+ "ProviderType": "sso",
+ "Credentials": {
+ "AccessKeyId": "TESTACCESSKEY",
+ "SecretAccessKey": "TESTSECRETKEY",
+ "SessionToken": "TESTSESSIONTOKEN",
+ "Expiration": "2080-10-24T14:28:44Z"
+ }
+}
\ No newline at end of file
diff --git a/s3/src/test/resources/valid/.aws/config b/s3/src/test/resources/valid/.aws/config
new file mode 100644
index 00000000000..b83232a626a
--- /dev/null
+++ b/s3/src/test/resources/valid/.aws/config
@@ -0,0 +1,6 @@
+[profile ReadOnlyAccess-189584543480]
+sso_start_url = https://d-90679a6e6a.awsapps.com/start
+sso_region = us-east-1
+sso_account_id = 189584543480
+sso_role_name = ReadOnlyAccess
+region = eu-west-1
From 3a742f39d0dfc40bd78f9442ebcc7c90fe716f8e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 24 Oct 2023 16:57:24 +0000
Subject: [PATCH 071/230] Bump log4j-version from 2.21.0 to 2.21.1
Bumps `log4j-version` from 2.21.0 to 2.21.1.
Updates `org.apache.logging.log4j:log4j-api` from 2.21.0 to 2.21.1
Updates `org.apache.logging.log4j:log4j-core` from 2.21.0 to 2.21.1
Updates `org.apache.logging.log4j:log4j-slf4j-impl` from 2.21.0 to 2.21.1
---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-api
dependency-type: direct:production
update-type: version-update:semver-patch
- dependency-name: org.apache.logging.log4j:log4j-core
dependency-type: direct:production
update-type: version-update:semver-patch
- dependency-name: org.apache.logging.log4j:log4j-slf4j-impl
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 363c97c00b0..f9ade321e61 100644
--- a/pom.xml
+++ b/pom.xml
@@ -83,7 +83,7 @@
2.38
2.14.2
1.7.36
- 2.21.0
+ 2.21.1
1.76
4.5.14
1.42.3
From 921cf62896fa4dca9d6908f604c5afc0a7afea57 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 24 Oct 2023 16:58:03 +0000
Subject: [PATCH 072/230] Bump org.apache.maven.plugins:maven-failsafe-plugin
from 3.1.2 to 3.2.1
Bumps [org.apache.maven.plugins:maven-failsafe-plugin](https://github.com/apache/maven-surefire) from 3.1.2 to 3.2.1.
- [Release notes](https://github.com/apache/maven-surefire/releases)
- [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.1.2...surefire-3.2.1)
---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-failsafe-plugin
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 363c97c00b0..5d428a44cde 100644
--- a/pom.xml
+++ b/pom.xml
@@ -554,7 +554,7 @@
org.apache.maven.plugins
maven-failsafe-plugin
- 3.1.2
+ 3.2.1
${project.build.directory}/surefire-reports
UTF-8
@@ -577,7 +577,7 @@
org.apache.maven.surefire
surefire-junit47
- 3.1.2
+ 3.2.1
From d2771b9843d2d33794f87f74b0e05aaeb8e8b298 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 24 Oct 2023 16:58:22 +0000
Subject: [PATCH 073/230] Bump org.apache.maven.surefire:surefire-junit47 from
3.1.2 to 3.2.1
Bumps org.apache.maven.surefire:surefire-junit47 from 3.1.2 to 3.2.1.
---
updated-dependencies:
- dependency-name: org.apache.maven.surefire:surefire-junit47
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 363c97c00b0..318ab7f8554 100644
--- a/pom.xml
+++ b/pom.xml
@@ -547,7 +547,7 @@
org.apache.maven.surefire
surefire-junit47
- 3.1.2
+ 3.2.1
@@ -577,7 +577,7 @@
org.apache.maven.surefire
surefire-junit47
- 3.1.2
+ 3.2.1
From a90e9480f3d8e48ac8ecda941ee4f61dc9bcbea4 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 24 Oct 2023 16:59:43 +0000
Subject: [PATCH 074/230] Bump org.apache.maven.plugins:maven-dependency-plugin
Bumps [org.apache.maven.plugins:maven-dependency-plugin](https://github.com/apache/maven-dependency-plugin) from 3.6.0 to 3.6.1.
- [Commits](https://github.com/apache/maven-dependency-plugin/compare/maven-dependency-plugin-3.6.0...maven-dependency-plugin-3.6.1)
---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-dependency-plugin
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 363c97c00b0..540f8dbd46f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -589,7 +589,7 @@
org.apache.maven.plugins
maven-dependency-plugin
- 3.6.0
+ 3.6.1
copy-dependencies-dylib-target
From 1243db9a0eb3872fa65d5035ceeb911d877a332e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 24 Oct 2023 16:59:48 +0000
Subject: [PATCH 075/230] Bump org.apache.maven.plugins:maven-surefire-plugin
from 3.1.2 to 3.2.1
Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.1.2 to 3.2.1.
- [Release notes](https://github.com/apache/maven-surefire/releases)
- [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.1.2...surefire-3.2.1)
---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-surefire-plugin
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 363c97c00b0..bf88a74dce6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -526,7 +526,7 @@
org.apache.maven.plugins
maven-surefire-plugin
- 3.1.2
+ 3.2.1
@{argLine} --add-opens=java.base/sun.security.ssl=ALL-UNNAMED
--add-opens=java.base/sun.security.util=ALL-UNNAMED
@@ -547,7 +547,7 @@
org.apache.maven.surefire
surefire-junit47
- 3.1.2
+ 3.2.1
From e746cc9ff9436e456839e557cda8228881bca303 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Mon, 23 Oct 2023 20:55:38 +0200
Subject: [PATCH 076/230] Revert "Fix #15183."
This reverts commit d823292c4f13b2972875cdb37f86b2b1fbf5a4fb.
---
.../cyberduck/core/sftp/auth/SFTPPublicKeyAuthentication.java | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/ssh/src/main/java/ch/cyberduck/core/sftp/auth/SFTPPublicKeyAuthentication.java b/ssh/src/main/java/ch/cyberduck/core/sftp/auth/SFTPPublicKeyAuthentication.java
index 5eb45d8a745..e8307a75f7f 100644
--- a/ssh/src/main/java/ch/cyberduck/core/sftp/auth/SFTPPublicKeyAuthentication.java
+++ b/ssh/src/main/java/ch/cyberduck/core/sftp/auth/SFTPPublicKeyAuthentication.java
@@ -32,7 +32,6 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
@@ -91,7 +90,7 @@ public Boolean authenticate(final Host bookmark, final LoginCallback prompt, fin
default:
throw new InteroperabilityException(String.format("Unknown key format for file %s", identity.getName()));
}
- provider.init(new File(identity.getAbsolute()), new PasswordFinder() {
+ provider.init(new InputStreamReader(identity.getInputStream(), StandardCharsets.UTF_8), new PasswordFinder() {
@Override
public char[] reqPassword(Resource> resource) {
if(StringUtils.isEmpty(credentials.getIdentityPassphrase())) {
From 44fa7ed5d3e953c21f35a4afc43973475fc8b7e4 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 25 Oct 2023 16:40:40 +0000
Subject: [PATCH 077/230] Bump io.swagger.core.v3:swagger-annotations from
2.2.17 to 2.2.18
Bumps io.swagger.core.v3:swagger-annotations from 2.2.17 to 2.2.18.
---
updated-dependencies:
- dependency-name: io.swagger.core.v3:swagger-annotations
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 52f84547c0e..a0fa634f43c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -314,7 +314,7 @@
io.swagger.core.v3
swagger-annotations
- 2.2.17
+ 2.2.18
org.glassfish.jersey.core
From 1dbbce0c9a66fb4266b42eba6b91e42eb0bf4fb5 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Mon, 23 Oct 2023 17:39:12 +0200
Subject: [PATCH 078/230] Refactor as protocol features.
---
.../cyberduck/core/brick/BrickProtocol.java | 8 ++---
.../ch/cyberduck/core/AbstractProtocol.java | 24 ++++++---------
.../core/CredentialsConfigurator.java | 3 ++
.../core/CredentialsConfiguratorFactory.java | 2 +-
.../cyberduck/core/HostnameConfigurator.java | 4 +++
.../core/HostnameConfiguratorFactory.java | 2 +-
.../core/JumpHostConfiguratorFactory.java | 2 +-
.../cyberduck/core/JumphostConfigurator.java | 3 ++
.../cyberduck/core/KeychainLoginService.java | 2 +-
.../main/java/ch/cyberduck/core/Profile.java | 15 ----------
.../main/java/ch/cyberduck/core/Protocol.java | 15 ----------
.../core/nextcloud/NextcloudProtocol.java | 8 ++---
.../core/owncloud/OwncloudProtocol.java | 8 ++---
.../java/ch/cyberduck/core/s3/S3Protocol.java | 8 ++---
.../ch/cyberduck/core/sftp/SFTPProtocol.java | 29 +++++++++----------
.../ch/cyberduck/core/dav/DAVProtocol.java | 13 +++++----
.../ch/cyberduck/core/dav/DAVSSLProtocol.java | 13 +++++----
17 files changed, 65 insertions(+), 94 deletions(-)
diff --git a/brick/src/main/java/ch/cyberduck/core/brick/BrickProtocol.java b/brick/src/main/java/ch/cyberduck/core/brick/BrickProtocol.java
index 8c52ece3e4e..2e3b5f1d0f6 100644
--- a/brick/src/main/java/ch/cyberduck/core/brick/BrickProtocol.java
+++ b/brick/src/main/java/ch/cyberduck/core/brick/BrickProtocol.java
@@ -44,11 +44,6 @@ public Scheme getScheme() {
return Scheme.https;
}
- @Override
- public CredentialsConfigurator getCredentialsFinder() {
- return new BrickCredentialsConfigurator();
- }
-
@Override
public DirectoryTimestamp getDirectoryTimestamp() {
return DirectoryTimestamp.implicit;
@@ -76,6 +71,9 @@ public T getFeature(final Class type) {
if(type == Pairing.class) {
return (T) new BrickPairingFeature();
}
+ if(type == CredentialsConfigurator.class) {
+ return (T) new BrickCredentialsConfigurator();
+ }
return super.getFeature(type);
}
}
diff --git a/core/src/main/java/ch/cyberduck/core/AbstractProtocol.java b/core/src/main/java/ch/cyberduck/core/AbstractProtocol.java
index efd880df45f..12811763751 100644
--- a/core/src/main/java/ch/cyberduck/core/AbstractProtocol.java
+++ b/core/src/main/java/ch/cyberduck/core/AbstractProtocol.java
@@ -365,21 +365,6 @@ public int hashCode() {
return result;
}
- @Override
- public CredentialsConfigurator getCredentialsFinder() {
- return CredentialsConfigurator.DISABLED;
- }
-
- @Override
- public HostnameConfigurator getHostnameFinder() {
- return HostnameConfigurator.DISABLED;
- }
-
- @Override
- public JumphostConfigurator getJumpHostFinder() {
- return JumphostConfigurator.DISABLED;
- }
-
@Override
public Case getCaseSensitivity() {
return Protocol.Case.sensitive;
@@ -422,6 +407,15 @@ public T getFeature(final Class type) {
if(type == ComparisonService.class) {
return (T) new DefaultComparisonService(this);
}
+ if(type == HostnameConfigurator.class) {
+ return (T) HostnameConfigurator.DISABLED;
+ }
+ if(type == CredentialsConfigurator.class) {
+ return (T) CredentialsConfigurator.DISABLED;
+ }
+ if(type == JumphostConfigurator.class) {
+ return (T) JumphostConfigurator.DISABLED;
+ }
return null;
}
}
diff --git a/core/src/main/java/ch/cyberduck/core/CredentialsConfigurator.java b/core/src/main/java/ch/cyberduck/core/CredentialsConfigurator.java
index 9f47a84faf0..a3ab2d8baef 100644
--- a/core/src/main/java/ch/cyberduck/core/CredentialsConfigurator.java
+++ b/core/src/main/java/ch/cyberduck/core/CredentialsConfigurator.java
@@ -20,6 +20,9 @@
import ch.cyberduck.core.exception.LoginCanceledException;
+/**
+ * Configurator for resolving credentials for bookmark
+ */
public interface CredentialsConfigurator {
/**
diff --git a/core/src/main/java/ch/cyberduck/core/CredentialsConfiguratorFactory.java b/core/src/main/java/ch/cyberduck/core/CredentialsConfiguratorFactory.java
index 5dfd7f0873b..8a422c4f214 100644
--- a/core/src/main/java/ch/cyberduck/core/CredentialsConfiguratorFactory.java
+++ b/core/src/main/java/ch/cyberduck/core/CredentialsConfiguratorFactory.java
@@ -35,7 +35,7 @@ private CredentialsConfiguratorFactory() {
* @return Configurator for default settings
*/
public static CredentialsConfigurator get(final Protocol protocol) {
- final CredentialsConfigurator finder = protocol.getCredentialsFinder();
+ final CredentialsConfigurator finder = protocol.getFeature(CredentialsConfigurator.class);
try {
return finder.reload();
}
diff --git a/core/src/main/java/ch/cyberduck/core/HostnameConfigurator.java b/core/src/main/java/ch/cyberduck/core/HostnameConfigurator.java
index b9b7cba8633..2d49eb1fdf2 100644
--- a/core/src/main/java/ch/cyberduck/core/HostnameConfigurator.java
+++ b/core/src/main/java/ch/cyberduck/core/HostnameConfigurator.java
@@ -18,6 +18,10 @@
* dkocher@cyberduck.ch
*/
+
+/**
+ * Configurator for resolving hostname from alias
+ */
public interface HostnameConfigurator {
/**
diff --git a/core/src/main/java/ch/cyberduck/core/HostnameConfiguratorFactory.java b/core/src/main/java/ch/cyberduck/core/HostnameConfiguratorFactory.java
index 6f3e3083436..885ced6bc23 100644
--- a/core/src/main/java/ch/cyberduck/core/HostnameConfiguratorFactory.java
+++ b/core/src/main/java/ch/cyberduck/core/HostnameConfiguratorFactory.java
@@ -29,6 +29,6 @@ private HostnameConfiguratorFactory() {
* @return Configurator for default settings
*/
public static HostnameConfigurator get(final Protocol protocol) {
- return protocol.getHostnameFinder().reload();
+ return protocol.getFeature(HostnameConfigurator.class).reload();
}
}
diff --git a/core/src/main/java/ch/cyberduck/core/JumpHostConfiguratorFactory.java b/core/src/main/java/ch/cyberduck/core/JumpHostConfiguratorFactory.java
index 80e6802c0df..231e0dcfcc0 100644
--- a/core/src/main/java/ch/cyberduck/core/JumpHostConfiguratorFactory.java
+++ b/core/src/main/java/ch/cyberduck/core/JumpHostConfiguratorFactory.java
@@ -32,7 +32,7 @@ private JumpHostConfiguratorFactory() {
*/
public static JumphostConfigurator get(final Protocol protocol) {
try {
- return protocol.getJumpHostFinder().reload();
+ return protocol.getFeature(JumphostConfigurator.class).reload();
}
catch(LoginCanceledException e) {
return JumphostConfigurator.DISABLED;
diff --git a/core/src/main/java/ch/cyberduck/core/JumphostConfigurator.java b/core/src/main/java/ch/cyberduck/core/JumphostConfigurator.java
index afc3a1aeb1a..fe93b779da8 100644
--- a/core/src/main/java/ch/cyberduck/core/JumphostConfigurator.java
+++ b/core/src/main/java/ch/cyberduck/core/JumphostConfigurator.java
@@ -20,6 +20,9 @@
import ch.cyberduck.core.exception.LoginCanceledException;
+/**
+ * Configurator for resolving jump host configuration for bookmark
+ */
public interface JumphostConfigurator {
Host getJumphost(String alias);
diff --git a/core/src/main/java/ch/cyberduck/core/KeychainLoginService.java b/core/src/main/java/ch/cyberduck/core/KeychainLoginService.java
index 0d0f7856dd6..4721198a5bb 100644
--- a/core/src/main/java/ch/cyberduck/core/KeychainLoginService.java
+++ b/core/src/main/java/ch/cyberduck/core/KeychainLoginService.java
@@ -107,7 +107,7 @@ public void validate(final Host bookmark, final LoginCallback prompt, final Logi
}
}
if(!credentials.validate(bookmark.getProtocol(), options)) {
- final CredentialsConfigurator configurator = bookmark.getProtocol().getCredentialsFinder();
+ final CredentialsConfigurator configurator = bookmark.getProtocol().getFeature(CredentialsConfigurator.class);
if(log.isDebugEnabled()) {
log.debug(String.format("Auto configure credentials with %s", configurator));
}
diff --git a/core/src/main/java/ch/cyberduck/core/Profile.java b/core/src/main/java/ch/cyberduck/core/Profile.java
index b65aa17ef9c..33b8ad90a49 100644
--- a/core/src/main/java/ch/cyberduck/core/Profile.java
+++ b/core/src/main/java/ch/cyberduck/core/Profile.java
@@ -325,21 +325,6 @@ public boolean validate(Credentials credentials, LoginOptions options) {
return parent.validate(credentials, options);
}
- @Override
- public CredentialsConfigurator getCredentialsFinder() {
- return parent.getCredentialsFinder();
- }
-
- @Override
- public HostnameConfigurator getHostnameFinder() {
- return parent.getHostnameFinder();
- }
-
- @Override
- public JumphostConfigurator getJumpHostFinder() {
- return parent.getJumpHostFinder();
- }
-
@Override
public Case getCaseSensitivity() {
return parent.getCaseSensitivity();
diff --git a/core/src/main/java/ch/cyberduck/core/Protocol.java b/core/src/main/java/ch/cyberduck/core/Protocol.java
index b12ef5bf54a..11466fbc822 100644
--- a/core/src/main/java/ch/cyberduck/core/Protocol.java
+++ b/core/src/main/java/ch/cyberduck/core/Protocol.java
@@ -36,21 +36,6 @@ public interface Protocol extends Comparable, Serializable {
*/
boolean validate(Credentials credentials, LoginOptions options);
- /**
- * @return Configurator for resolving credentials for bookmark
- */
- CredentialsConfigurator getCredentialsFinder();
-
- /**
- * @return Configurator for resolving hostname from alias
- */
- HostnameConfigurator getHostnameFinder();
-
- /**
- * @return Configurator for resolving jump host configuration for bookmark
- */
- JumphostConfigurator getJumpHostFinder();
-
/**
* @return Case sensitivity of system
*/
diff --git a/nextcloud/src/main/java/ch/cyberduck/core/nextcloud/NextcloudProtocol.java b/nextcloud/src/main/java/ch/cyberduck/core/nextcloud/NextcloudProtocol.java
index 8c12a86a962..4e0b128be1f 100644
--- a/nextcloud/src/main/java/ch/cyberduck/core/nextcloud/NextcloudProtocol.java
+++ b/nextcloud/src/main/java/ch/cyberduck/core/nextcloud/NextcloudProtocol.java
@@ -56,11 +56,6 @@ public String icon() {
return new DAVSSLProtocol().icon();
}
- @Override
- public CredentialsConfigurator getCredentialsFinder() {
- return new WindowsIntegratedCredentialsConfigurator();
- }
-
@Override
public DirectoryTimestamp getDirectoryTimestamp() {
return DirectoryTimestamp.implicit;
@@ -76,6 +71,9 @@ public T getFeature(final Class type) {
if(type == ComparisonService.class) {
return (T) new DefaultComparisonService(new ETagComparisonService(), new ETagComparisonService());
}
+ if(type == CredentialsConfigurator.class) {
+ return (T) new WindowsIntegratedCredentialsConfigurator();
+ }
return super.getFeature(type);
}
}
diff --git a/owncloud/src/main/java/ch/cyberduck/core/owncloud/OwncloudProtocol.java b/owncloud/src/main/java/ch/cyberduck/core/owncloud/OwncloudProtocol.java
index cb122006203..cca09802d83 100644
--- a/owncloud/src/main/java/ch/cyberduck/core/owncloud/OwncloudProtocol.java
+++ b/owncloud/src/main/java/ch/cyberduck/core/owncloud/OwncloudProtocol.java
@@ -56,11 +56,6 @@ public String icon() {
return new DAVSSLProtocol().icon();
}
- @Override
- public CredentialsConfigurator getCredentialsFinder() {
- return new WindowsIntegratedCredentialsConfigurator();
- }
-
@Override
public DirectoryTimestamp getDirectoryTimestamp() {
return DirectoryTimestamp.implicit;
@@ -76,6 +71,9 @@ public T getFeature(final Class type) {
if(type == ComparisonService.class) {
return (T) new DefaultComparisonService(new ETagComparisonService(), new ETagComparisonService());
}
+ if(type == CredentialsConfigurator.class) {
+ return (T) new WindowsIntegratedCredentialsConfigurator();
+ }
return super.getFeature(type);
}
}
diff --git a/s3/src/main/java/ch/cyberduck/core/s3/S3Protocol.java b/s3/src/main/java/ch/cyberduck/core/s3/S3Protocol.java
index 86562f9347a..aa3a524e3f7 100644
--- a/s3/src/main/java/ch/cyberduck/core/s3/S3Protocol.java
+++ b/s3/src/main/java/ch/cyberduck/core/s3/S3Protocol.java
@@ -157,11 +157,6 @@ public static AuthenticationHeaderSignatureVersion getDefault(final Protocol pro
public abstract HashAlgorithm getHashAlgorithm();
}
- @Override
- public CredentialsConfigurator getCredentialsFinder() {
- return credentials;
- }
-
@Override
public DirectoryTimestamp getDirectoryTimestamp() {
return DirectoryTimestamp.explicit;
@@ -181,6 +176,9 @@ public T getFeature(final Class type) {
if(type == ComparisonService.class) {
return (T) new DefaultComparisonService(new ETagComparisonService(), ComparisonService.disabled);
}
+ if(type == CredentialsConfigurator.class) {
+ return (T) credentials;
+ }
return super.getFeature(type);
}
}
diff --git a/ssh/src/main/java/ch/cyberduck/core/sftp/SFTPProtocol.java b/ssh/src/main/java/ch/cyberduck/core/sftp/SFTPProtocol.java
index b6b43e9ab90..fc8ae455ff7 100644
--- a/ssh/src/main/java/ch/cyberduck/core/sftp/SFTPProtocol.java
+++ b/ssh/src/main/java/ch/cyberduck/core/sftp/SFTPProtocol.java
@@ -75,21 +75,6 @@ public boolean isEncodingConfigurable() {
return true;
}
- @Override
- public CredentialsConfigurator getCredentialsFinder() {
- return credentials;
- }
-
- @Override
- public HostnameConfigurator getHostnameFinder() {
- return hostnmame;
- }
-
- @Override
- public JumphostConfigurator getJumpHostFinder() {
- return jumphost;
- }
-
@Override
public DirectoryTimestamp getDirectoryTimestamp() {
return DirectoryTimestamp.implicit;
@@ -99,4 +84,18 @@ public DirectoryTimestamp getDirectoryTimestamp() {
public VersioningMode getVersioningMode() {
return VersioningMode.custom;
}
+
+ @Override
+ public T getFeature(final Class type) {
+ if(type == HostnameConfigurator.class) {
+ return (T) hostnmame;
+ }
+ if(type == CredentialsConfigurator.class) {
+ return (T) credentials;
+ }
+ if(type == JumphostConfigurator.class) {
+ return (T) jumphost;
+ }
+ return super.getFeature(type);
+ }
}
diff --git a/webdav/src/main/java/ch/cyberduck/core/dav/DAVProtocol.java b/webdav/src/main/java/ch/cyberduck/core/dav/DAVProtocol.java
index 8ff66dd9669..601981bdfee 100644
--- a/webdav/src/main/java/ch/cyberduck/core/dav/DAVProtocol.java
+++ b/webdav/src/main/java/ch/cyberduck/core/dav/DAVProtocol.java
@@ -63,11 +63,6 @@ public boolean isAnonymousConfigurable() {
return true;
}
- @Override
- public CredentialsConfigurator getCredentialsFinder() {
- return new WindowsIntegratedCredentialsConfigurator();
- }
-
@Override
public DirectoryTimestamp getDirectoryTimestamp() {
return DirectoryTimestamp.implicit;
@@ -77,4 +72,12 @@ public DirectoryTimestamp getDirectoryTimestamp() {
public VersioningMode getVersioningMode() {
return VersioningMode.custom;
}
+
+ @Override
+ public T getFeature(final Class type) {
+ if(type == CredentialsConfigurator.class) {
+ return (T) new WindowsIntegratedCredentialsConfigurator();
+ }
+ return super.getFeature(type);
+ }
}
diff --git a/webdav/src/main/java/ch/cyberduck/core/dav/DAVSSLProtocol.java b/webdav/src/main/java/ch/cyberduck/core/dav/DAVSSLProtocol.java
index a28fec5c482..3e026a918bb 100644
--- a/webdav/src/main/java/ch/cyberduck/core/dav/DAVSSLProtocol.java
+++ b/webdav/src/main/java/ch/cyberduck/core/dav/DAVSSLProtocol.java
@@ -75,11 +75,6 @@ public boolean isAnonymousConfigurable() {
return true;
}
- @Override
- public CredentialsConfigurator getCredentialsFinder() {
- return new WindowsIntegratedCredentialsConfigurator();
- }
-
@Override
public DirectoryTimestamp getDirectoryTimestamp() {
return DirectoryTimestamp.implicit;
@@ -89,4 +84,12 @@ public DirectoryTimestamp getDirectoryTimestamp() {
public VersioningMode getVersioningMode() {
return VersioningMode.custom;
}
+
+ @Override
+ public T getFeature(final Class type) {
+ if(type == CredentialsConfigurator.class) {
+ return (T) new WindowsIntegratedCredentialsConfigurator();
+ }
+ return super.getFeature(type);
+ }
}
From 8f195c1fca47d0ba12eeefade8fb2a6e7bb547a6 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Thu, 26 Oct 2023 11:16:01 +0200
Subject: [PATCH 079/230] Resolve hostname but not alias from OpenSSH
configuration.
---
.../ch/cyberduck/core/diagnostics/ResolverReachability.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/core/src/main/java/ch/cyberduck/core/diagnostics/ResolverReachability.java b/core/src/main/java/ch/cyberduck/core/diagnostics/ResolverReachability.java
index a2ff3941b25..b6e59fc954f 100644
--- a/core/src/main/java/ch/cyberduck/core/diagnostics/ResolverReachability.java
+++ b/core/src/main/java/ch/cyberduck/core/diagnostics/ResolverReachability.java
@@ -16,6 +16,7 @@
*/
import ch.cyberduck.core.Host;
+import ch.cyberduck.core.HostnameConfigurator;
import ch.cyberduck.core.Resolver;
import ch.cyberduck.core.exception.ResolveCanceledException;
import ch.cyberduck.core.exception.ResolveFailedException;
@@ -28,7 +29,8 @@ public class ResolverReachability extends DisabledReachability {
@Override
public boolean isReachable(final Host bookmark) {
try {
- resolver.resolve(bookmark.getHostname(), CancelCallback.noop);
+ final HostnameConfigurator configurator = bookmark.getProtocol().getFeature(HostnameConfigurator.class);
+ resolver.resolve(configurator.getHostname(bookmark.getHostname()), CancelCallback.noop);
return true;
}
catch(ResolveFailedException | ResolveCanceledException e) {
From f9d40988d2ff9b23869c6116e4c97e2284070fa5 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 26 Oct 2023 16:22:48 +0000
Subject: [PATCH 080/230] Bump io.swagger:swagger-codegen-maven-plugin from
2.4.34 to 2.4.36
Bumps io.swagger:swagger-codegen-maven-plugin from 2.4.34 to 2.4.36.
---
updated-dependencies:
- dependency-name: io.swagger:swagger-codegen-maven-plugin
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index a0fa634f43c..cc409f8d6be 100644
--- a/pom.xml
+++ b/pom.xml
@@ -674,7 +674,7 @@
io.swagger
swagger-codegen-maven-plugin
- 2.4.34
+ 2.4.36
io.swagger.codegen.v3
From 267b85b9f1b18d90953d22bf3647aeb59274371b Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 26 Oct 2023 16:24:21 +0000
Subject: [PATCH 081/230] Bump
io.swagger.codegen.v3:swagger-codegen-maven-plugin
Bumps io.swagger.codegen.v3:swagger-codegen-maven-plugin from 3.0.49 to 3.0.50.
---
updated-dependencies:
- dependency-name: io.swagger.codegen.v3:swagger-codegen-maven-plugin
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index a0fa634f43c..976c4728d9b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -679,7 +679,7 @@
io.swagger.codegen.v3
swagger-codegen-maven-plugin
- 3.0.49
+ 3.0.50
src/main/java
From c1b02cae83ce482e5dd411718e736eba75de3269 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 26 Oct 2023 16:24:24 +0000
Subject: [PATCH 082/230] Bump commons-io:commons-io from 2.14.0 to 2.15.0
Bumps commons-io:commons-io from 2.14.0 to 2.15.0.
---
updated-dependencies:
- dependency-name: commons-io:commons-io
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index a0fa634f43c..b8ba38c3ae0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -184,7 +184,7 @@
commons-io
commons-io
- 2.14.0
+ 2.15.0
commons-collections
From f4c9e5cdf5d959d436f235e7cec8d37ee643ace5 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 27 Oct 2023 06:58:28 +0000
Subject: [PATCH 083/230] Bump org.apache.maven.plugins:maven-clean-plugin from
3.3.1 to 3.3.2
Bumps [org.apache.maven.plugins:maven-clean-plugin](https://github.com/apache/maven-clean-plugin) from 3.3.1 to 3.3.2.
- [Release notes](https://github.com/apache/maven-clean-plugin/releases)
- [Commits](https://github.com/apache/maven-clean-plugin/compare/maven-clean-plugin-3.3.1...maven-clean-plugin-3.3.2)
---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-clean-plugin
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index cc409f8d6be..e966498fc48 100644
--- a/pom.xml
+++ b/pom.xml
@@ -584,7 +584,7 @@
org.apache.maven.plugins
maven-clean-plugin
- 3.3.1
+ 3.3.2
org.apache.maven.plugins
From 1308bc9de429160641d64bcc178dcea3a4f31e4e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 27 Oct 2023 06:59:13 +0000
Subject: [PATCH 084/230] Bump commons-cli:commons-cli from 1.5.0 to 1.6.0
Bumps commons-cli:commons-cli from 1.5.0 to 1.6.0.
---
updated-dependencies:
- dependency-name: commons-cli:commons-cli
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
cli/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cli/pom.xml b/cli/pom.xml
index 633b2b2e2a9..22817066a88 100644
--- a/cli/pom.xml
+++ b/cli/pom.xml
@@ -75,7 +75,7 @@
commons-cli
commons-cli
- 1.5.0
+ 1.6.0
org.fusesource.jansi
From c1375c44ee05616973a7a0fa079c69281e4bfb80 Mon Sep 17 00:00:00 2001
From: Jenkins CI
Date: Fri, 27 Oct 2023 09:58:27 +0200
Subject: [PATCH 085/230] Pull localization changes from Transifex
---
.../main/resources/ru.lproj/Profiles.strings | Bin 1210 -> 1214 bytes
.../resources/ru.lproj/Profiles.strings.1 | Bin 1382 -> 1388 bytes
i18n/src/main/resources/ru.lproj/Profiles.xib | 2 +-
3 files changed, 1 insertion(+), 1 deletion(-)
diff --git a/i18n/src/main/resources/ru.lproj/Profiles.strings b/i18n/src/main/resources/ru.lproj/Profiles.strings
index 8a551962b919176d5d0cbe5399845fab93a16644..a70f82555d5b1d3222bc0426999477c56e404f3b 100644
GIT binary patch
delta 22
acmdnRxsP*$12dz~WP9eHV6u^kiva*rv<653
delta 18
YcmdnTxr=jy1M_4j<{v=Zz{JG>06(k+vH$=8
diff --git a/i18n/src/main/resources/ru.lproj/Profiles.strings.1 b/i18n/src/main/resources/ru.lproj/Profiles.strings.1
index 8ae94f2c8d6571401d1740dc64b01c40d6a83c1a..b333c678dbe4c288e9357a565105f602ab4af01f 100644
GIT binary patch
delta 33
gcmaFH^@eN13noUN$q!j-C#NuLKv^6tx4^7c0OZvS>Hq)$
delta 33
lcmaFE^^9x73#Q2vm}@4dF>7p|z#PU1;&3Q2STk?|ApqQq3I6~9
diff --git a/i18n/src/main/resources/ru.lproj/Profiles.xib b/i18n/src/main/resources/ru.lproj/Profiles.xib
index ed77655c95c..66aaf25622e 100644
--- a/i18n/src/main/resources/ru.lproj/Profiles.xib
+++ b/i18n/src/main/resources/ru.lproj/Profiles.xib
@@ -91,7 +91,7 @@
-
+
From b6ee91cc2ba226ea1497d4de4028efa587a87dda Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Fri, 27 Oct 2023 10:05:22 +0200
Subject: [PATCH 086/230] Fix #15281.
---
.../ch/cyberduck/core/CredentialManagerPasswordStore.cs | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/core/src/main/csharp/ch/cyberduck/core/CredentialManagerPasswordStore.cs b/core/src/main/csharp/ch/cyberduck/core/CredentialManagerPasswordStore.cs
index 6e3a8e39653..b744b65fc66 100644
--- a/core/src/main/csharp/ch/cyberduck/core/CredentialManagerPasswordStore.cs
+++ b/core/src/main/csharp/ch/cyberduck/core/CredentialManagerPasswordStore.cs
@@ -124,12 +124,13 @@ public override OAuthTokens findOAuthTokens(Host bookmark)
&& attrs.TryGetValue("OAuth Access Token", out var accessToken))
{
attrs.TryGetValue("OAuth Refresh Token", out var refreshToken);
+ attrs.TryGetValue("OIDC Id Token", out var idToken);
long expiry = default;
if (attrs.TryGetValue("OAuth Expiry", out var expiryValue))
{
long.TryParse(expiryValue, out expiry);
}
- return new(accessToken, refreshToken, new(expiry));
+ return new(accessToken, refreshToken, new(expiry), idToken);
}
return base.findOAuthTokens(bookmark);
@@ -192,6 +193,7 @@ public override void save(Host bookmark)
{
winCred.Attributes["OAuth Access Token"] = credential.getOauth().getAccessToken();
winCred.Attributes["OAuth Refresh Token"] = credential.getOauth().getRefreshToken();
+ winCred.Attributes["OIDC Id Token"] = credential.getOauth().getIdToken();
if (credential.getOauth().getExpiryInMilliseconds() != null)
{
winCred.Attributes["OAuth Expiry"] = credential.getOauth().getExpiryInMilliseconds().longValue().ToString();
From 2169887ebc6772feb29f5821939e36cd571f4dcd Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Fri, 27 Oct 2023 10:28:46 +0200
Subject: [PATCH 087/230] Handle username not set.
---
.../ch/cyberduck/core/CredentialManagerPasswordStore.cs | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/core/src/main/csharp/ch/cyberduck/core/CredentialManagerPasswordStore.cs b/core/src/main/csharp/ch/cyberduck/core/CredentialManagerPasswordStore.cs
index b744b65fc66..10c8327c536 100644
--- a/core/src/main/csharp/ch/cyberduck/core/CredentialManagerPasswordStore.cs
+++ b/core/src/main/csharp/ch/cyberduck/core/CredentialManagerPasswordStore.cs
@@ -227,7 +227,10 @@ private static Uri ToUri(Host bookmark)
}
}
targetBuilder.Path = pathBuilder.ToString();
- targetBuilder.Query = "user=" + credentials.getUsername();
+ if (!string.IsNullOrWhiteSpace(credentials.getUsername()))
+ {
+ targetBuilder.Query = "user=" + credentials.getUsername();
+ }
return targetBuilder.Uri;
}
From 5199ab35d3e71ecabeb37965aa1092e4b6bf30c7 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Fri, 27 Oct 2023 10:54:30 +0200
Subject: [PATCH 088/230] Fix checks to save additional attributes depending on
credentials.
---
.../ch/cyberduck/core/CredentialManagerPasswordStore.cs | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/core/src/main/csharp/ch/cyberduck/core/CredentialManagerPasswordStore.cs b/core/src/main/csharp/ch/cyberduck/core/CredentialManagerPasswordStore.cs
index 10c8327c536..f6da6922965 100644
--- a/core/src/main/csharp/ch/cyberduck/core/CredentialManagerPasswordStore.cs
+++ b/core/src/main/csharp/ch/cyberduck/core/CredentialManagerPasswordStore.cs
@@ -173,7 +173,6 @@ public override void save(Host bookmark)
logger.info(string.Format("Add password for bookmark {0}", bookmark));
}
var target = ToUri(bookmark);
- var protocol = bookmark.getProtocol();
var credential = bookmark.getCredentials();
var winCred = new WindowsCredentialManagerCredential(
@@ -185,11 +184,11 @@ public override void save(Host bookmark)
{
logger.warn(string.Format("No password in credentials for bookmark {0}", bookmark.getHostname()));
}
- if (protocol.isTokenConfigurable())
+ if (credential.isTokenAuthentication())
{
winCred.Attributes["Token"] = credential.getToken();
}
- if (protocol.isOAuthConfigurable())
+ if (credential.isOAuthAuthentication())
{
winCred.Attributes["OAuth Access Token"] = credential.getOauth().getAccessToken();
winCred.Attributes["OAuth Refresh Token"] = credential.getOauth().getRefreshToken();
@@ -199,7 +198,7 @@ public override void save(Host bookmark)
winCred.Attributes["OAuth Expiry"] = credential.getOauth().getExpiryInMilliseconds().longValue().ToString();
}
}
- if (protocol.isPrivateKeyConfigurable())
+ if (credential.isPublicKeyAuthentication())
{
winCred.Attributes["Private Key Passphrase"] = credential.getIdentityPassphrase();
}
From cfffae9ec8164979e7ddfbc7d2a6a775786a2e00 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Sat, 28 Oct 2023 14:59:30 +0200
Subject: [PATCH 089/230] Do not log access key or identity but only username
if set.
---
.../cyberduck/core/KeychainLoginService.java | 18 ++----------------
1 file changed, 2 insertions(+), 16 deletions(-)
diff --git a/core/src/main/java/ch/cyberduck/core/KeychainLoginService.java b/core/src/main/java/ch/cyberduck/core/KeychainLoginService.java
index 0d0f7856dd6..d8e367c6ac3 100644
--- a/core/src/main/java/ch/cyberduck/core/KeychainLoginService.java
+++ b/core/src/main/java/ch/cyberduck/core/KeychainLoginService.java
@@ -173,22 +173,8 @@ public boolean authenticate(final Proxy proxy, final Session session, final Prog
final LoginCallback prompt, final CancelCallback cancel) throws BackgroundException {
final Host bookmark = session.getHost();
final Credentials credentials = bookmark.getCredentials();
- if(credentials.isPasswordAuthentication()) {
- listener.message(MessageFormat.format(LocaleFactory.localizedString("Authenticating as {0}", "Status"),
- credentials.getUsername()));
- }
- else if(credentials.isOAuthAuthentication()) {
- listener.message(MessageFormat.format(LocaleFactory.localizedString("Authenticating as {0}", "Status"),
- credentials.getOauth().getAccessToken()));
- }
- else if(credentials.isPublicKeyAuthentication()) {
- listener.message(MessageFormat.format(LocaleFactory.localizedString("Authenticating as {0}", "Status"),
- credentials.getIdentity().getName()));
- }
- else if(credentials.isCertificateAuthentication()) {
- listener.message(MessageFormat.format(LocaleFactory.localizedString("Authenticating as {0}", "Status"),
- credentials.getCertificate()));
- }
+ listener.message(MessageFormat.format(LocaleFactory.localizedString("Authenticating as {0}", "Status"),
+ StringUtils.isNotBlank(credentials.getUsername()) ? credentials.getUsername() : LocaleFactory.localizedString("Unknown")));
try {
if(log.isDebugEnabled()) {
log.debug(String.format("Attempt authentication for %s", session));
From 876bff477c8fa11c725491cdbb47f1c67206dff5 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Sat, 28 Oct 2023 15:38:10 +0200
Subject: [PATCH 090/230] Logging.
---
core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java b/core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java
index 110338bdb98..0702ab78cd7 100644
--- a/core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java
+++ b/core/src/main/java/ch/cyberduck/core/worker/MoveWorker.java
@@ -158,9 +158,6 @@ public void delete(final Path file) {
}
session.getFeature(Directory.class).mkdir(directory, new TransferStatus());
}
- if(log.isDebugEnabled()) {
- log.debug(String.format("Move previous version %s to %s", version, target));
- }
if(version.isDirectory()) {
if(!session.getFeature(Move.class).isRecursive(version, target)) {
if(log.isWarnEnabled()) {
@@ -169,6 +166,9 @@ public void delete(final Path file) {
continue;
}
}
+ if(log.isDebugEnabled()) {
+ log.debug(String.format("Move previous version %s to %s", version, target));
+ }
feature.move(version, target, new TransferStatus()
.withLockId(this.getLockId(version))
.withMime(new MappingMimeTypeService().getMime(version.getName()))
From e9ff217a654357906af50d061fb655d5721e9c7f Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Sat, 28 Oct 2023 15:50:58 +0200
Subject: [PATCH 091/230] Logging.
---
.../core/shared/DefaultVersioningFeature.java | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/core/src/main/java/ch/cyberduck/core/shared/DefaultVersioningFeature.java b/core/src/main/java/ch/cyberduck/core/shared/DefaultVersioningFeature.java
index a9e41ee3581..e8ec5cc5088 100644
--- a/core/src/main/java/ch/cyberduck/core/shared/DefaultVersioningFeature.java
+++ b/core/src/main/java/ch/cyberduck/core/shared/DefaultVersioningFeature.java
@@ -99,8 +99,15 @@ public boolean save(final Path file) throws BackgroundException {
final Path version = new Path(provider.provide(file), formatter.toVersion(file.getName()), file.getType());
final Move feature = session.getFeature(Move.class);
if(!feature.isSupported(file, version)) {
+ log.warn(String.format("Skip saving version for %s", file));
return false;
}
+ if(file.isDirectory()) {
+ if(!feature.isRecursive(file, version)) {
+ log.warn(String.format("Skip saving version for directory %s", file));
+ return false;
+ }
+ }
final Path directory = version.getParent();
if(!session.getFeature(Find.class).find(directory)) {
if(log.isDebugEnabled()) {
@@ -111,11 +118,6 @@ public boolean save(final Path file) throws BackgroundException {
if(log.isDebugEnabled()) {
log.debug(String.format("Rename existing file %s to %s", file, version));
}
- if(file.isDirectory()) {
- if(!feature.isRecursive(file, version)) {
- return false;
- }
- }
feature.move(file, version,
new TransferStatus().exists(false), new Delete.DisabledCallback(), new DisabledConnectionCallback());
return true;
From 84245af8e0fc6927b8e56300a977e2ae63cbb456 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Sat, 28 Oct 2023 15:55:08 +0200
Subject: [PATCH 092/230] Reformat.
---
defaults/src/main/resources/default.properties | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/defaults/src/main/resources/default.properties b/defaults/src/main/resources/default.properties
index 091d4eeb100..26ca8d60c9a 100644
--- a/defaults/src/main/resources/default.properties
+++ b/defaults/src/main/resources/default.properties
@@ -180,7 +180,6 @@ queue.upload.file.temporary=false
# Format string for temporary filename. Default to filename-uuid
queue.upload.file.temporary.format={0}-{1}
queue.upload.file.rename.format={0} ({1}){2}
-versioning.enable=false
queue.download.file.rename.format={0} ({1}){2}
queue.download.permissions.change=true
@@ -724,6 +723,7 @@ info.s3.enable=true
info.metadata.enable=true
info.versions.enable=true
+versioning.enable=false
versioning.include.regex=.*
# Only keep most recent versions
versioning.limit=5
From 3d6ee74204d998f3673cb55d8b6a5ce7812f1906 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Sat, 28 Oct 2023 21:38:15 +0200
Subject: [PATCH 093/230] Do not apply versioning to files.
---
.../transfer/upload/AbstractUploadFilter.java | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/core/src/main/java/ch/cyberduck/core/transfer/upload/AbstractUploadFilter.java b/core/src/main/java/ch/cyberduck/core/transfer/upload/AbstractUploadFilter.java
index 6b694bb1568..79bfe39d4e6 100644
--- a/core/src/main/java/ch/cyberduck/core/transfer/upload/AbstractUploadFilter.java
+++ b/core/src/main/java/ch/cyberduck/core/transfer/upload/AbstractUploadFilter.java
@@ -306,15 +306,17 @@ public TransferStatus prepare(final Path file, final Local local, final Transfer
@Override
public void apply(final Path file, final Local local, final TransferStatus status,
final ProgressListener listener) throws BackgroundException {
- if(status.isExists() && !status.isAppend()) {
- if(options.versioning) {
- final Versioning feature = session.getFeature(Versioning.class);
- if(feature != null && feature.getConfiguration(file).isEnabled()) {
- if(feature.save(file)) {
- if(log.isDebugEnabled()) {
- log.debug(String.format("Clear exist flag for file %s", file));
+ if(file.isFile()) {
+ if(status.isExists() && !status.isAppend()) {
+ if(options.versioning) {
+ final Versioning feature = session.getFeature(Versioning.class);
+ if(feature != null && feature.getConfiguration(file).isEnabled()) {
+ if(feature.save(file)) {
+ if(log.isDebugEnabled()) {
+ log.debug(String.format("Clear exist flag for file %s", file));
+ }
+ status.exists(false).getDisplayname().exists(false);
}
- status.exists(false).getDisplayname().exists(false);
}
}
}
From 0b2f7fc79b0251c1cb79eac90ab32b16c05980aa Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Sat, 28 Oct 2023 21:45:37 +0200
Subject: [PATCH 094/230] Changes.
---
Changelog.txt | 6 ++++++
www/update/changelog.html | 24 +++++++++++++++++++++++-
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/Changelog.txt b/Changelog.txt
index 9865de1a65a..d2474e5dc2a 100644
--- a/Changelog.txt
+++ b/Changelog.txt
@@ -1,6 +1,12 @@
Cyberduck
https://cyberduck.io/
+8.7.1
+- [Bugfix] Crash when selecting private key outside of ~/.ssh (macOS, Mac App Store)
+- [Bugfix] Application scoped bookmark to access file outside of sandbox not saved (macOS, Mac App Store) (#15250)
+- [Bugfix] Failure parsing expiration from cached temporary credentials in AWS CLI configuration from AWS SSO (S3) (#15257)
+- [Bugfix] Unable to authenticate with S3 (Credentials from AWS Command Line Interface) connection profile (S3) (#15222)
+
8.7.0
- [Feature] SMB (Server Message Block) protocol support (#5368)
- [Feature] Support to login using temporary credentials from Security Token Service (STS API) using OpenID Connect (OIDC) web identity (S3) (#13804)
diff --git a/www/update/changelog.html b/www/update/changelog.html
index 07db08af59e..771692566d0 100755
--- a/www/update/changelog.html
+++ b/www/update/changelog.html
@@ -83,6 +83,27 @@
Follow us on Mastodon.
+
+ Version 8.7.1
+
+
+ Bugfix Crash when selecting private key outside of ~/.ssh (macOS, Mac
+ App Store)
+
+ Bugfix Application scoped bookmark to access file outside of sandbox
+ not saved (macOS, Mac App Store) (#15250 )
+
+ Bugfix Failure parsing expiration from cached temporary credentials in
+ AWS CLI configuration from AWS SSO (S3) (#15257 )
+
+ Bugfix Unable to authenticate with S3 (Credentials from AWS Command
+ Line Interface) connection profile (S3) (#15222 )
+
+
+
Version 8.7.0
@@ -90,7 +111,8 @@
Feature SMB (Server Message Block) protocol support (#5368 )
- Feature Support to login using temporary credentials from Security Token
+ Feature Support to login using temporary credentials from Security
+ Token
Service (STS API) using OpenID Connect (OIDC) web identity (S3) (#13804 )
From 47f4fd2ddeada618d8e0c3361252c2b06286fa25 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Tue, 17 Oct 2023 09:22:09 +0200
Subject: [PATCH 095/230] Make validation static.
---
.../main/java/ch/cyberduck/core/sds/SDSDirectoryFeature.java | 2 +-
.../src/main/java/ch/cyberduck/core/sds/SDSMoveFeature.java | 2 +-
.../src/main/java/ch/cyberduck/core/sds/SDSTouchFeature.java | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDirectoryFeature.java b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDirectoryFeature.java
index 8fbb8fc772f..fc3754c2930 100644
--- a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDirectoryFeature.java
+++ b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDirectoryFeature.java
@@ -108,7 +108,7 @@ public boolean isSupported(final Path workdir, final String name) {
return false;
}
}
- if(!new SDSTouchFeature(session, nodeid).validate(name)) {
+ if(!SDSTouchFeature.validate(name)) {
log.warn(String.format("Validation failed for target name %s", name));
return false;
}
diff --git a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSMoveFeature.java b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSMoveFeature.java
index 41556151150..23dfddf8901 100644
--- a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSMoveFeature.java
+++ b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSMoveFeature.java
@@ -127,7 +127,7 @@ public boolean isSupported(final Path source, final Path target) {
log.warn(String.format("Deny moving file %s to root", source));
return false;
}
- if(!new SDSTouchFeature(session, nodeid).validate(target.getName())) {
+ if(!SDSTouchFeature.validate(target.getName())) {
log.warn(String.format("Validation failed for target name %s", target));
return false;
}
diff --git a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSTouchFeature.java b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSTouchFeature.java
index 5d8489d16ab..0e9f882ae91 100644
--- a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSTouchFeature.java
+++ b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSTouchFeature.java
@@ -58,7 +58,7 @@ public boolean isSupported(final Path workdir, final String filename) {
if(workdir.isRoot()) {
return false;
}
- if(!this.validate(filename)) {
+ if(!validate(filename)) {
log.warn(String.format("Validation failed for target name %s", filename));
return false;
}
@@ -77,7 +77,7 @@ public boolean isSupported(final Path workdir, final String filename) {
/**
* Validate node name convention
*/
- public boolean validate(final String filename) {
+ public static boolean validate(final String filename) {
// Empty argument if not known in validation
if(StringUtils.isNotBlank(filename)) {
if(StringUtils.length(filename) > 150) {
From 1b2158d8b6f33852cb85b75000c7f0b214d1ba4a Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Tue, 17 Oct 2023 12:57:31 +0200
Subject: [PATCH 096/230] Review mapping of ACLs to permission mask.
---
.../core/sds/SDSAttributesAdapter.java | 56 +++++++++++--------
.../core/sds/SDSAttributesAdapterTest.java | 41 ++++++++++----
2 files changed, 63 insertions(+), 34 deletions(-)
diff --git a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSAttributesAdapter.java b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSAttributesAdapter.java
index b4ffa234693..dec5cb98d0e 100644
--- a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSAttributesAdapter.java
+++ b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSAttributesAdapter.java
@@ -133,32 +133,42 @@ public EnumSet toType(final Node node) {
}
protected Permission toPermission(final Node node) {
- final Permission permission = new Permission(Permission.Action.none, Permission.Action.none, Permission.Action.none);
- if(node.isIsEncrypted() != null && node.isIsEncrypted() && node.getType() == Node.TypeEnum.FILE) {
- try {
- if(null != session.keyPair()) {
- permission.setUser(permission.getUser().or(Permission.Action.read));
+ final Permission permission = new Permission();
+ switch(node.getType()) {
+ case FOLDER:
+ case ROOM:
+ if(node.getPermissions().isCreate()
+ // For existing files the delete role is also required to overwrite
+ && node.getPermissions().isDelete()) {
+ permission.setUser(Permission.Action.all);
}
else {
- log.warn(String.format("Missing read permission for node %s with missing key pair", node));
+ permission.setUser(Permission.Action.read.or(Permission.Action.execute));
}
- }
- catch(BackgroundException e) {
- log.warn(String.format("Ignore failure %s retrieving key pair", e));
- }
- }
- else {
- permission.setUser(permission.getUser().or(Permission.Action.read));
- }
- if(node.getType() != null) {
- switch(node.getType()) {
- case ROOM:
- case FOLDER:
- permission.setUser(permission.getUser().or(Permission.Action.execute));
- }
- }
- if(node.getPermissions() != null && node.getPermissions().isChange() && node.getPermissions().isDelete()) {
- permission.setUser(permission.getUser().or(Permission.Action.write));
+ break;
+ case FILE:
+ if(node.isIsEncrypted() != null && node.isIsEncrypted()) {
+ try {
+ if(null != session.keyPair()) {
+ permission.setUser(Permission.Action.none.or(Permission.Action.read));
+ }
+ else {
+ log.warn(String.format("Missing read permission for node %s with missing key pair", node));
+ }
+ }
+ catch(BackgroundException e) {
+ log.warn(String.format("Ignore failure %s retrieving key pair", e));
+ }
+ }
+ else {
+ if(node.getPermissions().isRead()) {
+ permission.setUser(Permission.Action.read);
+ }
+ }
+ if(node.getPermissions().isChange() && node.getPermissions().isDelete()) {
+ permission.setUser(permission.getUser().or(Permission.Action.write));
+ }
+ break;
}
if(log.isDebugEnabled()) {
log.debug(String.format("Map node permissions %s to %s", node.getPermissions(), permission));
diff --git a/dracoon/src/test/java/ch/cyberduck/core/sds/SDSAttributesAdapterTest.java b/dracoon/src/test/java/ch/cyberduck/core/sds/SDSAttributesAdapterTest.java
index dd457d3f09d..a477a2c6f7d 100644
--- a/dracoon/src/test/java/ch/cyberduck/core/sds/SDSAttributesAdapterTest.java
+++ b/dracoon/src/test/java/ch/cyberduck/core/sds/SDSAttributesAdapterTest.java
@@ -22,6 +22,9 @@
import org.junit.Test;
import org.junit.experimental.categories.Category;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
@Category(IntegrationTest.class)
public class SDSAttributesAdapterTest extends AbstractSDSTest {
@@ -31,16 +34,22 @@ public void testPermissionsFile() throws Exception {
final Node node = new Node();
node.setIsEncrypted(false);
node.setType(Node.TypeEnum.FILE);
- final NodePermissions permissions = new NodePermissions().delete(false).change(false).create(false);
+ final NodePermissions permissions = new NodePermissions().read(false).delete(false).change(false).create(false);
node.setPermissions(permissions);
- f.toPermission(node);
+ assertFalse(f.toPermission(node).isReadable());
+ assertFalse(f.toPermission(node).isWritable());
+ assertFalse(f.toPermission(node).isExecutable());
permissions.setRead(true);
- f.toPermission(node);
+ assertTrue(f.toPermission(node).isReadable());
permissions.setChange(true);
- f.toPermission(node);
+ assertTrue(f.toPermission(node).isReadable());
+ assertFalse(f.toPermission(node).isWritable());
permissions.setDelete(true);
- f.toPermission(node);
+ assertTrue(f.toPermission(node).isReadable());
+ assertTrue(f.toPermission(node).isWritable());
permissions.setCreate(true);
+ assertTrue(f.toPermission(node).isReadable());
+ assertTrue(f.toPermission(node).isWritable());
f.toPermission(node);
}
@@ -50,16 +59,26 @@ public void testPermissionsFolder() throws Exception {
final Node node = new Node();
node.setIsEncrypted(false);
node.setType(Node.TypeEnum.FOLDER);
- final NodePermissions permissions = new NodePermissions().delete(false).change(false).create(false);
+ final NodePermissions permissions = new NodePermissions().read(false).delete(false).change(false).create(false);
node.setPermissions(permissions);
- f.toPermission(node);
+ assertTrue(f.toPermission(node).isReadable());
+ assertFalse(f.toPermission(node).isWritable());
+ assertTrue(f.toPermission(node).isExecutable());
permissions.setRead(true);
- f.toPermission(node);
+ assertTrue(f.toPermission(node).isReadable());
+ assertFalse(f.toPermission(node).isWritable());
+ assertTrue(f.toPermission(node).isExecutable());
permissions.setChange(true);
- f.toPermission(node);
+ assertTrue(f.toPermission(node).isReadable());
+ assertFalse(f.toPermission(node).isWritable());
+ assertTrue(f.toPermission(node).isExecutable());
permissions.setDelete(true);
- f.toPermission(node);
+ assertTrue(f.toPermission(node).isReadable());
+ assertFalse(f.toPermission(node).isWritable());
+ assertTrue(f.toPermission(node).isExecutable());
permissions.setCreate(true);
- f.toPermission(node);
+ assertTrue(f.toPermission(node).isReadable());
+ assertTrue(f.toPermission(node).isWritable());
+ assertTrue(f.toPermission(node).isExecutable());
}
}
\ No newline at end of file
From 70ecc754bb7e3e63e27bc455dd2350dce14685b0 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Thu, 19 Oct 2023 19:14:54 +0200
Subject: [PATCH 097/230] Add preflight check for features with specific
failure.
---
.../core/azure/AzureCopyFeature.java | 12 +++++-
.../core/azure/AzureDirectoryFeature.java | 18 ++++----
.../core/azure/AzureMoveFeature.java | 5 ++-
.../core/azure/AzureTouchFeature.java | 8 +++-
.../ch/cyberduck/core/b2/B2CopyFeature.java | 18 +++++---
.../cyberduck/core/b2/B2DirectoryFeature.java | 22 +++++-----
.../ch/cyberduck/core/b2/B2MoveFeature.java | 11 +++--
.../core/b2/B2ThresholdCopyFeature.java | 4 +-
.../ch/cyberduck/core/b2/B2TouchFeature.java | 8 +++-
.../core/box/BoxDirectoryFeature.java | 7 ++-
.../cyberduck/core/box/BoxTouchFeature.java | 22 +++++++---
.../exception/InvalidFilenameException.java | 35 +++++++++++++++
.../core/exception/QuotaException.java | 4 ++
.../java/ch/cyberduck/core/features/Copy.java | 32 ++++++++++++--
.../ch/cyberduck/core/features/Delete.java | 23 +++++++++-
.../ch/cyberduck/core/features/Directory.java | 25 +++++++++--
.../java/ch/cyberduck/core/features/Move.java | 30 +++++++++++--
.../java/ch/cyberduck/core/features/Read.java | 10 +++++
.../ch/cyberduck/core/features/Touch.java | 21 ++++++++-
.../ch/cyberduck/core/features/Write.java | 13 +++++-
.../core/shared/DefaultCopyFeature.java | 8 ++--
.../core/shared/DisabledMoveFeature.java | 6 ++-
.../registry/VaultRegistryCopyFeature.java | 24 ++++++-----
.../registry/VaultRegistryDeleteFeature.java | 6 +--
.../VaultRegistryDirectoryFeature.java | 6 +--
.../registry/VaultRegistryMoveFeature.java | 11 ++---
.../registry/VaultRegistryReadFeature.java | 5 +++
.../registry/VaultRegistryTouchFeature.java | 7 ++-
.../registry/VaultRegistryTrashFeature.java | 11 ++++-
.../registry/VaultRegistryWriteFeature.java | 5 +++
.../ch/cyberduck/core/NullMoveFeature.java | 6 ++-
.../core/transfer/UploadTransferTest.java | 7 ++-
.../features/CryptoCopyFeature.java | 8 ++--
.../features/CryptoDeleteV6Feature.java | 4 +-
.../features/CryptoDeleteV7Feature.java | 4 +-
.../features/CryptoDirectoryV6Feature.java | 5 +++
.../features/CryptoDirectoryV7Feature.java | 5 +++
.../features/CryptoMoveV6Feature.java | 13 +++++-
.../features/CryptoMoveV7Feature.java | 13 +++++-
.../features/CryptoTouchFeature.java | 9 ++--
.../core/cryptomator/CryptoVaultTest.java | 10 -----
.../core/ctera/CteraDirectoryFeature.java | 9 ++--
.../core/ctera/CteraMoveFeature.java | 10 +++--
.../core/ctera/CteraTouchFeature.java | 7 +--
.../core/sds/SDSBatchDeleteFeature.java | 5 ---
.../ch/cyberduck/core/sds/SDSCopyFeature.java | 14 +++---
.../core/sds/SDSDelegatingCopyFeature.java | 14 ++----
.../core/sds/SDSDelegatingMoveFeature.java | 8 ++--
.../core/sds/SDSDelegatingWriteFeature.java | 5 +++
.../core/sds/SDSDirectoryFeature.java | 19 +++++---
.../ch/cyberduck/core/sds/SDSMoveFeature.java | 43 ++++++-------------
.../ch/cyberduck/core/sds/SDSReadFeature.java | 13 ++++++
.../core/sds/SDSThresholdDeleteFeature.java | 18 +++++---
.../cyberduck/core/sds/SDSTouchFeature.java | 23 ++++++----
.../core/sds/SDSTouchFeatureTest.java | 11 ++++-
.../dropbox/DropboxBatchDeleteFeature.java | 9 +++-
.../core/dropbox/DropboxDeleteFeature.java | 9 +++-
.../core/dropbox/DropboxDirectoryFeature.java | 7 ++-
.../core/dropbox/DropboxMoveFeature.java | 5 ---
.../DropboxThresholdDeleteFeature.java | 9 +++-
.../core/dropbox/DropboxTouchFeature.java | 12 +++++-
.../ch/cyberduck/core/eue/EueCopyFeature.java | 7 ++-
.../cyberduck/core/eue/EueDeleteFeature.java | 19 ++++----
.../core/eue/EueDirectoryFeature.java | 7 ++-
.../ch/cyberduck/core/eue/EueMoveFeature.java | 13 ++++--
.../cyberduck/core/eue/EueTouchFeature.java | 9 +++-
.../cyberduck/core/eue/EueTrashFeature.java | 14 +++---
.../cyberduck/core/ftp/FTPDeleteFeature.java | 4 +-
.../core/ftp/FTPDirectoryFeature.java | 4 +-
.../ch/cyberduck/core/ftp/FTPMoveFeature.java | 4 +-
.../cyberduck/core/ftp/FTPTouchFeature.java | 4 +-
.../core/googledrive/DriveCopyFeature.java | 12 +++---
.../googledrive/DriveDirectoryFeature.java | 5 ++-
.../core/googledrive/DriveMoveFeature.java | 12 +++---
.../DriveThresholdDeleteFeature.java | 12 ++++--
.../core/googledrive/DriveTouchFeature.java | 11 ++---
.../core/googledrive/DriveTrashFeature.java | 12 ++++--
.../GoogleStorageCopyFeature.java | 12 +++++-
.../GoogleStorageDeleteFeature.java | 5 ---
.../GoogleStorageDirectoryFeature.java | 19 ++++----
.../GoogleStorageMoveFeature.java | 5 ++-
.../GoogleStorageTouchFeature.java | 9 +++-
.../core/irods/IRODSCopyFeature.java | 5 ---
.../core/manta/MantaDeleteFeature.java | 9 +++-
.../core/manta/MantaDirectoryFeature.java | 8 +++-
.../core/manta/MantaMoveFeature.java | 10 +++--
.../core/manta/MantaTouchFeature.java | 8 +++-
.../nextcloud/NextcloudDeleteFeature.java | 10 +++--
.../onedrive/features/GraphCopyFeature.java | 15 ++++---
.../onedrive/features/GraphDeleteFeature.java | 9 +++-
.../features/GraphDirectoryFeature.java | 8 +++-
.../onedrive/features/GraphMoveFeature.java | 16 ++++---
.../onedrive/features/GraphTouchFeature.java | 8 +++-
.../openstack/SwiftDefaultCopyFeature.java | 12 +++++-
.../SwiftLargeObjectCopyFeature.java | 12 +++++-
.../core/openstack/SwiftMoveFeature.java | 5 ++-
.../openstack/SwiftSegmentCopyService.java | 12 +++++-
.../core/openstack/SwiftTouchFeature.java | 9 +++-
.../ch/cyberduck/core/s3/S3CopyFeature.java | 12 +++++-
.../cyberduck/core/s3/S3DirectoryFeature.java | 11 +++--
.../ch/cyberduck/core/s3/S3MoveFeature.java | 5 ++-
.../core/s3/S3ThresholdCopyFeature.java | 16 ++++++-
.../ch/cyberduck/core/s3/S3TouchFeature.java | 9 ++--
.../ch/cyberduck/core/smb/SMBCopyFeature.java | 9 +++-
.../ch/cyberduck/core/smb/SMBMoveFeature.java | 11 +++--
.../cyberduck/core/smb/SMBTouchFeature.java | 5 ---
.../core/spectra/SpectraTouchFeature.java | 9 ++--
.../core/storegate/StoregateCopyFeature.java | 5 ---
.../storegate/StoregateDirectoryFeature.java | 8 +++-
.../core/storegate/StoregateTouchFeature.java | 9 +++-
110 files changed, 837 insertions(+), 378 deletions(-)
create mode 100644 core/src/main/java/ch/cyberduck/core/exception/InvalidFilenameException.java
diff --git a/azure/src/main/java/ch/cyberduck/core/azure/AzureCopyFeature.java b/azure/src/main/java/ch/cyberduck/core/azure/AzureCopyFeature.java
index 78b03b50163..854d1fbcf77 100644
--- a/azure/src/main/java/ch/cyberduck/core/azure/AzureCopyFeature.java
+++ b/azure/src/main/java/ch/cyberduck/core/azure/AzureCopyFeature.java
@@ -20,10 +20,12 @@
import ch.cyberduck.core.ConnectionCallback;
import ch.cyberduck.core.DirectoryDelimiterPathContainerService;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.exception.NotfoundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Copy;
import ch.cyberduck.core.io.StreamListener;
import ch.cyberduck.core.preferences.HostPreferences;
@@ -34,6 +36,7 @@
import java.net.URI;
import java.net.URISyntaxException;
+import java.text.MessageFormat;
import com.microsoft.azure.storage.AccessCondition;
import com.microsoft.azure.storage.OperationContext;
@@ -84,7 +87,12 @@ public Path copy(final Path source, final Path copy, final TransferStatus status
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return !containerService.isContainer(source) && !containerService.isContainer(target);
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ if(containerService.isContainer(source)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
+ }
+ if(containerService.isContainer(target)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
+ }
}
}
diff --git a/azure/src/main/java/ch/cyberduck/core/azure/AzureDirectoryFeature.java b/azure/src/main/java/ch/cyberduck/core/azure/AzureDirectoryFeature.java
index 10eb9a7c8d5..fee56ca3224 100644
--- a/azure/src/main/java/ch/cyberduck/core/azure/AzureDirectoryFeature.java
+++ b/azure/src/main/java/ch/cyberduck/core/azure/AzureDirectoryFeature.java
@@ -22,6 +22,7 @@
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.exception.NotfoundException;
import ch.cyberduck.core.features.Directory;
import ch.cyberduck.core.features.Write;
@@ -81,22 +82,23 @@ public Path mkdir(final Path folder, final TransferStatus status) throws Backgro
}
@Override
- public boolean isSupported(final Path workdir, final String name) {
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
if(workdir.isRoot()) {
// Empty argument if not known in validation
- if(StringUtils.isNotBlank(name)) {
+ if(StringUtils.isNotBlank(filename)) {
// Container names must be lowercase, between 3-63 characters long and must start with a letter or
// number. Container names may contain only letters, numbers, and the dash (-) character.
- if(StringUtils.length(name) > 63) {
- return false;
+ if(StringUtils.length(filename) > 63) {
+ throw new InvalidFilenameException();
}
- if(StringUtils.length(name) < 3) {
- return false;
+ if(StringUtils.length(filename) < 3) {
+ throw new InvalidFilenameException();
+ }
+ if(!StringUtils.isAlphanumeric(RegExUtils.removeAll(filename, "-"))) {
+ throw new InvalidFilenameException();
}
- return StringUtils.isAlphanumeric(RegExUtils.removeAll(name, "-"));
}
}
- return true;
}
@Override
diff --git a/azure/src/main/java/ch/cyberduck/core/azure/AzureMoveFeature.java b/azure/src/main/java/ch/cyberduck/core/azure/AzureMoveFeature.java
index e8fcf8e1b9e..12090bf742d 100644
--- a/azure/src/main/java/ch/cyberduck/core/azure/AzureMoveFeature.java
+++ b/azure/src/main/java/ch/cyberduck/core/azure/AzureMoveFeature.java
@@ -46,8 +46,9 @@ public AzureMoveFeature(final AzureSession session, final OperationContext conte
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return proxy.isSupported(source, target) && delete.isSupported(source);
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ proxy.preflight(source, target);
+ delete.preflight(source);
}
@Override
diff --git a/azure/src/main/java/ch/cyberduck/core/azure/AzureTouchFeature.java b/azure/src/main/java/ch/cyberduck/core/azure/AzureTouchFeature.java
index 6815f282c18..1f4c950b11c 100644
--- a/azure/src/main/java/ch/cyberduck/core/azure/AzureTouchFeature.java
+++ b/azure/src/main/java/ch/cyberduck/core/azure/AzureTouchFeature.java
@@ -18,7 +18,9 @@
* feedback@cyberduck.io
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.shared.DefaultTouchFeature;
import ch.cyberduck.core.transfer.TransferStatus;
@@ -39,8 +41,10 @@ public AzureTouchFeature(final AzureSession session, final OperationContext cont
}
@Override
- public boolean isSupported(final Path workdir, final String filename) {
- return !workdir.isRoot();
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ if(workdir.isRoot()) {
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
+ }
}
@Override
diff --git a/backblaze/src/main/java/ch/cyberduck/core/b2/B2CopyFeature.java b/backblaze/src/main/java/ch/cyberduck/core/b2/B2CopyFeature.java
index a6048cfd0f8..cb28ce23612 100644
--- a/backblaze/src/main/java/ch/cyberduck/core/b2/B2CopyFeature.java
+++ b/backblaze/src/main/java/ch/cyberduck/core/b2/B2CopyFeature.java
@@ -17,15 +17,18 @@
import ch.cyberduck.core.ConnectionCallback;
import ch.cyberduck.core.DefaultIOExceptionMappingService;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.SimplePathPredicate;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Copy;
import ch.cyberduck.core.io.StreamListener;
import ch.cyberduck.core.transfer.TransferStatus;
import java.io.IOException;
+import java.text.MessageFormat;
import synapticloop.b2.exception.B2ApiException;
import synapticloop.b2.response.B2FileResponse;
@@ -62,13 +65,18 @@ public Path copy(final Path source, final Path target, final TransferStatus stat
}
@Override
- public boolean isSupported(final Path source, final Path target) {
+ public void preflight(final Path source, final Path target) throws BackgroundException {
if(source.getType().contains(Path.Type.upload)) {
- return false;
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
}
- if(containerService.isContainer(source) || containerService.isContainer(target)) {
- return false;
+ if(containerService.isContainer(source)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
+ }
+ if(containerService.isContainer(target)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
+ }
+ if(!new SimplePathPredicate(containerService.getContainer(source)).test(containerService.getContainer(target))) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
}
- return new SimplePathPredicate(containerService.getContainer(source)).test(containerService.getContainer(target));
}
}
diff --git a/backblaze/src/main/java/ch/cyberduck/core/b2/B2DirectoryFeature.java b/backblaze/src/main/java/ch/cyberduck/core/b2/B2DirectoryFeature.java
index a69a84c09aa..8464535da8f 100644
--- a/backblaze/src/main/java/ch/cyberduck/core/b2/B2DirectoryFeature.java
+++ b/backblaze/src/main/java/ch/cyberduck/core/b2/B2DirectoryFeature.java
@@ -20,6 +20,7 @@
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.features.Directory;
import ch.cyberduck.core.features.Write;
import ch.cyberduck.core.transfer.TransferStatus;
@@ -82,26 +83,27 @@ public Path mkdir(final Path folder, final TransferStatus status) throws Backgro
}
@Override
- public boolean isSupported(final Path workdir, final String name) {
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
if(workdir.isRoot()) {
// Empty argument if not known in validation
- if(StringUtils.isNotBlank(name)) {
+ if(StringUtils.isNotBlank(filename)) {
// Bucket names must be a minimum of 6 and a maximum of 50 characters long, and must be globally unique;
// two different B2 accounts cannot have buckets with the name name. Bucket names can consist of: letters,
// digits, and "-". Bucket names cannot start with "b2-"; these are reserved for internal Backblaze use.
- if(StringUtils.startsWith(name, "b2-")) {
- return false;
+ if(StringUtils.startsWith(filename, "b2-")) {
+ throw new InvalidFilenameException();
}
- if(StringUtils.length(name) > 50) {
- return false;
+ if(StringUtils.length(filename) > 50) {
+ throw new InvalidFilenameException();
}
- if(StringUtils.length(name) < 6) {
- return false;
+ if(StringUtils.length(filename) < 6) {
+ throw new InvalidFilenameException();
+ }
+ if(!StringUtils.isAlphanumeric(RegExUtils.removeAll(filename, "-"))) {
+ throw new InvalidFilenameException();
}
- return StringUtils.isAlphanumeric(RegExUtils.removeAll(name, "-"));
}
}
- return true;
}
@Override
diff --git a/backblaze/src/main/java/ch/cyberduck/core/b2/B2MoveFeature.java b/backblaze/src/main/java/ch/cyberduck/core/b2/B2MoveFeature.java
index c5e474c08d3..12ee3ab7203 100644
--- a/backblaze/src/main/java/ch/cyberduck/core/b2/B2MoveFeature.java
+++ b/backblaze/src/main/java/ch/cyberduck/core/b2/B2MoveFeature.java
@@ -16,14 +16,17 @@
*/
import ch.cyberduck.core.ConnectionCallback;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.features.Move;
import ch.cyberduck.core.io.DisabledStreamListener;
import ch.cyberduck.core.transfer.TransferStatus;
+import java.text.MessageFormat;
import java.util.Collections;
public class B2MoveFeature implements Move {
@@ -49,11 +52,11 @@ public Path move(final Path source, final Path target, final TransferStatus stat
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- if(!containerService.isContainer(source)) {
- return proxy.isSupported(source, target);
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ if(containerService.isContainer(source)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(source);
}
- return false;
+ proxy.preflight(source, target);
}
@Override
diff --git a/backblaze/src/main/java/ch/cyberduck/core/b2/B2ThresholdCopyFeature.java b/backblaze/src/main/java/ch/cyberduck/core/b2/B2ThresholdCopyFeature.java
index 07cd25f43a8..dd2e1f8a9e1 100644
--- a/backblaze/src/main/java/ch/cyberduck/core/b2/B2ThresholdCopyFeature.java
+++ b/backblaze/src/main/java/ch/cyberduck/core/b2/B2ThresholdCopyFeature.java
@@ -54,8 +54,8 @@ public Path copy(final Path source, final Path target, final TransferStatus stat
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return new B2CopyFeature(session, fileid).isSupported(source, target);
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ new B2CopyFeature(session, fileid).preflight(source, target);
}
@Override
diff --git a/backblaze/src/main/java/ch/cyberduck/core/b2/B2TouchFeature.java b/backblaze/src/main/java/ch/cyberduck/core/b2/B2TouchFeature.java
index d2857f01536..889ab60dbe7 100644
--- a/backblaze/src/main/java/ch/cyberduck/core/b2/B2TouchFeature.java
+++ b/backblaze/src/main/java/ch/cyberduck/core/b2/B2TouchFeature.java
@@ -15,7 +15,9 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.shared.DefaultTouchFeature;
import ch.cyberduck.core.transfer.TransferStatus;
@@ -36,8 +38,10 @@ public Path touch(final Path file, final TransferStatus status) throws Backgroun
}
@Override
- public boolean isSupported(final Path workdir, final String filename) {
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
// Creating files is only possible inside a bucket.
- return !workdir.isRoot();
+ if(workdir.isRoot()) {
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
+ }
}
}
diff --git a/box/src/main/java/ch/cyberduck/core/box/BoxDirectoryFeature.java b/box/src/main/java/ch/cyberduck/core/box/BoxDirectoryFeature.java
index 0ef026fb7b2..8ec950088f9 100644
--- a/box/src/main/java/ch/cyberduck/core/box/BoxDirectoryFeature.java
+++ b/box/src/main/java/ch/cyberduck/core/box/BoxDirectoryFeature.java
@@ -21,6 +21,7 @@
import ch.cyberduck.core.box.io.swagger.client.model.FoldersBody;
import ch.cyberduck.core.box.io.swagger.client.model.FoldersParent;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.features.Directory;
import ch.cyberduck.core.features.Write;
import ch.cyberduck.core.transfer.TransferStatus;
@@ -56,7 +57,9 @@ public Directory withWriter(final Write writer) {
}
@Override
- public boolean isSupported(final Path workdir, final String name) {
- return new BoxTouchFeature(session, fileid).isSupported(workdir, name);
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ if(!BoxTouchFeature.validate(filename)) {
+ throw new InvalidFilenameException();
+ }
}
}
diff --git a/box/src/main/java/ch/cyberduck/core/box/BoxTouchFeature.java b/box/src/main/java/ch/cyberduck/core/box/BoxTouchFeature.java
index e774f4cf1b6..93458eb98f7 100644
--- a/box/src/main/java/ch/cyberduck/core/box/BoxTouchFeature.java
+++ b/box/src/main/java/ch/cyberduck/core/box/BoxTouchFeature.java
@@ -17,6 +17,8 @@
import ch.cyberduck.core.Path;
import ch.cyberduck.core.box.io.swagger.client.model.File;
+import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.shared.DefaultTouchFeature;
import org.apache.commons.lang3.StringUtils;
@@ -28,25 +30,31 @@ public BoxTouchFeature(final BoxSession session, final BoxFileidProvider fileid)
}
@Override
- public boolean isSupported(final Path workdir, final String name) {
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ if(!validate(filename)) {
+ throw new InvalidFilenameException();
+ }
+ }
+
+ public static boolean validate(final String filename) {
// Max Length 255
- if(StringUtils.length(name) > 255) {
+ if(StringUtils.length(filename) > 255) {
return false;
}
- if(StringUtils.contains(name, "/")) {
+ if(StringUtils.contains(filename, "/")) {
return false;
}
- if(StringUtils.contains(name, "\\")) {
+ if(StringUtils.contains(filename, "\\")) {
return false;
}
- if(StringUtils.endsWith(name, StringUtils.SPACE)) {
+ if(StringUtils.endsWith(filename, StringUtils.SPACE)) {
return false;
}
// Additionally, the names . and .. are not allowed either.
- if(StringUtils.equals(name, ".")) {
+ if(StringUtils.equals(filename, ".")) {
return false;
}
- if(StringUtils.equals(name, "..")) {
+ if(StringUtils.equals(filename, "..")) {
return false;
}
return true;
diff --git a/core/src/main/java/ch/cyberduck/core/exception/InvalidFilenameException.java b/core/src/main/java/ch/cyberduck/core/exception/InvalidFilenameException.java
new file mode 100644
index 00000000000..8f01f471618
--- /dev/null
+++ b/core/src/main/java/ch/cyberduck/core/exception/InvalidFilenameException.java
@@ -0,0 +1,35 @@
+package ch.cyberduck.core.exception;
+
+/*
+ * Copyright (c) 2002-2023 iterate GmbH. All rights reserved.
+ * https://cyberduck.io/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+public class InvalidFilenameException extends UnsupportedException {
+
+ public InvalidFilenameException() {
+ super();
+ }
+
+ public InvalidFilenameException(final Throwable cause) {
+ super(cause);
+ }
+
+ public InvalidFilenameException(final String detail) {
+ super(detail);
+ }
+
+ public InvalidFilenameException(final String detail, final Throwable cause) {
+ super(detail, cause);
+ }
+}
diff --git a/core/src/main/java/ch/cyberduck/core/exception/QuotaException.java b/core/src/main/java/ch/cyberduck/core/exception/QuotaException.java
index 6c59086d389..9393f84acb8 100644
--- a/core/src/main/java/ch/cyberduck/core/exception/QuotaException.java
+++ b/core/src/main/java/ch/cyberduck/core/exception/QuotaException.java
@@ -23,6 +23,10 @@
public class QuotaException extends BackgroundException {
private static final long serialVersionUID = -4529261484333237702L;
+ public QuotaException(final String detail) {
+ super(LocaleFactory.localizedString("Insufficient disk space", "Error"), detail);
+ }
+
public QuotaException(final String detail, final Throwable cause) {
super(LocaleFactory.localizedString("Insufficient disk space", "Error"), detail, cause);
}
diff --git a/core/src/main/java/ch/cyberduck/core/features/Copy.java b/core/src/main/java/ch/cyberduck/core/features/Copy.java
index e8c66bead8d..472c6bbfb83 100644
--- a/core/src/main/java/ch/cyberduck/core/features/Copy.java
+++ b/core/src/main/java/ch/cyberduck/core/features/Copy.java
@@ -16,12 +16,18 @@
*/
import ch.cyberduck.core.ConnectionCallback;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.Session;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.io.StreamListener;
import ch.cyberduck.core.transfer.TransferStatus;
+import java.text.MessageFormat;
+
/**
* Server side copying of files
*/
@@ -42,7 +48,7 @@ public interface Copy {
* @param target Target file or folder
* @return True if the implementation can copy directories recursively
*/
- default boolean isRecursive(Path source, Path target) {
+ default boolean isRecursive(final Path source, final Path target) {
return false;
}
@@ -51,15 +57,33 @@ default boolean isRecursive(Path source, Path target) {
* @param target Target file or folder
* @return False if not supported for given files
*/
- default boolean isSupported(Path source, Path target) {
- return true;
+ default boolean isSupported(final Path source, final Path target) {
+ try {
+ this.preflight(source, target);
+ return true;
+ }
+ catch(BackgroundException e) {
+ return false;
+ }
}
/**
* @param session Target session for stateful protocols
* @return This
*/
- default Copy withTarget(Session> session) {
+ default Copy withTarget(final Session> session) {
return this;
}
+
+ /**
+ * @throws AccessDeniedException Permission failure to create target directory
+ * @throws UnsupportedException Copy operation not supported for source
+ * @throws InvalidFilenameException Target filename not supported
+ */
+ default void preflight(final Path source, final Path target) throws BackgroundException {
+ if(!target.getParent().attributes().getPermission().isWritable()) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"),
+ source.getName())).withFile(source);
+ }
+ }
}
diff --git a/core/src/main/java/ch/cyberduck/core/features/Delete.java b/core/src/main/java/ch/cyberduck/core/features/Delete.java
index ac17257d798..722945c715c 100644
--- a/core/src/main/java/ch/cyberduck/core/features/Delete.java
+++ b/core/src/main/java/ch/cyberduck/core/features/Delete.java
@@ -15,11 +15,17 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.PasswordCallback;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.transfer.TransferStatus;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.text.MessageFormat;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -29,6 +35,8 @@
*/
@Required
public interface Delete {
+ Logger log = LogManager.getLogger(Delete.class);
+
default void delete(List files, PasswordCallback prompt, Callback callback) throws BackgroundException {
final Map set = new LinkedHashMap<>();
for(Path file : files) {
@@ -51,7 +59,13 @@ default void delete(List files, PasswordCallback prompt, Callback callback
* @return True if the file can be deleted on the server
*/
default boolean isSupported(final Path file) {
- return file.attributes().getPermission().isWritable();
+ try {
+ this.preflight(file);
+ return true;
+ }
+ catch(BackgroundException e) {
+ return false;
+ }
}
/**
@@ -74,4 +88,11 @@ public void delete(Path file) {
//
}
}
+
+ default void preflight(final Path file) throws BackgroundException {
+ if(!file.attributes().getPermission().isWritable()) {
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"),
+ file.getName())).withFile(file);
+ }
+ }
}
diff --git a/core/src/main/java/ch/cyberduck/core/features/Directory.java b/core/src/main/java/ch/cyberduck/core/features/Directory.java
index 4b74bd15b49..fa9eebb0400 100644
--- a/core/src/main/java/ch/cyberduck/core/features/Directory.java
+++ b/core/src/main/java/ch/cyberduck/core/features/Directory.java
@@ -15,10 +15,14 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.transfer.TransferStatus;
+import java.text.MessageFormat;
+
/**
* Create new folder on server
*
@@ -37,15 +41,30 @@ public interface Directory {
/**
* @param workdir Working directory in browser
- * @param name Folder name or null if unknown
+ * @param filename Folder name or null if unknown
* @return True if creating directory is supported in the working directory
*/
- default boolean isSupported(final Path workdir, final String name) {
- return workdir.attributes().getPermission().isWritable();
+ default boolean isSupported(final Path workdir, final String filename) {
+ try {
+ this.preflight(workdir, filename);
+ return true;
+ }
+ catch(BackgroundException e) {
+ return false;
+ }
}
/**
* Retrieve write implementation for implementations using placeholder files for folders
*/
Directory withWriter(Write writer);
+
+ /**
+ * @throws AccessDeniedException Permission failure for target directory
+ */
+ default void preflight(final Path workdir, final String filename) throws BackgroundException {
+ if(!workdir.attributes().getPermission().isWritable()) {
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Upload {0} failed", "Error"), filename));
+ }
+ }
}
diff --git a/core/src/main/java/ch/cyberduck/core/features/Move.java b/core/src/main/java/ch/cyberduck/core/features/Move.java
index 994e75507bd..f1a6f1fe688 100644
--- a/core/src/main/java/ch/cyberduck/core/features/Move.java
+++ b/core/src/main/java/ch/cyberduck/core/features/Move.java
@@ -16,11 +16,17 @@
*/
import ch.cyberduck.core.ConnectionCallback;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.Session;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.transfer.TransferStatus;
+import java.text.MessageFormat;
+
/**
* Move or rename file or folder on server
*/
@@ -41,7 +47,7 @@ public interface Move {
* @param target Target file or folder
* @return True if the implementation can move directories recursively
*/
- default boolean isRecursive(Path source, Path target) {
+ default boolean isRecursive(final Path source, final Path target) {
return false;
}
@@ -50,8 +56,14 @@ default boolean isRecursive(Path source, Path target) {
* @param target Target file or folder
* @return False if not supported for given files
*/
- default boolean isSupported(Path source, Path target) {
- return target.getParent().attributes().getPermission().isWritable();
+ default boolean isSupported(final Path source, final Path target) {
+ try {
+ this.preflight(source, target);
+ return true;
+ }
+ catch(BackgroundException e) {
+ return false;
+ }
}
/**
@@ -61,4 +73,16 @@ default boolean isSupported(Path source, Path target) {
default Move withTarget(Session> session) {
return this;
}
+
+ /**
+ * @throws AccessDeniedException Permission failure for target parent directory
+ * @throws UnsupportedException Move operation not supported for source
+ * @throws InvalidFilenameException Target filename not supported
+ */
+ default void preflight(final Path source, final Path target) throws BackgroundException {
+ if(!target.getParent().attributes().getPermission().isWritable()) {
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"),
+ source.getName())).withFile(source);
+ }
+ }
}
diff --git a/core/src/main/java/ch/cyberduck/core/features/Read.java b/core/src/main/java/ch/cyberduck/core/features/Read.java
index 4b93a9e6934..795000aa9e8 100644
--- a/core/src/main/java/ch/cyberduck/core/features/Read.java
+++ b/core/src/main/java/ch/cyberduck/core/features/Read.java
@@ -16,11 +16,14 @@
*/
import ch.cyberduck.core.ConnectionCallback;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.transfer.TransferStatus;
import java.io.InputStream;
+import java.text.MessageFormat;
/**
* Read file from server
@@ -43,4 +46,11 @@ default boolean offset(Path file) throws BackgroundException {
return true;
}
+
+ default void preflight(final Path file) throws BackgroundException {
+ if(!file.attributes().getPermission().isReadable()) {
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Download {0} failed", "Error"),
+ file.getName())).withFile(file);
+ }
+ }
}
diff --git a/core/src/main/java/ch/cyberduck/core/features/Touch.java b/core/src/main/java/ch/cyberduck/core/features/Touch.java
index c5d5c4a5827..fd3119df06a 100644
--- a/core/src/main/java/ch/cyberduck/core/features/Touch.java
+++ b/core/src/main/java/ch/cyberduck/core/features/Touch.java
@@ -15,10 +15,14 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.transfer.TransferStatus;
+import java.text.MessageFormat;
+
@Optional
public interface Touch {
@@ -30,8 +34,23 @@ public interface Touch {
* @return True if creating an empty file is possible.
*/
default boolean isSupported(final Path workdir, final String filename) {
- return workdir.attributes().getPermission().isWritable();
+ try {
+ this.preflight(workdir, filename);
+ return true;
+ }
+ catch(BackgroundException e) {
+ return false;
+ }
}
Touch withWriter(Write writer);
+
+ /**
+ * @throws AccessDeniedException Permission failure for target directory
+ */
+ default void preflight(final Path workdir, final String filename) throws BackgroundException {
+ if(!workdir.attributes().getPermission().isWritable()) {
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Upload {0} failed", "Error"), filename));
+ }
+ }
}
diff --git a/core/src/main/java/ch/cyberduck/core/features/Write.java b/core/src/main/java/ch/cyberduck/core/features/Write.java
index 9cfb012096a..113289063c1 100644
--- a/core/src/main/java/ch/cyberduck/core/features/Write.java
+++ b/core/src/main/java/ch/cyberduck/core/features/Write.java
@@ -16,7 +16,9 @@
*/
import ch.cyberduck.core.ConnectionCallback;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.io.Checksum;
import ch.cyberduck.core.io.ChecksumCompute;
@@ -24,6 +26,7 @@
import ch.cyberduck.core.io.StatusOutputStream;
import ch.cyberduck.core.transfer.TransferStatus;
+import java.text.MessageFormat;
import java.util.Objects;
@Required
@@ -120,4 +123,12 @@ public int hashCode() {
* Existing remote file found
*/
Append override = new Append(false);
-}
+
+ default void preflight(final Path file) throws BackgroundException {
+ final Path workdir = file.getParent();
+ if(!workdir.attributes().getPermission().isWritable()) {
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Upload {0} failed", "Error"),
+ file.getName())).withFile(file);
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/src/main/java/ch/cyberduck/core/shared/DefaultCopyFeature.java b/core/src/main/java/ch/cyberduck/core/shared/DefaultCopyFeature.java
index 4ccc709f468..34936458260 100644
--- a/core/src/main/java/ch/cyberduck/core/shared/DefaultCopyFeature.java
+++ b/core/src/main/java/ch/cyberduck/core/shared/DefaultCopyFeature.java
@@ -20,6 +20,7 @@
import ch.cyberduck.core.PathAttributes;
import ch.cyberduck.core.Session;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Copy;
import ch.cyberduck.core.features.MultipartWrite;
import ch.cyberduck.core.features.Read;
@@ -69,14 +70,15 @@ public Path copy(final Path source, final Path target, final TransferStatus stat
}
@Override
- public boolean isSupported(final Path source, final Path target) {
+ public void preflight(final Path source, final Path target) throws BackgroundException {
switch(from.getHost().getProtocol().getType()) {
case ftp:
case irods:
// Stateful
- return !Objects.equals(from, to);
+ if(Objects.equals(from, to)) {
+ throw new UnsupportedException();
+ }
}
- return true;
}
@Override
diff --git a/core/src/main/java/ch/cyberduck/core/shared/DisabledMoveFeature.java b/core/src/main/java/ch/cyberduck/core/shared/DisabledMoveFeature.java
index 9694c65808d..4e856f7a366 100644
--- a/core/src/main/java/ch/cyberduck/core/shared/DisabledMoveFeature.java
+++ b/core/src/main/java/ch/cyberduck/core/shared/DisabledMoveFeature.java
@@ -18,7 +18,9 @@
*/
import ch.cyberduck.core.ConnectionCallback;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.exception.InteroperabilityException;
import ch.cyberduck.core.features.Delete;
@@ -34,7 +36,7 @@ public Path move(final Path file, final Path renamed, final TransferStatus statu
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return false;
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error"));
}
}
diff --git a/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryCopyFeature.java b/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryCopyFeature.java
index 4825c4b6a29..34ef759df50 100644
--- a/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryCopyFeature.java
+++ b/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryCopyFeature.java
@@ -26,6 +26,8 @@
import ch.cyberduck.core.vault.VaultRegistry;
import ch.cyberduck.core.vault.VaultUnlockCancelException;
+import java.util.EnumSet;
+
public class VaultRegistryCopyFeature implements Copy {
private final Session> session;
@@ -56,34 +58,36 @@ else if(registry.find(session, copy).equals(Vault.DISABLED)) {
}
@Override
- public boolean isRecursive(final Path source, final Path copy) {
+ public EnumSet features(final Path source, final Path copy) {
try {
if(registry.find(session, source, false).equals(Vault.DISABLED)) {
- return registry.find(session, copy, false).getFeature(session, Copy.class, proxy).withTarget(destination).isRecursive(source, copy);
+ return registry.find(session, copy, false).getFeature(session, Copy.class, proxy).withTarget(destination).features(source, copy);
}
else if(registry.find(session, copy, false).equals(Vault.DISABLED)) {
- return registry.find(session, source, false).getFeature(session, Copy.class, proxy).withTarget(destination).isRecursive(source, copy);
+ return registry.find(session, source, false).getFeature(session, Copy.class, proxy).withTarget(destination).features(source, copy);
}
- return registry.find(session, copy, false).getFeature(session, Copy.class, proxy).withTarget(destination).isRecursive(source, copy);
+ return registry.find(session, copy, false).getFeature(session, Copy.class, proxy).withTarget(destination).features(source, copy);
}
catch(VaultUnlockCancelException e) {
- return proxy.isRecursive(source, copy);
+ return proxy.features(source, copy);
}
}
@Override
- public boolean isSupported(final Path source, final Path copy) {
+ public void preflight(final Path source, final Path copy) throws BackgroundException {
try {
if(registry.find(session, source, false).equals(Vault.DISABLED)) {
- return registry.find(session, copy, false).getFeature(session, Copy.class, proxy).withTarget(destination).isSupported(source, copy);
+ registry.find(session, copy, false).getFeature(session, Copy.class, proxy).withTarget(destination).preflight(source, copy);
}
else if(registry.find(session, copy, false).equals(Vault.DISABLED)) {
- return registry.find(session, source, false).getFeature(session, Copy.class, proxy).withTarget(destination).isSupported(source, copy);
+ registry.find(session, source, false).getFeature(session, Copy.class, proxy).withTarget(destination).preflight(source, copy);
+ }
+ else {
+ registry.find(session, copy, false).getFeature(session, Copy.class, proxy).withTarget(destination).preflight(source, copy);
}
- return registry.find(session, copy, false).getFeature(session, Copy.class, proxy).withTarget(destination).isSupported(source, copy);
}
catch(VaultUnlockCancelException e) {
- return proxy.isSupported(source, copy);
+ proxy.preflight(source, copy);
}
}
diff --git a/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryDeleteFeature.java b/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryDeleteFeature.java
index e26120f5e64..7d6d962a255 100644
--- a/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryDeleteFeature.java
+++ b/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryDeleteFeature.java
@@ -64,12 +64,12 @@ public void delete(final Map files, final PasswordCallback
}
@Override
- public boolean isSupported(final Path file) {
+ public void preflight(final Path file) throws BackgroundException {
try {
- return registry.find(session, file, false).getFeature(session, Delete.class, proxy).isSupported(file);
+ registry.find(session, file, false).getFeature(session, Delete.class, proxy).preflight(file);
}
catch(VaultUnlockCancelException e) {
- return proxy.isSupported(file);
+ proxy.preflight(file);
}
}
diff --git a/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryDirectoryFeature.java b/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryDirectoryFeature.java
index 8f301b4e86b..b2e3e2e9a06 100644
--- a/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryDirectoryFeature.java
+++ b/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryDirectoryFeature.java
@@ -43,12 +43,12 @@ public Path mkdir(final Path folder, final TransferStatus status) throws Backgro
}
@Override
- public boolean isSupported(final Path workdir, final String name) {
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
try {
- return registry.find(session, workdir, false).getFeature(session, Directory.class, proxy).isSupported(workdir, name);
+ registry.find(session, workdir, false).getFeature(session, Directory.class, proxy).preflight(workdir, filename);
}
catch(VaultUnlockCancelException e) {
- return proxy.isSupported(workdir, name);
+ proxy.preflight(workdir, filename);
}
}
diff --git a/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryMoveFeature.java b/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryMoveFeature.java
index 3ea85c881e3..4d98f1cfb8e 100644
--- a/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryMoveFeature.java
+++ b/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryMoveFeature.java
@@ -81,16 +81,17 @@ public boolean isRecursive(final Path source, final Path target) {
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- // Run through registry without looking for vaults to circumvent deadlock due to synchronized load of vault
+ public void preflight(final Path source, final Path target) throws BackgroundException {
try {
if(registry.find(session, source, false).equals(registry.find(session, target, false))) {
- return registry.find(session, source, false).getFeature(session, Move.class, proxy).isSupported(source, target);
+ registry.find(session, source, false).getFeature(session, Move.class, proxy).preflight(source, target);
+ }
+ else {
+ session.getFeature(Copy.class).preflight(source, target);
}
- return session.getFeature(Copy.class).isSupported(source, target);
}
catch(VaultUnlockCancelException e) {
- return proxy.isSupported(source, target);
+ proxy.preflight(source, target);
}
}
diff --git a/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryReadFeature.java b/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryReadFeature.java
index 5e2661b8c65..c5bbf1336e3 100644
--- a/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryReadFeature.java
+++ b/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryReadFeature.java
@@ -47,6 +47,11 @@ public boolean offset(final Path file) throws BackgroundException {
return registry.find(session, file).getFeature(session, Read.class, proxy).offset(file);
}
+ @Override
+ public void preflight(final Path file) throws BackgroundException {
+ registry.find(session, file).getFeature(session, Read.class, proxy).preflight(file);
+ }
+
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("VaultRegistryReadFeature{");
diff --git a/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryTouchFeature.java b/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryTouchFeature.java
index 01b0160812c..0047b60e0dd 100644
--- a/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryTouchFeature.java
+++ b/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryTouchFeature.java
@@ -42,13 +42,12 @@ public Path touch(final Path file, final TransferStatus status) throws Backgroun
}
@Override
- public boolean isSupported(final Path workdir, final String filename) {
- // Run through registry without looking for vaults to circumvent deadlock due to synchronized load of vault
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
try {
- return registry.find(session, workdir, false).getFeature(session, Touch.class, proxy).isSupported(workdir, filename);
+ registry.find(session, workdir, false).getFeature(session, Touch.class, proxy).preflight(workdir, filename);
}
catch(VaultUnlockCancelException e) {
- return proxy.isSupported(workdir, filename);
+ proxy.preflight(workdir, filename);
}
}
diff --git a/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryTrashFeature.java b/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryTrashFeature.java
index f11dfcad06b..22624a16e1c 100644
--- a/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryTrashFeature.java
+++ b/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryTrashFeature.java
@@ -19,10 +19,12 @@
import ch.cyberduck.core.Path;
import ch.cyberduck.core.Session;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.features.Trash;
import ch.cyberduck.core.features.Vault;
import ch.cyberduck.core.transfer.TransferStatus;
import ch.cyberduck.core.vault.VaultRegistry;
+import ch.cyberduck.core.vault.VaultUnlockCancelException;
import java.util.HashMap;
import java.util.LinkedHashMap;
@@ -63,8 +65,13 @@ public void delete(final Map files, final PasswordCallback
}
@Override
- public boolean isSupported(final Path file) {
- return proxy.isSupported(file);
+ public void preflight(final Path file) throws BackgroundException {
+ try {
+ registry.find(session, file, false).getFeature(session, Delete.class, proxy).preflight(file);
+ }
+ catch(VaultUnlockCancelException e) {
+ proxy.preflight(file);
+ }
}
@Override
diff --git a/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryWriteFeature.java b/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryWriteFeature.java
index 89e27a84b30..ca9989299d1 100644
--- a/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryWriteFeature.java
+++ b/core/src/main/java/ch/cyberduck/core/vault/registry/VaultRegistryWriteFeature.java
@@ -68,6 +68,11 @@ public ChecksumCompute checksum(final Path file, final TransferStatus status) {
}
}
+ @Override
+ public void preflight(final Path file) throws BackgroundException {
+ registry.find(session, file).getFeature(session, Write.class, proxy).preflight(file);
+ }
+
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("VaultRegistryWriteFeature{");
diff --git a/core/src/test/java/ch/cyberduck/core/NullMoveFeature.java b/core/src/test/java/ch/cyberduck/core/NullMoveFeature.java
index 34520297926..68ec9281408 100644
--- a/core/src/test/java/ch/cyberduck/core/NullMoveFeature.java
+++ b/core/src/test/java/ch/cyberduck/core/NullMoveFeature.java
@@ -15,11 +15,13 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.shared.DisabledMoveFeature;
public class NullMoveFeature extends DisabledMoveFeature {
+
@Override
- public boolean isSupported(final Path source, final Path target) {
- return true;
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ //
}
}
diff --git a/core/src/test/java/ch/cyberduck/core/transfer/UploadTransferTest.java b/core/src/test/java/ch/cyberduck/core/transfer/UploadTransferTest.java
index 53dc64255af..0157b1bf580 100755
--- a/core/src/test/java/ch/cyberduck/core/transfer/UploadTransferTest.java
+++ b/core/src/test/java/ch/cyberduck/core/transfer/UploadTransferTest.java
@@ -378,15 +378,14 @@ public Path move(final Path file, final Path renamed, final TransferStatus statu
}
@Override
- public boolean isRecursive(final Path source, final Path target) {
- return true;
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ //
}
@Override
- public boolean isSupported(final Path source, final Path target) {
+ public boolean isRecursive(final Path source, final Path target) {
return true;
}
-
};
}
if(type.equals(AttributesFinder.class)) {
diff --git a/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoCopyFeature.java b/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoCopyFeature.java
index d6da49f2305..8972549882e 100644
--- a/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoCopyFeature.java
+++ b/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoCopyFeature.java
@@ -88,11 +88,13 @@ public boolean isRecursive(final Path source, final Path copy) {
}
@Override
- public boolean isSupported(final Path source, final Path copy) {
+ public void preflight(final Path source, final Path copy) throws BackgroundException {
if(vault.contains(source) && vault.contains(copy)) {
- return proxy.withTarget(target).isSupported(source, copy);
+ proxy.withTarget(target).preflight(source, copy);
+ }
+ else {
+ new DefaultCopyFeature(session).withTarget(target).preflight(source, copy);
}
- return new DefaultCopyFeature(session).withTarget(target).isSupported(source, copy);
}
@Override
diff --git a/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDeleteV6Feature.java b/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDeleteV6Feature.java
index a9db5ba5263..e5d59952888 100644
--- a/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDeleteV6Feature.java
+++ b/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDeleteV6Feature.java
@@ -126,8 +126,8 @@ public void delete(final Map files, final PasswordCallback
}
@Override
- public boolean isSupported(final Path file) {
- return proxy.isSupported(file);
+ public void preflight(final Path file) throws BackgroundException {
+ proxy.preflight(file);
}
@Override
diff --git a/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDeleteV7Feature.java b/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDeleteV7Feature.java
index 2ccb7e70d66..41a364fd155 100644
--- a/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDeleteV7Feature.java
+++ b/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDeleteV7Feature.java
@@ -147,8 +147,8 @@ public void delete(final Map files, final PasswordCallback
}
@Override
- public boolean isSupported(final Path file) {
- return proxy.isSupported(file);
+ public void preflight(final Path file) throws BackgroundException {
+ proxy.preflight(file);
}
@Override
diff --git a/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDirectoryV6Feature.java b/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDirectoryV6Feature.java
index b96421eb865..b93d3c02437 100644
--- a/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDirectoryV6Feature.java
+++ b/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDirectoryV6Feature.java
@@ -87,6 +87,11 @@ public boolean isSupported(final Path workdir, final String name) {
return delegate.isSupported(workdir, name);
}
+ @Override
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ delegate.preflight(workdir, filename);
+ }
+
@Override
public CryptoDirectoryV6Feature withWriter(final Write writer) {
return this;
diff --git a/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDirectoryV7Feature.java b/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDirectoryV7Feature.java
index 529f50bea0e..7cb5d1b07b0 100644
--- a/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDirectoryV7Feature.java
+++ b/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDirectoryV7Feature.java
@@ -93,6 +93,11 @@ public boolean isSupported(final Path workdir, final String name) {
return delegate.isSupported(workdir, name);
}
+ @Override
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ delegate.preflight(workdir, filename);
+ }
+
@Override
public CryptoDirectoryV7Feature withWriter(final Write writer) {
return this;
diff --git a/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoMoveV6Feature.java b/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoMoveV6Feature.java
index 5055785d949..4063db7119a 100644
--- a/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoMoveV6Feature.java
+++ b/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoMoveV6Feature.java
@@ -20,6 +20,7 @@
import ch.cyberduck.core.Session;
import ch.cyberduck.core.cryptomator.CryptoVault;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.features.Move;
import ch.cyberduck.core.transfer.TransferStatus;
@@ -58,8 +59,16 @@ public boolean isRecursive(final Path source, final Path target) {
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return proxy.isSupported(source, target) && vault.getFilenameProvider().isValid(target.getName());
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ if(!vault.getFilenameProvider().isValid(target.getName())) {
+ throw new InvalidFilenameException();
+ }
+ proxy.preflight(source, target);
+ }
+
+ @Override
+ public Move withTarget(final Session> session) {
+ return proxy.withTarget(session);
}
@Override
diff --git a/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoMoveV7Feature.java b/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoMoveV7Feature.java
index 1a7eb6815e5..e9e81eecbcf 100644
--- a/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoMoveV7Feature.java
+++ b/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoMoveV7Feature.java
@@ -21,6 +21,7 @@
import ch.cyberduck.core.cryptomator.CryptoVault;
import ch.cyberduck.core.cryptomator.impl.CryptoDirectoryV7Provider;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.features.Move;
import ch.cyberduck.core.transfer.TransferStatus;
@@ -66,8 +67,16 @@ public boolean isRecursive(final Path source, final Path target) {
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return proxy.isSupported(source, target) && vault.getFilenameProvider().isValid(target.getName());
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ if(!vault.getFilenameProvider().isValid(target.getName())) {
+ throw new InvalidFilenameException();
+ }
+ proxy.preflight(source, target);
+ }
+
+ @Override
+ public Move withTarget(final Session> session) {
+ return proxy.withTarget(session);
}
@Override
diff --git a/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoTouchFeature.java b/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoTouchFeature.java
index 0805be2ae49..73f2303ba89 100644
--- a/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoTouchFeature.java
+++ b/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoTouchFeature.java
@@ -21,11 +21,11 @@
import ch.cyberduck.core.cryptomator.CryptoVault;
import ch.cyberduck.core.cryptomator.random.RandomNonceGenerator;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.features.Touch;
import ch.cyberduck.core.features.Write;
import ch.cyberduck.core.transfer.TransferStatus;
-import org.apache.commons.lang3.StringUtils;
import org.cryptomator.cryptolib.api.FileHeader;
public class CryptoTouchFeature implements Touch {
@@ -60,8 +60,11 @@ public void setResponse(final PathAttributes attributes) {
}
@Override
- public boolean isSupported(final Path workdir, final String filename) {
- return proxy.isSupported(workdir, StringUtils.EMPTY) && vault.getFilenameProvider().isValid(filename);
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ if(!vault.getFilenameProvider().isValid(filename)) {
+ throw new InvalidFilenameException();
+ }
+ proxy.preflight(workdir, filename);
}
@Override
diff --git a/cryptomator/src/test/java/ch/cyberduck/core/cryptomator/CryptoVaultTest.java b/cryptomator/src/test/java/ch/cyberduck/core/cryptomator/CryptoVaultTest.java
index 210096a7f05..2c688b35210 100644
--- a/cryptomator/src/test/java/ch/cyberduck/core/cryptomator/CryptoVaultTest.java
+++ b/cryptomator/src/test/java/ch/cyberduck/core/cryptomator/CryptoVaultTest.java
@@ -454,11 +454,6 @@ public Path mkdir(final Path folder, final TransferStatus status) {
return folder;
}
- @Override
- public boolean isSupported(final Path workdir, final String name) {
- throw new UnsupportedOperationException();
- }
-
@Override
public Directory withWriter(final Write writer) {
return this;
@@ -509,11 +504,6 @@ public Path mkdir(final Path folder, final TransferStatus status) {
return folder;
}
- @Override
- public boolean isSupported(final Path workdir, final String name) {
- throw new UnsupportedOperationException();
- }
-
@Override
public Directory withWriter(final Write writer) {
return this;
diff --git a/ctera/src/main/java/ch/cyberduck/core/ctera/CteraDirectoryFeature.java b/ctera/src/main/java/ch/cyberduck/core/ctera/CteraDirectoryFeature.java
index a6527e818a6..afed0537a39 100644
--- a/ctera/src/main/java/ch/cyberduck/core/ctera/CteraDirectoryFeature.java
+++ b/ctera/src/main/java/ch/cyberduck/core/ctera/CteraDirectoryFeature.java
@@ -17,6 +17,8 @@
import ch.cyberduck.core.Path;
import ch.cyberduck.core.dav.DAVDirectoryFeature;
+import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
public class CteraDirectoryFeature extends DAVDirectoryFeature {
@@ -25,10 +27,9 @@ public CteraDirectoryFeature(final CteraSession session) {
}
@Override
- public boolean isSupported(final Path workdir, final String name) {
- if(!CteraTouchFeature.validate(name)) {
- return false;
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ if(!CteraTouchFeature.validate(filename)) {
+ throw new InvalidFilenameException();
}
- return super.isSupported(workdir, name);
}
}
diff --git a/ctera/src/main/java/ch/cyberduck/core/ctera/CteraMoveFeature.java b/ctera/src/main/java/ch/cyberduck/core/ctera/CteraMoveFeature.java
index 6b6e27f9898..10a8def8abe 100644
--- a/ctera/src/main/java/ch/cyberduck/core/ctera/CteraMoveFeature.java
+++ b/ctera/src/main/java/ch/cyberduck/core/ctera/CteraMoveFeature.java
@@ -15,8 +15,13 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.dav.DAVMoveFeature;
+import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
+
+import java.text.MessageFormat;
public class CteraMoveFeature extends DAVMoveFeature {
@@ -25,10 +30,9 @@ public CteraMoveFeature(final CteraSession session) {
}
@Override
- public boolean isSupported(final Path source, final Path target) {
+ public void preflight(final Path source, final Path target) throws BackgroundException {
if(!CteraTouchFeature.validate(target.getName())) {
- return false;
+ throw new InvalidFilenameException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(source);
}
- return super.isSupported(source, target);
}
}
diff --git a/ctera/src/main/java/ch/cyberduck/core/ctera/CteraTouchFeature.java b/ctera/src/main/java/ch/cyberduck/core/ctera/CteraTouchFeature.java
index fdb4ce69f50..4d9c2855873 100644
--- a/ctera/src/main/java/ch/cyberduck/core/ctera/CteraTouchFeature.java
+++ b/ctera/src/main/java/ch/cyberduck/core/ctera/CteraTouchFeature.java
@@ -17,6 +17,8 @@
import ch.cyberduck.core.Path;
import ch.cyberduck.core.dav.DAVTouchFeature;
+import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
@@ -30,11 +32,10 @@ public CteraTouchFeature(final CteraSession session) {
}
@Override
- public boolean isSupported(final Path workdir, final String filename) {
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
if(!validate(filename)) {
- return false;
+ throw new InvalidFilenameException();
}
- return super.isSupported(workdir, filename);
}
public static boolean validate(final String filename) {
diff --git a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSBatchDeleteFeature.java b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSBatchDeleteFeature.java
index 2c245f12f2b..ea28bdb7389 100644
--- a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSBatchDeleteFeature.java
+++ b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSBatchDeleteFeature.java
@@ -87,11 +87,6 @@ public void delete(final Map files, final PasswordCallback
}
}
- @Override
- public boolean isSupported(final Path file) {
- return new SDSDeleteFeature(session, nodeid).isSupported(file);
- }
-
@Override
public boolean isRecursive() {
return true;
diff --git a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSCopyFeature.java b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSCopyFeature.java
index b1f6cc71241..bef6b31589d 100644
--- a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSCopyFeature.java
+++ b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSCopyFeature.java
@@ -16,10 +16,12 @@
*/
import ch.cyberduck.core.ConnectionCallback;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathAttributes;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Copy;
import ch.cyberduck.core.io.StreamListener;
import ch.cyberduck.core.preferences.HostPreferences;
@@ -33,6 +35,7 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import java.text.MessageFormat;
import java.util.Objects;
public class SDSCopyFeature implements Copy {
@@ -77,27 +80,26 @@ public boolean isRecursive(final Path source, final Path target) {
}
@Override
- public boolean isSupported(final Path source, final Path target) {
+ public void preflight(final Path source, final Path target) throws BackgroundException {
if(containerService.isContainer(source)) {
// Rooms cannot be copied
- return false;
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
}
if(SDSAttributesAdapter.isEncrypted(source.attributes()) ^ SDSAttributesAdapter.isEncrypted(containerService.getContainer(target).attributes())) {
// If source xor target is encrypted data room we cannot use server side copy
log.warn(String.format("Cannot use server side copy with source container %s and target container %s",
containerService.getContainer(source), containerService.getContainer(target)));
- return false;
+ throw new UnsupportedException();
}
if(!StringUtils.equals(source.getName(), target.getName())) {
// Cannot rename node to be copied at the same time
log.warn(String.format("Deny copy of %s for changed name %s", source, target.getName()));
- return false;
+ throw new UnsupportedException();
}
if(Objects.equals(source.getParent(), target.getParent())) {
// Nodes must not have the same parent
log.warn(String.format("Deny copy of %s to %s", source, target));
- return false;
+ throw new UnsupportedException();
}
- return true;
}
}
diff --git a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDelegatingCopyFeature.java b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDelegatingCopyFeature.java
index 199f0b97aed..b3f7b7732f1 100644
--- a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDelegatingCopyFeature.java
+++ b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDelegatingCopyFeature.java
@@ -57,18 +57,10 @@ public Path copy(final Path source, final Path target, final TransferStatus stat
}
@Override
- public boolean isRecursive(final Path source, final Path target) {
+ public void preflight(final Path source, final Path target) throws BackgroundException {
if(proxy.isSupported(source, target)) {
- return proxy.isRecursive(source, target);
+ proxy.preflight(source, target);
}
- return copy.isRecursive(source, target);
- }
-
- @Override
- public boolean isSupported(final Path source, final Path target) {
- if(proxy.isSupported(source, target)) {
- return true;
- }
- return copy.isSupported(source, target);
+ copy.preflight(source, target);
}
}
diff --git a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDelegatingMoveFeature.java b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDelegatingMoveFeature.java
index aea5eba1183..36f035e312b 100644
--- a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDelegatingMoveFeature.java
+++ b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDelegatingMoveFeature.java
@@ -85,11 +85,13 @@ public boolean isRecursive(final Path source, final Path target) {
}
@Override
- public boolean isSupported(final Path source, final Path target) {
+ public void preflight(final Path source, final Path target) throws BackgroundException {
if(SDSAttributesAdapter.isEncrypted(source.attributes()) ^ SDSAttributesAdapter.isEncrypted(containerService.getContainer(target).attributes())) {
- return session.getFeature(Copy.class).isSupported(source, target);
+ session.getFeature(Copy.class).preflight(source, target);
+ }
+ else {
+ proxy.preflight(source, target);
}
- return proxy.isSupported(source, target);
}
@Override
diff --git a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDelegatingWriteFeature.java b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDelegatingWriteFeature.java
index 33ec5462e71..060e607e407 100644
--- a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDelegatingWriteFeature.java
+++ b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDelegatingWriteFeature.java
@@ -83,4 +83,9 @@ public ChecksumCompute checksum(final Path file, final TransferStatus status) {
}
return proxy.checksum(file, status);
}
+
+ @Override
+ public void preflight(final Path file) throws BackgroundException {
+ new SDSTouchFeature(session, nodeid).preflight(file.getParent(), file.getName());
+ }
}
diff --git a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDirectoryFeature.java b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDirectoryFeature.java
index fc3754c2930..f3dced0a749 100644
--- a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDirectoryFeature.java
+++ b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSDirectoryFeature.java
@@ -15,10 +15,13 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.VersionId;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.features.Directory;
import ch.cyberduck.core.features.Write;
import ch.cyberduck.core.preferences.HostPreferences;
@@ -101,18 +104,20 @@ protected Path createRoom(final Path room, final boolean encrypt) throws Backgro
}
@Override
- public boolean isSupported(final Path workdir, final String name) {
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
if(workdir.isRoot()) {
if(!new HostPreferences(session.getHost()).getBoolean("sds.create.dataroom.enable")) {
- log.warn(String.format("Disallow creating new top level data room %s", name));
- return false;
+ log.warn(String.format("Disallow creating new top level data room %s", filename));
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
}
}
- if(!SDSTouchFeature.validate(name)) {
- log.warn(String.format("Validation failed for target name %s", name));
- return false;
+ if(!SDSTouchFeature.validate(filename)) {
+ throw new InvalidFilenameException();
+ }
+ final SDSPermissionsFeature permissions = new SDSPermissionsFeature(session, nodeid);
+ if(!permissions.containsRole(workdir, SDSPermissionsFeature.CREATE_ROLE)) {
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
}
- return new SDSPermissionsFeature(session, nodeid).containsRole(workdir, SDSPermissionsFeature.CREATE_ROLE);
}
@Override
diff --git a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSMoveFeature.java b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSMoveFeature.java
index 23dfddf8901..b0c28e478b0 100644
--- a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSMoveFeature.java
+++ b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSMoveFeature.java
@@ -17,12 +17,15 @@
import ch.cyberduck.core.CaseInsensitivePathPredicate;
import ch.cyberduck.core.ConnectionCallback;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathAttributes;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.SimplePathPredicate;
-import ch.cyberduck.core.Version;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.features.Move;
import ch.cyberduck.core.preferences.HostPreferences;
@@ -31,7 +34,6 @@
import ch.cyberduck.core.sds.io.swagger.client.model.MoveNode;
import ch.cyberduck.core.sds.io.swagger.client.model.MoveNodesRequest;
import ch.cyberduck.core.sds.io.swagger.client.model.Node;
-import ch.cyberduck.core.sds.io.swagger.client.model.SoftwareVersionData;
import ch.cyberduck.core.sds.io.swagger.client.model.UpdateFileRequest;
import ch.cyberduck.core.sds.io.swagger.client.model.UpdateFolderRequest;
import ch.cyberduck.core.sds.io.swagger.client.model.UpdateRoomRequest;
@@ -41,9 +43,8 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import java.text.MessageFormat;
import java.util.Collections;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
public class SDSMoveFeature implements Move {
private static final Logger log = LogManager.getLogger(SDSMoveFeature.class);
@@ -114,22 +115,22 @@ public boolean isRecursive(final Path source, final Path target) {
}
@Override
- public boolean isSupported(final Path source, final Path target) {
+ public void preflight(final Path source, final Path target) throws BackgroundException {
if(containerService.isContainer(source)) {
if(!new SimplePathPredicate(source.getParent()).test(target.getParent())) {
// Cannot move data room but only rename
log.warn(String.format("Deny moving data room %s", source));
- return false;
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(source);
}
}
if(target.getParent().isRoot() && !source.getParent().isRoot()) {
// Cannot move file or directory to root but only rename data rooms
log.warn(String.format("Deny moving file %s to root", source));
- return false;
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(source);
}
if(!SDSTouchFeature.validate(target.getName())) {
log.warn(String.format("Validation failed for target name %s", target));
- return false;
+ throw new InvalidFilenameException().withFile(target);
}
final SDSPermissionsFeature acl = new SDSPermissionsFeature(session, nodeid);
if(!new SimplePathPredicate(source.getParent()).test(target.getParent())) {
@@ -137,41 +138,23 @@ public boolean isSupported(final Path source, final Path target) {
if(!acl.containsRole(containerService.getContainer(source), SDSPermissionsFeature.CHANGE_ROLE)) {
log.warn(String.format("Deny move of %s to %s changing parent node with missing role %s on data room %s",
source, target, SDSPermissionsFeature.CHANGE_ROLE, containerService.getContainer(source)));
- return false;
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(source);
}
if(!acl.containsRole(containerService.getContainer(source), SDSPermissionsFeature.DELETE_ROLE)) {
log.warn(String.format("Deny move of %s to %s changing parent node with missing role %s on data room %s",
source, target, SDSPermissionsFeature.DELETE_ROLE, containerService.getContainer(source)));
- return false;
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(source);
}
if(!acl.containsRole(containerService.getContainer(target), SDSPermissionsFeature.CREATE_ROLE)) {
log.warn(String.format("Deny move of %s to %s changing parent node with missing role %s on data room %s",
source, target, SDSPermissionsFeature.CREATE_ROLE, containerService.getContainer(target)));
- return false;
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(source);
}
}
if(!acl.containsRole(containerService.getContainer(source), SDSPermissionsFeature.CHANGE_ROLE)) {
log.warn(String.format("Deny move of %s to %s with missing permissions for user with missing role %s on data room %s",
source, target, SDSPermissionsFeature.CHANGE_ROLE, containerService.getContainer(source)));
- return false;
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(source);
}
- if(!StringUtils.equals(source.getName(), target.getName())) {
- if(new CaseInsensitivePathPredicate(source).test(target)) {
- try {
- final SoftwareVersionData version = session.softwareVersion();
- final Matcher matcher = Pattern.compile(SDSSession.VERSION_REGEX).matcher(version.getRestApiVersion());
- if(matcher.matches()) {
- if(new Version(matcher.group(1)).compareTo(new Version("4.14")) < 0) {
- // SDS-1055
- return false;
- }
- }
- }
- catch(BackgroundException e) {
- log.warn(String.format("Ignore failure %s determining version", e));
- }
- }
- }
- return true;
}
}
diff --git a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSReadFeature.java b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSReadFeature.java
index b782f7f6d5d..d10c7aa8f54 100644
--- a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSReadFeature.java
+++ b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSReadFeature.java
@@ -18,6 +18,8 @@
import ch.cyberduck.core.ConnectionCallback;
import ch.cyberduck.core.DefaultIOExceptionMappingService;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.PathAttributes;
+import ch.cyberduck.core.exception.AntiVirusAccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.features.Read;
import ch.cyberduck.core.http.DefaultHttpResponseExceptionMappingService;
@@ -96,4 +98,15 @@ public InputStream read(final Path file, final TransferStatus status, final Conn
throw new DefaultIOExceptionMappingService().map("Download {0} failed", e, file);
}
}
+
+ @Override
+ public void preflight(final Path file) throws BackgroundException {
+ final PathAttributes attr = file.attributes();
+ if(null != attr.getVerdict()) {
+ switch(attr.getVerdict()) {
+ case malicious:
+ throw new AntiVirusAccessDeniedException().withFile(file);
+ }
+ }
+ }
}
diff --git a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSThresholdDeleteFeature.java b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSThresholdDeleteFeature.java
index 288ad632d2a..2453c11b7f2 100644
--- a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSThresholdDeleteFeature.java
+++ b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSThresholdDeleteFeature.java
@@ -15,14 +15,17 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.PasswordCallback;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathContainerService;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.preferences.HostPreferences;
import ch.cyberduck.core.transfer.TransferStatus;
+import java.text.MessageFormat;
import java.util.Map;
public class SDSThresholdDeleteFeature implements Delete {
@@ -53,16 +56,19 @@ public boolean isRecursive() {
}
@Override
- public boolean isSupported(final Path file) {
+ public void preflight(final Path file) throws BackgroundException {
+ final SDSPermissionsFeature permissions = new SDSPermissionsFeature(session, nodeid);
if(containerService.isContainer(file)) {
if(new HostPreferences(session.getHost()).getBoolean("sds.delete.dataroom.enable")) {
// Need the query permission on the parent data room if file itself is subroom
- return new SDSPermissionsFeature(session, nodeid).containsRole(containerService.getContainer(file.getParent()),
- SDSPermissionsFeature.MANAGE_ROLE);
+ if(!new SDSPermissionsFeature(session, nodeid).containsRole(containerService.getContainer(file.getParent()), SDSPermissionsFeature.MANAGE_ROLE)) {
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"), file)).withFile(file);
+ }
}
- return false;
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"), file)).withFile(file);
+ }
+ if(!permissions.containsRole(file, SDSPermissionsFeature.DELETE_ROLE)) {
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"), file)).withFile(file);
}
- return new SDSPermissionsFeature(session, nodeid).containsRole(file, SDSPermissionsFeature.DELETE_ROLE);
}
-
}
diff --git a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSTouchFeature.java b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSTouchFeature.java
index 0e9f882ae91..88fb1057345 100644
--- a/dracoon/src/main/java/ch/cyberduck/core/sds/SDSTouchFeature.java
+++ b/dracoon/src/main/java/ch/cyberduck/core/sds/SDSTouchFeature.java
@@ -15,9 +15,13 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathContainerService;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
+import ch.cyberduck.core.exception.QuotaException;
import ch.cyberduck.core.preferences.HostPreferences;
import ch.cyberduck.core.sds.io.swagger.client.model.Node;
import ch.cyberduck.core.shared.DefaultTouchFeature;
@@ -54,24 +58,25 @@ public Path touch(final Path file, final TransferStatus status) throws Backgroun
}
@Override
- public boolean isSupported(final Path workdir, final String filename) {
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
if(workdir.isRoot()) {
- return false;
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
}
if(!validate(filename)) {
- log.warn(String.format("Validation failed for target name %s", filename));
- return false;
+ throw new InvalidFilenameException();
+ }
+ final SDSPermissionsFeature permissions = new SDSPermissionsFeature(session, nodeid);
+ if(!permissions.containsRole(workdir, SDSPermissionsFeature.CREATE_ROLE)
+ // For existing files the delete role is also required to overwrite
+ || !permissions.containsRole(workdir, SDSPermissionsFeature.DELETE_ROLE)) {
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
}
if(workdir.attributes().getQuota() != -1) {
if(workdir.attributes().getQuota() <= workdir.attributes().getSize() + new HostPreferences(session.getHost()).getInteger("sds.upload.multipart.chunksize")) {
log.warn(String.format("Quota %d exceeded with %d in %s", workdir.attributes().getQuota(), workdir.attributes().getSize(), workdir));
- return false;
+ throw new QuotaException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
}
}
- final SDSPermissionsFeature permissions = new SDSPermissionsFeature(session, nodeid);
- return permissions.containsRole(workdir, SDSPermissionsFeature.CREATE_ROLE)
- // For existing files the delete role is also required to overwrite
- && permissions.containsRole(workdir, SDSPermissionsFeature.DELETE_ROLE);
}
/**
diff --git a/dracoon/src/test/java/ch/cyberduck/core/sds/SDSTouchFeatureTest.java b/dracoon/src/test/java/ch/cyberduck/core/sds/SDSTouchFeatureTest.java
index f7f04361a31..d0d785885cb 100644
--- a/dracoon/src/test/java/ch/cyberduck/core/sds/SDSTouchFeatureTest.java
+++ b/dracoon/src/test/java/ch/cyberduck/core/sds/SDSTouchFeatureTest.java
@@ -23,6 +23,7 @@
import ch.cyberduck.core.PathAttributes;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.exception.InteroperabilityException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.http.HttpResponseOutputStream;
import ch.cyberduck.core.io.StreamCopier;
@@ -75,7 +76,10 @@ public void testInvalidName() throws Exception {
final Path room = new SDSDirectoryFeature(session, nodeid).mkdir(
new Path(new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.directory, Path.Type.volume)), new TransferStatus());
try {
- new SDSTouchFeature(session, nodeid).touch(new Path(room, "CON", EnumSet.of(Path.Type.file)), new TransferStatus());
+ final SDSTouchFeature feature = new SDSTouchFeature(session, nodeid);
+ assertFalse(feature.isSupported(room, "?"));
+ assertThrows(InvalidFilenameException.class, () -> feature.preflight(room, "?"));
+ feature.touch(new Path(room, "CON", EnumSet.of(Path.Type.file)), new TransferStatus());
}
catch(InteroperabilityException e) {
assertEquals("Error -40755. Illegal file name='CON'. Please contact your web hosting service provider for assistance.", e.getDetail());
@@ -92,7 +96,10 @@ public void testInvalidCharacter() throws Exception {
final Path room = new SDSDirectoryFeature(session, nodeid).mkdir(
new Path(new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.directory, Path.Type.volume)), new TransferStatus());
try {
- new SDSTouchFeature(session, nodeid).touch(new Path(room, "?", EnumSet.of(Path.Type.file)), new TransferStatus());
+ final SDSTouchFeature feature = new SDSTouchFeature(session, nodeid);
+ assertFalse(feature.isSupported(room, "?"));
+ assertThrows(InvalidFilenameException.class, () -> feature.preflight(room, "?"));
+ feature.touch(new Path(room, "?", EnumSet.of(Path.Type.file)), new TransferStatus());
}
catch(InteroperabilityException e) {
assertEquals("Error -40755. Illegal file name='?'. Please contact your web hosting service provider for assistance.", e.getDetail());
diff --git a/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxBatchDeleteFeature.java b/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxBatchDeleteFeature.java
index a88eaa7f478..948c9350783 100644
--- a/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxBatchDeleteFeature.java
+++ b/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxBatchDeleteFeature.java
@@ -15,11 +15,13 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.PasswordCallback;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.exception.InteroperabilityException;
import ch.cyberduck.core.exception.NotfoundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.preferences.HostPreferences;
import ch.cyberduck.core.threading.LoggingUncaughtExceptionHandler;
@@ -27,6 +29,7 @@
import ch.cyberduck.core.transfer.TransferStatus;
import ch.cyberduck.core.worker.DefaultExceptionMappingService;
+import java.text.MessageFormat;
import java.time.Duration;
import java.util.ArrayList;
import java.util.HashMap;
@@ -145,7 +148,9 @@ public boolean isRecursive() {
}
@Override
- public boolean isSupported(final Path file) {
- return !file.attributes().isDuplicate();
+ public void preflight(final Path file) throws BackgroundException {
+ if(file.attributes().isDuplicate()) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"), file)).withFile(file);
+ }
}
}
diff --git a/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxDeleteFeature.java b/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxDeleteFeature.java
index dba3d96aefc..9016d7d2c85 100644
--- a/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxDeleteFeature.java
+++ b/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxDeleteFeature.java
@@ -15,13 +15,16 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.PasswordCallback;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.transfer.TransferStatus;
+import java.text.MessageFormat;
import java.util.Map;
import com.dropbox.core.DbxException;
@@ -63,7 +66,9 @@ public boolean isRecursive() {
}
@Override
- public boolean isSupported(final Path file) {
- return !file.attributes().isDuplicate();
+ public void preflight(final Path file) throws BackgroundException {
+ if(file.attributes().isDuplicate()) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"), file)).withFile(file);
+ }
}
}
diff --git a/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxDirectoryFeature.java b/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxDirectoryFeature.java
index 460694ebc4f..cfea24a3c53 100644
--- a/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxDirectoryFeature.java
+++ b/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxDirectoryFeature.java
@@ -18,6 +18,7 @@
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.features.Directory;
import ch.cyberduck.core.features.Write;
import ch.cyberduck.core.transfer.TransferStatus;
@@ -49,8 +50,10 @@ public Path mkdir(final Path folder, final TransferStatus status) throws Backgro
}
@Override
- public boolean isSupported(final Path workdir, final String name) {
- return new DropboxTouchFeature(session).isSupported(workdir, name);
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ if(!DropboxTouchFeature.validate(filename)) {
+ throw new InvalidFilenameException();
+ }
}
@Override
diff --git a/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxMoveFeature.java b/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxMoveFeature.java
index 20fb3cd0349..1d8940718a8 100644
--- a/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxMoveFeature.java
+++ b/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxMoveFeature.java
@@ -64,9 +64,4 @@ public Path move(final Path file, final Path renamed, final TransferStatus statu
public boolean isRecursive(final Path source, final Path target) {
return true;
}
-
- @Override
- public boolean isSupported(final Path source, final Path target) {
- return true;
- }
}
diff --git a/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxThresholdDeleteFeature.java b/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxThresholdDeleteFeature.java
index 5247f3e026c..6bd4ae23e25 100644
--- a/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxThresholdDeleteFeature.java
+++ b/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxThresholdDeleteFeature.java
@@ -15,12 +15,15 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.PasswordCallback;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.transfer.TransferStatus;
+import java.text.MessageFormat;
import java.util.Map;
public class DropboxThresholdDeleteFeature implements Delete {
@@ -47,7 +50,9 @@ public boolean isRecursive() {
}
@Override
- public boolean isSupported(final Path file) {
- return !file.attributes().isDuplicate();
+ public void preflight(final Path file) throws BackgroundException {
+ if(file.attributes().isDuplicate()) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"), file)).withFile(file);
+ }
}
}
diff --git a/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxTouchFeature.java b/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxTouchFeature.java
index f76465c732d..34872831797 100644
--- a/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxTouchFeature.java
+++ b/dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxTouchFeature.java
@@ -16,6 +16,8 @@
*/
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.shared.DefaultTouchFeature;
import org.apache.commons.lang3.StringUtils;
@@ -34,10 +36,16 @@ public DropboxTouchFeature(final DropboxSession session) {
*
* @param workdir Working directory
* @param filename Filename
- * @return False if restricted filename
+ * @throws InvalidFilenameException If restricted filename
*/
@Override
- public boolean isSupported(final Path workdir, final String filename) {
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ if(!validate(filename)) {
+ throw new InvalidFilenameException();
+ }
+ }
+
+ public static boolean validate(final String filename) {
if(StringUtils.startsWith(filename, "~$")) {
return false;
}
diff --git a/eue/src/main/java/ch/cyberduck/core/eue/EueCopyFeature.java b/eue/src/main/java/ch/cyberduck/core/eue/EueCopyFeature.java
index e61b06789ad..434d0acd01f 100644
--- a/eue/src/main/java/ch/cyberduck/core/eue/EueCopyFeature.java
+++ b/eue/src/main/java/ch/cyberduck/core/eue/EueCopyFeature.java
@@ -30,6 +30,7 @@
import ch.cyberduck.core.eue.io.swagger.client.model.ResourceUpdateModelUpdate;
import ch.cyberduck.core.eue.io.swagger.client.model.Uifs;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.features.Copy;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.io.StreamListener;
@@ -132,8 +133,10 @@ public Path copy(final Path file, final Path target, final TransferStatus status
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return new EueTouchFeature(session, fileid).isSupported(target.getParent(), target.getName());
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ if(!EueTouchFeature.validate(target.getName())) {
+ throw new InvalidFilenameException();
+ }
}
@Override
diff --git a/eue/src/main/java/ch/cyberduck/core/eue/EueDeleteFeature.java b/eue/src/main/java/ch/cyberduck/core/eue/EueDeleteFeature.java
index f5fa1a0fa61..d96b3b9695d 100644
--- a/eue/src/main/java/ch/cyberduck/core/eue/EueDeleteFeature.java
+++ b/eue/src/main/java/ch/cyberduck/core/eue/EueDeleteFeature.java
@@ -15,11 +15,13 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.PasswordCallback;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.eue.io.swagger.client.ApiException;
import ch.cyberduck.core.eue.io.swagger.client.api.DeleteResourceApi;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.transfer.TransferStatus;
@@ -27,6 +29,7 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import java.text.MessageFormat;
import java.util.List;
import java.util.Map;
@@ -66,16 +69,12 @@ protected void delete(final List resources) throws ApiException {
}
@Override
- public boolean isSupported(final Path file) {
- if(StringUtils.equals(EueResourceIdProvider.TRASH, file.attributes().getFileId())
- || StringUtils.equals(session.getHost().getProperty("cryptomator.vault.name.default"), file.getName())) {
- return false;
+ public void preflight(final Path file) throws BackgroundException {
+ if(StringUtils.equals(EueResourceIdProvider.TRASH, file.attributes().getFileId())) {
+ throw new InvalidFilenameException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"), file)).withFile(file);
+ }
+ else if(StringUtils.equals(session.getHost().getProperty("cryptomator.vault.name.default"), file.getName())) {
+ throw new InvalidFilenameException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"), file)).withFile(file);
}
- return true;
- }
-
- @Override
- public boolean isRecursive() {
- return true;
}
}
diff --git a/eue/src/main/java/ch/cyberduck/core/eue/EueDirectoryFeature.java b/eue/src/main/java/ch/cyberduck/core/eue/EueDirectoryFeature.java
index c0dda0a2ae4..56ecf1aadd6 100644
--- a/eue/src/main/java/ch/cyberduck/core/eue/EueDirectoryFeature.java
+++ b/eue/src/main/java/ch/cyberduck/core/eue/EueDirectoryFeature.java
@@ -24,6 +24,7 @@
import ch.cyberduck.core.eue.io.swagger.client.model.ResourceCreationResponseEntryEntity;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.exception.ConflictException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.exception.NotfoundException;
import ch.cyberduck.core.features.Directory;
import ch.cyberduck.core.features.Write;
@@ -86,8 +87,10 @@ public Path mkdir(final Path folder, final TransferStatus status) throws Backgro
}
@Override
- public boolean isSupported(final Path workdir, final String name) {
- return new EueTouchFeature(session, fileid).isSupported(workdir, name);
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ if(!EueTouchFeature.validate(filename)) {
+ throw new InvalidFilenameException();
+ }
}
@Override
diff --git a/eue/src/main/java/ch/cyberduck/core/eue/EueMoveFeature.java b/eue/src/main/java/ch/cyberduck/core/eue/EueMoveFeature.java
index 05b312f5445..ff8e6c530c9 100644
--- a/eue/src/main/java/ch/cyberduck/core/eue/EueMoveFeature.java
+++ b/eue/src/main/java/ch/cyberduck/core/eue/EueMoveFeature.java
@@ -18,6 +18,7 @@
import ch.cyberduck.core.CaseInsensitivePathPredicate;
import ch.cyberduck.core.ConnectionCallback;
import ch.cyberduck.core.DisabledListProgressListener;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.SimplePathPredicate;
import ch.cyberduck.core.eue.io.swagger.client.ApiException;
@@ -31,6 +32,7 @@
import ch.cyberduck.core.eue.io.swagger.client.model.ResourceUpdateModelUpdate;
import ch.cyberduck.core.eue.io.swagger.client.model.Uifs;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.features.Move;
import ch.cyberduck.core.transfer.TransferStatus;
@@ -40,6 +42,7 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import java.text.MessageFormat;
import java.util.Collections;
public class EueMoveFeature implements Move {
@@ -140,14 +143,16 @@ public Path move(final Path file, final Path target, final TransferStatus status
}
@Override
- public boolean isSupported(final Path source, final Path target) {
+ public void preflight(final Path source, final Path target) throws BackgroundException {
if(StringUtils.equals(EueResourceIdProvider.TRASH, source.attributes().getFileId())) {
- return false;
+ throw new InvalidFilenameException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(source);
}
if(StringUtils.equals(session.getHost().getProperty("cryptomator.vault.name.default"), source.getName())) {
- return false;
+ throw new InvalidFilenameException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(source);
+ }
+ if(!EueTouchFeature.validate(target.getName())) {
+ throw new InvalidFilenameException();
}
- return new EueTouchFeature(session, fileid).isSupported(target.getParent(), target.getName());
}
@Override
diff --git a/eue/src/main/java/ch/cyberduck/core/eue/EueTouchFeature.java b/eue/src/main/java/ch/cyberduck/core/eue/EueTouchFeature.java
index 38b16cf425a..b4c4fd1e69e 100644
--- a/eue/src/main/java/ch/cyberduck/core/eue/EueTouchFeature.java
+++ b/eue/src/main/java/ch/cyberduck/core/eue/EueTouchFeature.java
@@ -17,6 +17,7 @@
import ch.cyberduck.core.Path;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.shared.DefaultTouchFeature;
import ch.cyberduck.core.transfer.TransferStatus;
@@ -39,7 +40,13 @@ public Path touch(final Path file, final TransferStatus status) throws Backgroun
}
@Override
- public boolean isSupported(final Path workdir, final String filename) {
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ if(!validate(filename)) {
+ throw new InvalidFilenameException();
+ }
+ }
+
+ public static boolean validate(final String filename) {
// The path may contain all characters except the following: /, ", >, <, ?, *, :, \, |.
// Also prohibited is a trailing space or a trailing dot (" ", ".").
if(StringUtils.containsAny(filename, '\\', '<', '>', ':', '"', '|', '?', '*', '/')) {
diff --git a/eue/src/main/java/ch/cyberduck/core/eue/EueTrashFeature.java b/eue/src/main/java/ch/cyberduck/core/eue/EueTrashFeature.java
index 26c460d01ef..a80ce60bc7c 100644
--- a/eue/src/main/java/ch/cyberduck/core/eue/EueTrashFeature.java
+++ b/eue/src/main/java/ch/cyberduck/core/eue/EueTrashFeature.java
@@ -15,6 +15,7 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.PasswordCallback;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.collections.Partition;
@@ -24,6 +25,7 @@
import ch.cyberduck.core.eue.io.swagger.client.model.ResourceMoveResponseEntries;
import ch.cyberduck.core.eue.io.swagger.client.model.ResourceMoveResponseEntry;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.features.Trash;
import ch.cyberduck.core.preferences.HostPreferences;
import ch.cyberduck.core.transfer.TransferStatus;
@@ -33,6 +35,7 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -111,12 +114,13 @@ protected List trash(final Map files, final Passwo
}
@Override
- public boolean isSupported(final Path file) {
- if(StringUtils.equals(EueResourceIdProvider.TRASH, file.attributes().getFileId())
- || StringUtils.equals(session.getHost().getProperty("cryptomator.vault.name.default"), file.getName())) {
- return false;
+ public void preflight(final Path file) throws BackgroundException {
+ if(StringUtils.equals(EueResourceIdProvider.TRASH, file.attributes().getFileId())) {
+ throw new InvalidFilenameException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"), file)).withFile(file);
+ }
+ else if(StringUtils.equals(session.getHost().getProperty("cryptomator.vault.name.default"), file.getName())) {
+ throw new InvalidFilenameException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"), file)).withFile(file);
}
- return true;
}
@Override
diff --git a/ftp/src/main/java/ch/cyberduck/core/ftp/FTPDeleteFeature.java b/ftp/src/main/java/ch/cyberduck/core/ftp/FTPDeleteFeature.java
index 37609d27760..05be085cdfd 100644
--- a/ftp/src/main/java/ch/cyberduck/core/ftp/FTPDeleteFeature.java
+++ b/ftp/src/main/java/ch/cyberduck/core/ftp/FTPDeleteFeature.java
@@ -62,7 +62,7 @@ else if(file.isDirectory()) {
}
@Override
- public boolean isSupported(final Path file) {
- return true;
+ public void preflight(final Path file) {
+ // Skip checking permission mask
}
}
diff --git a/ftp/src/main/java/ch/cyberduck/core/ftp/FTPDirectoryFeature.java b/ftp/src/main/java/ch/cyberduck/core/ftp/FTPDirectoryFeature.java
index 546fbe017ee..e05b11f0ed0 100644
--- a/ftp/src/main/java/ch/cyberduck/core/ftp/FTPDirectoryFeature.java
+++ b/ftp/src/main/java/ch/cyberduck/core/ftp/FTPDirectoryFeature.java
@@ -57,8 +57,8 @@ public Path mkdir(final Path folder, final TransferStatus status) throws Backgro
}
@Override
- public boolean isSupported(final Path workdir, final String name) {
- return true;
+ public void preflight(final Path workdir, final String filename) {
+ // Skip checking permission mask
}
@Override
diff --git a/ftp/src/main/java/ch/cyberduck/core/ftp/FTPMoveFeature.java b/ftp/src/main/java/ch/cyberduck/core/ftp/FTPMoveFeature.java
index 325bd595d01..9cffadcf02b 100644
--- a/ftp/src/main/java/ch/cyberduck/core/ftp/FTPMoveFeature.java
+++ b/ftp/src/main/java/ch/cyberduck/core/ftp/FTPMoveFeature.java
@@ -61,7 +61,7 @@ public boolean isRecursive(final Path source, final Path target) {
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return true;
+ public void preflight(final Path source, final Path target) {
+ // Skip checking permission mask
}
}
diff --git a/ftp/src/main/java/ch/cyberduck/core/ftp/FTPTouchFeature.java b/ftp/src/main/java/ch/cyberduck/core/ftp/FTPTouchFeature.java
index e004710e9eb..812ada9fdcf 100644
--- a/ftp/src/main/java/ch/cyberduck/core/ftp/FTPTouchFeature.java
+++ b/ftp/src/main/java/ch/cyberduck/core/ftp/FTPTouchFeature.java
@@ -25,7 +25,7 @@ public FTPTouchFeature(final FTPSession session) {
}
@Override
- public boolean isSupported(final Path workdir, final String filename) {
- return true;
+ public void preflight(final Path workdir, final String filename) {
+ // Skip checking permission mask
}
}
diff --git a/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveCopyFeature.java b/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveCopyFeature.java
index e0f2dc30038..9840d595e88 100644
--- a/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveCopyFeature.java
+++ b/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveCopyFeature.java
@@ -16,14 +16,17 @@
*/
import ch.cyberduck.core.ConnectionCallback;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Copy;
import ch.cyberduck.core.io.StreamListener;
import ch.cyberduck.core.preferences.HostPreferences;
import ch.cyberduck.core.transfer.TransferStatus;
import java.io.IOException;
+import java.text.MessageFormat;
import java.util.Collections;
import com.google.api.services.drive.model.File;
@@ -60,14 +63,13 @@ public boolean isRecursive(final Path source, final Path target) {
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- if(target.isRoot()) {
- return false;
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ if(target.getParent().isRoot()) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(target);
}
if(source.isPlaceholder()) {
// Disable for application/vnd.google-apps
- return false;
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
}
- return true;
}
}
diff --git a/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveDirectoryFeature.java b/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveDirectoryFeature.java
index eb536ae612d..0a8581b1157 100644
--- a/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveDirectoryFeature.java
+++ b/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveDirectoryFeature.java
@@ -85,8 +85,9 @@ public DriveDirectoryFeature withWriter(final Write writer) {
return this;
}
+
@Override
- public boolean isSupported(final Path workdir, final String name) {
- return new DriveTouchFeature(session, fileid).isSupported(workdir, name);
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ new DriveTouchFeature(session, fileid).preflight(workdir, filename);
}
}
diff --git a/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveMoveFeature.java b/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveMoveFeature.java
index 70979aabce4..be4c189e185 100644
--- a/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveMoveFeature.java
+++ b/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveMoveFeature.java
@@ -16,9 +16,11 @@
*/
import ch.cyberduck.core.ConnectionCallback;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.SimplePathPredicate;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.features.Move;
import ch.cyberduck.core.preferences.HostPreferences;
@@ -29,6 +31,7 @@
import org.apache.logging.log4j.Logger;
import java.io.IOException;
+import java.text.MessageFormat;
import java.util.Collections;
import com.google.api.services.drive.model.File;
@@ -100,14 +103,13 @@ public boolean isRecursive(final Path source, final Path target) {
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- if(target.isRoot()) {
- return false;
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ if(target.getParent().isRoot()) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(target);
}
if(source.isPlaceholder()) {
// Disable for application/vnd.google-apps
- return false;
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(source);
}
- return true;
}
}
diff --git a/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveThresholdDeleteFeature.java b/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveThresholdDeleteFeature.java
index b559b1d9d04..4287536c8a6 100644
--- a/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveThresholdDeleteFeature.java
+++ b/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveThresholdDeleteFeature.java
@@ -15,12 +15,16 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.PasswordCallback;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.transfer.TransferStatus;
+import java.text.MessageFormat;
import java.util.Map;
public class DriveThresholdDeleteFeature implements Delete {
@@ -49,11 +53,13 @@ public boolean isRecursive() {
}
@Override
- public boolean isSupported(final Path file) {
+ public void preflight(final Path file) throws BackgroundException {
if(file.isPlaceholder()) {
// Disable for application/vnd.google-apps
- return false;
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"), file)).withFile(file);
+ }
+ if(file.getType().contains(Path.Type.shared)) {
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"), file)).withFile(file);
}
- return !file.getType().contains(Path.Type.shared);
}
}
diff --git a/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveTouchFeature.java b/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveTouchFeature.java
index 3d49986ddd1..6b13c9e405a 100644
--- a/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveTouchFeature.java
+++ b/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveTouchFeature.java
@@ -15,9 +15,11 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.SimplePathPredicate;
import ch.cyberduck.core.VersionId;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.exception.ConflictException;
import ch.cyberduck.core.exception.NotfoundException;
@@ -74,13 +76,12 @@ public DriveTouchFeature withWriter(final Write writer) {
}
@Override
- public boolean isSupported(final Path workdir, final String filename) {
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
if(workdir.isRoot()) {
- return false;
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
}
- else if(new SimplePathPredicate(DriveHomeFinderService.SHARED_DRIVES_NAME).test(workdir)) {
- return false;
+ if(new SimplePathPredicate(DriveHomeFinderService.SHARED_DRIVES_NAME).test(workdir)) {
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
}
- return true;
}
}
diff --git a/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveTrashFeature.java b/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveTrashFeature.java
index fa740405fbc..3b6053306ec 100644
--- a/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveTrashFeature.java
+++ b/googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveTrashFeature.java
@@ -15,10 +15,13 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.PasswordCallback;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.SimplePathPredicate;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.preferences.HostPreferences;
import ch.cyberduck.core.transfer.TransferStatus;
@@ -27,6 +30,7 @@
import org.apache.logging.log4j.Logger;
import java.io.IOException;
+import java.text.MessageFormat;
import java.util.Collections;
import java.util.Map;
@@ -75,12 +79,14 @@ public void delete(final Map files, final PasswordCallback
}
@Override
- public boolean isSupported(final Path file) {
+ public void preflight(final Path file) throws BackgroundException {
if(file.isPlaceholder()) {
// Disable for application/vnd.google-apps
- return false;
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"), file)).withFile(file);
+ }
+ if(file.getType().contains(Path.Type.shared)) {
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"), file)).withFile(file);
}
- return !file.getType().contains(Path.Type.shared);
}
@Override
diff --git a/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageCopyFeature.java b/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageCopyFeature.java
index cde1e561baf..89000578acb 100644
--- a/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageCopyFeature.java
+++ b/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageCopyFeature.java
@@ -16,9 +16,11 @@
*/
import ch.cyberduck.core.ConnectionCallback;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Copy;
import ch.cyberduck.core.io.StreamListener;
import ch.cyberduck.core.transfer.TransferStatus;
@@ -26,6 +28,7 @@
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
+import java.text.MessageFormat;
import com.google.api.client.util.DateTime;
import com.google.api.services.storage.Storage;
@@ -78,7 +81,12 @@ public Path copy(final Path source, final Path target, final TransferStatus stat
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return !containerService.isContainer(source) && !containerService.isContainer(target);
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ if(containerService.isContainer(source)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
+ }
+ if(!containerService.isContainer(target)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(target);
+ }
}
}
diff --git a/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageDeleteFeature.java b/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageDeleteFeature.java
index 9d62f349441..58efb8d7dd2 100644
--- a/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageDeleteFeature.java
+++ b/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageDeleteFeature.java
@@ -83,9 +83,4 @@ public void delete(final Map files, final PasswordCallback
}
}
}
-
- @Override
- public boolean isSupported(final Path file) {
- return true;
- }
}
diff --git a/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageDirectoryFeature.java b/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageDirectoryFeature.java
index a16198ce1c6..f71fc731fd5 100644
--- a/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageDirectoryFeature.java
+++ b/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageDirectoryFeature.java
@@ -20,6 +20,7 @@
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.features.Directory;
import ch.cyberduck.core.features.Write;
import ch.cyberduck.core.transfer.TransferStatus;
@@ -76,21 +77,21 @@ public Path mkdir(final Path folder, final TransferStatus status) throws Backgro
}
}
-
@Override
- public boolean isSupported(final Path workdir, final String name) {
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
if(workdir.isRoot()) {
- if(StringUtils.isNotBlank(name)) {
- if(StringUtils.startsWith(name, "goog")) {
- return false;
+ if(StringUtils.isNotBlank(filename)) {
+ if(StringUtils.startsWith(filename, "goog")) {
+ throw new InvalidFilenameException();
+ }
+ if(StringUtils.contains(filename, "google")) {
+ throw new InvalidFilenameException();
}
- if(StringUtils.contains(name, "google")) {
- return false;
+ if(!ServiceUtils.isBucketNameValidDNSName(filename)) {
+ throw new InvalidFilenameException();
}
- return ServiceUtils.isBucketNameValidDNSName(name);
}
}
- return true;
}
@Override
diff --git a/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageMoveFeature.java b/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageMoveFeature.java
index 2809d797dc7..68a6c703cc9 100644
--- a/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageMoveFeature.java
+++ b/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageMoveFeature.java
@@ -43,7 +43,8 @@ public Path move(final Path source, final Path renamed, final TransferStatus sta
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return proxy.isSupported(source, target) && delete.isSupported(source);
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ proxy.preflight(source, target);
+ delete.preflight(source);
}
}
diff --git a/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageTouchFeature.java b/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageTouchFeature.java
index 738bfdc018b..296f95f3f84 100644
--- a/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageTouchFeature.java
+++ b/googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageTouchFeature.java
@@ -15,7 +15,10 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
+import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.shared.DefaultTouchFeature;
import com.google.api.services.storage.model.StorageObject;
@@ -27,8 +30,10 @@ public GoogleStorageTouchFeature(final GoogleStorageSession session) {
}
@Override
- public boolean isSupported(final Path workdir, final String filename) {
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
// Creating files is only possible inside a bucket.
- return !workdir.isRoot();
+ if(workdir.isRoot()) {
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
+ }
}
}
diff --git a/irods/src/main/java/ch/cyberduck/core/irods/IRODSCopyFeature.java b/irods/src/main/java/ch/cyberduck/core/irods/IRODSCopyFeature.java
index 69ffed005fb..e2f5cc52d2e 100644
--- a/irods/src/main/java/ch/cyberduck/core/irods/IRODSCopyFeature.java
+++ b/irods/src/main/java/ch/cyberduck/core/irods/IRODSCopyFeature.java
@@ -78,9 +78,4 @@ public CallbackResponse transferAsksWhetherToForceOperation(final String irodsAb
public boolean isRecursive(final Path source, final Path target) {
return true;
}
-
- @Override
- public boolean isSupported(final Path source, final Path target) {
- return true;
- }
}
diff --git a/manta/src/main/java/ch/cyberduck/core/manta/MantaDeleteFeature.java b/manta/src/main/java/ch/cyberduck/core/manta/MantaDeleteFeature.java
index 7f80b0b6f37..1beae6adc39 100644
--- a/manta/src/main/java/ch/cyberduck/core/manta/MantaDeleteFeature.java
+++ b/manta/src/main/java/ch/cyberduck/core/manta/MantaDeleteFeature.java
@@ -16,13 +16,16 @@
*/
import ch.cyberduck.core.DefaultIOExceptionMappingService;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.PasswordCallback;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.transfer.TransferStatus;
import java.io.IOException;
+import java.text.MessageFormat;
import java.util.Map;
import com.joyent.manta.exception.MantaClientHttpResponseException;
@@ -61,8 +64,10 @@ public void delete(final Map files, final PasswordCallback
}
@Override
- public boolean isSupported(final Path file) {
- return session.isUserWritable(file);
+ public void preflight(final Path file) throws BackgroundException {
+ if(!session.isUserWritable(file)) {
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"), file)).withFile(file);
+ }
}
@Override
diff --git a/manta/src/main/java/ch/cyberduck/core/manta/MantaDirectoryFeature.java b/manta/src/main/java/ch/cyberduck/core/manta/MantaDirectoryFeature.java
index c436ce0cd8b..ef7c523dd43 100644
--- a/manta/src/main/java/ch/cyberduck/core/manta/MantaDirectoryFeature.java
+++ b/manta/src/main/java/ch/cyberduck/core/manta/MantaDirectoryFeature.java
@@ -16,7 +16,9 @@
*/
import ch.cyberduck.core.DefaultIOExceptionMappingService;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.features.Directory;
import ch.cyberduck.core.features.Write;
@@ -53,8 +55,10 @@ public Path mkdir(final Path folder, final TransferStatus status) throws Backgro
}
@Override
- public boolean isSupported(final Path workdir, final String name) {
- return session.isUserWritable(workdir);
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ if(!session.isUserWritable(workdir)) {
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
+ }
}
@Override
diff --git a/manta/src/main/java/ch/cyberduck/core/manta/MantaMoveFeature.java b/manta/src/main/java/ch/cyberduck/core/manta/MantaMoveFeature.java
index 31a8d53df66..5aba24d720f 100644
--- a/manta/src/main/java/ch/cyberduck/core/manta/MantaMoveFeature.java
+++ b/manta/src/main/java/ch/cyberduck/core/manta/MantaMoveFeature.java
@@ -17,13 +17,16 @@
import ch.cyberduck.core.ConnectionCallback;
import ch.cyberduck.core.DefaultIOExceptionMappingService;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.features.Move;
import ch.cyberduck.core.transfer.TransferStatus;
import java.io.IOException;
+import java.text.MessageFormat;
import com.joyent.manta.exception.MantaClientHttpResponseException;
import com.joyent.manta.exception.MantaException;
@@ -61,8 +64,9 @@ public boolean isRecursive(final Path source, final Path target) {
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return session.isUserWritable(target);
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ if(!session.isUserWritable(target)) {
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(source);
+ }
}
-
}
diff --git a/manta/src/main/java/ch/cyberduck/core/manta/MantaTouchFeature.java b/manta/src/main/java/ch/cyberduck/core/manta/MantaTouchFeature.java
index 372373fdc65..aeadfbbeb95 100644
--- a/manta/src/main/java/ch/cyberduck/core/manta/MantaTouchFeature.java
+++ b/manta/src/main/java/ch/cyberduck/core/manta/MantaTouchFeature.java
@@ -16,7 +16,9 @@
*/
import ch.cyberduck.core.DefaultIOExceptionMappingService;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.features.Touch;
import ch.cyberduck.core.features.Write;
@@ -57,8 +59,10 @@ public Path touch(final Path file, final TransferStatus status) throws Backgroun
}
@Override
- public boolean isSupported(final Path workdir, final String filename) {
- return session.isUserWritable(workdir);
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ if(!session.isUserWritable(workdir)) {
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
+ }
}
@Override
diff --git a/nextcloud/src/main/java/ch/cyberduck/core/nextcloud/NextcloudDeleteFeature.java b/nextcloud/src/main/java/ch/cyberduck/core/nextcloud/NextcloudDeleteFeature.java
index 61a6af0108e..03da71cb52d 100644
--- a/nextcloud/src/main/java/ch/cyberduck/core/nextcloud/NextcloudDeleteFeature.java
+++ b/nextcloud/src/main/java/ch/cyberduck/core/nextcloud/NextcloudDeleteFeature.java
@@ -15,12 +15,17 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.dav.DAVDeleteFeature;
import ch.cyberduck.core.dav.DAVSession;
+import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import org.apache.commons.lang3.StringUtils;
+import java.text.MessageFormat;
+
public class NextcloudDeleteFeature extends DAVDeleteFeature {
public NextcloudDeleteFeature(final DAVSession session) {
@@ -28,10 +33,9 @@ public NextcloudDeleteFeature(final DAVSession session) {
}
@Override
- public boolean isSupported(final Path file) {
+ public void preflight(final Path file) throws BackgroundException {
if(StringUtils.isNotBlank(file.attributes().getVersionId())) {
- return false;
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"), file)).withFile(file);
}
- return super.isSupported(file);
}
}
diff --git a/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphCopyFeature.java b/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphCopyFeature.java
index f4782d6f5d9..b03f6f70eb1 100644
--- a/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphCopyFeature.java
+++ b/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphCopyFeature.java
@@ -17,9 +17,11 @@
import ch.cyberduck.core.ConnectionCallback;
import ch.cyberduck.core.DefaultIOExceptionMappingService;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathAttributes;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Copy;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.io.StreamListener;
@@ -36,6 +38,7 @@
import org.nuxeo.onedrive.client.types.DriveItem;
import java.io.IOException;
+import java.text.MessageFormat;
import java.util.Collections;
public class GraphCopyFeature implements Copy {
@@ -91,16 +94,18 @@ public boolean isRecursive(final Path source, final Path target) {
}
@Override
- public boolean isSupported(final Path source, final Path target) {
+ public void preflight(final Path source, final Path target) throws BackgroundException {
if(!session.isAccessible(target, true)) {
- return false;
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
}
if(!session.isAccessible(source, false)) {
- return false;
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
}
if(!session.getContainer(source).equals(session.getContainer(target))) {
- return false;
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
+ }
+ if(source.getType().contains(Path.Type.shared)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
}
- return !source.getType().contains(Path.Type.shared);
}
}
diff --git a/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphDeleteFeature.java b/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphDeleteFeature.java
index 58934212e31..dd4af128c49 100644
--- a/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphDeleteFeature.java
+++ b/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphDeleteFeature.java
@@ -16,8 +16,10 @@
*/
import ch.cyberduck.core.DefaultIOExceptionMappingService;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.PasswordCallback;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.onedrive.GraphExceptionMappingService;
@@ -29,6 +31,7 @@
import org.nuxeo.onedrive.client.types.DriveItem;
import java.io.IOException;
+import java.text.MessageFormat;
import java.util.Map;
public class GraphDeleteFeature implements Delete {
@@ -60,8 +63,10 @@ public void delete(final Map files, final PasswordCallback
}
@Override
- public boolean isSupported(final Path file) {
- return session.isAccessible(file, false);
+ public void preflight(final Path file) throws BackgroundException {
+ if(!session.isAccessible(file, false)) {
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Cannot delete {0}", "Error"), file)).withFile(file);
+ }
}
@Override
diff --git a/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphDirectoryFeature.java b/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphDirectoryFeature.java
index 2f3ec2e3730..7decb17cced 100644
--- a/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphDirectoryFeature.java
+++ b/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphDirectoryFeature.java
@@ -16,8 +16,10 @@
*/
import ch.cyberduck.core.DefaultIOExceptionMappingService;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathAttributes;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.features.Directory;
import ch.cyberduck.core.features.Write;
@@ -61,8 +63,10 @@ public Path mkdir(final Path directory, final TransferStatus status) throws Back
}
@Override
- public boolean isSupported(final Path workdir, final String name) {
- return session.isAccessible(workdir);
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ if(!session.isAccessible(workdir)) {
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
+ }
}
@Override
diff --git a/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphMoveFeature.java b/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphMoveFeature.java
index ef20b0911bc..8d9365741ba 100644
--- a/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphMoveFeature.java
+++ b/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphMoveFeature.java
@@ -17,10 +17,13 @@
import ch.cyberduck.core.ConnectionCallback;
import ch.cyberduck.core.DefaultIOExceptionMappingService;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathAttributes;
import ch.cyberduck.core.SimplePathPredicate;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.features.Move;
import ch.cyberduck.core.onedrive.GraphExceptionMappingService;
@@ -37,6 +40,7 @@
import org.nuxeo.onedrive.client.types.FileSystemInfo;
import java.io.IOException;
+import java.text.MessageFormat;
import java.time.Instant;
import java.time.ZoneOffset;
import java.util.Collections;
@@ -96,16 +100,18 @@ public boolean isRecursive(final Path source, final Path target) {
}
@Override
- public boolean isSupported(final Path source, final Path target) {
+ public void preflight(final Path source, final Path target) throws BackgroundException {
if(!session.isAccessible(target, true)) {
- return false;
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(source);
}
if(!session.isAccessible(source, false)) {
- return false;
+ throw new AccessDeniedException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(source);
}
if(!session.getContainer(source).equals(session.getContainer(target))) {
- return false;
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(source);
+ }
+ if(source.getType().contains(Path.Type.shared)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(source);
}
- return !source.getType().contains(Path.Type.shared);
}
}
diff --git a/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphTouchFeature.java b/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphTouchFeature.java
index 1cfb5104cca..cf96422ea91 100644
--- a/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphTouchFeature.java
+++ b/onedrive/src/main/java/ch/cyberduck/core/onedrive/features/GraphTouchFeature.java
@@ -16,10 +16,12 @@
*/
import ch.cyberduck.core.DefaultIOExceptionMappingService;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.MimeTypeService;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathAttributes;
import ch.cyberduck.core.URIEncoder;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.features.Touch;
import ch.cyberduck.core.features.Write;
@@ -63,8 +65,10 @@ public Path touch(final Path file, final TransferStatus status) throws Backgroun
}
@Override
- public boolean isSupported(final Path workdir, final String filename) {
- return session.isAccessible(workdir);
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ if(!session.isAccessible(workdir)) {
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
+ }
}
@Override
diff --git a/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftDefaultCopyFeature.java b/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftDefaultCopyFeature.java
index f61057851cd..844d69eaf18 100644
--- a/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftDefaultCopyFeature.java
+++ b/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftDefaultCopyFeature.java
@@ -21,14 +21,17 @@
import ch.cyberduck.core.ConnectionCallback;
import ch.cyberduck.core.DefaultIOExceptionMappingService;
import ch.cyberduck.core.DefaultPathContainerService;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Copy;
import ch.cyberduck.core.io.StreamListener;
import ch.cyberduck.core.transfer.TransferStatus;
import java.io.IOException;
+import java.text.MessageFormat;
import ch.iterate.openstack.swift.exception.GenericException;
@@ -69,7 +72,12 @@ public Path copy(final Path source, final Path target, final TransferStatus stat
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return !containerService.isContainer(source) && !containerService.isContainer(target);
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ if(containerService.isContainer(source)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
+ }
+ if(containerService.isContainer(target)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(target);
+ }
}
}
diff --git a/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftLargeObjectCopyFeature.java b/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftLargeObjectCopyFeature.java
index 0efc4f19d02..6d14f60f3ff 100644
--- a/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftLargeObjectCopyFeature.java
+++ b/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftLargeObjectCopyFeature.java
@@ -18,10 +18,12 @@
import ch.cyberduck.core.ConnectionCallback;
import ch.cyberduck.core.DefaultIOExceptionMappingService;
import ch.cyberduck.core.DefaultPathContainerService;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathAttributes;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Copy;
import ch.cyberduck.core.io.Checksum;
import ch.cyberduck.core.io.HashAlgorithm;
@@ -29,6 +31,7 @@
import ch.cyberduck.core.transfer.TransferStatus;
import java.io.IOException;
+import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -64,8 +67,13 @@ public Path copy(final Path source, final Path target, final TransferStatus stat
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return !containerService.isContainer(source) && !containerService.isContainer(target);
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ if(containerService.isContainer(source)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
+ }
+ if(containerService.isContainer(target)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(target);
+ }
}
public Path copy(final Path source, final List sourceParts, final Path target, final TransferStatus status,
diff --git a/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftMoveFeature.java b/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftMoveFeature.java
index 439955c216f..ee7eea9bbe1 100644
--- a/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftMoveFeature.java
+++ b/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftMoveFeature.java
@@ -68,7 +68,8 @@ public Path move(final Path file, final Path renamed, final TransferStatus statu
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return proxy.isSupported(source, target) && delete.isSupported(source);
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ proxy.preflight(source, target);
+ delete.preflight(source);
}
}
diff --git a/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftSegmentCopyService.java b/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftSegmentCopyService.java
index 72395261ef7..115af88c1dc 100644
--- a/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftSegmentCopyService.java
+++ b/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftSegmentCopyService.java
@@ -17,13 +17,16 @@
import ch.cyberduck.core.ConnectionCallback;
import ch.cyberduck.core.DefaultPathContainerService;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Copy;
import ch.cyberduck.core.io.StreamListener;
import ch.cyberduck.core.transfer.TransferStatus;
+import java.text.MessageFormat;
import java.util.List;
public class SwiftSegmentCopyService implements Copy {
@@ -57,7 +60,12 @@ public Path copy(final Path source, final Path target, final TransferStatus stat
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return new SwiftDefaultCopyFeature(session, regionService).isSupported(source, target);
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ if(containerService.isContainer(source)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
+ }
+ if(containerService.isContainer(target)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(target);
+ }
}
}
diff --git a/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftTouchFeature.java b/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftTouchFeature.java
index ef4387509f2..e9a06ff85bf 100644
--- a/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftTouchFeature.java
+++ b/openstack/src/main/java/ch/cyberduck/core/openstack/SwiftTouchFeature.java
@@ -18,7 +18,10 @@
* feedback@cyberduck.ch
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
+import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.shared.DefaultTouchFeature;
import ch.iterate.openstack.swift.model.StorageObject;
@@ -30,8 +33,10 @@ public SwiftTouchFeature(final SwiftSession session, final SwiftRegionService re
}
@Override
- public boolean isSupported(final Path workdir, final String filename) {
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
// Creating files is only possible inside a container.
- return !workdir.isRoot();
+ if(workdir.isRoot()) {
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
+ }
}
}
diff --git a/s3/src/main/java/ch/cyberduck/core/s3/S3CopyFeature.java b/s3/src/main/java/ch/cyberduck/core/s3/S3CopyFeature.java
index 26656518c98..4dea7e31873 100644
--- a/s3/src/main/java/ch/cyberduck/core/s3/S3CopyFeature.java
+++ b/s3/src/main/java/ch/cyberduck/core/s3/S3CopyFeature.java
@@ -19,12 +19,14 @@
import ch.cyberduck.core.Acl;
import ch.cyberduck.core.ConnectionCallback;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathAttributes;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.exception.InteroperabilityException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Copy;
import ch.cyberduck.core.features.Encryption;
import ch.cyberduck.core.io.StreamListener;
@@ -37,6 +39,7 @@
import org.jets3t.service.ServiceException;
import org.jets3t.service.model.S3Object;
+import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
@@ -102,7 +105,12 @@ protected String copy(final Path source, final S3Object destination, final Trans
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return !containerService.isContainer(source) && !containerService.isContainer(target);
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ if(containerService.isContainer(source)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
+ }
+ if(containerService.isContainer(target)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(target);
+ }
}
}
diff --git a/s3/src/main/java/ch/cyberduck/core/s3/S3DirectoryFeature.java b/s3/src/main/java/ch/cyberduck/core/s3/S3DirectoryFeature.java
index 65c317a0fd2..e11b4206a15 100644
--- a/s3/src/main/java/ch/cyberduck/core/s3/S3DirectoryFeature.java
+++ b/s3/src/main/java/ch/cyberduck/core/s3/S3DirectoryFeature.java
@@ -20,6 +20,7 @@
import ch.cyberduck.core.Path;
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.InvalidFilenameException;
import ch.cyberduck.core.features.Directory;
import ch.cyberduck.core.features.Write;
import ch.cyberduck.core.transfer.TransferStatus;
@@ -67,16 +68,18 @@ public Path mkdir(final Path folder, final TransferStatus status) throws Backgro
}
}
+
@Override
- public boolean isSupported(final Path workdir, final String name) {
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
if(StringUtils.isEmpty(RequestEntityRestStorageService.findBucketInHostname(session.getHost()))) {
if(workdir.isRoot()) {
- if(StringUtils.isNotBlank(name)) {
- return ServiceUtils.isBucketNameValidDNSName(name);
+ if(StringUtils.isNotBlank(filename)) {
+ if(!ServiceUtils.isBucketNameValidDNSName(filename)) {
+ throw new InvalidFilenameException();
+ }
}
}
}
- return true;
}
@Override
diff --git a/s3/src/main/java/ch/cyberduck/core/s3/S3MoveFeature.java b/s3/src/main/java/ch/cyberduck/core/s3/S3MoveFeature.java
index 4661f6111bc..6f0fcad432e 100644
--- a/s3/src/main/java/ch/cyberduck/core/s3/S3MoveFeature.java
+++ b/s3/src/main/java/ch/cyberduck/core/s3/S3MoveFeature.java
@@ -104,7 +104,8 @@ public Path move(final Path source, final Path renamed, final TransferStatus sta
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return proxy.isSupported(source, target) && delete.isSupported(source);
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ proxy.preflight(source, target);
+ delete.preflight(source);
}
}
diff --git a/s3/src/main/java/ch/cyberduck/core/s3/S3ThresholdCopyFeature.java b/s3/src/main/java/ch/cyberduck/core/s3/S3ThresholdCopyFeature.java
index e40b868304c..e8a85e65c55 100644
--- a/s3/src/main/java/ch/cyberduck/core/s3/S3ThresholdCopyFeature.java
+++ b/s3/src/main/java/ch/cyberduck/core/s3/S3ThresholdCopyFeature.java
@@ -18,18 +18,24 @@
*/
import ch.cyberduck.core.ConnectionCallback;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Copy;
import ch.cyberduck.core.io.StreamListener;
import ch.cyberduck.core.preferences.HostPreferences;
import ch.cyberduck.core.transfer.TransferStatus;
+import java.text.MessageFormat;
+
public class S3ThresholdCopyFeature implements Copy {
private final S3Session session;
private final S3AccessControlListFeature accessControlListFeature;
private final Long multipartThreshold;
+ private final PathContainerService containerService;
public S3ThresholdCopyFeature(final S3Session session) {
this(session, new S3AccessControlListFeature(session));
@@ -39,6 +45,7 @@ public S3ThresholdCopyFeature(final S3Session session, final S3AccessControlList
this.session = session;
this.accessControlListFeature = accessControlListFeature;
this.multipartThreshold = new HostPreferences(session.getHost()).getLong("s3.upload.multipart.required.threshold");
+ this.containerService = session.getFeature(PathContainerService.class);
}
public Path copy(final Path source, final Path copy, final TransferStatus status, final ConnectionCallback callback, final StreamListener listener) throws BackgroundException {
@@ -51,7 +58,12 @@ public Path copy(final Path source, final Path copy, final TransferStatus status
}
@Override
- public boolean isSupported(final Path source, final Path target) {
- return new S3CopyFeature(session, accessControlListFeature).isSupported(source, target);
+ public void preflight(final Path source, final Path target) throws BackgroundException {
+ if(containerService.isContainer(source)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
+ }
+ if(containerService.isContainer(target)) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(target);
+ }
}
}
diff --git a/s3/src/main/java/ch/cyberduck/core/s3/S3TouchFeature.java b/s3/src/main/java/ch/cyberduck/core/s3/S3TouchFeature.java
index 5e3a3d7be75..42fb42c3ee9 100644
--- a/s3/src/main/java/ch/cyberduck/core/s3/S3TouchFeature.java
+++ b/s3/src/main/java/ch/cyberduck/core/s3/S3TouchFeature.java
@@ -18,7 +18,9 @@
* feedback@cyberduck.ch
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.shared.DefaultTouchFeature;
import ch.cyberduck.core.transfer.TransferStatus;
@@ -42,11 +44,12 @@ public Path touch(final Path file, final TransferStatus status) throws Backgroun
}
@Override
- public boolean isSupported(final Path workdir, final String filename) {
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
if(StringUtils.isEmpty(RequestEntityRestStorageService.findBucketInHostname(session.getHost()))) {
// Creating files is only possible inside a bucket.
- return !workdir.isRoot();
+ if(workdir.isRoot()) {
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
+ }
}
- return true;
}
}
diff --git a/smb/src/main/java/ch/cyberduck/core/smb/SMBCopyFeature.java b/smb/src/main/java/ch/cyberduck/core/smb/SMBCopyFeature.java
index 83a6dcc171e..20716686679 100644
--- a/smb/src/main/java/ch/cyberduck/core/smb/SMBCopyFeature.java
+++ b/smb/src/main/java/ch/cyberduck/core/smb/SMBCopyFeature.java
@@ -16,13 +16,16 @@
*/
import ch.cyberduck.core.ConnectionCallback;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Copy;
import ch.cyberduck.core.io.StreamListener;
import ch.cyberduck.core.transfer.TransferStatus;
import java.io.IOException;
+import java.text.MessageFormat;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
@@ -80,9 +83,11 @@ public Path copy(final Path source, final Path target, final TransferStatus stat
}
@Override
- public boolean isSupported(final Path source, final Path target) {
+ public void preflight(final Path source, final Path target) throws BackgroundException {
final SMBPathContainerService containerService = new SMBPathContainerService(session);
// Remote copy is only possible between files on the same server
- return containerService.getContainer(source).equals(containerService.getContainer(target));
+ if(!containerService.getContainer(source).equals(containerService.getContainer(target))) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot copy {0}", "Error"), source)).withFile(source);
+ }
}
}
diff --git a/smb/src/main/java/ch/cyberduck/core/smb/SMBMoveFeature.java b/smb/src/main/java/ch/cyberduck/core/smb/SMBMoveFeature.java
index fcea06e5ca6..6a06b698ec8 100644
--- a/smb/src/main/java/ch/cyberduck/core/smb/SMBMoveFeature.java
+++ b/smb/src/main/java/ch/cyberduck/core/smb/SMBMoveFeature.java
@@ -16,13 +16,17 @@
*/
import ch.cyberduck.core.ConnectionCallback;
+import ch.cyberduck.core.DefaultIOExceptionMappingService;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.exception.BackgroundException;
+import ch.cyberduck.core.exception.UnsupportedException;
import ch.cyberduck.core.features.Delete.Callback;
import ch.cyberduck.core.features.Move;
import ch.cyberduck.core.transfer.TransferStatus;
import java.io.IOException;
+import java.text.MessageFormat;
import java.util.Collections;
import com.hierynomus.msdtyp.AccessMask;
@@ -72,10 +76,11 @@ public Path move(final Path source, final Path target, final TransferStatus stat
return target;
}
-
@Override
- public boolean isSupported(final Path source, final Path target) {
+ public void preflight(final Path source, final Path target) throws BackgroundException {
final SMBPathContainerService containerService = new SMBPathContainerService(session);
- return containerService.getContainer(source).equals(containerService.getContainer(target));
+ if(!containerService.getContainer(source).equals(containerService.getContainer(target))) {
+ throw new UnsupportedException(MessageFormat.format(LocaleFactory.localizedString("Cannot rename {0}", "Error"), source)).withFile(source);
+ }
}
}
diff --git a/smb/src/main/java/ch/cyberduck/core/smb/SMBTouchFeature.java b/smb/src/main/java/ch/cyberduck/core/smb/SMBTouchFeature.java
index 31afb4a3a67..a2d36d69f32 100644
--- a/smb/src/main/java/ch/cyberduck/core/smb/SMBTouchFeature.java
+++ b/smb/src/main/java/ch/cyberduck/core/smb/SMBTouchFeature.java
@@ -33,9 +33,4 @@ public SMBTouchFeature(final SMBSession session) {
public Path touch(final Path file, final TransferStatus status) throws BackgroundException {
return super.touch(file, status).withAttributes(new SMBAttributesFinderFeature(session).find(file));
}
-
- @Override
- public boolean isSupported(final Path workdir, final String filename) {
- return true;
- }
}
diff --git a/spectra/src/main/java/ch/cyberduck/core/spectra/SpectraTouchFeature.java b/spectra/src/main/java/ch/cyberduck/core/spectra/SpectraTouchFeature.java
index f135fad3fee..b430238fd9c 100644
--- a/spectra/src/main/java/ch/cyberduck/core/spectra/SpectraTouchFeature.java
+++ b/spectra/src/main/java/ch/cyberduck/core/spectra/SpectraTouchFeature.java
@@ -15,7 +15,9 @@
package ch.cyberduck.core.spectra;
import ch.cyberduck.core.DisabledConnectionCallback;
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.shared.DefaultTouchFeature;
import ch.cyberduck.core.transfer.Transfer;
@@ -42,10 +44,11 @@ public Path touch(final Path file, final TransferStatus status) throws Backgroun
return super.touch(file, status);
}
-
@Override
- public boolean isSupported(final Path workdir, final String filename) {
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
// Creating files is only possible inside a bucket.
- return !workdir.isRoot();
+ if(workdir.isRoot()) {
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
+ }
}
}
diff --git a/storegate/src/main/java/ch/cyberduck/core/storegate/StoregateCopyFeature.java b/storegate/src/main/java/ch/cyberduck/core/storegate/StoregateCopyFeature.java
index 0b7c57fc527..4792f796268 100644
--- a/storegate/src/main/java/ch/cyberduck/core/storegate/StoregateCopyFeature.java
+++ b/storegate/src/main/java/ch/cyberduck/core/storegate/StoregateCopyFeature.java
@@ -54,11 +54,6 @@ public Path copy(final Path source, final Path target, final TransferStatus stat
}
}
- @Override
- public boolean isSupported(final Path source, final Path target) {
- return true;
- }
-
@Override
public boolean isRecursive(final Path source, final Path target) {
return true;
diff --git a/storegate/src/main/java/ch/cyberduck/core/storegate/StoregateDirectoryFeature.java b/storegate/src/main/java/ch/cyberduck/core/storegate/StoregateDirectoryFeature.java
index 27dff81dcaf..131a058f79f 100644
--- a/storegate/src/main/java/ch/cyberduck/core/storegate/StoregateDirectoryFeature.java
+++ b/storegate/src/main/java/ch/cyberduck/core/storegate/StoregateDirectoryFeature.java
@@ -15,8 +15,10 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.core.VersionId;
+import ch.cyberduck.core.exception.AccessDeniedException;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.features.Directory;
import ch.cyberduck.core.features.Write;
@@ -58,7 +60,9 @@ public Directory withWriter(final Write writer) {
}
@Override
- public boolean isSupported(final Path workdir, final String name) {
- return !workdir.isRoot();
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ if(workdir.isRoot()) {
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
+ }
}
}
diff --git a/storegate/src/main/java/ch/cyberduck/core/storegate/StoregateTouchFeature.java b/storegate/src/main/java/ch/cyberduck/core/storegate/StoregateTouchFeature.java
index 006a5a89737..4a6d09377ff 100644
--- a/storegate/src/main/java/ch/cyberduck/core/storegate/StoregateTouchFeature.java
+++ b/storegate/src/main/java/ch/cyberduck/core/storegate/StoregateTouchFeature.java
@@ -15,7 +15,10 @@
* GNU General Public License for more details.
*/
+import ch.cyberduck.core.LocaleFactory;
import ch.cyberduck.core.Path;
+import ch.cyberduck.core.exception.AccessDeniedException;
+import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.shared.DefaultTouchFeature;
import ch.cyberduck.core.storegate.io.swagger.client.model.File;
@@ -26,7 +29,9 @@ public StoregateTouchFeature(final StoregateSession session, final StoregateIdPr
}
@Override
- public boolean isSupported(final Path workdir, final String filename) {
- return !workdir.isRoot();
+ public void preflight(final Path workdir, final String filename) throws BackgroundException {
+ if(workdir.isRoot()) {
+ throw new AccessDeniedException(LocaleFactory.localizedString("Unsupported", "Error")).withFile(workdir);
+ }
}
}
From 3077a3f5ea914aa78f55d91609771fb9118124f0 Mon Sep 17 00:00:00 2001
From: David Kocher
Date: Fri, 20 Oct 2023 11:45:21 +0200
Subject: [PATCH 098/230] Introduce feature support flags.
---
.../ch/cyberduck/core/b2/B2MoveFeature.java | 10 ++++++---
.../ch/cyberduck/core/b2/B2SearchFeature.java | 4 ++--
.../core/b2/B2ThresholdCopyFeature.java | 6 ++++--
.../ch/cyberduck/core/box/BoxCopyFeature.java | 5 +++--
.../cyberduck/core/box/BoxDeleteFeature.java | 5 +++--
.../ch/cyberduck/core/box/BoxMoveFeature.java | 5 +++--
.../core/brick/BrickCopyFeature.java | 5 +++--
.../core/brick/BrickDeleteFeature.java | 5 +++--
.../core/brick/BrickMoveFeature.java | 5 +++--
.../java/ch/cyberduck/core/features/Copy.java | 20 +++++++++++++++++-
.../ch/cyberduck/core/features/Delete.java | 20 +++++++++++++++++-
.../java/ch/cyberduck/core/features/Move.java | 21 ++++++++++++++++++-
.../ch/cyberduck/core/features/Search.java | 21 ++++++++++++++++++-
.../registry/VaultRegistryDeleteFeature.java | 5 +++--
.../registry/VaultRegistryMoveFeature.java | 12 +++++++----
.../registry/VaultRegistrySearchFeature.java | 6 ++++--
.../registry/VaultRegistryTrashFeature.java | 5 +++--
.../features/CryptoCopyFeature.java | 6 ++++--
.../features/CryptoDeleteV6Feature.java | 5 +++--
.../features/CryptoDeleteV7Feature.java | 4 ++--
.../features/CryptoMoveV6Feature.java | 6 ++++--
.../features/CryptoMoveV7Feature.java | 4 ++--
.../features/CryptoSearchFeature.java | 6 ++++--
.../core/sds/SDSBatchDeleteFeature.java | 5 +++--
.../ch/cyberduck/core/sds/SDSCopyFeature.java | 5 +++--
.../core/sds/SDSDelegatingMoveFeature.java | 11 ++++++----
.../cyberduck/core/sds/SDSDeleteFeature.java | 5 +++--
.../ch/cyberduck/core/sds/SDSMoveFeature.java | 5 +++--
.../cyberduck/core/sds/SDSSearchFeature.java | 4 ++--
.../core/sds/SDSThresholdDeleteFeature.java | 5 +++--
.../dropbox/DropboxBatchDeleteFeature.java | 5 +++--
.../core/dropbox/DropboxCopyFeature.java | 5 +++--
.../core/dropbox/DropboxDeleteFeature.java | 5 +++--
.../core/dropbox/DropboxMoveFeature.java | 5 +++--
.../core/dropbox/DropboxSearchFeature.java | 4 ++--
.../DropboxThresholdDeleteFeature.java | 5 +++--
.../ch/cyberduck/core/eue/EueCopyFeature.java | 5 +++--
.../ch/cyberduck/core/eue/EueMoveFeature.java | 5 +++--
.../cyberduck/core/eue/EueTrashFeature.java | 5 +++--
.../ch/cyberduck/core/ftp/FTPMoveFeature.java | 5 +++--
.../googledrive/DriveBatchDeleteFeature.java | 5 +++--
.../googledrive/DriveBatchTrashFeature.java | 5 +++--
.../core/googledrive/DriveCopyFeature.java | 5 +++--
.../core/googledrive/DriveDeleteFeature.java | 5 +++--
.../core/googledrive/DriveMoveFeature.java | 5 +++--
.../core/googledrive/DriveSearchFeature.java | 6 ++++--
.../DriveThresholdDeleteFeature.java | 5 +++--
.../DriveThresholdTrashFeature.java | 5 +++--
.../core/googledrive/DriveTrashFeature.java | 5 +++--
.../GoogleStorageSearchFeature.java | 5 +++--
.../core/irods/IRODSCopyFeature.java | 6 ++++--
.../core/irods/IRODSDeleteFeature.java | 5 +++--
.../core/irods/IRODSMoveFeature.java | 5 +++--
.../core/manta/MantaDeleteFeature.java | 5 +++--
.../core/manta/MantaMoveFeature.java | 5 +++--
.../core/manta/MantaSearchFeature.java | 5 +++--
.../cyberduck/core/nio/LocalCopyFeature.java | 5 +++--
.../cyberduck/core/nio/LocalMoveFeature.java | 5 +++--
.../onedrive/features/GraphCopyFeature.java | 5 +++--
.../onedrive/features/GraphDeleteFeature.java | 5 +++--
.../onedrive/features/GraphMoveFeature.java | 5 +++--
.../ch/cyberduck/core/s3/S3SearchFeature.java | 5 +++--
.../cyberduck/core/smb/SMBDeleteFeature.java | 5 +++--
.../ch/cyberduck/core/smb/SMBMoveFeature.java | 5 +++--
.../core/spectra/SpectraDeleteFeature.java | 5 +++--
.../cyberduck/core/sftp/SFTPMoveFeature.java | 5 +++--
.../core/storegate/StoregateCopyFeature.java | 6 ++++--
.../storegate/StoregateDeleteFeature.java | 5 +++--
.../core/storegate/StoregateMoveFeature.java | 5 +++--
.../ch/cyberduck/core/dav/DAVCopyFeature.java | 5 +++--
.../cyberduck/core/dav/DAVDeleteFeature.java | 5 +++--
.../ch/cyberduck/core/dav/DAVMoveFeature.java | 5 +++--
72 files changed, 298 insertions(+), 145 deletions(-)
diff --git a/backblaze/src/main/java/ch/cyberduck/core/b2/B2MoveFeature.java b/backblaze/src/main/java/ch/cyberduck/core/b2/B2MoveFeature.java
index 12ee3ab7203..f55c26505ba 100644
--- a/backblaze/src/main/java/ch/cyberduck/core/b2/B2MoveFeature.java
+++ b/backblaze/src/main/java/ch/cyberduck/core/b2/B2MoveFeature.java
@@ -21,6 +21,7 @@
import ch.cyberduck.core.PathContainerService;
import ch.cyberduck.core.exception.BackgroundException;
import ch.cyberduck.core.exception.UnsupportedException;
+import ch.cyberduck.core.features.Copy;
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.features.Move;
import ch.cyberduck.core.io.DisabledStreamListener;
@@ -28,6 +29,7 @@
import java.text.MessageFormat;
import java.util.Collections;
+import java.util.EnumSet;
public class B2MoveFeature implements Move {
@@ -60,8 +62,10 @@ public void preflight(final Path source, final Path target) throws BackgroundExc
}
@Override
- public boolean isRecursive(final Path source, final Path target) {
- return proxy.isRecursive(source, target);
+ public EnumSet features(final Path source, final Path target) {
+ if(proxy.features(source, target).contains(Copy.Flags.recursive)) {
+ return EnumSet.of(Flags.recursive);
+ }
+ return EnumSet.noneOf(Flags.class);
}
-
}
diff --git a/backblaze/src/main/java/ch/cyberduck/core/b2/B2SearchFeature.java b/backblaze/src/main/java/ch/cyberduck/core/b2/B2SearchFeature.java
index 43836dad908..743fc013fe4 100644
--- a/backblaze/src/main/java/ch/cyberduck/core/b2/B2SearchFeature.java
+++ b/backblaze/src/main/java/ch/cyberduck/core/b2/B2SearchFeature.java
@@ -91,7 +91,7 @@ public AttributedList search(final Path workdir, final Filter regex,
}
@Override
- public boolean isRecursive() {
- return true;
+ public EnumSet features() {
+ return EnumSet.of(Flags.recursive);
}
}
diff --git a/backblaze/src/main/java/ch/cyberduck/core/b2/B2ThresholdCopyFeature.java b/backblaze/src/main/java/ch/cyberduck/core/b2/B2ThresholdCopyFeature.java
index dd2e1f8a9e1..d36207b2b49 100644
--- a/backblaze/src/main/java/ch/cyberduck/core/b2/B2ThresholdCopyFeature.java
+++ b/backblaze/src/main/java/ch/cyberduck/core/b2/B2ThresholdCopyFeature.java
@@ -26,6 +26,8 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import java.util.EnumSet;
+
public class B2ThresholdCopyFeature implements Copy {
private static final Logger log = LogManager.getLogger(B2ThresholdCopyFeature.class);
@@ -59,7 +61,7 @@ public void preflight(final Path source, final Path target) throws BackgroundExc
}
@Override
- public boolean isRecursive(final Path source, final Path target) {
- return new B2CopyFeature(session, fileid).isRecursive(source, target);
+ public EnumSet features(final Path source, final Path target) {
+ return new B2CopyFeature(session, fileid).features(source, target);
}
}
diff --git a/box/src/main/java/ch/cyberduck/core/box/BoxCopyFeature.java b/box/src/main/java/ch/cyberduck/core/box/BoxCopyFeature.java
index 5ea1965bf97..aa8adf180a1 100644
--- a/box/src/main/java/ch/cyberduck/core/box/BoxCopyFeature.java
+++ b/box/src/main/java/ch/cyberduck/core/box/BoxCopyFeature.java
@@ -34,6 +34,7 @@
import org.apache.logging.log4j.Logger;
import java.util.Collections;
+import java.util.EnumSet;
public class BoxCopyFeature implements Copy {
private static final Logger log = LogManager.getLogger(BoxCopyFeature.class);
@@ -78,7 +79,7 @@ public Path copy(final Path file, final Path target, final TransferStatus status
}
@Override
- public boolean isRecursive(final Path source, final Path target) {
- return true;
+ public EnumSet features(final Path source, final Path target) {
+ return EnumSet.of(Flags.recursive);
}
}
diff --git a/box/src/main/java/ch/cyberduck/core/box/BoxDeleteFeature.java b/box/src/main/java/ch/cyberduck/core/box/BoxDeleteFeature.java
index bedc7f920f7..96da2c7d1bd 100644
--- a/box/src/main/java/ch/cyberduck/core/box/BoxDeleteFeature.java
+++ b/box/src/main/java/ch/cyberduck/core/box/BoxDeleteFeature.java
@@ -24,6 +24,7 @@
import ch.cyberduck.core.features.Delete;
import ch.cyberduck.core.transfer.TransferStatus;
+import java.util.EnumSet;
import java.util.Map;
public class BoxDeleteFeature implements Delete {
@@ -54,7 +55,7 @@ public void delete(final Map files, final PasswordCallback
}
@Override
- public boolean isRecursive() {
- return true;
+ public EnumSet features() {
+ return EnumSet.of(Flags.recursive);
}
}
diff --git a/box/src/main/java/ch/cyberduck/core/box/BoxMoveFeature.java b/box/src/main/java/ch/cyberduck/core/box/BoxMoveFeature.java
index d97e517a337..e541abf05db 100644
--- a/box/src/main/java/ch/cyberduck/core/box/BoxMoveFeature.java
+++ b/box/src/main/java/ch/cyberduck/core/box/BoxMoveFeature.java
@@ -35,6 +35,7 @@
import org.apache.logging.log4j.Logger;
import java.util.Collections;
+import java.util.EnumSet;
public class BoxMoveFeature implements Move {
private static final Logger log = LogManager.getLogger(BoxMoveFeature.class);
@@ -84,7 +85,7 @@ id, new FilesFileIdBody()
}
@Override
- public boolean isRecursive(final Path source, final Path target) {
- return true;
+ public EnumSet features(final Path source, final Path target) {
+ return EnumSet.of(Flags.recursive);
}
}
diff --git a/brick/src/main/java/ch/cyberduck/core/brick/BrickCopyFeature.java b/brick/src/main/java/ch/cyberduck/core/brick/BrickCopyFeature.java
index f6a56a622a2..716c4bf1a21 100644
--- a/brick/src/main/java/ch/cyberduck/core/brick/BrickCopyFeature.java
+++ b/brick/src/main/java/ch/cyberduck/core/brick/BrickCopyFeature.java
@@ -32,6 +32,7 @@
import org.apache.logging.log4j.Logger;
import java.util.Collections;
+import java.util.EnumSet;
public class BrickCopyFeature extends BrickFileMigrationFeature implements Copy {
private static final Logger log = LogManager.getLogger(BrickCopyFeature.class);
@@ -67,7 +68,7 @@ public Path copy(final Path file, final Path target, final TransferStatus status
}
@Override
- public boolean isRecursive(final Path source, final Path target) {
- return true;
+ public EnumSet features(final Path source, final Path target) {
+ return EnumSet.of(Flags.recursive);
}
}
diff --git a/brick/src/main/java/ch/cyberduck/core/brick/BrickDeleteFeature.java b/brick/src/main/java/ch/cyberduck/core/brick/BrickDeleteFeature.java
index 189b2cf39e4..3727ff3c46c 100644
--- a/brick/src/main/java/ch/cyberduck/core/brick/BrickDeleteFeature.java
+++ b/brick/src/main/java/ch/cyberduck/core/brick/BrickDeleteFeature.java
@@ -26,6 +26,7 @@
import org.apache.commons.lang3.StringUtils;
+import java.util.EnumSet;
import java.util.Map;
public class BrickDeleteFeature implements Delete {
@@ -50,7 +51,7 @@ public void delete(final Map files, final PasswordCallback
}
@Override
- public boolean isRecursive() {
- return true;
+ public EnumSet