Skip to content

Commit

Permalink
No commit message
Browse files Browse the repository at this point in the history
  • Loading branch information
varjolintu committed Oct 18, 2018
1 parent 8074995 commit 503c33d
Show file tree
Hide file tree
Showing 9 changed files with 289 additions and 12 deletions.
2 changes: 1 addition & 1 deletion src/browser/BrowserAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ QJsonObject BrowserAction::handleSetLogin(const QJsonObject& json, const QString
if (uuid.isEmpty()) {
m_browserService.addEntry(id, login, password, url, submitUrl, realm);
} else {
m_browserService.updateEntry(id, uuid, login, password, url);
m_browserService.updateEntry(id, uuid, login, password, url, submitUrl);
}

const QString newNonce = incrementNonce(nonce);
Expand Down
71 changes: 71 additions & 0 deletions src/browser/BrowserEntrySaveDialog.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
* Copyright (C) 2013 Francois Ferrand
* Copyright (C) 2018 Sami Vänttinen <sami.vanttinen@protonmail.com>
* Copyright (C) 2018 KeePassXC Team <team@keepassxc.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include "BrowserEntrySaveDialog.h"
#include "ui_BrowserEntrySaveDialog.h"

BrowserEntrySaveDialog::BrowserEntrySaveDialog(QWidget* parent)
: QDialog(parent)
, ui(new Ui::BrowserEntrySaveDialog())
{
this->setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);

ui->setupUi(this);
connect(ui->okButton, SIGNAL(clicked()), this, SLOT(accept()));
connect(ui->cancelButton, SIGNAL(clicked()), this, SLOT(reject()));

ui->itemsList->setSelectionMode(QAbstractItemView::SingleSelection);
ui->label->setText(QString(tr("You have multiple databases open.\n"
"Please select the correct database for saving credentials.")));
}

BrowserEntrySaveDialog::~BrowserEntrySaveDialog()
{
}

int BrowserEntrySaveDialog::setItems(QList<DatabaseWidget*>& databaseWidgets, DatabaseTabWidget* dbTabWidget) const
{
uint counter = 0;
int activeIndex = -1;
for (const auto i : databaseWidgets) {
QListWidgetItem* item = new QListWidgetItem();
item->setText(dbTabWidget->getTabName(i, true));
item->setData(Qt::UserRole, counter);

if (dbTabWidget->currentDatabaseWidget() == i) {
activeIndex = counter;
}

ui->itemsList->addItem(item);
++counter;
}

// This must be done after the whole list is filled
if (activeIndex >= 0) {
ui->itemsList->item(activeIndex)->setSelected(true);
}

ui->itemsList->selectAll();
return databaseWidgets.length();
}

QList<QListWidgetItem*> BrowserEntrySaveDialog::getSelected() const
{
return ui->itemsList->selectedItems();
}
50 changes: 50 additions & 0 deletions src/browser/BrowserEntrySaveDialog.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*
* Copyright (C) 2013 Francois Ferrand
* Copyright (C) 2018 Sami Vänttinen <sami.vanttinen@protonmail.com>
* Copyright (C) 2018 KeePassXC Team <team@keepassxc.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef BROWSERENTRYSAVEDIALOG_H
#define BROWSERENTRYSAVEDIALOG_H

#include <QDialog>
#include <QScopedPointer>
#include <QListWidgetItem>
#include "gui/DatabaseTabWidget.h"

class Entry;

namespace Ui
{
class BrowserEntrySaveDialog;
}

class BrowserEntrySaveDialog : public QDialog
{
Q_OBJECT

public:
explicit BrowserEntrySaveDialog(QWidget* parent = nullptr);
~BrowserEntrySaveDialog();

int setItems(QList<DatabaseWidget*>& databaseWidgets, DatabaseTabWidget* dbTabWidget) const;
QList<QListWidgetItem *> getSelected() const;

private:
QScopedPointer<Ui::BrowserEntrySaveDialog> ui;
};

#endif // BROWSERENTRYSAVEDIALOG_H
62 changes: 62 additions & 0 deletions src/browser/BrowserEntrySaveDialog.ui
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>BrowserEntrySaveDialog</class>
<widget class="QDialog" name="BrowserEntrySaveDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>221</height>
</rect>
</property>
<property name="windowTitle">
<string>KeePassXC-Browser Save Entry</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QListWidget" name="itemsList"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="okButton">
<property name="text">
<string>Ok</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="cancelButton">
<property name="text">
<string>Cancel</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
64 changes: 56 additions & 8 deletions src/browser/BrowserService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "BrowserService.h"
#include "BrowserAccessControlDialog.h"
#include "BrowserEntryConfig.h"
#include "BrowserEntrySaveDialog.h"
#include "BrowserSettings.h"
#include "core/Database.h"
#include "core/EntrySearcher.h"
Expand Down Expand Up @@ -289,14 +290,33 @@ QJsonArray BrowserService::findMatchingEntries(const QString& id,
return result;
}

void BrowserService::addEntry(const QString&,
void BrowserService::addEntry(const QString& id,
const QString& login,
const QString& password,
const QString& url,
const QString& submitUrl,
const QString& realm)
const QString& realm,
Database* selectedDb)
{
Group* group = findCreateAddEntryGroup();
if (thread() != QThread::currentThread()) {
QMetaObject::invokeMethod(this,
"addEntry",
Qt::BlockingQueuedConnection,
Q_ARG(const QString&, id),
Q_ARG(const QString&, login),
Q_ARG(const QString&, password),
Q_ARG(const QString&, url),
Q_ARG(const QString&, submitUrl),
Q_ARG(const QString&, realm),
Q_ARG(Database*, selectedDb));
}

Database* db = selectedDb ? selectedDb : selectedDatabase();
if (!db) {
return;
}

Group* group = findCreateAddEntryGroup(db);
if (!group) {
return;
}
Expand Down Expand Up @@ -328,7 +348,8 @@ void BrowserService::updateEntry(const QString& id,
const QString& uuid,
const QString& login,
const QString& password,
const QString& url)
const QString& url,
const QString& submitUrl)
{
if (thread() != QThread::currentThread()) {
QMetaObject::invokeMethod(this,
Expand All @@ -338,16 +359,19 @@ void BrowserService::updateEntry(const QString& id,
Q_ARG(const QString&, uuid),
Q_ARG(const QString&, login),
Q_ARG(const QString&, password),
Q_ARG(const QString&, url));
Q_ARG(const QString&, url),
Q_ARG(const QString&, submitUrl));
}

Database* db = getDatabase();
Database* db = selectedDatabase();
if (!db) {
return;
}

Entry* entry = db->resolveEntry(QUuid::fromRfc4122(QByteArray::fromHex(uuid.toLatin1())));
if (!entry) {
// If entry is not found for update, add a new one to the selected database
addEntry(id, login, password, url, submitUrl, "", db);
return;
}

Expand Down Expand Up @@ -679,9 +703,9 @@ BrowserService::checkAccess(const Entry* entry, const QString& host, const QStri
return Unknown;
}

Group* BrowserService::findCreateAddEntryGroup()
Group* BrowserService::findCreateAddEntryGroup(Database* selectedDb)
{
Database* db = getDatabase();
Database* db = selectedDb ? selectedDb : getDatabase();
if (!db) {
return nullptr;
}
Expand Down Expand Up @@ -813,6 +837,30 @@ Database* BrowserService::getDatabase()
return nullptr;
}

Database* BrowserService::selectedDatabase()
{
// Return only open databases
QList<DatabaseWidget*> databaseWidgets = m_dbTabWidget->getAllDatabaseWidgets(true);

BrowserEntrySaveDialog browserEntrySaveDialog;
int openDatabaseCount = browserEntrySaveDialog.setItems(databaseWidgets, m_dbTabWidget);
if (openDatabaseCount > 1) {
int res = browserEntrySaveDialog.exec();
if (res == QDialog::Accepted) {
const auto selectedDatabase = browserEntrySaveDialog.getSelected();
if (selectedDatabase.length() > 0) {
int index = selectedDatabase[0]->data(Qt::UserRole).toUInt();
return databaseWidgets[index]->database();
}
} else {
return nullptr;
}
}

// Return current database
return getDatabase();
}

void BrowserService::databaseLocked(DatabaseWidget* dbWidget)
{
if (dbWidget) {
Expand Down
9 changes: 6 additions & 3 deletions src/browser/BrowserService.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ class BrowserService : public QObject
const QString& password,
const QString& url,
const QString& submitUrl,
const QString& realm);
const QString& realm,
Database* selectedDb = nullptr);
QList<Entry*> searchEntries(Database* db, const QString& hostname, const QString& url);
QList<Entry*> searchEntries(const QString& url, const StringPairList& keyList);
void removeSharedEncryptionKeys();
Expand All @@ -68,7 +69,8 @@ public slots:
const QString& uuid,
const QString& login,
const QString& password,
const QString& url);
const QString& url,
const QString& submitUrl);
void databaseLocked(DatabaseWidget* dbWidget);
void databaseUnlocked(DatabaseWidget* dbWidget);
void activateDatabaseChanged(DatabaseWidget* dbWidget);
Expand Down Expand Up @@ -96,13 +98,14 @@ public slots:
const QString& realm);
QJsonObject prepareEntry(const Entry* entry);
Access checkAccess(const Entry* entry, const QString& host, const QString& submitHost, const QString& realm);
Group* findCreateAddEntryGroup();
Group* findCreateAddEntryGroup(Database* selectedDb = nullptr);
int
sortPriority(const Entry* entry, const QString& host, const QString& submitUrl, const QString& baseSubmitUrl) const;
bool matchUrlScheme(const QString& url);
bool removeFirstDomain(QString& hostname);
QString baseDomain(const QString& url) const;
Database* getDatabase();
Database* selectedDatabase();

private:
DatabaseTabWidget* const m_dbTabWidget;
Expand Down
1 change: 1 addition & 0 deletions src/browser/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ if(WITH_XC_BROWSER)
BrowserAction.cpp
BrowserClients.cpp
BrowserEntryConfig.cpp
BrowserEntrySaveDialog.cpp
BrowserOptionDialog.cpp
BrowserService.cpp
BrowserSettings.cpp
Expand Down
Loading

0 comments on commit 503c33d

Please sign in to comment.