From 92a2511d9da9bcd4ea3eeac2e89a19a1ec518808 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Tue, 25 Feb 2025 11:59:47 +0100 Subject: [PATCH] Fix bug in browser extension emails list if credential has no email address (#612) --- .../chrome/src/app/pages/EmailsList.tsx | 7 +------ .../chrome/src/shared/SqliteClient.tsx | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/browser-extensions/chrome/src/app/pages/EmailsList.tsx b/browser-extensions/chrome/src/app/pages/EmailsList.tsx index a1282dc52..bf04e0b6c 100644 --- a/browser-extensions/chrome/src/app/pages/EmailsList.tsx +++ b/browser-extensions/chrome/src/app/pages/EmailsList.tsx @@ -34,13 +34,8 @@ const EmailsList: React.FC = () => { return; } - // TODO: create separate query to only get email addresses to avoid loading all credentials. - const credentials = dbContext.sqliteClient.getAllCredentials(); - // Get unique email addresses from all credentials. - const emailAddresses = credentials - .map(cred => cred.Email.trim()) // Trim whitespace - .filter((email, index, self) => self.indexOf(email) === index); + const emailAddresses = dbContext.sqliteClient.getAllEmailAddresses(); try { // For now we only show the latest 50 emails. No pagination. diff --git a/browser-extensions/chrome/src/shared/SqliteClient.tsx b/browser-extensions/chrome/src/shared/SqliteClient.tsx index 01f623e2f..71c60df98 100644 --- a/browser-extensions/chrome/src/shared/SqliteClient.tsx +++ b/browser-extensions/chrome/src/shared/SqliteClient.tsx @@ -229,6 +229,25 @@ class SqliteClient { })); } + /** + * Fetch all unique email addresses from all credentials. + * @returns Array of email addresses. + */ + public getAllEmailAddresses(): string[] { + const query = ` + SELECT DISTINCT + a.Email + FROM Credentials c + LEFT JOIN Aliases a ON c.AliasId = a.Id + WHERE a.Email IS NOT NULL AND a.Email != '' AND c.IsDeleted = 0 + `; + + const results = this.executeQuery(query); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return results.map((row: any) => row.Email); + } + /** * Fetch all encryption keys. */