Browse Source

make sure TextEditor is also only used ond >= Android 5, due to security reason of javascript interface

Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>
tobiasKaminsky 5 years ago
parent
commit
300abba48b

+ 7 - 2
src/main/java/com/owncloud/android/files/FileMenuFilter.java

@@ -24,6 +24,7 @@ package com.owncloud.android.files;
 import android.accounts.Account;
 import android.accounts.Account;
 import android.content.ContentResolver;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Context;
+import android.os.Build;
 import android.view.Menu;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MenuItem;
 
 
@@ -38,7 +39,6 @@ import com.owncloud.android.lib.common.Editor;
 import com.owncloud.android.lib.resources.status.OCCapability;
 import com.owncloud.android.lib.resources.status.OCCapability;
 import com.owncloud.android.services.OperationsService.OperationsServiceBinder;
 import com.owncloud.android.services.OperationsService.OperationsServiceBinder;
 import com.owncloud.android.ui.activity.ComponentsGetter;
 import com.owncloud.android.ui.activity.ComponentsGetter;
-import com.owncloud.android.ui.activity.RichDocumentsEditorWebView;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.NextcloudServer;
 import com.owncloud.android.utils.NextcloudServer;
 
 
@@ -262,6 +262,11 @@ public class FileMenuFilter {
                             List<Integer> toHide,
                             List<Integer> toHide,
                             OCCapability capability
                             OCCapability capability
     ) {
     ) {
+        if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
+            toHide.add(R.id.action_edit);
+            return;
+        }
+
         String mimeType = mFiles.iterator().next().getMimeType();
         String mimeType = mFiles.iterator().next().getMimeType();
 
 
         if (isRichDocumentEditingSupported(capability, mimeType) || isEditorAvailable(mContext.getContentResolver(),
         if (isRichDocumentEditingSupported(capability, mimeType) || isEditorAvailable(mContext.getContentResolver(),
@@ -296,7 +301,7 @@ public class FileMenuFilter {
      */
      */
     @NextcloudServer(max = 18)
     @NextcloudServer(max = 18)
     private boolean isRichDocumentEditingSupported(OCCapability capability, String mimeType) {
     private boolean isRichDocumentEditingSupported(OCCapability capability, String mimeType) {
-        return isSingleFile() && android.os.Build.VERSION.SDK_INT >= RichDocumentsEditorWebView.MINIMUM_API &&
+        return isSingleFile() && android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP &&
             (capability.getRichDocumentsMimeTypeList().contains(mimeType) ||
             (capability.getRichDocumentsMimeTypeList().contains(mimeType) ||
                 capability.getRichDocumentsOptionalMimeTypeList().contains(mimeType)) &&
                 capability.getRichDocumentsOptionalMimeTypeList().contains(mimeType)) &&
             capability.getRichDocumentsDirectEditing().isTrue();
             capability.getRichDocumentsDirectEditing().isTrue();

+ 0 - 2
src/main/java/com/owncloud/android/ui/activity/RichDocumentsEditorWebView.java

@@ -24,7 +24,6 @@
 
 
 package com.owncloud.android.ui.activity;
 package com.owncloud.android.ui.activity;
 
 
-import android.accounts.Account;
 import android.annotation.SuppressLint;
 import android.annotation.SuppressLint;
 import android.app.DownloadManager;
 import android.app.DownloadManager;
 import android.content.ActivityNotFoundException;
 import android.content.ActivityNotFoundException;
@@ -75,7 +74,6 @@ import butterknife.Unbinder;
  */
  */
 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
 public class RichDocumentsEditorWebView extends EditorWebView {
 public class RichDocumentsEditorWebView extends EditorWebView {
-    public static final int MINIMUM_API = Build.VERSION_CODES.LOLLIPOP;
     public static final int REQUEST_LOCAL_FILE = 101;
     public static final int REQUEST_LOCAL_FILE = 101;
     private static final int REQUEST_REMOTE_FILE = 100;
     private static final int REQUEST_REMOTE_FILE = 100;
     private static final String URL = "URL";
     private static final String URL = "URL";

+ 4 - 0
src/main/java/com/owncloud/android/ui/activity/TextEditorWebView.kt

@@ -21,12 +21,16 @@
 
 
 package com.owncloud.android.ui.activity
 package com.owncloud.android.ui.activity
 
 
+import android.annotation.SuppressLint
 import android.os.Build
 import android.os.Build
 import android.os.Bundle
 import android.os.Bundle
 import androidx.annotation.RequiresApi
 import androidx.annotation.RequiresApi
 
 
 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
 class TextEditorWebView : EditorWebView() {
 class TextEditorWebView : EditorWebView() {
+
+    @SuppressLint("AddJavascriptInterface") // suppress warning as webview is only used >= Lollipop
+    // suppress warning as webview is only used >= Lollipop
     override fun onCreate(savedInstanceState: Bundle?) {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         super.onCreate(savedInstanceState)
 
 

+ 2 - 2
src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.java

@@ -20,6 +20,7 @@
 
 
 package com.owncloud.android.ui.fragment;
 package com.owncloud.android.ui.fragment;
 
 
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Bundle;
 import android.view.View;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewGroup;
@@ -32,7 +33,6 @@ import com.nextcloud.client.device.DeviceInfo;
 import com.owncloud.android.R;
 import com.owncloud.android.R;
 import com.owncloud.android.lib.resources.status.OCCapability;
 import com.owncloud.android.lib.resources.status.OCCapability;
 import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.activity.FileActivity;
-import com.owncloud.android.ui.activity.RichDocumentsEditorWebView;
 import com.owncloud.android.utils.ThemeUtils;
 import com.owncloud.android.utils.ThemeUtils;
 
 
 import butterknife.BindView;
 import butterknife.BindView;
@@ -100,7 +100,7 @@ public class OCFileListBottomSheetDialog extends BottomSheetDialog {
 
 
         OCCapability capability = fileActivity.getCapabilities();
         OCCapability capability = fileActivity.getCapabilities();
         if (capability.getRichDocuments().isTrue() && capability.getRichDocumentsDirectEditing().isTrue() &&
         if (capability.getRichDocuments().isTrue() && capability.getRichDocumentsDirectEditing().isTrue() &&
-            android.os.Build.VERSION.SDK_INT >= RichDocumentsEditorWebView.MINIMUM_API &&
+            android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP &&
             capability.getRichDocumentsTemplatesAvailable().isTrue()) {
             capability.getRichDocumentsTemplatesAvailable().isTrue()) {
             templates.setVisibility(View.VISIBLE);
             templates.setVisibility(View.VISIBLE);
         }
         }

+ 18 - 9
src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -71,7 +71,6 @@ import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.activity.FolderPickerActivity;
 import com.owncloud.android.ui.activity.FolderPickerActivity;
 import com.owncloud.android.ui.activity.OnEnforceableRefreshListener;
 import com.owncloud.android.ui.activity.OnEnforceableRefreshListener;
-import com.owncloud.android.ui.activity.RichDocumentsEditorWebView;
 import com.owncloud.android.ui.activity.ToolbarActivity;
 import com.owncloud.android.ui.activity.ToolbarActivity;
 import com.owncloud.android.ui.activity.UploadFilesActivity;
 import com.owncloud.android.ui.activity.UploadFilesActivity;
 import com.owncloud.android.ui.adapter.OCFileListAdapter;
 import com.owncloud.android.ui.adapter.OCFileListAdapter;
@@ -951,10 +950,11 @@ public class OCFileListFragment extends ExtendedListFragment implements
                             ((FileDisplayActivity) mContainerActivity).startMediaPreview(file, 0, true, true, true);
                             ((FileDisplayActivity) mContainerActivity).startMediaPreview(file, 0, true, true, true);
                         } else if (FileMenuFilter.isEditorAvailable(requireContext().getContentResolver(),
                         } else if (FileMenuFilter.isEditorAvailable(requireContext().getContentResolver(),
                                                                     account.toPlatformAccount(),
                                                                     account.toPlatformAccount(),
-                                                                    file.getMimeType())) {
+                                                                    file.getMimeType()) &&
+                            android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                             mContainerActivity.getFileOperationsHelper().openFileWithTextEditor(file, getContext());
                             mContainerActivity.getFileOperationsHelper().openFileWithTextEditor(file, getContext());
                         } else if (capability.getRichDocumentsMimeTypeList().contains(file.getMimeType()) &&
                         } else if (capability.getRichDocumentsMimeTypeList().contains(file.getMimeType()) &&
-                            android.os.Build.VERSION.SDK_INT >= RichDocumentsEditorWebView.MINIMUM_API &&
+                            android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP &&
                             capability.getRichDocumentsDirectEditing().isTrue()) {
                             capability.getRichDocumentsDirectEditing().isTrue()) {
                             mContainerActivity.getFileOperationsHelper().openFileAsRichDocument(file, getContext());
                             mContainerActivity.getFileOperationsHelper().openFileAsRichDocument(file, getContext());
                         } else {
                         } else {
@@ -1022,14 +1022,23 @@ public class OCFileListFragment extends ExtendedListFragment implements
                     Account account = ((FileActivity) mContainerActivity).getUserAccountManager()
                     Account account = ((FileActivity) mContainerActivity).getUserAccountManager()
                         .getUser().toPlatformAccount();
                         .getUser().toPlatformAccount();
 
 
-                    if (FileMenuFilter.isEditorAvailable(requireContext().getContentResolver(),
-                                                         account,
-                                                         singleFile.getMimeType())) {
-                        mContainerActivity.getFileOperationsHelper().openFileWithTextEditor(singleFile, getContext());
+                    // should not be necessary, as menu item is filtered, but better play safe
+                    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+                        if (FileMenuFilter.isEditorAvailable(requireContext().getContentResolver(),
+                                                             account,
+                                                             singleFile.getMimeType())) {
+                            mContainerActivity.getFileOperationsHelper().openFileWithTextEditor(singleFile,
+                                                                                                getContext());
+                        } else {
+                            mContainerActivity.getFileOperationsHelper().openFileAsRichDocument(singleFile,
+                                                                                                getContext());
+                        }
+
+                        return true;
                     } else {
                     } else {
-                        mContainerActivity.getFileOperationsHelper().openFileAsRichDocument(singleFile, getContext());
+                        DisplayUtils.showSnackMessage(getView(), "Not supported on older than Android 5");
+                        return false;
                     }
                     }
-                    return true;
                 }
                 }
                 case R.id.action_rename_file: {
                 case R.id.action_rename_file: {
                     RenameFileDialogFragment dialog = RenameFileDialogFragment.newInstance(singleFile);
                     RenameFileDialogFragment dialog = RenameFileDialogFragment.newInstance(singleFile);

+ 4 - 1
src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java

@@ -99,6 +99,7 @@ import java.util.regex.Pattern;
 
 
 import androidx.annotation.NonNull;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.core.content.FileProvider;
 import androidx.core.content.FileProvider;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
 import androidx.fragment.app.FragmentTransaction;
@@ -279,7 +280,7 @@ public class FileOperationsHelper {
                 Account account = fileActivity.getAccount();
                 Account account = fileActivity.getAccount();
                 OCCapability capability = fileActivity.getStorageManager().getCapability(account.name);
                 OCCapability capability = fileActivity.getStorageManager().getCapability(account.name);
                 if (capability.getRichDocumentsMimeTypeList().contains(file.getMimeType()) &&
                 if (capability.getRichDocumentsMimeTypeList().contains(file.getMimeType()) &&
-                    android.os.Build.VERSION.SDK_INT >= RichDocumentsEditorWebView.MINIMUM_API &&
+                    android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP &&
                     capability.getRichDocumentsDirectEditing().isTrue()) {
                     capability.getRichDocumentsDirectEditing().isTrue()) {
                     openFileAsRichDocument(file, fileActivity);
                     openFileAsRichDocument(file, fileActivity);
                     return;
                     return;
@@ -342,6 +343,7 @@ public class FileOperationsHelper {
         }
         }
     }
     }
 
 
+    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
     public void openFileAsRichDocument(OCFile file, Context context) {
     public void openFileAsRichDocument(OCFile file, Context context) {
         Intent collaboraWebViewIntent = new Intent(context, RichDocumentsEditorWebView.class);
         Intent collaboraWebViewIntent = new Intent(context, RichDocumentsEditorWebView.class);
         collaboraWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_TITLE, "Collabora");
         collaboraWebViewIntent.putExtra(ExternalSiteWebView.EXTRA_TITLE, "Collabora");
@@ -350,6 +352,7 @@ public class FileOperationsHelper {
         context.startActivity(collaboraWebViewIntent);
         context.startActivity(collaboraWebViewIntent);
     }
     }
 
 
+    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
     public void openFileWithTextEditor(OCFile file, Context context) {
     public void openFileWithTextEditor(OCFile file, Context context) {
         Intent textEditorIntent = new Intent(context, TextEditorWebView.class);
         Intent textEditorIntent = new Intent(context, TextEditorWebView.class);
         textEditorIntent.putExtra(ExternalSiteWebView.EXTRA_TITLE, "Text");
         textEditorIntent.putExtra(ExternalSiteWebView.EXTRA_TITLE, "Text");

+ 0 - 1
src/main/res/values/strings.xml

@@ -810,7 +810,6 @@
     <string name="stream_not_possible_headline">Internal streaming not possible</string>
     <string name="stream_not_possible_headline">Internal streaming not possible</string>
     <string name="stream_not_possible_message">Please download media instead or use external app.</string>
     <string name="stream_not_possible_message">Please download media instead or use external app.</string>
     <string name="folder_already_exists">Folder already exists</string>
     <string name="folder_already_exists">Folder already exists</string>
-    <string name="actionbar_open_as_richdocument_parameter">Open with %1$s</string>
     <string name="notification_icon">Notification icon</string>
     <string name="notification_icon">Notification icon</string>
     <string name="folder_confirm_create">Create</string>
     <string name="folder_confirm_create">Create</string>
     <string name="file_delete">Delete</string>
     <string name="file_delete">Delete</string>