mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Fix Permissions #1066
This commit is contained in:
@@ -125,13 +125,6 @@ class FileDatabaseSelectActivity : DatabaseModeActivity(),
|
||||
}
|
||||
}
|
||||
mAdapterDatabaseHistory?.setOnFileDatabaseHistoryDeleteListener { fileDatabaseHistoryToDelete ->
|
||||
// Remove from app database
|
||||
fileDatabaseHistoryToDelete.databaseUri?.let { databaseUri ->
|
||||
UriUtil.releaseUriPermission(
|
||||
contentResolver,
|
||||
databaseUri
|
||||
)
|
||||
}
|
||||
databaseFilesViewModel.deleteDatabaseFile(fileDatabaseHistoryToDelete)
|
||||
true
|
||||
}
|
||||
|
||||
@@ -189,26 +189,36 @@ class FileDatabaseHistoryAction(private val applicationContext: Context) {
|
||||
).execute()
|
||||
}
|
||||
|
||||
fun deleteKeyFileByDatabaseUri(databaseUri: Uri) {
|
||||
fun deleteKeyFileByDatabaseUri(databaseUri: Uri,
|
||||
result: (() ->Unit)? = null) {
|
||||
IOActionTask(
|
||||
{
|
||||
databaseFileHistoryDao.deleteKeyFileByDatabaseUri(databaseUri.toString())
|
||||
},
|
||||
{
|
||||
result?.invoke()
|
||||
}
|
||||
).execute()
|
||||
}
|
||||
|
||||
fun deleteAllKeyFiles() {
|
||||
fun deleteAllKeyFiles(result: (() ->Unit)? = null) {
|
||||
IOActionTask(
|
||||
{
|
||||
databaseFileHistoryDao.deleteAllKeyFiles()
|
||||
},
|
||||
{
|
||||
result?.invoke()
|
||||
}
|
||||
).execute()
|
||||
}
|
||||
|
||||
fun deleteAll() {
|
||||
fun deleteAll(result: (() ->Unit)? = null) {
|
||||
IOActionTask(
|
||||
{
|
||||
databaseFileHistoryDao.deleteAll()
|
||||
},
|
||||
{
|
||||
result?.invoke()
|
||||
}
|
||||
).execute()
|
||||
}
|
||||
|
||||
@@ -81,14 +81,18 @@ class NestedAppSettingsFragment : NestedSettingsFragment() {
|
||||
activity?.let { activity ->
|
||||
findPreference<Preference>(getString(R.string.remember_database_locations_key))?.setOnPreferenceChangeListener { _, newValue ->
|
||||
if (!(newValue as Boolean)) {
|
||||
FileDatabaseHistoryAction.getInstance(activity.applicationContext).deleteAll()
|
||||
FileDatabaseHistoryAction.getInstance(activity.applicationContext).deleteAll {
|
||||
UriUtil.releaseAllUnnecessaryPermissionUris(activity.applicationContext)
|
||||
}
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
findPreference<Preference>(getString(R.string.remember_keyfile_locations_key))?.setOnPreferenceChangeListener { _, newValue ->
|
||||
if (!(newValue as Boolean)) {
|
||||
FileDatabaseHistoryAction.getInstance(activity.applicationContext).deleteAllKeyFiles()
|
||||
FileDatabaseHistoryAction.getInstance(activity.applicationContext).deleteAllKeyFiles {
|
||||
UriUtil.releaseAllUnnecessaryPermissionUris(activity.applicationContext)
|
||||
}
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@ import android.content.IntentFilter
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction
|
||||
import com.kunzisoft.keepass.database.element.Database
|
||||
import com.kunzisoft.keepass.magikeyboard.MagikeyboardService
|
||||
import com.kunzisoft.keepass.services.ClipboardEntryNotificationService
|
||||
@@ -142,19 +141,5 @@ fun Context.closeDatabase(database: Database?) {
|
||||
database?.clearAndClose(this)
|
||||
|
||||
// Release not useful URI permission
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
applicationContext?.let { appContext ->
|
||||
val fileDatabaseHistoryAction = FileDatabaseHistoryAction.getInstance(appContext)
|
||||
fileDatabaseHistoryAction.getDatabaseFileList { databaseFileList ->
|
||||
val listToNotRemove = databaseFileList.map { it.databaseUri }
|
||||
// Remove URI permission for not database files
|
||||
val resolver = appContext.contentResolver
|
||||
resolver.persistedUriPermissions.forEach { uriPermission ->
|
||||
val uri = uriPermission.uri
|
||||
if (!listToNotRemove.contains(uri))
|
||||
UriUtil.releaseUriPermission(resolver, uri)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
UriUtil.releaseAllUnnecessaryPermissionUris(applicationContext)
|
||||
}
|
||||
@@ -29,6 +29,7 @@ import android.util.Log
|
||||
import android.widget.Toast
|
||||
import androidx.documentfile.provider.DocumentFile
|
||||
import com.kunzisoft.keepass.R
|
||||
import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction
|
||||
import java.io.*
|
||||
import java.util.*
|
||||
|
||||
@@ -187,6 +188,32 @@ object UriUtil {
|
||||
persistUriPermission(contentResolver, uri, release = true, readOnly = false)
|
||||
}
|
||||
|
||||
fun releaseAllUnnecessaryPermissionUris(applicationContext: Context?) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
applicationContext?.let { appContext ->
|
||||
val fileDatabaseHistoryAction = FileDatabaseHistoryAction.getInstance(appContext)
|
||||
fileDatabaseHistoryAction.getDatabaseFileList { databaseFileList ->
|
||||
val listToNotRemove = mutableListOf<Uri>()
|
||||
databaseFileList.forEach {
|
||||
it.databaseUri?.let { databaseUri ->
|
||||
listToNotRemove.add(databaseUri)
|
||||
}
|
||||
it.keyFileUri?.let { keyFileUri ->
|
||||
listToNotRemove.add(keyFileUri)
|
||||
}
|
||||
}
|
||||
// Remove URI permission for not database files
|
||||
val resolver = appContext.contentResolver
|
||||
resolver.persistedUriPermissions.forEach { uriPermission ->
|
||||
val uri = uriPermission.uri
|
||||
if (!listToNotRemove.contains(uri))
|
||||
releaseUriPermission(resolver, uri)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getUriFromIntent(intent: Intent, key: String): Uri? {
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
|
||||
|
||||
@@ -110,6 +110,21 @@ class DatabaseFilesViewModel(application: Application) : AndroidViewModel(applic
|
||||
fun deleteDatabaseFile(databaseFileToDelete: DatabaseFile) {
|
||||
mFileDatabaseHistoryAction?.deleteDatabaseFile(databaseFileToDelete) { databaseFileDeleted ->
|
||||
databaseFileDeleted?.let { _ ->
|
||||
// Release database and keyfile URIs permissions
|
||||
val contentResolver = getApplication<App>().applicationContext.contentResolver
|
||||
databaseFileDeleted.databaseUri?.let { databaseUri ->
|
||||
UriUtil.releaseUriPermission(
|
||||
contentResolver,
|
||||
databaseUri
|
||||
)
|
||||
}
|
||||
databaseFileDeleted.keyFileUri?.let { keyFileUri ->
|
||||
UriUtil.releaseUriPermission(
|
||||
contentResolver,
|
||||
keyFileUri
|
||||
)
|
||||
}
|
||||
// Call the feedback
|
||||
databaseFilesLoaded.value = getDatabaseFilesLoadedValue().apply {
|
||||
databaseFileAction = DatabaseFileAction.DELETE
|
||||
databaseFileToActivate = databaseFileDeleted
|
||||
|
||||
Reference in New Issue
Block a user