Search in sources :

Example 1 with NodesApi

use of ch.cyberduck.core.sds.io.swagger.client.api.NodesApi in project cyberduck by iterate-ch.

the class SDSDirectoryFeature method createFolder.

private Path createFolder(final Path folder) throws BackgroundException, ApiException {
    final CreateFolderRequest folderRequest = new CreateFolderRequest();
    folderRequest.setParentId(Long.parseLong(nodeid.getVersionId(folder.getParent(), new DisabledListProgressListener())));
    folderRequest.setName(folder.getName());
    final Node node = new NodesApi(session.getClient()).createFolder(folderRequest, StringUtils.EMPTY, null);
    nodeid.cache(folder, String.valueOf(node.getId()));
    return folder.withAttributes(new SDSAttributesAdapter(session).toAttributes(node));
}
Also used : NodesApi(ch.cyberduck.core.sds.io.swagger.client.api.NodesApi) DisabledListProgressListener(ch.cyberduck.core.DisabledListProgressListener) Node(ch.cyberduck.core.sds.io.swagger.client.model.Node) CreateFolderRequest(ch.cyberduck.core.sds.io.swagger.client.model.CreateFolderRequest)

Example 2 with NodesApi

use of ch.cyberduck.core.sds.io.swagger.client.api.NodesApi in project cyberduck by iterate-ch.

the class SDSListService method list.

protected AttributedList<Path> list(final Path directory, final ListProgressListener listener, final int chunksize) throws BackgroundException {
    final AttributedList<Path> children = new AttributedList<Path>();
    try {
        int offset = 0;
        final SDSAttributesAdapter feature = new SDSAttributesAdapter(session);
        NodeList nodes;
        do {
            nodes = new NodesApi(session.getClient()).requestNodes(null, 0, Long.parseLong(nodeid.getVersionId(directory, new DisabledListProgressListener())), false, null, "name:asc", offset, chunksize, StringUtils.EMPTY);
            for (Node node : nodes.getItems()) {
                final PathAttributes attributes = feature.toAttributes(node);
                final EnumSet<Path.Type> type = feature.toType(node);
                final Path file = new Path(directory, node.getName(), type, attributes);
                if (references && node.getCntDeletedVersions() != null && node.getCntDeletedVersions() > 0) {
                    try {
                        final AttributedList<Path> versions = new SDSAttributesFinderFeature(session, nodeid).findDeleted(file, chunksize);
                        children.addAll(versions);
                        attributes.setVersions(versions);
                    } catch (AccessDeniedException e) {
                        log.warn(String.format("Ignore failure %s fetching versions for %s", e, file));
                    }
                }
                children.add(file);
                listener.chunk(directory, children);
            }
            offset += chunksize;
        } while (nodes.getItems().size() == chunksize);
    } catch (ApiException e) {
        throw new SDSExceptionMappingService(nodeid).map("Listing directory {0} failed", e, directory);
    }
    return children;
}
Also used : Path(ch.cyberduck.core.Path) AccessDeniedException(ch.cyberduck.core.exception.AccessDeniedException) DisabledListProgressListener(ch.cyberduck.core.DisabledListProgressListener) NodeList(ch.cyberduck.core.sds.io.swagger.client.model.NodeList) Node(ch.cyberduck.core.sds.io.swagger.client.model.Node) PathAttributes(ch.cyberduck.core.PathAttributes) NodesApi(ch.cyberduck.core.sds.io.swagger.client.api.NodesApi) AttributedList(ch.cyberduck.core.AttributedList) ApiException(ch.cyberduck.core.sds.io.swagger.client.ApiException)

Example 3 with NodesApi

use of ch.cyberduck.core.sds.io.swagger.client.api.NodesApi in project cyberduck by iterate-ch.

the class SDSMissingFileKeysSchedulerFeature method deleteDeprecatedKeyPair.

private void deleteDeprecatedKeyPair(final SDSSession session) throws ApiException, BackgroundException {
    if (new HostPreferences(session.getHost()).getBoolean("sds.encryption.missingkeys.delete.deprecated")) {
        if (session.keyPairDeprecated() != null && !session.keyPairDeprecated().equals(session.keyPair())) {
            final MissingKeysResponse missingKeys = new NodesApi(session.getClient()).requestMissingFileKeys(null, 1, null, null, session.userAccount().getId(), "previous_user_key", null);
            if (missingKeys.getItems().isEmpty()) {
                log.debug("No more deprecated fileKeys to migrate - deleting deprecated key pair");
                new UserApi(session.getClient()).removeUserKeyPair(session.keyPairDeprecated().getPublicKeyContainer().getVersion(), null);
                session.resetUserKeyPairs();
            }
        }
    }
}
Also used : NodesApi(ch.cyberduck.core.sds.io.swagger.client.api.NodesApi) MissingKeysResponse(ch.cyberduck.core.sds.io.swagger.client.model.MissingKeysResponse) UserApi(ch.cyberduck.core.sds.io.swagger.client.api.UserApi) HostPreferences(ch.cyberduck.core.preferences.HostPreferences)

Example 4 with NodesApi

use of ch.cyberduck.core.sds.io.swagger.client.api.NodesApi in project cyberduck by iterate-ch.

the class SDSMissingFileKeysSchedulerFeature method operate.

@Override
public List<UserFileKeySetRequest> operate(final Session<?> client, final PasswordCallback callback, final Path file) throws BackgroundException {
    final SDSSession session = (SDSSession) client;
    final SDSNodeIdProvider nodeid = (SDSNodeIdProvider) session._getFeature(VersionIdProvider.class);
    try {
        final UserAccountWrapper account = session.userAccount();
        if (!account.isEncryptionEnabled()) {
            log.warn(String.format("No key pair found in user account %s", account));
            return Collections.emptyList();
        }
        final List<UserFileKeySetRequest> processed = new ArrayList<>();
        final UserKeyPairContainer userKeyPairContainer = session.keyPair();
        final UserKeyPair keyPair = TripleCryptConverter.toCryptoUserKeyPair(userKeyPairContainer);
        final TripleCryptKeyPair triplecrypt = new TripleCryptKeyPair();
        final Credentials passphrase = triplecrypt.unlock(callback, session.getHost(), keyPair);
        final UserKeyPairContainer userKeyPairContainerDeprecated = session.keyPairDeprecated();
        Credentials passphraseDeprecated = passphrase;
        if (userKeyPairContainerDeprecated != null) {
            passphraseDeprecated = triplecrypt.unlock(callback, session.getHost(), TripleCryptConverter.toCryptoUserKeyPair(userKeyPairContainerDeprecated));
        }
        // Null when operating from scheduler. File reference is set for post upload.
        final Long fileId = file != null ? Long.parseLong(nodeid.getVersionId(file, new DisabledListProgressListener())) : null;
        UserFileKeySetBatchRequest request;
        do {
            if (log.isDebugEnabled()) {
                log.debug(String.format("Request a list of missing file keys for file %s", file));
            }
            request = new UserFileKeySetBatchRequest();
            final MissingKeysResponse missingKeys = new NodesApi(session.getClient()).requestMissingFileKeys(null, null, null, fileId, null, null, null);
            final Map<Long, List<UserUserPublicKey>> userPublicKeys = missingKeys.getUsers().stream().collect(groupingBy(UserUserPublicKey::getId));
            final Map<Long, List<FileFileKeys>> files = missingKeys.getFiles().stream().collect(groupingBy(FileFileKeys::getId));
            for (UserIdFileIdItem item : missingKeys.getItems()) {
                for (FileFileKeys fileKey : files.get(item.getFileId())) {
                    final EncryptedFileKey encryptedFileKey = TripleCryptConverter.toCryptoEncryptedFileKey(fileKey.getFileKeyContainer());
                    final UserKeyPairContainer keyPairForDecryption = session.getKeyPairForFileKey(encryptedFileKey.getVersion());
                    for (UserUserPublicKey userPublicKey : userPublicKeys.get(item.getUserId())) {
                        final EncryptedFileKey fk = this.encryptFileKey(TripleCryptConverter.toCryptoUserPrivateKey(keyPairForDecryption.getPrivateKeyContainer()), encryptedFileKey.getVersion() == EncryptedFileKey.Version.RSA2048_AES256GCM ? passphraseDeprecated : passphrase, userPublicKey, fileKey);
                        final UserFileKeySetRequest keySetRequest = new UserFileKeySetRequest().fileId(item.getFileId()).userId(item.getUserId()).fileKey(TripleCryptConverter.toSwaggerFileKey(fk));
                        if (log.isDebugEnabled()) {
                            log.debug(String.format("Missing file key processed for file %d and user %d", item.getFileId(), item.getUserId()));
                        }
                        request.addItemsItem(keySetRequest);
                    }
                }
            }
            if (!request.getItems().isEmpty()) {
                if (log.isDebugEnabled()) {
                    log.debug(String.format("Set file keys with %s", request));
                }
                new NodesApi(session.getClient()).setUserFileKeys(request, StringUtils.EMPTY);
                processed.addAll(request.getItems());
            }
        } while (!request.getItems().isEmpty());
        this.deleteDeprecatedKeyPair(session);
        return processed;
    } catch (ApiException e) {
        throw new SDSExceptionMappingService(nodeid).map(e);
    } catch (CryptoException e) {
        throw new TripleCryptExceptionMappingService().map(e);
    }
}
Also used : MissingKeysResponse(ch.cyberduck.core.sds.io.swagger.client.model.MissingKeysResponse) DisabledListProgressListener(ch.cyberduck.core.DisabledListProgressListener) EncryptedFileKey(com.dracoon.sdk.crypto.model.EncryptedFileKey) ArrayList(java.util.ArrayList) TripleCryptKeyPair(ch.cyberduck.core.sds.triplecrypt.TripleCryptKeyPair) NodesApi(ch.cyberduck.core.sds.io.swagger.client.api.NodesApi) FileFileKeys(ch.cyberduck.core.sds.io.swagger.client.model.FileFileKeys) ArrayList(java.util.ArrayList) List(java.util.List) UserKeyPair(com.dracoon.sdk.crypto.model.UserKeyPair) UserKeyPairContainer(ch.cyberduck.core.sds.io.swagger.client.model.UserKeyPairContainer) VersionIdProvider(ch.cyberduck.core.features.VersionIdProvider) UserUserPublicKey(ch.cyberduck.core.sds.io.swagger.client.model.UserUserPublicKey) UserFileKeySetRequest(ch.cyberduck.core.sds.io.swagger.client.model.UserFileKeySetRequest) UserIdFileIdItem(ch.cyberduck.core.sds.io.swagger.client.model.UserIdFileIdItem) UserFileKeySetBatchRequest(ch.cyberduck.core.sds.io.swagger.client.model.UserFileKeySetBatchRequest) TripleCryptExceptionMappingService(ch.cyberduck.core.sds.triplecrypt.TripleCryptExceptionMappingService) CryptoException(com.dracoon.sdk.crypto.error.CryptoException) Credentials(ch.cyberduck.core.Credentials) ApiException(ch.cyberduck.core.sds.io.swagger.client.ApiException)

Example 5 with NodesApi

use of ch.cyberduck.core.sds.io.swagger.client.api.NodesApi in project cyberduck by iterate-ch.

the class SDSMoveFeature method move.

@Override
public Path move(final Path file, final Path renamed, final TransferStatus status, final Delete.Callback callback, final ConnectionCallback connectionCallback) throws BackgroundException {
    try {
        final long nodeId = Long.parseLong(nodeid.getVersionId(file, new DisabledListProgressListener()));
        if (containerService.isContainer(file)) {
            final Node node = new NodesApi(session.getClient()).updateRoom(new UpdateRoomRequest().name(renamed.getName()), nodeId, StringUtils.EMPTY, null);
            nodeid.cache(renamed, file.attributes().getVersionId());
            nodeid.cache(file, null);
            return renamed.withAttributes(new SDSAttributesAdapter(session).toAttributes(node));
        } else {
            if (status.isExists()) {
                // Handle case insensitive. Find feature will have reported target to exist if same name with different case
                if (!new CaseInsensitivePathPredicate(file).test(renamed)) {
                    log.warn(String.format("Delete existing file %s", renamed));
                    new SDSDeleteFeature(session, nodeid).delete(Collections.singletonMap(renamed, status), connectionCallback, callback);
                }
            }
            if (new SimplePathPredicate(file.getParent()).test(renamed.getParent())) {
                // Rename only
                if (file.isDirectory()) {
                    new NodesApi(session.getClient()).updateFolder(new UpdateFolderRequest().name(renamed.getName()), nodeId, StringUtils.EMPTY, null);
                } else {
                    new NodesApi(session.getClient()).updateFile(new UpdateFileRequest().name(renamed.getName()), nodeId, StringUtils.EMPTY, null);
                }
            } else {
                // Move to different parent
                new NodesApi(session.getClient()).moveNodes(new MoveNodesRequest().resolutionStrategy(MoveNodesRequest.ResolutionStrategyEnum.OVERWRITE).addItemsItem(new MoveNode().id(nodeId).name(renamed.getName())).keepShareLinks(new HostPreferences(session.getHost()).getBoolean("sds.upload.sharelinks.keep")), Long.parseLong(nodeid.getVersionId(renamed.getParent(), new DisabledListProgressListener())), StringUtils.EMPTY, null);
            }
            nodeid.cache(renamed, file.attributes().getVersionId());
            nodeid.cache(file, null);
            // Copy original file attributes
            return renamed.withAttributes(new PathAttributes(file.attributes()).withVersionId(String.valueOf(nodeId)));
        }
    } catch (ApiException e) {
        throw new SDSExceptionMappingService(nodeid).map("Cannot rename {0}", e, file);
    }
}
Also used : CaseInsensitivePathPredicate(ch.cyberduck.core.CaseInsensitivePathPredicate) DisabledListProgressListener(ch.cyberduck.core.DisabledListProgressListener) Node(ch.cyberduck.core.sds.io.swagger.client.model.Node) MoveNode(ch.cyberduck.core.sds.io.swagger.client.model.MoveNode) PathAttributes(ch.cyberduck.core.PathAttributes) MoveNode(ch.cyberduck.core.sds.io.swagger.client.model.MoveNode) HostPreferences(ch.cyberduck.core.preferences.HostPreferences) NodesApi(ch.cyberduck.core.sds.io.swagger.client.api.NodesApi) UpdateRoomRequest(ch.cyberduck.core.sds.io.swagger.client.model.UpdateRoomRequest) MoveNodesRequest(ch.cyberduck.core.sds.io.swagger.client.model.MoveNodesRequest) SimplePathPredicate(ch.cyberduck.core.SimplePathPredicate) UpdateFileRequest(ch.cyberduck.core.sds.io.swagger.client.model.UpdateFileRequest) UpdateFolderRequest(ch.cyberduck.core.sds.io.swagger.client.model.UpdateFolderRequest) ApiException(ch.cyberduck.core.sds.io.swagger.client.ApiException)

Aggregations

NodesApi (ch.cyberduck.core.sds.io.swagger.client.api.NodesApi)28 DisabledListProgressListener (ch.cyberduck.core.DisabledListProgressListener)19 ApiException (ch.cyberduck.core.sds.io.swagger.client.ApiException)18 Node (ch.cyberduck.core.sds.io.swagger.client.model.Node)12 Path (ch.cyberduck.core.Path)10 TransferStatus (ch.cyberduck.core.transfer.TransferStatus)8 AlphanumericRandomStringService (ch.cyberduck.core.AlphanumericRandomStringService)6 Credentials (ch.cyberduck.core.Credentials)6 DisabledConnectionCallback (ch.cyberduck.core.DisabledConnectionCallback)6 DisabledLoginCallback (ch.cyberduck.core.DisabledLoginCallback)6 PathAttributes (ch.cyberduck.core.PathAttributes)6 Delete (ch.cyberduck.core.features.Delete)6 StreamCopier (ch.cyberduck.core.io.StreamCopier)6 IntegrationTest (ch.cyberduck.test.IntegrationTest)6 EncryptedFileKey (com.dracoon.sdk.crypto.model.EncryptedFileKey)6 Test (org.junit.Test)6 Host (ch.cyberduck.core.Host)5 LoginOptions (ch.cyberduck.core.LoginOptions)5 HostPreferences (ch.cyberduck.core.preferences.HostPreferences)5 EncryptRoomRequest (ch.cyberduck.core.sds.io.swagger.client.model.EncryptRoomRequest)5