Search in sources :

Example 1 with LockFileRemoteOperation

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

the class EncryptionUtils method lockFolder.

public static String lockFolder(OCFile parentFile, OwnCloudClient client) throws UploadException {
    // Lock folder
    LockFileRemoteOperation lockFileOperation = new LockFileRemoteOperation(parentFile.getLocalId());
    RemoteOperationResult lockFileOperationResult = lockFileOperation.execute(client);
    if (lockFileOperationResult.isSuccess() && !TextUtils.isEmpty((String) lockFileOperationResult.getData().get(0))) {
        return (String) lockFileOperationResult.getData().get(0);
    } else if (lockFileOperationResult.getHttpCode() == HttpStatus.SC_FORBIDDEN) {
        throw new UploadException("Forbidden! Please try again later.)");
    } else {
        throw new UploadException("Could not lock folder");
    }
}
Also used : RemoteOperationResult(com.owncloud.android.lib.common.operations.RemoteOperationResult) UploadException(com.owncloud.android.operations.UploadException) LockFileRemoteOperation(com.owncloud.android.lib.resources.e2ee.LockFileRemoteOperation)

Example 2 with LockFileRemoteOperation

use of com.owncloud.android.lib.resources.e2ee.LockFileRemoteOperation 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 LockFileRemoteOperation (com.owncloud.android.lib.resources.e2ee.LockFileRemoteOperation)2 DecryptedFolderMetadata (com.owncloud.android.datamodel.DecryptedFolderMetadata)1 EncryptedFolderMetadata (com.owncloud.android.datamodel.EncryptedFolderMetadata)1 GetMetadataRemoteOperation (com.owncloud.android.lib.resources.e2ee.GetMetadataRemoteOperation)1 UnlockFileRemoteOperation (com.owncloud.android.lib.resources.e2ee.UnlockFileRemoteOperation)1 UpdateMetadataRemoteOperation (com.owncloud.android.lib.resources.e2ee.UpdateMetadataRemoteOperation)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