Эх сурвалжийг харах

Merge pull request #1014 from owncloud/forbidden_characters_from_server

Delegate check of forbidden characters on server, for OC >= 8.1
David A. Velasco 9 жил өмнө
parent
commit
3febfa1e08

+ 1 - 1
owncloud-android-library

@@ -1 +1 @@
-Subproject commit 639cb7eacdae0b4b6dddbd8f446d8d42eb2617b5
+Subproject commit 344d5b22e43021ebc54f18ad7d17b1702dfa406c

+ 1 - 0
res/values/strings.xml

@@ -222,6 +222,7 @@
     <string name="sync_file_nothing_to_do_msg">File contents already synchronized</string>
     <string name="create_dir_fail_msg">Folder could not be created</string>
     <string name="filename_forbidden_characters">Forbidden characters: / \\ &lt; &gt; : " | ? *</string>
+    <string name="filename_forbidden_charaters_from_server">File name contains at least one invalid character</string>
     <string name="filename_empty">File name cannot be empty</string>
     <string name="wait_a_moment">Wait a moment</string>
     <string name="filedisplay_unexpected_bad_get_content">"Unexpected problem ; please select the file from a different app"</string>

+ 13 - 1
src/com/owncloud/android/files/FileOperationsHelper.java

@@ -316,5 +316,17 @@ public class FileOperationsHelper {
         mWaitingForOpId = waitingForOpId;
     }
     
-    
+    /**
+     *  @return 'True' if the server doesn't need to check forbidden characters
+     */
+    public boolean isVersionWithForbiddenCharacters() {
+        if (mFileActivity.getAccount() != null) {
+            AccountManager accountManager = AccountManager.get(mFileActivity);
+
+            String version = accountManager.getUserData(mFileActivity.getAccount(),
+                    Constants.KEY_OC_VERSION);
+            return (new OwnCloudVersion(version)).isVersionWithForbiddenCharacters();
+        }
+        return false;
+    }
 }

+ 8 - 0
src/com/owncloud/android/services/OperationsService.java

@@ -34,6 +34,7 @@ import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
 import com.owncloud.android.lib.common.OwnCloudCredentials;
 import com.owncloud.android.lib.common.OwnCloudCredentialsFactory;
+import com.owncloud.android.lib.common.accounts.AccountUtils;
 import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;
 import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
 import com.owncloud.android.lib.common.operations.RemoteOperation;
@@ -54,6 +55,7 @@ import com.owncloud.android.operations.SynchronizeFolderOperation;
 import com.owncloud.android.operations.UnshareLinkOperation;
 
 import android.accounts.Account;
+import android.accounts.AccountManager;
 import android.accounts.AccountsException;
 import android.accounts.AuthenticatorException;
 import android.accounts.OperationCanceledException;
@@ -442,6 +444,12 @@ public class OperationsService extends Service {
                                     mService);
                             mOwnCloudClient = OwnCloudClientManagerFactory.getDefaultSingleton().
                                     getClientFor(ocAccount, mService);
+
+                            AccountManager am = AccountManager.get(mService.getApplicationContext());
+                            String version = am.getUserData(mLastTarget.mAccount,
+                                    AccountUtils.Constants.KEY_OC_VERSION);
+                            mOwnCloudClient.setOwnCloudVersion(version);
+
                             mStorageManager = new FileDataStorageManager(
                                     mLastTarget.mAccount, 
                                     mService.getContentResolver()

+ 15 - 9
src/com/owncloud/android/ui/dialog/CreateFolderDialogFragment.java

@@ -51,9 +51,9 @@ public class CreateFolderDialogFragment
 
     /**
      * Public factory method to create new CreateFolderDialogFragment instances.
-     * 
-     * @param parentFolder    Folder to create
-     * @return                Dialog ready to show.
+     *
+     * @param parentFolder            Folder to create
+     * @return                        Dialog ready to show.
      */
     public static CreateFolderDialogFragment newInstance(OCFile parentFolder) {
         CreateFolderDialogFragment frag = new CreateFolderDialogFragment();
@@ -106,12 +106,18 @@ public class CreateFolderDialogFragment
                         Toast.LENGTH_LONG).show();
                 return;
             }
-            
-            if (!FileUtils.isValidName(newFolderName)) {
-                Toast.makeText(
-                        getActivity(),
-                        R.string.filename_forbidden_characters, 
-                        Toast.LENGTH_LONG).show();
+            boolean serverWithForbiddenChars = ((ComponentsGetter)getActivity()).
+                    getFileOperationsHelper().isVersionWithForbiddenCharacters();
+
+            if (!FileUtils.isValidName(newFolderName, serverWithForbiddenChars)) {
+                int messageId = 0;
+                if (serverWithForbiddenChars) {
+                    messageId = R.string.filename_forbidden_charaters_from_server;
+                } else {
+                    messageId = R.string.filename_forbidden_characters;
+                }
+                Toast.makeText(getActivity(), messageId, Toast.LENGTH_LONG).show();
+
                 return;
             }
             

+ 15 - 8
src/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java

@@ -118,17 +118,24 @@ public class RenameFileDialogFragment
                         Toast.LENGTH_LONG).show();
                 return;
             }
-            
-            if (!FileUtils.isValidName(newFileName)) {
-                Toast.makeText(
-                        getActivity(),
-                        R.string.filename_forbidden_characters, 
-                        Toast.LENGTH_LONG).show();
+
+            boolean serverWithForbiddenChars = ((ComponentsGetter)getActivity()).
+                    getFileOperationsHelper().isVersionWithForbiddenCharacters();
+
+            if (!FileUtils.isValidName(newFileName, serverWithForbiddenChars)) {
+                int messageId = 0;
+                if (serverWithForbiddenChars) {
+                    messageId = R.string.filename_forbidden_charaters_from_server;
+                } else {
+                    messageId = R.string.filename_forbidden_characters;
+                }
+                Toast.makeText(getActivity(), messageId, Toast.LENGTH_LONG).show();
                 return;
             }
 
-            ((ComponentsGetter)getActivity()).getFileOperationsHelper().renameFile(mTargetFile,
-                    newFileName);
+            ((ComponentsGetter)getActivity()).getFileOperationsHelper().
+                    renameFile(mTargetFile, newFileName);
+
         }
     }
 }

+ 26 - 9
src/com/owncloud/android/utils/ErrorMessageAdapter.java

@@ -54,19 +54,22 @@ public class ErrorMessageAdapter {
         
     }
 
-    public static String getErrorCauseMessage(RemoteOperationResult result, RemoteOperation operation, Resources res) {
+    public static String getErrorCauseMessage(RemoteOperationResult result,
+                                              RemoteOperation operation, Resources res) {
         
         String message = null;
         
         if (operation instanceof UploadFileOperation) {
             
             if (result.isSuccess()) {
-                message = String.format(res.getString(R.string.uploader_upload_succeeded_content_single), 
+                message = String.format(
+                        res.getString(R.string.uploader_upload_succeeded_content_single),
                         ((UploadFileOperation) operation).getFileName());
             } else {
                 if (result.getCode() == ResultCode.LOCAL_STORAGE_FULL
                         || result.getCode() == ResultCode.LOCAL_STORAGE_NOT_COPIED) {
-                    message = String.format(res.getString(R.string.error__upload__local_file_not_copied), 
+                    message = String.format(
+                            res.getString(R.string.error__upload__local_file_not_copied),
                             ((UploadFileOperation) operation).getFileName(), 
                             res.getString(R.string.app_name));
                 /*
@@ -78,8 +81,12 @@ public class ErrorMessageAdapter {
                     message = String.format(res.getString(R.string.forbidden_permissions),
                             res.getString(R.string.uploader_upload_forbidden_permissions));
 
+                } else if (result.getCode() == ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER) {
+                    message = res.getString(R.string.filename_forbidden_charaters_from_server);
+
                 } else {
-                    message = String.format(res.getString(R.string.uploader_upload_failed_content_single), 
+                    message = String.format(
+                            res.getString(R.string.uploader_upload_failed_content_single),
                             ((UploadFileOperation) operation).getFileName());
                 }
             }
@@ -87,7 +94,8 @@ public class ErrorMessageAdapter {
         } else if (operation instanceof DownloadFileOperation) {
             
             if (result.isSuccess()) {
-                message = String.format(res.getString(R.string.downloader_download_succeeded_content), 
+                message = String.format(
+                        res.getString(R.string.downloader_download_succeeded_content),
                         new File(((DownloadFileOperation) operation).getSavePath()).getName());
                 
             } else {
@@ -95,7 +103,8 @@ public class ErrorMessageAdapter {
                     message = res.getString(R.string.downloader_download_file_not_found);
 
                 } else {
-                    message = String.format(res.getString(R.string.downloader_download_failed_content), new File(
+                    message = String.format(
+                            res.getString(R.string.downloader_download_failed_content), new File(
                             ((DownloadFileOperation) operation).getSavePath()).getName());
                 }
             }
@@ -132,6 +141,9 @@ public class ErrorMessageAdapter {
             } else if (isNetworkError(result.getCode())) {
                 message = getErrorMessage(result, res);
                 
+            } else if (result.getCode() == ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER) {
+                message = res.getString(R.string.filename_forbidden_charaters_from_server);
+
             } else {
                 message = res.getString(R.string.rename_server_fail_msg); 
             }
@@ -152,11 +164,13 @@ public class ErrorMessageAdapter {
             } else if (isNetworkError(result.getCode())) {
                 message = getErrorMessage(result, res);
                 
+            } else if (result.getCode() == ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER) {
+                message = res.getString(R.string.filename_forbidden_charaters_from_server);
             } else {
                 message = res.getString(R.string.create_dir_fail_msg);
             }
         } else if (operation instanceof CreateShareOperation) {        
-            if (result.getCode() == ResultCode.SHARE_NOT_FOUND)  {        // Error --> SHARE_NOT_FOUND
+            if (result.getCode() == ResultCode.SHARE_NOT_FOUND)  {      // Error --> SHARE_NOT_FOUND
                 message = res.getString(R.string.share_link_file_no_exist);
                 
             } else if (result.getCode() == ResultCode.SHARE_FORBIDDEN) {
@@ -174,7 +188,7 @@ public class ErrorMessageAdapter {
             
         } else if (operation instanceof UnshareLinkOperation) {
         
-            if (result.getCode() == ResultCode.SHARE_NOT_FOUND)  {        // Error --> SHARE_NOT_FOUND
+            if (result.getCode() == ResultCode.SHARE_NOT_FOUND)  {      // Error --> SHARE_NOT_FOUND
                 message = res.getString(R.string.unshare_link_file_no_exist);
                 
             } else if (result.getCode() == ResultCode.SHARE_FORBIDDEN) {
@@ -204,7 +218,10 @@ public class ErrorMessageAdapter {
                 message = String.format(res.getString(R.string.forbidden_permissions),
                         res.getString(R.string.forbidden_permissions_move));
 
-            }else {    // Generic error
+            } else if (result.getCode() == ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER) {
+                message = res.getString(R.string.filename_forbidden_charaters_from_server);
+
+            } else {    // Generic error
                 // Show a Message, operation finished without success
                 message = res.getString(R.string.move_file_error);
             }