mirror of
https://github.com/Novaloop-AG/element-x-android.git
synced 2026-11-03 06:55:41 +00:00
Ensure Uri permission is revoked.
This commit is contained in:
+25
-3
@@ -22,6 +22,7 @@ import android.content.Intent
|
|||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.content.pm.ResolveInfo
|
import android.content.pm.ResolveInfo
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
|
import android.os.Build
|
||||||
import com.squareup.anvil.annotations.ContributesBinding
|
import com.squareup.anvil.annotations.ContributesBinding
|
||||||
import io.element.android.libraries.androidutils.compat.getParcelableArrayListExtraCompat
|
import io.element.android.libraries.androidutils.compat.getParcelableArrayListExtraCompat
|
||||||
import io.element.android.libraries.androidutils.compat.getParcelableExtraCompat
|
import io.element.android.libraries.androidutils.compat.getParcelableExtraCompat
|
||||||
@@ -36,12 +37,13 @@ import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeText
|
|||||||
import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeVideo
|
import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeVideo
|
||||||
import io.element.android.libraries.di.AppScope
|
import io.element.android.libraries.di.AppScope
|
||||||
import io.element.android.libraries.di.ApplicationContext
|
import io.element.android.libraries.di.ApplicationContext
|
||||||
|
import timber.log.Timber
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
interface ShareIntentHandler {
|
interface ShareIntentHandler {
|
||||||
suspend fun handleIncomingShareIntent(
|
suspend fun handleIncomingShareIntent(
|
||||||
intent: Intent,
|
intent: Intent,
|
||||||
onFile: suspend (List<DefaultShareIntentHandler.FileToShare>) -> Boolean,
|
onFiles: suspend (List<DefaultShareIntentHandler.FileToShare>) -> Boolean,
|
||||||
onPlainText: suspend (String) -> Boolean,
|
onPlainText: suspend (String) -> Boolean,
|
||||||
): Boolean
|
): Boolean
|
||||||
}
|
}
|
||||||
@@ -62,7 +64,7 @@ class DefaultShareIntentHandler @Inject constructor(
|
|||||||
*/
|
*/
|
||||||
override suspend fun handleIncomingShareIntent(
|
override suspend fun handleIncomingShareIntent(
|
||||||
intent: Intent,
|
intent: Intent,
|
||||||
onFile: suspend (List<FileToShare>) -> Boolean,
|
onFiles: suspend (List<FileToShare>) -> Boolean,
|
||||||
onPlainText: suspend (String) -> Boolean,
|
onPlainText: suspend (String) -> Boolean,
|
||||||
): Boolean {
|
): Boolean {
|
||||||
val type = intent.resolveType(context) ?: return false
|
val type = intent.resolveType(context) ?: return false
|
||||||
@@ -74,7 +76,12 @@ class DefaultShareIntentHandler @Inject constructor(
|
|||||||
type.isMimeTypeApplication() ||
|
type.isMimeTypeApplication() ||
|
||||||
type.isMimeTypeFile() ||
|
type.isMimeTypeFile() ||
|
||||||
type.isMimeTypeText() ||
|
type.isMimeTypeText() ||
|
||||||
type.isMimeTypeAny() -> onFile(getIncomingFiles(intent, type))
|
type.isMimeTypeAny() -> {
|
||||||
|
val files = getIncomingFiles(intent, type)
|
||||||
|
val result = onFiles(files)
|
||||||
|
revokeUriPermissions(files.map { it.uri })
|
||||||
|
result
|
||||||
|
}
|
||||||
else -> false
|
else -> false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -109,6 +116,7 @@ class DefaultShareIntentHandler @Inject constructor(
|
|||||||
try {
|
try {
|
||||||
context.grantUriPermission(packageName, it, Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
context.grantUriPermission(packageName, it, Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
Timber.w(e, "Unable to grant Uri permission")
|
||||||
return@resolve
|
return@resolve
|
||||||
}
|
}
|
||||||
data.action = null
|
data.action = null
|
||||||
@@ -122,4 +130,18 @@ class DefaultShareIntentHandler @Inject constructor(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun revokeUriPermissions(uris: List<Uri>) {
|
||||||
|
uris.forEach { uri ->
|
||||||
|
try {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
context.revokeUriPermission(context.packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||||
|
} else {
|
||||||
|
context.revokeUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Timber.w(e, "Unable to revoke Uri permission")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -74,7 +74,7 @@ class SharePresenter @AssistedInject constructor(
|
|||||||
suspend {
|
suspend {
|
||||||
val result = shareIntentHandler.handleIncomingShareIntent(
|
val result = shareIntentHandler.handleIncomingShareIntent(
|
||||||
intent,
|
intent,
|
||||||
onFile = { filesToShare ->
|
onFiles = { filesToShare ->
|
||||||
roomIds
|
roomIds
|
||||||
.map { roomId ->
|
.map { roomId ->
|
||||||
val room = matrixClient.getRoom(roomId) ?: return@map false
|
val room = matrixClient.getRoom(roomId) ?: return@map false
|
||||||
|
|||||||
+2
-2
@@ -27,9 +27,9 @@ class FakeShareIntentHandler(
|
|||||||
) : ShareIntentHandler {
|
) : ShareIntentHandler {
|
||||||
override suspend fun handleIncomingShareIntent(
|
override suspend fun handleIncomingShareIntent(
|
||||||
intent: Intent,
|
intent: Intent,
|
||||||
onFile: suspend (List<DefaultShareIntentHandler.FileToShare>) -> Boolean,
|
onFiles: suspend (List<DefaultShareIntentHandler.FileToShare>) -> Boolean,
|
||||||
onPlainText: suspend (String) -> Boolean,
|
onPlainText: suspend (String) -> Boolean,
|
||||||
): Boolean {
|
): Boolean {
|
||||||
return onIncomingShareIntent(intent, onFile, onPlainText)
|
return onIncomingShareIntent(intent, onFiles, onPlainText)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user