/* * ownCloud Android client application * * @author masensio * @author David A. Velasco * @author TSI-mc * Copyright (C) 2015 ownCloud Inc. * Copyright (C) 2023 TSI-mc * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ package com.owncloud.android.operations; import android.text.TextUtils; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.resources.files.FileUtils; import com.owncloud.android.lib.resources.shares.CreateShareRemoteOperation; import com.owncloud.android.lib.resources.shares.OCShare; import com.owncloud.android.lib.resources.shares.ShareType; import com.owncloud.android.operations.common.SyncOperation; import java.util.Arrays; import java.util.HashSet; import java.util.Set; /** * Creates a new private share for a given file. */ public class CreateShareWithShareeOperation extends SyncOperation { private String path; private String shareeName; private ShareType shareType; private int permissions; private String noteMessage; private String sharePassword; private boolean hideFileDownload; private long expirationDateInMillis; private String label; private static final Set supportedShareTypes = new HashSet<>(Arrays.asList(ShareType.USER, ShareType.GROUP, ShareType.FEDERATED, ShareType.EMAIL, ShareType.ROOM, ShareType.CIRCLE)); /** * Constructor. * * @param path Full path of the file/folder being shared. * @param shareeName User or group name of the target sharee. * @param shareType Type of share determines type of sharee; {@link ShareType#USER} and {@link ShareType#GROUP} * are the only valid values for the moment. * @param permissions Share permissions key as detailed in * https://docs.nextcloud.com/server/latest/developer_manual/client_apis/OCS/ocs-share-api.html#create-a-new-share * . */ public CreateShareWithShareeOperation(String path, String shareeName, ShareType shareType, int permissions, FileDataStorageManager storageManager) { super(storageManager); if (!supportedShareTypes.contains(shareType)) { throw new IllegalArgumentException("Illegal share type " + shareType); } this.path = path; this.shareeName = shareeName; this.shareType = shareType; this.permissions = permissions; } /** * Constructor. * * @param path Full path of the file/folder being shared. * @param shareeName User or group name of the target sharee. * @param shareType Type of share determines type of sharee; {@link ShareType#USER} and {@link ShareType#GROUP} * are the only valid values for the moment. * @param permissions Share permissions key as detailed in https://doc.owncloud.org/server/8.2/developer_manual/core/ocs-share-api.html * . */ public CreateShareWithShareeOperation(String path, String shareeName, ShareType shareType, int permissions, String noteMessage, String sharePassword, long expirationDateInMillis, boolean hideFileDownload, FileDataStorageManager storageManager) { super(storageManager); if (!supportedShareTypes.contains(shareType)) { throw new IllegalArgumentException("Illegal share type " + shareType); } this.path = path; this.shareeName = shareeName; this.shareType = shareType; this.permissions = permissions; this.expirationDateInMillis = expirationDateInMillis; this.hideFileDownload = hideFileDownload; this.noteMessage = noteMessage; this.sharePassword = sharePassword; } @Override protected RemoteOperationResult run(OwnCloudClient client) { CreateShareRemoteOperation operation = new CreateShareRemoteOperation( path, shareType, shareeName, false, sharePassword, permissions, noteMessage ); operation.setGetShareDetails(true); RemoteOperationResult result = operation.execute(client); if (result.isSuccess() && result.getData().size() > 0) { OCShare share = (OCShare) result.getData().get(0); //once creating share link update other information UpdateShareInfoOperation updateShareInfoOperation = new UpdateShareInfoOperation(share, getStorageManager()); updateShareInfoOperation.setExpirationDateInMillis(expirationDateInMillis); updateShareInfoOperation.setHideFileDownload(hideFileDownload); updateShareInfoOperation.setLabel(label); //execute and save the result in database RemoteOperationResult updateShareInfoResult = updateShareInfoOperation.execute(client); if (updateShareInfoResult.isSuccess() && updateShareInfoResult.getData().size() > 0) { OCShare shareUpdated = (OCShare) updateShareInfoResult.getData().get(0); updateData(shareUpdated); } } return result; } private void updateData(OCShare share) { // Update DB with the response share.setPath(path); share.setFolder(path.endsWith(FileUtils.PATH_SEPARATOR)); share.setPasswordProtected(!TextUtils.isEmpty(sharePassword)); getStorageManager().saveShare(share); // Update OCFile with data from share: ShareByLink and publicLink OCFile file = getStorageManager().getFileByPath(path); if (file != null) { file.setSharedWithSharee(true); // TODO - this should be done by the FileContentProvider, as part of getStorageManager().saveShare(share) getStorageManager().saveFile(file); } } public String getPath() { return this.path; } public void setLabel(String label) { this.label = label; } }