From 57e1ca36a166a58aacaff35e2f0ea1c2ab221916 Mon Sep 17 00:00:00 2001 From: M66B Date: Sat, 4 Apr 2020 11:07:31 +0200 Subject: [PATCH] Copy shared content local --- .../java/eu/faircode/email/ActivityMain.java | 61 +++++++++++++++++++ app/src/main/res/xml/fileprovider_paths.xml | 3 + 2 files changed, 64 insertions(+) diff --git a/app/src/main/java/eu/faircode/email/ActivityMain.java b/app/src/main/java/eu/faircode/email/ActivityMain.java index b193b689ef..9e7bf0eac2 100644 --- a/app/src/main/java/eu/faircode/email/ActivityMain.java +++ b/app/src/main/java/eu/faircode/email/ActivityMain.java @@ -26,11 +26,17 @@ import android.content.res.Configuration; import android.net.Uri; import android.os.Bundle; import android.os.Handler; +import android.text.TextUtils; +import androidx.core.content.FileProvider; +import androidx.documentfile.provider.DocumentFile; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import androidx.preference.PreferenceManager; +import java.io.File; +import java.io.FileOutputStream; +import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -97,6 +103,7 @@ public class ActivityMain extends ActivityBase implements FragmentManager.OnBack (Intent.ACTION_SENDTO.equals(action) && mailto) || Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action)) { + processStreams(intent); intent.setClass(ActivityMain.this, ActivityCompose.class); startActivity(intent); finish(); @@ -139,6 +146,60 @@ public class ActivityMain extends ActivityBase implements FragmentManager.OnBack protected void onException(Bundle args, Throwable ex) { Log.unexpectedError(getSupportFragmentManager(), ex); } + + // Copy content local to prevent security exceptions + private void processStreams(Intent intent) { + intent.setClipData(null); + + if (intent.hasExtra(Intent.EXTRA_STREAM)) { + if (Intent.ACTION_SEND_MULTIPLE.equals(intent.getAction())) { + ArrayList uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); + if (uris == null) + intent.removeExtra(Intent.EXTRA_STREAM); + else { + ArrayList processed = new ArrayList<>(); + for (Uri uri : uris) + processed.add(processUri(uri)); + intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, processed); + } + } else { + Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM); + if (uri == null) + intent.removeExtra(Intent.EXTRA_STREAM); + else + intent.putExtra(Intent.EXTRA_STREAM, processUri(uri)); + } + } + } + + private Uri processUri(Uri uri) { + try { + String fname = null; + try { + DocumentFile dfile = DocumentFile.fromSingleUri(ActivityMain.this, uri); + if (dfile != null) + fname = dfile.getName(); + } catch (SecurityException ex) { + Log.e(ex); + } + + if (TextUtils.isEmpty(fname)) + fname = uri.getLastPathSegment(); + + File dir = new File(getCacheDir(), "shared"); + if (!dir.exists()) + dir.mkdir(); + File file = new File(dir, fname); + + Log.i("Copying shared file to " + file); + Helper.copy(getContentResolver().openInputStream(uri), new FileOutputStream(file)); + + return FileProvider.getUriForFile(ActivityMain.this, BuildConfig.APPLICATION_ID, file); + } catch (Throwable ex) { + Log.w(ex); + return uri; + } + } }; if (Helper.shouldAuthenticate(this)) diff --git a/app/src/main/res/xml/fileprovider_paths.xml b/app/src/main/res/xml/fileprovider_paths.xml index b4d297dcad..b00b8335fb 100644 --- a/app/src/main/res/xml/fileprovider_paths.xml +++ b/app/src/main/res/xml/fileprovider_paths.xml @@ -12,4 +12,7 @@ +