diff options
Diffstat (limited to 'src/browser/BrowserService.cpp')
-rw-r--r-- | src/browser/BrowserService.cpp | 57 |
1 files changed, 49 insertions, 8 deletions
diff --git a/src/browser/BrowserService.cpp b/src/browser/BrowserService.cpp index 1f54e33ca..eb752996c 100644 --- a/src/browser/BrowserService.cpp +++ b/src/browser/BrowserService.cpp @@ -215,7 +215,6 @@ QJsonObject BrowserService::getDatabaseGroups() QJsonObject BrowserService::createNewGroup(const QString& groupName) { - auto db = getDatabase(); if (!db) { return {}; @@ -284,6 +283,31 @@ QJsonObject BrowserService::createNewGroup(const QString& groupName) return result; } +QString BrowserService::getCurrentTotp(const QString& uuid) +{ + QList<QSharedPointer<Database>> databases; + if (browserSettings()->searchInAllDatabases()) { + for (auto dbWidget : getMainWindow()->getOpenDatabases()) { + auto db = dbWidget->database(); + if (db) { + databases << db; + } + } + } else { + databases << getDatabase(); + } + + auto entryUuid = Tools::hexToUuid(uuid); + for (const auto& db : databases) { + auto entry = db->rootGroup()->findEntryByUuid(entryUuid, true); + if (entry) { + return entry->totp(); + } + } + + return {}; +} + QString BrowserService::storeKey(const QString& key) { auto db = getDatabase(); @@ -413,7 +437,7 @@ QJsonArray BrowserService::findMatchingEntries(const QString& dbid, } // Sort results - pwEntries = sortEntries(pwEntries, host, submitUrl); + pwEntries = sortEntries(pwEntries, host, submitUrl, url); // Fill the list QJsonArray result; @@ -698,7 +722,10 @@ void BrowserService::convertAttributesToCustomData(QSharedPointer<Database> db) } } -QList<Entry*> BrowserService::sortEntries(QList<Entry*>& pwEntries, const QString& host, const QString& entryUrl) +QList<Entry*> BrowserService::sortEntries(QList<Entry*>& pwEntries, + const QString& host, + const QString& entryUrl, + const QString& fullUrl) { QUrl url(entryUrl); if (url.scheme().isEmpty()) { @@ -712,7 +739,7 @@ QList<Entry*> BrowserService::sortEntries(QList<Entry*>& pwEntries, const QStrin // Build map of prioritized entries QMultiMap<int, Entry*> priorities; for (auto* entry : pwEntries) { - priorities.insert(sortPriority(entry, host, submitUrl, baseSubmitUrl), entry); + priorities.insert(sortPriority(entry, host, submitUrl, baseSubmitUrl, fullUrl), entry); } QList<Entry*> results; @@ -773,7 +800,7 @@ QList<Entry*> BrowserService::confirmEntries(QList<Entry*>& pwEntriesToConfirm, config.save(entry); }); - accessControlDialog.setItems(pwEntriesToConfirm, !submitHost.isEmpty() ? submitHost : url, httpAuth); + accessControlDialog.setItems(pwEntriesToConfirm, url, httpAuth); QList<Entry*> allowedEntries; if (accessControlDialog.exec() == QDialog::Accepted) { @@ -895,7 +922,8 @@ Group* BrowserService::getDefaultEntryGroup(const QSharedPointer<Database>& sele int BrowserService::sortPriority(const Entry* entry, const QString& host, const QString& submitUrl, - const QString& baseSubmitUrl) const + const QString& baseSubmitUrl, + const QString& fullUrl) const { QUrl url(entry->url()); if (url.scheme().isEmpty()) { @@ -914,9 +942,12 @@ int BrowserService::sortPriority(const Entry* entry, if (!url.host().contains(".") && url.host() != "localhost") { return 0; } - if (submitUrl == entryURL) { + if (fullUrl == entryURL) { return 100; } + if (submitUrl == entryURL) { + return 95; + } if (submitUrl.startsWith(entryURL) && entryURL != host && baseSubmitUrl != entryURL) { return 90; } @@ -1025,7 +1056,17 @@ bool BrowserService::handleURL(const QString& entryUrl, const QString& url, cons // Match the subdomains with the limited wildcard if (siteQUrl.host().endsWith(entryQUrl.host())) { - return true; + if (!browserSettings()->bestMatchOnly()) { + return true; + } + + // Match the exact subdomain and path, or start of the path when entry's path is longer than plain "/" + if (siteQUrl.host() == entryQUrl.host()) { + if (siteQUrl.path() == entryQUrl.path() + || (entryQUrl.path().size() > 1 && siteQUrl.path().startsWith(entryQUrl.path()))) { + return true; + } + } } return false; |