Skip to content

Commit 651a76c

Browse files
authored
Merge pull request #17532 from iterate-ch/bugfix/MD-25299-comparison
Return custom comparison service for content hash.
2 parents 212f93b + f537af7 commit 651a76c

File tree

12 files changed

+66
-38
lines changed

12 files changed

+66
-38
lines changed

azure/src/main/java/ch/cyberduck/core/azure/AzureAttributesFinderFeature.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public PathAttributes toAttributes(final BlobProperties properties) {
109109
attributes.setSize(properties.getBlobSize());
110110
attributes.setModificationDate(properties.getLastModified().toInstant().toEpochMilli());
111111
if(properties.getContentMd5() != null) {
112-
attributes.setChecksum(Checksum.parse(Hex.encodeHexString(Base64.decodeBase64(properties.getContentMd5()))));
112+
attributes.setChecksum(Checksum.parse(Hex.encodeHexString(properties.getContentMd5())));
113113
}
114114
attributes.setETag(properties.getETag());
115115
final Map<String, String> custom = new HashMap<>();
@@ -124,7 +124,7 @@ public PathAttributes toAttributes(final BlobItemProperties properties) {
124124
attributes.setModificationDate(properties.getLastModified().toInstant().toEpochMilli());
125125
attributes.setETag(properties.getETag());
126126
if(properties.getContentMd5() != null) {
127-
attributes.setChecksum(Checksum.parse(Hex.encodeHexString(Base64.decodeBase64(properties.getContentMd5()))));
127+
attributes.setChecksum(Checksum.parse(Hex.encodeHexString(properties.getContentMd5())));
128128
}
129129
return attributes;
130130
}

azure/src/main/java/ch/cyberduck/core/azure/AzureProtocol.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@
2323
import ch.cyberduck.core.PathContainerService;
2424
import ch.cyberduck.core.Protocol;
2525
import ch.cyberduck.core.Scheme;
26+
import ch.cyberduck.core.synchronization.ChainedComparisonService;
27+
import ch.cyberduck.core.synchronization.ChecksumComparisonService;
28+
import ch.cyberduck.core.synchronization.ComparisonService;
29+
import ch.cyberduck.core.synchronization.DefaultComparisonService;
30+
import ch.cyberduck.core.synchronization.ETagComparisonService;
2631
import ch.cyberduck.core.text.DefaultLexicographicOrderComparator;
2732

2833
import org.apache.commons.codec.binary.Base64;
@@ -109,6 +114,9 @@ public <T> T getFeature(final Class<T> type) {
109114
if(type == PathContainerService.class) {
110115
return (T) new DirectoryDelimiterPathContainerService();
111116
}
117+
if(type == ComparisonService.class) {
118+
return (T) new DefaultComparisonService(new ChainedComparisonService(new ChecksumComparisonService(), new ETagComparisonService()), ComparisonService.disabled);
119+
}
112120
return super.getFeature(type);
113121
}
114122
}

azure/src/test/java/ch/cyberduck/core/azure/AzureAttributesFinderFeatureTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import ch.cyberduck.core.PathAttributes;
1010
import ch.cyberduck.core.exception.NotfoundException;
1111
import ch.cyberduck.core.features.Delete;
12+
import ch.cyberduck.core.io.MD5ChecksumCompute;
1213
import ch.cyberduck.core.transfer.TransferStatus;
1314
import ch.cyberduck.test.IntegrationTest;
1415

@@ -42,10 +43,12 @@ public void testNotFound() throws Exception {
4243
public void testFind() throws Exception {
4344
final Path container = new Path("cyberduck", EnumSet.of(Path.Type.directory, Path.Type.volume));
4445
final Path test = new Path(container, new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.file));
45-
new AzureTouchFeature(session).touch(new AzureWriteFeature(session), test, new TransferStatus());
46+
new AzureTouchFeature(session).touch(new AzureWriteFeature(session), test, new TransferStatus()
47+
.setChecksum(new MD5ChecksumCompute().compute("")));
4648
final AzureAttributesFinderFeature f = new AzureAttributesFinderFeature(session);
4749
final PathAttributes attributes = f.find(test);
4850
assertEquals(0L, attributes.getSize());
51+
assertEquals("d41d8cd98f00b204e9800998ecf8427e", attributes.getChecksum().hash);
4952
assertNotNull(attributes.getETag());
5053
new AzureDeleteFeature(session).delete(Collections.singletonList(test), new DisabledLoginCallback(), new Delete.DisabledCallback());
5154
}

dropbox/src/main/java/ch/cyberduck/core/dropbox/DropboxProtocol.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
import ch.cyberduck.core.LocaleFactory;
2020
import ch.cyberduck.core.Protocol;
2121
import ch.cyberduck.core.Scheme;
22+
import ch.cyberduck.core.synchronization.ChecksumComparisonService;
23+
import ch.cyberduck.core.synchronization.ComparisonService;
24+
import ch.cyberduck.core.synchronization.DefaultComparisonService;
2225

2326
import com.google.auto.service.AutoService;
2427

@@ -90,4 +93,13 @@ public Scheme getScheme() {
9093
public Case getCaseSensitivity() {
9194
return Case.insensitive;
9295
}
96+
97+
@Override
98+
@SuppressWarnings("unchecked")
99+
public <T> T getFeature(final Class<T> type) {
100+
if(type == ComparisonService.class) {
101+
return (T) new DefaultComparisonService(new ChecksumComparisonService(), ComparisonService.disabled);
102+
}
103+
return super.getFeature(type);
104+
}
93105
}

dropbox/src/test/java/ch/cyberduck/core/dropbox/DropboxMoveFeatureTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ public void testMoveFile() throws Exception {
6363
assertNotEquals(target.attributes().getVersionId(), file.attributes().getVersionId());
6464
assertEquals(target.attributes().getModificationDate(), file.attributes().getModificationDate());
6565
final PathAttributes targetAttributes = new DropboxAttributesFinderFeature(session).find(target);
66+
assertEquals(file.attributes().getChecksum(), target.attributes().getChecksum());
67+
assertEquals(target.attributes(), new DropboxAttributesFinderFeature(session).find(target));
6668
assertEquals(Comparison.equal, session.getHost().getProtocol().getFeature(ComparisonService.class).compare(Path.Type.file, file.attributes(), targetAttributes));
6769
assertEquals(target.attributes(), targetAttributes);
6870
new DropboxDeleteFeature(session).delete(Collections.singletonList(target), new DisabledLoginCallback(), new Delete.DisabledCallback());

googledrive/src/main/java/ch/cyberduck/core/googledrive/DriveProtocol.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
import ch.cyberduck.core.LocaleFactory;
2020
import ch.cyberduck.core.Protocol;
2121
import ch.cyberduck.core.Scheme;
22+
import ch.cyberduck.core.synchronization.ChecksumComparisonService;
23+
import ch.cyberduck.core.synchronization.ComparisonService;
24+
import ch.cyberduck.core.synchronization.DefaultComparisonService;
2225

2326
import com.google.auto.service.AutoService;
2427

@@ -85,4 +88,14 @@ public DirectoryTimestamp getDirectoryTimestamp() {
8588
public VersioningMode getVersioningMode() {
8689
return VersioningMode.storage;
8790
}
91+
92+
93+
@Override
94+
@SuppressWarnings("unchecked")
95+
public <T> T getFeature(final Class<T> type) {
96+
if(type == ComparisonService.class) {
97+
return (T) new DefaultComparisonService(new ChecksumComparisonService(), ComparisonService.disabled);
98+
}
99+
return super.getFeature(type);
100+
}
88101
}

googledrive/src/test/java/ch/cyberduck/core/googledrive/DriveMoveFeatureTest.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,19 @@ public void testMoveFile() throws Exception {
5858
final DriveFileIdProvider fileid = new DriveFileIdProvider(session);
5959
final Path test = new DriveTouchFeature(session, fileid).touch(new DriveWriteFeature(session, fileid), new Path(DriveHomeFinderService.MYDRIVE_FOLDER, new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.file)), new TransferStatus());
6060
final String id = test.attributes().getFileId();
61-
final Path folder = new Path(DriveHomeFinderService.MYDRIVE_FOLDER, new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.directory));
62-
new DriveDirectoryFeature(session, fileid).mkdir(new DriveWriteFeature(session, fileid), folder, new TransferStatus());
61+
final Path folder = new DriveDirectoryFeature(session, fileid).mkdir(new DriveWriteFeature(session, fileid),
62+
new Path(DriveHomeFinderService.MYDRIVE_FOLDER, new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.directory)), new TransferStatus());
63+
assertEquals(folder.attributes(), new DriveAttributesFinderFeature(session, fileid).find(folder));
6364
final Path target = new DriveMoveFeature(session, fileid).move(test, new Path(folder, new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.file)), new TransferStatus(), new Delete.DisabledCallback(), new DisabledConnectionCallback());
6465
assertEquals(id, target.attributes().getFileId());
66+
assertEquals(test.attributes().getChecksum(), target.attributes().getChecksum());
67+
assertNotEquals(test.attributes().getModificationDate(), target.attributes().getModificationDate());
6568
final Find find = new DefaultFindFeature(session);
6669
assertFalse(find.find(test));
6770
assertTrue(find.find(target));
71+
assertEquals(folder.attributes(), new DriveAttributesFinderFeature(session, fileid).find(folder));
6872
final PathAttributes targetAttr = new DriveAttributesFinderFeature(session, fileid).find(target);
73+
assertEquals(target.attributes(), targetAttr);
6974
assertEquals(Comparison.equal, session.getHost().getProtocol().getFeature(ComparisonService.class).compare(Path.Type.file, test.attributes(), targetAttr));
7075
new DriveDeleteFeature(session, fileid).delete(Arrays.asList(target, folder), new DisabledLoginCallback(), new Delete.DisabledCallback());
7176
}

googledrive/src/test/java/ch/cyberduck/core/googledrive/DriveWriteFeatureTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ public void testWrite() throws Exception {
5555
final DriveFileIdProvider idProvider = new DriveFileIdProvider(session);
5656
final Path folder = new DriveDirectoryFeature(session, idProvider).mkdir(
5757
new DriveWriteFeature(session, idProvider), new Path(DriveHomeFinderService.MYDRIVE_FOLDER, UUID.randomUUID().toString(), EnumSet.of(Path.Type.directory)), new TransferStatus());
58+
final PathAttributes folderAttributes = new DriveAttributesFinderFeature(session, idProvider).find(folder);
59+
assertEquals(folderAttributes, folder.attributes());
5860
final Path test = new Path(folder, new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.file));
5961
String fileid;
6062
{
@@ -83,6 +85,7 @@ public void testWrite() throws Exception {
8385
assertArrayEquals(content, buffer);
8486
assertEquals("x-application/cyberduck", session.getClient().files().get(test.attributes().getFileId()).execute().getMimeType());
8587
}
88+
assertEquals(folderAttributes, new DriveAttributesFinderFeature(session, idProvider).find(folder));
8689
{
8790
// overwrite
8891
final TransferStatus status = new TransferStatus();

googlestorage/src/main/java/ch/cyberduck/core/googlestorage/GoogleStorageProtocol.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,12 @@
2424
import ch.cyberduck.core.Protocol;
2525
import ch.cyberduck.core.Scheme;
2626
import ch.cyberduck.core.features.Location;
27-
import ch.cyberduck.core.synchronization.ChainedComparisonService;
28-
import ch.cyberduck.core.synchronization.Comparison;
2927
import ch.cyberduck.core.synchronization.ComparisonService;
3028
import ch.cyberduck.core.synchronization.DefaultComparisonService;
3129
import ch.cyberduck.core.synchronization.ETagComparisonService;
32-
import ch.cyberduck.core.synchronization.SizeComparisonService;
33-
import ch.cyberduck.core.synchronization.TimestampComparisonService;
3430
import ch.cyberduck.core.text.DefaultLexicographicOrderComparator;
3531

3632
import java.util.Comparator;
37-
import java.util.EnumSet;
3833
import java.util.List;
3934
import java.util.Set;
4035
import java.util.stream.Collectors;
@@ -138,10 +133,7 @@ public <T> T getFeature(final Class<T> type) {
138133
return (T) new DirectoryDelimiterPathContainerService();
139134
}
140135
if(type == ComparisonService.class) {
141-
return (T) new DefaultComparisonService(new ChainedComparisonService(EnumSet.of(Comparison.unknown, Comparison.notequal),
142-
new ETagComparisonService(),
143-
new ChainedComparisonService(
144-
EnumSet.of(Comparison.unknown, Comparison.equal), new TimestampComparisonService(), new SizeComparisonService())), ComparisonService.disabled);
136+
return (T) new DefaultComparisonService(new ETagComparisonService(), ComparisonService.disabled);
145137
}
146138
return super.getFeature(type);
147139
}

hubic/src/main/java/ch/cyberduck/core/hubic/HubicProtocol.java

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,14 @@
1515
* GNU General Public License for more details.
1616
*/
1717

18-
import ch.cyberduck.core.AbstractProtocol;
1918
import ch.cyberduck.core.LocaleFactory;
2019
import ch.cyberduck.core.Protocol;
21-
import ch.cyberduck.core.Scheme;
2220
import ch.cyberduck.core.openstack.SwiftProtocol;
2321

2422
import com.google.auto.service.AutoService;
2523

2624
@AutoService(Protocol.class)
27-
public class HubicProtocol extends AbstractProtocol {
25+
public class HubicProtocol extends SwiftProtocol {
2826

2927
@Override
3028
public String getIdentifier() {
@@ -36,11 +34,6 @@ public String getDescription() {
3634
return "hubiC";
3735
}
3836

39-
@Override
40-
public Scheme getScheme() {
41-
return Scheme.https;
42-
}
43-
4437
@Override
4538
public Type getType() {
4639
return Type.swift;
@@ -76,11 +69,6 @@ public String getPasswordPlaceholder() {
7669
return LocaleFactory.localizedString("Authorization code", "Credentials");
7770
}
7871

79-
@Override
80-
public DirectoryTimestamp getDirectoryTimestamp() {
81-
return DirectoryTimestamp.explicit;
82-
}
83-
8472
@Override
8573
public boolean isUsernameConfigurable() {
8674
return false;

0 commit comments

Comments
 (0)