From aaa6b371e0b1c182e2b00e38c6be35d1a45931fd Mon Sep 17 00:00:00 2001 From: Philipp Crocoll Date: Mon, 18 Jan 2016 21:18:22 +0100 Subject: [PATCH] Bug fixes: * make sure we never have an invalid startIndex in PwGroup.SearchEvalAdd * make sure AndroidContentStorage does never throw (not if permission denial exception occurs) and make sure we always return a reason for read-only. Also don't return read-only when it's not. * StopListening doesn't log Invalid State Exception as unexpected --- src/KeePassLib2Android/PwGroup.cs | 2 +- .../Io/AndroidContentStorage.cs | 39 ++++++++++++------- .../FingerprintSamsungIdentifier.cs | 6 ++- .../Properties/AndroidManifest_net.xml | 4 +- .../Resources/values/strings.xml | 6 ++- 5 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/KeePassLib2Android/PwGroup.cs b/src/KeePassLib2Android/PwGroup.cs index 3751186c..793ff3bc 100644 --- a/src/KeePassLib2Android/PwGroup.cs +++ b/src/KeePassLib2Android/PwGroup.cs @@ -990,7 +990,7 @@ namespace KeePassLib if (contextString.Length > SearchContextStringMaxLength) { // Start 10% before actual data, and don't run over - var startPos = Math.Min(matchPos - (SearchContextStringMaxLength / 10), contextString.Length - SearchContextStringMaxLength); + var startPos = Math.Max(0, Math.Min(matchPos - (SearchContextStringMaxLength / 10), contextString.Length - SearchContextStringMaxLength)); contextString = "… " + contextString.Substring(startPos, SearchContextStringMaxLength) + ((startPos + SearchContextStringMaxLength < contextString.Length) ? " …" : null); } resultContexts[pe.Uuid] = new KeyValuePair(contextFieldName, contextString); diff --git a/src/Kp2aBusinessLogic/Io/AndroidContentStorage.cs b/src/Kp2aBusinessLogic/Io/AndroidContentStorage.cs index 893b250b..c9d1f867 100644 --- a/src/Kp2aBusinessLogic/Io/AndroidContentStorage.cs +++ b/src/Kp2aBusinessLogic/Io/AndroidContentStorage.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using Android.Content; +using Android.Database; using Android.OS; using Android.Provider; using KeePassLib.Serialization; @@ -209,22 +210,23 @@ namespace keepass2android.Io public bool IsReadOnly(IOConnectionInfo ioc, OptionalOut reason = null) { - //on pre-Kitkat devices, we can't write content:// files - if (!IsKitKatOrLater) - { - Kp2aLog.Log("File is read-only because we're not on KitKat or later."); - if (reason != null) - reason.Result = UiStringKey.ReadOnlyReason_PreKitKat; - return true; - } + ICursor cursor = null; + try + { + //on pre-Kitkat devices, we can't write content:// files + if (!IsKitKatOrLater) + { + Kp2aLog.Log("File is read-only because we're not on KitKat or later."); + if (reason != null) + reason.Result = UiStringKey.ReadOnlyReason_PreKitKat; + return true; + } - //KitKat or later... - var uri = Android.Net.Uri.Parse(ioc.Path); - var cursor = _ctx.ContentResolver.Query(uri, null, null, null, null, null); + //KitKat or later... + var uri = Android.Net.Uri.Parse(ioc.Path); + cursor = _ctx.ContentResolver.Query(uri, null, null, null, null, null); - try - { if (cursor != null && cursor.MoveToFirst()) { int flags = cursor.GetInt(cursor.GetColumnIndex(DocumentsContract.Document.ColumnFlags)); @@ -235,14 +237,23 @@ namespace keepass2android.Io reason.Result = UiStringKey.ReadOnlyReason_ReadOnlyFlag; return true; } + else return false; } + else throw new Exception("couldn't move to first result element"); + } + catch (Exception e) + { + Kp2aLog.LogUnexpectedError(e); + //better return false here. We don't really know what happened (as this is unexpected). + //let the user try to write the file. If it fails they will get an exception string. + return false; } finally { if (cursor != null) cursor.Close(); } - return true; + } } diff --git a/src/keepass2android/FingerprintSamsungIdentifier.cs b/src/keepass2android/FingerprintSamsungIdentifier.cs index 399c468e..1e24601a 100644 --- a/src/keepass2android/FingerprintSamsungIdentifier.cs +++ b/src/keepass2android/FingerprintSamsungIdentifier.cs @@ -134,7 +134,11 @@ namespace keepass2android } catch (IllegalStateException ise) { - Kp2aLog.LogUnexpectedError(ise); + Kp2aLog.Log(ise.ToString()); + } + catch (System.Exception e) + { + Kp2aLog.LogUnexpectedError(e); } } } diff --git a/src/keepass2android/Properties/AndroidManifest_net.xml b/src/keepass2android/Properties/AndroidManifest_net.xml index d7205860..b2bbf289 100644 --- a/src/keepass2android/Properties/AndroidManifest_net.xml +++ b/src/keepass2android/Properties/AndroidManifest_net.xml @@ -1,7 +1,7 @@  diff --git a/src/keepass2android/Resources/values/strings.xml b/src/keepass2android/Resources/values/strings.xml index b0d301a5..98c09d62 100644 --- a/src/keepass2android/Resources/values/strings.xml +++ b/src/keepass2android/Resources/values/strings.xml @@ -616,6 +616,7 @@ Please note! This is a preview release and might come with some flaws! If you experience *anything* unexpected, please let me know (on Codeplex or by email). + Whenever you see a question if you want to enable error reports, please do so! Continue The URI you have entered does not look like a filename. Are you sure this is a valid file? @@ -655,7 +656,7 @@ - Version 1.0.0 - preview 4\n + Version 1.0.0 - preview 5\n * Fingerprint Unlock (requires Android 6.0+ or a Samsung device)\n * Added support for entry templates\n * Added "work offline" mode\n @@ -663,6 +664,9 @@ * Auto-complete mode for field names\n * Allow to remove items from recent files list\n * Request permissions at runtime in Android 6.0\n + * Bug fixes (in built-in keyboard, when selecting icons)\n + * Included option to send error reports\n + * Added help messages at several points\n * more to come...\n