Cyberduck Mountain Duck CLI

Changeset 41264


Ignore:
Timestamp:
Jun 7, 2017 9:00:18 PM (14 months ago)
Author:
dkocher
Message:

Merge branch 'master' into feature/MD-1651

Location:
shelves/02.06.2017
Files:
16 edited

Legend:

Unmodified
Added
Removed
  • shelves/02.06.2017

  • shelves/02.06.2017/.travis.yml

    r41119 r41264  
    22jdk:
    33  - oraclejdk8
    4 
     4script: mvn test -DskipITs -B
  • shelves/02.06.2017/Changelog.txt

    r41255 r41264  
    11Cyberduck
    22https://cyberduck.io/
     3
     46.0.4 [https://trac.cyberduck.io/milestone/6.0.4]
     5- [Bugfix] Failure to upload to root of vault (Cryptomator)
     6- [Bugfix] Disable x-amz-request-payer header for non AWS endpoints (S3)
     7
     86.0.2 [https://trac.cyberduck.io/milestone/6.0.2]
     9- [Bugfix] Invalid version number format for Mac App Store (Mac)
    310
    4116.0.1 [https://trac.cyberduck.io/milestone/6.0.1]
  • shelves/02.06.2017/core/src/main/java/ch/cyberduck/core/PathAttributes.java

    r40974 r41264  
    2424
    2525import org.apache.commons.lang3.StringUtils;
     26import org.apache.log4j.Logger;
    2627
    2728import java.util.Collections;
     
    3233 */
    3334public class PathAttributes extends Attributes implements Serializable {
     35    private static final Logger log = Logger.getLogger(PathAttributes.class);
    3436
    3537    public static final PathAttributes EMPTY = new PathAttributes();
     
    182184        }
    183185        if(vault != null) {
    184             dict.setObjectForKey(vault, "Vault");
     186            if(vault.attributes() == this) {
     187                log.debug(String.format("Skip serializing vault attribute %s to avoid recursion", vault));
     188            }
     189            else {
     190                dict.setObjectForKey(vault, "Vault");
     191            }
    185192        }
    186193        return dict.getSerialized();
  • shelves/02.06.2017/core/src/main/java/ch/cyberduck/core/vault/DefaultVaultRegistry.java

    r40738 r41264  
    105105    }
    106106
    107     private Vault find(final Path directory, final LoadingVaultLookupListener listener) throws VaultUnlockCancelException {
     107    protected Vault find(final Path directory, final LoadingVaultLookupListener listener) throws VaultUnlockCancelException {
    108108        final Vault vault = VaultFactory.get(directory.attributes().getVault(), keychain);
    109109        listener.found(vault);
  • shelves/02.06.2017/cryptomator/src/main/java/ch/cyberduck/core/cryptomator/CryptoVault.java

    r41255 r41264  
    167167        this.unlock(masterKeyFile, masterKeyFileContent, bookmark, keyfilePassphrase, prompt,
    168168                MessageFormat.format(LocaleFactory.localizedString("Provide your passphrase to unlock the Cryptomator Vault “{0}“", "Cryptomator"), home.getName()));
    169         // Nullify to avoid recursion
    170         home.attributes().setVault(null);
     169        home.attributes().setVault(home);
    171170        return this;
    172171    }
     
    303302        }
    304303        // Add reference for vault
     304        file.attributes().setVault(home);
    305305        encrypted.attributes().setVault(home);
    306306        return encrypted;
  • shelves/02.06.2017/cryptomator/src/test/java/ch/cyberduck/core/cryptomator/impl/CryptoVaultTest.java

    r41255 r41264  
    2424import ch.cyberduck.core.NullSession;
    2525import ch.cyberduck.core.Path;
     26import ch.cyberduck.core.SerializerFactory;
    2627import ch.cyberduck.core.TestProtocol;
    2728import ch.cyberduck.core.cryptomator.CryptoInvalidFilesizeException;
     
    3334import ch.cyberduck.core.features.Vault;
    3435import ch.cyberduck.core.features.Write;
     36import ch.cyberduck.core.serializer.PathDictionary;
    3537import ch.cyberduck.core.transfer.TransferStatus;
     38import ch.cyberduck.core.vault.DefaultVaultRegistry;
     39import ch.cyberduck.core.vault.LoadingVaultLookupListener;
    3640import ch.cyberduck.core.vault.VaultCredentials;
     41import ch.cyberduck.core.vault.VaultUnlockCancelException;
    3742
    3843import org.apache.commons.io.IOUtils;
     
    9196        assertEquals(vault.encrypt(session, home), vault.encrypt(session, home));
    9297        final Path directory = new Path(home, "dir", EnumSet.of((Path.Type.directory)));
     98        assertNull(directory.attributes().getVault());
     99        assertEquals(home, vault.encrypt(session, directory).attributes().getVault());
     100        assertEquals(home, directory.attributes().getVault());
    93101        assertEquals(vault.encrypt(session, directory), vault.encrypt(session, directory));
    94102        assertEquals(new Path(home, "dir", EnumSet.of(Path.Type.directory, Path.Type.decrypted)), vault.decrypt(session, vault.encrypt(session, directory, true)));
     
    97105        assertEquals(vault.encrypt(session, vault.encrypt(session, directory)).attributes().getDirectoryId(), vault.encrypt(session, vault.encrypt(session, directory)).attributes().getDirectoryId());
    98106        assertNull(vault.encrypt(session, directory, true).attributes().getDirectoryId());
    99         assertNull(vault.encrypt(session, directory, true).attributes().getDirectoryId());
    100107        assertNull(vault.encrypt(session, vault.encrypt(session, directory), true).attributes().getDirectoryId());
    101108        assertNotEquals(vault.encrypt(session, directory).attributes().getDirectoryId(), vault.encrypt(session, directory, true).attributes().getDirectoryId());
     109
    102110        vault.close();
    103111        assertEquals(Vault.State.closed, vault.getState());
     112    }
     113
     114    @Test
     115    public void testFind() throws Exception {
     116        final NullSession session = new NullSession(new Host(new TestProtocol())) {
     117            @Override
     118            @SuppressWarnings("unchecked")
     119            public <T> T _getFeature(final Class<T> type) {
     120                if(type == Read.class) {
     121                    return (T) new Read() {
     122                        @Override
     123                        public InputStream read(final Path file, final TransferStatus status, final ConnectionCallback callback) throws BackgroundException {
     124                            final String masterKey = "{\n" +
     125                                    "  \"scryptSalt\": \"NrC7QGG/ouc=\",\n" +
     126                                    "  \"scryptCostParam\": 16384,\n" +
     127                                    "  \"scryptBlockSize\": 8,\n" +
     128                                    "  \"primaryMasterKey\": \"Q7pGo1l0jmZssoQh9rXFPKJE9NIXvPbL+HcnVSR9CHdkeR8AwgFtcw==\",\n" +
     129                                    "  \"hmacMasterKey\": \"xzBqT4/7uEcQbhHFLC0YmMy4ykVKbuvJEA46p1Xm25mJNuTc20nCbw==\",\n" +
     130                                    "  \"versionMac\": \"hlNr3dz/CmuVajhaiGyCem9lcVIUjDfSMLhjppcXOrM=\",\n" +
     131                                    "  \"version\": 5\n" +
     132                                    "}";
     133                            return IOUtils.toInputStream(masterKey, Charset.defaultCharset());
     134                        }
     135
     136                        @Override
     137                        public boolean offset(final Path file) throws BackgroundException {
     138                            return false;
     139                        }
     140                    };
     141                }
     142                return super._getFeature(type);
     143            }
     144        };
     145        final Path home = new Path("/", EnumSet.of((Path.Type.directory)));
     146        final CryptoVault vault = new CryptoVault(home, new DisabledPasswordStore());
     147        assertEquals(home, vault.load(session, new DisabledPasswordCallback() {
     148            @Override
     149            public void prompt(final Credentials credentials, final String title, final String reason, final LoginOptions options) throws LoginCanceledException {
     150                credentials.setPassword("vault");
     151            }
     152        }).getHome());
     153        assertEquals(Vault.State.open, vault.getState());
     154        final AtomicBoolean found = new AtomicBoolean();
     155        assertEquals(vault, new DefaultVaultRegistry(new DisabledPasswordCallback()) {
     156            protected Vault find(final Path directory, final LoadingVaultLookupListener listener) throws VaultUnlockCancelException {
     157                found.set(true);
     158                return vault;
     159            }
     160        }.find(session, home));
     161        assertTrue(found.get());
     162        vault.close();
     163    }
     164
     165    @Test
     166    public void testSerializeVaultHome() throws Exception {
     167        final NullSession session = new NullSession(new Host(new TestProtocol())) {
     168            @Override
     169            @SuppressWarnings("unchecked")
     170            public <T> T _getFeature(final Class<T> type) {
     171                if(type == Read.class) {
     172                    return (T) new Read() {
     173                        @Override
     174                        public InputStream read(final Path file, final TransferStatus status, final ConnectionCallback callback) throws BackgroundException {
     175                            final String masterKey = "{\n" +
     176                                    "  \"scryptSalt\": \"NrC7QGG/ouc=\",\n" +
     177                                    "  \"scryptCostParam\": 16384,\n" +
     178                                    "  \"scryptBlockSize\": 8,\n" +
     179                                    "  \"primaryMasterKey\": \"Q7pGo1l0jmZssoQh9rXFPKJE9NIXvPbL+HcnVSR9CHdkeR8AwgFtcw==\",\n" +
     180                                    "  \"hmacMasterKey\": \"xzBqT4/7uEcQbhHFLC0YmMy4ykVKbuvJEA46p1Xm25mJNuTc20nCbw==\",\n" +
     181                                    "  \"versionMac\": \"hlNr3dz/CmuVajhaiGyCem9lcVIUjDfSMLhjppcXOrM=\",\n" +
     182                                    "  \"version\": 5\n" +
     183                                    "}";
     184                            return IOUtils.toInputStream(masterKey, Charset.defaultCharset());
     185                        }
     186
     187                        @Override
     188                        public boolean offset(final Path file) throws BackgroundException {
     189                            return false;
     190                        }
     191                    };
     192                }
     193                return super._getFeature(type);
     194            }
     195        };
     196        final Path home = new Path("/", EnumSet.of((Path.Type.directory)));
     197        final CryptoVault vault = new CryptoVault(home, new DisabledPasswordStore());
     198        assertEquals(home, vault.load(session, new DisabledPasswordCallback() {
     199            @Override
     200            public void prompt(final Credentials credentials, final String title, final String reason, final LoginOptions options) throws LoginCanceledException {
     201                credentials.setPassword("vault");
     202            }
     203        }).getHome());
     204        assertEquals(Vault.State.open, vault.getState());
     205        assertEquals(home, new PathDictionary().deserialize(home.serialize(SerializerFactory.get())));
     206        vault.close();
    104207    }
    105208
  • shelves/02.06.2017/ftp/src/test/java/ch/cyberduck/core/ftp/FTPDefaultListServiceTest.java

    r36762 r41264  
    1818 */
    1919
     20import ch.cyberduck.core.AlphanumericRandomStringService;
    2021import ch.cyberduck.core.Credentials;
    2122import ch.cyberduck.core.DisabledCancelCallback;
     
    2829import ch.cyberduck.core.Path;
    2930import ch.cyberduck.core.PathCache;
     31import ch.cyberduck.core.features.Delete;
    3032import ch.cyberduck.core.ftp.parser.CompositeFileEntryParser;
     33import ch.cyberduck.core.shared.DefaultTouchFeature;
     34import ch.cyberduck.core.shared.DefaultUploadFeature;
     35import ch.cyberduck.core.transfer.TransferStatus;
    3136import ch.cyberduck.test.IntegrationTest;
    3237
     
    3641
    3742import java.util.Arrays;
     43import java.util.Collections;
    3844import java.util.EnumSet;
    3945
     
    5561                FTPListService.Command.list);
    5662        final Path directory = new FTPWorkdirService(session).find();
    57         assertTrue(list.list(directory, new DisabledListProgressListener()).contains(new Path(directory, "test", EnumSet.of(Path.Type.file))));
     63        final Path file = new Path(directory, new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.file));
     64        new DefaultTouchFeature<Integer>(new DefaultUploadFeature<Integer>(new FTPWriteFeature(session))).touch(file, new TransferStatus());
     65        assertTrue(list.list(directory, new DisabledListProgressListener()).contains(file));
     66        new FTPDeleteFeature(session).delete(Collections.singletonList(file), new DisabledLoginCallback(), new Delete.DisabledCallback());
    5867        session.close();
    5968    }
     
    7180                FTPListService.Command.lista);
    7281        final Path directory = new FTPWorkdirService(session).find();
    73         assertTrue(list.list(directory, new DisabledListProgressListener()).contains(new Path(directory, "test", EnumSet.of(Path.Type.file))));
     82        final Path file = new Path(directory, new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.file));
     83        new DefaultTouchFeature<Integer>(new DefaultUploadFeature<Integer>(new FTPWriteFeature(session))).touch(file, new TransferStatus());
     84        assertTrue(list.list(directory, new DisabledListProgressListener()).contains(file));
     85        new FTPDeleteFeature(session).delete(Collections.singletonList(file), new DisabledLoginCallback(), new Delete.DisabledCallback());
    7486        session.close();
    7587    }
  • shelves/02.06.2017/ftp/src/test/java/ch/cyberduck/core/ftp/FTPListServiceTest.java

    r39836 r41264  
    6666        final ListService service = new FTPListService(session, null, TimeZone.getDefault());
    6767        final Path directory = new FTPWorkdirService(session).find();
     68        final Path file = new Path(directory, new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.file));
     69        new DefaultTouchFeature<Integer>(new DefaultUploadFeature<Integer>(new FTPWriteFeature(session))).touch(file, new TransferStatus());
     70        final Permission permission = new Permission(Permission.Action.read_write, Permission.Action.read_write, Permission.Action.read_write);
     71        new FTPUnixPermissionFeature(session).setUnixPermission(file, permission);
    6872        final AttributedList<Path> list = service.list(directory, new DisabledListProgressListener() {
    6973            @Override
     
    7276            }
    7377        });
    74         assertTrue(list.contains(
    75                 new Path(directory, "test", EnumSet.of(Path.Type.file))));
    76         assertEquals(new Permission(Permission.Action.read_write, Permission.Action.read_write, Permission.Action.read_write),
    77                 list.get(new Path(directory, "test", EnumSet.of(Path.Type.file))).attributes().getPermission());
     78        assertTrue(list.contains(file));
     79        assertEquals(permission, list.get(file).attributes().getPermission());
     80        new FTPDeleteFeature(session).delete(Collections.singletonList(file), new DisabledLoginCallback(), new Delete.DisabledCallback());
    7881        session.close();
    7982    }
     
    9295        service.remove(FTPListService.Command.mlsd);
    9396        final Path directory = new FTPWorkdirService(session).find();
     97        final Path file = new Path(directory, new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.file));
     98        new DefaultTouchFeature<Integer>(new DefaultUploadFeature<Integer>(new FTPWriteFeature(session))).touch(file, new TransferStatus());
     99        final Permission permission = new Permission(Permission.Action.read_write, Permission.Action.read_write, Permission.Action.read_write);
     100        new FTPUnixPermissionFeature(session).setUnixPermission(file, permission);
    94101        final AttributedList<Path> list = service.list(directory, new DisabledListProgressListener() {
    95102            @Override
     
    98105            }
    99106        });
    100         assertTrue(list.contains(
    101                 new Path(directory, "test", EnumSet.of(Path.Type.file))));
    102         assertEquals(new Permission(Permission.Action.read_write, Permission.Action.read_write, Permission.Action.read_write),
    103                 list.get(new Path(directory, "test", EnumSet.of(Path.Type.file))).attributes().getPermission());
     107        assertTrue(list.contains(file));
     108        assertEquals(permission, list.get(file).attributes().getPermission());
     109        new FTPDeleteFeature(session).delete(Collections.singletonList(file), new DisabledLoginCallback(), new Delete.DisabledCallback());
    104110        session.close();
    105111    }
  • shelves/02.06.2017/ftp/src/test/java/ch/cyberduck/core/ftp/FTPReadFeatureTest.java

    r39836 r41264  
    1919 */
    2020
     21import ch.cyberduck.core.AlphanumericRandomStringService;
    2122import ch.cyberduck.core.Credentials;
    2223import ch.cyberduck.core.DisabledCancelCallback;
     
    3233import ch.cyberduck.core.features.Touch;
    3334import ch.cyberduck.core.io.StreamCopier;
     35import ch.cyberduck.core.shared.DefaultTouchFeature;
     36import ch.cyberduck.core.shared.DefaultUploadFeature;
    3437import ch.cyberduck.core.transfer.TransferStatus;
    3538import ch.cyberduck.test.IntegrationTest;
     
    140143        session.open(new DisabledHostKeyCallback());
    141144        session.login(new DisabledPasswordStore(), new DisabledLoginCallback(), new DisabledCancelCallback(), PathCache.empty());
    142         final Path test = new Path(new FTPWorkdirService(session).find(), UUID.randomUUID().toString(), EnumSet.of(Path.Type.file));
    143         session.getFeature(Touch.class).touch(test, new TransferStatus());
    144145        final TransferStatus status = new TransferStatus();
    145146        status.setLength(5L);
    146147        final Path workdir = new FTPWorkdirService(session).find();
    147         final InputStream in = new FTPReadFeature(session).read(new Path(workdir, "test", EnumSet.of(Path.Type.file)), status, new DisabledConnectionCallback());
     148        final Path file = new Path(workdir, new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.file));
     149        new DefaultTouchFeature<Integer>(new DefaultUploadFeature<Integer>(new FTPWriteFeature(session))).touch(file, new TransferStatus());
     150        final InputStream in = new FTPReadFeature(session).read(file, status, new DisabledConnectionCallback());
    148151        assertNotNull(in);
    149152        // Send ABOR because stream was not read completly
     
    151154        // Make sure subsequent PWD command works
    152155        assertEquals(workdir, new FTPWorkdirService(session).find());
    153         new FTPDeleteFeature(session).delete(Collections.singletonList(test), new DisabledLoginCallback(), new Delete.DisabledCallback());
     156        new FTPDeleteFeature(session).delete(Collections.singletonList(file), new DisabledLoginCallback(), new Delete.DisabledCallback());
    154157        session.close();
    155158    }
     
    192195        session.open(new DisabledHostKeyCallback());
    193196        session.login(new DisabledPasswordStore(), new DisabledLoginCallback(), new DisabledCancelCallback(), PathCache.empty());
    194         final Path test = new Path(new FTPWorkdirService(session).find(), UUID.randomUUID().toString(), EnumSet.of(Path.Type.file));
    195         session.getFeature(Touch.class).touch(test, new TransferStatus());
     197        final Path file = new Path(new FTPWorkdirService(session).find(), UUID.randomUUID().toString(), EnumSet.of(Path.Type.file));
     198        new DefaultTouchFeature<Integer>(new DefaultUploadFeature<Integer>(new FTPWriteFeature(session))).touch(file, new TransferStatus());
    196199        final TransferStatus status = new TransferStatus();
    197200        status.setLength(5L);
    198201        final Path workdir = new FTPWorkdirService(session).find();
    199         final InputStream in = new FTPReadFeature(session).read(new Path(workdir, "test", EnumSet.of(Path.Type.file)), status, new DisabledConnectionCallback());
     202        final InputStream in = new FTPReadFeature(session).read(file, status, new DisabledConnectionCallback());
    200203        assertNotNull(in);
    201204        // Read 226 reply
     
    203206        // Read timeout
    204207        in.close();
     208        new FTPDeleteFeature(session).delete(Collections.singletonList(file), new DisabledLoginCallback(), new Delete.DisabledCallback());
    205209        session.close();
    206210    }
  • shelves/02.06.2017/ftp/src/test/java/ch/cyberduck/core/ftp/FTPStatListServiceTest.java

    r36762 r41264  
    1818 */
    1919
     20import ch.cyberduck.core.AlphanumericRandomStringService;
    2021import ch.cyberduck.core.AttributedList;
    2122import ch.cyberduck.core.Credentials;
     
    3233import ch.cyberduck.core.ftp.parser.CompositeFileEntryParser;
    3334import ch.cyberduck.core.ftp.parser.LaxUnixFTPEntryParser;
     35import ch.cyberduck.core.shared.DefaultTouchFeature;
     36import ch.cyberduck.core.shared.DefaultUploadFeature;
     37import ch.cyberduck.core.transfer.TransferStatus;
    3438import ch.cyberduck.test.IntegrationTest;
    3539
     
    6165                new CompositeFileEntryParser(Collections.singletonList(new UnixFTPEntryParser())));
    6266        final Path directory = new FTPWorkdirService(session).find();
     67        final Path file = new Path(directory, new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.file));
     68        new DefaultTouchFeature<Integer>(new DefaultUploadFeature<Integer>(new FTPWriteFeature(session))).touch(file, new TransferStatus());
     69        final Permission permission = new Permission(Permission.Action.read_write, Permission.Action.read_write, Permission.Action.read_write);
     70        new FTPUnixPermissionFeature(session).setUnixPermission(file, permission);
    6371        final AttributedList<Path> list = service.list(directory, new DisabledListProgressListener());
    64         assertTrue(list.contains(new Path(directory, "test", EnumSet.of(Path.Type.file))));
    65         assertEquals(new Permission(Permission.Action.read_write, Permission.Action.read_write, Permission.Action.read_write),
    66                 list.get(new Path(directory, "test", EnumSet.of(Path.Type.file))).attributes().getPermission());
     72        assertTrue(list.contains(file));
     73        assertEquals(permission,
     74                list.get(file).attributes().getPermission());
    6775        session.close();
    6876    }
  • shelves/02.06.2017/googlestorage/src/test/java/ch/cyberduck/core/SessionFactoryTest.java

    r37157 r41264  
    1919import ch.cyberduck.core.ssl.DefaultX509KeyManager;
    2020import ch.cyberduck.core.ssl.DefaultX509TrustManager;
     21import ch.cyberduck.test.IntegrationTest;
    2122
    2223import org.junit.Test;
     24import org.junit.experimental.categories.Category;
    2325
    2426import static org.junit.Assert.assertNotNull;
    2527
     28@Category(IntegrationTest.class)
    2629public class SessionFactoryTest {
    2730
  • shelves/02.06.2017/googlestorage/src/test/java/ch/cyberduck/core/googlestorage/GoogleStorageUrlProviderTest.java

    r35652 r41264  
    2020import ch.cyberduck.core.Host;
    2121import ch.cyberduck.core.Path;
     22import ch.cyberduck.test.IntegrationTest;
    2223
    2324import org.junit.Test;
     25import org.junit.experimental.categories.Category;
    2426
    2527import java.util.EnumSet;
     
    2729import static org.junit.Assert.assertEquals;
    2830
     31@Category(IntegrationTest.class)
    2932public class GoogleStorageUrlProviderTest {
    3033
  • shelves/02.06.2017/s3/src/main/java/ch/cyberduck/core/s3/RequestEntityRestStorageService.java

    r40738 r41264  
    122122        }
    123123        if(preferences.getBoolean("s3.bucket.requesterpays")) {
    124             // Downloading Objects in Requester Pays Buckets
    125             if("GET".equals(request.getMethod()) || "POST".equals(request.getMethod())) {
    126                 final Jets3tProperties properties = getJetS3tProperties();
    127                 if(!properties.getBoolProperty("s3service.disable-request-payer", false)) {
    128                     // For GET and POST requests, include x-amz-request-payer : requester in the header
    129                     request.addHeader("x-amz-request-payer", "requester");
     124            // Only for AWS
     125            if(session.getHost().getHostname().endsWith(preferences.getProperty("s3.hostname.default"))) {
     126                // Downloading Objects in Requester Pays Buckets
     127                if("GET".equals(request.getMethod()) || "POST".equals(request.getMethod())) {
     128                    final Jets3tProperties properties = getJetS3tProperties();
     129                    if(!properties.getBoolProperty("s3service.disable-request-payer", false)) {
     130                        // For GET and POST requests, include x-amz-request-payer : requester in the header
     131                        request.addHeader("x-amz-request-payer", "requester");
     132                    }
    130133                }
    131134            }
  • shelves/02.06.2017/ssh/src/test/java/ch/cyberduck/core/sftp/SFTPWriteFeatureTest.java

    r39836 r41264  
    22
    33import ch.cyberduck.core.AbstractPath;
     4import ch.cyberduck.core.AlphanumericRandomStringService;
    45import ch.cyberduck.core.AttributedList;
    56import ch.cyberduck.core.Credentials;
     
    146147        session.login(new DisabledPasswordStore(), new DisabledLoginCallback(), new DisabledCancelCallback(), PathCache.empty());
    147148        final Path workdir = new SFTPHomeDirectoryService(session).find();
    148         final Path test = new Path(workdir, UUID.randomUUID().toString(), EnumSet.of(Path.Type.file));
    149         assertEquals(false, new SFTPWriteFeature(session).append(
    150                 new Path(workdir, UUID.randomUUID().toString(), EnumSet.of(Path.Type.file)), 0L, PathCache.empty()).append);
    151         assertEquals(true, new SFTPWriteFeature(session).append(
    152                 new Path(workdir, "test", EnumSet.of(Path.Type.file)), 0L, PathCache.empty()).append);
     149        final Path test = new Path(workdir, new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.file));
     150        assertEquals(false, new SFTPWriteFeature(session).append(test, 0L, PathCache.empty()).append);
     151        new SFTPTouchFeature(session).touch(test, new TransferStatus());
     152        assertEquals(true, new SFTPWriteFeature(session).append(test, 0L, PathCache.empty()).append);
     153        new SFTPDeleteFeature(session).delete(Collections.singletonList(test), new DisabledLoginCallback(), new Delete.DisabledCallback());
    153154    }
    154155
  • shelves/02.06.2017/www/update/changelog.html

    r41255 r41264  
    2727            color: black;
    2828        }
    29 
    30 
    31 
    32 
    3329    </style>
    3430</head>
     
    4642    supports transparent <strong>client-side encryption</strong> using Cryptomator interoperable vaults.
    4743</p>
     44
     45<p>
     46    <a href="https://trac.cyberduck.io/milestone/6.0.4"><strong>Version 6.0.4</strong></a>
     47</p>
     48<ul>
     49    <li>[Bugfix] Failure to upload to root of vault (Cryptomator)</li>
     50    <li>[Bugfix] Disable x-amz-request-payer header for non AWS endpoints (S3)</li>
     51</ul>
    4852
    4953<p>
Note: See TracChangeset for help on using the changeset viewer.
swiss made software