diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 7edf7e788..d1672c5b1 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -649,7 +649,8 @@ const Database* Entry::database() const QString Entry::resolveMultiplePlaceholders(const QString& str) const { QString result = str; - QRegExp tmplRegEx("({.*})", Qt::CaseInsensitive, QRegExp::RegExp2); + QRegExp tmplRegEx("(\\{.*\\})", Qt::CaseInsensitive, QRegExp::RegExp2); + tmplRegEx.setMinimal(true); QStringList tmplList; int pos = 0; diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 8a40b6364..ca3257d0c 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -407,7 +407,7 @@ void DatabaseWidget::copyTitle() return; } - setClipboardTextAndMinimize(currentEntry->resolvePlaceholder(currentEntry->title())); + setClipboardTextAndMinimize(currentEntry->resolveMultiplePlaceholders(currentEntry->title())); } void DatabaseWidget::copyUsername() @@ -418,7 +418,7 @@ void DatabaseWidget::copyUsername() return; } - setClipboardTextAndMinimize(currentEntry->resolvePlaceholder(currentEntry->username())); + setClipboardTextAndMinimize(currentEntry->resolveMultiplePlaceholders(currentEntry->username())); } void DatabaseWidget::copyPassword() @@ -429,7 +429,7 @@ void DatabaseWidget::copyPassword() return; } - setClipboardTextAndMinimize(currentEntry->resolvePlaceholder(currentEntry->password())); + setClipboardTextAndMinimize(currentEntry->resolveMultiplePlaceholders(currentEntry->password())); } void DatabaseWidget::copyURL() @@ -440,7 +440,7 @@ void DatabaseWidget::copyURL() return; } - setClipboardTextAndMinimize(currentEntry->resolvePlaceholder(currentEntry->url())); + setClipboardTextAndMinimize(currentEntry->resolveMultiplePlaceholders(currentEntry->url())); } void DatabaseWidget::copyNotes() @@ -451,7 +451,7 @@ void DatabaseWidget::copyNotes() return; } - setClipboardTextAndMinimize(currentEntry->resolvePlaceholder(currentEntry->notes())); + setClipboardTextAndMinimize(currentEntry->resolveMultiplePlaceholders(currentEntry->notes())); } void DatabaseWidget::copyAttribute(QAction* action) @@ -1176,7 +1176,7 @@ bool DatabaseWidget::currentEntryHasUsername() Q_ASSERT(false); return false; } - return !currentEntry->resolvePlaceholder(currentEntry->username()).isEmpty(); + return !currentEntry->resolveMultiplePlaceholders(currentEntry->username()).isEmpty(); } bool DatabaseWidget::currentEntryHasPassword() @@ -1186,7 +1186,7 @@ bool DatabaseWidget::currentEntryHasPassword() Q_ASSERT(false); return false; } - return !currentEntry->resolvePlaceholder(currentEntry->password()).isEmpty(); + return !currentEntry->resolveMultiplePlaceholders(currentEntry->password()).isEmpty(); } bool DatabaseWidget::currentEntryHasUrl() @@ -1196,7 +1196,7 @@ bool DatabaseWidget::currentEntryHasUrl() Q_ASSERT(false); return false; } - return !currentEntry->resolvePlaceholder(currentEntry->url()).isEmpty(); + return !currentEntry->resolveMultiplePlaceholders(currentEntry->url()).isEmpty(); } bool DatabaseWidget::currentEntryHasNotes() @@ -1206,7 +1206,7 @@ bool DatabaseWidget::currentEntryHasNotes() Q_ASSERT(false); return false; } - return !currentEntry->resolvePlaceholder(currentEntry->notes()).isEmpty(); + return !currentEntry->resolveMultiplePlaceholders(currentEntry->notes()).isEmpty(); } GroupView* DatabaseWidget::groupView() { diff --git a/src/gui/entry/EntryModel.cpp b/src/gui/entry/EntryModel.cpp index b28eaed46..6bc10376f 100644 --- a/src/gui/entry/EntryModel.cpp +++ b/src/gui/entry/EntryModel.cpp @@ -139,19 +139,19 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const } break; case Title: - result = entry->resolvePlaceholder(entry->title()); + result = entry->resolveMultiplePlaceholders(entry->title()); if (attr->isReference(EntryAttributes::TitleKey)) { result.prepend(tr("Ref: ","Reference abbreviation")); } return result; case Username: - result = entry->resolvePlaceholder(entry->username()); + result = entry->resolveMultiplePlaceholders(entry->username()); if (attr->isReference(EntryAttributes::UserNameKey)) { result.prepend(tr("Ref: ","Reference abbreviation")); } return result; case Url: - result = entry->resolvePlaceholder(entry->url()); + result = entry->resolveMultiplePlaceholders(entry->url()); if (attr->isReference(EntryAttributes::URLKey)) { result.prepend(tr("Ref: ","Reference abbreviation")); } diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index 7df5942e8..1cb3d6ada 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -588,6 +588,50 @@ void TestGui::testCloneEntry() QCOMPARE(entryClone->title(), entryOrg->title() + QString(" - Clone")); } +void TestGui::testEntryPlaceholders() +{ + QToolBar* toolBar = m_mainWindow->findChild("toolBar"); + EntryView* entryView = m_dbWidget->findChild("entryView"); + + // Find the new entry action + QAction* entryNewAction = m_mainWindow->findChild("actionEntryNew"); + QVERIFY(entryNewAction->isEnabled()); + + // Find the button associated with the new entry action + QWidget* entryNewWidget = toolBar->widgetForAction(entryNewAction); + QVERIFY(entryNewWidget->isVisible()); + QVERIFY(entryNewWidget->isEnabled()); + + // Click the new entry button and check that we enter edit mode + QTest::mouseClick(entryNewWidget, Qt::LeftButton); + QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::EditMode); + + // Add entry "test" and confirm added + EditEntryWidget* editEntryWidget = m_dbWidget->findChild("editEntryWidget"); + QLineEdit* titleEdit = editEntryWidget->findChild("titleEdit"); + QTest::keyClicks(titleEdit, "test"); + QLineEdit* usernameEdit = editEntryWidget->findChild("usernameEdit"); + QTest::keyClicks(usernameEdit, "john"); + QLineEdit* urlEdit = editEntryWidget->findChild("urlEdit"); + QTest::keyClicks(urlEdit, "{TITLE}.{USERNAME}"); + QDialogButtonBox* editEntryWidgetButtonBox = editEntryWidget->findChild("buttonBox"); + QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton); + + QCOMPARE(entryView->model()->rowCount(), 2); + + QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::ViewMode); + QModelIndex item = entryView->model()->index(1, 1); + Entry* entry = entryView->entryFromIndex(item); + + QCOMPARE(entry->title(), QString("test")); + QCOMPARE(entry->url(), QString("{TITLE}.{USERNAME}")); + + // Test password copy + QClipboard *clipboard = QApplication::clipboard(); + m_dbWidget->copyURL(); + QTRY_COMPARE(clipboard->text(), QString("test.john")); +} + void TestGui::testDragAndDropEntry() { EntryView* entryView = m_dbWidget->findChild("entryView"); diff --git a/tests/gui/TestGui.h b/tests/gui/TestGui.h index 1ae297005..d05ab8f58 100644 --- a/tests/gui/TestGui.h +++ b/tests/gui/TestGui.h @@ -48,6 +48,7 @@ private slots: void testSearch(); void testDeleteEntry(); void testCloneEntry(); + void testEntryPlaceholders(); void testDragAndDropEntry(); void testDragAndDropGroup(); void testSaveAs();