Skip to content

Commit 1e14dbd

Browse files
committed
don't store pseudo-urls for passkey entries. Search RelyingParty field instead of URL.
1 parent 861db5b commit 1e14dbd

4 files changed

Lines changed: 47 additions & 6 deletions

File tree

src/Kp2aBusinessLogic/SearchDbHelper.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,28 @@ private static String ExtractHost(String url)
119119
return UrlUtil.GetHost(url.Trim());
120120
}
121121

122+
/// <summary>
123+
/// Returns all entries whose <c>KPEX_PASSKEY_RELYING_PARTY</c> extra field exactly matches
124+
/// <paramref name="relyingParty"/> (case-insensitive).
125+
/// </summary>
126+
public PwGroup SearchForRelyingParty(Database database, string relyingParty)
127+
{
128+
string strGroupName = _app.GetResourceString(UiStringKey.search_results);
129+
PwGroup pgResults = new PwGroup(true, true, strGroupName, PwIcon.EMailSearch) { IsVirtual = true };
130+
131+
foreach (PwEntry entry in database.EntriesById.Values)
132+
{
133+
if (!entry.GetSearchingEnabled())
134+
continue;
135+
var storedRp = entry.Strings.ReadSafe("KPEX_PASSKEY_RELYING_PARTY");
136+
// Log every entry that has the field so mismatches are visible in logcat
137+
if (string.Equals(storedRp, relyingParty, StringComparison.OrdinalIgnoreCase))
138+
pgResults.AddEntry(entry, false);
139+
}
140+
141+
return pgResults;
142+
}
143+
122144
public PwGroup SearchForHost(Database database, String url, bool allowSubdomains)
123145
{
124146
String host = ExtractHost(url);

src/Kp2aBusinessLogic/database/Database.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,15 @@ public PwGroup SearchForHost(String url, bool allowSubdomains)
224224

225225
}
226226

227+
/// <summary>
228+
/// Returns all entries whose <c>KPEX_PASSKEY_RELYING_PARTY</c> extra field
229+
/// exactly matches <paramref name="relyingParty"/> (case-insensitive).
230+
/// </summary>
231+
public PwGroup SearchForRelyingParty(string relyingParty)
232+
{
233+
return SearchHelper.SearchForRelyingParty(this, relyingParty);
234+
}
235+
227236

228237
public void SaveData(IFileStorage fileStorage)
229238
{

src/Kp2aPasskey.Core/PasskeyStorage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public static JSONObject CreatePasskeyFieldsJson(string relyingParty, string use
5656
var passkeyFieldsJson = new JSONObject();
5757
passkeyFieldsJson.Put(PwDefs.TitleField, $"Passkey for {relyingParty}");
5858
passkeyFieldsJson.Put(PwDefs.UserNameField, username);
59-
passkeyFieldsJson.Put(PwDefs.UrlField, $"passkey:{relyingParty}");
59+
passkeyFieldsJson.Put(PwDefs.UrlField, relyingParty);
6060

6161
// Add passkey extra fields
6262
passkeyFieldsJson.Put(PasskeyStorage.FIELD_USERNAME, passkey.Username);

src/keepass2android-app/services/Kp2aCredentialProvider/GetCredentialHelper.cs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,16 @@ public static void AddMatchingPasskeyEntries(
111111
var relyingPartyId = requestOptions.RpId;
112112
var allowCredentials = requestOptions.AllowCredentials;
113113

114-
var query = $"passkey:{relyingPartyId}";
115-
var searchResults = ShareUrlResults.GetSearchResultsForUrl(query);
116-
var foundEntries = searchResults?.Entries.ToList() ?? new List<PwEntry>();
114+
// Search directly by the KPEX_PASSKEY_RELYING_PARTY extra field — no pseudo-URL needed.
115+
var foundEntries = new List<PwEntry>();
116+
foreach (var db in App.Kp2a.OpenDatabases)
117+
{
118+
var results = db.SearchForRelyingParty(relyingPartyId);
119+
if (results?.Entries != null)
120+
{
121+
foundEntries.AddRange(results.Entries);
122+
}
123+
}
117124

118125
// Filter by allowCredentials if specified
119126
if (allowCredentials.Count > 0)
@@ -213,10 +220,13 @@ List<PublicKeyCredentialDescriptor> allowCredentials
213220
foreach (var entry in entries)
214221
{
215222
var passkey = Kp2aPasskey.Core.PasskeyStorage.RetrievePasskey(entry);
216-
if (passkey != null && allowedCredentialIds.Contains(passkey.CredentialId))
223+
if (passkey == null)
217224
{
218-
filtered.Add(entry);
225+
continue;
219226
}
227+
bool match = allowedCredentialIds.Contains(passkey.CredentialId);
228+
if (match)
229+
filtered.Add(entry);
220230
}
221231

222232
return filtered;

0 commit comments

Comments
 (0)