From e42d8b8eeb2d947d7e978ece9b68d6cae8072297 Mon Sep 17 00:00:00 2001 From: Philipp Crocoll Date: Mon, 2 Apr 2018 19:05:32 +0200 Subject: [PATCH] improve message when storage access framework access permission is revoked --- .../Io/AndroidContentStorage.cs | 39 ++++++++++++++++++- src/Kp2aBusinessLogic/UiStringKey.cs | 3 +- .../Resources/values/strings.xml | 2 + src/keepass2android/app/App.cs | 5 ++- 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/Kp2aBusinessLogic/Io/AndroidContentStorage.cs b/src/Kp2aBusinessLogic/Io/AndroidContentStorage.cs index a2871352..674cb28e 100644 --- a/src/Kp2aBusinessLogic/Io/AndroidContentStorage.cs +++ b/src/Kp2aBusinessLogic/Io/AndroidContentStorage.cs @@ -2,12 +2,15 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Runtime.Serialization; +using Android; using Android.Content; using Android.Database; using Android.OS; using Android.Provider; using Java.IO; using KeePassLib.Serialization; +using Console = System.Console; namespace keepass2android.Io { @@ -51,7 +54,20 @@ namespace keepass2android.Io public Stream OpenFileForRead(IOConnectionInfo ioc) { - return _ctx.ContentResolver.OpenInputStream(Android.Net.Uri.Parse(ioc.Path)); + try + { + return _ctx.ContentResolver.OpenInputStream(Android.Net.Uri.Parse(ioc.Path)); + } + catch (Exception e) + { + if (e.Message.Contains("requires that you obtain access using ACTION_OPEN_DOCUMENT")) + { + //looks like permission was revoked. + throw new DocumentAccessRevokedException(); + } + throw; + } + } public IWriteTransaction OpenWriteTransaction(IOConnectionInfo ioc, bool useFileTransaction) @@ -267,7 +283,26 @@ namespace keepass2android.Io } - class AndroidContentWriteTransaction : IWriteTransaction + public class DocumentAccessRevokedException : Exception + { + public DocumentAccessRevokedException() + { + } + + public DocumentAccessRevokedException(string message) : base(message) + { + } + + public DocumentAccessRevokedException(string message, Exception innerException) : base(message, innerException) + { + } + + protected DocumentAccessRevokedException(SerializationInfo info, StreamingContext context) : base(info, context) + { + } + } + + class AndroidContentWriteTransaction : IWriteTransaction { private readonly string _path; private readonly Context _ctx; diff --git a/src/Kp2aBusinessLogic/UiStringKey.cs b/src/Kp2aBusinessLogic/UiStringKey.cs index 8cf39166..b80896b5 100644 --- a/src/Kp2aBusinessLogic/UiStringKey.cs +++ b/src/Kp2aBusinessLogic/UiStringKey.cs @@ -63,7 +63,8 @@ namespace keepass2android AskDeletePermanentlyItems, AskDeletePermanentlyItemsNoRecycle, InOfflineMode, - DuplicateTitle, + DocumentAccessRevoked, + DuplicateTitle, TemplateTitle_IdCard, TemplateField_IdCard_Name, TemplateField_IdCard_PlaceOfIssue, diff --git a/src/keepass2android/Resources/values/strings.xml b/src/keepass2android/Resources/values/strings.xml index 27900725..2c3a00f3 100644 --- a/src/keepass2android/Resources/values/strings.xml +++ b/src/keepass2android/Resources/values/strings.xml @@ -403,6 +403,8 @@ Open settings I don\'t care + The file is no longer accessible to Keepass2Android. Either it was removed or the access permissions have been revoked. Please use re-open the file, e.g. using Change database. + Pre-load database file Start background loading or downloading of the database file during password entry. diff --git a/src/keepass2android/app/App.cs b/src/keepass2android/app/App.cs index 63989038..a3df68c0 100644 --- a/src/keepass2android/app/App.cs +++ b/src/keepass2android/app/App.cs @@ -714,7 +714,10 @@ namespace keepass2android string errorMessage = e.Message; if (e is OfflineModeException) errorMessage = GetResourceString(UiStringKey.InOfflineMode); - return errorMessage; + if (e is DocumentAccessRevokedException) + errorMessage = GetResourceString(UiStringKey.DocumentAccessRevoked); + + return errorMessage; }