Skip to content

Commit

Permalink
Ask user to re-grant local storage permission when revoked #251
Browse files Browse the repository at this point in the history
  • Loading branch information
SailReal committed Oct 28, 2021
1 parent fda2927 commit 250d756
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 13 deletions.
Expand Up @@ -340,7 +340,7 @@ internal class LocalStorageAccessFrameworkImpl(context: Context, private val mim
file.parent.uri?.let {
val mimeType = if (mimeTypes.fromFilename(file.name) == null) MimeType.APPLICATION_OCTET_STREAM else mimeTypes.fromFilename(file.name)
try {
DocumentsContract.createDocument(contentResolver(), it, mimeType.toString(), file.name) // FIXME
DocumentsContract.createDocument(contentResolver(), it, mimeType.toString(), file.name)
} catch (e: FileNotFoundException) {
null
}
Expand Down
@@ -1,6 +1,9 @@
package org.cryptomator.presentation.presenter

import android.accounts.AccountManager
import android.content.Intent
import android.content.Intent.ACTION_OPEN_DOCUMENT_TREE
import android.provider.DocumentsContract
import android.widget.Toast
import com.dropbox.core.android.Auth
import org.cryptomator.data.cloud.onedrive.OnedriveClientFactory
Expand Down Expand Up @@ -432,6 +435,7 @@ class AuthenticateCloudPresenter @Inject constructor( //
private inner class LocalStorageAuthStrategy : AuthStrategy {

private var authenticationStarted = false

override fun supports(cloud: CloudModel): Boolean {
return cloud.cloudType() == CloudTypeModel.LOCAL
}
Expand All @@ -444,17 +448,41 @@ class AuthenticateCloudPresenter @Inject constructor( //

private fun startAuthentication(cloud: CloudModel) {
authenticationStarted = true

val uri = (cloud as LocalStorageModel).uri()

val permissions = context().contentResolver.persistedUriPermissions
for (permission in permissions) {
if (permission.uri.toString() == (cloud as LocalStorageModel).uri()) {
if (permission.uri.toString() == uri) {
succeedAuthenticationWith(cloud.toCloud())
}
}

// FIXME think about how to re-request permission
// FIXME change in the FOSS variant too
failAuthentication(PermissionNotGrantedException(R.string.permission_snackbar_auth_local_vault))
Timber.tag("AuthicateCloudPrester").e("Permission revoked, ask to re-pick location")

Toast.makeText(context(), getString(R.string.permission_revoked_re_request_permission), Toast.LENGTH_LONG).show()

val openDocumentTree = Intent(ACTION_OPEN_DOCUMENT_TREE).apply {
putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri)
}

requestActivityResult(ActivityResultCallbacks.rePickedLocalStorageLocation(cloud), openDocumentTree)
}
}

@Callback
fun rePickedLocalStorageLocation(result: ActivityResult, cloud: LocalStorageModel) {
val rootTreeUriOfLocalStorage = result.intent().data
rootTreeUriOfLocalStorage?.let {
context() //
.contentResolver //
.takePersistableUriPermission( //
it, //
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)
}
Timber.tag("AuthicateCloudPrester").e("Permission granted again")
succeedAuthenticationWith(cloud.toCloud())
}

private fun encrypt(password: String): String {
Expand Down
Expand Up @@ -289,10 +289,6 @@ class CloudConnectionListPresenter @Inject constructor( //
}
}

fun onDefaultLocalCloudConnectionClicked() {
finishWithResult(SELECTED_CLOUD, defaultLocalStorageCloud)
}

companion object {

const val SELECTED_CLOUD = "selectedCloudConnection"
Expand Down
2 changes: 2 additions & 0 deletions presentation/src/main/res/values/strings.xml
Expand Up @@ -61,6 +61,8 @@
<string name="permission_message_upload_file">Cryptomator needs storage access to upload files</string>
<string name="permission_message_share_file">Cryptomator needs storage access to share files</string>

<string name="permission_revoked_re_request_permission">Cryptomator has lost permission to access this location. Please select this folder again to restore the permission.</string>

<string name="snack_bar_action_title_settings">Settings</string>
<string name="snack_bar_action_title_search">Search</string>
<string name="snack_bar_action_title_search_previous">Previous</string>
Expand Down
Expand Up @@ -2,6 +2,9 @@ package org.cryptomator.presentation.presenter

import android.accounts.AccountManager
import android.content.ActivityNotFoundException
import android.content.Intent
import android.content.Intent.ACTION_OPEN_DOCUMENT_TREE
import android.provider.DocumentsContract
import android.widget.Toast
import com.dropbox.core.android.Auth
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential
Expand Down Expand Up @@ -478,6 +481,7 @@ class AuthenticateCloudPresenter @Inject constructor( //
private inner class LocalStorageAuthStrategy : AuthStrategy {

private var authenticationStarted = false

override fun supports(cloud: CloudModel): Boolean {
return cloud.cloudType() == CloudTypeModel.LOCAL
}
Expand All @@ -490,17 +494,41 @@ class AuthenticateCloudPresenter @Inject constructor( //

private fun startAuthentication(cloud: CloudModel) {
authenticationStarted = true

val uri = (cloud as LocalStorageModel).uri()

val permissions = context().contentResolver.persistedUriPermissions
for (permission in permissions) {
if (permission.uri.toString() == (cloud as LocalStorageModel).uri()) {
if (permission.uri.toString() == uri) {
succeedAuthenticationWith(cloud.toCloud())
}
}

// FIXME think about how to re-request permission
// FIXME change in the FOSS variant too
failAuthentication(PermissionNotGrantedException(R.string.permission_snackbar_auth_local_vault))
Timber.tag("AuthicateCloudPrester").e("Permission revoked, ask to re-pick location")

Toast.makeText(context(), getString(R.string.permission_revoked_re_request_permission), Toast.LENGTH_LONG).show()

val openDocumentTree = Intent(ACTION_OPEN_DOCUMENT_TREE).apply {
putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri)
}

requestActivityResult(ActivityResultCallbacks.rePickedLocalStorageLocation(cloud), openDocumentTree)
}
}

@Callback
fun rePickedLocalStorageLocation(result: ActivityResult, cloud: LocalStorageModel) {
val rootTreeUriOfLocalStorage = result.intent().data
rootTreeUriOfLocalStorage?.let {
context() //
.contentResolver //
.takePersistableUriPermission( //
it, //
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)
}
Timber.tag("AuthicateCloudPrester").e("Permission granted again")
succeedAuthenticationWith(cloud.toCloud())
}

private fun encrypt(password: String): String {
Expand Down

0 comments on commit 250d756

Please sign in to comment.