Search in sources :

Example 1 with UpdateMetadataRemoteOperation

use of com.owncloud.android.lib.resources.e2ee.UpdateMetadataRemoteOperation in project android by nextcloud.

the class EncryptionUtils method uploadMetadata.

public static void uploadMetadata(OCFile parentFile, String serializedFolderMetadata, String token, OwnCloudClient client, boolean metadataExists) throws UploadException {
    RemoteOperationResult uploadMetadataOperationResult;
    if (metadataExists) {
        // update metadata
        UpdateMetadataRemoteOperation storeMetadataOperation = new UpdateMetadataRemoteOperation(parentFile.getLocalId(), serializedFolderMetadata, token);
        uploadMetadataOperationResult = storeMetadataOperation.execute(client);
    } else {
        // store metadata
        StoreMetadataRemoteOperation storeMetadataOperation = new StoreMetadataRemoteOperation(parentFile.getLocalId(), serializedFolderMetadata);
        uploadMetadataOperationResult = storeMetadataOperation.execute(client);
    }
    if (!uploadMetadataOperationResult.isSuccess()) {
        throw new UploadException("Storing/updating metadata was not successful");
    }
}
Also used : RemoteOperationResult(com.owncloud.android.lib.common.operations.RemoteOperationResult) UpdateMetadataRemoteOperation(com.owncloud.android.lib.resources.e2ee.UpdateMetadataRemoteOperation) UploadException(com.owncloud.android.operations.UploadException) StoreMetadataRemoteOperation(com.owncloud.android.lib.resources.e2ee.StoreMetadataRemoteOperation)

Example 2 with UpdateMetadataRemoteOperation

use of com.owncloud.android.lib.resources.e2ee.UpdateMetadataRemoteOperation in project android by nextcloud.

the class RemoveRemoteEncryptedFileOperation method run.

/**
 * Performs the remove operation.
 */
@Override
protected RemoteOperationResult run(OwnCloudClient client) {
    RemoteOperationResult result;
    DeleteMethod delete = null;
    String token = null;
    DecryptedFolderMetadata metadata;
    String privateKey = arbitraryDataProvider.getValue(account.name, EncryptionUtils.PRIVATE_KEY);
    try {
        // Lock folder
        RemoteOperationResult lockFileOperationResult = new LockFileRemoteOperation(parentId).execute(client);
        if (lockFileOperationResult.isSuccess()) {
            token = (String) lockFileOperationResult.getData().get(0);
        } else if (lockFileOperationResult.getHttpCode() == HttpStatus.SC_FORBIDDEN) {
            throw new RemoteOperationFailedException("Forbidden! Please try again later.)");
        } else {
            throw new RemoteOperationFailedException("Unknown error!");
        }
        // refresh metadata
        RemoteOperationResult getMetadataOperationResult = new GetMetadataRemoteOperation(parentId).execute(client);
        if (getMetadataOperationResult.isSuccess()) {
            // decrypt metadata
            String serializedEncryptedMetadata = (String) getMetadataOperationResult.getData().get(0);
            EncryptedFolderMetadata encryptedFolderMetadata = EncryptionUtils.deserializeJSON(serializedEncryptedMetadata, new TypeToken<EncryptedFolderMetadata>() {
            });
            metadata = EncryptionUtils.decryptFolderMetaData(encryptedFolderMetadata, privateKey);
        } else {
            throw new RemoteOperationFailedException("No Metadata found!");
        }
        // delete file remote
        delete = new DeleteMethod(client.getFilesDavUri(remotePath));
        delete.setQueryString(new NameValuePair[] { new NameValuePair(E2E_TOKEN, token) });
        int status = client.executeMethod(delete, REMOVE_READ_TIMEOUT, REMOVE_CONNECTION_TIMEOUT);
        // exhaust the response, although not interesting
        delete.getResponseBodyAsString();
        result = new RemoteOperationResult(delete.succeeded() || status == HttpStatus.SC_NOT_FOUND, delete);
        Log_OC.i(TAG, "Remove " + remotePath + ": " + result.getLogMessage());
        // remove file from metadata
        metadata.getFiles().remove(fileName);
        EncryptedFolderMetadata encryptedFolderMetadata = EncryptionUtils.encryptFolderMetadata(metadata, privateKey);
        String serializedFolderMetadata = EncryptionUtils.serializeJSON(encryptedFolderMetadata);
        // upload metadata
        RemoteOperationResult uploadMetadataOperationResult = new UpdateMetadataRemoteOperation(parentId, serializedFolderMetadata, token).execute(client);
        if (!uploadMetadataOperationResult.isSuccess()) {
            throw new RemoteOperationFailedException("Metadata not uploaded!");
        }
        // return success
        return result;
    } catch (NoSuchAlgorithmException | IOException | InvalidKeyException | InvalidAlgorithmParameterException | NoSuchPaddingException | BadPaddingException | IllegalBlockSizeException | InvalidKeySpecException e) {
        result = new RemoteOperationResult(e);
        Log_OC.e(TAG, "Remove " + remotePath + ": " + result.getLogMessage(), e);
    } finally {
        if (delete != null) {
            delete.releaseConnection();
        }
        // unlock file
        if (token != null) {
            RemoteOperationResult unlockFileOperationResult = new UnlockFileRemoteOperation(parentId, token).execute(client);
            if (!unlockFileOperationResult.isSuccess()) {
                Log_OC.e(TAG, "Failed to unlock " + parentId);
            }
        }
    }
    return result;
}
Also used : NameValuePair(org.apache.commons.httpclient.NameValuePair) DeleteMethod(org.apache.jackrabbit.webdav.client.methods.DeleteMethod) InvalidAlgorithmParameterException(java.security.InvalidAlgorithmParameterException) RemoteOperationResult(com.owncloud.android.lib.common.operations.RemoteOperationResult) NoSuchPaddingException(javax.crypto.NoSuchPaddingException) IllegalBlockSizeException(javax.crypto.IllegalBlockSizeException) NoSuchAlgorithmException(java.security.NoSuchAlgorithmException) IOException(java.io.IOException) BadPaddingException(javax.crypto.BadPaddingException) InvalidKeyException(java.security.InvalidKeyException) UnlockFileRemoteOperation(com.owncloud.android.lib.resources.e2ee.UnlockFileRemoteOperation) UpdateMetadataRemoteOperation(com.owncloud.android.lib.resources.e2ee.UpdateMetadataRemoteOperation) GetMetadataRemoteOperation(com.owncloud.android.lib.resources.e2ee.GetMetadataRemoteOperation) EncryptedFolderMetadata(com.owncloud.android.datamodel.EncryptedFolderMetadata) InvalidKeySpecException(java.security.spec.InvalidKeySpecException) DecryptedFolderMetadata(com.owncloud.android.datamodel.DecryptedFolderMetadata) LockFileRemoteOperation(com.owncloud.android.lib.resources.e2ee.LockFileRemoteOperation)

Aggregations

RemoteOperationResult (com.owncloud.android.lib.common.operations.RemoteOperationResult)2 UpdateMetadataRemoteOperation (com.owncloud.android.lib.resources.e2ee.UpdateMetadataRemoteOperation)2 DecryptedFolderMetadata (com.owncloud.android.datamodel.DecryptedFolderMetadata)1 EncryptedFolderMetadata (com.owncloud.android.datamodel.EncryptedFolderMetadata)1 GetMetadataRemoteOperation (com.owncloud.android.lib.resources.e2ee.GetMetadataRemoteOperation)1 LockFileRemoteOperation (com.owncloud.android.lib.resources.e2ee.LockFileRemoteOperation)1 StoreMetadataRemoteOperation (com.owncloud.android.lib.resources.e2ee.StoreMetadataRemoteOperation)1 UnlockFileRemoteOperation (com.owncloud.android.lib.resources.e2ee.UnlockFileRemoteOperation)1 UploadException (com.owncloud.android.operations.UploadException)1 IOException (java.io.IOException)1 InvalidAlgorithmParameterException (java.security.InvalidAlgorithmParameterException)1 InvalidKeyException (java.security.InvalidKeyException)1 NoSuchAlgorithmException (java.security.NoSuchAlgorithmException)1 InvalidKeySpecException (java.security.spec.InvalidKeySpecException)1 BadPaddingException (javax.crypto.BadPaddingException)1 IllegalBlockSizeException (javax.crypto.IllegalBlockSizeException)1 NoSuchPaddingException (javax.crypto.NoSuchPaddingException)1 NameValuePair (org.apache.commons.httpclient.NameValuePair)1 DeleteMethod (org.apache.jackrabbit.webdav.client.methods.DeleteMethod)1