diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt index e7f4203f4..56e0c756d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -523,10 +523,10 @@ class GroupActivity : LockingActivity(), MoveGroupRunnable( this, Database.getInstance(), - groupToMove, - newParent, - AfterAddNodeRunnable(), - !readOnly) + groupToMove, + newParent, + AfterAddNodeRunnable(), + !readOnly) }.start() } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/ActionNodeDatabaseRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/node/ActionNodeDatabaseRunnable.kt index b4e286f21..d4df875a5 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/node/ActionNodeDatabaseRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/node/ActionNodeDatabaseRunnable.kt @@ -1,6 +1,7 @@ package com.kunzisoft.keepass.database.action.node import android.support.v4.app.FragmentActivity +import android.util.Log import com.kunzisoft.keepass.database.action.SaveDatabaseRunnable import com.kunzisoft.keepass.database.element.Database @@ -23,6 +24,7 @@ abstract class ActionNodeDatabaseRunnable( super.run() finishRun(true) } catch (e: Exception) { + Log.e("ActionNodeDBRunnable", e.message) finishRun(false, e.message) } } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/CopyEntryRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/node/CopyEntryRunnable.kt index 830f36b5d..cdcba872f 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/node/CopyEntryRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/node/CopyEntryRunnable.kt @@ -21,6 +21,7 @@ package com.kunzisoft.keepass.database.action.node import android.support.v4.app.FragmentActivity import android.util.Log +import com.kunzisoft.keepass.R import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.EntryVersioned import com.kunzisoft.keepass.database.element.GroupVersioned @@ -37,9 +38,18 @@ class CopyEntryRunnable constructor( private var mEntryCopied: EntryVersioned? = null override fun nodeAction() { - // Update entry with new values - mNewParent.touch(modified = false, touchParents = true) - mEntryCopied = database.copyEntryTo(mEntryToCopy, mNewParent) + // Condition + var conditionAccepted = true + if(mNewParent == database.rootGroup && !database.rootCanContainsEntry()) + conditionAccepted = false + if (conditionAccepted) { + // Update entry with new values + mNewParent.touch(modified = false, touchParents = true) + mEntryCopied = database.copyEntryTo(mEntryToCopy, mNewParent) + } else { + // Only finish thread + throw Exception(context.getString(R.string.error_copy_entry_here)) + } mEntryCopied?.apply { touch(modified = true, touchParents = true) @@ -56,7 +66,6 @@ class CopyEntryRunnable constructor( } catch (e: Exception) { Log.i(TAG, "Unable to delete the copied entry") } - } return ActionNodeValues(result, mEntryToCopy, mEntryCopied) } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/MoveEntryRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/node/MoveEntryRunnable.kt index 7a66d63d0..ac226e1c9 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/node/MoveEntryRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/node/MoveEntryRunnable.kt @@ -21,6 +21,7 @@ package com.kunzisoft.keepass.database.action.node import android.support.v4.app.FragmentActivity import android.util.Log +import com.kunzisoft.keepass.R import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.EntryVersioned import com.kunzisoft.keepass.database.element.GroupVersioned @@ -40,9 +41,17 @@ class MoveEntryRunnable constructor( // Move entry in new parent mEntryToMove?.let { mOldParent = it.parent + + // Condition + var conditionAccepted = true + if(mNewParent == database.rootGroup && !database.rootCanContainsEntry()) + conditionAccepted = false // Move only if the parent change - if (mOldParent != mNewParent) { + if (mOldParent != mNewParent && conditionAccepted) { database.moveEntryTo(it, mNewParent) + } else { + // Only finish thread + throw Exception(context.getString(R.string.error_move_entry_here)) } it.touch(modified = true, touchParents = true) } ?: Log.e(TAG, "Unable to create a copy of the entry") diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/MoveGroupRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/node/MoveGroupRunnable.kt index d084a56e5..6dd02b8f5 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/node/MoveGroupRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/node/MoveGroupRunnable.kt @@ -46,9 +46,7 @@ class MoveGroupRunnable constructor( finishRun(true) } else { // Only finish thread - val message = context.getString(R.string.error_move_folder_in_itself) - Log.e(TAG, message) - finishRun(false, message) + throw Exception(context.getString(R.string.error_move_folder_in_itself)) } } ?: Log.e(TAG, "Unable to create a copy of the group") } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt index 5dbaaba9e..ed1e9ec92 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt @@ -484,6 +484,10 @@ class Database { pwDatabaseV4?.retrieveMasterKey(key, keyInputStream) } + fun rootCanContainsEntry(): Boolean { + return pwDatabaseV3?.rootCanContainsEntry() ?: pwDatabaseV4?.rootCanContainsEntry() ?: false + } + fun createEntry(): EntryVersioned? { pwDatabaseV3?.let { database -> return EntryVersioned(database.createEntry()).apply { diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabase.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabase.kt index e97f58f01..583005d4a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabase.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabase.kt @@ -296,6 +296,8 @@ abstract class PwDatabase, Entry : PwEntry() { return PwEntryV3() } + override fun rootCanContainsEntry(): Boolean { + return false + } + override fun isBackup(group: PwGroupV3): Boolean { var currentGroup: PwGroupV3? = group while (currentGroup != null) { diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabaseV4.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabaseV4.kt index d343b05ac..6c864457f 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabaseV4.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/PwDatabaseV4.kt @@ -317,6 +317,10 @@ class PwDatabaseV4 : PwDatabase { return PwEntryV4() } + override fun rootCanContainsEntry(): Boolean { + return true + } + override fun isBackup(group: PwGroupV4): Boolean { if (recycleBin == null) return false diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6bb891b32..9ab21414c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -107,6 +107,8 @@ Enter a positive whole number in the \"Length\" field. Could not enable autofill service. You can not move a group into itself. + You can not move an entry here. + You can not copy an entry here. Field name Field value Could not find file.