From ba1e591dc7ebdabba49c6992b405e707f29a7400 Mon Sep 17 00:00:00 2001 From: Philipp Crocoll Date: Thu, 19 Feb 2015 20:30:26 +0100 Subject: [PATCH] Make sure "duplicate UUID" error is not repeated after fixing the db Make sure no duplicate UUIDs are created by cancelling the save operation and saving again Reverse sort order for modification date (now descending) Added beta warning for kdb change log + manifest for 0.9.7-pre1 --- .gitignore | 2 + src/Kp2aBusinessLogic/UiStringKey.cs | 3 +- src/Kp2aBusinessLogic/database/Database.cs | 36 +++++++++++------- .../database/KdbDatabaseFormat.cs | 8 +++- .../database/edit/AddEntry.cs | 10 ++++- src/Kp2aBusinessLogic/database/edit/LoadDB.cs | 2 +- src/Kp2aUnitTests/TestBase.cs | 2 +- src/keepass2android/ChangeLog.cs | 2 +- src/keepass2android/KeeChallenge.cs | 3 +- src/keepass2android/PasswordActivity.cs | 17 +++++++-- .../Properties/AndroidManifest_net.xml | 4 +- src/keepass2android/PwGroupListAdapter.cs | 4 +- .../drawable-xxxhdpi/ic_launcher_1.png | Bin 0 -> 3466 bytes .../drawable-xxxhdpi/ic_launcher_2.png | Bin 0 -> 3672 bytes .../drawable-xxxhdpi/ic_launcher_3.png | Bin 0 -> 4802 bytes .../drawable-xxxhdpi/ic_launcher_4.png | Bin 0 -> 4686 bytes .../Resources/values/strings.xml | 14 ++++++- src/keepass2android/app/App.cs | 11 +++++- src/keepass2android/keepass2android.csproj | 1 + src/keepass2android/packages.config | 7 ++++ 20 files changed, 96 insertions(+), 30 deletions(-) create mode 100644 src/keepass2android/Resources/drawable-xxxhdpi/ic_launcher_1.png create mode 100644 src/keepass2android/Resources/drawable-xxxhdpi/ic_launcher_2.png create mode 100644 src/keepass2android/Resources/drawable-xxxhdpi/ic_launcher_3.png create mode 100644 src/keepass2android/Resources/drawable-xxxhdpi/ic_launcher_4.png create mode 100644 src/keepass2android/packages.config diff --git a/.gitignore b/.gitignore index 89556da0..69198204 100644 --- a/.gitignore +++ b/.gitignore @@ -119,3 +119,5 @@ Thumbs.db /src/MasterKeeWinPlugin/bin/Release /src/SamplePlugin /src/packages/ + +*.apk diff --git a/src/Kp2aBusinessLogic/UiStringKey.cs b/src/Kp2aBusinessLogic/UiStringKey.cs index d7d9459c..3bc22d20 100644 --- a/src/Kp2aBusinessLogic/UiStringKey.cs +++ b/src/Kp2aBusinessLogic/UiStringKey.cs @@ -56,6 +56,7 @@ namespace keepass2android FileIsReadOnlyOnKitkat, CopyFileRequiredForEditing, DuplicateUuidsError, - DuplicateUuidsErrorAdditional + DuplicateUuidsErrorAdditional, + KdbBetaWarning } } diff --git a/src/Kp2aBusinessLogic/database/Database.cs b/src/Kp2aBusinessLogic/database/Database.cs index f4bab2ef..59b552e6 100644 --- a/src/Kp2aBusinessLogic/database/Database.cs +++ b/src/Kp2aBusinessLogic/database/Database.cs @@ -110,21 +110,31 @@ namespace keepass2android Stream s = databaseData ?? fileStorage.OpenFileForRead(iocInfo); var fileVersion = _app.GetFileStorage(iocInfo).GetCurrentFileVersionFast(iocInfo); PopulateDatabaseFromStream(pwDatabase, s, iocInfo, compositeKey, status, databaseFormat); - LastFileVersion = fileVersion; + try + { + LastFileVersion = fileVersion; + + status.UpdateSubMessage(""); + + Root = pwDatabase.RootGroup; + PopulateGlobals(Root); + + Loaded = true; + KpDatabase = pwDatabase; + SearchHelper = new SearchDbHelper(app); + + _databaseFormat = databaseFormat; + + CanWrite = databaseFormat.CanWrite && !fileStorage.IsReadOnly(iocInfo); + } + catch (Exception) + { + Clear(); + throw; + } - status.UpdateSubMessage(""); - Root = pwDatabase.RootGroup; - PopulateGlobals(Root); - - - Loaded = true; - KpDatabase = pwDatabase; - SearchHelper = new SearchDbHelper(app); - - _databaseFormat = databaseFormat; - - CanWrite = databaseFormat.CanWrite && !fileStorage.IsReadOnly(iocInfo); + } /// diff --git a/src/Kp2aBusinessLogic/database/KdbDatabaseFormat.cs b/src/Kp2aBusinessLogic/database/KdbDatabaseFormat.cs index 61a2143e..19e4ae32 100644 --- a/src/Kp2aBusinessLogic/database/KdbDatabaseFormat.cs +++ b/src/Kp2aBusinessLogic/database/KdbDatabaseFormat.cs @@ -24,10 +24,16 @@ namespace keepass2android { public class KdbDatabaseFormat: IDatabaseFormat { + private readonly IKp2aApp _app; private Dictionary _groupData = new Dictionary(); private static readonly DateTime _expireNever = new DateTime(2999,12,28,23,59,59); private List _metaStreams; + public KdbDatabaseFormat(IKp2aApp app) + { + _app = app; + } + public void PopulateDatabaseFromStream(PwDatabase db, Stream s, IStatusLogger slLogger) { #if !EXCLUDE_KEYTRANSFORM @@ -215,7 +221,7 @@ namespace keepass2android public bool CanWrite { get { return true; } } public string SuccessMessage { get { - return ""; + return _app.GetResourceString(UiStringKey.KdbBetaWarning); } } public void Save(PwDatabase kpDatabase, Stream stream) diff --git a/src/Kp2aBusinessLogic/database/edit/AddEntry.cs b/src/Kp2aBusinessLogic/database/edit/AddEntry.cs index 4db60b9a..6c4c313b 100644 --- a/src/Kp2aBusinessLogic/database/edit/AddEntry.cs +++ b/src/Kp2aBusinessLogic/database/edit/AddEntry.cs @@ -48,7 +48,15 @@ namespace keepass2android public override void Run() { StatusLogger.UpdateMessage(UiStringKey.AddingEntry); - _parentGroup.AddEntry(_entry, true); + + //make sure we're not adding the entry if it was added before. + //(this might occur in very rare cases where the user dismissis the save dialog + //by rotating the screen while saving and then presses save again) + if (_parentGroup.FindEntry(_entry.Uuid, false) == null) + { + _parentGroup.AddEntry(_entry, true); + } + // Commit to disk SaveDb save = new SaveDb(_ctx, _app, OnFinishToRun); diff --git a/src/Kp2aBusinessLogic/database/edit/LoadDB.cs b/src/Kp2aBusinessLogic/database/edit/LoadDB.cs index 8f2dc0be..82923a94 100644 --- a/src/Kp2aBusinessLogic/database/edit/LoadDB.cs +++ b/src/Kp2aBusinessLogic/database/edit/LoadDB.cs @@ -125,7 +125,7 @@ namespace keepass2android } catch (OldFormatException) { - _format = new KdbDatabaseFormat(); + _format = new KdbDatabaseFormat(_app); TryLoad(databaseStream); } catch (InvalidCompositeKeyException) diff --git a/src/Kp2aUnitTests/TestBase.cs b/src/Kp2aUnitTests/TestBase.cs index 2b8c6d9a..b0c2c60b 100644 --- a/src/Kp2aUnitTests/TestBase.cs +++ b/src/Kp2aUnitTests/TestBase.cs @@ -138,7 +138,7 @@ namespace Kp2aUnitTests Database db = app.CreateNewDatabase(); if (filename.EndsWith(".kdb")) { - db.DatabaseFormat = new KdbDatabaseFormat(); + db.DatabaseFormat = new KdbDatabaseFormat(app); } db.KpDatabase = new PwDatabase(); diff --git a/src/keepass2android/ChangeLog.cs b/src/keepass2android/ChangeLog.cs index 98d224b5..61e86325 100644 --- a/src/keepass2android/ChangeLog.cs +++ b/src/keepass2android/ChangeLog.cs @@ -26,7 +26,7 @@ namespace keepass2android AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(ctx, Android.Resource.Style.ThemeHoloLightDialog)); builder.SetTitle(ctx.GetString(Resource.String.ChangeLog_title)); List changeLog = new List{ - + ctx.GetString(Resource.String.ChangeLog_0_9_7), ctx.GetString(Resource.String.ChangeLog_0_9_6), ctx.GetString(Resource.String.ChangeLog_0_9_5), ctx.GetString(Resource.String.ChangeLog_0_9_4), diff --git a/src/keepass2android/KeeChallenge.cs b/src/keepass2android/KeeChallenge.cs index 381c068b..78b1d278 100644 --- a/src/keepass2android/KeeChallenge.cs +++ b/src/keepass2android/KeeChallenge.cs @@ -19,6 +19,7 @@ using System; using System.IO; using System.Collections.Generic; +using System.Linq; using System.Text; using System.Security.Cryptography; using System.Diagnostics; @@ -56,7 +57,7 @@ namespace KeeChallenge set; } - private KeeChallengeProv() + public KeeChallengeProv() { LT64 = false; } diff --git a/src/keepass2android/PasswordActivity.cs b/src/keepass2android/PasswordActivity.cs index 0bc6e655..49319330 100644 --- a/src/keepass2android/PasswordActivity.cs +++ b/src/keepass2android/PasswordActivity.cs @@ -1464,9 +1464,6 @@ namespace keepass2android { _act.ClearEnteredPassword(); - - _act.LaunchNextActivity(); - _act.BroadcastOpenDatabase(); @@ -1476,12 +1473,24 @@ namespace keepass2android { new AlertDialog.Builder(_act).SetMessage(Message) .SetPositiveButton(Android.Resource.String.Ok, - (sender, args) => ((Dialog) sender).Dismiss()) + (sender, args) => + { + ((Dialog) sender).Dismiss(); + _act.LaunchNextActivity(); + }) + .SetCancelable(false) .Show(); + } else { DisplayMessage(_act); + if (Success) + { + _act.LaunchNextActivity(); + } + + } diff --git a/src/keepass2android/Properties/AndroidManifest_net.xml b/src/keepass2android/Properties/AndroidManifest_net.xml index 9b2669cc..ac72c5d3 100644 --- a/src/keepass2android/Properties/AndroidManifest_net.xml +++ b/src/keepass2android/Properties/AndroidManifest_net.xml @@ -1,7 +1,7 @@  diff --git a/src/keepass2android/PwGroupListAdapter.cs b/src/keepass2android/PwGroupListAdapter.cs index 2a079778..2940acc6 100644 --- a/src/keepass2android/PwGroupListAdapter.cs +++ b/src/keepass2android/PwGroupListAdapter.cs @@ -49,12 +49,12 @@ namespace keepass2android public int CompareEntries(PwEntry a, PwEntry b) { - return a.LastModificationTime.CompareTo(b.LastModificationTime); + return -a.LastModificationTime.CompareTo(b.LastModificationTime); } public int CompareGroups(PwGroup a, PwGroup b) { - return a.LastModificationTime.CompareTo(b.LastModificationTime); + return -a.LastModificationTime.CompareTo(b.LastModificationTime); } } class CreationDateSortOrder : IGroupViewSortOrder diff --git a/src/keepass2android/Resources/drawable-xxxhdpi/ic_launcher_1.png b/src/keepass2android/Resources/drawable-xxxhdpi/ic_launcher_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b3561274f8e1c92b2f6c47dc707529951643d21f GIT binary patch literal 3466 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 literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable-xxxhdpi/ic_launcher_3.png b/src/keepass2android/Resources/drawable-xxxhdpi/ic_launcher_3.png new file mode 100644 index 0000000000000000000000000000000000000000..44af377b82d47c28088c3de469684306424717b9 GIT binary patch literal 4802 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

=3H0=l<~Dr4i-bn+Wct=48ghDmr0!* zfWEA>clVRM>4l)ppu#Y*VYaQ84*kB~E`noAJSBpj!|cnS%(8kYeUBbQ>%3cI%L;2@ z4R*e-4nZ1irpsQbAM+*+4o+tDZ(0U_dG-mz=Ki~ta%WTc9FcWv=TB8t-~9dC8o1Vc zH3@VUO3NFN6$)u^KRT9fxL;thwd2sEr(1S)BfESmz-40h8e7bCsVuRp2XRoO0{)R9m6or+hA<_a2Sp6xO9P0Uc?4v{`N-AA2;)Z0f+6{mvm+{K`mIGXYxx7&ceZkdq?vXmU1QM^KbnKDWKqg1S48n`0 z0MVEW$X5S$W|x_~oFs*Q_-94Vl_{8G3P^%F*W?t5FJt=iM-}af6T)R~BP~i@ddDYK zoXyr@2LGJeP&d)#CzW}X4=Y(kp1^Og@xhgTLdf$Q8F~kn?>25(7jV>+e0=SFWt`PL zHA^6##5vBO>*@as6+s{T?or;#vx>8TqBU8oTU!~*-IuU5(XcdWOH}hY#r546>v{_= zmVem*9tkcbQ>Iq-rv4O~kp~Vb7;iWixIi3a1Ih(>X#gIe_A|y95qh!8p8BcHvu7l9 z@&_IDP&WDYNy6Np#RRTaPeiYO0JK)}id_hWXp9gF&O&+=4h2O-6SRW=0R{phNX<&U z5OA7E^EGXTU|PVE2++4sIQEnN1^m1xBkpT_sLd=^t3zAwP=5C8#~a;W1Rfu~2{kIH$5?bh$E+Ow9l^3<2@d z@R63AE%Z(yVWkvqcQMtiEXe?i5kOCoq)+q3cTh}f-%Y|aGJL(y^Y1Tg1;)Qg@yFHM z(?RMA$+Ku4*f&Ff9VPFt{@@xV1D`2Vu`3PV?IgSl8wYD?U)Qa*PoBCQe|4<)Mo>-z zfeiQu6`Vtp5o;I$HCl?XIJ#AH;7##+EnO7XbD*HZp_662V!g%#3^IR>h0Q}@75M5pQMTmtxNsk7ld}{P`c9 zZxdgqnWeE$DZAK!GVATN?`OYqWQ}&d*eJX0bS$6mTipHl(t~ca7sDh0MP<{vg;YxC0@V(9O^3C*it3S GkpBUcrRbFa literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/drawable-xxxhdpi/ic_launcher_4.png b/src/keepass2android/Resources/drawable-xxxhdpi/ic_launcher_4.png new file mode 100644 index 0000000000000000000000000000000000000000..db53eb5e497b5a0217d30b803e9e95f35e2d8a98 GIT binary patch literal 4686 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 literal 0 HcmV?d00001 diff --git a/src/keepass2android/Resources/values/strings.xml b/src/keepass2android/Resources/values/strings.xml index 9c1c8437..d9a73540 100644 --- a/src/keepass2android/Resources/values/strings.xml +++ b/src/keepass2android/Resources/values/strings.xml @@ -521,12 +521,24 @@ Cancel, open read-only. Copying file... + + Please note: You have loaded a Keepass 1 database. Keepass2Android has recently added write support for this database format. Despite thorough testing, the author does not guarantee that all data will be saved correctly. Please always keep a backup of the original database (Dropbox automatically stores recent versions) before making changes. Please report any issues. Thanks! Change log 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). - + + Version 0.9.7\n + * write support for Keepass 1 (kdb) databases (beta!)\n + * better switching back to previous keyboard (also works on non-rooted devices)\n + * support for KeeChallenge with variable length challenges\n + * prevent taking screenshots from QuickUnlock and password screens\n + * reverse sort order for Sort by Modification Date (now descending)\n + * bug fixes: Notes view now updated correctly after changes, Password views now hiding password correctly on (hopefully) all devices, fixed issue that allowed to add an entry twice, fixed issue with showing Duplicate UUID warning even after fixing the database\n + + + Version 0.9.6\n * allow to import key file and/or local database file to app internal directory (see settings)\n * allow different sorting options\n diff --git a/src/keepass2android/app/App.cs b/src/keepass2android/app/App.cs index 0a5c2af4..40700fe5 100644 --- a/src/keepass2android/app/App.cs +++ b/src/keepass2android/app/App.cs @@ -367,6 +367,7 @@ namespace keepass2android public RealProgressDialog(Context ctx) { _pd = new ProgressDialog(ctx); + _pd.SetCancelable(false); } public void SetTitle(string title) @@ -381,7 +382,15 @@ namespace keepass2android public void Dismiss() { - _pd.Dismiss(); + try + { + _pd.Dismiss(); + } + catch (Exception e) + { + Kp2aLog.Log(e.ToString()); + } + } public void Show() diff --git a/src/keepass2android/keepass2android.csproj b/src/keepass2android/keepass2android.csproj index 59ec5fd3..9b56afb0 100644 --- a/src/keepass2android/keepass2android.csproj +++ b/src/keepass2android/keepass2android.csproj @@ -689,6 +689,7 @@ {53A9CB7F-6553-4BC0-B56B-9410BB2E59AA} Kp2aBusinessLogic + False {70D3844A-D9FA-4A64-B205-A84C6A822196} diff --git a/src/keepass2android/packages.config b/src/keepass2android/packages.config new file mode 100644 index 00000000..2c3ad1a4 --- /dev/null +++ b/src/keepass2android/packages.config @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file