Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"formatVersion": 1,
"database": {
"version": 86,
"identityHash": "a657c5557784ebaff12f7709fc3fd6dd",
"identityHash": "277489b9d4a6ee84f96d09dea39591ba",
"entities": [
{
"tableName": "arbitrary_data",
Expand Down Expand Up @@ -44,7 +44,7 @@
},
{
"tableName": "capabilities",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `assistant` INTEGER, `account` TEXT, `version_mayor` INTEGER, `version_minor` INTEGER, `version_micro` INTEGER, `version_string` TEXT, `version_edition` TEXT, `extended_support` INTEGER, `core_pollinterval` INTEGER, `sharing_api_enabled` INTEGER, `sharing_public_enabled` INTEGER, `sharing_public_password_enforced` INTEGER, `sharing_public_expire_date_enabled` INTEGER, `sharing_public_expire_date_days` INTEGER, `sharing_public_expire_date_enforced` INTEGER, `sharing_public_send_mail` INTEGER, `sharing_public_upload` INTEGER, `sharing_user_send_mail` INTEGER, `sharing_resharing` INTEGER, `sharing_federation_outgoing` INTEGER, `sharing_federation_incoming` INTEGER, `files_bigfilechunking` INTEGER, `files_undelete` INTEGER, `files_versioning` INTEGER, `external_links` INTEGER, `server_name` TEXT, `server_color` TEXT, `server_text_color` TEXT, `server_element_color` TEXT, `server_slogan` TEXT, `server_logo` TEXT, `background_url` TEXT, `end_to_end_encryption` INTEGER, `end_to_end_encryption_keys_exist` INTEGER, `end_to_end_encryption_api_version` TEXT, `activity` INTEGER, `background_default` INTEGER, `background_plain` INTEGER, `richdocument` INTEGER, `richdocument_mimetype_list` TEXT, `richdocument_direct_editing` INTEGER, `richdocument_direct_templates` INTEGER, `richdocument_optional_mimetype_list` TEXT, `sharing_public_ask_for_optional_password` INTEGER, `richdocument_product_name` TEXT, `direct_editing_etag` TEXT, `user_status` INTEGER, `user_status_supports_emoji` INTEGER, `etag` TEXT, `files_locking_version` TEXT, `groupfolders` INTEGER, `drop_account` INTEGER, `security_guard` INTEGER, `forbidden_filename_characters` INTEGER, `forbidden_filenames` INTEGER, `forbidden_filename_extensions` INTEGER, `forbidden_filename_basenames` INTEGER, `recommendation` INTEGER)",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `assistant` INTEGER, `account` TEXT, `version_mayor` INTEGER, `version_minor` INTEGER, `version_micro` INTEGER, `version_string` TEXT, `version_edition` TEXT, `extended_support` INTEGER, `core_pollinterval` INTEGER, `sharing_api_enabled` INTEGER, `sharing_public_enabled` INTEGER, `sharing_public_password_enforced` INTEGER, `sharing_public_expire_date_enabled` INTEGER, `sharing_public_expire_date_days` INTEGER, `sharing_public_expire_date_enforced` INTEGER, `sharing_public_send_mail` INTEGER, `sharing_public_upload` INTEGER, `sharing_user_send_mail` INTEGER, `sharing_resharing` INTEGER, `sharing_federation_outgoing` INTEGER, `sharing_federation_incoming` INTEGER, `files_bigfilechunking` INTEGER, `files_undelete` INTEGER, `files_versioning` INTEGER, `external_links` INTEGER, `server_name` TEXT, `server_color` TEXT, `server_text_color` TEXT, `server_element_color` TEXT, `server_slogan` TEXT, `server_logo` TEXT, `background_url` TEXT, `end_to_end_encryption` INTEGER, `end_to_end_encryption_keys_exist` INTEGER, `end_to_end_encryption_api_version` TEXT, `activity` INTEGER, `background_default` INTEGER, `background_plain` INTEGER, `richdocument` INTEGER, `richdocument_mimetype_list` TEXT, `richdocument_direct_editing` INTEGER, `richdocument_direct_templates` INTEGER, `richdocument_optional_mimetype_list` TEXT, `sharing_public_ask_for_optional_password` INTEGER, `richdocument_product_name` TEXT, `direct_editing_etag` TEXT, `user_status` INTEGER, `user_status_supports_emoji` INTEGER, `etag` TEXT, `files_locking_version` TEXT, `groupfolders` INTEGER, `drop_account` INTEGER, `security_guard` INTEGER, `forbidden_filename_characters` INTEGER, `forbidden_filenames` INTEGER, `forbidden_filename_extensions` INTEGER, `forbidden_filename_basenames` INTEGER, `files_download_limit` INTEGER, `files_download_limit_default` INTEGER, `recommendation` INTEGER)",
"fields": [
{
"fieldPath": "id",
Expand Down Expand Up @@ -394,6 +394,18 @@
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "filesDownloadLimit",
"columnName": "files_download_limit",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "filesDownloadLimitDefault",
"columnName": "files_download_limit_default",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "recommendation",
"columnName": "recommendation",
Expand Down Expand Up @@ -851,7 +863,7 @@
},
{
"tableName": "ocshares",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `file_source` INTEGER, `item_source` INTEGER, `share_type` INTEGER, `shate_with` TEXT, `path` TEXT, `permissions` INTEGER, `shared_date` INTEGER, `expiration_date` INTEGER, `token` TEXT, `shared_with_display_name` TEXT, `is_directory` INTEGER, `user_id` TEXT, `id_remote_shared` INTEGER, `owner_share` TEXT, `is_password_protected` INTEGER, `note` TEXT, `hide_download` INTEGER, `share_link` TEXT, `share_label` TEXT)",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `file_source` INTEGER, `item_source` INTEGER, `share_type` INTEGER, `shate_with` TEXT, `path` TEXT, `permissions` INTEGER, `shared_date` INTEGER, `expiration_date` INTEGER, `token` TEXT, `shared_with_display_name` TEXT, `is_directory` INTEGER, `user_id` TEXT, `id_remote_shared` INTEGER, `owner_share` TEXT, `is_password_protected` INTEGER, `note` TEXT, `hide_download` INTEGER, `share_link` TEXT, `share_label` TEXT, `download_limit_limit` INTEGER, `download_limit_count` INTEGER)",
"fields": [
{
"fieldPath": "id",
Expand Down Expand Up @@ -972,6 +984,18 @@
"columnName": "share_label",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "downloadLimitLimit",
"columnName": "download_limit_limit",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "downloadLimitCount",
"columnName": "download_limit_count",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
Expand Down Expand Up @@ -1301,7 +1325,7 @@
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'a657c5557784ebaff12f7709fc3fd6dd')"
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '277489b9d4a6ee84f96d09dea39591ba')"
]
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import androidx.test.espresso.matcher.ViewMatchers.withText
import com.google.android.apps.common.testing.accessibility.framework.AccessibilityCheckResultBaseUtils.matchesCheckNames
import com.google.android.apps.common.testing.accessibility.framework.AccessibilityCheckResultUtils.matchesViews
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.nextcloud.android.lib.resources.files.FileDownloadLimit
import com.nextcloud.test.RetryTestRule
import com.nextcloud.test.TestActivity
import com.owncloud.android.AbstractIT
Expand Down Expand Up @@ -93,6 +94,51 @@ class FileDetailSharingFragmentIT : AbstractIT() {
show(file)
}

@Test
@ScreenshotTest
fun listSharesDownloadLimit() {
OCShare(file.decryptedRemotePath).apply {
remoteId = 1
shareType = ShareType.PUBLIC_LINK
token = "AAAAAAAAAAAAAAA"
activity.storageManager.saveShare(this)
}

OCShare(file.decryptedRemotePath).apply {
remoteId = 2
shareType = ShareType.PUBLIC_LINK
token = "BBBBBBBBBBBBBBB"
fileDownloadLimit = FileDownloadLimit("BBBBBBBBBBBBBBB", 0, 0)
activity.storageManager.saveShare(this)
}

OCShare(file.decryptedRemotePath).apply {
remoteId = 3
shareType = ShareType.PUBLIC_LINK
token = "CCCCCCCCCCCCCCC"
fileDownloadLimit = FileDownloadLimit("CCCCCCCCCCCCCCC", 10, 0)
activity.storageManager.saveShare(this)
}

OCShare(file.decryptedRemotePath).apply {
remoteId = 4
shareType = ShareType.PUBLIC_LINK
token = "DDDDDDDDDDDDDDD"
fileDownloadLimit = FileDownloadLimit("DDDDDDDDDDDDDDD", 10, 5)
activity.storageManager.saveShare(this)
}

OCShare(file.decryptedRemotePath).apply {
remoteId = 5
shareType = ShareType.PUBLIC_LINK
token = "FFFFFFFFFFFFFFF"
fileDownloadLimit = FileDownloadLimit("FFFFFFFFFFFFFFF", 10, 10)
activity.storageManager.saveShare(this)
}

show(file)
}

/**
* Use same values as {@link OCFileListFragmentStaticServerIT showSharedFiles }
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,10 @@ data class CapabilityEntity(
val forbiddenFileNameExtensions: Int?,
@ColumnInfo(name = ProviderTableMeta.CAPABILITIES_FORBIDDEN_FORBIDDEN_FILENAME_BASE_NAMES)
val forbiddenFilenameBaseNames: Int?,
@ColumnInfo(name = ProviderTableMeta.CAPABILITIES_FILES_DOWNLOAD_LIMIT)
val filesDownloadLimit: Int?,
@ColumnInfo(name = ProviderTableMeta.CAPABILITIES_FILES_DOWNLOAD_LIMIT_DEFAULT)
val filesDownloadLimitDefault: Int?,
@ColumnInfo(name = ProviderTableMeta.CAPABILITIES_RECOMMENDATION)
val recommendation: Int?
)
Original file line number Diff line number Diff line change
Expand Up @@ -54,5 +54,9 @@ data class ShareEntity(
@ColumnInfo(name = ProviderTableMeta.OCSHARES_SHARE_LINK)
val shareLink: String?,
@ColumnInfo(name = ProviderTableMeta.OCSHARES_SHARE_LABEL)
val shareLabel: String?
val shareLabel: String?,
@ColumnInfo(name = ProviderTableMeta.OCSHARES_DOWNLOADLIMIT_LIMIT)
val downloadLimitLimit: Int?,
@ColumnInfo(name = ProviderTableMeta.OCSHARES_DOWNLOADLIMIT_COUNT)
val downloadLimitCount: Int?
)
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@

import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.nextcloud.android.lib.resources.files.FileDownloadLimit;
import com.nextcloud.client.account.User;
import com.nextcloud.client.database.NextcloudDatabase;
import com.nextcloud.client.database.dao.FileDao;
Expand Down Expand Up @@ -1556,6 +1557,15 @@ private ContentValues createContentValueForShare(OCShare share) {
contentValues.put(ProviderTableMeta.OCSHARES_SHARE_LINK, share.getShareLink());
contentValues.put(ProviderTableMeta.OCSHARES_SHARE_LABEL, share.getLabel());

FileDownloadLimit downloadLimit = share.getFileDownloadLimit();
if (downloadLimit != null) {
contentValues.put(ProviderTableMeta.OCSHARES_DOWNLOADLIMIT_LIMIT, downloadLimit.getLimit());
contentValues.put(ProviderTableMeta.OCSHARES_DOWNLOADLIMIT_COUNT, downloadLimit.getCount());
} else {
contentValues.putNull(ProviderTableMeta.OCSHARES_DOWNLOADLIMIT_LIMIT);
contentValues.putNull(ProviderTableMeta.OCSHARES_DOWNLOADLIMIT_COUNT);
}

return contentValues;
}

Expand All @@ -1569,7 +1579,8 @@ private OCShare createShareInstance(Cursor cursor) {
share.setPermissions(getInt(cursor, ProviderTableMeta.OCSHARES_PERMISSIONS));
share.setSharedDate(getLong(cursor, ProviderTableMeta.OCSHARES_SHARED_DATE));
share.setExpirationDate(getLong(cursor, ProviderTableMeta.OCSHARES_EXPIRATION_DATE));
share.setToken(getString(cursor, ProviderTableMeta.OCSHARES_TOKEN));
String token = getString(cursor, ProviderTableMeta.OCSHARES_TOKEN);
share.setToken(token);
share.setSharedWithDisplayName(getString(cursor, ProviderTableMeta.OCSHARES_SHARE_WITH_DISPLAY_NAME));
share.setFolder(getInt(cursor, ProviderTableMeta.OCSHARES_IS_DIRECTORY) == 1);
share.setUserId(getString(cursor, ProviderTableMeta.OCSHARES_USER_ID));
Expand All @@ -1580,6 +1591,11 @@ private OCShare createShareInstance(Cursor cursor) {
share.setShareLink(getString(cursor, ProviderTableMeta.OCSHARES_SHARE_LINK));
share.setLabel(getString(cursor, ProviderTableMeta.OCSHARES_SHARE_LABEL));

FileDownloadLimit downloadLimit = new FileDownloadLimit(token,
getInt(cursor, ProviderTableMeta.OCSHARES_DOWNLOADLIMIT_LIMIT),
getInt(cursor, ProviderTableMeta.OCSHARES_DOWNLOADLIMIT_COUNT));
share.setFileDownloadLimit(downloadLimit);

return share;
}

Expand Down Expand Up @@ -2294,6 +2310,8 @@ private ContentValues createContentValues(String accountName, OCCapability capab
contentValues.put(ProviderTableMeta.CAPABILITIES_FORBIDDEN_FILENAMES, capability.getForbiddenFilenamesJson());
contentValues.put(ProviderTableMeta.CAPABILITIES_FORBIDDEN_FORBIDDEN_FILENAME_EXTENSIONS, capability.getForbiddenFilenameExtensionJson());
contentValues.put(ProviderTableMeta.CAPABILITIES_FORBIDDEN_FORBIDDEN_FILENAME_BASE_NAMES, capability.getForbiddenFilenameBaseNamesJson());
contentValues.put(ProviderTableMeta.CAPABILITIES_FILES_DOWNLOAD_LIMIT, capability.getFilesDownloadLimit().getValue());
contentValues.put(ProviderTableMeta.CAPABILITIES_FILES_DOWNLOAD_LIMIT_DEFAULT, capability.getFilesDownloadLimitDefault());

contentValues.put(ProviderTableMeta.CAPABILITIES_RECOMMENDATION, capability.getRecommendations().getValue());

Expand Down Expand Up @@ -2470,7 +2488,8 @@ private OCCapability createCapabilityInstance(Cursor cursor) {
capability.setForbiddenFilenamesJson(getString(cursor, ProviderTableMeta.CAPABILITIES_FORBIDDEN_FILENAMES));
capability.setForbiddenFilenameExtensionJson(getString(cursor, ProviderTableMeta.CAPABILITIES_FORBIDDEN_FORBIDDEN_FILENAME_EXTENSIONS));
capability.setForbiddenFilenameBaseNamesJson(getString(cursor, ProviderTableMeta.CAPABILITIES_FORBIDDEN_FORBIDDEN_FILENAME_BASE_NAMES));

capability.setFilesDownloadLimit(getBoolean(cursor, ProviderTableMeta.CAPABILITIES_FILES_DOWNLOAD_LIMIT));
capability.setFilesDownloadLimitDefault(getInt(cursor, ProviderTableMeta.CAPABILITIES_FILES_DOWNLOAD_LIMIT_DEFAULT));
capability.setRecommendations(getBoolean(cursor, ProviderTableMeta.CAPABILITIES_RECOMMENDATION));
}

Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/com/owncloud/android/db/ProviderMeta.java
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,8 @@ static public class ProviderTableMeta implements BaseColumns {
public static final String OCSHARES_HIDE_DOWNLOAD = "hide_download";
public static final String OCSHARES_SHARE_LINK = "share_link";
public static final String OCSHARES_SHARE_LABEL = "share_label";
public static final String OCSHARES_DOWNLOADLIMIT_LIMIT = "download_limit_limit";
public static final String OCSHARES_DOWNLOADLIMIT_COUNT = "download_limit_count";

public static final String OCSHARES_DEFAULT_SORT_ORDER = OCSHARES_FILE_SOURCE
+ " collate nocase asc";
Expand Down Expand Up @@ -268,6 +270,8 @@ static public class ProviderTableMeta implements BaseColumns {
public static final String CAPABILITIES_FORBIDDEN_FILENAMES = "forbidden_filenames";
public static final String CAPABILITIES_FORBIDDEN_FORBIDDEN_FILENAME_EXTENSIONS = "forbidden_filename_extensions";
public static final String CAPABILITIES_FORBIDDEN_FORBIDDEN_FILENAME_BASE_NAMES = "forbidden_filename_basenames";
public static final String CAPABILITIES_FILES_DOWNLOAD_LIMIT = "files_download_limit";
public static final String CAPABILITIES_FILES_DOWNLOAD_LIMIT_DEFAULT = "files_download_limit_default";

//Columns of Uploads table
public static final String UPLOADS_LOCAL_PATH = "local_path";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2025 ZetaTom <70907959+zetatom@users.noreply.github.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

package com.owncloud.android.operations

import com.nextcloud.android.lib.resources.files.FileDownloadLimit
import com.nextcloud.android.lib.resources.files.GetFilesDownloadLimitRemoteOperation
import com.nextcloud.common.NextcloudClient
import com.owncloud.android.datamodel.FileDataStorageManager
import com.owncloud.android.lib.common.operations.RemoteOperationResult
import com.owncloud.android.lib.resources.shares.OCShare
import com.owncloud.android.operations.common.SyncOperation

class GetFilesDownloadLimitOperation(val share: OCShare, storageManager: FileDataStorageManager) : SyncOperation(
storageManager
) {
override fun run(client: NextcloudClient): RemoteOperationResult<List<FileDownloadLimit>> {
val token = share.token ?: return RemoteOperationResult(RemoteOperationResult.ResultCode.SHARE_NOT_FOUND)
val operation = GetFilesDownloadLimitRemoteOperation(token)

val result = operation.execute(client)

return result
}
}
Loading
Loading