diff --git a/src/keepass2android/EntryActivity.cs b/src/keepass2android/EntryActivity.cs index 75b982c6..ea19a93f 100644 --- a/src/keepass2android/EntryActivity.cs +++ b/src/keepass2android/EntryActivity.cs @@ -809,7 +809,7 @@ namespace keepass2android RegisterTextPopup(FindViewById(Resource.Id.url_container), FindViewById(Resource.Id.url_vdots), PwDefs.UrlField) - .Add(new GotoUrlMenuItem(this)); + .Add(new GotoUrlMenuItem(this, PwDefs.UrlField)); RegisterTextPopup(FindViewById(Resource.Id.password_container), FindViewById(Resource.Id.password_vdots), PwDefs.PasswordField); @@ -877,6 +877,12 @@ namespace keepass2android popupItems.Add(new CopyToClipboardPopupMenuIcon(this, _stringViews[fieldKey])); if (isProtected) popupItems.Add(new ToggleVisibilityPopupMenuItem(this)); + if (_stringViews[fieldKey].Text.StartsWith(KeePass.AndroidAppScheme) + || _stringViews[fieldKey].Text.StartsWith("http://") + || _stringViews[fieldKey].Text.StartsWith("https://")) + { + popupItems.Add(new GotoUrlMenuItem(this, fieldKey)); + } return popupItems; } @@ -1209,19 +1215,15 @@ namespace keepass2android newEntry.Touch(true, false); // Touch *after* backup //if there is no URL in the entry, set that field. If it's already in use, use an additional (not existing) field - if (String.IsNullOrEmpty(newEntry.Strings.ReadSafe(PwDefs.UrlField))) + if (!url.StartsWith(KeePass.AndroidAppScheme) && String.IsNullOrEmpty(newEntry.Strings.ReadSafe(PwDefs.UrlField))) { newEntry.Strings.Set(PwDefs.UrlField, new ProtectedString(false, url)); } else - { - int c = 1; - while (newEntry.Strings.Get("KP2A_URL_" + c) != null) - { - c++; - } + { + Util.SetNextFreeUrlField(newEntry, url); - newEntry.Strings.Set("KP2A_URL_" + c, new ProtectedString(false, url)); + } //save the entry: @@ -1247,9 +1249,9 @@ namespace keepass2android } - public bool GotoUrl() - { - string url = _stringViews[PwDefs.UrlField].Text; + public bool GotoUrl(string urlFieldKey) + { + string url = _stringViews[urlFieldKey].Text; if (url == null) return false; // Default http:// if no protocol specified diff --git a/src/keepass2android/EntryActivityClasses/GotoUrlMenuItem.cs b/src/keepass2android/EntryActivityClasses/GotoUrlMenuItem.cs index d1ad90c1..c4d42a0f 100644 --- a/src/keepass2android/EntryActivityClasses/GotoUrlMenuItem.cs +++ b/src/keepass2android/EntryActivityClasses/GotoUrlMenuItem.cs @@ -8,12 +8,14 @@ namespace keepass2android /// class GotoUrlMenuItem : IPopupMenuItem { - private readonly EntryActivity _ctx; + public string UrlFieldKey { get; } + private readonly EntryActivity _ctx; - public GotoUrlMenuItem(EntryActivity ctx) - { - _ctx = ctx; - } + public GotoUrlMenuItem(EntryActivity ctx, string urlFieldKey) + { + UrlFieldKey = urlFieldKey; + _ctx = ctx; + } public Drawable Icon { @@ -27,7 +29,7 @@ namespace keepass2android public void HandleClick() { - _ctx.GotoUrl(); + _ctx.GotoUrl(UrlFieldKey); } } } \ No newline at end of file diff --git a/src/keepass2android/KeePass.cs b/src/keepass2android/KeePass.cs index f2c60a7b..2802ad91 100644 --- a/src/keepass2android/KeePass.cs +++ b/src/keepass2android/KeePass.cs @@ -85,6 +85,8 @@ namespace keepass2android public const Result ExitLoadAnotherDb = Result.FirstUser + 10; public const Result ExitLockByTimeout = Result.FirstUser + 11; + public const string AndroidAppScheme = "androidapp://"; + public const string TagsKey = "@tags"; public const string OverrideUrlKey = "@override"; diff --git a/src/keepass2android/QueryCredentialsActivity.cs b/src/keepass2android/QueryCredentialsActivity.cs index f0b8ebb8..04773192 100644 --- a/src/keepass2android/QueryCredentialsActivity.cs +++ b/src/keepass2android/QueryCredentialsActivity.cs @@ -69,7 +69,7 @@ namespace keepass2android if (Intent.Action == Strings.ActionQueryCredentialsForOwnPackage) { _requiredScope = Strings.ScopeQueryCredentialsForOwnPackage; - _requestedUrl = "androidapp://" + _pluginPackage; + _requestedUrl = KeePass.AndroidAppScheme + _pluginPackage; } else if (Intent.Action == Strings.ActionQueryCredentials) { diff --git a/src/keepass2android/ShareUrlResults.cs b/src/keepass2android/ShareUrlResults.cs index b7b134de..3d6a1699 100644 --- a/src/keepass2android/ShareUrlResults.cs +++ b/src/keepass2android/ShareUrlResults.cs @@ -168,7 +168,7 @@ namespace keepass2android { //first: search for exact url var resultsForThisDb = db.SearchForExactUrl(url); - if (!url.StartsWith("androidapp://")) + if (!url.StartsWith(KeePass.AndroidAppScheme)) { //if no results, search for host (e.g. "accounts.google.com") if (!resultsForThisDb.Entries.Any()) diff --git a/src/keepass2android/Utils/Util.cs b/src/keepass2android/Utils/Util.cs index 86eb6ddf..3c740fe5 100644 --- a/src/keepass2android/Utils/Util.cs +++ b/src/keepass2android/Utils/Util.cs @@ -36,6 +36,8 @@ using Android.Hardware.Display; using Android.Util; using Android.Views.InputMethods; using AndroidX.Core.View.InputMethod; +using KeePassLib; +using KeePassLib.Security; using KeePassLib.Serialization; using Uri = Android.Net.Uri; @@ -666,6 +668,18 @@ namespace keepass2android SetNoPersonalizedLearning(editText); } } + + public static void SetNextFreeUrlField(PwEntry entry, string url) + { + string prefix = url.StartsWith(KeePass.AndroidAppScheme) ? "AndroidApp" : "KP2A_URL_"; + int c = 1; + while (entry.Strings.Get(prefix + c) != null) + { + c++; + } + + entry.Strings.Set(prefix + c, new ProtectedString(false, url)); + } } } diff --git a/src/keepass2android/app/AppTask.cs b/src/keepass2android/app/AppTask.cs index 595d2ee2..9228fa19 100644 --- a/src/keepass2android/app/AppTask.cs +++ b/src/keepass2android/app/AppTask.cs @@ -701,9 +701,9 @@ namespace keepass2android public override void PrepareNewEntry(PwEntry newEntry) { if (Url != null) - { - newEntry.Strings.Set(PwDefs.UrlField, new ProtectedString(false, Url)); - } + { + Util.SetNextFreeUrlField(newEntry, Url); + } if (AllFields != null) { diff --git a/src/keepass2android/services/AutofillBase/AutofillServiceBase.cs b/src/keepass2android/services/AutofillBase/AutofillServiceBase.cs index 28e60224..1dda716d 100644 --- a/src/keepass2android/services/AutofillBase/AutofillServiceBase.cs +++ b/src/keepass2android/services/AutofillBase/AutofillServiceBase.cs @@ -233,7 +233,7 @@ namespace keepass2android.services.AutofillBase string displayName = str; try { - string appPrefix = "androidapp://"; + string appPrefix = KeePass.AndroidAppScheme; if (str.StartsWith(appPrefix)) { str = str.Substring(appPrefix.Length); @@ -282,7 +282,7 @@ namespace keepass2android.services.AutofillBase private bool CanAutofill(StructureParser.AutofillTargetId query, bool isManual) { - if (query.PackageNameWithPseudoSchema == "androidapp://android" || query.PackageNameWithPseudoSchema == "androidapp://" + this.PackageName) + if (query.PackageNameWithPseudoSchema == KeePass.AndroidAppScheme+"android" || query.PackageNameWithPseudoSchema == KeePass.AndroidAppScheme + this.PackageName) return false; if (!isManual) { diff --git a/src/keepass2android/services/AutofillBase/StructureParser.cs b/src/keepass2android/services/AutofillBase/StructureParser.cs index c46aed72..30e10dc3 100644 --- a/src/keepass2android/services/AutofillBase/StructureParser.cs +++ b/src/keepass2android/services/AutofillBase/StructureParser.cs @@ -45,7 +45,7 @@ namespace keepass2android.services.AutofillBase public string PackageNameWithPseudoSchema { - get { return "androidapp://" + PackageName; } + get { return KeePass.AndroidAppScheme + PackageName; } } public string WebDomain { get; set; }