瀏覽代碼

Add New OCCapabilities

Signed-off-by: alperozturk <alper_ozturk@proton.me>
alperozturk 1 年之前
父節點
當前提交
5d36d76175

+ 21 - 7
app/src/androidTest/java/com/nextcloud/utils/FileNameValidatorTests.kt

@@ -10,51 +10,65 @@ package com.nextcloud.utils
 import com.nextcloud.utils.fileNameValidator.FileNameValidator
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.R
+import com.owncloud.android.lib.resources.status.CapabilityBooleanType
+import com.owncloud.android.lib.resources.status.OCCapability
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertNull
 import org.junit.Assert.assertTrue
+import org.junit.Before
 import org.junit.Test
 
 class FileNameValidatorTests : AbstractIT() {
 
+    private var capability: OCCapability = fileDataStorageManager.getCapability(account.name)
+
+    @Before
+    fun setup() {
+        capability = capability.apply {
+            forbiddenFilenames = CapabilityBooleanType.TRUE
+            forbiddenFilenameExtension = CapabilityBooleanType.TRUE
+            forbiddenFilenameCharacters = CapabilityBooleanType.TRUE
+        }
+    }
+
     @Test
     fun testInvalidCharacter() {
-        val result = FileNameValidator.isValid("file<name", targetContext)
+        val result = FileNameValidator.isValid("file<name", capability, targetContext)
         assertEquals("File name contains invalid characters: <", result)
     }
 
     @Test
     fun testReservedName() {
-        val result = FileNameValidator.isValid("CON", targetContext)
+        val result = FileNameValidator.isValid("CON", capability, targetContext)
         assertEquals(targetContext.getString(R.string.file_name_validator_error_reserved_names), result)
     }
 
     @Test
     fun testEndsWithSpaceOrPeriod() {
-        val result = FileNameValidator.isValid("filename ", targetContext)
+        val result = FileNameValidator.isValid("filename ", capability, targetContext)
         assertEquals(targetContext.getString(R.string.file_name_validator_error_ends_with_space_period), result)
 
-        val result2 = FileNameValidator.isValid("filename.", targetContext)
+        val result2 = FileNameValidator.isValid("filename.", capability, targetContext)
         assertEquals(targetContext.getString(R.string.file_name_validator_error_ends_with_space_period), result2)
     }
 
     @Test
     fun testEmptyFileName() {
-        val result = FileNameValidator.isValid("", targetContext)
+        val result = FileNameValidator.isValid("", capability, targetContext)
         assertEquals(targetContext.getString(R.string.filename_empty), result)
     }
 
     @Test
     fun testFileAlreadyExists() {
         val existingFiles = mutableSetOf("existingFile")
-        val result = FileNameValidator.isValid("existingFile", targetContext, existingFiles)
+        val result = FileNameValidator.isValid("existingFile", capability, targetContext, existingFiles)
         assertEquals(targetContext.getString(R.string.file_already_exists), result)
     }
 
     @Test
     fun testValidFileName() {
-        val result = FileNameValidator.isValid("validFileName", targetContext)
+        val result = FileNameValidator.isValid("validFileName", capability, targetContext)
         assertNull(result)
     }
 

+ 24 - 12
app/src/main/java/com/nextcloud/utils/fileNameValidator/FileNameValidator.kt

@@ -10,6 +10,7 @@ package com.nextcloud.utils.fileNameValidator
 import android.content.Context
 import android.text.TextUtils
 import com.owncloud.android.R
+import com.owncloud.android.lib.resources.status.OCCapability
 
 object FileNameValidator {
     private val reservedWindowsChars = "[<>:\"/\\\\|?*]".toRegex()
@@ -23,28 +24,39 @@ object FileNameValidator {
     )
 
     @Suppress("ReturnCount")
-    fun isValid(name: String, context: Context, fileNames: MutableSet<String>? = null): String? {
-        val invalidCharacter = name.find {
-            it.toString().matches(reservedWindowsChars) || it.toString().matches(reservedUnixChars)
-        }
-        if (invalidCharacter != null) {
-            return context.getString(R.string.file_name_validator_error_invalid_character, invalidCharacter)
+    fun isValid(
+        name: String,
+        capability: OCCapability,
+        context: Context,
+        fileNames: MutableSet<String>? = null
+    ): String? {
+        if (TextUtils.isEmpty(name)) {
+            return context.getString(R.string.filename_empty)
         }
 
-        if (reservedWindowsNames.contains(name.uppercase())) {
-            return context.getString(R.string.file_name_validator_error_reserved_names)
+        if (isFileNameAlreadyExist(name, fileNames ?: mutableSetOf())) {
+            return context.getString(R.string.file_already_exists)
         }
 
         if (name.endsWith(" ") || name.endsWith(".")) {
             return context.getString(R.string.file_name_validator_error_ends_with_space_period)
         }
 
-        if (TextUtils.isEmpty(name)) {
-            return context.getString(R.string.filename_empty)
+        if (capability.forbiddenFilenameCharacters.isTrue) {
+            val invalidCharacter = name.find {
+                it.toString().matches(reservedWindowsChars) || it.toString().matches(reservedUnixChars)
+            }
+            if (invalidCharacter != null) {
+                return context.getString(R.string.file_name_validator_error_invalid_character, invalidCharacter)
+            }
         }
 
-        if (isFileNameAlreadyExist(name, fileNames ?: mutableSetOf())) {
-            return context.getString(R.string.file_already_exists)
+        if (capability.forbiddenFilenames.isTrue && reservedWindowsNames.contains(name.uppercase())) {
+            return context.getString(R.string.file_name_validator_error_reserved_names)
+        }
+
+        if (capability.forbiddenFilenameExtension.isTrue) {
+            // TODO add logic
         }
 
         return null

+ 5 - 2
app/src/main/java/com/owncloud/android/ui/dialog/ChooseTemplateDialogFragment.kt

@@ -44,6 +44,7 @@ import com.owncloud.android.lib.common.TemplateList
 import com.owncloud.android.lib.common.utils.Log_OC
 import com.owncloud.android.lib.resources.files.ReadFileRemoteOperation
 import com.owncloud.android.lib.resources.files.model.RemoteFile
+import com.owncloud.android.lib.resources.status.OCCapability
 import com.owncloud.android.ui.activity.ExternalSiteWebView
 import com.owncloud.android.ui.activity.TextEditorWebView
 import com.owncloud.android.ui.adapter.TemplateAdapter
@@ -216,12 +217,14 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
         }
     }
 
+    private fun getOCCapability(): OCCapability = fileDataStorageManager.getCapability(currentAccount.user.accountName)
+
     override fun onClick(v: View) {
         val name = binding.filename.text.toString()
         val path = parentFolder?.remotePath + name
         val selectedTemplate = adapter?.selectedTemplate
 
-        val errorMessage = FileNameValidator.isValid(name, requireContext())
+        val errorMessage = FileNameValidator.isValid(name, getOCCapability(), requireContext())
 
         when {
             selectedTemplate == null -> {
@@ -253,7 +256,7 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
             DOT + selectedTemplate.extension,
             ignoreCase = true
         )
-        val fileNameValidatorResult = FileNameValidator.isValid(name, requireContext())
+        val fileNameValidatorResult = FileNameValidator.isValid(name, getOCCapability(), requireContext())
 
         val errorMessage = when {
             isNameJustExtension -> null

+ 11 - 2
app/src/main/java/com/owncloud/android/ui/dialog/CreateFolderDialogFragment.kt

@@ -22,6 +22,7 @@ import androidx.fragment.app.DialogFragment
 import com.google.android.material.button.MaterialButton
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
 import com.google.common.collect.Sets
+import com.nextcloud.client.account.CurrentAccountProvider
 import com.nextcloud.client.di.Injectable
 import com.nextcloud.utils.extensions.getParcelableArgument
 import com.nextcloud.utils.fileNameValidator.FileNameValidator
@@ -29,6 +30,7 @@ import com.owncloud.android.R
 import com.owncloud.android.databinding.EditBoxDialogBinding
 import com.owncloud.android.datamodel.FileDataStorageManager
 import com.owncloud.android.datamodel.OCFile
+import com.owncloud.android.lib.resources.status.OCCapability
 import com.owncloud.android.ui.activity.ComponentsGetter
 import com.owncloud.android.utils.DisplayUtils
 import com.owncloud.android.utils.KeyboardUtils
@@ -52,6 +54,9 @@ class CreateFolderDialogFragment : DialogFragment(), DialogInterface.OnClickList
     @Inject
     lateinit var keyboardUtils: KeyboardUtils
 
+    @Inject
+    lateinit var currentAccount: CurrentAccountProvider
+
     private var mParentFolder: OCFile? = null
     private var positiveButton: MaterialButton? = null
 
@@ -114,9 +119,13 @@ class CreateFolderDialogFragment : DialogFragment(), DialogInterface.OnClickList
         return builder.create()
     }
 
+    private fun getOCCapability(): OCCapability = fileDataStorageManager.getCapability(currentAccount.user.accountName)
+
     private fun checkFileNameAfterEachType(fileNames: MutableSet<String>) {
         val newFileName = binding.userInput.text?.toString()?.trim() ?: ""
-        val fileNameValidatorResult: String? = FileNameValidator.isValid(newFileName, requireContext(), fileNames)
+
+        val fileNameValidatorResult: String? =
+            FileNameValidator.isValid(newFileName, getOCCapability(), requireContext(), fileNames)
 
         val errorMessage = when {
             newFileName.isEmpty() -> null
@@ -154,7 +163,7 @@ class CreateFolderDialogFragment : DialogFragment(), DialogInterface.OnClickList
             val newFolderName = (getDialog()?.findViewById<View>(R.id.user_input) as TextView)
                 .text.toString().trim { it <= ' ' }
 
-            val errorMessage: String? = FileNameValidator.isValid(newFolderName, requireContext())
+            val errorMessage: String? = FileNameValidator.isValid(newFolderName, getOCCapability(), requireContext())
 
             if (errorMessage != null) {
                 DisplayUtils.showSnackMessage(requireActivity(), errorMessage)

+ 9 - 3
app/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java

@@ -14,7 +14,6 @@ import android.app.Dialog;
 import android.content.DialogInterface;
 import android.os.Bundle;
 import android.text.Editable;
-import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -22,6 +21,7 @@ import android.view.View;
 import com.google.android.material.button.MaterialButton;
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 import com.google.common.collect.Sets;
+import com.nextcloud.client.account.CurrentAccountProvider;
 import com.nextcloud.client.di.Injectable;
 import com.nextcloud.utils.extensions.BundleExtensionsKt;
 import com.nextcloud.utils.fileNameValidator.FileNameValidator;
@@ -29,6 +29,7 @@ import com.owncloud.android.R;
 import com.owncloud.android.databinding.EditBoxDialogBinding;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.lib.resources.status.OCCapability;
 import com.owncloud.android.ui.activity.ComponentsGetter;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.KeyboardUtils;
@@ -56,6 +57,7 @@ public class RenameFileDialogFragment
     @Inject ViewThemeUtils viewThemeUtils;
     @Inject FileDataStorageManager fileDataStorageManager;
     @Inject KeyboardUtils keyboardUtils;
+    @Inject CurrentAccountProvider currentAccount;
 
     private EditBoxDialogBinding binding;
     private OCFile mTargetFile;
@@ -150,6 +152,10 @@ public class RenameFileDialogFragment
         }
     }
 
+    private OCCapability getOCCapability() {
+        return fileDataStorageManager.getCapability(currentAccount.getUser().getAccountName());
+    }
+
     @Override
     public void onClick(DialogInterface dialog, int which) {
         if (which == AlertDialog.BUTTON_POSITIVE) {
@@ -159,7 +165,7 @@ public class RenameFileDialogFragment
                 newFileName = binding.userInput.getText().toString().trim();
             }
 
-            String errorMessage = FileNameValidator.INSTANCE.isValid(newFileName, requireContext(), null);
+            String errorMessage = FileNameValidator.INSTANCE.isValid(newFileName, getOCCapability(), requireContext(), null);
             if (errorMessage != null) {
                 DisplayUtils.showSnackMessage(requireActivity(), errorMessage);
                 return;
@@ -193,7 +199,7 @@ public class RenameFileDialogFragment
             newFileName = binding.userInput.getText().toString().trim();
         }
 
-        String errorMessage = FileNameValidator.INSTANCE.isValid(newFileName, requireContext(), fileNames);
+        String errorMessage = FileNameValidator.INSTANCE.isValid(newFileName, getOCCapability(), requireContext(), fileNames);
 
         if (FileNameValidator.INSTANCE.isFileHidden(newFileName)) {
             binding.userInputContainer.setError(getText(R.string.hidden_file_name_warning));