19#include "ui_autofillmanager.h"
32#include <QInputDialog>
39 , m_passwordManager(
mApp->autoFill()->passwordManager())
40 , m_passwordsShown(false)
43 if (isRightToLeft()) {
44 ui->treePass->headerItem()->setTextAlignment(0, Qt::AlignRight | Qt::AlignVCenter);
45 ui->treePass->headerItem()->setTextAlignment(1, Qt::AlignRight | Qt::AlignVCenter);
46 ui->treePass->headerItem()->setTextAlignment(2, Qt::AlignRight | Qt::AlignVCenter);
47 ui->treePass->setLayoutDirection(Qt::LeftToRight);
48 ui->treeExcept->setLayoutDirection(Qt::LeftToRight);
51 connect(ui->removePass, &QAbstractButton::clicked,
this, &AutoFillManager::removePass);
52 connect(ui->removeAllPass, &QAbstractButton::clicked,
this, &AutoFillManager::removeAllPass);
53 connect(ui->editPass, &QAbstractButton::clicked,
this, &AutoFillManager::editPass);
54 connect(ui->showPasswords, &QAbstractButton::clicked,
this, &AutoFillManager::showPasswords);
56 connect(ui->changeBackend, &QAbstractButton::clicked,
this, &AutoFillManager::changePasswordBackend);
57 connect(ui->backendOptions, &QAbstractButton::clicked,
this, &AutoFillManager::showBackendOptions);
60 connect(ui->removeExcept, &QAbstractButton::clicked,
this, &AutoFillManager::removeExcept);
61 connect(ui->removeAllExcept, &QAbstractButton::clicked,
this, &AutoFillManager::removeAllExcept);
63 ui->treePass->setContextMenuPolicy(Qt::CustomContextMenu);
64 connect(ui->treePass, &TreeWidget::customContextMenuRequested,
this, &AutoFillManager::passwordContextMenu);
66 auto* menu =
new QMenu(
this);
67 menu->addAction(tr(
"Import Passwords from File..."),
this, &AutoFillManager::importPasswords);
68 menu->addAction(tr(
"Export Passwords to File..."),
this, &AutoFillManager::exportPasswords);
69 ui->importExport->setMenu(menu);
70 ui->search->setPlaceholderText(tr(
"Search"));
77 QTimer::singleShot(0,
this, &AutoFillManager::loadPasswords);
80void AutoFillManager::loadPasswords()
82 ui->showPasswords->setText(tr(
"Show Passwords"));
83 m_passwordsShown =
false;
85 const QVector<PasswordEntry> allEntries =
mApp->autoFill()->getAllFormData();
87 ui->treePass->clear();
89 auto* item =
new QTreeWidgetItem(ui->treePass);
90 item->setText(0, entry.host);
91 item->setText(1, entry.username);
92 item->setText(2,
QSL(
"*****"));
96 item->setData(0, Qt::UserRole + 10, v);
97 ui->treePass->addTopLevelItem(item);
101 query.exec(
QSL(
"SELECT server, id FROM autofill_exceptions"));
102 ui->treeExcept->clear();
103 while (query.next()) {
104 auto* item =
new QTreeWidgetItem(ui->treeExcept);
105 item->setText(0, query.value(0).toString());
106 item->setData(0, Qt::UserRole + 10, query.value(1).toString());
107 ui->treeExcept->addTopLevelItem(item);
110 ui->treePass->sortByColumn(-1, Qt::AscendingOrder);
111 ui->treeExcept->sortByColumn(-1, Qt::AscendingOrder);
114void AutoFillManager::changePasswordBackend()
116 QHash<QString, PasswordBackend*> backends = m_passwordManager->
availableBackends();
121 QHashIterator<QString, PasswordBackend*>
i(backends);
122 while (
i.hasNext()) {
125 current = items.size();
127 items <<
i.value()->name();
130 QString item = QInputDialog::getItem(
this, tr(
"Change backend..."), tr(
"Change backend:"), items, current,
false);
133 if (!item.isEmpty()) {
136 QHashIterator<QString, PasswordBackend*>
i(backends);
137 while (
i.hasNext()) {
139 if (
i.value()->name() == item) {
151void AutoFillManager::showBackendOptions()
160void AutoFillManager::showPasswords()
162 if (m_passwordsShown) {
163 for (
int i = 0;
i < ui->treePass->topLevelItemCount();
i++) {
164 QTreeWidgetItem* item = ui->treePass->topLevelItem(
i);
168 item->setText(2,
QSL(
"*****"));
171 ui->showPasswords->setText(tr(
"Show Passwords"));
172 m_passwordsShown =
false;
177 m_passwordsShown =
true;
179 int result = QMessageBox::question(
this, tr(
"Show Passwords"), tr(
"Are you sure that you want to show all passwords?"),
180 QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
181 if (result != QMessageBox::Yes) {
185 for (
int i = 0;
i < ui->treePass->topLevelItemCount();
i++) {
186 QTreeWidgetItem* item = ui->treePass->topLevelItem(
i);
194 ui->showPasswords->setText(tr(
"Hide Passwords"));
197void AutoFillManager::copyPassword()
199 QTreeWidgetItem* curItem = ui->treePass->currentItem();
204 QApplication::clipboard()->setText(entry.
password);
207void AutoFillManager::copyUsername()
209 QTreeWidgetItem* curItem = ui->treePass->currentItem();
214 QApplication::clipboard()->setText(entry.
username);
217void AutoFillManager::removePass()
219 QTreeWidgetItem* curItem = ui->treePass->currentItem();
225 mApp->autoFill()->removeEntry(entry);
230void AutoFillManager::removeAllPass()
232 QMessageBox::StandardButton button = QMessageBox::warning(
this, tr(
"Confirmation"),
233 tr(
"Are you sure you want to delete all passwords on your computer?"), QMessageBox::Yes | QMessageBox::No);
234 if (button != QMessageBox::Yes) {
238 mApp->autoFill()->removeAllEntries();
239 ui->treePass->clear();
242void AutoFillManager::editPass()
244 QTreeWidgetItem* curItem = ui->treePass->currentItem();
252 QString text = QInputDialog::getText(
this, tr(
"Edit password"), tr(
"Change password:"), QLineEdit::Normal, entry.
password, &ok);
254 if (ok && !text.isEmpty() && text != entry.
password) {
257 entry.
data.replace(oldPass, newPass);
260 if (
mApp->autoFill()->updateEntry(entry)) {
263 curItem->setData(0, Qt::UserRole + 10, v);
265 if (m_passwordsShown) {
266 curItem->setText(2, text);
272void AutoFillManager::removeExcept()
274 QTreeWidgetItem* curItem = ui->treeExcept->currentItem();
278 QString
id = curItem->data(0, Qt::UserRole + 10).toString();
280 query.prepare(
QSL(
"DELETE FROM autofill_exceptions WHERE id=?"));
281 query.addBindValue(
id);
287void AutoFillManager::removeAllExcept()
290 query.exec(
QSL(
"DELETE FROM autofill_exceptions"));
292 ui->treeExcept->clear();
297 ui->tabWidget->setCurrentIndex(1);
300void AutoFillManager::importPasswords()
304 if (m_fileName.isEmpty()) {
308 QTimer::singleShot(0,
this, &AutoFillManager::slotImportPasswords);
311void AutoFillManager::exportPasswords()
315 if (m_fileName.isEmpty()) {
319 QTimer::singleShot(0,
this, &AutoFillManager::slotExportPasswords);
322void AutoFillManager::slotImportPasswords()
324 QFile file(m_fileName);
326 if (!file.open(QFile::ReadOnly)) {
327 ui->importExportLabel->setText(tr(
"Cannot read file!"));
331 QApplication::setOverrideCursor(Qt::WaitCursor);
333 bool status =
mApp->autoFill()->importPasswords(file.readAll());
336 ui->importExportLabel->setText(status ? tr(
"Successfully imported") : tr(
"Error while importing!"));
339 QApplication::restoreOverrideCursor();
342void AutoFillManager::slotExportPasswords()
344 QFile file(m_fileName);
346 if (!file.open(QFile::WriteOnly)) {
347 ui->importExportLabel->setText(tr(
"Cannot write to file!"));
351 QApplication::setOverrideCursor(Qt::WaitCursor);
353 file.write(
mApp->autoFill()->exportPasswords());
356 ui->importExportLabel->setText(tr(
"Successfully exported"));
358 QApplication::restoreOverrideCursor();
361void AutoFillManager::currentPasswordBackendChanged()
366 QTimer::singleShot(0,
this, &AutoFillManager::loadPasswords);
369void AutoFillManager::passwordContextMenu(
const QPoint &pos)
371 auto *menu =
new QMenu;
372 menu->setAttribute(Qt::WA_DeleteOnClose);
373 menu->addAction(tr(
"Copy Username"),
this, &AutoFillManager::copyUsername);
374 menu->addAction(tr(
"Copy Password"),
this, &AutoFillManager::copyPassword);
375 menu->addSeparator();
376 menu->addAction(tr(
"Edit Password"),
this, &AutoFillManager::editPass);
377 menu->popup(ui->treePass->viewport()->mapToGlobal(pos));
AutoFillManager(QWidget *parent=nullptr)
virtual void showSettings(QWidget *parent)
virtual QString name() const =0
virtual bool hasSettings() const
void switchBackend(const QString &backendID)
static QByteArray urlEncodePassword(const QString &password)
void passwordBackendChanged()
PasswordBackend * activeBackend()
QHash< QString, PasswordBackend * > availableBackends()
static SqlDatabase * instance()